Merge 4.19.92 into android-4.19

Changes in 4.19.92
	af_packet: set defaule value for tmo
	fjes: fix missed check in fjes_acpi_add
	mod_devicetable: fix PHY module format
	net: dst: Force 4-byte alignment of dst_metrics
	net: gemini: Fix memory leak in gmac_setup_txqs
	net: hisilicon: Fix a BUG trigered by wrong bytes_compl
	net: nfc: nci: fix a possible sleep-in-atomic-context bug in nci_uart_tty_receive()
	net: qlogic: Fix error paths in ql_alloc_large_buffers()
	net: usb: lan78xx: Fix suspend/resume PHY register access error
	qede: Disable hardware gro when xdp prog is installed
	qede: Fix multicast mac configuration
	sctp: fully initialize v4 addr in some functions
	selftests: forwarding: Delete IPv6 address at the end
	btrfs: don't double lock the subvol_sem for rename exchange
	btrfs: do not call synchronize_srcu() in inode_tree_del
	Btrfs: fix missing data checksums after replaying a log tree
	btrfs: send: remove WARN_ON for readonly mount
	btrfs: abort transaction after failed inode updates in create_subvol
	btrfs: skip log replay on orphaned roots
	btrfs: do not leak reloc root if we fail to read the fs root
	btrfs: handle ENOENT in btrfs_uuid_tree_iterate
	Btrfs: fix removal logic of the tree mod log that leads to use-after-free issues
	ALSA: pcm: Avoid possible info leaks from PCM stream buffers
	ALSA: hda/ca0132 - Keep power on during processing DSP response
	ALSA: hda/ca0132 - Avoid endless loop
	ALSA: hda/ca0132 - Fix work handling in delayed HP detection
	drm: mst: Fix query_payload ack reply struct
	drm/panel: Add missing drm_panel_init() in panel drivers
	drm/bridge: analogix-anx78xx: silence -EPROBE_DEFER warnings
	iio: light: bh1750: Resolve compiler warning and make code more readable
	drm/amdgpu: grab the id mgr lock while accessing passid_mapping
	spi: Add call to spi_slave_abort() function when spidev driver is released
	staging: rtl8192u: fix multiple memory leaks on error path
	staging: rtl8188eu: fix possible null dereference
	rtlwifi: prevent memory leak in rtl_usb_probe
	libertas: fix a potential NULL pointer dereference
	ath10k: fix backtrace on coredump
	IB/iser: bound protection_sg size by data_sg size
	media: am437x-vpfe: Setting STD to current value is not an error
	media: i2c: ov2659: fix s_stream return value
	media: ov6650: Fix crop rectangle alignment not passed back
	media: i2c: ov2659: Fix missing 720p register config
	media: ov6650: Fix stored frame format not in sync with hardware
	media: ov6650: Fix stored crop rectangle not in sync with hardware
	tools/power/cpupower: Fix initializer override in hsw_ext_cstates
	media: venus: core: Fix msm8996 frequency table
	ath10k: fix offchannel tx failure when no ath10k_mac_tx_frm_has_freq
	pinctrl: devicetree: Avoid taking direct reference to device name string
	drm/amdkfd: fix a potential NULL pointer dereference (v2)
	selftests/bpf: Correct path to include msg + path
	media: venus: Fix occasionally failures to suspend
	usb: renesas_usbhs: add suspend event support in gadget mode
	hwrng: omap3-rom - Call clk_disable_unprepare() on exit only if not idled
	regulator: max8907: Fix the usage of uninitialized variable in max8907_regulator_probe()
	media: flexcop-usb: fix NULL-ptr deref in flexcop_usb_transfer_init()
	media: cec-funcs.h: add status_req checks
	drm/bridge: dw-hdmi: Refuse DDC/CI transfers on the internal I2C controller
	samples: pktgen: fix proc_cmd command result check logic
	block: Fix writeback throttling W=1 compiler warnings
	mwifiex: pcie: Fix memory leak in mwifiex_pcie_init_evt_ring
	drm/drm_vblank: Change EINVAL by the correct errno
	media: cx88: Fix some error handling path in 'cx8800_initdev()'
	media: ti-vpe: vpe: Fix Motion Vector vpdma stride
	media: ti-vpe: vpe: fix a v4l2-compliance warning about invalid pixel format
	media: ti-vpe: vpe: fix a v4l2-compliance failure about frame sequence number
	media: ti-vpe: vpe: Make sure YUYV is set as default format
	media: ti-vpe: vpe: fix a v4l2-compliance failure causing a kernel panic
	media: ti-vpe: vpe: ensure buffers are cleaned up properly in abort cases
	media: ti-vpe: vpe: fix a v4l2-compliance failure about invalid sizeimage
	syscalls/x86: Use the correct function type in SYSCALL_DEFINE0
	drm/amd/display: Fix dongle_caps containing stale information.
	extcon: sm5502: Reset registers during initialization
	x86/mm: Use the correct function type for native_set_fixmap()
	ath10k: Correct error handling of dma_map_single()
	drm/bridge: dw-hdmi: Restore audio when setting a mode
	perf test: Report failure for mmap events
	perf report: Add warning when libunwind not compiled in
	usb: usbfs: Suppress problematic bind and unbind uevents.
	iio: adc: max1027: Reset the device at probe time
	Bluetooth: missed cpu_to_le16 conversion in hci_init4_req
	Bluetooth: Workaround directed advertising bug in Broadcom controllers
	Bluetooth: hci_core: fix init for HCI_USER_CHANNEL
	bpf/stackmap: Fix deadlock with rq_lock in bpf_get_stack()
	x86/mce: Lower throttling MCE messages' priority to warning
	perf tests: Disable bp_signal testing for arm64
	drm/gma500: fix memory disclosures due to uninitialized bytes
	rtl8xxxu: fix RTL8723BU connection failure issue after warm reboot
	ipmi: Don't allow device module unload when in use
	x86/ioapic: Prevent inconsistent state when moving an interrupt
	media: smiapp: Register sensor after enabling runtime PM on the device
	md/bitmap: avoid race window between md_bitmap_resize and bitmap_file_clear_bit
	arm64: psci: Reduce the waiting time for cpu_psci_cpu_kill()
	i40e: initialize ITRN registers with correct values
	net: phy: dp83867: enable robust auto-mdix
	drm/tegra: sor: Use correct SOR index on Tegra210
	spi: sprd: adi: Add missing lock protection when rebooting
	ACPI: button: Add DMI quirk for Medion Akoya E2215T
	RDMA/qedr: Fix memory leak in user qp and mr
	gpu: host1x: Allocate gather copy for host1x
	net: dsa: LAN9303: select REGMAP when LAN9303 enable
	phy: qcom-usb-hs: Fix extcon double register after power cycle
	s390/time: ensure get_clock_monotonic() returns monotonic values
	s390/mm: add mm_pxd_folded() checks to pxd_free()
	net: hns3: add struct netdev_queue debug info for TX timeout
	libata: Ensure ata_port probe has completed before detach
	loop: fix no-unmap write-zeroes request behavior
	pinctrl: sh-pfc: sh7734: Fix duplicate TCLK1_B
	iio: dln2-adc: fix iio_triggered_buffer_postenable() position
	libbpf: Fix error handling in bpf_map__reuse_fd()
	Bluetooth: Fix advertising duplicated flags
	pinctrl: amd: fix __iomem annotation in amd_gpio_irq_handler()
	ixgbe: protect TX timestamping from API misuse
	media: rcar_drif: fix a memory disclosure
	media: v4l2-core: fix touch support in v4l_g_fmt
	nvmem: imx-ocotp: reset error status on probe
	rfkill: allocate static minor
	bnx2x: Fix PF-VF communication over multi-cos queues.
	spi: img-spfi: fix potential double release
	ALSA: timer: Limit max amount of slave instances
	rtlwifi: fix memory leak in rtl92c_set_fw_rsvdpagepkt()
	perf probe: Fix to find range-only function instance
	perf probe: Fix to list probe event with correct line number
	perf jevents: Fix resource leak in process_mapfile() and main()
	perf probe: Walk function lines in lexical blocks
	perf probe: Fix to probe an inline function which has no entry pc
	perf probe: Fix to show ranges of variables in functions without entry_pc
	perf probe: Fix to show inlined function callsite without entry_pc
	libsubcmd: Use -O0 with DEBUG=1
	perf probe: Fix to probe a function which has no entry pc
	perf tools: Splice events onto evlist even on error
	drm/amdgpu: disallow direct upload save restore list from gfx driver
	drm/amdgpu: fix potential double drop fence reference
	xen/gntdev: Use select for DMA_SHARED_BUFFER
	perf parse: If pmu configuration fails free terms
	perf probe: Skip overlapped location on searching variables
	perf probe: Return a better scope DIE if there is no best scope
	perf probe: Fix to show calling lines of inlined functions
	perf probe: Skip end-of-sequence and non statement lines
	perf probe: Filter out instances except for inlined subroutine and subprogram
	ath10k: fix get invalid tx rate for Mesh metric
	fsi: core: Fix small accesses and unaligned offsets via sysfs
	media: pvrusb2: Fix oops on tear-down when radio support is not present
	soundwire: intel: fix PDI/stream mapping for Bulk
	crypto: atmel - Fix authenc support when it is set to m
	ice: delay less
	media: si470x-i2c: add missed operations in remove
	EDAC/ghes: Fix grain calculation
	spi: pxa2xx: Add missed security checks
	ASoC: rt5677: Mark reg RT5677_PWR_ANLG2 as volatile
	iio: dac: ad5446: Add support for new AD5600 DAC
	ASoC: Intel: kbl_rt5663_rt5514_max98927: Add dmic format constraint
	s390/disassembler: don't hide instruction addresses
	nvme: Discard workaround for non-conformant devices
	parport: load lowlevel driver if ports not found
	bcache: fix static checker warning in bcache_device_free()
	cpufreq: Register drivers only after CPU devices have been registered
	x86/crash: Add a forward declaration of struct kimage
	tracing: use kvcalloc for tgid_map array allocation
	tracing/kprobe: Check whether the non-suffixed symbol is notrace
	bcache: fix deadlock in bcache_allocator
	iwlwifi: mvm: fix unaligned read of rx_pkt_status
	ASoC: wm8904: fix regcache handling
	spi: tegra20-slink: add missed clk_unprepare
	tun: fix data-race in gro_normal_list()
	crypto: virtio - deal with unsupported input sizes
	mmc: tmio: Add MMC_CAP_ERASE to allow erase/discard/trim requests
	btrfs: don't prematurely free work in end_workqueue_fn()
	btrfs: don't prematurely free work in run_ordered_work()
	ASoC: wm2200: add missed operations in remove and probe failure
	spi: st-ssc4: add missed pm_runtime_disable
	ASoC: wm5100: add missed pm_runtime_disable
	ASoC: Intel: bytcr_rt5640: Update quirk for Acer Switch 10 SW5-012 2-in-1
	x86/insn: Add some Intel instructions to the opcode map
	brcmfmac: remove monitor interface when detaching
	iwlwifi: check kasprintf() return value
	fbtft: Make sure string is NULL terminated
	net: ethernet: ti: ale: clean ale tbl on init and intf restart
	crypto: sun4i-ss - Fix 64-bit size_t warnings
	crypto: sun4i-ss - Fix 64-bit size_t warnings on sun4i-ss-hash.c
	mac80211: consider QoS Null frames for STA_NULLFUNC_ACKED
	crypto: vmx - Avoid weird build failures
	libtraceevent: Fix memory leakage in copy_filter_type
	mips: fix build when "48 bits virtual memory" is enabled
	drm/amdgpu: fix bad DMA from INTERRUPT_CNTL2
	net: phy: initialise phydev speed and duplex sanely
	btrfs: don't prematurely free work in reada_start_machine_worker()
	btrfs: don't prematurely free work in scrub_missing_raid56_worker()
	Revert "mmc: sdhci: Fix incorrect switch to HS mode"
	mmc: mediatek: fix CMD_TA to 2 for MT8173 HS200/HS400 mode
	can: kvaser_usb: kvaser_usb_leaf: Fix some info-leaks to USB devices
	usb: xhci: Fix build warning seen with CONFIG_PM=n
	drm/amdgpu: fix uninitialized variable pasid_mapping_needed
	s390/ftrace: fix endless recursion in function_graph tracer
	btrfs: return error pointer from alloc_test_extent_buffer
	usbip: Fix receive error in vhci-hcd when using scatter-gather
	usbip: Fix error path of vhci_recv_ret_submit()
	cpufreq: Avoid leaving stale IRQ work items during CPU offline
	USB: EHCI: Do not return -EPIPE when hub is disconnected
	intel_th: pci: Add Comet Lake PCH-V support
	intel_th: pci: Add Elkhart Lake SOC support
	platform/x86: hp-wmi: Make buffer for HPWMI_FEATURE2_QUERY 128 bytes
	staging: comedi: gsc_hpdi: check dma_alloc_coherent() return value
	ext4: fix ext4_empty_dir() for directories with holes
	ext4: check for directory entries too close to block end
	ext4: unlock on error in ext4_expand_extra_isize()
	KVM: arm64: Ensure 'params' is initialised when looking up sys register
	x86/MCE/AMD: Do not use rdmsr_safe_on_cpu() in smca_configure()
	x86/MCE/AMD: Allow Reserved types to be overwritten in smca_banks[]
	powerpc/vcpu: Assume dedicated processors as non-preempt
	powerpc/irq: fix stack overflow verification
	mmc: sdhci-msm: Correct the offset and value for DDR_CONFIG register
	mmc: sdhci-of-esdhc: Revert "mmc: sdhci-of-esdhc: add erratum A-009204 support"
	mmc: sdhci: Update the tuning failed messages to pr_debug level
	mmc: sdhci-of-esdhc: fix P2020 errata handling
	mmc: sdhci: Workaround broken command queuing on Intel GLK
	mmc: sdhci: Add a quirk for broken command queuing
	nbd: fix shutdown and recv work deadlock v2
	perf probe: Fix to show function entry line as probe-able
	Linux 4.19.92

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Ic4c7f9c713549ebb3319cd0275e88678bfa0e53d
diff --git a/Documentation/ABI/testing/procfs-concurrent_time b/Documentation/ABI/testing/procfs-concurrent_time
new file mode 100644
index 0000000..55b4142
--- /dev/null
+++ b/Documentation/ABI/testing/procfs-concurrent_time
@@ -0,0 +1,16 @@
+What:		/proc/uid_concurrent_active_time
+Date:		December 2018
+Contact:	Connor O'Brien <connoro@google.com>
+Description:
+	The /proc/uid_concurrent_active_time file displays aggregated cputime
+	numbers for each uid, broken down by the total number of cores that were
+	active while the uid's task was running.
+
+What:		/proc/uid_concurrent_policy_time
+Date:		December 2018
+Contact:	Connor O'Brien <connoro@google.com>
+Description:
+	The /proc/uid_concurrent_policy_time file displays aggregated cputime
+	numbers for each uid, broken down based on the cpufreq policy
+	of the core used by the uid's task and the number of cores associated
+	with that policy that were active while the uid's task was running.
diff --git a/Documentation/ABI/testing/sysfs-block-zram b/Documentation/ABI/testing/sysfs-block-zram
index c1513c7..14b2bf2 100644
--- a/Documentation/ABI/testing/sysfs-block-zram
+++ b/Documentation/ABI/testing/sysfs-block-zram
@@ -98,3 +98,42 @@
 		The backing_dev file is read-write and set up backing
 		device for zram to write incompressible pages.
 		For using, user should enable CONFIG_ZRAM_WRITEBACK.
+
+What:		/sys/block/zram<id>/idle
+Date:		November 2018
+Contact:	Minchan Kim <minchan@kernel.org>
+Description:
+		idle file is write-only and mark zram slot as idle.
+		If system has mounted debugfs, user can see which slots
+		are idle via /sys/kernel/debug/zram/zram<id>/block_state
+
+What:		/sys/block/zram<id>/writeback
+Date:		November 2018
+Contact:	Minchan Kim <minchan@kernel.org>
+Description:
+		The writeback file is write-only and trigger idle and/or
+		huge page writeback to backing device.
+
+What:		/sys/block/zram<id>/bd_stat
+Date:		November 2018
+Contact:	Minchan Kim <minchan@kernel.org>
+Description:
+		The bd_stat file is read-only and represents backing device's
+		statistics (bd_count, bd_reads, bd_writes) in a format
+		similar to block layer statistics file format.
+
+What:		/sys/block/zram<id>/writeback_limit_enable
+Date:		November 2018
+Contact:	Minchan Kim <minchan@kernel.org>
+Description:
+		The writeback_limit_enable file is read-write and specifies
+		eanbe of writeback_limit feature. "1" means eable the feature.
+		No limit "0" is the initial state.
+
+What:		/sys/block/zram<id>/writeback_limit
+Date:		November 2018
+Contact:	Minchan Kim <minchan@kernel.org>
+Description:
+		The writeback_limit file is read-write and specifies the maximum
+		amount of writeback ZRAM can do. The limit could be changed
+		in run time.
diff --git a/Documentation/ABI/testing/sysfs-class-wakeup b/Documentation/ABI/testing/sysfs-class-wakeup
new file mode 100644
index 0000000..754aab8
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-class-wakeup
@@ -0,0 +1,76 @@
+What:		/sys/class/wakeup/
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		The /sys/class/wakeup/ directory contains pointers to all
+		wakeup sources in the kernel at that moment in time.
+
+What:		/sys/class/wakeup/.../name
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		This file contains the name of the wakeup source.
+
+What:		/sys/class/wakeup/.../active_count
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		This file contains the number of times the wakeup source was
+		activated.
+
+What:		/sys/class/wakeup/.../event_count
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		This file contains the number of signaled wakeup events
+		associated with the wakeup source.
+
+What:		/sys/class/wakeup/.../wakeup_count
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		This file contains the number of times the wakeup source might
+		abort suspend.
+
+What:		/sys/class/wakeup/.../expire_count
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		This file contains the number of times the wakeup source's
+		timeout has expired.
+
+What:		/sys/class/wakeup/.../active_time_ms
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		This file contains the amount of time the wakeup source has
+		been continuously active, in milliseconds.  If the wakeup
+		source is not active, this file contains '0'.
+
+What:		/sys/class/wakeup/.../total_time_ms
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		This file contains the total amount of time this wakeup source
+		has been active, in milliseconds.
+
+What:		/sys/class/wakeup/.../max_time_ms
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		This file contains the maximum amount of time this wakeup
+		source has been continuously active, in milliseconds.
+
+What:		/sys/class/wakeup/.../last_change_ms
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		This file contains the monotonic clock time when the wakeup
+		source was touched last time, in milliseconds.
+
+What:		/sys/class/wakeup/.../prevent_suspend_time_ms
+Date:		June 2019
+Contact:	Tri Vo <trong@android.com>
+Description:
+		The file contains the total amount of time this wakeup source
+		has been preventing autosleep, in milliseconds.
diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs
index 94a24ae..aedeae1 100644
--- a/Documentation/ABI/testing/sysfs-fs-f2fs
+++ b/Documentation/ABI/testing/sysfs-fs-f2fs
@@ -31,6 +31,12 @@
 Description:
 		 Controls the issue rate of segment discard commands.
 
+What:		/sys/fs/f2fs/<disk>/max_blkaddr
+Date:		November 2019
+Contact:	"Ramon Pantin" <pantin@google.com>
+Description:
+		 Shows first block address of MAIN area.
+
 What:		/sys/fs/f2fs/<disk>/ipu_policy
 Date:		November 2013
 Contact:	"Jaegeuk Kim" <jaegeuk.kim@samsung.com>
@@ -86,12 +92,28 @@
 		The unit size is one block, now only support configuring in range
 		of [1, 512].
 
+What:          /sys/fs/f2fs/<disk>/umount_discard_timeout
+Date:          January 2019
+Contact:       "Jaegeuk Kim" <jaegeuk@kernel.org>
+Description:
+		Set timeout to issue discard commands during umount.
+		Default: 5 secs
+
 What:		/sys/fs/f2fs/<disk>/max_victim_search
 Date:		January 2014
 Contact:	"Jaegeuk Kim" <jaegeuk.kim@samsung.com>
 Description:
 		 Controls the number of trials to find a victim segment.
 
+What:		/sys/fs/f2fs/<disk>/migration_granularity
+Date:		October 2018
+Contact:	"Chao Yu" <yuchao0@huawei.com>
+Description:
+		 Controls migration granularity of garbage collection on large
+		 section, it can let GC move partial segment{s} of one section
+		 in one GC cycle, so that dispersing heavy overhead GC to
+		 multiple lightweight one.
+
 What:		/sys/fs/f2fs/<disk>/dir_level
 Date:		March 2014
 Contact:	"Jaegeuk Kim" <jaegeuk.kim@samsung.com>
@@ -121,7 +143,22 @@
 Date:		January 2016
 Contact:	"Jaegeuk Kim" <jaegeuk@kernel.org>
 Description:
-		 Controls the idle timing.
+		 Controls the idle timing for all paths other than
+		 discard and gc path.
+
+What:		/sys/fs/f2fs/<disk>/discard_idle_interval
+Date:		September 2018
+Contact:	"Chao Yu" <yuchao0@huawei.com>
+Contact:	"Sahitya Tummala" <stummala@codeaurora.org>
+Description:
+		 Controls the idle timing for discard path.
+
+What:		/sys/fs/f2fs/<disk>/gc_idle_interval
+Date:		September 2018
+Contact:	"Chao Yu" <yuchao0@huawei.com>
+Contact:	"Sahitya Tummala" <stummala@codeaurora.org>
+Description:
+		 Controls the idle timing for gc path.
 
 What:		/sys/fs/f2fs/<disk>/iostat_enable
 Date:		August 2017
@@ -212,3 +249,18 @@
 		 - Del: echo '[h/c]!extension' > /sys/fs/f2fs/<disk>/extension_list
 		 - [h] means add/del hot file extension
 		 - [c] means add/del cold file extension
+
+What:		/sys/fs/f2fs/<disk>/unusable
+Date		April 2019
+Contact:	"Daniel Rosenberg" <drosen@google.com>
+Description:
+		If checkpoint=disable, it displays the number of blocks that are unusable.
+                If checkpoint=enable it displays the enumber of blocks that would be unusable
+                if checkpoint=disable were to be set.
+
+What:		/sys/fs/f2fs/<disk>/encoding
+Date		July 2019
+Contact:	"Daniel Rosenberg" <drosen@google.com>
+Description:
+		Displays name and version of the encoding set for the filesystem.
+                If no encoding is set, displays (none)
diff --git a/Documentation/ABI/testing/sysfs-kernel-ion b/Documentation/ABI/testing/sysfs-kernel-ion
new file mode 100644
index 0000000..f57f970
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-kernel-ion
@@ -0,0 +1,27 @@
+What:		/sys/kernel/ion
+Date:		Dec 2019
+KernelVersion:	4.14.158
+Contact:	Suren Baghdasaryan <surenb@google.com>,
+		Sandeep Patil <sspatil@google.com>
+Description:
+		The /sys/kernel/ion directory contains a snapshot of the
+		internal state of ION memory heaps and pools.
+Users:		kernel memory tuning tools
+
+What:		/sys/kernel/ion/total_heaps_kb
+Date:		Dec 2019
+KernelVersion:	4.14.158
+Contact:	Suren Baghdasaryan <surenb@google.com>,
+		Sandeep Patil <sspatil@google.com>
+Description:
+		The total_heaps_kb file is read-only and specifies how much
+		memory in Kb is allocated to ION heaps.
+
+What:		/sys/kernel/ion/total_pools_kb
+Date:		Dec 2019
+KernelVersion:	4.14.158
+Contact:	Suren Baghdasaryan <surenb@google.com>,
+		Sandeep Patil <sspatil@google.com>
+Description:
+		The total_pools_kb file is read-only and specifies how much
+		memory in Kb is allocated to ION pools.
diff --git a/Documentation/ABI/testing/sysfs-kernel-wakeup_reasons b/Documentation/ABI/testing/sysfs-kernel-wakeup_reasons
new file mode 100644
index 0000000..acb19b9
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-kernel-wakeup_reasons
@@ -0,0 +1,16 @@
+What:		/sys/kernel/wakeup_reasons/last_resume_reason
+Date:		February 2014
+Contact:	Ruchi Kandoi <kandoiruchi@google.com>
+Description:
+		The /sys/kernel/wakeup_reasons/last_resume_reason is
+		used to report wakeup reasons after system exited suspend.
+
+What:		/sys/kernel/wakeup_reasons/last_suspend_time
+Date:		March 2015
+Contact:	jinqian <jinqian@google.com>
+Description:
+		The /sys/kernel/wakeup_reasons/last_suspend_time is
+		used to report time spent in last suspend cycle. It contains
+		two numbers (in seconds) separated by space. First number is
+		the time spent in suspend and resume processes. Second number
+		is the time spent in sleep state.
\ No newline at end of file
diff --git a/Documentation/ABI/testing/sysfs-power b/Documentation/ABI/testing/sysfs-power
index 2f813d6..64237c1 100644
--- a/Documentation/ABI/testing/sysfs-power
+++ b/Documentation/ABI/testing/sysfs-power
@@ -300,4 +300,110 @@
 		attempt.
 
 		Using this sysfs file will override any values that were
-		set using the kernel command line for disk offset.
\ No newline at end of file
+		set using the kernel command line for disk offset.
+
+What:		/sys/power/suspend_stats
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats directory contains suspend related
+		statistics.
+
+What:		/sys/power/suspend_stats/success
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/success file contains the number
+		of times entering system sleep state succeeded.
+
+What:		/sys/power/suspend_stats/fail
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/fail file contains the number
+		of times entering system sleep state failed.
+
+What:		/sys/power/suspend_stats/failed_freeze
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/failed_freeze file contains the
+		number of times freezing processes failed.
+
+What:		/sys/power/suspend_stats/failed_prepare
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/failed_prepare file contains the
+		number of times preparing all non-sysdev devices for
+		a system PM transition failed.
+
+What:		/sys/power/suspend_stats/failed_resume
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/failed_resume file contains the
+		number of times executing "resume" callbacks of
+		non-sysdev devices failed.
+
+What:		/sys/power/suspend_stats/failed_resume_early
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/failed_resume_early file contains
+		the number of times executing "early resume" callbacks
+		of devices failed.
+
+What:		/sys/power/suspend_stats/failed_resume_noirq
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/failed_resume_noirq file contains
+		the number of times executing "noirq resume" callbacks
+		of devices failed.
+
+What:		/sys/power/suspend_stats/failed_suspend
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/failed_suspend file contains
+		the number of times executing "suspend" callbacks
+		of all non-sysdev devices failed.
+
+What:		/sys/power/suspend_stats/failed_suspend_late
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/failed_suspend_late file contains
+		the number of times executing "late suspend" callbacks
+		of all devices failed.
+
+What:		/sys/power/suspend_stats/failed_suspend_noirq
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/failed_suspend_noirq file contains
+		the number of times executing "noirq suspend" callbacks
+		of all devices failed.
+
+What:		/sys/power/suspend_stats/last_failed_dev
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/last_failed_dev file contains
+		the last device for which a suspend/resume callback failed.
+
+What:		/sys/power/suspend_stats/last_failed_errno
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/last_failed_errno file contains
+		the errno of the last failed attempt at entering
+		system sleep state.
+
+What:		/sys/power/suspend_stats/last_failed_step
+Date:		July 2019
+Contact:	Kalesh Singh <kaleshsingh96@gmail.com>
+Description:
+		The /sys/power/suspend_stats/last_failed_step file contains
+		the last failed step in the suspend/resume path.
diff --git a/Documentation/accounting/psi.txt b/Documentation/accounting/psi.txt
new file mode 100644
index 0000000..4fb40fe
--- /dev/null
+++ b/Documentation/accounting/psi.txt
@@ -0,0 +1,180 @@
+================================
+PSI - Pressure Stall Information
+================================
+
+:Date: April, 2018
+:Author: Johannes Weiner <hannes@cmpxchg.org>
+
+When CPU, memory or IO devices are contended, workloads experience
+latency spikes, throughput losses, and run the risk of OOM kills.
+
+Without an accurate measure of such contention, users are forced to
+either play it safe and under-utilize their hardware resources, or
+roll the dice and frequently suffer the disruptions resulting from
+excessive overcommit.
+
+The psi feature identifies and quantifies the disruptions caused by
+such resource crunches and the time impact it has on complex workloads
+or even entire systems.
+
+Having an accurate measure of productivity losses caused by resource
+scarcity aids users in sizing workloads to hardware--or provisioning
+hardware according to workload demand.
+
+As psi aggregates this information in realtime, systems can be managed
+dynamically using techniques such as load shedding, migrating jobs to
+other systems or data centers, or strategically pausing or killing low
+priority or restartable batch jobs.
+
+This allows maximizing hardware utilization without sacrificing
+workload health or risking major disruptions such as OOM kills.
+
+Pressure interface
+==================
+
+Pressure information for each resource is exported through the
+respective file in /proc/pressure/ -- cpu, memory, and io.
+
+The format for CPU is as such:
+
+some avg10=0.00 avg60=0.00 avg300=0.00 total=0
+
+and for memory and IO:
+
+some avg10=0.00 avg60=0.00 avg300=0.00 total=0
+full avg10=0.00 avg60=0.00 avg300=0.00 total=0
+
+The "some" line indicates the share of time in which at least some
+tasks are stalled on a given resource.
+
+The "full" line indicates the share of time in which all non-idle
+tasks are stalled on a given resource simultaneously. In this state
+actual CPU cycles are going to waste, and a workload that spends
+extended time in this state is considered to be thrashing. This has
+severe impact on performance, and it's useful to distinguish this
+situation from a state where some tasks are stalled but the CPU is
+still doing productive work. As such, time spent in this subset of the
+stall state is tracked separately and exported in the "full" averages.
+
+The ratios are tracked as recent trends over ten, sixty, and three
+hundred second windows, which gives insight into short term events as
+well as medium and long term trends. The total absolute stall time is
+tracked and exported as well, to allow detection of latency spikes
+which wouldn't necessarily make a dent in the time averages, or to
+average trends over custom time frames.
+
+Monitoring for pressure thresholds
+==================================
+
+Users can register triggers and use poll() to be woken up when resource
+pressure exceeds certain thresholds.
+
+A trigger describes the maximum cumulative stall time over a specific
+time window, e.g. 100ms of total stall time within any 500ms window to
+generate a wakeup event.
+
+To register a trigger user has to open psi interface file under
+/proc/pressure/ representing the resource to be monitored and write the
+desired threshold and time window. The open file descriptor should be
+used to wait for trigger events using select(), poll() or epoll().
+The following format is used:
+
+<some|full> <stall amount in us> <time window in us>
+
+For example writing "some 150000 1000000" into /proc/pressure/memory
+would add 150ms threshold for partial memory stall measured within
+1sec time window. Writing "full 50000 1000000" into /proc/pressure/io
+would add 50ms threshold for full io stall measured within 1sec time window.
+
+Triggers can be set on more than one psi metric and more than one trigger
+for the same psi metric can be specified. However for each trigger a separate
+file descriptor is required to be able to poll it separately from others,
+therefore for each trigger a separate open() syscall should be made even
+when opening the same psi interface file.
+
+Monitors activate only when system enters stall state for the monitored
+psi metric and deactivates upon exit from the stall state. While system is
+in the stall state psi signal growth is monitored at a rate of 10 times per
+tracking window.
+
+The kernel accepts window sizes ranging from 500ms to 10s, therefore min
+monitoring update interval is 50ms and max is 1s. Min limit is set to
+prevent overly frequent polling. Max limit is chosen as a high enough number
+after which monitors are most likely not needed and psi averages can be used
+instead.
+
+When activated, psi monitor stays active for at least the duration of one
+tracking window to avoid repeated activations/deactivations when system is
+bouncing in and out of the stall state.
+
+Notifications to the userspace are rate-limited to one per tracking window.
+
+The trigger will de-register when the file descriptor used to define the
+trigger  is closed.
+
+Userspace monitor usage example
+===============================
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <poll.h>
+#include <string.h>
+#include <unistd.h>
+
+/*
+ * Monitor memory partial stall with 1s tracking window size
+ * and 150ms threshold.
+ */
+int main() {
+	const char trig[] = "some 150000 1000000";
+	struct pollfd fds;
+	int n;
+
+	fds.fd = open("/proc/pressure/memory", O_RDWR | O_NONBLOCK);
+	if (fds.fd < 0) {
+		printf("/proc/pressure/memory open error: %s\n",
+			strerror(errno));
+		return 1;
+	}
+	fds.events = POLLPRI;
+
+	if (write(fds.fd, trig, strlen(trig) + 1) < 0) {
+		printf("/proc/pressure/memory write error: %s\n",
+			strerror(errno));
+		return 1;
+	}
+
+	printf("waiting for events...\n");
+	while (1) {
+		n = poll(&fds, 1, -1);
+		if (n < 0) {
+			printf("poll error: %s\n", strerror(errno));
+			return 1;
+		}
+		if (fds.revents & POLLERR) {
+			printf("got POLLERR, event source is gone\n");
+			return 0;
+		}
+		if (fds.revents & POLLPRI) {
+			printf("event triggered!\n");
+		} else {
+			printf("unknown event received: 0x%x\n", fds.revents);
+			return 1;
+		}
+	}
+
+	return 0;
+}
+
+Cgroup2 interface
+=================
+
+In a system with a CONFIG_CGROUP=y kernel and the cgroup2 filesystem
+mounted, pressure stall information is also tracked for tasks grouped
+into cgroups. Each subdirectory in the cgroupfs mountpoint contains
+cpu.pressure, memory.pressure, and io.pressure files; the format is
+the same as the /proc/pressure/ files.
+
+Per-cgroup psi monitors can be specified and used the same way as
+system-wide ones.
diff --git a/Documentation/admin-guide/cgroup-v2.rst b/Documentation/admin-guide/cgroup-v2.rst
index 184193b..52d093b 100644
--- a/Documentation/admin-guide/cgroup-v2.rst
+++ b/Documentation/admin-guide/cgroup-v2.rst
@@ -966,6 +966,12 @@
 	$PERIOD duration.  "max" for $MAX indicates no limit.  If only
 	one number is written, $MAX is updated.
 
+  cpu.pressure
+	A read-only nested-key file which exists on non-root cgroups.
+
+	Shows pressure stall information for CPU. See
+	Documentation/accounting/psi.txt for details.
+
 
 Memory
 ------
@@ -1271,6 +1277,12 @@
 	higher than the limit for an extended period of time.  This
 	reduces the impact on the workload and memory management.
 
+  memory.pressure
+	A read-only nested-key file which exists on non-root cgroups.
+
+	Shows pressure stall information for memory. See
+	Documentation/accounting/psi.txt for details.
+
 
 Usage Guidelines
 ~~~~~~~~~~~~~~~~
@@ -1408,6 +1420,12 @@
 
 	  8:16 rbps=2097152 wbps=max riops=max wiops=max
 
+  io.pressure
+	A read-only nested-key file which exists on non-root cgroups.
+
+	Shows pressure stall information for IO. See
+	Documentation/accounting/psi.txt for details.
+
 
 Writeback
 ~~~~~~~~~
diff --git a/Documentation/admin-guide/kernel-parameters.rst b/Documentation/admin-guide/kernel-parameters.rst
index b8d0bc0..1afb480 100644
--- a/Documentation/admin-guide/kernel-parameters.rst
+++ b/Documentation/admin-guide/kernel-parameters.rst
@@ -126,6 +126,7 @@
 	NET	Appropriate network support is enabled.
 	NUMA	NUMA support is enabled.
 	NFS	Appropriate NFS support is enabled.
+	OF	Devicetree is enabled.
 	OSS	OSS sound support is enabled.
 	PV_OPS	A paravirtualized kernel is enabled.
 	PARIDE	The ParIDE (parallel port IDE) subsystem is enabled.
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 2c0d6ae..b2e729d 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -1631,6 +1631,15 @@
 
 	initrd=		[BOOT] Specify the location of the initial ramdisk
 
+	init_on_alloc=	[MM] Fill newly allocated pages and heap objects with
+			zeroes.
+			Format: 0 | 1
+			Default set by CONFIG_INIT_ON_ALLOC_DEFAULT_ON.
+
+	init_on_free=	[MM] Fill freed pages and heap objects with zeroes.
+			Format: 0 | 1
+			Default set by CONFIG_INIT_ON_FREE_DEFAULT_ON.
+
 	init_pkru=	[x86] Specify the default memory protection keys rights
 			register contents for all processes.  0x55555554 by
 			default (disallow access to all but pkey 0).  Can
@@ -3102,6 +3111,12 @@
 			This can be set from sysctl after boot.
 			See Documentation/sysctl/vm.txt for details.
 
+	of_devlink	[OF, KNL] Create device links between consumer and
+			supplier devices by scanning the devictree to infer the
+			consumer/supplier relationships.  A consumer device
+			will not be probed until all the supplier devices have
+			probed successfully.
+
 	ohci1394_dma=early	[HW] enable debugging via the ohci1394 driver.
 			See Documentation/debugging-via-ohci1394.txt for more
 			info.
@@ -3579,6 +3594,10 @@
 			before loading.
 			See Documentation/blockdev/ramdisk.txt.
 
+	psi=		[KNL] Enable or disable pressure stall information
+			tracking.
+			Format: <bool>
+
 	psmouse.proto=	[HW,MOUSE] Highest PS2 mouse protocol extension to
 			probe for; one of (bare|imps|exps|lifebook|any).
 	psmouse.rate=	[HW,MOUSE] Set desired mouse report rate, in reports
diff --git a/Documentation/arm64/tagged-address-abi.rst b/Documentation/arm64/tagged-address-abi.rst
new file mode 100644
index 0000000..d4a85d5
--- /dev/null
+++ b/Documentation/arm64/tagged-address-abi.rst
@@ -0,0 +1,156 @@
+==========================
+AArch64 TAGGED ADDRESS ABI
+==========================
+
+Authors: Vincenzo Frascino <vincenzo.frascino@arm.com>
+         Catalin Marinas <catalin.marinas@arm.com>
+
+Date: 21 August 2019
+
+This document describes the usage and semantics of the Tagged Address
+ABI on AArch64 Linux.
+
+1. Introduction
+---------------
+
+On AArch64 the ``TCR_EL1.TBI0`` bit is set by default, allowing
+userspace (EL0) to perform memory accesses through 64-bit pointers with
+a non-zero top byte. This document describes the relaxation of the
+syscall ABI that allows userspace to pass certain tagged pointers to
+kernel syscalls.
+
+2. AArch64 Tagged Address ABI
+-----------------------------
+
+From the kernel syscall interface perspective and for the purposes of
+this document, a "valid tagged pointer" is a pointer with a potentially
+non-zero top-byte that references an address in the user process address
+space obtained in one of the following ways:
+
+- ``mmap()`` syscall where either:
+
+  - flags have the ``MAP_ANONYMOUS`` bit set or
+  - the file descriptor refers to a regular file (including those
+    returned by ``memfd_create()``) or ``/dev/zero``
+
+- ``brk()`` syscall (i.e. the heap area between the initial location of
+  the program break at process creation and its current location).
+
+- any memory mapped by the kernel in the address space of the process
+  during creation and with the same restrictions as for ``mmap()`` above
+  (e.g. data, bss, stack).
+
+The AArch64 Tagged Address ABI has two stages of relaxation depending
+how the user addresses are used by the kernel:
+
+1. User addresses not accessed by the kernel but used for address space
+   management (e.g. ``mmap()``, ``mprotect()``, ``madvise()``). The use
+   of valid tagged pointers in this context is always allowed.
+
+2. User addresses accessed by the kernel (e.g. ``write()``). This ABI
+   relaxation is disabled by default and the application thread needs to
+   explicitly enable it via ``prctl()`` as follows:
+
+   - ``PR_SET_TAGGED_ADDR_CTRL``: enable or disable the AArch64 Tagged
+     Address ABI for the calling thread.
+
+     The ``(unsigned int) arg2`` argument is a bit mask describing the
+     control mode used:
+
+     - ``PR_TAGGED_ADDR_ENABLE``: enable AArch64 Tagged Address ABI.
+       Default status is disabled.
+
+     Arguments ``arg3``, ``arg4``, and ``arg5`` must be 0.
+
+   - ``PR_GET_TAGGED_ADDR_CTRL``: get the status of the AArch64 Tagged
+     Address ABI for the calling thread.
+
+     Arguments ``arg2``, ``arg3``, ``arg4``, and ``arg5`` must be 0.
+
+   The ABI properties described above are thread-scoped, inherited on
+   clone() and fork() and cleared on exec().
+
+   Calling ``prctl(PR_SET_TAGGED_ADDR_CTRL, PR_TAGGED_ADDR_ENABLE, 0, 0, 0)``
+   returns ``-EINVAL`` if the AArch64 Tagged Address ABI is globally
+   disabled by ``sysctl abi.tagged_addr_disabled=1``. The default
+   ``sysctl abi.tagged_addr_disabled`` configuration is 0.
+
+When the AArch64 Tagged Address ABI is enabled for a thread, the
+following behaviours are guaranteed:
+
+- All syscalls except the cases mentioned in section 3 can accept any
+  valid tagged pointer.
+
+- The syscall behaviour is undefined for invalid tagged pointers: it may
+  result in an error code being returned, a (fatal) signal being raised,
+  or other modes of failure.
+
+- The syscall behaviour for a valid tagged pointer is the same as for
+  the corresponding untagged pointer.
+
+
+A definition of the meaning of tagged pointers on AArch64 can be found
+in Documentation/arm64/tagged-pointers.rst.
+
+3. AArch64 Tagged Address ABI Exceptions
+-----------------------------------------
+
+The following system call parameters must be untagged regardless of the
+ABI relaxation:
+
+- ``prctl()`` other than pointers to user data either passed directly or
+  indirectly as arguments to be accessed by the kernel.
+
+- ``ioctl()`` other than pointers to user data either passed directly or
+  indirectly as arguments to be accessed by the kernel.
+
+- ``shmat()`` and ``shmdt()``.
+
+Any attempt to use non-zero tagged pointers may result in an error code
+being returned, a (fatal) signal being raised, or other modes of
+failure.
+
+4. Example of correct usage
+---------------------------
+.. code-block:: c
+
+   #include <stdlib.h>
+   #include <string.h>
+   #include <unistd.h>
+   #include <sys/mman.h>
+   #include <sys/prctl.h>
+   
+   #define PR_SET_TAGGED_ADDR_CTRL	55
+   #define PR_TAGGED_ADDR_ENABLE	(1UL << 0)
+   
+   #define TAG_SHIFT		56
+   
+   int main(void)
+   {
+   	int tbi_enabled = 0;
+   	unsigned long tag = 0;
+   	char *ptr;
+   
+   	/* check/enable the tagged address ABI */
+   	if (!prctl(PR_SET_TAGGED_ADDR_CTRL, PR_TAGGED_ADDR_ENABLE, 0, 0, 0))
+   		tbi_enabled = 1;
+   
+   	/* memory allocation */
+   	ptr = mmap(NULL, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE,
+   		   MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+   	if (ptr == MAP_FAILED)
+   		return 1;
+   
+   	/* set a non-zero tag if the ABI is available */
+   	if (tbi_enabled)
+   		tag = rand() & 0xff;
+   	ptr = (char *)((unsigned long)ptr | (tag << TAG_SHIFT));
+   
+   	/* memory access to a tagged address */
+   	strcpy(ptr, "tagged pointer\n");
+   
+   	/* syscall with a tagged pointer */
+   	write(1, ptr, strlen(ptr));
+   
+   	return 0;
+   }
diff --git a/Documentation/arm64/tagged-pointers.txt b/Documentation/arm64/tagged-pointers.txt
index a25a99e..a800092 100644
--- a/Documentation/arm64/tagged-pointers.txt
+++ b/Documentation/arm64/tagged-pointers.txt
@@ -18,7 +18,9 @@
 --------------------------------------
 
 All interpretation of userspace memory addresses by the kernel assumes
-an address tag of 0x00.
+an address tag of 0x00, unless the application enables the AArch64
+Tagged Address ABI explicitly
+(Documentation/arm64/tagged-address-abi.rst).
 
 This includes, but is not limited to, addresses found in:
 
@@ -31,13 +33,15 @@
  - the frame pointer (x29) and frame records, e.g. when interpreting
    them to generate a backtrace or call graph.
 
-Using non-zero address tags in any of these locations may result in an
-error code being returned, a (fatal) signal being raised, or other modes
-of failure.
+Using non-zero address tags in any of these locations when the
+userspace application did not enable the AArch64 Tagged Address ABI may
+result in an error code being returned, a (fatal) signal being raised,
+or other modes of failure.
 
-For these reasons, passing non-zero address tags to the kernel via
-system calls is forbidden, and using a non-zero address tag for sp is
-strongly discouraged.
+For these reasons, when the AArch64 Tagged Address ABI is disabled,
+passing non-zero address tags to the kernel via system calls is
+forbidden, and using a non-zero address tag for sp is strongly
+discouraged.
 
 Programs maintaining a frame pointer and frame records that use non-zero
 address tags may suffer impaired or inaccurate debug and profiling
@@ -57,6 +61,9 @@
 The architecture prevents the use of a tagged PC, so the upper byte will
 be set to a sign-extension of bit 55 on exception return.
 
+This behaviour is maintained when the AArch64 Tagged Address ABI is
+enabled.
+
 
 Other considerations
 --------------------
diff --git a/Documentation/block/inline-encryption.rst b/Documentation/block/inline-encryption.rst
new file mode 100644
index 0000000..202826c
--- /dev/null
+++ b/Documentation/block/inline-encryption.rst
@@ -0,0 +1,183 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+=================
+Inline Encryption
+=================
+
+Objective
+=========
+
+We want to support inline encryption (IE) in the kernel.
+To allow for testing, we also want a crypto API fallback when actual
+IE hardware is absent. We also want IE to work with layered devices
+like dm and loopback (i.e. we want to be able to use the IE hardware
+of the underlying devices if present, or else fall back to crypto API
+en/decryption).
+
+
+Constraints and notes
+=====================
+
+- IE hardware have a limited number of "keyslots" that can be programmed
+  with an encryption context (key, algorithm, data unit size, etc.) at any time.
+  One can specify a keyslot in a data request made to the device, and the
+  device will en/decrypt the data using the encryption context programmed into
+  that specified keyslot. When possible, we want to make multiple requests with
+  the same encryption context share the same keyslot.
+
+- We need a way for filesystems to specify an encryption context to use for
+  en/decrypting a struct bio, and a device driver (like UFS) needs to be able
+  to use that encryption context when it processes the bio.
+
+- We need a way for device drivers to expose their capabilities in a unified
+  way to the upper layers.
+
+
+Design
+======
+
+We add a struct bio_crypt_ctx to struct bio that can represent an
+encryption context, because we need to be able to pass this encryption
+context from the FS layer to the device driver to act upon.
+
+While IE hardware works on the notion of keyslots, the FS layer has no
+knowledge of keyslots - it simply wants to specify an encryption context to
+use while en/decrypting a bio.
+
+We introduce a keyslot manager (KSM) that handles the translation from
+encryption contexts specified by the FS to keyslots on the IE hardware.
+This KSM also serves as the way IE hardware can expose their capabilities to
+upper layers. The generic mode of operation is: each device driver that wants
+to support IE will construct a KSM and set it up in its struct request_queue.
+Upper layers that want to use IE on this device can then use this KSM in
+the device's struct request_queue to translate an encryption context into
+a keyslot. The presence of the KSM in the request queue shall be used to mean
+that the device supports IE.
+
+On the device driver end of the interface, the device driver needs to tell the
+KSM how to actually manipulate the IE hardware in the device to do things like
+programming the crypto key into the IE hardware into a particular keyslot. All
+this is achieved through the :c:type:`struct keyslot_mgmt_ll_ops` that the
+device driver passes to the KSM when creating it.
+
+It uses refcounts to track which keyslots are idle (either they have no
+encryption context programmed, or there are no in-flight struct bios
+referencing that keyslot). When a new encryption context needs a keyslot, it
+tries to find a keyslot that has already been programmed with the same
+encryption context, and if there is no such keyslot, it evicts the least
+recently used idle keyslot and programs the new encryption context into that
+one. If no idle keyslots are available, then the caller will sleep until there
+is at least one.
+
+
+Blk-crypto
+==========
+
+The above is sufficient for simple cases, but does not work if there is a
+need for a crypto API fallback, or if we are want to use IE with layered
+devices. To these ends, we introduce blk-crypto. Blk-crypto allows us to
+present a unified view of encryption to the FS (so FS only needs to specify
+an encryption context and not worry about keyslots at all), and blk-crypto
+can decide whether to delegate the en/decryption to IE hardware or to the
+crypto API. Blk-crypto maintains an internal KSM that serves as the crypto
+API fallback.
+
+Blk-crypto needs to ensure that the encryption context is programmed into the
+"correct" keyslot manager for IE. If a bio is submitted to a layered device
+that eventually passes the bio down to a device that really does support IE, we
+want the encryption context to be programmed into a keyslot for the KSM of the
+device with IE support. However, blk-crypto does not know a priori whether a
+particular device is the final device in the layering structure for a bio or
+not. So in the case that a particular device does not support IE, since it is
+possibly the final destination device for the bio, if the bio requires
+encryption (i.e. the bio is doing a write operation), blk-crypto must fallback
+to the crypto API *before* sending the bio to the device.
+
+Blk-crypto ensures that:
+
+- The bio's encryption context is programmed into a keyslot in the KSM of the
+  request queue that the bio is being submitted to (or the crypto API fallback
+  KSM if the request queue doesn't have a KSM), and that the ``processing_ksm``
+  in the ``bi_crypt_context`` is set to this KSM
+
+- That the bio has its own individual reference to the keyslot in this KSM.
+  Once the bio passes through blk-crypto, its encryption context is programmed
+  in some KSM. The "its own individual reference to the keyslot" ensures that
+  keyslots can be released by each bio independently of other bios while
+  ensuring that the bio has a valid reference to the keyslot when, for e.g., the
+  crypto API fallback KSM in blk-crypto performs crypto on the device's behalf.
+  The individual references are ensured by increasing the refcount for the
+  keyslot in the ``processing_ksm`` when a bio with a programmed encryption
+  context is cloned.
+
+
+What blk-crypto does on bio submission
+--------------------------------------
+
+**Case 1:** blk-crypto is given a bio with only an encryption context that hasn't
+been programmed into any keyslot in any KSM (for e.g. a bio from the FS).
+  In this case, blk-crypto will program the encryption context into the KSM of the
+  request queue the bio is being submitted to (and if this KSM does not exist,
+  then it will program it into blk-crypto's internal KSM for crypto API
+  fallback). The KSM that this encryption context was programmed into is stored
+  as the ``processing_ksm`` in the bio's ``bi_crypt_context``.
+
+**Case 2:** blk-crypto is given a bio whose encryption context has already been
+programmed into a keyslot in the *crypto API fallback* KSM.
+  In this case, blk-crypto does nothing; it treats the bio as not having
+  specified an encryption context. Note that we cannot do here what we will do
+  in Case 3 because we would have already encrypted the bio via the crypto API
+  by this point.
+
+**Case 3:** blk-crypto is given a bio whose encryption context has already been
+programmed into a keyslot in some KSM (that is *not* the crypto API fallback
+KSM).
+  In this case, blk-crypto first releases that keyslot from that KSM and then
+  treats the bio as in Case 1.
+
+This way, when a device driver is processing a bio, it can be sure that
+the bio's encryption context has been programmed into some KSM (either the
+device driver's request queue's KSM, or blk-crypto's crypto API fallback KSM).
+It then simply needs to check if the bio's processing_ksm is the device's
+request queue's KSM. If so, then it should proceed with IE. If not, it should
+simply do nothing with respect to crypto, because some other KSM (perhaps the
+blk-crypto crypto API fallback KSM) is handling the en/decryption.
+
+Blk-crypto will release the keyslot that is being held by the bio (and also
+decrypt it if the bio is using the crypto API fallback KSM) once
+``bio_remaining_done`` returns true for the bio.
+
+
+Layered Devices
+===============
+
+Layered devices that wish to support IE need to create their own keyslot
+manager for their request queue, and expose whatever functionality they choose.
+When a layered device wants to pass a bio to another layer (either by
+resubmitting the same bio, or by submitting a clone), it doesn't need to do
+anything special because the bio (or the clone) will once again pass through
+blk-crypto, which will work as described in Case 3. If a layered device wants
+for some reason to do the IO by itself instead of passing it on to a child
+device, but it also chose to expose IE capabilities by setting up a KSM in its
+request queue, it is then responsible for en/decrypting the data itself. In
+such cases, the device can choose to call the blk-crypto function
+``blk_crypto_fallback_to_kernel_crypto_api`` (TODO: Not yet implemented), which will
+cause the en/decryption to be done via the crypto API fallback.
+
+
+Future Optimizations for layered devices
+========================================
+
+Creating a keyslot manager for the layered device uses up memory for each
+keyslot, and in general, a layered device (like dm-linear) merely passes the
+request on to a "child" device, so the keyslots in the layered device itself
+might be completely unused. We can instead define a new type of KSM; the
+"passthrough KSM", that layered devices can use to let blk-crypto know that
+this layered device *will* pass the bio to some child device (and hence
+through blk-crypto again, at which point blk-crypto can program the encryption
+context, instead of programming it into the layered device's KSM). Again, if
+the device "lies" and decides to do the IO itself instead of passing it on to
+a child device, it is responsible for doing the en/decryption (and can choose
+to call ``blk_crypto_fallback_to_kernel_crypto_api``). Another use case for the
+"passthrough KSM" is for IE devices that want to manage their own keyslots/do
+not have a limited number of keyslots.
diff --git a/Documentation/blockdev/zram.txt b/Documentation/blockdev/zram.txt
index 875b2b5..6e5c2bb 100644
--- a/Documentation/blockdev/zram.txt
+++ b/Documentation/blockdev/zram.txt
@@ -156,19 +156,23 @@
 A brief description of exported device attributes. For more details please
 read Documentation/ABI/testing/sysfs-block-zram.
 
-Name            access            description
-----            ------            -----------
-disksize          RW    show and set the device's disk size
-initstate         RO    shows the initialization state of the device
-reset             WO    trigger device reset
-mem_used_max      WO    reset the `mem_used_max' counter (see later)
-mem_limit         WO    specifies the maximum amount of memory ZRAM can use
-                        to store the compressed data
-max_comp_streams  RW    the number of possible concurrent compress operations
-comp_algorithm    RW    show and change the compression algorithm
-compact           WO    trigger memory compaction
-debug_stat        RO    this file is used for zram debugging purposes
-backing_dev	  RW	set up backend storage for zram to write out
+Name            	access            description
+----            	------            -----------
+disksize          	RW	show and set the device's disk size
+initstate         	RO	shows the initialization state of the device
+reset             	WO	trigger device reset
+mem_used_max      	WO	reset the `mem_used_max' counter (see later)
+mem_limit         	WO	specifies the maximum amount of memory ZRAM can use
+				to store the compressed data
+writeback_limit   	WO	specifies the maximum amount of write IO zram can
+				write out to backing device as 4KB unit
+writeback_limit_enable  RW	show and set writeback_limit feature
+max_comp_streams  	RW	the number of possible concurrent compress operations
+comp_algorithm    	RW	show and change the compression algorithm
+compact           	WO	trigger memory compaction
+debug_stat        	RO	this file is used for zram debugging purposes
+backing_dev	  	RW	set up backend storage for zram to write out
+idle		  	WO	mark allocated slot as idle
 
 
 User space is advised to use the following files to read the device statistics.
@@ -220,6 +224,17 @@
  pages_compacted  the number of pages freed during compaction
  huge_pages	  the number of incompressible pages
 
+File /sys/block/zram<id>/bd_stat
+
+The stat file represents device's backing device statistics. It consists of
+a single line of text and contains the following stats separated by whitespace:
+ bd_count	size of data written in backing device.
+		Unit: 4K bytes
+ bd_reads	the number of reads from backing device
+		Unit: 4K bytes
+ bd_writes	the number of writes to backing device
+		Unit: 4K bytes
+
 9) Deactivate:
 	swapoff /dev/zram0
 	umount /dev/zram1
@@ -237,11 +252,79 @@
 
 = writeback
 
-With incompressible pages, there is no memory saving with zram.
-Instead, with CONFIG_ZRAM_WRITEBACK, zram can write incompressible page
+With CONFIG_ZRAM_WRITEBACK, zram can write idle/incompressible page
 to backing storage rather than keeping it in memory.
-User should set up backing device via /sys/block/zramX/backing_dev
-before disksize setting.
+To use the feature, admin should set up backing device via
+
+	"echo /dev/sda5 > /sys/block/zramX/backing_dev"
+
+before disksize setting. It supports only partition at this moment.
+If admin want to use incompressible page writeback, they could do via
+
+	"echo huge > /sys/block/zramX/write"
+
+To use idle page writeback, first, user need to declare zram pages
+as idle.
+
+	"echo all > /sys/block/zramX/idle"
+
+From now on, any pages on zram are idle pages. The idle mark
+will be removed until someone request access of the block.
+IOW, unless there is access request, those pages are still idle pages.
+
+Admin can request writeback of those idle pages at right timing via
+
+	"echo idle > /sys/block/zramX/writeback"
+
+With the command, zram writeback idle pages from memory to the storage.
+
+If there are lots of write IO with flash device, potentially, it has
+flash wearout problem so that admin needs to design write limitation
+to guarantee storage health for entire product life.
+
+To overcome the concern, zram supports "writeback_limit" feature.
+The "writeback_limit_enable"'s default value is 0 so that it doesn't limit
+any writeback. IOW, if admin want to apply writeback budget, he should
+enable writeback_limit_enable via
+
+	$ echo 1 > /sys/block/zramX/writeback_limit_enable
+
+Once writeback_limit_enable is set, zram doesn't allow any writeback
+until admin set the budget via /sys/block/zramX/writeback_limit.
+
+(If admin doesn't enable writeback_limit_enable, writeback_limit's value
+assigned via /sys/block/zramX/writeback_limit is meaninless.)
+
+If admin want to limit writeback as per-day 400M, he could do it
+like below.
+
+	$ MB_SHIFT=20
+	$ 4K_SHIFT=12
+	$ echo $((400<<MB_SHIFT>>4K_SHIFT)) > \
+		/sys/block/zram0/writeback_limit.
+	$ echo 1 > /sys/block/zram0/writeback_limit_enable
+
+If admin want to allow further write again once the bugdet is exausted,
+he could do it like below
+
+	$ echo $((400<<MB_SHIFT>>4K_SHIFT)) > \
+		/sys/block/zram0/writeback_limit
+
+If admin want to see remaining writeback budget since he set,
+
+	$ cat /sys/block/zramX/writeback_limit
+
+If admin want to disable writeback limit, he could do
+
+	$ echo 0 > /sys/block/zramX/writeback_limit_enable
+
+The writeback_limit count will reset whenever you reset zram(e.g.,
+system reboot, echo 1 > /sys/block/zramX/reset) so keeping how many of
+writeback happened until you reset the zram to allocate extra writeback
+budget in next setting is user's job.
+
+If admin want to measure writeback count in a certain period, he could
+know it via /sys/block/zram0/bd_stat's 3rd column.
 
 = memory tracking
 
@@ -251,16 +334,17 @@
 If you enable the feature, you could see block state via
 /sys/kernel/debug/zram/zram0/block_state". The output is as follows,
 
-	  300    75.033841 .wh
-	  301    63.806904 s..
-	  302    63.806919 ..h
+	  300    75.033841 .wh.
+	  301    63.806904 s...
+	  302    63.806919 ..hi
 
 First column is zram's block index.
 Second column is access time since the system was booted
 Third column is state of the block.
 (s: same page
 w: written page to backing store
-h: huge page)
+h: huge page
+i: idle page)
 
 First line of above example says 300th block is accessed at 75.033841sec
 and the block's state is huge so it is written back to the backing
diff --git a/Documentation/dev-tools/gcov.rst b/Documentation/dev-tools/gcov.rst
index 69a7d90..46aae52 100644
--- a/Documentation/dev-tools/gcov.rst
+++ b/Documentation/dev-tools/gcov.rst
@@ -34,10 +34,6 @@
         CONFIG_DEBUG_FS=y
         CONFIG_GCOV_KERNEL=y
 
-select the gcc's gcov format, default is autodetect based on gcc version::
-
-        CONFIG_GCOV_FORMAT_AUTODETECT=y
-
 and to get coverage data for the entire kernel::
 
         CONFIG_GCOV_PROFILE_ALL=y
@@ -169,6 +165,20 @@
       [user@build] gcov -o /tmp/coverage/tmp/out/init main.c
 
 
+Note on compilers
+-----------------
+
+GCC and LLVM gcov tools are not necessarily compatible. Use gcov_ to work with
+GCC-generated .gcno and .gcda files, and use llvm-cov_ for Clang.
+
+.. _gcov: http://gcc.gnu.org/onlinedocs/gcc/Gcov.html
+.. _llvm-cov: https://llvm.org/docs/CommandGuide/llvm-cov.html
+
+Build differences between GCC and Clang gcov are handled by Kconfig. It
+automatically selects the appropriate gcov format depending on the detected
+toolchain.
+
+
 Troubleshooting
 ---------------
 
diff --git a/Documentation/dev-tools/kasan.rst b/Documentation/dev-tools/kasan.rst
index aabc873..b72d07d 100644
--- a/Documentation/dev-tools/kasan.rst
+++ b/Documentation/dev-tools/kasan.rst
@@ -4,15 +4,25 @@
 Overview
 --------
 
-KernelAddressSANitizer (KASAN) is a dynamic memory error detector. It provides
-a fast and comprehensive solution for finding use-after-free and out-of-bounds
-bugs.
+KernelAddressSANitizer (KASAN) is a dynamic memory error detector designed to
+find out-of-bound and use-after-free bugs. KASAN has two modes: generic KASAN
+(similar to userspace ASan) and software tag-based KASAN (similar to userspace
+HWASan).
 
-KASAN uses compile-time instrumentation for checking every memory access,
-therefore you will need a GCC version 4.9.2 or later. GCC 5.0 or later is
-required for detection of out-of-bounds accesses to stack or global variables.
+KASAN uses compile-time instrumentation to insert validity checks before every
+memory access, and therefore requires a compiler version that supports that.
 
-Currently KASAN is supported only for the x86_64 and arm64 architectures.
+Generic KASAN is supported in both GCC and Clang. With GCC it requires version
+4.9.2 or later for basic support and version 5.0 or later for detection of
+out-of-bounds accesses for stack and global variables and for inline
+instrumentation mode (see the Usage section). With Clang it requires version
+7.0.0 or later and it doesn't support detection of out-of-bounds accesses for
+global variables yet.
+
+Tag-based KASAN is only supported in Clang and requires version 7.0.0 or later.
+
+Currently generic KASAN is supported for the x86_64, arm64, xtensa and s390
+architectures, and tag-based KASAN is supported only for arm64.
 
 Usage
 -----
@@ -21,12 +31,14 @@
 
 	  CONFIG_KASAN = y
 
-and choose between CONFIG_KASAN_OUTLINE and CONFIG_KASAN_INLINE. Outline and
-inline are compiler instrumentation types. The former produces smaller binary
-the latter is 1.1 - 2 times faster. Inline instrumentation requires a GCC
-version 5.0 or later.
+and choose between CONFIG_KASAN_GENERIC (to enable generic KASAN) and
+CONFIG_KASAN_SW_TAGS (to enable software tag-based KASAN).
 
-KASAN works with both SLUB and SLAB memory allocators.
+You also need to choose between CONFIG_KASAN_OUTLINE and CONFIG_KASAN_INLINE.
+Outline and inline are compiler instrumentation types. The former produces
+smaller binary while the latter is 1.1 - 2 times faster.
+
+Both KASAN modes work with both SLUB and SLAB memory allocators.
 For better bug detection and nicer reporting, enable CONFIG_STACKTRACE.
 
 To disable instrumentation for specific files or directories, add a line
@@ -43,85 +55,85 @@
 Error reports
 ~~~~~~~~~~~~~
 
-A typical out of bounds access report looks like this::
+A typical out-of-bounds access generic KASAN report looks like this::
 
     ==================================================================
-    BUG: AddressSanitizer: out of bounds access in kmalloc_oob_right+0x65/0x75 [test_kasan] at addr ffff8800693bc5d3
-    Write of size 1 by task modprobe/1689
-    =============================================================================
-    BUG kmalloc-128 (Not tainted): kasan error
-    -----------------------------------------------------------------------------
+    BUG: KASAN: slab-out-of-bounds in kmalloc_oob_right+0xa8/0xbc [test_kasan]
+    Write of size 1 at addr ffff8801f44ec37b by task insmod/2760
 
-    Disabling lock debugging due to kernel taint
-    INFO: Allocated in kmalloc_oob_right+0x3d/0x75 [test_kasan] age=0 cpu=0 pid=1689
-     __slab_alloc+0x4b4/0x4f0
-     kmem_cache_alloc_trace+0x10b/0x190
-     kmalloc_oob_right+0x3d/0x75 [test_kasan]
-     init_module+0x9/0x47 [test_kasan]
-     do_one_initcall+0x99/0x200
-     load_module+0x2cb3/0x3b20
-     SyS_finit_module+0x76/0x80
-     system_call_fastpath+0x12/0x17
-    INFO: Slab 0xffffea0001a4ef00 objects=17 used=7 fp=0xffff8800693bd728 flags=0x100000000004080
-    INFO: Object 0xffff8800693bc558 @offset=1368 fp=0xffff8800693bc720
-
-    Bytes b4 ffff8800693bc548: 00 00 00 00 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a  ........ZZZZZZZZ
-    Object ffff8800693bc558: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
-    Object ffff8800693bc568: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
-    Object ffff8800693bc578: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
-    Object ffff8800693bc588: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
-    Object ffff8800693bc598: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
-    Object ffff8800693bc5a8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
-    Object ffff8800693bc5b8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
-    Object ffff8800693bc5c8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b a5  kkkkkkkkkkkkkkk.
-    Redzone ffff8800693bc5d8: cc cc cc cc cc cc cc cc                          ........
-    Padding ffff8800693bc718: 5a 5a 5a 5a 5a 5a 5a 5a                          ZZZZZZZZ
-    CPU: 0 PID: 1689 Comm: modprobe Tainted: G    B          3.18.0-rc1-mm1+ #98
-    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5-0-ge51488c-20140602_164612-nilsson.home.kraxel.org 04/01/2014
-     ffff8800693bc000 0000000000000000 ffff8800693bc558 ffff88006923bb78
-     ffffffff81cc68ae 00000000000000f3 ffff88006d407600 ffff88006923bba8
-     ffffffff811fd848 ffff88006d407600 ffffea0001a4ef00 ffff8800693bc558
+    CPU: 1 PID: 2760 Comm: insmod Not tainted 4.19.0-rc3+ #698
+    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1 04/01/2014
     Call Trace:
-     [<ffffffff81cc68ae>] dump_stack+0x46/0x58
-     [<ffffffff811fd848>] print_trailer+0xf8/0x160
-     [<ffffffffa00026a7>] ? kmem_cache_oob+0xc3/0xc3 [test_kasan]
-     [<ffffffff811ff0f5>] object_err+0x35/0x40
-     [<ffffffffa0002065>] ? kmalloc_oob_right+0x65/0x75 [test_kasan]
-     [<ffffffff8120b9fa>] kasan_report_error+0x38a/0x3f0
-     [<ffffffff8120a79f>] ? kasan_poison_shadow+0x2f/0x40
-     [<ffffffff8120b344>] ? kasan_unpoison_shadow+0x14/0x40
-     [<ffffffff8120a79f>] ? kasan_poison_shadow+0x2f/0x40
-     [<ffffffffa00026a7>] ? kmem_cache_oob+0xc3/0xc3 [test_kasan]
-     [<ffffffff8120a995>] __asan_store1+0x75/0xb0
-     [<ffffffffa0002601>] ? kmem_cache_oob+0x1d/0xc3 [test_kasan]
-     [<ffffffffa0002065>] ? kmalloc_oob_right+0x65/0x75 [test_kasan]
-     [<ffffffffa0002065>] kmalloc_oob_right+0x65/0x75 [test_kasan]
-     [<ffffffffa00026b0>] init_module+0x9/0x47 [test_kasan]
-     [<ffffffff810002d9>] do_one_initcall+0x99/0x200
-     [<ffffffff811e4e5c>] ? __vunmap+0xec/0x160
-     [<ffffffff81114f63>] load_module+0x2cb3/0x3b20
-     [<ffffffff8110fd70>] ? m_show+0x240/0x240
-     [<ffffffff81115f06>] SyS_finit_module+0x76/0x80
-     [<ffffffff81cd3129>] system_call_fastpath+0x12/0x17
+     dump_stack+0x94/0xd8
+     print_address_description+0x73/0x280
+     kasan_report+0x144/0x187
+     __asan_report_store1_noabort+0x17/0x20
+     kmalloc_oob_right+0xa8/0xbc [test_kasan]
+     kmalloc_tests_init+0x16/0x700 [test_kasan]
+     do_one_initcall+0xa5/0x3ae
+     do_init_module+0x1b6/0x547
+     load_module+0x75df/0x8070
+     __do_sys_init_module+0x1c6/0x200
+     __x64_sys_init_module+0x6e/0xb0
+     do_syscall_64+0x9f/0x2c0
+     entry_SYSCALL_64_after_hwframe+0x44/0xa9
+    RIP: 0033:0x7f96443109da
+    RSP: 002b:00007ffcf0b51b08 EFLAGS: 00000202 ORIG_RAX: 00000000000000af
+    RAX: ffffffffffffffda RBX: 000055dc3ee521a0 RCX: 00007f96443109da
+    RDX: 00007f96445cff88 RSI: 0000000000057a50 RDI: 00007f9644992000
+    RBP: 000055dc3ee510b0 R08: 0000000000000003 R09: 0000000000000000
+    R10: 00007f964430cd0a R11: 0000000000000202 R12: 00007f96445cff88
+    R13: 000055dc3ee51090 R14: 0000000000000000 R15: 0000000000000000
+
+    Allocated by task 2760:
+     save_stack+0x43/0xd0
+     kasan_kmalloc+0xa7/0xd0
+     kmem_cache_alloc_trace+0xe1/0x1b0
+     kmalloc_oob_right+0x56/0xbc [test_kasan]
+     kmalloc_tests_init+0x16/0x700 [test_kasan]
+     do_one_initcall+0xa5/0x3ae
+     do_init_module+0x1b6/0x547
+     load_module+0x75df/0x8070
+     __do_sys_init_module+0x1c6/0x200
+     __x64_sys_init_module+0x6e/0xb0
+     do_syscall_64+0x9f/0x2c0
+     entry_SYSCALL_64_after_hwframe+0x44/0xa9
+
+    Freed by task 815:
+     save_stack+0x43/0xd0
+     __kasan_slab_free+0x135/0x190
+     kasan_slab_free+0xe/0x10
+     kfree+0x93/0x1a0
+     umh_complete+0x6a/0xa0
+     call_usermodehelper_exec_async+0x4c3/0x640
+     ret_from_fork+0x35/0x40
+
+    The buggy address belongs to the object at ffff8801f44ec300
+     which belongs to the cache kmalloc-128 of size 128
+    The buggy address is located 123 bytes inside of
+     128-byte region [ffff8801f44ec300, ffff8801f44ec380)
+    The buggy address belongs to the page:
+    page:ffffea0007d13b00 count:1 mapcount:0 mapping:ffff8801f7001640 index:0x0
+    flags: 0x200000000000100(slab)
+    raw: 0200000000000100 ffffea0007d11dc0 0000001a0000001a ffff8801f7001640
+    raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000
+    page dumped because: kasan: bad access detected
+
     Memory state around the buggy address:
-     ffff8800693bc300: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
-     ffff8800693bc380: fc fc 00 00 00 00 00 00 00 00 00 00 00 00 00 fc
-     ffff8800693bc400: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
-     ffff8800693bc480: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
-     ffff8800693bc500: fc fc fc fc fc fc fc fc fc fc fc 00 00 00 00 00
-    >ffff8800693bc580: 00 00 00 00 00 00 00 00 00 00 03 fc fc fc fc fc
-                                                 ^
-     ffff8800693bc600: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
-     ffff8800693bc680: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
-     ffff8800693bc700: fc fc fc fc fb fb fb fb fb fb fb fb fb fb fb fb
-     ffff8800693bc780: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
-     ffff8800693bc800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
+     ffff8801f44ec200: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
+     ffff8801f44ec280: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
+    >ffff8801f44ec300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03
+                                                                    ^
+     ffff8801f44ec380: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
+     ffff8801f44ec400: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
     ==================================================================
 
-The header of the report discribe what kind of bug happened and what kind of
-access caused it. It's followed by the description of the accessed slub object
-(see 'SLUB Debug output' section in Documentation/vm/slub.rst for details) and
-the description of the accessed memory page.
+The header of the report provides a short summary of what kind of bug happened
+and what kind of access caused it. It's followed by a stack trace of the bad
+access, a stack trace of where the accessed memory was allocated (in case bad
+access happens on a slab object), and a stack trace of where the object was
+freed (in case of a use-after-free bug report). Next comes a description of
+the accessed slab object and information about the accessed memory page.
 
 In the last section the report shows memory state around the accessed address.
 Reading this part requires some understanding of how KASAN works.
@@ -138,18 +150,24 @@
 In the report above the arrows point to the shadow byte 03, which means that
 the accessed address is partially accessible.
 
+For tag-based KASAN this last report section shows the memory tags around the
+accessed address (see Implementation details section).
+
 
 Implementation details
 ----------------------
 
+Generic KASAN
+~~~~~~~~~~~~~
+
 From a high level, our approach to memory error detection is similar to that
 of kmemcheck: use shadow memory to record whether each byte of memory is safe
-to access, and use compile-time instrumentation to check shadow memory on each
-memory access.
+to access, and use compile-time instrumentation to insert checks of shadow
+memory on each memory access.
 
-AddressSanitizer dedicates 1/8 of kernel memory to its shadow memory
-(e.g. 16TB to cover 128TB on x86_64) and uses direct mapping with a scale and
-offset to translate a memory address to its corresponding shadow address.
+Generic KASAN dedicates 1/8th of kernel memory to its shadow memory (e.g. 16TB
+to cover 128TB on x86_64) and uses direct mapping with a scale and offset to
+translate a memory address to its corresponding shadow address.
 
 Here is the function which translates an address to its corresponding shadow
 address::
@@ -162,12 +180,38 @@
 
 where ``KASAN_SHADOW_SCALE_SHIFT = 3``.
 
-Compile-time instrumentation used for checking memory accesses. Compiler inserts
-function calls (__asan_load*(addr), __asan_store*(addr)) before each memory
-access of size 1, 2, 4, 8 or 16. These functions check whether memory access is
-valid or not by checking corresponding shadow memory.
+Compile-time instrumentation is used to insert memory access checks. Compiler
+inserts function calls (__asan_load*(addr), __asan_store*(addr)) before each
+memory access of size 1, 2, 4, 8 or 16. These functions check whether memory
+access is valid or not by checking corresponding shadow memory.
 
 GCC 5.0 has possibility to perform inline instrumentation. Instead of making
 function calls GCC directly inserts the code to check the shadow memory.
 This option significantly enlarges kernel but it gives x1.1-x2 performance
 boost over outline instrumented kernel.
+
+Software tag-based KASAN
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Tag-based KASAN uses the Top Byte Ignore (TBI) feature of modern arm64 CPUs to
+store a pointer tag in the top byte of kernel pointers. Like generic KASAN it
+uses shadow memory to store memory tags associated with each 16-byte memory
+cell (therefore it dedicates 1/16th of the kernel memory for shadow memory).
+
+On each memory allocation tag-based KASAN generates a random tag, tags the
+allocated memory with this tag, and embeds this tag into the returned pointer.
+Software tag-based KASAN uses compile-time instrumentation to insert checks
+before each memory access. These checks make sure that tag of the memory that
+is being accessed is equal to tag of the pointer that is used to access this
+memory. In case of a tag mismatch tag-based KASAN prints a bug report.
+
+Software tag-based KASAN also has two instrumentation modes (outline, that
+emits callbacks to check memory accesses; and inline, that performs the shadow
+memory checks inline). With outline instrumentation mode, a bug report is
+simply printed from the function that performs the access check. With inline
+instrumentation a brk instruction is emitted by the compiler, and a dedicated
+brk handler is used to print bug reports.
+
+A potential expansion of this mode is a hardware tag-based mode, which would
+use hardware memory tagging support instead of compiler instrumentation and
+manual shadow memory manipulation.
diff --git a/Documentation/device-mapper/dm-bow.txt b/Documentation/device-mapper/dm-bow.txt
new file mode 100644
index 0000000..e3fc4d2
--- /dev/null
+++ b/Documentation/device-mapper/dm-bow.txt
@@ -0,0 +1,99 @@
+dm_bow (backup on write)
+========================
+
+dm_bow is a device mapper driver that uses the free space on a device to back up
+data that is overwritten. The changes can then be committed by a simple state
+change, or rolled back by removing the dm_bow device and running a command line
+utility over the underlying device.
+
+dm_bow has three states, set by writing ‘1’ or ‘2’ to /sys/block/dm-?/bow/state.
+It is only possible to go from state 0 (initial state) to state 1, and then from
+state 1 to state 2.
+
+State 0: dm_bow collects all trims to the device and assumes that these mark
+free space on the overlying file system that can be safely used. Typically the
+mount code would create the dm_bow device, mount the file system, call the
+FITRIM ioctl on the file system then switch to state 1. These trims are not
+propagated to the underlying device.
+
+State 1: All writes to the device cause the underlying data to be backed up to
+the free (trimmed) area as needed in such a way as they can be restored.
+However, the writes, with one exception, then happen exactly as they would
+without dm_bow, so the device is always in a good final state. The exception is
+that sector 0 is used to keep a log of the latest changes, both to indicate that
+we are in this state and to allow rollback. See below for all details. If there
+isn't enough free space, writes are failed with -ENOSPC.
+
+State 2: The transition to state 2 triggers replacing the special sector 0 with
+the normal sector 0, and the freeing of all state information. dm_bow then
+becomes a pass-through driver, allowing the device to continue to be used with
+minimal performance impact.
+
+Usage
+=====
+dm-bow takes one command line parameter, the name of the underlying device.
+
+dm-bow will typically be used in the following way. dm-bow will be loaded with a
+suitable underlying device and the resultant device will be mounted. A file
+system trim will be issued via the FITRIM ioctl, then the device will be
+switched to state 1. The file system will now be used as normal. At some point,
+the changes can either be committed by switching to state 2, or rolled back by
+unmounting the file system, removing the dm-bow device and running the command
+line utility. Note that rebooting the device will be equivalent to unmounting
+and removing, but the command line utility must still be run
+
+Details of operation in state 1
+===============================
+
+dm_bow maintains a type for all sectors. A sector can be any of:
+
+SECTOR0
+SECTOR0_CURRENT
+UNCHANGED
+FREE
+CHANGED
+BACKUP
+
+SECTOR0 is the first sector on the device, and is used to hold the log of
+changes. This is the one exception.
+
+SECTOR0_CURRENT is a sector picked from the FREE sectors, and is where reads and
+writes from the true sector zero are redirected to. Note that like any backup
+sector, if the sector is written to directly, it must be moved again.
+
+UNCHANGED means that the sector has not been changed since we entered state 1.
+Thus if it is written to or trimmed, the contents must first be backed up.
+
+FREE means that the sector was trimmed in state 0 and has not yet been written
+to or used for backup. On being written to, a FREE sector is changed to CHANGED.
+
+CHANGED means that the sector has been modified, and can be further modified
+without further backup.
+
+BACKUP means that this is a free sector being used as a backup. On being written
+to, the contents must first be backed up again.
+
+All backup operations are logged to the first sector. The log sector has the
+format:
+--------------------------------------------------------
+| Magic | Count | Sequence | Log entry | Log entry | …
+--------------------------------------------------------
+
+Magic is a magic number. Count is the number of log entries. Sequence is 0
+initially. A log entry is
+
+-----------------------------------
+| Source | Dest | Size | Checksum |
+-----------------------------------
+
+When SECTOR0 is full, the log sector is backed up and another empty log sector
+created with sequence number one higher. The first entry in any log entry with
+sequence > 0 therefore must be the log of the backing up of the previous log
+sector. Note that sequence is not strictly needed, but is a useful sanity check
+and potentially limits the time spent trying to restore a corrupted snapshot.
+
+On entering state 1, dm_bow has a list of free sectors. All other sectors are
+unchanged. Sector0_current is selected from the free sectors and the contents of
+sector 0 are copied there. The sector 0 is backed up, which triggers the first
+log entry to be written.
+
diff --git a/Documentation/devicetree/bindings/arm/coresight.txt b/Documentation/devicetree/bindings/arm/coresight.txt
index 5d1ad09..410e09e 100644
--- a/Documentation/devicetree/bindings/arm/coresight.txt
+++ b/Documentation/devicetree/bindings/arm/coresight.txt
@@ -75,6 +75,15 @@
 
 	* port or ports: same as above.
 
+* Optional properties for all components:
+
+	* arm,coresight-loses-context-with-cpu : boolean. Indicates that the
+	  hardware will lose register context on CPU power down (e.g. CPUIdle).
+	  An example of where this may be needed are systems which contain a
+	  coresight component and CPU in the same power domain. When the CPU
+	  powers down the coresight component also powers down and loses its
+	  context. This property is currently only used for the ETM 4.x driver.
+
 * Optional properties for ETM/PTMs:
 
 	* arm,cp14: must be present if the system accesses ETM/PTM management
diff --git a/Documentation/dontdiff b/Documentation/dontdiff
index 2228fcc..2e2e52c 100644
--- a/Documentation/dontdiff
+++ b/Documentation/dontdiff
@@ -177,6 +177,7 @@
 mkregtable
 mktables
 mktree
+mkutf8data
 modpost
 modules.builtin
 modules.order
@@ -255,6 +256,7 @@
 wanxlfw.inc
 uImage
 unifdef
+utf8data.h
 wakeup.bin
 wakeup.elf
 wakeup.lds
diff --git a/Documentation/driver-api/device_link.rst b/Documentation/driver-api/device_link.rst
index d676327..7c2b704 100644
--- a/Documentation/driver-api/device_link.rst
+++ b/Documentation/driver-api/device_link.rst
@@ -242,7 +242,8 @@
   :c:func:`driver_bound()`.)
 
 * Before a consumer device is probed, presence of supplier drivers is
-  verified by checking that links to suppliers are in ``DL_STATE_AVAILABLE``
+  verified by checking the consumer device is not in the wait_for_suppliers
+  list and by checking that links to suppliers are in ``DL_STATE_AVAILABLE``
   state.  The state of the links is updated to ``DL_STATE_CONSUMER_PROBE``.
   (Call to :c:func:`device_links_check_suppliers()` from
   :c:func:`really_probe()`.)
diff --git a/Documentation/driver-model/driver.txt b/Documentation/driver-model/driver.txt
index d661e6f..4398550 100644
--- a/Documentation/driver-model/driver.txt
+++ b/Documentation/driver-model/driver.txt
@@ -164,6 +164,49 @@
 the driver did not bind to this device, in which case it should have
 released all resources it allocated.
 
+	void (*sync_state)(struct device *dev);
+
+sync_state is called only once for a device. It's called when all the consumer
+devices of the device have successfully probed. The list of consumers of the
+device is obtained by looking at the device links connecting that device to its
+consumer devices.
+
+The first attempt to call sync_state() is made during late_initcall_sync() to
+give firmware and drivers time to link devices to each other. During the first
+attempt at calling sync_state(), if all the consumers of the device at that
+point in time have already probed successfully, sync_state() is called right
+away. If there are no consumers of the device during the first attempt, that
+too is considered as "all consumers of the device have probed" and sync_state()
+is called right away.
+
+If during the first attempt at calling sync_state() for a device, there are
+still consumers that haven't probed successfully, the sync_state() call is
+postponed and reattempted in the future only when one or more consumers of the
+device probe successfully. If during the reattempt, the driver core finds that
+there are one or more consumers of the device that haven't probed yet, then
+sync_state() call is postponed again.
+
+A typical use case for sync_state() is to have the kernel cleanly take over
+management of devices from the bootloader. For example, if a device is left on
+and at a particular hardware configuration by the bootloader, the device's
+driver might need to keep the device in the boot configuration until all the
+consumers of the device have probed. Once all the consumers of the device have
+probed, the device's driver can synchronize the hardware state of the device to
+match the aggregated software state requested by all the consumers. Hence the
+name sync_state().
+
+While obvious examples of resources that can benefit from sync_state() include
+resources such as regulator, sync_state() can also be useful for complex
+resources like IOMMUs. For example, IOMMUs with multiple consumers (devices
+whose addresses are remapped by the IOMMU) might need to keep their mappings
+fixed at (or additive to) the boot configuration until all its consumers have
+probed.
+
+While the typical use case for sync_state() is to have the kernel cleanly take
+over management of devices from the bootloader, the usage of sync_state() is
+not restricted to that. Use it whenever it makes sense to take an action after
+all the consumers of a device have probed.
+
 	int 	(*remove)	(struct device * dev);
 
 remove is called to unbind a driver from a device. This may be
diff --git a/Documentation/filesystems/ext4/ondisk/overview.rst b/Documentation/filesystems/ext4/ondisk/overview.rst
index cbab18b..123ebfd 100644
--- a/Documentation/filesystems/ext4/ondisk/overview.rst
+++ b/Documentation/filesystems/ext4/ondisk/overview.rst
@@ -24,3 +24,4 @@
 .. include:: bigalloc.rst
 .. include:: inlinedata.rst
 .. include:: eainode.rst
+.. include:: verity.rst
diff --git a/Documentation/filesystems/ext4/verity.rst b/Documentation/filesystems/ext4/verity.rst
new file mode 100644
index 0000000..3e4c0ee
--- /dev/null
+++ b/Documentation/filesystems/ext4/verity.rst
@@ -0,0 +1,41 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+Verity files
+------------
+
+ext4 supports fs-verity, which is a filesystem feature that provides
+Merkle tree based hashing for individual readonly files.  Most of
+fs-verity is common to all filesystems that support it; see
+:ref:`Documentation/filesystems/fsverity.rst <fsverity>` for the
+fs-verity documentation.  However, the on-disk layout of the verity
+metadata is filesystem-specific.  On ext4, the verity metadata is
+stored after the end of the file data itself, in the following format:
+
+- Zero-padding to the next 65536-byte boundary.  This padding need not
+  actually be allocated on-disk, i.e. it may be a hole.
+
+- The Merkle tree, as documented in
+  :ref:`Documentation/filesystems/fsverity.rst
+  <fsverity_merkle_tree>`, with the tree levels stored in order from
+  root to leaf, and the tree blocks within each level stored in their
+  natural order.
+
+- Zero-padding to the next filesystem block boundary.
+
+- The verity descriptor, as documented in
+  :ref:`Documentation/filesystems/fsverity.rst <fsverity_descriptor>`,
+  with optionally appended signature blob.
+
+- Zero-padding to the next offset that is 4 bytes before a filesystem
+  block boundary.
+
+- The size of the verity descriptor in bytes, as a 4-byte little
+  endian integer.
+
+Verity inodes have EXT4_VERITY_FL set, and they must use extents, i.e.
+EXT4_EXTENTS_FL must be set and EXT4_INLINE_DATA_FL must be clear.
+They can have EXT4_ENCRYPT_FL set, in which case the verity metadata
+is encrypted as well as the data itself.
+
+Verity files cannot have blocks allocated past the end of the verity
+metadata.
diff --git a/Documentation/filesystems/f2fs.txt b/Documentation/filesystems/f2fs.txt
index e5edd29..3135b80 100644
--- a/Documentation/filesystems/f2fs.txt
+++ b/Documentation/filesystems/f2fs.txt
@@ -126,6 +126,8 @@
                        does not aware of cold files such as media files.
 inline_xattr           Enable the inline xattrs feature.
 noinline_xattr         Disable the inline xattrs feature.
+inline_xattr_size=%u   Support configuring inline xattr size, it depends on
+		       flexible inline xattr feature.
 inline_data            Enable the inline data feature: New created small(<~3.4k)
                        files can be written into inode block.
 inline_dentry          Enable the inline dir feature: data in new created
@@ -155,6 +157,11 @@
                        enabled by default.
 data_flush             Enable data flushing before checkpoint in order to
                        persist data of regular and symlink.
+reserve_root=%d        Support configuring reserved space which is used for
+                       allocation from a privileged user with specified uid or
+                       gid, unit: 4KB, the default limit is 0.2% of user blocks.
+resuid=%d              The user ID which may use the reserved blocks.
+resgid=%d              The group ID which may use the reserved blocks.
 fault_injection=%d     Enable fault injection in all supported types with
                        specified injection rate.
 fault_type=%d          Support configuring fault injection type, should be
@@ -172,9 +179,10 @@
                        FAULT_DIR_DEPTH		0x000000100
                        FAULT_EVICT_INODE	0x000000200
                        FAULT_TRUNCATE		0x000000400
-                       FAULT_IO			0x000000800
+                       FAULT_READ_IO		0x000000800
                        FAULT_CHECKPOINT		0x000001000
                        FAULT_DISCARD		0x000002000
+                       FAULT_WRITE_IO		0x000004000
 mode=%s                Control block allocation mode which supports "adaptive"
                        and "lfs". In "lfs" mode, there should be no random
                        writes towards main area.
@@ -211,6 +219,22 @@
                        non-atomic files likewise "nobarrier" mount option.
 test_dummy_encryption  Enable dummy encryption, which provides a fake fscrypt
                        context. The fake fscrypt context is used by xfstests.
+checkpoint=%s[:%u[%]]     Set to "disable" to turn off checkpointing. Set to "enable"
+                       to reenable checkpointing. Is enabled by default. While
+                       disabled, any unmounting or unexpected shutdowns will cause
+                       the filesystem contents to appear as they did when the
+                       filesystem was mounted with that option.
+                       While mounting with checkpoint=disabled, the filesystem must
+                       run garbage collection to ensure that all available space can
+                       be used. If this takes too much time, the mount may return
+                       EAGAIN. You may optionally add a value to indicate how much
+                       of the disk you would be willing to temporarily give up to
+                       avoid additional garbage collection. This can be given as a
+                       number of blocks, or as a percent. For instance, mounting
+                       with checkpoint=disable:100% would always succeed, but it may
+                       hide up to all remaining free space. The actual space that
+                       would be unusable can be viewed at /sys/fs/f2fs/<disk>/unusable
+                       This space is reclaimed once checkpoint=enable.
 
 ================================================================================
 DEBUGFS ENTRIES
@@ -238,11 +262,14 @@
 ..............................................................................
  File                         Content
 
- gc_max_sleep_time            This tuning parameter controls the maximum sleep
+ gc_urgent_sleep_time         This parameter controls sleep time for gc_urgent.
+                              500 ms is set by default. See above gc_urgent.
+
+ gc_min_sleep_time            This tuning parameter controls the minimum sleep
                               time for the garbage collection thread. Time is
                               in milliseconds.
 
- gc_min_sleep_time            This tuning parameter controls the minimum sleep
+ gc_max_sleep_time            This tuning parameter controls the maximum sleep
                               time for the garbage collection thread. Time is
                               in milliseconds.
 
@@ -262,9 +289,6 @@
                               to 1, background thread starts to do GC by given
                               gc_urgent_sleep_time interval.
 
- gc_urgent_sleep_time         This parameter controls sleep time for gc_urgent.
-                              500 ms is set by default. See above gc_urgent.
-
  reclaim_segments             This parameter controls the number of prefree
                               segments to be reclaimed. If the number of prefree
 			      segments is larger than the number of segments
@@ -273,13 +297,25 @@
 			      reclaim the prefree segments to free segments.
 			      By default, 5% over total # of segments.
 
+ main_blkaddr                 This value gives the first block address of
+			      MAIN area in the partition.
+
  max_small_discards	      This parameter controls the number of discard
 			      commands that consist small blocks less than 2MB.
 			      The candidates to be discarded are cached until
 			      checkpoint is triggered, and issued during the
 			      checkpoint. By default, it is disabled with 0.
 
- trim_sections                This parameter controls the number of sections
+ discard_granularity	      This parameter controls the granularity of discard
+			      command size. It will issue discard commands iif
+			      the size is larger than given granularity. Its
+			      unit size is 4KB, and 4 (=16KB) is set by default.
+			      The maximum value is 128 (=512KB).
+
+ reserved_blocks	      This parameter indicates the number of blocks that
+			      f2fs reserves internally for root.
+
+ batched_trim_sections	      This parameter controls the number of sections
                               to be trimmed out in batch mode when FITRIM
                               conducts. 32 sections is set by default.
 
@@ -301,11 +337,35 @@
 			      the number is less than this value, it triggers
 			      in-place-updates.
 
+ min_seq_blocks		      This parameter controls the threshold to serialize
+			      write IOs issued by multiple threads in parallel.
+
+ min_hot_blocks		      This parameter controls the threshold to allocate
+			      a hot data log for pending data blocks to write.
+
+ min_ssr_sections	      This parameter adds the threshold when deciding
+			      SSR block allocation. If this is large, SSR mode
+			      will be enabled early.
+
+ ram_thresh                   This parameter controls the memory footprint used
+			      by free nids and cached nat entries. By default,
+			      1 is set, which indicates 10 MB / 1 GB RAM.
+
+ ra_nid_pages		      When building free nids, F2FS reads NAT blocks
+			      ahead for speed up. Default is 0.
+
+ dirty_nats_ratio	      Given dirty ratio of cached nat entries, F2FS
+			      determines flushing them in background.
+
  max_victim_search	      This parameter controls the number of trials to
 			      find a victim segment when conducting SSR and
 			      cleaning operations. The default value is 4096
 			      which covers 8GB block address range.
 
+ migration_granularity	      For large-sized sections, F2FS can stop GC given
+			      this granularity instead of reclaiming entire
+			      section.
+
  dir_level                    This parameter controls the directory level to
 			      support large directory. If a directory has a
 			      number of files, it can reduce the file lookup
@@ -313,9 +373,56 @@
 			      Otherwise, it needs to decrease this value to
 			      reduce the space overhead. The default value is 0.
 
- ram_thresh                   This parameter controls the memory footprint used
-			      by free nids and cached nat entries. By default,
-			      10 is set, which indicates 10 MB / 1 GB RAM.
+ cp_interval		      F2FS tries to do checkpoint periodically, 60 secs
+			      by default.
+
+ idle_interval		      F2FS detects system is idle, if there's no F2FS
+			      operations during given interval, 5 secs by
+			      default.
+
+ discard_idle_interval	      F2FS detects the discard thread is idle, given
+			      time interval. Default is 5 secs.
+
+ gc_idle_interval	      F2FS detects the GC thread is idle, given time
+			      interval. Default is 5 secs.
+
+ umount_discard_timeout       When unmounting the disk, F2FS waits for finishing
+			      queued discard commands which can take huge time.
+			      This gives time out for it, 5 secs by default.
+
+ iostat_enable		      This controls to enable/disable iostat in F2FS.
+
+ readdir_ra		      This enables/disabled readahead of inode blocks
+			      in readdir, and default is enabled.
+
+ gc_pin_file_thresh	      This indicates how many GC can be failed for the
+			      pinned file. If it exceeds this, F2FS doesn't
+			      guarantee its pinning state. 2048 trials is set
+			      by default.
+
+ extension_list		      This enables to change extension_list for hot/cold
+			      files in runtime.
+
+ inject_rate		      This controls injection rate of arbitrary faults.
+
+ inject_type		      This controls injection type of arbitrary faults.
+
+ dirty_segments 	      This shows # of dirty segments.
+
+ lifetime_write_kbytes	      This shows # of data written to the disk.
+
+ features		      This shows current features enabled on F2FS.
+
+ current_reserved_blocks      This shows # of blocks currently reserved.
+
+ unusable                     If checkpoint=disable, this shows the number of
+                              blocks that are unusable.
+                              If checkpoint=enable it shows the number of blocks
+                              that would be unusable if checkpoint=disable were
+                              to be set.
+
+encoding 	              This shows the encoding used for casefolding.
+                              If casefolding is not enabled, returns (none)
 
 ================================================================================
 USAGE
@@ -708,3 +815,28 @@
 WRITE_LIFE_NONE       "                        WRITE_LIFE_NONE
 WRITE_LIFE_MEDIUM     "                        WRITE_LIFE_MEDIUM
 WRITE_LIFE_LONG       "                        WRITE_LIFE_LONG
+
+Fallocate(2) Policy
+-------------------
+
+The default policy follows the below posix rule.
+
+Allocating disk space
+    The default operation (i.e., mode is zero) of fallocate() allocates
+    the disk space within the range specified by offset and len.  The
+    file size (as reported by stat(2)) will be changed if offset+len is
+    greater than the file size.  Any subregion within the range specified
+    by offset and len that did not contain data before the call will be
+    initialized to zero.  This default behavior closely resembles the
+    behavior of the posix_fallocate(3) library function, and is intended
+    as a method of optimally implementing that function.
+
+However, once F2FS receives ioctl(fd, F2FS_IOC_SET_PIN_FILE) in prior to
+fallocate(fd, DEFAULT_MODE), it allocates on-disk blocks addressess having
+zero or random data, which is useful to the below scenario where:
+ 1. create(fd)
+ 2. ioctl(fd, F2FS_IOC_SET_PIN_FILE)
+ 3. fallocate(fd, 0, 0, size)
+ 4. address = fibmap(fd, offset)
+ 5. open(blkdev)
+ 6. write(blkdev, address)
diff --git a/Documentation/filesystems/fscrypt.rst b/Documentation/filesystems/fscrypt.rst
index cfbc18f..471a511 100644
--- a/Documentation/filesystems/fscrypt.rst
+++ b/Documentation/filesystems/fscrypt.rst
@@ -72,6 +72,9 @@
 fscrypt (and storage encryption in general) can only provide limited
 protection, if any at all, against online attacks.  In detail:
 
+Side-channel attacks
+~~~~~~~~~~~~~~~~~~~~
+
 fscrypt is only resistant to side-channel attacks, such as timing or
 electromagnetic attacks, to the extent that the underlying Linux
 Cryptographic API algorithms are.  If a vulnerable algorithm is used,
@@ -80,29 +83,90 @@
 Side channel attacks may also be mounted against applications
 consuming decrypted data.
 
-After an encryption key has been provided, fscrypt is not designed to
-hide the plaintext file contents or filenames from other users on the
-same system, regardless of the visibility of the keyring key.
-Instead, existing access control mechanisms such as file mode bits,
-POSIX ACLs, LSMs, or mount namespaces should be used for this purpose.
-Also note that as long as the encryption keys are *anywhere* in
-memory, an online attacker can necessarily compromise them by mounting
-a physical attack or by exploiting any kernel security vulnerability
-which provides an arbitrary memory read primitive.
+Unauthorized file access
+~~~~~~~~~~~~~~~~~~~~~~~~
 
-While it is ostensibly possible to "evict" keys from the system,
-recently accessed encrypted files will remain accessible at least
-until the filesystem is unmounted or the VFS caches are dropped, e.g.
-using ``echo 2 > /proc/sys/vm/drop_caches``.  Even after that, if the
-RAM is compromised before being powered off, it will likely still be
-possible to recover portions of the plaintext file contents, if not
-some of the encryption keys as well.  (Since Linux v4.12, all
-in-kernel keys related to fscrypt are sanitized before being freed.
-However, userspace would need to do its part as well.)
+After an encryption key has been added, fscrypt does not hide the
+plaintext file contents or filenames from other users on the same
+system.  Instead, existing access control mechanisms such as file mode
+bits, POSIX ACLs, LSMs, or namespaces should be used for this purpose.
 
-Currently, fscrypt does not prevent a user from maliciously providing
-an incorrect key for another user's existing encrypted files.  A
-protection against this is planned.
+(For the reasoning behind this, understand that while the key is
+added, the confidentiality of the data, from the perspective of the
+system itself, is *not* protected by the mathematical properties of
+encryption but rather only by the correctness of the kernel.
+Therefore, any encryption-specific access control checks would merely
+be enforced by kernel *code* and therefore would be largely redundant
+with the wide variety of access control mechanisms already available.)
+
+Kernel memory compromise
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+An attacker who compromises the system enough to read from arbitrary
+memory, e.g. by mounting a physical attack or by exploiting a kernel
+security vulnerability, can compromise all encryption keys that are
+currently in use.
+
+However, fscrypt allows encryption keys to be removed from the kernel,
+which may protect them from later compromise.
+
+In more detail, the FS_IOC_REMOVE_ENCRYPTION_KEY ioctl (or the
+FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS ioctl) can wipe a master
+encryption key from kernel memory.  If it does so, it will also try to
+evict all cached inodes which had been "unlocked" using the key,
+thereby wiping their per-file keys and making them once again appear
+"locked", i.e. in ciphertext or encrypted form.
+
+However, these ioctls have some limitations:
+
+- Per-file keys for in-use files will *not* be removed or wiped.
+  Therefore, for maximum effect, userspace should close the relevant
+  encrypted files and directories before removing a master key, as
+  well as kill any processes whose working directory is in an affected
+  encrypted directory.
+
+- The kernel cannot magically wipe copies of the master key(s) that
+  userspace might have as well.  Therefore, userspace must wipe all
+  copies of the master key(s) it makes as well; normally this should
+  be done immediately after FS_IOC_ADD_ENCRYPTION_KEY, without waiting
+  for FS_IOC_REMOVE_ENCRYPTION_KEY.  Naturally, the same also applies
+  to all higher levels in the key hierarchy.  Userspace should also
+  follow other security precautions such as mlock()ing memory
+  containing keys to prevent it from being swapped out.
+
+- In general, decrypted contents and filenames in the kernel VFS
+  caches are freed but not wiped.  Therefore, portions thereof may be
+  recoverable from freed memory, even after the corresponding key(s)
+  were wiped.  To partially solve this, you can set
+  CONFIG_PAGE_POISONING=y in your kernel config and add page_poison=1
+  to your kernel command line.  However, this has a performance cost.
+
+- Secret keys might still exist in CPU registers, in crypto
+  accelerator hardware (if used by the crypto API to implement any of
+  the algorithms), or in other places not explicitly considered here.
+
+Limitations of v1 policies
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+v1 encryption policies have some weaknesses with respect to online
+attacks:
+
+- There is no verification that the provided master key is correct.
+  Therefore, a malicious user can temporarily associate the wrong key
+  with another user's encrypted files to which they have read-only
+  access.  Because of filesystem caching, the wrong key will then be
+  used by the other user's accesses to those files, even if the other
+  user has the correct key in their own keyring.  This violates the
+  meaning of "read-only access".
+
+- A compromise of a per-file key also compromises the master key from
+  which it was derived.
+
+- Non-root users cannot securely remove encryption keys.
+
+All the above problems are fixed with v2 encryption policies.  For
+this reason among others, it is recommended to use v2 encryption
+policies on all new encrypted directories.
 
 Key hierarchy
 =============
@@ -123,63 +187,120 @@
 of which protects any number of directory trees on any number of
 filesystems.
 
-Userspace should generate master keys either using a cryptographically
-secure random number generator, or by using a KDF (Key Derivation
-Function).  Note that whenever a KDF is used to "stretch" a
-lower-entropy secret such as a passphrase, it is critical that a KDF
-designed for this purpose be used, such as scrypt, PBKDF2, or Argon2.
+Master keys must be real cryptographic keys, i.e. indistinguishable
+from random bytestrings of the same length.  This implies that users
+**must not** directly use a password as a master key, zero-pad a
+shorter key, or repeat a shorter key.  Security cannot be guaranteed
+if userspace makes any such error, as the cryptographic proofs and
+analysis would no longer apply.
+
+Instead, users should generate master keys either using a
+cryptographically secure random number generator, or by using a KDF
+(Key Derivation Function).  The kernel does not do any key stretching;
+therefore, if userspace derives the key from a low-entropy secret such
+as a passphrase, it is critical that a KDF designed for this purpose
+be used, such as scrypt, PBKDF2, or Argon2.
+
+Key derivation function
+-----------------------
+
+With one exception, fscrypt never uses the master key(s) for
+encryption directly.  Instead, they are only used as input to a KDF
+(Key Derivation Function) to derive the actual keys.
+
+The KDF used for a particular master key differs depending on whether
+the key is used for v1 encryption policies or for v2 encryption
+policies.  Users **must not** use the same key for both v1 and v2
+encryption policies.  (No real-world attack is currently known on this
+specific case of key reuse, but its security cannot be guaranteed
+since the cryptographic proofs and analysis would no longer apply.)
+
+For v1 encryption policies, the KDF only supports deriving per-file
+encryption keys.  It works by encrypting the master key with
+AES-128-ECB, using the file's 16-byte nonce as the AES key.  The
+resulting ciphertext is used as the derived key.  If the ciphertext is
+longer than needed, then it is truncated to the needed length.
+
+For v2 encryption policies, the KDF is HKDF-SHA512.  The master key is
+passed as the "input keying material", no salt is used, and a distinct
+"application-specific information string" is used for each distinct
+key to be derived.  For example, when a per-file encryption key is
+derived, the application-specific information string is the file's
+nonce prefixed with "fscrypt\\0" and a context byte.  Different
+context bytes are used for other types of derived keys.
+
+HKDF-SHA512 is preferred to the original AES-128-ECB based KDF because
+HKDF is more flexible, is nonreversible, and evenly distributes
+entropy from the master key.  HKDF is also standardized and widely
+used by other software, whereas the AES-128-ECB based KDF is ad-hoc.
 
 Per-file keys
 -------------
 
-Master keys are not used to encrypt file contents or names directly.
-Instead, a unique key is derived for each encrypted file, including
-each regular file, directory, and symbolic link.  This has several
-advantages:
+Since each master key can protect many files, it is necessary to
+"tweak" the encryption of each file so that the same plaintext in two
+files doesn't map to the same ciphertext, or vice versa.  In most
+cases, fscrypt does this by deriving per-file keys.  When a new
+encrypted inode (regular file, directory, or symlink) is created,
+fscrypt randomly generates a 16-byte nonce and stores it in the
+inode's encryption xattr.  Then, it uses a KDF (as described in `Key
+derivation function`_) to derive the file's key from the master key
+and nonce.
 
-- In cryptosystems, the same key material should never be used for
-  different purposes.  Using the master key as both an XTS key for
-  contents encryption and as a CTS-CBC key for filenames encryption
-  would violate this rule.
-- Per-file keys simplify the choice of IVs (Initialization Vectors)
-  for contents encryption.  Without per-file keys, to ensure IV
-  uniqueness both the inode and logical block number would need to be
-  encoded in the IVs.  This would make it impossible to renumber
-  inodes, which e.g. ``resize2fs`` can do when resizing an ext4
-  filesystem.  With per-file keys, it is sufficient to encode just the
-  logical block number in the IVs.
-- Per-file keys strengthen the encryption of filenames, where IVs are
-  reused out of necessity.  With a unique key per directory, IV reuse
-  is limited to within a single directory.
-- Per-file keys allow individual files to be securely erased simply by
-  securely erasing their keys.  (Not yet implemented.)
+Key derivation was chosen over key wrapping because wrapped keys would
+require larger xattrs which would be less likely to fit in-line in the
+filesystem's inode table, and there didn't appear to be any
+significant advantages to key wrapping.  In particular, currently
+there is no requirement to support unlocking a file with multiple
+alternative master keys or to support rotating master keys.  Instead,
+the master keys may be wrapped in userspace, e.g. as is done by the
+`fscrypt <https://github.com/google/fscrypt>`_ tool.
 
-A KDF (Key Derivation Function) is used to derive per-file keys from
-the master key.  This is done instead of wrapping a randomly-generated
-key for each file because it reduces the size of the encryption xattr,
-which for some filesystems makes the xattr more likely to fit in-line
-in the filesystem's inode table.  With a KDF, only a 16-byte nonce is
-required --- long enough to make key reuse extremely unlikely.  A
-wrapped key, on the other hand, would need to be up to 64 bytes ---
-the length of an AES-256-XTS key.  Furthermore, currently there is no
-requirement to support unlocking a file with multiple alternative
-master keys or to support rotating master keys.  Instead, the master
-keys may be wrapped in userspace, e.g. as done by the `fscrypt
-<https://github.com/google/fscrypt>`_ tool.
+DIRECT_KEY policies
+-------------------
 
-The current KDF encrypts the master key using the 16-byte nonce as an
-AES-128-ECB key.  The output is used as the derived key.  If the
-output is longer than needed, then it is truncated to the needed
-length.  Truncation is the norm for directories and symlinks, since
-those use the CTS-CBC encryption mode which requires a key half as
-long as that required by the XTS encryption mode.
+The Adiantum encryption mode (see `Encryption modes and usage`_) is
+suitable for both contents and filenames encryption, and it accepts
+long IVs --- long enough to hold both an 8-byte logical block number
+and a 16-byte per-file nonce.  Also, the overhead of each Adiantum key
+is greater than that of an AES-256-XTS key.
 
-Note: this KDF meets the primary security requirement, which is to
-produce unique derived keys that preserve the entropy of the master
-key, assuming that the master key is already a good pseudorandom key.
-However, it is nonstandard and has some problems such as being
-reversible, so it is generally considered to be a mistake!  It may be
-replaced with HKDF or another more standard KDF in the future.
+Therefore, to improve performance and save memory, for Adiantum a
+"direct key" configuration is supported.  When the user has enabled
+this by setting FSCRYPT_POLICY_FLAG_DIRECT_KEY in the fscrypt policy,
+per-file keys are not used.  Instead, whenever any data (contents or
+filenames) is encrypted, the file's 16-byte nonce is included in the
+IV.  Moreover:
+
+- For v1 encryption policies, the encryption is done directly with the
+  master key.  Because of this, users **must not** use the same master
+  key for any other purpose, even for other v1 policies.
+
+- For v2 encryption policies, the encryption is done with a per-mode
+  key derived using the KDF.  Users may use the same master key for
+  other v2 encryption policies.
+
+IV_INO_LBLK_64 policies
+-----------------------
+
+When FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 is set in the fscrypt policy,
+the encryption keys are derived from the master key, encryption mode
+number, and filesystem UUID.  This normally results in all files
+protected by the same master key sharing a single contents encryption
+key and a single filenames encryption key.  To still encrypt different
+files' data differently, inode numbers are included in the IVs.
+Consequently, shrinking the filesystem may not be allowed.
+
+This format is optimized for use with inline encryption hardware
+compliant with the UFS or eMMC standards, which support only 64 IV
+bits per I/O request and may have only a small number of keyslots.
+
+Key identifiers
+---------------
+
+For master keys used for v2 encryption policies, a unique 16-byte "key
+identifier" is also derived using the KDF.  This value is stored in
+the clear, since it is needed to reliably identify the key itself.
 
 Encryption modes and usage
 ==========================
@@ -191,54 +312,90 @@
 
 - AES-256-XTS for contents and AES-256-CTS-CBC for filenames
 - AES-128-CBC for contents and AES-128-CTS-CBC for filenames
+- Adiantum for both contents and filenames
 
-It is strongly recommended to use AES-256-XTS for contents encryption.
+If unsure, you should use the (AES-256-XTS, AES-256-CTS-CBC) pair.
+
 AES-128-CBC was added only for low-powered embedded devices with
-crypto accelerators such as CAAM or CESA that do not support XTS.
+crypto accelerators such as CAAM or CESA that do not support XTS.  To
+use AES-128-CBC, CONFIG_CRYPTO_ESSIV and CONFIG_CRYPTO_SHA256 (or
+another SHA-256 implementation) must be enabled so that ESSIV can be
+used.
+
+Adiantum is a (primarily) stream cipher-based mode that is fast even
+on CPUs without dedicated crypto instructions.  It's also a true
+wide-block mode, unlike XTS.  It can also eliminate the need to derive
+per-file keys.  However, it depends on the security of two primitives,
+XChaCha12 and AES-256, rather than just one.  See the paper
+"Adiantum: length-preserving encryption for entry-level processors"
+(https://eprint.iacr.org/2018/720.pdf) for more details.  To use
+Adiantum, CONFIG_CRYPTO_ADIANTUM must be enabled.  Also, fast
+implementations of ChaCha and NHPoly1305 should be enabled, e.g.
+CONFIG_CRYPTO_CHACHA20_NEON and CONFIG_CRYPTO_NHPOLY1305_NEON for ARM.
 
 New encryption modes can be added relatively easily, without changes
 to individual filesystems.  However, authenticated encryption (AE)
 modes are not currently supported because of the difficulty of dealing
 with ciphertext expansion.
 
+Contents encryption
+-------------------
+
 For file contents, each filesystem block is encrypted independently.
 Currently, only the case where the filesystem block size is equal to
-the system's page size (usually 4096 bytes) is supported.  With the
-XTS mode of operation (recommended), the logical block number within
-the file is used as the IV.  With the CBC mode of operation (not
-recommended), ESSIV is used; specifically, the IV for CBC is the
-logical block number encrypted with AES-256, where the AES-256 key is
-the SHA-256 hash of the inode's data encryption key.
+the system's page size (usually 4096 bytes) is supported.
 
-For filenames, the full filename is encrypted at once.  Because of the
-requirements to retain support for efficient directory lookups and
-filenames of up to 255 bytes, a constant initialization vector (IV) is
-used.  However, each encrypted directory uses a unique key, which
-limits IV reuse to within a single directory.  Note that IV reuse in
-the context of CTS-CBC encryption means that when the original
-filenames share a common prefix at least as long as the cipher block
-size (16 bytes for AES), the corresponding encrypted filenames will
-also share a common prefix.  This is undesirable; it may be fixed in
-the future by switching to an encryption mode that is a strong
-pseudorandom permutation on arbitrary-length messages, e.g. the HEH
-(Hash-Encrypt-Hash) mode.
+Each block's IV is set to the logical block number within the file as
+a little endian number, except that:
 
-Since filenames are encrypted with the CTS-CBC mode of operation, the
-plaintext and ciphertext filenames need not be multiples of the AES
-block size, i.e. 16 bytes.  However, the minimum size that can be
-encrypted is 16 bytes, so shorter filenames are NUL-padded to 16 bytes
-before being encrypted.  In addition, to reduce leakage of filename
-lengths via their ciphertexts, all filenames are NUL-padded to the
-next 4, 8, 16, or 32-byte boundary (configurable).  32 is recommended
-since this provides the best confidentiality, at the cost of making
-directory entries consume slightly more space.  Note that since NUL
-(``\0``) is not otherwise a valid character in filenames, the padding
-will never produce duplicate plaintexts.
+- With CBC mode encryption, ESSIV is also used.  Specifically, each IV
+  is encrypted with AES-256 where the AES-256 key is the SHA-256 hash
+  of the file's data encryption key.
+
+- With `DIRECT_KEY policies`_, the file's nonce is appended to the IV.
+  Currently this is only allowed with the Adiantum encryption mode.
+
+- With `IV_INO_LBLK_64 policies`_, the logical block number is limited
+  to 32 bits and is placed in bits 0-31 of the IV.  The inode number
+  (which is also limited to 32 bits) is placed in bits 32-63.
+
+Note that because file logical block numbers are included in the IVs,
+filesystems must enforce that blocks are never shifted around within
+encrypted files, e.g. via "collapse range" or "insert range".
+
+Filenames encryption
+--------------------
+
+For filenames, each full filename is encrypted at once.  Because of
+the requirements to retain support for efficient directory lookups and
+filenames of up to 255 bytes, the same IV is used for every filename
+in a directory.
+
+However, each encrypted directory still uses a unique key, or
+alternatively has the file's nonce (for `DIRECT_KEY policies`_) or
+inode number (for `IV_INO_LBLK_64 policies`_) included in the IVs.
+Thus, IV reuse is limited to within a single directory.
+
+With CTS-CBC, the IV reuse means that when the plaintext filenames
+share a common prefix at least as long as the cipher block size (16
+bytes for AES), the corresponding encrypted filenames will also share
+a common prefix.  This is undesirable.  Adiantum does not have this
+weakness, as it is a wide-block encryption mode.
+
+All supported filenames encryption modes accept any plaintext length
+>= 16 bytes; cipher block alignment is not required.  However,
+filenames shorter than 16 bytes are NUL-padded to 16 bytes before
+being encrypted.  In addition, to reduce leakage of filename lengths
+via their ciphertexts, all filenames are NUL-padded to the next 4, 8,
+16, or 32-byte boundary (configurable).  32 is recommended since this
+provides the best confidentiality, at the cost of making directory
+entries consume slightly more space.  Note that since NUL (``\0``) is
+not otherwise a valid character in filenames, the padding will never
+produce duplicate plaintexts.
 
 Symbolic link targets are considered a type of filename and are
-encrypted in the same way as filenames in directory entries.  Each
-symlink also uses a unique key; hence, the hardcoded IV is not a
-problem for symlinks.
+encrypted in the same way as filenames in directory entries, except
+that IV reuse is not a problem as each symlink has its own inode.
 
 User API
 ========
@@ -246,45 +403,80 @@
 Setting an encryption policy
 ----------------------------
 
+FS_IOC_SET_ENCRYPTION_POLICY
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
 The FS_IOC_SET_ENCRYPTION_POLICY ioctl sets an encryption policy on an
 empty directory or verifies that a directory or regular file already
 has the specified encryption policy.  It takes in a pointer to a
-:c:type:`struct fscrypt_policy`, defined as follows::
+:c:type:`struct fscrypt_policy_v1` or a :c:type:`struct
+fscrypt_policy_v2`, defined as follows::
 
-    #define FS_KEY_DESCRIPTOR_SIZE  8
-
-    struct fscrypt_policy {
+    #define FSCRYPT_POLICY_V1               0
+    #define FSCRYPT_KEY_DESCRIPTOR_SIZE     8
+    struct fscrypt_policy_v1 {
             __u8 version;
             __u8 contents_encryption_mode;
             __u8 filenames_encryption_mode;
             __u8 flags;
-            __u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
+            __u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
+    };
+    #define fscrypt_policy  fscrypt_policy_v1
+
+    #define FSCRYPT_POLICY_V2               2
+    #define FSCRYPT_KEY_IDENTIFIER_SIZE     16
+    struct fscrypt_policy_v2 {
+            __u8 version;
+            __u8 contents_encryption_mode;
+            __u8 filenames_encryption_mode;
+            __u8 flags;
+            __u8 __reserved[4];
+            __u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
     };
 
 This structure must be initialized as follows:
 
-- ``version`` must be 0.
+- ``version`` must be FSCRYPT_POLICY_V1 (0) if the struct is
+  :c:type:`fscrypt_policy_v1` or FSCRYPT_POLICY_V2 (2) if the struct
+  is :c:type:`fscrypt_policy_v2`.  (Note: we refer to the original
+  policy version as "v1", though its version code is really 0.)  For
+  new encrypted directories, use v2 policies.
 
 - ``contents_encryption_mode`` and ``filenames_encryption_mode`` must
-  be set to constants from ``<linux/fs.h>`` which identify the
-  encryption modes to use.  If unsure, use
-  FS_ENCRYPTION_MODE_AES_256_XTS (1) for ``contents_encryption_mode``
-  and FS_ENCRYPTION_MODE_AES_256_CTS (4) for
-  ``filenames_encryption_mode``.
+  be set to constants from ``<linux/fscrypt.h>`` which identify the
+  encryption modes to use.  If unsure, use FSCRYPT_MODE_AES_256_XTS
+  (1) for ``contents_encryption_mode`` and FSCRYPT_MODE_AES_256_CTS
+  (4) for ``filenames_encryption_mode``.
 
-- ``flags`` must be set to a value from ``<linux/fs.h>`` which
-  identifies the amount of NUL-padding to use when encrypting
-  filenames.  If unsure, use FS_POLICY_FLAGS_PAD_32 (0x3).
+- ``flags`` contains optional flags from ``<linux/fscrypt.h>``:
 
-- ``master_key_descriptor`` specifies how to find the master key in
-  the keyring; see `Adding keys`_.  It is up to userspace to choose a
-  unique ``master_key_descriptor`` for each master key.  The e4crypt
-  and fscrypt tools use the first 8 bytes of
+  - FSCRYPT_POLICY_FLAGS_PAD_*: The amount of NUL padding to use when
+    encrypting filenames.  If unsure, use FSCRYPT_POLICY_FLAGS_PAD_32
+    (0x3).
+  - FSCRYPT_POLICY_FLAG_DIRECT_KEY: See `DIRECT_KEY policies`_.
+  - FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64: See `IV_INO_LBLK_64
+    policies`_.  This is mutually exclusive with DIRECT_KEY and is not
+    supported on v1 policies.
+
+- For v2 encryption policies, ``__reserved`` must be zeroed.
+
+- For v1 encryption policies, ``master_key_descriptor`` specifies how
+  to find the master key in a keyring; see `Adding keys`_.  It is up
+  to userspace to choose a unique ``master_key_descriptor`` for each
+  master key.  The e4crypt and fscrypt tools use the first 8 bytes of
   ``SHA-512(SHA-512(master_key))``, but this particular scheme is not
   required.  Also, the master key need not be in the keyring yet when
   FS_IOC_SET_ENCRYPTION_POLICY is executed.  However, it must be added
   before any files can be created in the encrypted directory.
 
+  For v2 encryption policies, ``master_key_descriptor`` has been
+  replaced with ``master_key_identifier``, which is longer and cannot
+  be arbitrarily chosen.  Instead, the key must first be added using
+  `FS_IOC_ADD_ENCRYPTION_KEY`_.  Then, the ``key_spec.u.identifier``
+  the kernel returned in the :c:type:`struct fscrypt_add_key_arg` must
+  be used as the ``master_key_identifier`` in the :c:type:`struct
+  fscrypt_policy_v2`.
+
 If the file is not yet encrypted, then FS_IOC_SET_ENCRYPTION_POLICY
 verifies that the file is an empty directory.  If so, the specified
 encryption policy is assigned to the directory, turning it into an
@@ -300,6 +492,15 @@
 returns 0.  Otherwise, it fails with EEXIST.  This works on both
 regular files and directories, including nonempty directories.
 
+When a v2 encryption policy is assigned to a directory, it is also
+required that either the specified key has been added by the current
+user or that the caller has CAP_FOWNER in the initial user namespace.
+(This is needed to prevent a user from encrypting their data with
+another user's key.)  The key must remain added while
+FS_IOC_SET_ENCRYPTION_POLICY is executing.  However, if the new
+encrypted directory does not need to be accessed immediately, then the
+key can be removed right away afterwards.
+
 Note that the ext4 filesystem does not allow the root directory to be
 encrypted, even if it is empty.  Users who want to encrypt an entire
 filesystem with one key should consider using dm-crypt instead.
@@ -312,15 +513,19 @@
 - ``EEXIST``: the file is already encrypted with an encryption policy
   different from the one specified
 - ``EINVAL``: an invalid encryption policy was specified (invalid
-  version, mode(s), or flags)
+  version, mode(s), or flags; or reserved bits were set)
+- ``ENOKEY``: a v2 encryption policy was specified, but the key with
+  the specified ``master_key_identifier`` has not been added, nor does
+  the process have the CAP_FOWNER capability in the initial user
+  namespace
 - ``ENOTDIR``: the file is unencrypted and is a regular file, not a
   directory
 - ``ENOTEMPTY``: the file is unencrypted and is a nonempty directory
 - ``ENOTTY``: this type of filesystem does not implement encryption
 - ``EOPNOTSUPP``: the kernel was not configured with encryption
-  support for this filesystem, or the filesystem superblock has not
+  support for filesystems, or the filesystem superblock has not
   had encryption enabled on it.  (For example, to use encryption on an
-  ext4 filesystem, CONFIG_EXT4_ENCRYPTION must be enabled in the
+  ext4 filesystem, CONFIG_FS_ENCRYPTION must be enabled in the
   kernel config, and the superblock must have had the "encrypt"
   feature flag enabled using ``tune2fs -O encrypt`` or ``mkfs.ext4 -O
   encrypt``.)
@@ -331,25 +536,79 @@
 Getting an encryption policy
 ----------------------------
 
-The FS_IOC_GET_ENCRYPTION_POLICY ioctl retrieves the :c:type:`struct
-fscrypt_policy`, if any, for a directory or regular file.  See above
-for the struct definition.  No additional permissions are required
-beyond the ability to open the file.
+Two ioctls are available to get a file's encryption policy:
 
-FS_IOC_GET_ENCRYPTION_POLICY can fail with the following errors:
+- `FS_IOC_GET_ENCRYPTION_POLICY_EX`_
+- `FS_IOC_GET_ENCRYPTION_POLICY`_
+
+The extended (_EX) version of the ioctl is more general and is
+recommended to use when possible.  However, on older kernels only the
+original ioctl is available.  Applications should try the extended
+version, and if it fails with ENOTTY fall back to the original
+version.
+
+FS_IOC_GET_ENCRYPTION_POLICY_EX
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The FS_IOC_GET_ENCRYPTION_POLICY_EX ioctl retrieves the encryption
+policy, if any, for a directory or regular file.  No additional
+permissions are required beyond the ability to open the file.  It
+takes in a pointer to a :c:type:`struct fscrypt_get_policy_ex_arg`,
+defined as follows::
+
+    struct fscrypt_get_policy_ex_arg {
+            __u64 policy_size; /* input/output */
+            union {
+                    __u8 version;
+                    struct fscrypt_policy_v1 v1;
+                    struct fscrypt_policy_v2 v2;
+            } policy; /* output */
+    };
+
+The caller must initialize ``policy_size`` to the size available for
+the policy struct, i.e. ``sizeof(arg.policy)``.
+
+On success, the policy struct is returned in ``policy``, and its
+actual size is returned in ``policy_size``.  ``policy.version`` should
+be checked to determine the version of policy returned.  Note that the
+version code for the "v1" policy is actually 0 (FSCRYPT_POLICY_V1).
+
+FS_IOC_GET_ENCRYPTION_POLICY_EX can fail with the following errors:
 
 - ``EINVAL``: the file is encrypted, but it uses an unrecognized
-  encryption context format
+  encryption policy version
 - ``ENODATA``: the file is not encrypted
-- ``ENOTTY``: this type of filesystem does not implement encryption
+- ``ENOTTY``: this type of filesystem does not implement encryption,
+  or this kernel is too old to support FS_IOC_GET_ENCRYPTION_POLICY_EX
+  (try FS_IOC_GET_ENCRYPTION_POLICY instead)
 - ``EOPNOTSUPP``: the kernel was not configured with encryption
-  support for this filesystem
+  support for this filesystem, or the filesystem superblock has not
+  had encryption enabled on it
+- ``EOVERFLOW``: the file is encrypted and uses a recognized
+  encryption policy version, but the policy struct does not fit into
+  the provided buffer
 
 Note: if you only need to know whether a file is encrypted or not, on
 most filesystems it is also possible to use the FS_IOC_GETFLAGS ioctl
 and check for FS_ENCRYPT_FL, or to use the statx() system call and
 check for STATX_ATTR_ENCRYPTED in stx_attributes.
 
+FS_IOC_GET_ENCRYPTION_POLICY
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The FS_IOC_GET_ENCRYPTION_POLICY ioctl can also retrieve the
+encryption policy, if any, for a directory or regular file.  However,
+unlike `FS_IOC_GET_ENCRYPTION_POLICY_EX`_,
+FS_IOC_GET_ENCRYPTION_POLICY only supports the original policy
+version.  It takes in a pointer directly to a :c:type:`struct
+fscrypt_policy_v1` rather than a :c:type:`struct
+fscrypt_get_policy_ex_arg`.
+
+The error codes for FS_IOC_GET_ENCRYPTION_POLICY are the same as those
+for FS_IOC_GET_ENCRYPTION_POLICY_EX, except that
+FS_IOC_GET_ENCRYPTION_POLICY also returns ``EINVAL`` if the file is
+encrypted using a newer encryption policy version.
+
 Getting the per-filesystem salt
 -------------------------------
 
@@ -365,8 +624,115 @@
 Adding keys
 -----------
 
-To provide a master key, userspace must add it to an appropriate
-keyring using the add_key() system call (see:
+FS_IOC_ADD_ENCRYPTION_KEY
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The FS_IOC_ADD_ENCRYPTION_KEY ioctl adds a master encryption key to
+the filesystem, making all files on the filesystem which were
+encrypted using that key appear "unlocked", i.e. in plaintext form.
+It can be executed on any file or directory on the target filesystem,
+but using the filesystem's root directory is recommended.  It takes in
+a pointer to a :c:type:`struct fscrypt_add_key_arg`, defined as
+follows::
+
+    struct fscrypt_add_key_arg {
+            struct fscrypt_key_specifier key_spec;
+            __u32 raw_size;
+            __u32 __reserved[9];
+            __u8 raw[];
+    };
+
+    #define FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR        1
+    #define FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER        2
+
+    struct fscrypt_key_specifier {
+            __u32 type;     /* one of FSCRYPT_KEY_SPEC_TYPE_* */
+            __u32 __reserved;
+            union {
+                    __u8 __reserved[32]; /* reserve some extra space */
+                    __u8 descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
+                    __u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
+            } u;
+    };
+
+:c:type:`struct fscrypt_add_key_arg` must be zeroed, then initialized
+as follows:
+
+- If the key is being added for use by v1 encryption policies, then
+  ``key_spec.type`` must contain FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR, and
+  ``key_spec.u.descriptor`` must contain the descriptor of the key
+  being added, corresponding to the value in the
+  ``master_key_descriptor`` field of :c:type:`struct
+  fscrypt_policy_v1`.  To add this type of key, the calling process
+  must have the CAP_SYS_ADMIN capability in the initial user
+  namespace.
+
+  Alternatively, if the key is being added for use by v2 encryption
+  policies, then ``key_spec.type`` must contain
+  FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER, and ``key_spec.u.identifier`` is
+  an *output* field which the kernel fills in with a cryptographic
+  hash of the key.  To add this type of key, the calling process does
+  not need any privileges.  However, the number of keys that can be
+  added is limited by the user's quota for the keyrings service (see
+  ``Documentation/security/keys/core.rst``).
+
+- ``raw_size`` must be the size of the ``raw`` key provided, in bytes.
+
+- ``raw`` is a variable-length field which must contain the actual
+  key, ``raw_size`` bytes long.
+
+For v2 policy keys, the kernel keeps track of which user (identified
+by effective user ID) added the key, and only allows the key to be
+removed by that user --- or by "root", if they use
+`FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS`_.
+
+However, if another user has added the key, it may be desirable to
+prevent that other user from unexpectedly removing it.  Therefore,
+FS_IOC_ADD_ENCRYPTION_KEY may also be used to add a v2 policy key
+*again*, even if it's already added by other user(s).  In this case,
+FS_IOC_ADD_ENCRYPTION_KEY will just install a claim to the key for the
+current user, rather than actually add the key again (but the raw key
+must still be provided, as a proof of knowledge).
+
+FS_IOC_ADD_ENCRYPTION_KEY returns 0 if either the key or a claim to
+the key was either added or already exists.
+
+FS_IOC_ADD_ENCRYPTION_KEY can fail with the following errors:
+
+- ``EACCES``: FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR was specified, but the
+  caller does not have the CAP_SYS_ADMIN capability in the initial
+  user namespace
+- ``EDQUOT``: the key quota for this user would be exceeded by adding
+  the key
+- ``EINVAL``: invalid key size or key specifier type, or reserved bits
+  were set
+- ``ENOTTY``: this type of filesystem does not implement encryption
+- ``EOPNOTSUPP``: the kernel was not configured with encryption
+  support for this filesystem, or the filesystem superblock has not
+  had encryption enabled on it
+
+Legacy method
+~~~~~~~~~~~~~
+
+For v1 encryption policies, a master encryption key can also be
+provided by adding it to a process-subscribed keyring, e.g. to a
+session keyring, or to a user keyring if the user keyring is linked
+into the session keyring.
+
+This method is deprecated (and not supported for v2 encryption
+policies) for several reasons.  First, it cannot be used in
+combination with FS_IOC_REMOVE_ENCRYPTION_KEY (see `Removing keys`_),
+so for removing a key a workaround such as keyctl_unlink() in
+combination with ``sync; echo 2 > /proc/sys/vm/drop_caches`` would
+have to be used.  Second, it doesn't match the fact that the
+locked/unlocked status of encrypted files (i.e. whether they appear to
+be in plaintext form or in ciphertext form) is global.  This mismatch
+has caused much confusion as well as real problems when processes
+running under different UIDs, such as a ``sudo`` command, need to
+access encrypted files.
+
+Nevertheless, to add a key to one of the process-subscribed keyrings,
+the add_key() system call can be used (see:
 ``Documentation/security/keys/core.rst``).  The key type must be
 "logon"; keys of this type are kept in kernel memory and cannot be
 read back by userspace.  The key description must be "fscrypt:"
@@ -374,12 +740,12 @@
 ``master_key_descriptor`` that was set in the encryption policy.  The
 key payload must conform to the following structure::
 
-    #define FS_MAX_KEY_SIZE 64
+    #define FSCRYPT_MAX_KEY_SIZE            64
 
     struct fscrypt_key {
-            u32 mode;
-            u8 raw[FS_MAX_KEY_SIZE];
-            u32 size;
+            __u32 mode;
+            __u8 raw[FSCRYPT_MAX_KEY_SIZE];
+            __u32 size;
     };
 
 ``mode`` is ignored; just set it to 0.  The actual key is provided in
@@ -391,26 +757,194 @@
 filesystem-specific prefixes are deprecated and should not be used in
 new programs.
 
-There are several different types of keyrings in which encryption keys
-may be placed, such as a session keyring, a user session keyring, or a
-user keyring.  Each key must be placed in a keyring that is "attached"
-to all processes that might need to access files encrypted with it, in
-the sense that request_key() will find the key.  Generally, if only
-processes belonging to a specific user need to access a given
-encrypted directory and no session keyring has been installed, then
-that directory's key should be placed in that user's user session
-keyring or user keyring.  Otherwise, a session keyring should be
-installed if needed, and the key should be linked into that session
-keyring, or in a keyring linked into that session keyring.
+Removing keys
+-------------
 
-Note: introducing the complex visibility semantics of keyrings here
-was arguably a mistake --- especially given that by design, after any
-process successfully opens an encrypted file (thereby setting up the
-per-file key), possessing the keyring key is not actually required for
-any process to read/write the file until its in-memory inode is
-evicted.  In the future there probably should be a way to provide keys
-directly to the filesystem instead, which would make the intended
-semantics clearer.
+Two ioctls are available for removing a key that was added by
+`FS_IOC_ADD_ENCRYPTION_KEY`_:
+
+- `FS_IOC_REMOVE_ENCRYPTION_KEY`_
+- `FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS`_
+
+These two ioctls differ only in cases where v2 policy keys are added
+or removed by non-root users.
+
+These ioctls don't work on keys that were added via the legacy
+process-subscribed keyrings mechanism.
+
+Before using these ioctls, read the `Kernel memory compromise`_
+section for a discussion of the security goals and limitations of
+these ioctls.
+
+FS_IOC_REMOVE_ENCRYPTION_KEY
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The FS_IOC_REMOVE_ENCRYPTION_KEY ioctl removes a claim to a master
+encryption key from the filesystem, and possibly removes the key
+itself.  It can be executed on any file or directory on the target
+filesystem, but using the filesystem's root directory is recommended.
+It takes in a pointer to a :c:type:`struct fscrypt_remove_key_arg`,
+defined as follows::
+
+    struct fscrypt_remove_key_arg {
+            struct fscrypt_key_specifier key_spec;
+    #define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY      0x00000001
+    #define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS     0x00000002
+            __u32 removal_status_flags;     /* output */
+            __u32 __reserved[5];
+    };
+
+This structure must be zeroed, then initialized as follows:
+
+- The key to remove is specified by ``key_spec``:
+
+    - To remove a key used by v1 encryption policies, set
+      ``key_spec.type`` to FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR and fill
+      in ``key_spec.u.descriptor``.  To remove this type of key, the
+      calling process must have the CAP_SYS_ADMIN capability in the
+      initial user namespace.
+
+    - To remove a key used by v2 encryption policies, set
+      ``key_spec.type`` to FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER and fill
+      in ``key_spec.u.identifier``.
+
+For v2 policy keys, this ioctl is usable by non-root users.  However,
+to make this possible, it actually just removes the current user's
+claim to the key, undoing a single call to FS_IOC_ADD_ENCRYPTION_KEY.
+Only after all claims are removed is the key really removed.
+
+For example, if FS_IOC_ADD_ENCRYPTION_KEY was called with uid 1000,
+then the key will be "claimed" by uid 1000, and
+FS_IOC_REMOVE_ENCRYPTION_KEY will only succeed as uid 1000.  Or, if
+both uids 1000 and 2000 added the key, then for each uid
+FS_IOC_REMOVE_ENCRYPTION_KEY will only remove their own claim.  Only
+once *both* are removed is the key really removed.  (Think of it like
+unlinking a file that may have hard links.)
+
+If FS_IOC_REMOVE_ENCRYPTION_KEY really removes the key, it will also
+try to "lock" all files that had been unlocked with the key.  It won't
+lock files that are still in-use, so this ioctl is expected to be used
+in cooperation with userspace ensuring that none of the files are
+still open.  However, if necessary, this ioctl can be executed again
+later to retry locking any remaining files.
+
+FS_IOC_REMOVE_ENCRYPTION_KEY returns 0 if either the key was removed
+(but may still have files remaining to be locked), the user's claim to
+the key was removed, or the key was already removed but had files
+remaining to be the locked so the ioctl retried locking them.  In any
+of these cases, ``removal_status_flags`` is filled in with the
+following informational status flags:
+
+- ``FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY``: set if some file(s)
+  are still in-use.  Not guaranteed to be set in the case where only
+  the user's claim to the key was removed.
+- ``FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS``: set if only the
+  user's claim to the key was removed, not the key itself
+
+FS_IOC_REMOVE_ENCRYPTION_KEY can fail with the following errors:
+
+- ``EACCES``: The FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR key specifier type
+  was specified, but the caller does not have the CAP_SYS_ADMIN
+  capability in the initial user namespace
+- ``EINVAL``: invalid key specifier type, or reserved bits were set
+- ``ENOKEY``: the key object was not found at all, i.e. it was never
+  added in the first place or was already fully removed including all
+  files locked; or, the user does not have a claim to the key (but
+  someone else does).
+- ``ENOTTY``: this type of filesystem does not implement encryption
+- ``EOPNOTSUPP``: the kernel was not configured with encryption
+  support for this filesystem, or the filesystem superblock has not
+  had encryption enabled on it
+
+FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS is exactly the same as
+`FS_IOC_REMOVE_ENCRYPTION_KEY`_, except that for v2 policy keys, the
+ALL_USERS version of the ioctl will remove all users' claims to the
+key, not just the current user's.  I.e., the key itself will always be
+removed, no matter how many users have added it.  This difference is
+only meaningful if non-root users are adding and removing keys.
+
+Because of this, FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS also requires
+"root", namely the CAP_SYS_ADMIN capability in the initial user
+namespace.  Otherwise it will fail with EACCES.
+
+Getting key status
+------------------
+
+FS_IOC_GET_ENCRYPTION_KEY_STATUS
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The FS_IOC_GET_ENCRYPTION_KEY_STATUS ioctl retrieves the status of a
+master encryption key.  It can be executed on any file or directory on
+the target filesystem, but using the filesystem's root directory is
+recommended.  It takes in a pointer to a :c:type:`struct
+fscrypt_get_key_status_arg`, defined as follows::
+
+    struct fscrypt_get_key_status_arg {
+            /* input */
+            struct fscrypt_key_specifier key_spec;
+            __u32 __reserved[6];
+
+            /* output */
+    #define FSCRYPT_KEY_STATUS_ABSENT               1
+    #define FSCRYPT_KEY_STATUS_PRESENT              2
+    #define FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED 3
+            __u32 status;
+    #define FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF   0x00000001
+            __u32 status_flags;
+            __u32 user_count;
+            __u32 __out_reserved[13];
+    };
+
+The caller must zero all input fields, then fill in ``key_spec``:
+
+    - To get the status of a key for v1 encryption policies, set
+      ``key_spec.type`` to FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR and fill
+      in ``key_spec.u.descriptor``.
+
+    - To get the status of a key for v2 encryption policies, set
+      ``key_spec.type`` to FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER and fill
+      in ``key_spec.u.identifier``.
+
+On success, 0 is returned and the kernel fills in the output fields:
+
+- ``status`` indicates whether the key is absent, present, or
+  incompletely removed.  Incompletely removed means that the master
+  secret has been removed, but some files are still in use; i.e.,
+  `FS_IOC_REMOVE_ENCRYPTION_KEY`_ returned 0 but set the informational
+  status flag FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY.
+
+- ``status_flags`` can contain the following flags:
+
+    - ``FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF`` indicates that the key
+      has added by the current user.  This is only set for keys
+      identified by ``identifier`` rather than by ``descriptor``.
+
+- ``user_count`` specifies the number of users who have added the key.
+  This is only set for keys identified by ``identifier`` rather than
+  by ``descriptor``.
+
+FS_IOC_GET_ENCRYPTION_KEY_STATUS can fail with the following errors:
+
+- ``EINVAL``: invalid key specifier type, or reserved bits were set
+- ``ENOTTY``: this type of filesystem does not implement encryption
+- ``EOPNOTSUPP``: the kernel was not configured with encryption
+  support for this filesystem, or the filesystem superblock has not
+  had encryption enabled on it
+
+Among other use cases, FS_IOC_GET_ENCRYPTION_KEY_STATUS can be useful
+for determining whether the key for a given encrypted directory needs
+to be added before prompting the user for the passphrase needed to
+derive the key.
+
+FS_IOC_GET_ENCRYPTION_KEY_STATUS can only get the status of keys in
+the filesystem-level keyring, i.e. the keyring managed by
+`FS_IOC_ADD_ENCRYPTION_KEY`_ and `FS_IOC_REMOVE_ENCRYPTION_KEY`_.  It
+cannot get the status of a key that has only been added for use by v1
+encryption policies using the legacy mechanism involving
+process-subscribed keyrings.
 
 Access semantics
 ================
@@ -426,10 +960,18 @@
 - Unencrypted files, or files encrypted with a different encryption
   policy (i.e. different key, modes, or flags), cannot be renamed or
   linked into an encrypted directory; see `Encryption policy
-  enforcement`_.  Attempts to do so will fail with EPERM.  However,
+  enforcement`_.  Attempts to do so will fail with EXDEV.  However,
   encrypted files can be renamed within an encrypted directory, or
   into an unencrypted directory.
 
+  Note: "moving" an unencrypted file into an encrypted directory, e.g.
+  with the `mv` program, is implemented in userspace by a copy
+  followed by a delete.  Be aware that the original unencrypted data
+  may remain recoverable from free space on the disk; prefer to keep
+  all files encrypted from the very beginning.  The `shred` program
+  may be used to overwrite the source files but isn't guaranteed to be
+  effective on all filesystems and storage devices.
+
 - Direct I/O is not supported on encrypted files.  Attempts to use
   direct I/O on such files will fall back to buffered I/O.
 
@@ -465,7 +1007,7 @@
 
 Some filesystem operations may be performed on encrypted regular
 files, directories, and symlinks even before their encryption key has
-been provided:
+been added, or after their encryption key has been removed:
 
 - File metadata may be read, e.g. using stat().
 
@@ -516,7 +1058,7 @@
 Except for those special files, it is forbidden to have unencrypted
 files, or files encrypted with a different encryption policy, in an
 encrypted directory tree.  Attempts to link or rename such a file into
-an encrypted directory will fail with EPERM.  This is also enforced
+an encrypted directory will fail with EXDEV.  This is also enforced
 during ->lookup() to provide limited protection against offline
 attacks that try to disable or downgrade encryption in known locations
 where applications may later write sensitive data.  It is recommended
@@ -530,33 +1072,44 @@
 ------------------
 
 An encryption policy is represented on-disk by a :c:type:`struct
-fscrypt_context`.  It is up to individual filesystems to decide where
-to store it, but normally it would be stored in a hidden extended
-attribute.  It should *not* be exposed by the xattr-related system
-calls such as getxattr() and setxattr() because of the special
-semantics of the encryption xattr.  (In particular, there would be
-much confusion if an encryption policy were to be added to or removed
-from anything other than an empty directory.)  The struct is defined
-as follows::
+fscrypt_context_v1` or a :c:type:`struct fscrypt_context_v2`.  It is
+up to individual filesystems to decide where to store it, but normally
+it would be stored in a hidden extended attribute.  It should *not* be
+exposed by the xattr-related system calls such as getxattr() and
+setxattr() because of the special semantics of the encryption xattr.
+(In particular, there would be much confusion if an encryption policy
+were to be added to or removed from anything other than an empty
+directory.)  These structs are defined as follows::
 
-    #define FS_KEY_DESCRIPTOR_SIZE  8
     #define FS_KEY_DERIVATION_NONCE_SIZE 16
 
-    struct fscrypt_context {
-            u8 format;
+    #define FSCRYPT_KEY_DESCRIPTOR_SIZE  8
+    struct fscrypt_context_v1 {
+            u8 version;
             u8 contents_encryption_mode;
             u8 filenames_encryption_mode;
             u8 flags;
-            u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
+            u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
             u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
     };
 
-Note that :c:type:`struct fscrypt_context` contains the same
-information as :c:type:`struct fscrypt_policy` (see `Setting an
-encryption policy`_), except that :c:type:`struct fscrypt_context`
-also contains a nonce.  The nonce is randomly generated by the kernel
-and is used to derive the inode's encryption key as described in
-`Per-file keys`_.
+    #define FSCRYPT_KEY_IDENTIFIER_SIZE  16
+    struct fscrypt_context_v2 {
+            u8 version;
+            u8 contents_encryption_mode;
+            u8 filenames_encryption_mode;
+            u8 flags;
+            u8 __reserved[4];
+            u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
+            u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
+    };
+
+The context structs contain the same information as the corresponding
+policy structs (see `Setting an encryption policy`_), except that the
+context structs also contain a nonce.  The nonce is randomly generated
+by the kernel and is used as KDF input or as a tweak to cause
+different files to be encrypted differently; see `Per-file keys`_ and
+`DIRECT_KEY policies`_.
 
 Data path changes
 -----------------
@@ -614,3 +1167,42 @@
 without the key is subject to change in the future.  It is only meant
 as a way to temporarily present valid filenames so that commands like
 ``rm -r`` work as expected on encrypted directories.
+
+Tests
+=====
+
+To test fscrypt, use xfstests, which is Linux's de facto standard
+filesystem test suite.  First, run all the tests in the "encrypt"
+group on the relevant filesystem(s).  For example, to test ext4 and
+f2fs encryption using `kvm-xfstests
+<https://github.com/tytso/xfstests-bld/blob/master/Documentation/kvm-quickstart.md>`_::
+
+    kvm-xfstests -c ext4,f2fs -g encrypt
+
+UBIFS encryption can also be tested this way, but it should be done in
+a separate command, and it takes some time for kvm-xfstests to set up
+emulated UBI volumes::
+
+    kvm-xfstests -c ubifs -g encrypt
+
+No tests should fail.  However, tests that use non-default encryption
+modes (e.g. generic/549 and generic/550) will be skipped if the needed
+algorithms were not built into the kernel's crypto API.  Also, tests
+that access the raw block device (e.g. generic/399, generic/548,
+generic/549, generic/550) will be skipped on UBIFS.
+
+Besides running the "encrypt" group tests, for ext4 and f2fs it's also
+possible to run most xfstests with the "test_dummy_encryption" mount
+option.  This option causes all new files to be automatically
+encrypted with a dummy key, without having to make any API calls.
+This tests the encrypted I/O paths more thoroughly.  To do this with
+kvm-xfstests, use the "encrypt" filesystem configuration::
+
+    kvm-xfstests -c ext4/encrypt,f2fs/encrypt -g auto
+
+Because this runs many more tests than "-g encrypt" does, it takes
+much longer to run; so also consider using `gce-xfstests
+<https://github.com/tytso/xfstests-bld/blob/master/Documentation/gce-xfstests.md>`_
+instead of kvm-xfstests::
+
+    gce-xfstests -c ext4/encrypt,f2fs/encrypt -g auto
diff --git a/Documentation/filesystems/fsverity.rst b/Documentation/filesystems/fsverity.rst
new file mode 100644
index 0000000..42a0b6d
--- /dev/null
+++ b/Documentation/filesystems/fsverity.rst
@@ -0,0 +1,726 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. _fsverity:
+
+=======================================================
+fs-verity: read-only file-based authenticity protection
+=======================================================
+
+Introduction
+============
+
+fs-verity (``fs/verity/``) is a support layer that filesystems can
+hook into to support transparent integrity and authenticity protection
+of read-only files.  Currently, it is supported by the ext4 and f2fs
+filesystems.  Like fscrypt, not too much filesystem-specific code is
+needed to support fs-verity.
+
+fs-verity is similar to `dm-verity
+<https://www.kernel.org/doc/Documentation/device-mapper/verity.txt>`_
+but works on files rather than block devices.  On regular files on
+filesystems supporting fs-verity, userspace can execute an ioctl that
+causes the filesystem to build a Merkle tree for the file and persist
+it to a filesystem-specific location associated with the file.
+
+After this, the file is made readonly, and all reads from the file are
+automatically verified against the file's Merkle tree.  Reads of any
+corrupted data, including mmap reads, will fail.
+
+Userspace can use another ioctl to retrieve the root hash (actually
+the "file measurement", which is a hash that includes the root hash)
+that fs-verity is enforcing for the file.  This ioctl executes in
+constant time, regardless of the file size.
+
+fs-verity is essentially a way to hash a file in constant time,
+subject to the caveat that reads which would violate the hash will
+fail at runtime.
+
+Use cases
+=========
+
+By itself, the base fs-verity feature only provides integrity
+protection, i.e. detection of accidental (non-malicious) corruption.
+
+However, because fs-verity makes retrieving the file hash extremely
+efficient, it's primarily meant to be used as a tool to support
+authentication (detection of malicious modifications) or auditing
+(logging file hashes before use).
+
+Trusted userspace code (e.g. operating system code running on a
+read-only partition that is itself authenticated by dm-verity) can
+authenticate the contents of an fs-verity file by using the
+`FS_IOC_MEASURE_VERITY`_ ioctl to retrieve its hash, then verifying a
+digital signature of it.
+
+A standard file hash could be used instead of fs-verity.  However,
+this is inefficient if the file is large and only a small portion may
+be accessed.  This is often the case for Android application package
+(APK) files, for example.  These typically contain many translations,
+classes, and other resources that are infrequently or even never
+accessed on a particular device.  It would be slow and wasteful to
+read and hash the entire file before starting the application.
+
+Unlike an ahead-of-time hash, fs-verity also re-verifies data each
+time it's paged in.  This ensures that malicious disk firmware can't
+undetectably change the contents of the file at runtime.
+
+fs-verity does not replace or obsolete dm-verity.  dm-verity should
+still be used on read-only filesystems.  fs-verity is for files that
+must live on a read-write filesystem because they are independently
+updated and potentially user-installed, so dm-verity cannot be used.
+
+The base fs-verity feature is a hashing mechanism only; actually
+authenticating the files is up to userspace.  However, to meet some
+users' needs, fs-verity optionally supports a simple signature
+verification mechanism where users can configure the kernel to require
+that all fs-verity files be signed by a key loaded into a keyring; see
+`Built-in signature verification`_.  Support for fs-verity file hashes
+in IMA (Integrity Measurement Architecture) policies is also planned.
+
+User API
+========
+
+FS_IOC_ENABLE_VERITY
+--------------------
+
+The FS_IOC_ENABLE_VERITY ioctl enables fs-verity on a file.  It takes
+in a pointer to a :c:type:`struct fsverity_enable_arg`, defined as
+follows::
+
+    struct fsverity_enable_arg {
+            __u32 version;
+            __u32 hash_algorithm;
+            __u32 block_size;
+            __u32 salt_size;
+            __u64 salt_ptr;
+            __u32 sig_size;
+            __u32 __reserved1;
+            __u64 sig_ptr;
+            __u64 __reserved2[11];
+    };
+
+This structure contains the parameters of the Merkle tree to build for
+the file, and optionally contains a signature.  It must be initialized
+as follows:
+
+- ``version`` must be 1.
+- ``hash_algorithm`` must be the identifier for the hash algorithm to
+  use for the Merkle tree, such as FS_VERITY_HASH_ALG_SHA256.  See
+  ``include/uapi/linux/fsverity.h`` for the list of possible values.
+- ``block_size`` must be the Merkle tree block size.  Currently, this
+  must be equal to the system page size, which is usually 4096 bytes.
+  Other sizes may be supported in the future.  This value is not
+  necessarily the same as the filesystem block size.
+- ``salt_size`` is the size of the salt in bytes, or 0 if no salt is
+  provided.  The salt is a value that is prepended to every hashed
+  block; it can be used to personalize the hashing for a particular
+  file or device.  Currently the maximum salt size is 32 bytes.
+- ``salt_ptr`` is the pointer to the salt, or NULL if no salt is
+  provided.
+- ``sig_size`` is the size of the signature in bytes, or 0 if no
+  signature is provided.  Currently the signature is (somewhat
+  arbitrarily) limited to 16128 bytes.  See `Built-in signature
+  verification`_ for more information.
+- ``sig_ptr``  is the pointer to the signature, or NULL if no
+  signature is provided.
+- All reserved fields must be zeroed.
+
+FS_IOC_ENABLE_VERITY causes the filesystem to build a Merkle tree for
+the file and persist it to a filesystem-specific location associated
+with the file, then mark the file as a verity file.  This ioctl may
+take a long time to execute on large files, and it is interruptible by
+fatal signals.
+
+FS_IOC_ENABLE_VERITY checks for write access to the inode.  However,
+it must be executed on an O_RDONLY file descriptor and no processes
+can have the file open for writing.  Attempts to open the file for
+writing while this ioctl is executing will fail with ETXTBSY.  (This
+is necessary to guarantee that no writable file descriptors will exist
+after verity is enabled, and to guarantee that the file's contents are
+stable while the Merkle tree is being built over it.)
+
+On success, FS_IOC_ENABLE_VERITY returns 0, and the file becomes a
+verity file.  On failure (including the case of interruption by a
+fatal signal), no changes are made to the file.
+
+FS_IOC_ENABLE_VERITY can fail with the following errors:
+
+- ``EACCES``: the process does not have write access to the file
+- ``EBADMSG``: the signature is malformed
+- ``EBUSY``: this ioctl is already running on the file
+- ``EEXIST``: the file already has verity enabled
+- ``EFAULT``: the caller provided inaccessible memory
+- ``EINTR``: the operation was interrupted by a fatal signal
+- ``EINVAL``: unsupported version, hash algorithm, or block size; or
+  reserved bits are set; or the file descriptor refers to neither a
+  regular file nor a directory.
+- ``EISDIR``: the file descriptor refers to a directory
+- ``EKEYREJECTED``: the signature doesn't match the file
+- ``EMSGSIZE``: the salt or signature is too long
+- ``ENOKEY``: the fs-verity keyring doesn't contain the certificate
+  needed to verify the signature
+- ``ENOPKG``: fs-verity recognizes the hash algorithm, but it's not
+  available in the kernel's crypto API as currently configured (e.g.
+  for SHA-512, missing CONFIG_CRYPTO_SHA512).
+- ``ENOTTY``: this type of filesystem does not implement fs-verity
+- ``EOPNOTSUPP``: the kernel was not configured with fs-verity
+  support; or the filesystem superblock has not had the 'verity'
+  feature enabled on it; or the filesystem does not support fs-verity
+  on this file.  (See `Filesystem support`_.)
+- ``EPERM``: the file is append-only; or, a signature is required and
+  one was not provided.
+- ``EROFS``: the filesystem is read-only
+- ``ETXTBSY``: someone has the file open for writing.  This can be the
+  caller's file descriptor, another open file descriptor, or the file
+  reference held by a writable memory map.
+
+FS_IOC_MEASURE_VERITY
+---------------------
+
+The FS_IOC_MEASURE_VERITY ioctl retrieves the measurement of a verity
+file.  The file measurement is a digest that cryptographically
+identifies the file contents that are being enforced on reads.
+
+This ioctl takes in a pointer to a variable-length structure::
+
+    struct fsverity_digest {
+            __u16 digest_algorithm;
+            __u16 digest_size; /* input/output */
+            __u8 digest[];
+    };
+
+``digest_size`` is an input/output field.  On input, it must be
+initialized to the number of bytes allocated for the variable-length
+``digest`` field.
+
+On success, 0 is returned and the kernel fills in the structure as
+follows:
+
+- ``digest_algorithm`` will be the hash algorithm used for the file
+  measurement.  It will match ``fsverity_enable_arg::hash_algorithm``.
+- ``digest_size`` will be the size of the digest in bytes, e.g. 32
+  for SHA-256.  (This can be redundant with ``digest_algorithm``.)
+- ``digest`` will be the actual bytes of the digest.
+
+FS_IOC_MEASURE_VERITY is guaranteed to execute in constant time,
+regardless of the size of the file.
+
+FS_IOC_MEASURE_VERITY can fail with the following errors:
+
+- ``EFAULT``: the caller provided inaccessible memory
+- ``ENODATA``: the file is not a verity file
+- ``ENOTTY``: this type of filesystem does not implement fs-verity
+- ``EOPNOTSUPP``: the kernel was not configured with fs-verity
+  support, or the filesystem superblock has not had the 'verity'
+  feature enabled on it.  (See `Filesystem support`_.)
+- ``EOVERFLOW``: the digest is longer than the specified
+  ``digest_size`` bytes.  Try providing a larger buffer.
+
+FS_IOC_GETFLAGS
+---------------
+
+The existing ioctl FS_IOC_GETFLAGS (which isn't specific to fs-verity)
+can also be used to check whether a file has fs-verity enabled or not.
+To do so, check for FS_VERITY_FL (0x00100000) in the returned flags.
+
+The verity flag is not settable via FS_IOC_SETFLAGS.  You must use
+FS_IOC_ENABLE_VERITY instead, since parameters must be provided.
+
+Accessing verity files
+======================
+
+Applications can transparently access a verity file just like a
+non-verity one, with the following exceptions:
+
+- Verity files are readonly.  They cannot be opened for writing or
+  truncate()d, even if the file mode bits allow it.  Attempts to do
+  one of these things will fail with EPERM.  However, changes to
+  metadata such as owner, mode, timestamps, and xattrs are still
+  allowed, since these are not measured by fs-verity.  Verity files
+  can also still be renamed, deleted, and linked to.
+
+- Direct I/O is not supported on verity files.  Attempts to use direct
+  I/O on such files will fall back to buffered I/O.
+
+- DAX (Direct Access) is not supported on verity files, because this
+  would circumvent the data verification.
+
+- Reads of data that doesn't match the verity Merkle tree will fail
+  with EIO (for read()) or SIGBUS (for mmap() reads).
+
+- If the sysctl "fs.verity.require_signatures" is set to 1 and the
+  file's verity measurement is not signed by a key in the fs-verity
+  keyring, then opening the file will fail.  See `Built-in signature
+  verification`_.
+
+Direct access to the Merkle tree is not supported.  Therefore, if a
+verity file is copied, or is backed up and restored, then it will lose
+its "verity"-ness.  fs-verity is primarily meant for files like
+executables that are managed by a package manager.
+
+File measurement computation
+============================
+
+This section describes how fs-verity hashes the file contents using a
+Merkle tree to produce the "file measurement" which cryptographically
+identifies the file contents.  This algorithm is the same for all
+filesystems that support fs-verity.
+
+Userspace only needs to be aware of this algorithm if it needs to
+compute the file measurement itself, e.g. in order to sign the file.
+
+.. _fsverity_merkle_tree:
+
+Merkle tree
+-----------
+
+The file contents is divided into blocks, where the block size is
+configurable but is usually 4096 bytes.  The end of the last block is
+zero-padded if needed.  Each block is then hashed, producing the first
+level of hashes.  Then, the hashes in this first level are grouped
+into 'blocksize'-byte blocks (zero-padding the ends as needed) and
+these blocks are hashed, producing the second level of hashes.  This
+proceeds up the tree until only a single block remains.  The hash of
+this block is the "Merkle tree root hash".
+
+If the file fits in one block and is nonempty, then the "Merkle tree
+root hash" is simply the hash of the single data block.  If the file
+is empty, then the "Merkle tree root hash" is all zeroes.
+
+The "blocks" here are not necessarily the same as "filesystem blocks".
+
+If a salt was specified, then it's zero-padded to the closest multiple
+of the input size of the hash algorithm's compression function, e.g.
+64 bytes for SHA-256 or 128 bytes for SHA-512.  The padded salt is
+prepended to every data or Merkle tree block that is hashed.
+
+The purpose of the block padding is to cause every hash to be taken
+over the same amount of data, which simplifies the implementation and
+keeps open more possibilities for hardware acceleration.  The purpose
+of the salt padding is to make the salting "free" when the salted hash
+state is precomputed, then imported for each hash.
+
+Example: in the recommended configuration of SHA-256 and 4K blocks,
+128 hash values fit in each block.  Thus, each level of the Merkle
+tree is approximately 128 times smaller than the previous, and for
+large files the Merkle tree's size converges to approximately 1/127 of
+the original file size.  However, for small files, the padding is
+significant, making the space overhead proportionally more.
+
+.. _fsverity_descriptor:
+
+fs-verity descriptor
+--------------------
+
+By itself, the Merkle tree root hash is ambiguous.  For example, it
+can't a distinguish a large file from a small second file whose data
+is exactly the top-level hash block of the first file.  Ambiguities
+also arise from the convention of padding to the next block boundary.
+
+To solve this problem, the verity file measurement is actually
+computed as a hash of the following structure, which contains the
+Merkle tree root hash as well as other fields such as the file size::
+
+    struct fsverity_descriptor {
+            __u8 version;           /* must be 1 */
+            __u8 hash_algorithm;    /* Merkle tree hash algorithm */
+            __u8 log_blocksize;     /* log2 of size of data and tree blocks */
+            __u8 salt_size;         /* size of salt in bytes; 0 if none */
+            __le32 sig_size;        /* must be 0 */
+            __le64 data_size;       /* size of file the Merkle tree is built over */
+            __u8 root_hash[64];     /* Merkle tree root hash */
+            __u8 salt[32];          /* salt prepended to each hashed block */
+            __u8 __reserved[144];   /* must be 0's */
+    };
+
+Note that the ``sig_size`` field must be set to 0 for the purpose of
+computing the file measurement, even if a signature was provided (or
+will be provided) to `FS_IOC_ENABLE_VERITY`_.
+
+Built-in signature verification
+===============================
+
+With CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y, fs-verity supports putting
+a portion of an authentication policy (see `Use cases`_) in the
+kernel.  Specifically, it adds support for:
+
+1. At fs-verity module initialization time, a keyring ".fs-verity" is
+   created.  The root user can add trusted X.509 certificates to this
+   keyring using the add_key() system call, then (when done)
+   optionally use keyctl_restrict_keyring() to prevent additional
+   certificates from being added.
+
+2. `FS_IOC_ENABLE_VERITY`_ accepts a pointer to a PKCS#7 formatted
+   detached signature in DER format of the file measurement.  On
+   success, this signature is persisted alongside the Merkle tree.
+   Then, any time the file is opened, the kernel will verify the
+   file's actual measurement against this signature, using the
+   certificates in the ".fs-verity" keyring.
+
+3. A new sysctl "fs.verity.require_signatures" is made available.
+   When set to 1, the kernel requires that all verity files have a
+   correctly signed file measurement as described in (2).
+
+File measurements must be signed in the following format, which is
+similar to the structure used by `FS_IOC_MEASURE_VERITY`_::
+
+    struct fsverity_signed_digest {
+            char magic[8];                  /* must be "FSVerity" */
+            __le16 digest_algorithm;
+            __le16 digest_size;
+            __u8 digest[];
+    };
+
+fs-verity's built-in signature verification support is meant as a
+relatively simple mechanism that can be used to provide some level of
+authenticity protection for verity files, as an alternative to doing
+the signature verification in userspace or using IMA-appraisal.
+However, with this mechanism, userspace programs still need to check
+that the verity bit is set, and there is no protection against verity
+files being swapped around.
+
+Filesystem support
+==================
+
+fs-verity is currently supported by the ext4 and f2fs filesystems.
+The CONFIG_FS_VERITY kconfig option must be enabled to use fs-verity
+on either filesystem.
+
+``include/linux/fsverity.h`` declares the interface between the
+``fs/verity/`` support layer and filesystems.  Briefly, filesystems
+must provide an ``fsverity_operations`` structure that provides
+methods to read and write the verity metadata to a filesystem-specific
+location, including the Merkle tree blocks and
+``fsverity_descriptor``.  Filesystems must also call functions in
+``fs/verity/`` at certain times, such as when a file is opened or when
+pages have been read into the pagecache.  (See `Verifying data`_.)
+
+ext4
+----
+
+ext4 supports fs-verity since Linux TODO and e2fsprogs v1.45.2.
+
+To create verity files on an ext4 filesystem, the filesystem must have
+been formatted with ``-O verity`` or had ``tune2fs -O verity`` run on
+it.  "verity" is an RO_COMPAT filesystem feature, so once set, old
+kernels will only be able to mount the filesystem readonly, and old
+versions of e2fsck will be unable to check the filesystem.  Moreover,
+currently ext4 only supports mounting a filesystem with the "verity"
+feature when its block size is equal to PAGE_SIZE (often 4096 bytes).
+
+ext4 sets the EXT4_VERITY_FL on-disk inode flag on verity files.  It
+can only be set by `FS_IOC_ENABLE_VERITY`_, and it cannot be cleared.
+
+ext4 also supports encryption, which can be used simultaneously with
+fs-verity.  In this case, the plaintext data is verified rather than
+the ciphertext.  This is necessary in order to make the file
+measurement meaningful, since every file is encrypted differently.
+
+ext4 stores the verity metadata (Merkle tree and fsverity_descriptor)
+past the end of the file, starting at the first 64K boundary beyond
+i_size.  This approach works because (a) verity files are readonly,
+and (b) pages fully beyond i_size aren't visible to userspace but can
+be read/written internally by ext4 with only some relatively small
+changes to ext4.  This approach avoids having to depend on the
+EA_INODE feature and on rearchitecturing ext4's xattr support to
+support paging multi-gigabyte xattrs into memory, and to support
+encrypting xattrs.  Note that the verity metadata *must* be encrypted
+when the file is, since it contains hashes of the plaintext data.
+
+Currently, ext4 verity only supports the case where the Merkle tree
+block size, filesystem block size, and page size are all the same.  It
+also only supports extent-based files.
+
+f2fs
+----
+
+f2fs supports fs-verity since Linux TODO and f2fs-tools v1.11.0.
+
+To create verity files on an f2fs filesystem, the filesystem must have
+been formatted with ``-O verity``.
+
+f2fs sets the FADVISE_VERITY_BIT on-disk inode flag on verity files.
+It can only be set by `FS_IOC_ENABLE_VERITY`_, and it cannot be
+cleared.
+
+Like ext4, f2fs stores the verity metadata (Merkle tree and
+fsverity_descriptor) past the end of the file, starting at the first
+64K boundary beyond i_size.  See explanation for ext4 above.
+Moreover, f2fs supports at most 4096 bytes of xattr entries per inode
+which wouldn't be enough for even a single Merkle tree block.
+
+Currently, f2fs verity only supports a Merkle tree block size of 4096.
+Also, f2fs doesn't support enabling verity on files that currently
+have atomic or volatile writes pending.
+
+Implementation details
+======================
+
+Verifying data
+--------------
+
+fs-verity ensures that all reads of a verity file's data are verified,
+regardless of which syscall is used to do the read (e.g. mmap(),
+read(), pread()) and regardless of whether it's the first read or a
+later read (unless the later read can return cached data that was
+already verified).  Below, we describe how filesystems implement this.
+
+Pagecache
+~~~~~~~~~
+
+For filesystems using Linux's pagecache, the ``->readpage()`` and
+``->readpages()`` methods must be modified to verify pages before they
+are marked Uptodate.  Merely hooking ``->read_iter()`` would be
+insufficient, since ``->read_iter()`` is not used for memory maps.
+
+Therefore, fs/verity/ provides a function fsverity_verify_page() which
+verifies a page that has been read into the pagecache of a verity
+inode, but is still locked and not Uptodate, so it's not yet readable
+by userspace.  As needed to do the verification,
+fsverity_verify_page() will call back into the filesystem to read
+Merkle tree pages via fsverity_operations::read_merkle_tree_page().
+
+fsverity_verify_page() returns false if verification failed; in this
+case, the filesystem must not set the page Uptodate.  Following this,
+as per the usual Linux pagecache behavior, attempts by userspace to
+read() from the part of the file containing the page will fail with
+EIO, and accesses to the page within a memory map will raise SIGBUS.
+
+fsverity_verify_page() currently only supports the case where the
+Merkle tree block size is equal to PAGE_SIZE (often 4096 bytes).
+
+In principle, fsverity_verify_page() verifies the entire path in the
+Merkle tree from the data page to the root hash.  However, for
+efficiency the filesystem may cache the hash pages.  Therefore,
+fsverity_verify_page() only ascends the tree reading hash pages until
+an already-verified hash page is seen, as indicated by the PageChecked
+bit being set.  It then verifies the path to that page.
+
+This optimization, which is also used by dm-verity, results in
+excellent sequential read performance.  This is because usually (e.g.
+127 in 128 times for 4K blocks and SHA-256) the hash page from the
+bottom level of the tree will already be cached and checked from
+reading a previous data page.  However, random reads perform worse.
+
+Block device based filesystems
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Block device based filesystems (e.g. ext4 and f2fs) in Linux also use
+the pagecache, so the above subsection applies too.  However, they
+also usually read many pages from a file at once, grouped into a
+structure called a "bio".  To make it easier for these types of
+filesystems to support fs-verity, fs/verity/ also provides a function
+fsverity_verify_bio() which verifies all pages in a bio.
+
+ext4 and f2fs also support encryption.  If a verity file is also
+encrypted, the pages must be decrypted before being verified.  To
+support this, these filesystems allocate a "post-read context" for
+each bio and store it in ``->bi_private``::
+
+    struct bio_post_read_ctx {
+           struct bio *bio;
+           struct work_struct work;
+           unsigned int cur_step;
+           unsigned int enabled_steps;
+    };
+
+``enabled_steps`` is a bitmask that specifies whether decryption,
+verity, or both is enabled.  After the bio completes, for each needed
+postprocessing step the filesystem enqueues the bio_post_read_ctx on a
+workqueue, and then the workqueue work does the decryption or
+verification.  Finally, pages where no decryption or verity error
+occurred are marked Uptodate, and the pages are unlocked.
+
+Files on ext4 and f2fs may contain holes.  Normally, ``->readpages()``
+simply zeroes holes and sets the corresponding pages Uptodate; no bios
+are issued.  To prevent this case from bypassing fs-verity, these
+filesystems use fsverity_verify_page() to verify hole pages.
+
+ext4 and f2fs disable direct I/O on verity files, since otherwise
+direct I/O would bypass fs-verity.  (They also do the same for
+encrypted files.)
+
+Userspace utility
+=================
+
+This document focuses on the kernel, but a userspace utility for
+fs-verity can be found at:
+
+	https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/fsverity-utils.git
+
+See the README.md file in the fsverity-utils source tree for details,
+including examples of setting up fs-verity protected files.
+
+Tests
+=====
+
+To test fs-verity, use xfstests.  For example, using `kvm-xfstests
+<https://github.com/tytso/xfstests-bld/blob/master/Documentation/kvm-quickstart.md>`_::
+
+    kvm-xfstests -c ext4,f2fs -g verity
+
+FAQ
+===
+
+This section answers frequently asked questions about fs-verity that
+weren't already directly answered in other parts of this document.
+
+:Q: Why isn't fs-verity part of IMA?
+:A: fs-verity and IMA (Integrity Measurement Architecture) have
+    different focuses.  fs-verity is a filesystem-level mechanism for
+    hashing individual files using a Merkle tree.  In contrast, IMA
+    specifies a system-wide policy that specifies which files are
+    hashed and what to do with those hashes, such as log them,
+    authenticate them, or add them to a measurement list.
+
+    IMA is planned to support the fs-verity hashing mechanism as an
+    alternative to doing full file hashes, for people who want the
+    performance and security benefits of the Merkle tree based hash.
+    But it doesn't make sense to force all uses of fs-verity to be
+    through IMA.  As a standalone filesystem feature, fs-verity
+    already meets many users' needs, and it's testable like other
+    filesystem features e.g. with xfstests.
+
+:Q: Isn't fs-verity useless because the attacker can just modify the
+    hashes in the Merkle tree, which is stored on-disk?
+:A: To verify the authenticity of an fs-verity file you must verify
+    the authenticity of the "file measurement", which is basically the
+    root hash of the Merkle tree.  See `Use cases`_.
+
+:Q: Isn't fs-verity useless because the attacker can just replace a
+    verity file with a non-verity one?
+:A: See `Use cases`_.  In the initial use case, it's really trusted
+    userspace code that authenticates the files; fs-verity is just a
+    tool to do this job efficiently and securely.  The trusted
+    userspace code will consider non-verity files to be inauthentic.
+
+:Q: Why does the Merkle tree need to be stored on-disk?  Couldn't you
+    store just the root hash?
+:A: If the Merkle tree wasn't stored on-disk, then you'd have to
+    compute the entire tree when the file is first accessed, even if
+    just one byte is being read.  This is a fundamental consequence of
+    how Merkle tree hashing works.  To verify a leaf node, you need to
+    verify the whole path to the root hash, including the root node
+    (the thing which the root hash is a hash of).  But if the root
+    node isn't stored on-disk, you have to compute it by hashing its
+    children, and so on until you've actually hashed the entire file.
+
+    That defeats most of the point of doing a Merkle tree-based hash,
+    since if you have to hash the whole file ahead of time anyway,
+    then you could simply do sha256(file) instead.  That would be much
+    simpler, and a bit faster too.
+
+    It's true that an in-memory Merkle tree could still provide the
+    advantage of verification on every read rather than just on the
+    first read.  However, it would be inefficient because every time a
+    hash page gets evicted (you can't pin the entire Merkle tree into
+    memory, since it may be very large), in order to restore it you
+    again need to hash everything below it in the tree.  This again
+    defeats most of the point of doing a Merkle tree-based hash, since
+    a single block read could trigger re-hashing gigabytes of data.
+
+:Q: But couldn't you store just the leaf nodes and compute the rest?
+:A: See previous answer; this really just moves up one level, since
+    one could alternatively interpret the data blocks as being the
+    leaf nodes of the Merkle tree.  It's true that the tree can be
+    computed much faster if the leaf level is stored rather than just
+    the data, but that's only because each level is less than 1% the
+    size of the level below (assuming the recommended settings of
+    SHA-256 and 4K blocks).  For the exact same reason, by storing
+    "just the leaf nodes" you'd already be storing over 99% of the
+    tree, so you might as well simply store the whole tree.
+
+:Q: Can the Merkle tree be built ahead of time, e.g. distributed as
+    part of a package that is installed to many computers?
+:A: This isn't currently supported.  It was part of the original
+    design, but was removed to simplify the kernel UAPI and because it
+    wasn't a critical use case.  Files are usually installed once and
+    used many times, and cryptographic hashing is somewhat fast on
+    most modern processors.
+
+:Q: Why doesn't fs-verity support writes?
+:A: Write support would be very difficult and would require a
+    completely different design, so it's well outside the scope of
+    fs-verity.  Write support would require:
+
+    - A way to maintain consistency between the data and hashes,
+      including all levels of hashes, since corruption after a crash
+      (especially of potentially the entire file!) is unacceptable.
+      The main options for solving this are data journalling,
+      copy-on-write, and log-structured volume.  But it's very hard to
+      retrofit existing filesystems with new consistency mechanisms.
+      Data journalling is available on ext4, but is very slow.
+
+    - Rebuilding the the Merkle tree after every write, which would be
+      extremely inefficient.  Alternatively, a different authenticated
+      dictionary structure such as an "authenticated skiplist" could
+      be used.  However, this would be far more complex.
+
+    Compare it to dm-verity vs. dm-integrity.  dm-verity is very
+    simple: the kernel just verifies read-only data against a
+    read-only Merkle tree.  In contrast, dm-integrity supports writes
+    but is slow, is much more complex, and doesn't actually support
+    full-device authentication since it authenticates each sector
+    independently, i.e. there is no "root hash".  It doesn't really
+    make sense for the same device-mapper target to support these two
+    very different cases; the same applies to fs-verity.
+
+:Q: Since verity files are immutable, why isn't the immutable bit set?
+:A: The existing "immutable" bit (FS_IMMUTABLE_FL) already has a
+    specific set of semantics which not only make the file contents
+    read-only, but also prevent the file from being deleted, renamed,
+    linked to, or having its owner or mode changed.  These extra
+    properties are unwanted for fs-verity, so reusing the immutable
+    bit isn't appropriate.
+
+:Q: Why does the API use ioctls instead of setxattr() and getxattr()?
+:A: Abusing the xattr interface for basically arbitrary syscalls is
+    heavily frowned upon by most of the Linux filesystem developers.
+    An xattr should really just be an xattr on-disk, not an API to
+    e.g. magically trigger construction of a Merkle tree.
+
+:Q: Does fs-verity support remote filesystems?
+:A: Only ext4 and f2fs support is implemented currently, but in
+    principle any filesystem that can store per-file verity metadata
+    can support fs-verity, regardless of whether it's local or remote.
+    Some filesystems may have fewer options of where to store the
+    verity metadata; one possibility is to store it past the end of
+    the file and "hide" it from userspace by manipulating i_size.  The
+    data verification functions provided by ``fs/verity/`` also assume
+    that the filesystem uses the Linux pagecache, but both local and
+    remote filesystems normally do so.
+
+:Q: Why is anything filesystem-specific at all?  Shouldn't fs-verity
+    be implemented entirely at the VFS level?
+:A: There are many reasons why this is not possible or would be very
+    difficult, including the following:
+
+    - To prevent bypassing verification, pages must not be marked
+      Uptodate until they've been verified.  Currently, each
+      filesystem is responsible for marking pages Uptodate via
+      ``->readpages()``.  Therefore, currently it's not possible for
+      the VFS to do the verification on its own.  Changing this would
+      require significant changes to the VFS and all filesystems.
+
+    - It would require defining a filesystem-independent way to store
+      the verity metadata.  Extended attributes don't work for this
+      because (a) the Merkle tree may be gigabytes, but many
+      filesystems assume that all xattrs fit into a single 4K
+      filesystem block, and (b) ext4 and f2fs encryption doesn't
+      encrypt xattrs, yet the Merkle tree *must* be encrypted when the
+      file contents are, because it stores hashes of the plaintext
+      file contents.
+
+      So the verity metadata would have to be stored in an actual
+      file.  Using a separate file would be very ugly, since the
+      metadata is fundamentally part of the file to be protected, and
+      it could cause problems where users could delete the real file
+      but not the metadata file or vice versa.  On the other hand,
+      having it be in the same file would break applications unless
+      filesystems' notion of i_size were divorced from the VFS's,
+      which would be complex and require changes to all filesystems.
+
+    - It's desirable that FS_IOC_ENABLE_VERITY uses the filesystem's
+      transaction mechanism so that either the file ends up with
+      verity enabled, or no changes were made.  Allowing intermediate
+      states to occur after a crash may cause problems.
diff --git a/Documentation/filesystems/index.rst b/Documentation/filesystems/index.rst
index 46d1b1b..d2f9d11 100644
--- a/Documentation/filesystems/index.rst
+++ b/Documentation/filesystems/index.rst
@@ -359,3 +359,4 @@
     :maxdepth: 2
 
     fscrypt
+    fsverity
diff --git a/Documentation/filesystems/overlayfs.txt b/Documentation/filesystems/overlayfs.txt
index d7dc9c8..99ee7dd 100644
--- a/Documentation/filesystems/overlayfs.txt
+++ b/Documentation/filesystems/overlayfs.txt
@@ -102,6 +102,29 @@
 such as metadata and extended attributes are reported for the upper
 directory only.  These attributes of the lower directory are hidden.
 
+credentials
+-----------
+
+By default, all access to the upper, lower and work directories is the
+recorded mounter's MAC and DAC credentials.  The incoming accesses are
+checked against the caller's credentials.
+
+In the case where caller MAC or DAC credentials do not overlap, a
+use case available in older versions of the driver, the
+override_creds mount flag can be turned off and help when the use
+pattern has caller with legitimate credentials where the mounter
+does not.  Several unintended side effects will occur though.  The
+caller without certain key capabilities or lower privilege will not
+always be able to delete files or directories, create nodes, or
+search some restricted directories.  The ability to search and read
+a directory entry is spotty as a result of the cache mechanism not
+retesting the credentials because of the assumption, a privileged
+caller can fill cache, then a lower privilege can read the directory
+cache.  The uneven security model where cache, upperdir and workdir
+are opened at privilege, but accessed without creating a form of
+privilege escalation, should only be used with strict understanding
+of the side effects and of the security policies.
+
 whiteouts and opaque directories
 --------------------------------
 
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt
index 0d0ecc7..17aaa75 100644
--- a/Documentation/filesystems/proc.txt
+++ b/Documentation/filesystems/proc.txt
@@ -398,6 +398,8 @@
  [stack]                  = the stack of the main process
  [vdso]                   = the "virtual dynamic shared object",
                             the kernel system call handler
+ [anon:<name>]            = an anonymous mapping that has been
+                            named by userspace
 
  or if empty, the mapping is anonymous.
 
@@ -427,6 +429,7 @@
 Locked:                0 kB
 THPeligible:           0
 VmFlags: rd ex mr mw me dw
+Name:           name from userspace
 
 the first of these lines shows the same information as is displayed for the
 mapping in /proc/PID/maps.  The remaining lines show the size of the mapping
@@ -503,6 +506,9 @@
 might change in future as well. So each consumer of these flags has to
 follow each specific kernel version for the exact semantic.
 
+The "Name" field will only be present on a mapping that has been named by
+userspace, and will show the name passed in by userspace.
+
 This file is only present if the CONFIG_MMU kernel configuration option is
 enabled.
 
@@ -863,6 +869,7 @@
 AnonPages:      861800 kB
 Mapped:         280372 kB
 Shmem:             644 kB
+KReclaimable:   168048 kB
 Slab:           284364 kB
 SReclaimable:   159856 kB
 SUnreclaim:     124508 kB
@@ -930,6 +937,9 @@
 ShmemHugePages: Memory used by shared memory (shmem) and tmpfs allocated
               with huge pages
 ShmemPmdMapped: Shared memory mapped into userspace with huge pages
+KReclaimable: Kernel allocations that the kernel will attempt to reclaim
+              under memory pressure. Includes SReclaimable (below), and other
+              direct allocations with a shrinker.
         Slab: in-kernel data structures cache
 SReclaimable: Part of Slab, that might be reclaimed, such as caches
   SUnreclaim: Part of Slab, that cannot be reclaimed on memory pressure
diff --git a/Documentation/power/energy-model.txt b/Documentation/power/energy-model.txt
new file mode 100644
index 0000000..5a23c6f
--- /dev/null
+++ b/Documentation/power/energy-model.txt
@@ -0,0 +1,169 @@
+                           ====================
+                           Energy Model of CPUs
+                           ====================
+
+1. Overview
+-----------
+
+The Energy Model (EM) framework serves as an interface between drivers knowing
+the power consumed by CPUs at various performance levels, and the kernel
+subsystems willing to use that information to make energy-aware decisions.
+
+The source of the information about the power consumed by CPUs can vary greatly
+from one platform to another. These power costs can be estimated using
+devicetree data in some cases. In others, the firmware will know better.
+Alternatively, userspace might be best positioned. And so on. In order to avoid
+each and every client subsystem to re-implement support for each and every
+possible source of information on its own, the EM framework intervenes as an
+abstraction layer which standardizes the format of power cost tables in the
+kernel, hence enabling to avoid redundant work.
+
+The figure below depicts an example of drivers (Arm-specific here, but the
+approach is applicable to any architecture) providing power costs to the EM
+framework, and interested clients reading the data from it.
+
+       +---------------+  +-----------------+  +---------------+
+       | Thermal (IPA) |  | Scheduler (EAS) |  |     Other     |
+       +---------------+  +-----------------+  +---------------+
+               |                   | em_pd_energy()    |
+               |                   | em_cpu_get()      |
+               +---------+         |         +---------+
+                         |         |         |
+                         v         v         v
+                        +---------------------+
+                        |    Energy Model     |
+                        |     Framework       |
+                        +---------------------+
+                           ^       ^       ^
+                           |       |       | em_register_perf_domain()
+                +----------+       |       +---------+
+                |                  |                 |
+        +---------------+  +---------------+  +--------------+
+        |  cpufreq-dt   |  |   arm_scmi    |  |    Other     |
+        +---------------+  +---------------+  +--------------+
+                ^                  ^                 ^
+                |                  |                 |
+        +--------------+   +---------------+  +--------------+
+        | Device Tree  |   |   Firmware    |  |      ?       |
+        +--------------+   +---------------+  +--------------+
+
+The EM framework manages power cost tables per 'performance domain' in the
+system. A performance domain is a group of CPUs whose performance is scaled
+together. Performance domains generally have a 1-to-1 mapping with CPUFreq
+policies. All CPUs in a performance domain are required to have the same
+micro-architecture. CPUs in different performance domains can have different
+micro-architectures.
+
+
+2. Core APIs
+------------
+
+  2.1 Config options
+
+CONFIG_ENERGY_MODEL must be enabled to use the EM framework.
+
+
+  2.2 Registration of performance domains
+
+Drivers are expected to register performance domains into the EM framework by
+calling the following API:
+
+  int em_register_perf_domain(cpumask_t *span, unsigned int nr_states,
+			      struct em_data_callback *cb);
+
+Drivers must specify the CPUs of the performance domains using the cpumask
+argument, and provide a callback function returning <frequency, power> tuples
+for each capacity state. The callback function provided by the driver is free
+to fetch data from any relevant location (DT, firmware, ...), and by any mean
+deemed necessary. See Section 3. for an example of driver implementing this
+callback, and kernel/power/energy_model.c for further documentation on this
+API.
+
+
+  2.3 Accessing performance domains
+
+Subsystems interested in the energy model of a CPU can retrieve it using the
+em_cpu_get() API. The energy model tables are allocated once upon creation of
+the performance domains, and kept in memory untouched.
+
+The energy consumed by a performance domain can be estimated using the
+em_pd_energy() API. The estimation is performed assuming that the schedutil
+CPUfreq governor is in use.
+
+More details about the above APIs can be found in include/linux/energy_model.h.
+
+
+3. Example driver
+-----------------
+
+This section provides a simple example of a CPUFreq driver registering a
+performance domain in the Energy Model framework using the (fake) 'foo'
+protocol. The driver implements an est_power() function to be provided to the
+EM framework.
+
+ -> drivers/cpufreq/foo_cpufreq.c
+
+01	static int est_power(unsigned long *mW, unsigned long *KHz, int cpu)
+02	{
+03		long freq, power;
+04
+05		/* Use the 'foo' protocol to ceil the frequency */
+06		freq = foo_get_freq_ceil(cpu, *KHz);
+07		if (freq < 0);
+08			return freq;
+09
+10		/* Estimate the power cost for the CPU at the relevant freq. */
+11		power = foo_estimate_power(cpu, freq);
+12		if (power < 0);
+13			return power;
+14
+15		/* Return the values to the EM framework */
+16		*mW = power;
+17		*KHz = freq;
+18
+19		return 0;
+20	}
+21
+22	static int foo_cpufreq_init(struct cpufreq_policy *policy)
+23	{
+24		struct em_data_callback em_cb = EM_DATA_CB(est_power);
+25		int nr_opp, ret;
+26
+27		/* Do the actual CPUFreq init work ... */
+28		ret = do_foo_cpufreq_init(policy);
+29		if (ret)
+30			return ret;
+31
+32		/* Find the number of OPPs for this policy */
+33		nr_opp = foo_get_nr_opp(policy);
+34
+35		/* And register the new performance domain */
+36		em_register_perf_domain(policy->cpus, nr_opp, &em_cb);
+37
+38	        return 0;
+39	}
+
+
+4. Support for legacy Energy Models (DEPRECATED)
+------------------------------------------------
+
+The Android kernel version 4.14 and before used a different type of EM for EAS,
+referred to as the 'legacy' EM. The legacy EM relies on the out-of-tree
+'sched-energy-costs' devicetree bindings to provide the kernel with power costs.
+The usage of such bindings in Android has now been DEPRECATED in favour of the
+mainline equivalents.
+
+The currently supported alternatives to populate the EM include:
+ - using a firmware-based solution such as Arm SCMI (supported in
+   drivers/cpufreq/scmi-cpufreq.c);
+ - using the 'dynamic-power-coefficient' devicetree binding together with
+   PM_OPP. See the of_dev_pm_opp_get_cpu_power() helper in PM_OPP, and the
+   reference implementation in drivers/cpufreq/cpufreq-dt.c.
+
+In order to ease the transition to the new EM format, Android 4.19 also provides
+a compatibility driver able to load a legacy EM from DT into the EM framework.
+*** Please note that THIS FEATURE WILL NOT BE AVAILABLE in future Android
+kernels, and as such it must be considered only as a temporary workaround. ***
+
+If you know what you're doing and still want to use this driver, you need to set
+CONFIG_LEGACY_ENERGY_MODEL_DT=y in your kernel configuration to enable it.
diff --git a/Documentation/scheduler/sched-energy.txt b/Documentation/scheduler/sched-energy.txt
new file mode 100644
index 0000000..197d81f
--- /dev/null
+++ b/Documentation/scheduler/sched-energy.txt
@@ -0,0 +1,425 @@
+			   =======================
+			   Energy Aware Scheduling
+			   =======================
+
+1. Introduction
+---------------
+
+Energy Aware Scheduling (or EAS) gives the scheduler the ability to predict
+the impact of its decisions on the energy consumed by CPUs. EAS relies on an
+Energy Model (EM) of the CPUs to select an energy efficient CPU for each task,
+with a minimal impact on throughput. This document aims at providing an
+introduction on how EAS works, what are the main design decisions behind it, and
+details what is needed to get it to run.
+
+Before going any further, please note that at the time of writing:
+
+   /!\ EAS does not support platforms with symmetric CPU topologies /!\
+
+EAS operates only on heterogeneous CPU topologies (such as Arm big.LITTLE)
+because this is where the potential for saving energy through scheduling is
+the highest.
+
+The actual EM used by EAS is _not_ maintained by the scheduler, but by a
+dedicated framework. For details about this framework and what it provides,
+please refer to its documentation (see Documentation/power/energy-model.txt).
+
+
+2. Background and Terminology
+-----------------------------
+
+To make it clear from the start:
+ - energy = [joule] (resource like a battery on powered devices)
+ - power = energy/time = [joule/second] = [watt]
+
+The goal of EAS is to minimize energy, while still getting the job done. That
+is, we want to maximize:
+
+	performance [inst/s]
+	--------------------
+	    power [W]
+
+which is equivalent to minimizing:
+
+	energy [J]
+	-----------
+	instruction
+
+while still getting 'good' performance. It is essentially an alternative
+optimization objective to the current performance-only objective for the
+scheduler. This alternative considers two objectives: energy-efficiency and
+performance.
+
+The idea behind introducing an EM is to allow the scheduler to evaluate the
+implications of its decisions rather than blindly applying energy-saving
+techniques that may have positive effects only on some platforms. At the same
+time, the EM must be as simple as possible to minimize the scheduler latency
+impact.
+
+In short, EAS changes the way CFS tasks are assigned to CPUs. When it is time
+for the scheduler to decide where a task should run (during wake-up), the EM
+is used to break the tie between several good CPU candidates and pick the one
+that is predicted to yield the best energy consumption without harming the
+system's throughput. The predictions made by EAS rely on specific elements of
+knowledge about the platform's topology, which include the 'capacity' of CPUs,
+and their respective energy costs.
+
+
+3. Topology information
+-----------------------
+
+EAS (as well as the rest of the scheduler) uses the notion of 'capacity' to
+differentiate CPUs with different computing throughput. The 'capacity' of a CPU
+represents the amount of work it can absorb when running at its highest
+frequency compared to the most capable CPU of the system. Capacity values are
+normalized in a 1024 range, and are comparable with the utilization signals of
+tasks and CPUs computed by the Per-Entity Load Tracking (PELT) mechanism. Thanks
+to capacity and utilization values, EAS is able to estimate how big/busy a
+task/CPU is, and to take this into consideration when evaluating performance vs
+energy trade-offs. The capacity of CPUs is provided via arch-specific code
+through the arch_scale_cpu_capacity() callback.
+
+The rest of platform knowledge used by EAS is directly read from the Energy
+Model (EM) framework. The EM of a platform is composed of a power cost table
+per 'performance domain' in the system (see Documentation/power/energy-model.txt
+for futher details about performance domains).
+
+The scheduler manages references to the EM objects in the topology code when the
+scheduling domains are built, or re-built. For each root domain (rd), the
+scheduler maintains a singly linked list of all performance domains intersecting
+the current rd->span. Each node in the list contains a pointer to a struct
+em_perf_domain as provided by the EM framework.
+
+The lists are attached to the root domains in order to cope with exclusive
+cpuset configurations. Since the boundaries of exclusive cpusets do not
+necessarily match those of performance domains, the lists of different root
+domains can contain duplicate elements.
+
+Example 1.
+    Let us consider a platform with 12 CPUs, split in 3 performance domains
+    (pd0, pd4 and pd8), organized as follows:
+
+	          CPUs:   0 1 2 3 4 5 6 7 8 9 10 11
+	          PDs:   |--pd0--|--pd4--|---pd8---|
+	          RDs:   |----rd1----|-----rd2-----|
+
+    Now, consider that userspace decided to split the system with two
+    exclusive cpusets, hence creating two independent root domains, each
+    containing 6 CPUs. The two root domains are denoted rd1 and rd2 in the
+    above figure. Since pd4 intersects with both rd1 and rd2, it will be
+    present in the linked list '->pd' attached to each of them:
+       * rd1->pd: pd0 -> pd4
+       * rd2->pd: pd4 -> pd8
+
+    Please note that the scheduler will create two duplicate list nodes for
+    pd4 (one for each list). However, both just hold a pointer to the same
+    shared data structure of the EM framework.
+
+Since the access to these lists can happen concurrently with hotplug and other
+things, they are protected by RCU, like the rest of topology structures
+manipulated by the scheduler.
+
+EAS also maintains a static key (sched_energy_present) which is enabled when at
+least one root domain meets all conditions for EAS to start. Those conditions
+are summarized in Section 6.
+
+
+4. Energy-Aware task placement
+------------------------------
+
+EAS overrides the CFS task wake-up balancing code. It uses the EM of the
+platform and the PELT signals to choose an energy-efficient target CPU during
+wake-up balance. When EAS is enabled, select_task_rq_fair() calls
+find_energy_efficient_cpu() to do the placement decision. This function looks
+for the CPU with the highest spare capacity (CPU capacity - CPU utilization) in
+each performance domain since it is the one which will allow us to keep the
+frequency the lowest. Then, the function checks if placing the task there could
+save energy compared to leaving it on prev_cpu, i.e. the CPU where the task ran
+in its previous activation.
+
+find_energy_efficient_cpu() uses compute_energy() to estimate what will be the
+energy consumed by the system if the waking task was migrated. compute_energy()
+looks at the current utilization landscape of the CPUs and adjusts it to
+'simulate' the task migration. The EM framework provides the em_pd_energy() API
+which computes the expected energy consumption of each performance domain for
+the given utilization landscape.
+
+An example of energy-optimized task placement decision is detailed below.
+
+Example 2.
+    Let us consider a (fake) platform with 2 independent performance domains
+    composed of two CPUs each. CPU0 and CPU1 are little CPUs; CPU2 and CPU3
+    are big.
+
+    The scheduler must decide where to place a task P whose util_avg = 200
+    and prev_cpu = 0.
+
+    The current utilization landscape of the CPUs is depicted on the graph
+    below. CPUs 0-3 have a util_avg of 400, 100, 600 and 500 respectively
+    Each performance domain has three Operating Performance Points (OPPs).
+    The CPU capacity and power cost associated with each OPP is listed in
+    the Energy Model table. The util_avg of P is shown on the figures
+    below as 'PP'.
+
+    CPU util.
+      1024                 - - - - - - -              Energy Model
+                                               +-----------+-------------+
+                                               |  Little   |     Big     |
+       768                 =============       +-----+-----+------+------+
+                                               | Cap | Pwr | Cap  | Pwr  |
+                                               +-----+-----+------+------+
+       512  ===========    - ##- - - - -       | 170 | 50  | 512  | 400  |
+                             ##     ##         | 341 | 150 | 768  | 800  |
+       341  -PP - - - -      ##     ##         | 512 | 300 | 1024 | 1700 |
+             PP              ##     ##         +-----+-----+------+------+
+       170  -## - - - -      ##     ##
+             ##     ##       ##     ##
+           ------------    -------------
+            CPU0   CPU1     CPU2   CPU3
+
+      Current OPP: =====       Other OPP: - - -     util_avg (100 each): ##
+
+
+    find_energy_efficient_cpu() will first look for the CPUs with the
+    maximum spare capacity in the two performance domains. In this example,
+    CPU1 and CPU3. Then it will estimate the energy of the system if P was
+    placed on either of them, and check if that would save some energy
+    compared to leaving P on CPU0. EAS assumes that OPPs follow utilization
+    (which is coherent with the behaviour of the schedutil CPUFreq
+    governor, see Section 6. for more details on this topic).
+
+    Case 1. P is migrated to CPU1
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+      1024                 - - - - - - -
+
+                                            Energy calculation:
+       768                 =============     * CPU0: 200 / 341 * 150 = 88
+                                             * CPU1: 300 / 341 * 150 = 131
+                                             * CPU2: 600 / 768 * 800 = 625
+       512  - - - - - -    - ##- - - - -     * CPU3: 500 / 768 * 800 = 520
+                             ##     ##          => total_energy = 1364
+       341  ===========      ##     ##
+                    PP       ##     ##
+       170  -## - - PP-      ##     ##
+             ##     ##       ##     ##
+           ------------    -------------
+            CPU0   CPU1     CPU2   CPU3
+
+
+    Case 2. P is migrated to CPU3
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+      1024                 - - - - - - -
+
+                                            Energy calculation:
+       768                 =============     * CPU0: 200 / 341 * 150 = 88
+                                             * CPU1: 100 / 341 * 150 = 43
+                                    PP       * CPU2: 600 / 768 * 800 = 625
+       512  - - - - - -    - ##- - -PP -     * CPU3: 700 / 768 * 800 = 729
+                             ##     ##          => total_energy = 1485
+       341  ===========      ##     ##
+                             ##     ##
+       170  -## - - - -      ##     ##
+             ##     ##       ##     ##
+           ------------    -------------
+            CPU0   CPU1     CPU2   CPU3
+
+
+    Case 3. P stays on prev_cpu / CPU 0
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+      1024                 - - - - - - -
+
+                                            Energy calculation:
+       768                 =============     * CPU0: 400 / 512 * 300 = 234
+                                             * CPU1: 100 / 512 * 300 = 58
+                                             * CPU2: 600 / 768 * 800 = 625
+       512  ===========    - ##- - - - -     * CPU3: 500 / 768 * 800 = 520
+                             ##     ##          => total_energy = 1437
+       341  -PP - - - -      ##     ##
+             PP              ##     ##
+       170  -## - - - -      ##     ##
+             ##     ##       ##     ##
+           ------------    -------------
+            CPU0   CPU1     CPU2   CPU3
+
+
+    From these calculations, the Case 1 has the lowest total energy. So CPU 1
+    is be the best candidate from an energy-efficiency standpoint.
+
+Big CPUs are generally more power hungry than the little ones and are thus used
+mainly when a task doesn't fit the littles. However, little CPUs aren't always
+necessarily more energy-efficient than big CPUs. For some systems, the high OPPs
+of the little CPUs can be less energy-efficient than the lowest OPPs of the
+bigs, for example. So, if the little CPUs happen to have enough utilization at
+a specific point in time, a small task waking up at that moment could be better
+of executing on the big side in order to save energy, even though it would fit
+on the little side.
+
+And even in the case where all OPPs of the big CPUs are less energy-efficient
+than those of the little, using the big CPUs for a small task might still, under
+specific conditions, save energy. Indeed, placing a task on a little CPU can
+result in raising the OPP of the entire performance domain, and that will
+increase the cost of the tasks already running there. If the waking task is
+placed on a big CPU, its own execution cost might be higher than if it was
+running on a little, but it won't impact the other tasks of the little CPUs
+which will keep running at a lower OPP. So, when considering the total energy
+consumed by CPUs, the extra cost of running that one task on a big core can be
+smaller than the cost of raising the OPP on the little CPUs for all the other
+tasks.
+
+The examples above would be nearly impossible to get right in a generic way, and
+for all platforms, without knowing the cost of running at different OPPs on all
+CPUs of the system. Thanks to its EM-based design, EAS should cope with them
+correctly without too many troubles. However, in order to ensure a minimal
+impact on throughput for high-utilization scenarios, EAS also implements another
+mechanism called 'over-utilization'.
+
+
+5. Over-utilization
+-------------------
+
+From a general standpoint, the use-cases where EAS can help the most are those
+involving a light/medium CPU utilization. Whenever long CPU-bound tasks are
+being run, they will require all of the available CPU capacity, and there isn't
+much that can be done by the scheduler to save energy without severly harming
+throughput. In order to avoid hurting performance with EAS, CPUs are flagged as
+'over-utilized' as soon as they are used at more than 80% of their compute
+capacity. As long as no CPUs are over-utilized in a root domain, load balancing
+is disabled and EAS overridess the wake-up balancing code. EAS is likely to load
+the most energy efficient CPUs of the system more than the others if that can be
+done without harming throughput. So, the load-balancer is disabled to prevent
+it from breaking the energy-efficient task placement found by EAS. It is safe to
+do so when the system isn't overutilized since being below the 80% tipping point
+implies that:
+
+    a. there is some idle time on all CPUs, so the utilization signals used by
+       EAS are likely to accurately represent the 'size' of the various tasks
+       in the system;
+    b. all tasks should already be provided with enough CPU capacity,
+       regardless of their nice values;
+    c. since there is spare capacity all tasks must be blocking/sleeping
+       regularly and balancing at wake-up is sufficient.
+
+As soon as one CPU goes above the 80% tipping point, at least one of the three
+assumptions above becomes incorrect. In this scenario, the 'overutilized' flag
+is raised for the entire root domain, EAS is disabled, and the load-balancer is
+re-enabled. By doing so, the scheduler falls back onto load-based algorithms for
+wake-up and load balance under CPU-bound conditions. This provides a better
+respect of the nice values of tasks.
+
+Since the notion of overutilization largely relies on detecting whether or not
+there is some idle time in the system, the CPU capacity 'stolen' by higher
+(than CFS) scheduling classes (as well as IRQ) must be taken into account. As
+such, the detection of overutilization accounts for the capacity used not only
+by CFS tasks, but also by the other scheduling classes and IRQ.
+
+
+6. Dependencies and requirements for EAS
+----------------------------------------
+
+Energy Aware Scheduling depends on the CPUs of the system having specific
+hardware properties and on other features of the kernel being enabled. This
+section lists these dependencies and provides hints as to how they can be met.
+
+
+  6.1 - Asymmetric CPU topology
+
+As mentioned in the introduction, EAS is only supported on platforms with
+asymmetric CPU topologies for now. This requirement is checked at run-time by
+looking for the presence of the SD_ASYM_CPUCAPACITY flag when the scheduling
+domains are built.
+
+The flag is set/cleared automatically by the scheduler topology code whenever
+there are CPUs with different capacities in a root domain. The capacities of
+CPUs are provided by arch-specific code through the arch_scale_cpu_capacity()
+callback. As an example, arm and arm64 share an implementation of this callback
+which uses a combination of CPUFreq data and device-tree bindings to compute the
+capacity of CPUs (see drivers/base/arch_topology.c for more details).
+
+So, in order to use EAS on your platform your architecture must implement the
+arch_scale_cpu_capacity() callback, and some of the CPUs must have a lower
+capacity than others.
+
+Please note that EAS is not fundamentally incompatible with SMP, but no
+significant savings on SMP platforms have been observed yet. This restriction
+could be amended in the future if proven otherwise.
+
+
+  6.2 - Energy Model presence
+
+EAS uses the EM of a platform to estimate the impact of scheduling decisions on
+energy. So, your platform must provide power cost tables to the EM framework in
+order to make EAS start. To do so, please refer to documentation of the
+independent EM framework in Documentation/power/energy-model.txt.
+
+Please also note that the scheduling domains need to be re-built after the
+EM has been registered in order to start EAS.
+
+
+  6.3 - Energy Model complexity
+
+The task wake-up path is very latency-sensitive. When the EM of a platform is
+too complex (too many CPUs, too many performance domains, too many performance
+states, ...), the cost of using it in the wake-up path can become prohibitive.
+The energy-aware wake-up algorithm has a complexity of:
+
+	C = Nd * (Nc + Ns)
+
+with: Nd the number of performance domains; Nc the number of CPUs; and Ns the
+total number of OPPs (ex: for two perf. domains with 4 OPPs each, Ns = 8).
+
+A complexity check is performed at the root domain level, when scheduling
+domains are built. EAS will not start on a root domain if its C happens to be
+higher than the completely arbitrary EM_MAX_COMPLEXITY threshold (2048 at the
+time of writing).
+
+If you really want to use EAS but the complexity of your platform's Energy
+Model is too high to be used with a single root domain, you're left with only
+two possible options:
+
+    1. split your system into separate, smaller, root domains using exclusive
+       cpusets and enable EAS locally on each of them. This option has the
+       benefit to work out of the box but the drawback of preventing load
+       balance between root domains, which can result in an unbalanced system
+       overall;
+    2. submit patches to reduce the complexity of the EAS wake-up algorithm,
+       hence enabling it to cope with larger EMs in reasonable time.
+
+
+  6.4 - Schedutil governor
+
+EAS tries to predict at which OPP will the CPUs be running in the close future
+in order to estimate their energy consumption. To do so, it is assumed that OPPs
+of CPUs follow their utilization.
+
+Although it is very difficult to provide hard guarantees regarding the accuracy
+of this assumption in practice (because the hardware might not do what it is
+told to do, for example), schedutil as opposed to other CPUFreq governors at
+least _requests_ frequencies calculated using the utilization signals.
+Consequently, the only sane governor to use together with EAS is schedutil,
+because it is the only one providing some degree of consistency between
+frequency requests and energy predictions.
+
+Using EAS with any other governor than schedutil is not supported.
+
+
+  6.5 Scale-invariant utilization signals
+
+In order to make accurate prediction across CPUs and for all performance
+states, EAS needs frequency-invariant and CPU-invariant PELT signals. These can
+be obtained using the architecture-defined arch_scale{cpu,freq}_capacity()
+callbacks.
+
+Using EAS on a platform that doesn't implement these two callbacks is not
+supported.
+
+
+  6.6 Multithreading (SMT)
+
+EAS in its current form is SMT unaware and is not able to leverage
+multithreaded hardware to save energy. EAS considers threads as independent
+CPUs, which can actually be counter-productive for both performance and energy.
+
+EAS on SMT is not supported.
diff --git a/Documentation/scheduler/sched-tune.txt b/Documentation/scheduler/sched-tune.txt
new file mode 100644
index 0000000..1a10371
--- /dev/null
+++ b/Documentation/scheduler/sched-tune.txt
@@ -0,0 +1,388 @@
+             Central, scheduler-driven, power-performance control
+                               (EXPERIMENTAL)
+
+Abstract
+========
+
+The topic of a single simple power-performance tunable, that is wholly
+scheduler centric, and has well defined and predictable properties has come up
+on several occasions in the past [1,2]. With techniques such as a scheduler
+driven DVFS [3], we now have a good framework for implementing such a tunable.
+This document describes the overall ideas behind its design and implementation.
+
+
+Table of Contents
+=================
+
+1. Motivation
+2. Introduction
+3. Signal Boosting Strategy
+4. OPP selection using boosted CPU utilization
+5. Per task group boosting
+6. Per-task wakeup-placement-strategy Selection
+7. Question and Answers
+   - What about "auto" mode?
+   - What about boosting on a congested system?
+   - How CPUs are boosted when we have tasks with multiple boost values?
+8. References
+
+
+1. Motivation
+=============
+
+Schedutil [3] is a utilization-driven cpufreq governor which allows the
+scheduler to select the optimal DVFS operating point (OPP) for running a task
+allocated to a CPU.
+
+However, sometimes it may be desired to intentionally boost the performance of
+a workload even if that could imply a reasonable increase in energy
+consumption. For example, in order to reduce the response time of a task, we
+may want to run the task at a higher OPP than the one that is actually required
+by it's CPU bandwidth demand.
+
+This last requirement is especially important if we consider that one of the
+main goals of the utilization-driven governor component is to replace all
+currently available CPUFreq policies. Since schedutil is event-based, as
+opposed to the sampling driven governors we currently have, they are already
+more responsive at selecting the optimal OPP to run tasks allocated to a CPU.
+However, just tracking the actual task utilization may not be enough from a
+performance standpoint.  For example, it is not possible to get behaviors
+similar to those provided by the "performance" and "interactive" CPUFreq
+governors.
+
+This document describes an implementation of a tunable, stacked on top of the
+utilization-driven governor which extends its functionality to support task
+performance boosting.
+
+By "performance boosting" we mean the reduction of the time required to
+complete a task activation, i.e. the time elapsed from a task wakeup to its
+next deactivation (e.g. because it goes back to sleep or it terminates).  For
+example, if we consider a simple periodic task which executes the same workload
+for 5[s] every 20[s] while running at a certain OPP, a boosted execution of
+that task must complete each of its activations in less than 5[s].
+
+The rest of this document introduces in more details the proposed solution
+which has been named SchedTune.
+
+
+2. Introduction
+===============
+
+SchedTune exposes a simple user-space interface provided through a new
+CGroup controller 'stune' which provides two power-performance tunables
+per group:
+
+  /<stune cgroup mount point>/schedtune.prefer_idle
+  /<stune cgroup mount point>/schedtune.boost
+
+The CGroup implementation permits arbitrary user-space defined task
+classification to tune the scheduler for different goals depending on the
+specific nature of the task, e.g. background vs interactive vs low-priority.
+
+More details are given in section 5.
+
+2.1 Boosting
+============
+
+The boost value is expressed as an integer in the range [0..100].
+
+A value of 0 (default) configures the CFS scheduler for maximum energy
+efficiency. This means that schedutil runs the tasks at the minimum OPP
+required to satisfy their workload demand.
+
+A value of 100 configures scheduler for maximum performance, which translates
+to the selection of the maximum OPP on that CPU.
+
+The range between 0 and 100 can be set to satisfy other scenarios suitably. For
+example to satisfy interactive response or depending on other system events
+(battery level etc).
+
+The overall design of the SchedTune module is built on top of "Per-Entity Load
+Tracking" (PELT) signals and schedutil by introducing a bias on the OPP
+selection.
+
+Each time a task is allocated on a CPU, cpufreq is given the opportunity to tune
+the operating frequency of that CPU to better match the workload demand. The
+selection of the actual OPP being activated is influenced by the boost value
+for the task CGroup.
+
+This simple biasing approach leverages existing frameworks, which means minimal
+modifications to the scheduler, and yet it allows to achieve a range of
+different behaviours all from a single simple tunable knob.
+
+In EAS schedulers, we use boosted task and CPU utilization for energy
+calculation and energy-aware task placement.
+
+2.2 prefer_idle
+===============
+
+This is a flag which indicates to the scheduler that userspace would like
+the scheduler to focus on energy or to focus on performance.
+
+A value of 0 (default) signals to the CFS scheduler that tasks in this group
+can be placed according to the energy-aware wakeup strategy.
+
+A value of 1 signals to the CFS scheduler that tasks in this group should be
+placed to minimise wakeup latency.
+
+Android platforms typically use this flag for application tasks which the
+user is currently interacting with.
+
+
+3. Signal Boosting Strategy
+===========================
+
+The whole PELT machinery works based on the value of a few load tracking signals
+which basically track the CPU bandwidth requirements for tasks and the capacity
+of CPUs. The basic idea behind the SchedTune knob is to artificially inflate
+some of these load tracking signals to make a task or RQ appears more demanding
+that it actually is.
+
+Which signals have to be inflated depends on the specific "consumer".  However,
+independently from the specific (signal, consumer) pair, it is important to
+define a simple and possibly consistent strategy for the concept of boosting a
+signal.
+
+A boosting strategy defines how the "abstract" user-space defined
+sched_cfs_boost value is translated into an internal "margin" value to be added
+to a signal to get its inflated value:
+
+  margin         := boosting_strategy(sched_cfs_boost, signal)
+  boosted_signal := signal + margin
+
+The boosting strategy currently implemented in SchedTune is called 'Signal
+Proportional Compensation' (SPC). With SPC, the sched_cfs_boost value is used to
+compute a margin which is proportional to the complement of the original signal.
+When a signal has a maximum possible value, its complement is defined as
+the delta from the actual value and its possible maximum.
+
+Since the tunable implementation uses signals which have SCHED_CAPACITY_SCALE as
+the maximum possible value, the margin becomes:
+
+	margin := sched_cfs_boost * (SCHED_CAPACITY_SCALE - signal)
+
+Using this boosting strategy:
+- a 100% sched_cfs_boost means that the signal is scaled to the maximum value
+- each value in the range of sched_cfs_boost effectively inflates the signal in
+  question by a quantity which is proportional to the maximum value.
+
+For example, by applying the SPC boosting strategy to the selection of the OPP
+to run a task it is possible to achieve these behaviors:
+
+-   0% boosting: run the task at the minimum OPP required by its workload
+- 100% boosting: run the task at the maximum OPP available for the CPU
+-  50% boosting: run at the half-way OPP between minimum and maximum
+
+Which means that, at 50% boosting, a task will be scheduled to run at half of
+the maximum theoretically achievable performance on the specific target
+platform.
+
+A graphical representation of an SPC boosted signal is represented in the
+following figure where:
+ a) "-" represents the original signal
+ b) "b" represents a  50% boosted signal
+ c) "p" represents a 100% boosted signal
+
+
+   ^
+   |  SCHED_CAPACITY_SCALE
+   +-----------------------------------------------------------------+
+   |pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
+   |
+   |                                             boosted_signal
+   |                                          bbbbbbbbbbbbbbbbbbbbbbbb
+   |
+   |                                            original signal
+   |                  bbbbbbbbbbbbbbbbbbbbbbbb+----------------------+
+   |                                          |
+   |bbbbbbbbbbbbbbbbbb                        |
+   |                                          |
+   |                                          |
+   |                                          |
+   |                  +-----------------------+
+   |                  |
+   |                  |
+   |                  |
+   |------------------+
+   |
+   |
+   +----------------------------------------------------------------------->
+
+The plot above shows a ramped load signal (titled 'original_signal') and it's
+boosted equivalent. For each step of the original signal the boosted signal
+corresponding to a 50% boost is midway from the original signal and the upper
+bound. Boosting by 100% generates a boosted signal which is always saturated to
+the upper bound.
+
+
+4. OPP selection using boosted CPU utilization
+==============================================
+
+It is worth calling out that the implementation does not introduce any new load
+signals. Instead, it provides an API to tune existing signals. This tuning is
+done on demand and only in scheduler code paths where it is sensible to do so.
+The new API calls are defined to return either the default signal or a boosted
+one, depending on the value of sched_cfs_boost. This is a clean an non invasive
+modification of the existing existing code paths.
+
+The signal representing a CPU's utilization is boosted according to the
+previously described SPC boosting strategy. To schedutil, this allows a CPU
+(ie CFS run-queue) to appear more used then it actually is.
+
+Thus, with the sched_cfs_boost enabled we have the following main functions to
+get the current utilization of a CPU:
+
+  cpu_util()
+  boosted_cpu_util()
+
+The new boosted_cpu_util() is similar to the first but returns a boosted
+utilization signal which is a function of the sched_cfs_boost value.
+
+This function is used in the CFS scheduler code paths where schedutil needs to
+decide the OPP to run a CPU at. For example, this allows selecting the highest
+OPP for a CPU which has the boost value set to 100%.
+
+
+5. Per task group boosting
+==========================
+
+On battery powered devices there usually are many background services which are
+long running and need energy efficient scheduling. On the other hand, some
+applications are more performance sensitive and require an interactive
+response and/or maximum performance, regardless of the energy cost.
+
+To better service such scenarios, the SchedTune implementation has an extension
+that provides a more fine grained boosting interface.
+
+A new CGroup controller, namely "schedtune", can be enabled which allows to
+defined and configure task groups with different boosting values.
+Tasks that require special performance can be put into separate CGroups.
+The value of the boost associated with the tasks in this group can be specified
+using a single knob exposed by the CGroup controller:
+
+   schedtune.boost
+
+This knob allows the definition of a boost value that is to be used for
+SPC boosting of all tasks attached to this group.
+
+The current schedtune controller implementation is really simple and has these
+main characteristics:
+
+  1) It is only possible to create 1 level depth hierarchies
+
+     The root control groups define the system-wide boost value to be applied
+     by default to all tasks. Its direct subgroups are named "boost groups" and
+     they define the boost value for specific set of tasks.
+     Further nested subgroups are not allowed since they do not have a sensible
+     meaning from a user-space standpoint.
+
+  2) It is possible to define only a limited number of "boost groups"
+
+     This number is defined at compile time and by default configured to 16.
+     This is a design decision motivated by two main reasons:
+     a) In a real system we do not expect utilization scenarios with more than
+        a few boost groups. For example, a reasonable collection of groups could
+        be just "background", "interactive" and "performance".
+     b) It simplifies the implementation considerably, especially for the code
+	which has to compute the per CPU boosting once there are multiple
+        RUNNABLE tasks with different boost values.
+
+Such a simple design should allow servicing the main utilization scenarios
+identified so far. It provides a simple interface which can be used to manage
+the power-performance of all tasks or only selected tasks.
+Moreover, this interface can be easily integrated by user-space run-times (e.g.
+Android, ChromeOS) to implement a QoS solution for task boosting based on tasks
+classification, which has been a long standing requirement.
+
+Setup and usage
+---------------
+
+0. Use a kernel with CONFIG_SCHED_TUNE support enabled
+
+1. Check that the "schedtune" CGroup controller is available:
+
+   root@linaro-nano:~# cat /proc/cgroups
+   #subsys_name	hierarchy	num_cgroups	enabled
+   cpuset  	0		1		1
+   cpu     	0		1		1
+   schedtune	0		1		1
+
+2. Mount a tmpfs to create the CGroups mount point (Optional)
+
+   root@linaro-nano:~# sudo mount -t tmpfs cgroups /sys/fs/cgroup
+
+3. Mount the "schedtune" controller
+
+   root@linaro-nano:~# mkdir /sys/fs/cgroup/stune
+   root@linaro-nano:~# sudo mount -t cgroup -o schedtune stune /sys/fs/cgroup/stune
+
+4. Create task groups and configure their specific boost value (Optional)
+
+   For example here we create a "performance" boost group configure to boost
+   all its tasks to 100%
+
+   root@linaro-nano:~# mkdir /sys/fs/cgroup/stune/performance
+   root@linaro-nano:~# echo 100 > /sys/fs/cgroup/stune/performance/schedtune.boost
+
+5. Move tasks into the boost group
+
+   For example, the following moves the tasks with PID $TASKPID (and all its
+   threads) into the "performance" boost group.
+
+   root@linaro-nano:~# echo "TASKPID > /sys/fs/cgroup/stune/performance/cgroup.procs
+
+This simple configuration allows only the threads of the $TASKPID task to run,
+when needed, at the highest OPP in the most capable CPU of the system.
+
+
+6. Per-task wakeup-placement-strategy Selection
+===============================================
+
+Many devices have a number of CFS tasks in use which require an absolute
+minimum wakeup latency, and many tasks for which wakeup latency is not
+important.
+
+For touch-driven environments, removing additional wakeup latency can be
+critical.
+
+When you use the Schedtume CGroup controller, you have access to a second
+parameter which allows a group to be marked such that energy_aware task
+placement is bypassed for tasks belonging to that group.
+
+prefer_idle=0 (default - use energy-aware task placement if available)
+prefer_idle=1 (never use energy-aware task placement for these tasks)
+
+Since the regular wakeup task placement algorithm in CFS is biased for
+performance, this has the effect of restoring minimum wakeup latency
+for the desired tasks whilst still allowing energy-aware wakeup placement
+to save energy for other tasks.
+
+
+7. Question and Answers
+=======================
+
+What about "auto" mode?
+-----------------------
+
+The 'auto' mode as described in [5] can be implemented by interfacing SchedTune
+with some suitable user-space element. This element could use the exposed
+system-wide or cgroup based interface.
+
+How are multiple groups of tasks with different boost values managed?
+---------------------------------------------------------------------
+
+The current SchedTune implementation keeps track of the boosted RUNNABLE tasks
+on a CPU. The CPU utilization seen by schedutil (and used to select an
+appropriate OPP) is boosted with a value which is the maximum of the boost
+values of the currently RUNNABLE tasks in its RQ.
+
+This allows cpufreq to boost a CPU only while there are boosted tasks ready
+to run and switch back to the energy efficient mode as soon as the last boosted
+task is dequeued.
+
+
+8. References
+=============
+[1] http://lwn.net/Articles/552889
+[2] http://lkml.org/lkml/2012/5/18/91
+[3] https://lkml.org/lkml/2016/3/29/1041
diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
index 37a6795..0e4a812 100644
--- a/Documentation/sysctl/kernel.txt
+++ b/Documentation/sysctl/kernel.txt
@@ -693,7 +693,8 @@
 perf_event_paranoid:
 
 Controls use of the performance events system by unprivileged
-users (without CAP_SYS_ADMIN).  The default value is 2.
+users (without CAP_SYS_ADMIN).  The default value is 3 if
+CONFIG_SECURITY_PERF_EVENTS_RESTRICT is set, or 2 otherwise.
 
  -1: Allow use of (almost) all events by all users
      Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
@@ -701,6 +702,7 @@
      Disallow raw tracepoint access by users without CAP_SYS_ADMIN
 >=1: Disallow CPU event access by users without CAP_SYS_ADMIN
 >=2: Disallow kernel profiling by users without CAP_SYS_ADMIN
+>=3: Disallow all event access by users without CAP_SYS_ADMIN
 
 ==============================================================
 
diff --git a/Documentation/sysctl/vm.txt b/Documentation/sysctl/vm.txt
index 7d73882..a48baf2 100644
--- a/Documentation/sysctl/vm.txt
+++ b/Documentation/sysctl/vm.txt
@@ -31,6 +31,7 @@
 - dirty_writeback_centisecs
 - drop_caches
 - extfrag_threshold
+- extra_free_kbytes
 - hugetlb_shm_group
 - laptop_mode
 - legacy_va_layout
@@ -274,6 +275,21 @@
 
 ==============================================================
 
+extra_free_kbytes
+
+This parameter tells the VM to keep extra free memory between the threshold
+where background reclaim (kswapd) kicks in, and the threshold where direct
+reclaim (by allocating processes) kicks in.
+
+This is useful for workloads that require low latency memory allocations
+and have a bounded burstiness in memory allocations, for example a
+realtime application that receives and transmits network traffic
+(causing in-kernel memory allocations) with a maximum total message burst
+size of 200MB may need 200MB of extra free memory to avoid direct reclaim
+related latencies.
+
+==============================================================
+
 hugetlb_shm_group
 
 hugetlb_shm_group contains group id that is allowed to create SysV
diff --git a/MAINTAINERS b/MAINTAINERS
index d735500..d7a8e8e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5999,6 +5999,7 @@
 S:	Supported
 F:	fs/crypto/
 F:	include/linux/fscrypt*.h
+F:	include/uapi/linux/fscrypt.h
 F:	Documentation/filesystems/fscrypt.rst
 
 FSI-ATTACHED I2C DRIVER
@@ -6017,6 +6018,18 @@
 F:	fs/notify/
 F:	include/linux/fsnotify*.h
 
+FSVERITY: READ-ONLY FILE-BASED AUTHENTICITY PROTECTION
+M:	Eric Biggers <ebiggers@kernel.org>
+M:	Theodore Y. Ts'o <tytso@mit.edu>
+L:	linux-fscrypt@vger.kernel.org
+Q:	https://patchwork.kernel.org/project/linux-fscrypt/list/
+T:	git git://git.kernel.org/pub/scm/fs/fscrypt/fscrypt.git fsverity
+S:	Supported
+F:	fs/verity/
+F:	include/linux/fsverity.h
+F:	include/uapi/linux/fsverity.h
+F:	Documentation/filesystems/fsverity.rst
+
 FUJITSU LAPTOP EXTRAS
 M:	Jonathan Woithe <jwoithe@just42.net>
 L:	platform-driver-x86@vger.kernel.org
diff --git a/Makefile b/Makefile
index 080232ef..b4747ae 100644
--- a/Makefile
+++ b/Makefile
@@ -483,7 +483,11 @@
 
 ifeq ($(cc-name),clang)
 ifneq ($(CROSS_COMPILE),)
-CLANG_FLAGS	+= --target=$(notdir $(CROSS_COMPILE:%-=%))
+CLANG_TRIPLE	?= $(CROSS_COMPILE)
+CLANG_FLAGS	+= --target=$(notdir $(CLANG_TRIPLE:%-=%))
+ifeq ($(shell $(srctree)/scripts/clang-android.sh $(CC) $(CLANG_FLAGS)), y)
+$(error "Clang with Android --target detected. Did you specify CLANG_TRIPLE?")
+endif
 GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
 CLANG_FLAGS	+= --prefix=$(GCC_TOOLCHAIN_DIR)
 GCC_TOOLCHAIN	:= $(realpath $(GCC_TOOLCHAIN_DIR)/..)
@@ -606,6 +610,16 @@
   CC_FLAGS_FTRACE := -pg
 endif
 
+# Make toolchain changes before including arch/$(SRCARCH)/Makefile to ensure
+# ar/cc/ld-* macros return correct values.
+ifdef CONFIG_LTO_CLANG
+# use llvm-ar for building symbol tables from IR files, and llvm-nm instead
+# of objdump for processing symbol versions and exports
+LLVM_AR		:= llvm-ar
+LLVM_NM		:= llvm-nm
+export LLVM_AR LLVM_NM
+endif
+
 # The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
 # values of the respective KBUILD_* variables
 ARCH_CPPFLAGS :=
@@ -672,6 +686,12 @@
 # Tell gcc to never replace conditional load with a non-conditional one
 KBUILD_CFLAGS	+= $(call cc-option,--param=allow-store-data-races=0)
 
+# check for 'asm goto'
+ifeq ($(call shell-cached,$(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLAGS)), y)
+	KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTO
+	KBUILD_AFLAGS += -DCC_HAVE_ASM_GOTO
+endif
+
 include scripts/Makefile.kcov
 include scripts/Makefile.gcc-plugins
 
@@ -727,6 +747,11 @@
 endif
 endif
 
+# Initialize all stack variables with a pattern, if desired.
+ifdef CONFIG_INIT_STACK_ALL
+KBUILD_CFLAGS  += -ftrivial-auto-var-init=pattern
+endif
+
 KBUILD_CFLAGS   += $(call cc-option, -fno-var-tracking-assignments)
 
 ifdef CONFIG_DEBUG_INFO
@@ -787,6 +812,68 @@
 LDFLAGS_vmlinux += --gc-sections
 endif
 
+ifdef CONFIG_LTO_CLANG
+ifdef CONFIG_THINLTO
+lto-clang-flags	:= -flto=thin
+KBUILD_LDFLAGS	+= --thinlto-cache-dir=.thinlto-cache
+else
+lto-clang-flags	:= -flto
+endif
+lto-clang-flags += -fvisibility=default $(call cc-option, -fsplit-lto-unit)
+
+# Limit inlining across translation units to reduce binary size
+LD_FLAGS_LTO_CLANG := -mllvm -import-instr-limit=5
+
+KBUILD_LDFLAGS += $(LD_FLAGS_LTO_CLANG)
+KBUILD_LDFLAGS_MODULE += $(LD_FLAGS_LTO_CLANG)
+
+KBUILD_LDS_MODULE += $(srctree)/scripts/module-lto.lds
+
+# allow disabling only clang LTO where needed
+DISABLE_LTO_CLANG := -fno-lto
+export DISABLE_LTO_CLANG
+endif
+
+ifdef CONFIG_LTO
+LTO_CFLAGS	:= $(lto-clang-flags)
+KBUILD_CFLAGS	+= $(LTO_CFLAGS)
+
+DISABLE_LTO	:= $(DISABLE_LTO_CLANG)
+export LTO_CFLAGS DISABLE_LTO
+endif
+
+ifdef CONFIG_CFI_CLANG
+cfi-clang-flags	+= -fsanitize=cfi -fno-sanitize-cfi-canonical-jump-tables
+DISABLE_CFI_CLANG := -fno-sanitize=cfi
+ifdef CONFIG_MODULES
+cfi-clang-flags	+= -fsanitize-cfi-cross-dso
+DISABLE_CFI_CLANG += -fno-sanitize-cfi-cross-dso
+endif
+ifdef CONFIG_CFI_PERMISSIVE
+cfi-clang-flags	+= -fsanitize-recover=cfi -fno-sanitize-trap=cfi
+endif
+
+# also disable CFI when LTO is disabled
+DISABLE_LTO_CLANG += $(DISABLE_CFI_CLANG)
+# allow disabling only clang CFI where needed
+export DISABLE_CFI_CLANG
+endif
+
+ifdef CONFIG_CFI
+CFI_CFLAGS	:= $(cfi-clang-flags)
+KBUILD_CFLAGS	+= $(CFI_CFLAGS)
+
+DISABLE_CFI	:= $(DISABLE_CFI_CLANG)
+DISABLE_LTO	+= $(DISABLE_CFI)
+export CFI_CFLAGS DISABLE_CFI
+endif
+
+ifdef CONFIG_SHADOW_CALL_STACK
+CC_FLAGS_SCS	:= -fsanitize=shadow-call-stack
+KBUILD_CFLAGS	+= $(CC_FLAGS_SCS)
+export CC_FLAGS_SCS
+endif
+
 # arch Makefile may override CC so keep this after arch Makefile is included
 NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
 
@@ -863,6 +950,10 @@
 LDFLAGS_vmlinux	+= $(call ld-option, -X,)
 endif
 
+ifeq ($(CONFIG_RELR),y)
+LDFLAGS_vmlinux	+= --pack-dyn-relocs=relr
+endif
+
 # insure the checker run with the right endianness
 CHECKFLAGS += $(if $(CONFIG_CPU_BIG_ENDIAN),-mbig-endian,-mlittle-endian)
 
@@ -1579,7 +1670,8 @@
 		-o -name modules.builtin -o -name '.tmp_*.o.*' \
 		-o -name '*.c.[012]*.*' \
 		-o -name '*.ll' \
-		-o -name '*.gcno' \) -type f -print | xargs rm -f
+		-o -name '*.gcno' \
+		-o -name '*.*.symversions' \) -type f -print | xargs rm -f
 
 # Generate tags for editors
 # ---------------------------------------------------------------------------
diff --git a/abi_gki_aarch64.xml b/abi_gki_aarch64.xml
new file mode 100644
index 0000000..7b15512
--- /dev/null
+++ b/abi_gki_aarch64.xml
@@ -0,0 +1,58277 @@
+<abi-corpus-group architecture='elf-arm-aarch64'>
+  <abi-corpus path='vmlinux' architecture='elf-arm-aarch64'>
+    <elf-function-symbols>
+      <elf-symbol name='PDE_DATA' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='___ratelimit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__alloc_disk_node' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__alloc_pages_nodemask' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__alloc_percpu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__alloc_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__alloc_workqueue_key' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__blk_mq_end_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__cfi_slowpath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__check_object_size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__class_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__class_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__const_udelay' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__cpuhp_remove_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__cpuhp_setup_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__cpuhp_state_add_instance' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__cpuhp_state_remove_instance' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__dev_get_by_index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__dev_kfree_skb_any' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__devm_request_region' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__devm_reset_control_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__devres_alloc_node' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__drm_printfn_debug' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ethtool_get_link_ksettings' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__free_pages' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__get_task_comm' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__hvc_resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__init_waitqueue_head' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ioremap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__iounmap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__kmalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc___cmpxchg_case_mb_4' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc___cmpxchg_case_mb_8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc_atomic64_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc_atomic64_add_return_relaxed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc_atomic64_andnot' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc_atomic64_fetch_or' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc_atomic64_or' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc_atomic_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc_atomic_add_return' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc_atomic_sub' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__ll_sc_atomic_sub_return' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__local_bh_enable_ip' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__memcpy_fromio' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__memcpy_toio' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__memset_io' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__module_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__msecs_to_jiffies' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__mutex_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__napi_alloc_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__napi_schedule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__netdev_alloc_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__netif_set_xps_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__netlink_dump_start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__nlmsg_put' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__pci_register_driver' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__platform_driver_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__pm_runtime_disable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__pm_runtime_idle' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__pm_runtime_resume' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__pm_runtime_set_status' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__pm_runtime_suspend' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__pm_runtime_use_autosuspend' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__put_cred' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__put_page' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__rcu_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__rcu_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__refrigerator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__register_chrdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__request_module' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__rtc_register_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__skb_flow_dissect' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__sock_recv_ts_and_drops' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__sock_tx_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__splice_from_pipe' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__stack_chk_fail' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__sw_hweight64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__sysfs_match_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__tasklet_hi_schedule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__tasklet_schedule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__unregister_chrdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__wake_up' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='__warn_printk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_copy_from_iter_full' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_copy_to_iter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_dev_err' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_dev_info' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_dev_notice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_dev_warn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_spin_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_spin_lock_bh' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_spin_lock_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_spin_lock_irqsave' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_spin_trylock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_spin_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_spin_unlock_bh' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_spin_unlock_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_spin_unlock_irqrestore' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_write_lock_bh' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='_raw_write_unlock_bh' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='add_timer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='add_uevent_var' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='add_wait_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='alloc_chrdev_region' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='alloc_etherdev_mqs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='alloc_netdev_mqs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='alloc_pages_exact' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='arch_bpf_jit_check_func' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='autoremove_wake_function' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='bcmp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_cleanup_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_execute_rq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_get_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_get_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_alloc_tag_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_complete_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_end_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_free_tag_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_init_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_quiesce_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_requeue_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_run_hw_queues' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_start_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_start_stopped_hw_queues' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_stop_hw_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_unquiesce_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_mq_virtio_map_queues' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_put_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_put_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_alignment_offset' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_bounce_limit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_flag_clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_flag_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_io_min' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_io_opt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_logical_block_size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_max_discard_sectors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_max_hw_sectors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_max_segment_size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_max_segments' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_physical_block_size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_rq_timeout' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_queue_write_cache' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_rq_map_kern' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_rq_map_sg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_status_to_errno' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='blk_update_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='bpf_prog_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='bpf_prog_put' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='bpf_prog_sub' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='bpf_trace_run10' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='bpf_trace_run2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='bpf_trace_run8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='bpf_warn_invalid_xdp_action' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='build_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='bus_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='bus_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='call_netdevice_notifiers' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cancel_delayed_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cancel_delayed_work_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cancel_work_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='capable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cdev_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cdev_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cdev_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cdev_device_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cdev_device_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cdev_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cfg80211_connect_done' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cfg80211_disconnected' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cfg80211_inform_bss_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cfg80211_put_bss' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cfg80211_scan_done' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='check_disk_change' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='class_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='class_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='clk_disable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='clk_enable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='clk_get_rate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='clk_prepare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='clk_unprepare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='complete' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='complete_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='completion_done' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='consume_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cpufreq_register_driver' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cpufreq_unregister_driver' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cpumask_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cpumask_next_wrap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cpus_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='cpus_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='crypto_dequeue_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='crypto_enqueue_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='crypto_init_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='crypto_register_alg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='crypto_unregister_alg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='datagram_poll' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='debug_smp_processor_id' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='debugfs_create_dir' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='debugfs_create_file' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='debugfs_create_x32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='debugfs_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='debugfs_remove_recursive' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='default_llseek' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='default_wake_function' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='del_gendisk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='del_timer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='del_timer_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='delayed_work_timer_fn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='destroy_workqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_add_pack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_close' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_driver_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_fwnode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_get_by_index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_get_by_index_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_get_stats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_mc_sync_multiple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_mc_unsync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_open' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_pm_domain_attach' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_pm_domain_detach' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_printk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_queue_xmit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_remove_pack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_set_mtu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_set_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_uc_sync_multiple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dev_uc_unsync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_add_disk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_create_file' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_for_each_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_initialize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_property_present' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_property_read_u32_array' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_remove_file' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='device_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devm_clk_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devm_gpio_request_one' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devm_gpiod_get_index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devm_ioremap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devm_ioremap_resource' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devm_kfree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devm_kmalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devm_regulator_get_optional' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devm_request_threaded_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devm_rtc_allocate_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devres_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devres_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='devres_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='disable_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_alloc_from_dev_coherent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_buf_export' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_buf_fd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_buf_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_buf_put' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_fence_context_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_fence_enable_sw_signaling' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_fence_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_fence_match_context' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_fence_release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_fence_signal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_fence_signal_locked' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_fence_wait_timeout' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='dma_release_from_dev_coherent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='driver_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='driver_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_add_edid_modes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_add_modes_noedid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_cleanup_planes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_commit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_commit_hw_done' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_commit_modeset_disables' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_commit_modeset_enables' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_commit_planes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_connector_destroy_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_connector_duplicate_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_connector_reset' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_crtc_destroy_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_crtc_duplicate_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_crtc_reset' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_disable_plane' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_page_flip' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_plane_destroy_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_plane_duplicate_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_plane_reset' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_set_config' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_shutdown' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_update_plane' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_atomic_helper_wait_for_vblanks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_class_device_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_class_device_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_clflush_pages' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_compat_ioctl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_connector_attach_edid_property' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_connector_attach_encoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_connector_cleanup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_connector_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_connector_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_connector_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_connector_update_edid_property' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_crtc_cleanup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_crtc_init_with_planes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_crtc_send_vblank_event' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_cvt_mode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_dbg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_debugfs_create_files' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_dev_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_dev_put' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_dev_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_dev_set_unique' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_do_get_edid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_encoder_cleanup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_encoder_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_err' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_framebuffer_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_fb_create_handle' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_fb_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_handle_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_object_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_object_lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_object_put_unlocked' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_object_release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_prime_export' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_prime_fd_to_handle' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_prime_handle_to_fd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_prime_import' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_gem_prime_mmap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_global_item_ref' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_global_item_unref' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_helper_hpd_irq_event' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_helper_mode_fill_fb_struct' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_helper_probe_single_connector_modes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_ht_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_ht_find_item' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_ht_insert_item' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_ht_just_insert_please' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_ht_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_ht_remove_item' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_ioctl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_kms_helper_hotplug_event' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_mm_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_mm_insert_node_in_range' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_mm_print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_mm_remove_node' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_mm_takedown' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_mode_config_cleanup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_mode_config_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_mode_config_reset' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_mode_probed_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_open' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_plane_cleanup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_poll' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_prime_pages_to_sg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_put_dev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_read' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_set_preferred_mode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_universal_plane_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_vma_offset_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_vma_offset_lookup_locked' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_vma_offset_manager_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_vma_offset_manager_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='drm_vma_offset_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='eth_commit_mac_addr_change' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='eth_prepare_mac_addr_change' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='eth_type_trans' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='eth_validate_addr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ether_setup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ethtool_op_get_link' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ethtool_op_get_ts_info' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='event_triggers_call' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='fasync_helper' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='fd_install' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='finish_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='flush_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='flush_workqueue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='fput' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='free_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='free_netdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='free_pages_exact' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='free_percpu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='freezing_slow_path' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='fsl8250_handle_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='generic_file_llseek' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='get_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='get_random_bytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='get_unused_fd_flags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='gpio_to_desc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='gpiod_cansleep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='gpiod_get_raw_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='gpiod_get_raw_value_cansleep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='gpiod_get_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='gpiod_get_value_cansleep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='gpiod_is_active_low' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='gpiod_set_debounce' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='gpiod_to_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hrtimer_active' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hrtimer_cancel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hrtimer_forward' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hrtimer_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hrtimer_start_range_ns' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hvc_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hvc_instantiate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hvc_kick' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hvc_poll' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hvc_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hwrng_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='hwrng_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ida_alloc_range' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ida_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ida_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='init_timer_key' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='init_wait_entry' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='input_alloc_absinfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='input_allocate_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='input_event' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='input_free_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='input_mt_init_slots' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='input_register_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='input_set_abs_params' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='input_unregister_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='irq_dispose_mapping' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='irq_set_affinity_hint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='irq_set_irq_wake' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='jiffies_to_msecs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kfree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kfree_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kfree_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kill_fasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kmalloc_order_trace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kmem_cache_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kmem_cache_alloc_trace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kmem_cache_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kmem_cache_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kmem_cache_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kmemdup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kobject_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kobject_init_and_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kobject_put' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kobject_uevent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kobject_uevent_env' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kstrtoull' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kthread_create_on_node' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kthread_create_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kthread_destroy_worker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kthread_queue_work' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kthread_should_stop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kthread_stop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ktime_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ktime_get_real_seconds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ktime_get_ts64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ktime_get_with_offset' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kvfree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kvmalloc_node' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='kzfree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='led_classdev_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='led_trigger_event' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='led_trigger_register_simple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='led_trigger_unregister_simple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='lock_sock_nested' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='mark_page_accessed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='memdup_user' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='memparse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='memzero_explicit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='misc_deregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='misc_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='mod_timer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='module_put' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='msleep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='mutex_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='mutex_lock_interruptible' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='mutex_trylock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='mutex_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='napi_complete_done' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='napi_consume_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='napi_disable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='napi_gro_receive' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='napi_hash_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='napi_schedule_prep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='net_ratelimit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_change_features' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_err' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_increment_features' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_info' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_lower_state_changed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_master_upper_dev_link' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_notify_peers' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_rx_handler_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_rx_handler_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_upper_dev_link' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_upper_dev_unlink' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netdev_warn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_carrier_off' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_carrier_on' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_device_attach' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_device_detach' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_napi_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_napi_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_receive_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_rx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_rx_ni' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_schedule_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_set_real_num_rx_queues' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_set_real_num_tx_queues' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_stacked_transfer_operstate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_tx_stop_all_queues' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netif_tx_wake_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='netlink_capable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='nf_conntrack_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='nla_memcpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='nla_parse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='nla_put' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='no_llseek' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='nonseekable_open' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='noop_llseek' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='nsecs_to_jiffies' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_address_to_resource' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_alias_get_id' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_device_is_big_endian' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_device_is_compatible' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_find_property' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_get_child_by_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_get_next_child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_get_property' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_irq_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_led_classdev_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_match_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_parse_phandle' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_property_read_u64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='of_property_read_variable_u32_array' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='panic' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='passthru_features_check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_alloc_irq_vectors_affinity' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_disable_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_enable_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_find_capability' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_find_ext_capability' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_find_next_capability' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_free_irq_vectors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_iomap_range' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_irq_get_affinity' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_irq_vector' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_read_config_byte' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_read_config_dword' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_release_selected_regions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_request_selected_regions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_set_master' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pci_unregister_driver' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='perf_trace_buf_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='perf_trace_run_bpf_submit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pipe_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pipe_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='platform_device_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='platform_device_add_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='platform_device_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='platform_device_del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='platform_device_put' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='platform_device_register_full' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='platform_device_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='platform_driver_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='platform_get_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='platform_get_resource' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pm_generic_resume' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pm_generic_runtime_resume' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pm_generic_runtime_suspend' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pm_generic_suspend' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pm_runtime_enable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pm_runtime_set_autosuspend_delay' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='pm_wakeup_dev_event' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='prandom_u32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='preempt_count_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='preempt_count_sub' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='preempt_schedule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='preempt_schedule_notrace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='prepare_to_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='prepare_to_wait_event' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='printk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='proc_create_net_single' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='proc_mkdir_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='proto_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='proto_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='put_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='put_disk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='put_unused_fd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='queue_delayed_work_on' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='queue_work_on' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rcu_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='refcount_dec_and_test_checked' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='refcount_inc_checked' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='refcount_inc_not_zero_checked' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='register_blkdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='register_netdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='register_netdevice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='register_netdevice_notifier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='register_pernet_subsys' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='register_pm_notifier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='register_shrinker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='regulator_count_voltages' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='regulator_disable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='regulator_enable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='regulator_get_current_limit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='regulator_get_voltage' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='regulator_is_supported_voltage' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='regulator_list_voltage' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='regulator_set_voltage' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='release_sock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='remove_conflicting_framebuffers' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='remove_proc_entry' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='remove_wait_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='request_threaded_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='reservation_object_add_excl_fence' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='reservation_object_add_shared_fence' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='reservation_object_copy_fences' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='reservation_object_reserve_shared' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='reservation_object_test_signaled_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='reservation_object_wait_timeout_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='reset_control_assert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='reset_control_deassert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='revalidate_disk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='round_jiffies' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtc_time64_to_tm' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtc_tm_to_time64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtc_update_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtnl_is_locked' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtnl_link_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtnl_link_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtnl_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtnl_register_module' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtnl_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtnl_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='rtnl_unregister_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sched_setscheduler' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='schedule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='schedule_timeout' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='scnprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='security_sock_graft' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='send_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='seq_lseek' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='seq_printf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='seq_putc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='seq_puts' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='seq_read' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='serial8250_get_port' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='serial8250_register_8250_port' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='serial8250_resume_port' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='serial8250_suspend_port' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='serial8250_unregister_port' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='set_disk_ro' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='set_page_dirty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_alloc_table' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_alloc_table_from_pages' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_copy_from_buffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_copy_to_buffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_free_table' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_init_one' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_init_table' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_miter_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_miter_start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_miter_stop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_nents' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_nents_for_len' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sg_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='shmem_file_setup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='shmem_read_mapping_page_gfp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='si_mem_available' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='si_meminfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='simple_attr_open' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='simple_attr_read' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='simple_attr_release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='simple_attr_write' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='simple_read_from_buffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='simple_strtoul' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='single_open' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='single_release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sk_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sk_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_add_rx_frag' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_clone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_coalesce_rx_frag' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_dequeue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_free_datagram' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_page_frag_refill' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_partial_csum_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_put' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_queue_purge' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_queue_tail' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_recv_datagram' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_to_sgvec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_trim' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='skb_tstamp_tx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='snprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_alloc_send_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_diag_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_diag_save_cookie' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_diag_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_efree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_get_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_i_ino' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_init_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_accept' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_bind' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_connect' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_getname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_getsockopt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_ioctl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_listen' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_mmap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_sendpage' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_setsockopt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_shutdown' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_no_socketpair' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_queue_rcv_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sock_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sscanf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='strcpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='string_get_size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='strlcpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='strncpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='strstr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='swiotlb_max_segment' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sync_file_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sync_file_get_fence' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='synchronize_hardirq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='synchronize_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='synchronize_net' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='synchronize_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sysfs_create_bin_file' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sysfs_create_group' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sysfs_remove_bin_file' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='sysfs_remove_group' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='tasklet_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='tasklet_kill' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='trace_define_field' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='trace_event_buffer_commit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='trace_event_buffer_reserve' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='trace_event_ignore_this_pid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='trace_event_raw_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='trace_event_reg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='trace_handle_return' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='trace_print_symbols_seq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='trace_raw_output_prep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='trace_seq_printf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='try_module_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='unlock_page' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='unmap_mapping_range' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='unregister_blkdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='unregister_chrdev_region' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='unregister_netdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='unregister_netdevice_notifier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='unregister_netdevice_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='unregister_pernet_subsys' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='unregister_pm_notifier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='unregister_shrinker' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='up_read' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_add_gadget_udc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_add_hcd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_create_hcd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_create_shared_hcd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_del_gadget_udc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_disabled' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_ep_set_maxpacket_limit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_gadget_giveback_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_gadget_udc_reset' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_get_dev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_hcd_check_unlink_urb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_hcd_giveback_urb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_hcd_is_primary_hcd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_hcd_link_urb_to_ep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_hcd_poll_rh_status' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_hcd_resume_root_hub' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_hcd_unlink_urb_from_ep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_put_dev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_put_hcd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usb_remove_hcd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='usleep_range' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='vm_get_page_prot' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='vm_insert_mixed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='vm_insert_pfn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='vmalloc_to_page' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='vmap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='vunmap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='wait_for_completion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='wait_for_completion_killable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='wait_woken' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='wake_up_process' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='wiphy_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='wiphy_new_nm' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='wiphy_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='wiphy_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='woken_wake_function' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ww_mutex_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ww_mutex_lock_interruptible' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='ww_mutex_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='xdp_do_flush_map' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='xdp_do_redirect' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='xdp_return_frame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='xdp_return_frame_rx_napi' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='xdp_rxq_info_reg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='xdp_rxq_info_reg_mem_model' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+      <elf-symbol name='xdp_rxq_info_unreg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    </elf-function-symbols>
+    <abi-instr version='1.0' address-size='64' path='drivers/firmware/efi/libstub/string.c' language='LANG_C89'>
+      <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+      <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
+      <qualified-type-def type-id='type-id-1' const='yes' id='type-id-3'/>
+      <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-4'/>
+      <function-decl name='strstr' mangled-name='strstr' filepath='drivers/firmware/efi/libstub/string.c' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strstr'>
+        <parameter type-id='type-id-4' name='s1' filepath='drivers/firmware/efi/libstub/string.c' line='18' column='1'/>
+        <parameter type-id='type-id-4' name='s2' filepath='drivers/firmware/efi/libstub/string.c' line='18' column='1'/>
+        <return type-id='type-id-2'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/smp_processor_id.c' language='LANG_C89'>
+      <function-decl name='debug_smp_processor_id' mangled-name='debug_smp_processor_id' filepath='lib/smp_processor_id.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='debug_smp_processor_id'>
+        <return type-id='type-id-5'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/trace/trace.c' language='LANG_C89'>
+      <class-decl name='prog_entry' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-6'/>
+      <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='infinite' id='type-id-8'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='trace_event_buffer' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/trace_events.h' line='206' column='1' id='type-id-11'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buffer' type-id='type-id-12' visibility='default' filepath='include/linux/trace_events.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='event' type-id='type-id-13' visibility='default' filepath='include/linux/trace_events.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='trace_file' type-id='type-id-14' visibility='default' filepath='include/linux/trace_events.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='entry' type-id='type-id-15' visibility='default' filepath='include/linux/trace_events.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/trace_events.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='pc' type-id='type-id-17' visibility='default' filepath='include/linux/trace_events.h' line='212' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ring_buffer_event' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/ring_buffer.h' line='15' column='1' id='type-id-18'>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='type_len' type-id='type-id-7' visibility='default' filepath='include/linux/ring_buffer.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='time_delta' type-id='type-id-7' visibility='default' filepath='include/linux/ring_buffer.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='array' type-id='type-id-8' visibility='default' filepath='include/linux/ring_buffer.h' line='18' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_event_file' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/trace_events.h' line='366' column='1' id='type-id-19'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/trace_events.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='event_call' type-id='type-id-21' visibility='default' filepath='include/linux/trace_events.h' line='368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='filter' type-id='type-id-22' visibility='default' filepath='include/linux/trace_events.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dir' type-id='type-id-23' visibility='default' filepath='include/linux/trace_events.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='tr' type-id='type-id-24' visibility='default' filepath='include/linux/trace_events.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='system' type-id='type-id-25' visibility='default' filepath='include/linux/trace_events.h' line='372' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='triggers' type-id='type-id-20' visibility='default' filepath='include/linux/trace_events.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/trace_events.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='sm_ref' type-id='type-id-26' visibility='default' filepath='include/linux/trace_events.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='tm_ref' type-id='type-id-26' visibility='default' filepath='include/linux/trace_events.h' line='393' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vfsmount' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/mount.h' line='67' column='1' id='type-id-27'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mnt_root' type-id='type-id-23' visibility='default' filepath='include/linux/mount.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mnt_sb' type-id='type-id-28' visibility='default' filepath='include/linux/mount.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mnt_flags' type-id='type-id-17' visibility='default' filepath='include/linux/mount.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/mount.h' line='71' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_array' size-in-bits='2112' is-struct='yes' visibility='default' filepath='kernel/trace/trace.h' line='202' column='1' id='type-id-29'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='kernel/trace/trace.h' line='203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='kernel/trace/trace.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='trace_buffer' type-id='type-id-30' visibility='default' filepath='kernel/trace/trace.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='filtered_pids' type-id='type-id-31' visibility='default' filepath='kernel/trace/trace.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='max_lock' type-id='type-id-32' visibility='default' filepath='kernel/trace/trace.h' line='238' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='buffer_disabled' type-id='type-id-17' visibility='default' filepath='kernel/trace/trace.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='stop_count' type-id='type-id-17' visibility='default' filepath='kernel/trace/trace.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='clock_id' type-id='type-id-17' visibility='default' filepath='kernel/trace/trace.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='nr_topts' type-id='type-id-17' visibility='default' filepath='kernel/trace/trace.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='clear_trace' type-id='type-id-33' visibility='default' filepath='kernel/trace/trace.h' line='249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='current_trace' type-id='type-id-34' visibility='default' filepath='kernel/trace/trace.h' line='250' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='trace_flags' type-id='type-id-5' visibility='default' filepath='kernel/trace/trace.h' line='251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='trace_flags_index' type-id='type-id-35' visibility='default' filepath='kernel/trace/trace.h' line='252' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='kernel/trace/trace.h' line='253' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='start_lock' type-id='type-id-36' visibility='default' filepath='kernel/trace/trace.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='dir' type-id='type-id-23' visibility='default' filepath='kernel/trace/trace.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='options' type-id='type-id-23' visibility='default' filepath='kernel/trace/trace.h' line='256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='percpu_dir' type-id='type-id-23' visibility='default' filepath='kernel/trace/trace.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='event_dir' type-id='type-id-23' visibility='default' filepath='kernel/trace/trace.h' line='258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='topts' type-id='type-id-37' visibility='default' filepath='kernel/trace/trace.h' line='259' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='systems' type-id='type-id-20' visibility='default' filepath='kernel/trace/trace.h' line='260' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='events' type-id='type-id-20' visibility='default' filepath='kernel/trace/trace.h' line='261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='trace_marker_file' type-id='type-id-14' visibility='default' filepath='kernel/trace/trace.h' line='262' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='tracing_cpumask' type-id='type-id-38' visibility='default' filepath='kernel/trace/trace.h' line='263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='ref' type-id='type-id-17' visibility='default' filepath='kernel/trace/trace.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1952'>
+          <var-decl name='time_stamp_abs_ref' type-id='type-id-17' visibility='default' filepath='kernel/trace/trace.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='hist_vars' type-id='type-id-20' visibility='default' filepath='kernel/trace/trace.h' line='278' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_array_cpu' size-in-bits='1024' is-struct='yes' visibility='default' filepath='kernel/trace/trace.h' line='150' column='1' id='type-id-39'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='disabled' type-id='type-id-26' visibility='default' filepath='kernel/trace/trace.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='buffer_page' type-id='type-id-15' visibility='default' filepath='kernel/trace/trace.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='entries' type-id='type-id-16' visibility='default' filepath='kernel/trace/trace.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='saved_latency' type-id='type-id-16' visibility='default' filepath='kernel/trace/trace.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='critical_start' type-id='type-id-16' visibility='default' filepath='kernel/trace/trace.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='critical_end' type-id='type-id-16' visibility='default' filepath='kernel/trace/trace.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='critical_sequence' type-id='type-id-16' visibility='default' filepath='kernel/trace/trace.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='nice' type-id='type-id-16' visibility='default' filepath='kernel/trace/trace.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='policy' type-id='type-id-16' visibility='default' filepath='kernel/trace/trace.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='rt_priority' type-id='type-id-16' visibility='default' filepath='kernel/trace/trace.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='skipped_entries' type-id='type-id-16' visibility='default' filepath='kernel/trace/trace.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='preempt_timestamp' type-id='type-id-40' visibility='default' filepath='kernel/trace/trace.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='pid' type-id='type-id-41' visibility='default' filepath='kernel/trace/trace.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='uid' type-id='type-id-42' visibility='default' filepath='kernel/trace/trace.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='comm' type-id='type-id-43' visibility='default' filepath='kernel/trace/trace.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='ignore_pid' type-id='type-id-33' visibility='default' filepath='kernel/trace/trace.h' line='168' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_pid_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/trace/trace.h' line='192' column='1' id='type-id-44'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pid_max' type-id='type-id-17' visibility='default' filepath='kernel/trace/trace.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pids' type-id='type-id-45' visibility='default' filepath='kernel/trace/trace.h' line='194' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tracer_flags' size-in-bits='192' is-struct='yes' visibility='default' filepath='kernel/trace/trace.h' line='378' column='1' id='type-id-46'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='val' type-id='type-id-7' visibility='default' filepath='kernel/trace/trace.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='opts' type-id='type-id-47' visibility='default' filepath='kernel/trace/trace.h' line='380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='trace' type-id='type-id-34' visibility='default' filepath='kernel/trace/trace.h' line='381' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tracer_opt' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/trace/trace.h' line='369' column='1' id='type-id-48'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='kernel/trace/trace.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bit' type-id='type-id-7' visibility='default' filepath='kernel/trace/trace.h' line='371' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_options' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/trace/trace.h' line='187' column='1' id='type-id-49'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tracer' type-id='type-id-34' visibility='default' filepath='kernel/trace/trace.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='topts' type-id='type-id-50' visibility='default' filepath='kernel/trace/trace.h' line='189' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_option_dentry' size-in-bits='256' is-struct='yes' visibility='default' filepath='kernel/trace/trace.h' line='388' column='1' id='type-id-51'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='opt' type-id='type-id-47' visibility='default' filepath='kernel/trace/trace.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-52' visibility='default' filepath='kernel/trace/trace.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tr' type-id='type-id-24' visibility='default' filepath='kernel/trace/trace.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='entry' type-id='type-id-23' visibility='default' filepath='kernel/trace/trace.h' line='392' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_subsystem_dir' size-in-bits='384' is-struct='yes' visibility='default' filepath='kernel/trace/trace.h' line='1282' column='1' id='type-id-53'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='kernel/trace/trace.h' line='1283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='subsystem' type-id='type-id-54' visibility='default' filepath='kernel/trace/trace.h' line='1284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tr' type-id='type-id-24' visibility='default' filepath='kernel/trace/trace.h' line='1285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='entry' type-id='type-id-23' visibility='default' filepath='kernel/trace/trace.h' line='1286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ref_count' type-id='type-id-17' visibility='default' filepath='kernel/trace/trace.h' line='1287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='nr_events' type-id='type-id-17' visibility='default' filepath='kernel/trace/trace.h' line='1288' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='event_subsystem' size-in-bits='320' is-struct='yes' visibility='default' filepath='kernel/trace/trace.h' line='1275' column='1' id='type-id-55'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='kernel/trace/trace.h' line='1276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='kernel/trace/trace.h' line='1277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='filter' type-id='type-id-22' visibility='default' filepath='kernel/trace/trace.h' line='1278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ref_count' type-id='type-id-17' visibility='default' filepath='kernel/trace/trace.h' line='1279' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-56' size-in-bits='64' id='type-id-57'/>
+      <pointer-type-def type-id='type-id-55' size-in-bits='64' id='type-id-54'/>
+      <pointer-type-def type-id='type-id-58' size-in-bits='64' id='type-id-59'/>
+      <pointer-type-def type-id='type-id-60' size-in-bits='64' id='type-id-61'/>
+      <pointer-type-def type-id='type-id-62' size-in-bits='64' id='type-id-63'/>
+      <pointer-type-def type-id='type-id-6' size-in-bits='64' id='type-id-64'/>
+      <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-13'/>
+      <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-24'/>
+      <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-65'/>
+      <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-66'/>
+      <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-14'/>
+      <pointer-type-def type-id='type-id-51' size-in-bits='64' id='type-id-50'/>
+      <pointer-type-def type-id='type-id-49' size-in-bits='64' id='type-id-37'/>
+      <pointer-type-def type-id='type-id-44' size-in-bits='64' id='type-id-31'/>
+      <pointer-type-def type-id='type-id-67' size-in-bits='64' id='type-id-68'/>
+      <pointer-type-def type-id='type-id-53' size-in-bits='64' id='type-id-25'/>
+      <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-52'/>
+      <pointer-type-def type-id='type-id-48' size-in-bits='64' id='type-id-47'/>
+      <pointer-type-def type-id='type-id-69' size-in-bits='64' id='type-id-70'/>
+      <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-72'/>
+      <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-73'/>
+      <pointer-type-def type-id='type-id-74' size-in-bits='64' id='type-id-75'/>
+      <pointer-type-def type-id='type-id-76' size-in-bits='64' id='type-id-77'/>
+      <pointer-type-def type-id='type-id-78' size-in-bits='64' id='type-id-79'/>
+      <function-decl name='trace_handle_return' mangled-name='trace_handle_return' filepath='kernel/trace/trace.c' line='2126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='trace_handle_return'>
+        <parameter type-id='type-id-68' name='s' filepath='kernel/trace/trace.c' line='2126' column='1'/>
+        <return type-id='type-id-80'/>
+      </function-decl>
+      <function-decl name='trace_event_buffer_commit' mangled-name='trace_event_buffer_commit' filepath='kernel/trace/trace.c' line='2382' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='trace_event_buffer_commit'>
+        <parameter type-id='type-id-66' name='fbuffer' filepath='kernel/trace/trace.c' line='2382' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-56'>
+        <parameter type-id='type-id-82'/>
+        <return type-id='type-id-80'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-58'>
+        <parameter type-id='type-id-24'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-60'>
+        <parameter type-id='type-id-24'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-62'>
+        <parameter type-id='type-id-24'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-69'>
+        <parameter type-id='type-id-82'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-85'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-71'>
+        <parameter type-id='type-id-82'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-85'/>
+        <parameter type-id='type-id-87'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-74'>
+        <parameter type-id='type-id-88'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-76'>
+        <parameter type-id='type-id-24'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-78'>
+        <parameter type-id='type-id-82'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/rcu/tree.c' language='LANG_C89'>
+      <typedef-decl name='rcu_callback_t' type-id='type-id-89' filepath='include/linux/types.h' line='230' column='1' id='type-id-90'/>
+      <function-decl name='kfree_call_rcu' mangled-name='kfree_call_rcu' filepath='kernel/rcu/tree.c' line='3095' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kfree_call_rcu'>
+        <parameter type-id='type-id-91' name='head' filepath='kernel/rcu/tree.c' line='3095' column='1'/>
+        <parameter type-id='type-id-90' name='func' filepath='kernel/rcu/tree.c' line='3096' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='synchronize_rcu' mangled-name='synchronize_rcu' filepath='kernel/rcu/tree_plugin.h' line='809' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_rcu'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='call_rcu' mangled-name='call_rcu' filepath='kernel/rcu/tree_plugin.h' line='784' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_rcu'>
+        <parameter type-id='type-id-91' name='head' filepath='kernel/rcu/tree_plugin.h' line='784' column='1'/>
+        <parameter type-id='type-id-90' name='func' filepath='kernel/rcu/tree_plugin.h' line='784' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__rcu_read_lock' mangled-name='__rcu_read_lock' filepath='kernel/rcu/tree_plugin.h' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__rcu_read_lock'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__rcu_read_unlock' mangled-name='__rcu_read_unlock' filepath='kernel/rcu/tree_plugin.h' line='417' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__rcu_read_unlock'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='rcu_barrier' mangled-name='rcu_barrier' filepath='kernel/rcu/tree_plugin.h' line='832' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rcu_barrier'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/string.c' language='LANG_C89'>
+      <function-decl name='strcpy' mangled-name='strcpy' filepath='lib/string.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strcpy'>
+        <parameter type-id='type-id-2' name='dest' filepath='lib/string.c' line='88' column='1'/>
+        <parameter type-id='type-id-4' name='src' filepath='lib/string.c' line='88' column='1'/>
+        <return type-id='type-id-2'/>
+      </function-decl>
+      <function-decl name='strncpy' mangled-name='strncpy' filepath='lib/string.c' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strncpy'>
+        <parameter type-id='type-id-2' name='dest' filepath='lib/string.c' line='113' column='1'/>
+        <parameter type-id='type-id-4' name='src' filepath='lib/string.c' line='113' column='1'/>
+        <parameter type-id='type-id-84' name='count' filepath='lib/string.c' line='113' column='1'/>
+        <return type-id='type-id-2'/>
+      </function-decl>
+      <function-decl name='strlcpy' mangled-name='strlcpy' filepath='lib/string.c' line='140' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcpy'>
+        <parameter type-id='type-id-2' name='dest' filepath='lib/string.c' line='140' column='1'/>
+        <parameter type-id='type-id-4' name='src' filepath='lib/string.c' line='140' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='lib/string.c' line='140' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+      <function-decl name='__sysfs_match_string' mangled-name='__sysfs_match_string' filepath='lib/string.c' line='669' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__sysfs_match_string'>
+        <parameter type-id='type-id-92' name='array' filepath='lib/string.c' line='669' column='1'/>
+        <parameter type-id='type-id-84' name='n' filepath='lib/string.c' line='669' column='1'/>
+        <parameter type-id='type-id-4' name='str' filepath='lib/string.c' line='669' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='memzero_explicit' mangled-name='memzero_explicit' filepath='lib/string.c' line='720' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='memzero_explicit'>
+        <parameter type-id='type-id-15' name='s' filepath='lib/string.c' line='720' column='1'/>
+        <parameter type-id='type-id-84' name='count' filepath='lib/string.c' line='720' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='bcmp' mangled-name='bcmp' filepath='lib/string.c' line='881' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bcmp'>
+        <parameter type-id='type-id-15' name='a' filepath='lib/string.c' line='881' column='1'/>
+        <parameter type-id='type-id-15' name='b' filepath='lib/string.c' line='881' column='1'/>
+        <parameter type-id='type-id-84' name='len' filepath='lib/string.c' line='881' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/cpu.c' language='LANG_C89'>
+      <enum-decl name='cpuhp_state' filepath='include/linux/cpuhotplug.h' line='25' column='1' id='type-id-93'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='CPUHP_INVALID' value='-1'/>
+        <enumerator name='CPUHP_OFFLINE' value='0'/>
+        <enumerator name='CPUHP_CREATE_THREADS' value='1'/>
+        <enumerator name='CPUHP_PERF_PREPARE' value='2'/>
+        <enumerator name='CPUHP_PERF_X86_PREPARE' value='3'/>
+        <enumerator name='CPUHP_PERF_X86_AMD_UNCORE_PREP' value='4'/>
+        <enumerator name='CPUHP_PERF_POWER' value='5'/>
+        <enumerator name='CPUHP_PERF_SUPERH' value='6'/>
+        <enumerator name='CPUHP_X86_HPET_DEAD' value='7'/>
+        <enumerator name='CPUHP_X86_APB_DEAD' value='8'/>
+        <enumerator name='CPUHP_X86_MCE_DEAD' value='9'/>
+        <enumerator name='CPUHP_VIRT_NET_DEAD' value='10'/>
+        <enumerator name='CPUHP_SLUB_DEAD' value='11'/>
+        <enumerator name='CPUHP_MM_WRITEBACK_DEAD' value='12'/>
+        <enumerator name='CPUHP_MM_VMSTAT_DEAD' value='13'/>
+        <enumerator name='CPUHP_SOFTIRQ_DEAD' value='14'/>
+        <enumerator name='CPUHP_NET_MVNETA_DEAD' value='15'/>
+        <enumerator name='CPUHP_CPUIDLE_DEAD' value='16'/>
+        <enumerator name='CPUHP_ARM64_FPSIMD_DEAD' value='17'/>
+        <enumerator name='CPUHP_ARM_OMAP_WAKE_DEAD' value='18'/>
+        <enumerator name='CPUHP_IRQ_POLL_DEAD' value='19'/>
+        <enumerator name='CPUHP_BLOCK_SOFTIRQ_DEAD' value='20'/>
+        <enumerator name='CPUHP_ACPI_CPUDRV_DEAD' value='21'/>
+        <enumerator name='CPUHP_S390_PFAULT_DEAD' value='22'/>
+        <enumerator name='CPUHP_BLK_MQ_DEAD' value='23'/>
+        <enumerator name='CPUHP_FS_BUFF_DEAD' value='24'/>
+        <enumerator name='CPUHP_PRINTK_DEAD' value='25'/>
+        <enumerator name='CPUHP_MM_MEMCQ_DEAD' value='26'/>
+        <enumerator name='CPUHP_PERCPU_CNT_DEAD' value='27'/>
+        <enumerator name='CPUHP_RADIX_DEAD' value='28'/>
+        <enumerator name='CPUHP_PAGE_ALLOC_DEAD' value='29'/>
+        <enumerator name='CPUHP_NET_DEV_DEAD' value='30'/>
+        <enumerator name='CPUHP_PCI_XGENE_DEAD' value='31'/>
+        <enumerator name='CPUHP_IOMMU_INTEL_DEAD' value='32'/>
+        <enumerator name='CPUHP_LUSTRE_CFS_DEAD' value='33'/>
+        <enumerator name='CPUHP_AP_ARM_CACHE_B15_RAC_DEAD' value='34'/>
+        <enumerator name='CPUHP_WORKQUEUE_PREP' value='35'/>
+        <enumerator name='CPUHP_POWER_NUMA_PREPARE' value='36'/>
+        <enumerator name='CPUHP_HRTIMERS_PREPARE' value='37'/>
+        <enumerator name='CPUHP_PROFILE_PREPARE' value='38'/>
+        <enumerator name='CPUHP_X2APIC_PREPARE' value='39'/>
+        <enumerator name='CPUHP_SMPCFD_PREPARE' value='40'/>
+        <enumerator name='CPUHP_RELAY_PREPARE' value='41'/>
+        <enumerator name='CPUHP_SLAB_PREPARE' value='42'/>
+        <enumerator name='CPUHP_MD_RAID5_PREPARE' value='43'/>
+        <enumerator name='CPUHP_RCUTREE_PREP' value='44'/>
+        <enumerator name='CPUHP_CPUIDLE_COUPLED_PREPARE' value='45'/>
+        <enumerator name='CPUHP_POWERPC_PMAC_PREPARE' value='46'/>
+        <enumerator name='CPUHP_POWERPC_MMU_CTX_PREPARE' value='47'/>
+        <enumerator name='CPUHP_XEN_PREPARE' value='48'/>
+        <enumerator name='CPUHP_XEN_EVTCHN_PREPARE' value='49'/>
+        <enumerator name='CPUHP_ARM_SHMOBILE_SCU_PREPARE' value='50'/>
+        <enumerator name='CPUHP_SH_SH3X_PREPARE' value='51'/>
+        <enumerator name='CPUHP_NET_FLOW_PREPARE' value='52'/>
+        <enumerator name='CPUHP_TOPOLOGY_PREPARE' value='53'/>
+        <enumerator name='CPUHP_NET_IUCV_PREPARE' value='54'/>
+        <enumerator name='CPUHP_ARM_BL_PREPARE' value='55'/>
+        <enumerator name='CPUHP_TRACE_RB_PREPARE' value='56'/>
+        <enumerator name='CPUHP_MM_ZS_PREPARE' value='57'/>
+        <enumerator name='CPUHP_MM_ZSWP_MEM_PREPARE' value='58'/>
+        <enumerator name='CPUHP_MM_ZSWP_POOL_PREPARE' value='59'/>
+        <enumerator name='CPUHP_KVM_PPC_BOOK3S_PREPARE' value='60'/>
+        <enumerator name='CPUHP_ZCOMP_PREPARE' value='61'/>
+        <enumerator name='CPUHP_TIMERS_PREPARE' value='62'/>
+        <enumerator name='CPUHP_MIPS_SOC_PREPARE' value='63'/>
+        <enumerator name='CPUHP_BP_PREPARE_DYN' value='64'/>
+        <enumerator name='CPUHP_BP_PREPARE_DYN_END' value='84'/>
+        <enumerator name='CPUHP_BRINGUP_CPU' value='85'/>
+        <enumerator name='CPUHP_AP_IDLE_DEAD' value='86'/>
+        <enumerator name='CPUHP_AP_OFFLINE' value='87'/>
+        <enumerator name='CPUHP_AP_SCHED_STARTING' value='88'/>
+        <enumerator name='CPUHP_AP_RCUTREE_DYING' value='89'/>
+        <enumerator name='CPUHP_AP_IRQ_GIC_STARTING' value='90'/>
+        <enumerator name='CPUHP_AP_IRQ_HIP04_STARTING' value='91'/>
+        <enumerator name='CPUHP_AP_IRQ_ARMADA_XP_STARTING' value='92'/>
+        <enumerator name='CPUHP_AP_IRQ_BCM2836_STARTING' value='93'/>
+        <enumerator name='CPUHP_AP_IRQ_MIPS_GIC_STARTING' value='94'/>
+        <enumerator name='CPUHP_AP_ARM_MVEBU_COHERENCY' value='95'/>
+        <enumerator name='CPUHP_AP_MICROCODE_LOADER' value='96'/>
+        <enumerator name='CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING' value='97'/>
+        <enumerator name='CPUHP_AP_PERF_X86_STARTING' value='98'/>
+        <enumerator name='CPUHP_AP_PERF_X86_AMD_IBS_STARTING' value='99'/>
+        <enumerator name='CPUHP_AP_PERF_X86_CQM_STARTING' value='100'/>
+        <enumerator name='CPUHP_AP_PERF_X86_CSTATE_STARTING' value='101'/>
+        <enumerator name='CPUHP_AP_PERF_XTENSA_STARTING' value='102'/>
+        <enumerator name='CPUHP_AP_MIPS_OP_LOONGSON3_STARTING' value='103'/>
+        <enumerator name='CPUHP_AP_ARM_SDEI_STARTING' value='104'/>
+        <enumerator name='CPUHP_AP_ARM_VFP_STARTING' value='105'/>
+        <enumerator name='CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING' value='106'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING' value='107'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_ACPI_STARTING' value='108'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_STARTING' value='109'/>
+        <enumerator name='CPUHP_AP_ARM_L2X0_STARTING' value='110'/>
+        <enumerator name='CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING' value='111'/>
+        <enumerator name='CPUHP_AP_ARM_ARCH_TIMER_STARTING' value='112'/>
+        <enumerator name='CPUHP_AP_ARM_GLOBAL_TIMER_STARTING' value='113'/>
+        <enumerator name='CPUHP_AP_JCORE_TIMER_STARTING' value='114'/>
+        <enumerator name='CPUHP_AP_ARM_TWD_STARTING' value='115'/>
+        <enumerator name='CPUHP_AP_QCOM_TIMER_STARTING' value='116'/>
+        <enumerator name='CPUHP_AP_ARMADA_TIMER_STARTING' value='117'/>
+        <enumerator name='CPUHP_AP_MARCO_TIMER_STARTING' value='118'/>
+        <enumerator name='CPUHP_AP_MIPS_GIC_TIMER_STARTING' value='119'/>
+        <enumerator name='CPUHP_AP_ARC_TIMER_STARTING' value='120'/>
+        <enumerator name='CPUHP_AP_RISCV_TIMER_STARTING' value='121'/>
+        <enumerator name='CPUHP_AP_KVM_STARTING' value='122'/>
+        <enumerator name='CPUHP_AP_KVM_ARM_VGIC_INIT_STARTING' value='123'/>
+        <enumerator name='CPUHP_AP_KVM_ARM_VGIC_STARTING' value='124'/>
+        <enumerator name='CPUHP_AP_KVM_ARM_TIMER_STARTING' value='125'/>
+        <enumerator name='CPUHP_AP_DUMMY_TIMER_STARTING' value='126'/>
+        <enumerator name='CPUHP_AP_ARM_XEN_STARTING' value='127'/>
+        <enumerator name='CPUHP_AP_ARM_CORESIGHT_STARTING' value='128'/>
+        <enumerator name='CPUHP_AP_ARM64_ISNDEP_STARTING' value='129'/>
+        <enumerator name='CPUHP_AP_SMPCFD_DYING' value='130'/>
+        <enumerator name='CPUHP_AP_X86_TBOOT_DYING' value='131'/>
+        <enumerator name='CPUHP_AP_ARM_CACHE_B15_RAC_DYING' value='132'/>
+        <enumerator name='CPUHP_AP_ONLINE' value='133'/>
+        <enumerator name='CPUHP_TEARDOWN_CPU' value='134'/>
+        <enumerator name='CPUHP_AP_ONLINE_IDLE' value='135'/>
+        <enumerator name='CPUHP_AP_SMPBOOT_THREADS' value='136'/>
+        <enumerator name='CPUHP_AP_X86_VDSO_VMA_ONLINE' value='137'/>
+        <enumerator name='CPUHP_AP_IRQ_AFFINITY_ONLINE' value='138'/>
+        <enumerator name='CPUHP_AP_ARM_MVEBU_SYNC_CLOCKS' value='139'/>
+        <enumerator name='CPUHP_AP_PERF_ONLINE' value='140'/>
+        <enumerator name='CPUHP_AP_PERF_X86_ONLINE' value='141'/>
+        <enumerator name='CPUHP_AP_PERF_X86_UNCORE_ONLINE' value='142'/>
+        <enumerator name='CPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE' value='143'/>
+        <enumerator name='CPUHP_AP_PERF_X86_AMD_POWER_ONLINE' value='144'/>
+        <enumerator name='CPUHP_AP_PERF_X86_RAPL_ONLINE' value='145'/>
+        <enumerator name='CPUHP_AP_PERF_X86_CQM_ONLINE' value='146'/>
+        <enumerator name='CPUHP_AP_PERF_X86_CSTATE_ONLINE' value='147'/>
+        <enumerator name='CPUHP_AP_PERF_S390_CF_ONLINE' value='148'/>
+        <enumerator name='CPUHP_AP_PERF_S390_SF_ONLINE' value='149'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_CCI_ONLINE' value='150'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_CCN_ONLINE' value='151'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE' value='152'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE' value='153'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_HISI_L3_ONLINE' value='154'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_L2X0_ONLINE' value='155'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE' value='156'/>
+        <enumerator name='CPUHP_AP_PERF_ARM_QCOM_L3_ONLINE' value='157'/>
+        <enumerator name='CPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE' value='158'/>
+        <enumerator name='CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE' value='159'/>
+        <enumerator name='CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE' value='160'/>
+        <enumerator name='CPUHP_AP_WATCHDOG_ONLINE' value='161'/>
+        <enumerator name='CPUHP_AP_WORKQUEUE_ONLINE' value='162'/>
+        <enumerator name='CPUHP_AP_RCUTREE_ONLINE' value='163'/>
+        <enumerator name='CPUHP_AP_BASE_CACHEINFO_ONLINE' value='164'/>
+        <enumerator name='CPUHP_AP_ONLINE_DYN' value='165'/>
+        <enumerator name='CPUHP_AP_ONLINE_DYN_END' value='195'/>
+        <enumerator name='CPUHP_AP_X86_HPET_ONLINE' value='196'/>
+        <enumerator name='CPUHP_AP_X86_KVM_CLK_ONLINE' value='197'/>
+        <enumerator name='CPUHP_AP_ACTIVE' value='198'/>
+        <enumerator name='CPUHP_ONLINE' value='199'/>
+      </enum-decl>
+      <pointer-type-def type-id='type-id-95' size-in-bits='64' id='type-id-96'/>
+      <function-decl name='cpus_read_lock' mangled-name='cpus_read_lock' filepath='kernel/cpu.c' line='286' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpus_read_lock'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='cpus_read_unlock' mangled-name='cpus_read_unlock' filepath='kernel/cpu.c' line='298' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpus_read_unlock'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__cpuhp_state_add_instance' mangled-name='__cpuhp_state_add_instance' filepath='kernel/cpu.c' line='1666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_state_add_instance'>
+        <parameter type-id='type-id-93' name='state' filepath='kernel/cpu.c' line='1666' column='1'/>
+        <parameter type-id='type-id-97' name='node' filepath='kernel/cpu.c' line='1666' column='1'/>
+        <parameter type-id='type-id-33' name='invoke' filepath='kernel/cpu.c' line='1667' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__cpuhp_setup_state' mangled-name='__cpuhp_setup_state' filepath='kernel/cpu.c' line='1754' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_setup_state'>
+        <parameter type-id='type-id-93' name='state' filepath='kernel/cpu.c' line='1754' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='kernel/cpu.c' line='1755' column='1'/>
+        <parameter type-id='type-id-33' name='invoke' filepath='kernel/cpu.c' line='1755' column='1'/>
+        <parameter type-id='type-id-96' name='startup' filepath='kernel/cpu.c' line='1756' column='1'/>
+        <parameter type-id='type-id-96' name='teardown' filepath='kernel/cpu.c' line='1757' column='1'/>
+        <parameter type-id='type-id-33' name='multi_instance' filepath='kernel/cpu.c' line='1758' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__cpuhp_state_remove_instance' mangled-name='__cpuhp_state_remove_instance' filepath='kernel/cpu.c' line='1770' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_state_remove_instance'>
+        <parameter type-id='type-id-93' name='state' filepath='kernel/cpu.c' line='1770' column='1'/>
+        <parameter type-id='type-id-97' name='node' filepath='kernel/cpu.c' line='1771' column='1'/>
+        <parameter type-id='type-id-33' name='invoke' filepath='kernel/cpu.c' line='1771' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__cpuhp_remove_state' mangled-name='__cpuhp_remove_state' filepath='kernel/cpu.c' line='1856' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_remove_state'>
+        <parameter type-id='type-id-93' name='state' filepath='kernel/cpu.c' line='1856' column='1'/>
+        <parameter type-id='type-id-33' name='invoke' filepath='kernel/cpu.c' line='1856' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-95'>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/percpu.c' language='LANG_C89'>
+      <function-decl name='__alloc_percpu' mangled-name='__alloc_percpu' filepath='mm/percpu.c' line='1558' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__alloc_percpu'>
+        <parameter type-id='type-id-84' name='size' filepath='mm/percpu.c' line='1558' column='1'/>
+        <parameter type-id='type-id-84' name='align' filepath='mm/percpu.c' line='1558' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='free_percpu' mangled-name='free_percpu' filepath='mm/percpu.c' line='1719' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_percpu'>
+        <parameter type-id='type-id-15' name='ptr' filepath='mm/percpu.c' line='1719' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='arch/arm64/mm/ioremap.c' language='LANG_C89'>
+      <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-98'/>
+      <typedef-decl name='phys_addr_t' type-id='type-id-40' filepath='include/linux/types.h' line='163' column='1' id='type-id-99'/>
+      <typedef-decl name='u64' type-id='type-id-100' filepath='include/asm-generic/int-ll64.h' line='23' column='1' id='type-id-40'/>
+      <typedef-decl name='__u64' type-id='type-id-98' filepath='include/uapi/asm-generic/int-ll64.h' line='31' column='1' id='type-id-100'/>
+      <typedef-decl name='pgprot_t' type-id='type-id-101' filepath='arch/arm64/include/asm/pgtable-types.h' line='53' column='1' id='type-id-102'/>
+      <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-102' visibility='default' filepath='arch/arm64/include/asm/pgtable-types.h' line='53' column='1' id='type-id-101'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pgprot' type-id='type-id-103' visibility='default' filepath='arch/arm64/include/asm/pgtable-types.h' line='53' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pteval_t' type-id='type-id-40' filepath='arch/arm64/include/asm/pgtable-types.h' line='25' column='1' id='type-id-103'/>
+      <function-decl name='__ioremap' mangled-name='__ioremap' filepath='arch/arm64/mm/ioremap.c' line='76' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ioremap'>
+        <parameter type-id='type-id-99' name='phys_addr' filepath='arch/arm64/mm/ioremap.c' line='76' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='arch/arm64/mm/ioremap.c' line='76' column='1'/>
+        <parameter type-id='type-id-102' name='prot' filepath='arch/arm64/mm/ioremap.c' line='76' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='__iounmap' mangled-name='__iounmap' filepath='arch/arm64/mm/ioremap.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__iounmap'>
+        <parameter type-id='type-id-104' name='io_addr' filepath='arch/arm64/mm/ioremap.c' line='83' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/signal.c' language='LANG_C89'>
+
+
+
+
+
+
+      <array-type-def dimensions='1' type-id='type-id-105' size-in-bits='256' id='type-id-106'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-108' size-in-bits='80' id='type-id-109'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-100' size-in-bits='1984' id='type-id-111'>
+        <subrange length='31' type-id='type-id-9' id='type-id-112'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-113' size-in-bits='320' id='type-id-114'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-115' size-in-bits='896' id='type-id-116'>
+        <subrange length='14' type-id='type-id-9' id='type-id-117'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-115' size-in-bits='1856' id='type-id-118'>
+        <subrange length='29' type-id='type-id-9' id='type-id-119'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-115' size-in-bits='2240' id='type-id-120'>
+        <subrange length='35' type-id='type-id-9' id='type-id-121'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-115' size-in-bits='3584' id='type-id-122'>
+        <subrange length='56' type-id='type-id-9' id='type-id-123'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-115' size-in-bits='448' id='type-id-124'>
+        <subrange length='7' type-id='type-id-9' id='type-id-125'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-115' size-in-bits='infinite' id='type-id-126'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-26' size-in-bits='64' id='type-id-127'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-129' size-in-bits='4160' id='type-id-130'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-131' size-in-bits='infinite' id='type-id-132'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-133' size-in-bits='5120' id='type-id-134'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-136' size-in-bits='320' id='type-id-137'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-138' size-in-bits='320' id='type-id-139'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-140' size-in-bits='152' id='type-id-141'>
+        <subrange length='19' type-id='type-id-9' id='type-id-142'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='1008' id='type-id-143'>
+        <subrange length='126' type-id='type-id-9' id='type-id-144'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='176' id='type-id-145'>
+        <subrange length='22' type-id='type-id-9' id='type-id-146'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='296' id='type-id-147'>
+        <subrange length='37' type-id='type-id-9' id='type-id-148'/>
+
+      </array-type-def>
+      <class-decl name='audit_aux_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-149'/>
+      <class-decl name='audit_tree_refs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-150'/>
+      <class-decl name='badblocks' size-in-bits='512' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-151'/>
+      <class-decl name='blk_flush_queue' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-152'/>
+      <class-decl name='blk_mq_alloc_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-153'/>
+      <class-decl name='blk_mq_ctx' size-in-bits='2048' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-154'/>
+      <class-decl name='blk_mq_debugfs_attr' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-155'/>
+      <class-decl name='blk_mq_hw_ctx' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-156'/>
+      <class-decl name='blk_mq_ops' size-in-bits='896' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-157'/>
+      <class-decl name='blk_mq_tag_set' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-158'/>
+      <class-decl name='blk_queue_stats' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-159'/>
+      <class-decl name='blk_stat_callback' size-in-bits='960' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-160'/>
+      <class-decl name='bpf_prog' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-161'/>
+      <class-decl name='bsg_job' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-162'/>
+      <class-decl name='disk_events' size-in-bits='1408' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-163'/>
+      <class-decl name='event_filter' size-in-bits='128' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-164'/>
+      <class-decl name='eventfd_ctx' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-165'/>
+      <class-decl name='hd_geometry' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-166'/>
+      <class-decl name='keyslot_manager' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-167'/>
+      <class-decl name='net' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-168'/>
+      <class-decl name='pr_ops' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-169'/>
+      <class-decl name='ring_buffer' size-in-bits='1920' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-170'/>
+      <class-decl name='ring_buffer_iter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-171'/>
+      <class-decl name='rq_qos' size-in-bits='256' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-172'/>
+      <class-decl name='serial_icounter_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-173'/>
+      <class-decl name='timer_rand_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-174'/>
+      <class-decl name='trace_array' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-175'/>
+      <class-decl name='trace_buffer' size-in-bits='320' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-30'/>
+      <class-decl name='tracer' size-in-bits='1280' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-176'/>
+      <array-type-def dimensions='1' type-id='type-id-3' size-in-bits='infinite' id='type-id-177'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-178' size-in-bits='64' id='type-id-179'>
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-181' size-in-bits='9152' id='type-id-182'>
+        <subrange length='11' type-id='type-id-9' id='type-id-183'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-184' size-in-bits='infinite' id='type-id-185'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-186' size-in-bits='4096' id='type-id-187'>
+        <subrange length='64' type-id='type-id-9' id='type-id-188'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='640' id='type-id-189'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='768' id='type-id-190'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-192' size-in-bits='1856' id='type-id-193'>
+        <subrange length='29' type-id='type-id-9' id='type-id-119'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-192' size-in-bits='2240' id='type-id-194'>
+        <subrange length='35' type-id='type-id-9' id='type-id-121'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-192' size-in-bits='192' id='type-id-195'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-197' size-in-bits='infinite' id='type-id-198'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-199' size-in-bits='1664' id='type-id-200'>
+        <subrange length='13' type-id='type-id-9' id='type-id-201'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-202' size-in-bits='infinite' id='type-id-203'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-204' size-in-bits='1280' id='type-id-205'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-204' size-in-bits='1600' id='type-id-206'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-207' size-in-bits='infinite' id='type-id-208'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-209' size-in-bits='112' id='type-id-210'>
+        <subrange length='14' type-id='type-id-9' id='type-id-117'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-209' size-in-bits='232' id='type-id-211'>
+        <subrange length='29' type-id='type-id-9' id='type-id-119'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-40' size-in-bits='1984' id='type-id-212'>
+        <subrange length='31' type-id='type-id-9' id='type-id-112'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-40' size-in-bits='192' id='type-id-213'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='512' id='type-id-215'>
+        <subrange length='64' type-id='type-id-9' id='type-id-188'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-216' size-in-bits='32768' id='type-id-217'>
+        <subrange length='4096' type-id='type-id-9' id='type-id-218'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='128' id='type-id-219'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='192' id='type-id-220'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='2' type-id='type-id-16' size-in-bits='512' id='type-id-221'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='256' id='type-id-222'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='3584' id='type-id-223'>
+        <subrange length='56' type-id='type-id-9' id='type-id-123'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-15' size-in-bits='128' id='type-id-224'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-225' size-in-bits='384' id='type-id-226'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-227' size-in-bits='36864' id='type-id-228'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-229' size-in-bits='512' id='type-id-230'>
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-231' size-in-bits='512' id='type-id-232'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='include/linux/restart_block.h' line='27' column='1' id='type-id-233'>
+        <data-member access='private'>
+          <var-decl name='futex' type-id='type-id-234' visibility='default' filepath='include/linux/restart_block.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='nanosleep' type-id='type-id-235' visibility='default' filepath='include/linux/restart_block.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='poll' type-id='type-id-236' visibility='default' filepath='include/linux/restart_block.h' line='54' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/restart_block.h' line='48' column='1' id='type-id-236'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ufds' type-id='type-id-237' visibility='default' filepath='include/linux/restart_block.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nfds' type-id='type-id-17' visibility='default' filepath='include/linux/restart_block.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='has_timeout' type-id='type-id-17' visibility='default' filepath='include/linux/restart_block.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tv_sec' type-id='type-id-16' visibility='default' filepath='include/linux/restart_block.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tv_nsec' type-id='type-id-16' visibility='default' filepath='include/linux/restart_block.h' line='53' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tty_struct' size-in-bits='5632' is-struct='yes' visibility='default' filepath='include/linux/tty.h' line='283' column='1' id='type-id-238'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='magic' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='kref' type-id='type-id-239' visibility='default' filepath='include/linux/tty.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/tty.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='driver' type-id='type-id-241' visibility='default' filepath='include/linux/tty.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ops' type-id='type-id-242' visibility='default' filepath='include/linux/tty.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='index' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='289' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ldisc_sem' type-id='type-id-243' visibility='default' filepath='include/linux/tty.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='ldisc' type-id='type-id-244' visibility='default' filepath='include/linux/tty.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='atomic_write_lock' type-id='type-id-245' visibility='default' filepath='include/linux/tty.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='legacy_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/tty.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='throttle_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/tty.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='termios_rwsem' type-id='type-id-246' visibility='default' filepath='include/linux/tty.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='winsize_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/tty.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='ctrl_lock' type-id='type-id-247' visibility='default' filepath='include/linux/tty.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2144'>
+          <var-decl name='flow_lock' type-id='type-id-247' visibility='default' filepath='include/linux/tty.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='termios' type-id='type-id-248' visibility='default' filepath='include/linux/tty.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2528'>
+          <var-decl name='termios_locked' type-id='type-id-248' visibility='default' filepath='include/linux/tty.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='termiox' type-id='type-id-249' visibility='default' filepath='include/linux/tty.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='name' type-id='type-id-250' visibility='default' filepath='include/linux/tty.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='pgrp' type-id='type-id-251' visibility='default' filepath='include/linux/tty.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='session' type-id='type-id-251' visibility='default' filepath='include/linux/tty.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/tty.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='count' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3680'>
+          <var-decl name='winsize' type-id='type-id-252' visibility='default' filepath='include/linux/tty.h' line='310' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='stopped' type-id='type-id-16' visibility='default' filepath='include/linux/tty.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='flow_stopped' type-id='type-id-16' visibility='default' filepath='include/linux/tty.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2'>
+          <var-decl name='unused' type-id='type-id-16' visibility='default' filepath='include/linux/tty.h' line='313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='hw_stopped' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='ctrl_status' type-id='type-id-16' visibility='default' filepath='include/linux/tty.h' line='315' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23'>
+          <var-decl name='packet' type-id='type-id-16' visibility='default' filepath='include/linux/tty.h' line='316' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9'>
+          <var-decl name='unused_ctrl' type-id='type-id-16' visibility='default' filepath='include/linux/tty.h' line='317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='receive_room' type-id='type-id-5' visibility='default' filepath='include/linux/tty.h' line='318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4000'>
+          <var-decl name='flow_change' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='319' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='link' type-id='type-id-253' visibility='default' filepath='include/linux/tty.h' line='321' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='fasync' type-id='type-id-254' visibility='default' filepath='include/linux/tty.h' line='322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='write_wait' type-id='type-id-225' visibility='default' filepath='include/linux/tty.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='read_wait' type-id='type-id-225' visibility='default' filepath='include/linux/tty.h' line='324' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='hangup_work' type-id='type-id-255' visibility='default' filepath='include/linux/tty.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='disc_data' type-id='type-id-15' visibility='default' filepath='include/linux/tty.h' line='326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='driver_data' type-id='type-id-15' visibility='default' filepath='include/linux/tty.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='files_lock' type-id='type-id-247' visibility='default' filepath='include/linux/tty.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='tty_files' type-id='type-id-20' visibility='default' filepath='include/linux/tty.h' line='329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='closing' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='write_buf' type-id='type-id-256' visibility='default' filepath='include/linux/tty.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5248'>
+          <var-decl name='write_cnt' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='SAK_work' type-id='type-id-255' visibility='default' filepath='include/linux/tty.h' line='337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='port' type-id='type-id-257' visibility='default' filepath='include/linux/tty.h' line='338' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tty_driver' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/linux/tty_driver.h' line='299' column='1' id='type-id-258'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='magic' type-id='type-id-17' visibility='default' filepath='include/linux/tty_driver.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='kref' type-id='type-id-239' visibility='default' filepath='include/linux/tty_driver.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cdevs' type-id='type-id-259' visibility='default' filepath='include/linux/tty_driver.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/tty_driver.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='driver_name' type-id='type-id-4' visibility='default' filepath='include/linux/tty_driver.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/tty_driver.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='name_base' type-id='type-id-17' visibility='default' filepath='include/linux/tty_driver.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='major' type-id='type-id-17' visibility='default' filepath='include/linux/tty_driver.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='minor_start' type-id='type-id-17' visibility='default' filepath='include/linux/tty_driver.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='num' type-id='type-id-5' visibility='default' filepath='include/linux/tty_driver.h' line='309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='type' type-id='type-id-261' visibility='default' filepath='include/linux/tty_driver.h' line='310' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='464'>
+          <var-decl name='subtype' type-id='type-id-261' visibility='default' filepath='include/linux/tty_driver.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='init_termios' type-id='type-id-248' visibility='default' filepath='include/linux/tty_driver.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/tty_driver.h' line='313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='proc_entry' type-id='type-id-262' visibility='default' filepath='include/linux/tty_driver.h' line='314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='other' type-id='type-id-241' visibility='default' filepath='include/linux/tty_driver.h' line='315' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='ttys' type-id='type-id-263' visibility='default' filepath='include/linux/tty_driver.h' line='320' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='ports' type-id='type-id-264' visibility='default' filepath='include/linux/tty_driver.h' line='321' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='termios' type-id='type-id-265' visibility='default' filepath='include/linux/tty_driver.h' line='322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='driver_state' type-id='type-id-15' visibility='default' filepath='include/linux/tty_driver.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='ops' type-id='type-id-242' visibility='default' filepath='include/linux/tty_driver.h' line='329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='tty_drivers' type-id='type-id-20' visibility='default' filepath='include/linux/tty_driver.h' line='330' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cdev' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/cdev.h' line='14' column='1' id='type-id-266'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/cdev.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/cdev.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='ops' type-id='type-id-268' visibility='default' filepath='include/linux/cdev.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/cdev.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='dev' type-id='type-id-269' visibility='default' filepath='include/linux/cdev.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='count' type-id='type-id-5' visibility='default' filepath='include/linux/cdev.h' line='20' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ktermios' size-in-bits='352' is-struct='yes' visibility='default' filepath='include/uapi/asm-generic/termbits.h' line='32' column='1' id='type-id-248'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='c_iflag' type-id='type-id-270' visibility='default' filepath='include/uapi/asm-generic/termbits.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='c_oflag' type-id='type-id-270' visibility='default' filepath='include/uapi/asm-generic/termbits.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='c_cflag' type-id='type-id-270' visibility='default' filepath='include/uapi/asm-generic/termbits.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='c_lflag' type-id='type-id-270' visibility='default' filepath='include/uapi/asm-generic/termbits.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='c_line' type-id='type-id-140' visibility='default' filepath='include/uapi/asm-generic/termbits.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='136'>
+          <var-decl name='c_cc' type-id='type-id-141' visibility='default' filepath='include/uapi/asm-generic/termbits.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='c_ispeed' type-id='type-id-271' visibility='default' filepath='include/uapi/asm-generic/termbits.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='c_ospeed' type-id='type-id-271' visibility='default' filepath='include/uapi/asm-generic/termbits.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='tcflag_t' type-id='type-id-5' filepath='include/uapi/asm-generic/termbits.h' line='9' column='1' id='type-id-270'/>
+      <typedef-decl name='cc_t' type-id='type-id-216' filepath='include/uapi/asm-generic/termbits.h' line='7' column='1' id='type-id-140'/>
+      <typedef-decl name='speed_t' type-id='type-id-5' filepath='include/uapi/asm-generic/termbits.h' line='8' column='1' id='type-id-271'/>
+      <class-decl name='tty_port' size-in-bits='2816' is-struct='yes' visibility='default' filepath='include/linux/tty.h' line='228' column='1' id='type-id-272'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buf' type-id='type-id-273' visibility='default' filepath='include/linux/tty.h' line='229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='tty' type-id='type-id-253' visibility='default' filepath='include/linux/tty.h' line='230' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='itty' type-id='type-id-253' visibility='default' filepath='include/linux/tty.h' line='231' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='ops' type-id='type-id-274' visibility='default' filepath='include/linux/tty.h' line='232' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='client_ops' type-id='type-id-275' visibility='default' filepath='include/linux/tty.h' line='233' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/tty.h' line='234' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='blocked_open' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='235' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='count' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='open_wait' type-id='type-id-225' visibility='default' filepath='include/linux/tty.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='delta_msr_wait' type-id='type-id-225' visibility='default' filepath='include/linux/tty.h' line='238' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/tty.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='iflags' type-id='type-id-16' visibility='default' filepath='include/linux/tty.h' line='240' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='console' type-id='type-id-216' visibility='default' filepath='include/linux/tty.h' line='241' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='low_latency' type-id='type-id-216' visibility='default' filepath='include/linux/tty.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/tty.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='buf_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/tty.h' line='244' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='xmit_buf' type-id='type-id-256' visibility='default' filepath='include/linux/tty.h' line='245' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='close_delay' type-id='type-id-5' visibility='default' filepath='include/linux/tty.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2656'>
+          <var-decl name='closing_wait' type-id='type-id-5' visibility='default' filepath='include/linux/tty.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='drain_delay' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2720'>
+          <var-decl name='kref' type-id='type-id-239' visibility='default' filepath='include/linux/tty.h' line='251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='client_data' type-id='type-id-15' visibility='default' filepath='include/linux/tty.h' line='252' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tty_bufhead' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/linux/tty.h' line='85' column='1' id='type-id-273'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-276' visibility='default' filepath='include/linux/tty.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='work' type-id='type-id-255' visibility='default' filepath='include/linux/tty.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='lock' type-id='type-id-245' visibility='default' filepath='include/linux/tty.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='priority' type-id='type-id-26' visibility='default' filepath='include/linux/tty.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='sentinel' type-id='type-id-277' visibility='default' filepath='include/linux/tty.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='free' type-id='type-id-278' visibility='default' filepath='include/linux/tty.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='mem_used' type-id='type-id-26' visibility='default' filepath='include/linux/tty.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='mem_limit' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='tail' type-id='type-id-276' visibility='default' filepath='include/linux/tty.h' line='94' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tty_buffer' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/tty.h' line='58' column='1' id='type-id-277'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-279' visibility='default' filepath='include/linux/tty.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='used' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='size' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='commit' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='read' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/tty.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='data' type-id='type-id-280' visibility='default' filepath='include/linux/tty.h' line='69' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/tty.h' line='59' column='1' id='type-id-279'>
+        <data-member access='private'>
+          <var-decl name='next' type-id='type-id-276' visibility='default' filepath='include/linux/tty.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='free' type-id='type-id-281' visibility='default' filepath='include/linux/tty.h' line='61' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='llist_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/llist.h' line='66' column='1' id='type-id-278'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='first' type-id='type-id-282' visibility='default' filepath='include/linux/llist.h' line='67' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tty_port_operations' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/tty.h' line='205' column='1' id='type-id-283'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='carrier_raised' type-id='type-id-284' visibility='default' filepath='include/linux/tty.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dtr_rts' type-id='type-id-285' visibility='default' filepath='include/linux/tty.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='shutdown' type-id='type-id-286' visibility='default' filepath='include/linux/tty.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='activate' type-id='type-id-287' visibility='default' filepath='include/linux/tty.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='destruct' type-id='type-id-286' visibility='default' filepath='include/linux/tty.h' line='220' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tty_port_client_operations' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/tty.h' line='223' column='1' id='type-id-288'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='receive_buf' type-id='type-id-289' visibility='default' filepath='include/linux/tty.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='write_wakeup' type-id='type-id-286' visibility='default' filepath='include/linux/tty.h' line='225' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tty_operations' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/tty_driver.h' line='253' column='1' id='type-id-290'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lookup' type-id='type-id-291' visibility='default' filepath='include/linux/tty_driver.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='install' type-id='type-id-292' visibility='default' filepath='include/linux/tty_driver.h' line='256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='remove' type-id='type-id-293' visibility='default' filepath='include/linux/tty_driver.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='open' type-id='type-id-294' visibility='default' filepath='include/linux/tty_driver.h' line='258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='close' type-id='type-id-295' visibility='default' filepath='include/linux/tty_driver.h' line='259' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='shutdown' type-id='type-id-296' visibility='default' filepath='include/linux/tty_driver.h' line='260' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='cleanup' type-id='type-id-296' visibility='default' filepath='include/linux/tty_driver.h' line='261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='write' type-id='type-id-297' visibility='default' filepath='include/linux/tty_driver.h' line='262' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='put_char' type-id='type-id-298' visibility='default' filepath='include/linux/tty_driver.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='flush_chars' type-id='type-id-296' visibility='default' filepath='include/linux/tty_driver.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='write_room' type-id='type-id-299' visibility='default' filepath='include/linux/tty_driver.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='chars_in_buffer' type-id='type-id-299' visibility='default' filepath='include/linux/tty_driver.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='ioctl' type-id='type-id-300' visibility='default' filepath='include/linux/tty_driver.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='compat_ioctl' type-id='type-id-301' visibility='default' filepath='include/linux/tty_driver.h' line='270' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='set_termios' type-id='type-id-302' visibility='default' filepath='include/linux/tty_driver.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='throttle' type-id='type-id-296' visibility='default' filepath='include/linux/tty_driver.h' line='273' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='unthrottle' type-id='type-id-296' visibility='default' filepath='include/linux/tty_driver.h' line='274' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='stop' type-id='type-id-296' visibility='default' filepath='include/linux/tty_driver.h' line='275' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='start' type-id='type-id-296' visibility='default' filepath='include/linux/tty_driver.h' line='276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='hangup' type-id='type-id-296' visibility='default' filepath='include/linux/tty_driver.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='break_ctl' type-id='type-id-303' visibility='default' filepath='include/linux/tty_driver.h' line='278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='flush_buffer' type-id='type-id-296' visibility='default' filepath='include/linux/tty_driver.h' line='279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='set_ldisc' type-id='type-id-296' visibility='default' filepath='include/linux/tty_driver.h' line='280' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='wait_until_sent' type-id='type-id-304' visibility='default' filepath='include/linux/tty_driver.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='send_xchar' type-id='type-id-305' visibility='default' filepath='include/linux/tty_driver.h' line='282' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='tiocmget' type-id='type-id-299' visibility='default' filepath='include/linux/tty_driver.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='tiocmset' type-id='type-id-306' visibility='default' filepath='include/linux/tty_driver.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='resize' type-id='type-id-307' visibility='default' filepath='include/linux/tty_driver.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='set_termiox' type-id='type-id-308' visibility='default' filepath='include/linux/tty_driver.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='get_icount' type-id='type-id-309' visibility='default' filepath='include/linux/tty_driver.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='show_fdinfo' type-id='type-id-310' visibility='default' filepath='include/linux/tty_driver.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='proc_show' type-id='type-id-311' visibility='default' filepath='include/linux/tty_driver.h' line='296' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='winsize' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/asm-generic/termios.h' line='15' column='1' id='type-id-252'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ws_row' type-id='type-id-312' visibility='default' filepath='include/uapi/asm-generic/termios.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='ws_col' type-id='type-id-312' visibility='default' filepath='include/uapi/asm-generic/termios.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ws_xpixel' type-id='type-id-312' visibility='default' filepath='include/uapi/asm-generic/termios.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='ws_ypixel' type-id='type-id-312' visibility='default' filepath='include/uapi/asm-generic/termios.h' line='19' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='termiox' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/termios.h' line='10' column='1' id='type-id-313'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='x_hflag' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/termios.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='x_cflag' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/termios.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='x_rflag' type-id='type-id-109' visibility='default' filepath='include/uapi/linux/termios.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='x_sflag' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/termios.h' line='15' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ld_semaphore' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/tty_ldisc.h' line='127' column='1' id='type-id-243'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-115' visibility='default' filepath='include/linux/tty_ldisc.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wait_lock' type-id='type-id-36' visibility='default' filepath='include/linux/tty_ldisc.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='wait_readers' type-id='type-id-5' visibility='default' filepath='include/linux/tty_ldisc.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='read_wait' type-id='type-id-20' visibility='default' filepath='include/linux/tty_ldisc.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='write_wait' type-id='type-id-20' visibility='default' filepath='include/linux/tty_ldisc.h' line='132' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tty_ldisc' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/tty_ldisc.h' line='209' column='1' id='type-id-314'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ops' type-id='type-id-315' visibility='default' filepath='include/linux/tty_ldisc.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tty' type-id='type-id-253' visibility='default' filepath='include/linux/tty_ldisc.h' line='211' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tty_ldisc_ops' size-in-bits='1216' is-struct='yes' visibility='default' filepath='include/linux/tty_ldisc.h' line='169' column='1' id='type-id-316'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='magic' type-id='type-id-17' visibility='default' filepath='include/linux/tty_ldisc.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/linux/tty_ldisc.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='num' type-id='type-id-17' visibility='default' filepath='include/linux/tty_ldisc.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/tty_ldisc.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='open' type-id='type-id-299' visibility='default' filepath='include/linux/tty_ldisc.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='close' type-id='type-id-296' visibility='default' filepath='include/linux/tty_ldisc.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='flush_buffer' type-id='type-id-296' visibility='default' filepath='include/linux/tty_ldisc.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='read' type-id='type-id-317' visibility='default' filepath='include/linux/tty_ldisc.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='write' type-id='type-id-318' visibility='default' filepath='include/linux/tty_ldisc.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='ioctl' type-id='type-id-319' visibility='default' filepath='include/linux/tty_ldisc.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='compat_ioctl' type-id='type-id-320' visibility='default' filepath='include/linux/tty_ldisc.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='set_termios' type-id='type-id-302' visibility='default' filepath='include/linux/tty_ldisc.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='poll' type-id='type-id-321' visibility='default' filepath='include/linux/tty_ldisc.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='hangup' type-id='type-id-299' visibility='default' filepath='include/linux/tty_ldisc.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='receive_buf' type-id='type-id-322' visibility='default' filepath='include/linux/tty_ldisc.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='write_wakeup' type-id='type-id-296' visibility='default' filepath='include/linux/tty_ldisc.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='dcd_change' type-id='type-id-323' visibility='default' filepath='include/linux/tty_ldisc.h' line='200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='receive_buf2' type-id='type-id-324' visibility='default' filepath='include/linux/tty_ldisc.h' line='201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/tty_ldisc.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='refcount' type-id='type-id-17' visibility='default' filepath='include/linux/tty_ldisc.h' line='206' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='poll_queue_proc' type-id='type-id-325' filepath='include/linux/poll.h' line='33' column='1' id='type-id-326'/>
+      <enum-decl name='audit_state' filepath='kernel/audit.h' line='36' column='1' id='type-id-327'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='AUDIT_DISABLED' value='0'/>
+        <enumerator name='AUDIT_BUILD_CONTEXT' value='1'/>
+        <enumerator name='AUDIT_RECORD_CONTEXT' value='2'/>
+      </enum-decl>
+      <class-decl name='audit_names' size-in-bits='832' is-struct='yes' visibility='default' filepath='kernel/audit.h' line='79' column='1' id='type-id-129'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='kernel/audit.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name' type-id='type-id-328' visibility='default' filepath='kernel/audit.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='name_len' type-id='type-id-17' visibility='default' filepath='kernel/audit.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='hidden' type-id='type-id-33' visibility='default' filepath='kernel/audit.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ino' type-id='type-id-16' visibility='default' filepath='kernel/audit.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dev' type-id='type-id-269' visibility='default' filepath='kernel/audit.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='mode' type-id='type-id-329' visibility='default' filepath='kernel/audit.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='uid' type-id='type-id-42' visibility='default' filepath='kernel/audit.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='gid' type-id='type-id-330' visibility='default' filepath='kernel/audit.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='rdev' type-id='type-id-269' visibility='default' filepath='kernel/audit.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='osid' type-id='type-id-7' visibility='default' filepath='kernel/audit.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='fcap' type-id='type-id-331' visibility='default' filepath='kernel/audit.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='fcap_ver' type-id='type-id-5' visibility='default' filepath='kernel/audit.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='type' type-id='type-id-216' visibility='default' filepath='kernel/audit.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='808'>
+          <var-decl name='should_free' type-id='type-id-33' visibility='default' filepath='kernel/audit.h' line='101' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='filename' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='2474' column='1' id='type-id-332'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/fs.h' line='2475' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='uptr' type-id='type-id-4' visibility='default' filepath='include/linux/fs.h' line='2476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='refcnt' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='2477' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='aname' type-id='type-id-333' visibility='default' filepath='include/linux/fs.h' line='2478' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='iname' type-id='type-id-177' visibility='default' filepath='include/linux/fs.h' line='2479' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='audit_cap_data' size-in-bits='256' is-struct='yes' visibility='default' filepath='kernel/audit.h' line='64' column='1' id='type-id-331'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='permitted' type-id='type-id-334' visibility='default' filepath='kernel/audit.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='inheritable' type-id='type-id-334' visibility='default' filepath='kernel/audit.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='' type-id='type-id-335' visibility='default' filepath='kernel/audit.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ambient' type-id='type-id-334' visibility='default' filepath='kernel/audit.h' line='71' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='67' column='1' id='type-id-335'>
+        <data-member access='private'>
+          <var-decl name='fE' type-id='type-id-5' visibility='default' filepath='kernel/audit.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='effective' type-id='type-id-334' visibility='default' filepath='kernel/audit.h' line='69' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__kernel_sockaddr_storage' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/uapi/linux/socket.h' line='14' column='1' id='type-id-336'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ss_family' type-id='type-id-337' visibility='default' filepath='include/uapi/linux/socket.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='__data' type-id='type-id-143' visibility='default' filepath='include/uapi/linux/socket.h' line='17' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__3' size-in-bits='576' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='157' column='1' id='type-id-338'>
+        <data-member access='private'>
+          <var-decl name='socketcall' type-id='type-id-339' visibility='default' filepath='kernel/audit.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ipc' type-id='type-id-340' visibility='default' filepath='kernel/audit.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='mq_getsetattr' type-id='type-id-341' visibility='default' filepath='kernel/audit.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='mq_notify' type-id='type-id-342' visibility='default' filepath='kernel/audit.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='mq_sendrecv' type-id='type-id-343' visibility='default' filepath='kernel/audit.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='mq_open' type-id='type-id-344' visibility='default' filepath='kernel/audit.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='capset' type-id='type-id-345' visibility='default' filepath='kernel/audit.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='mmap' type-id='type-id-346' visibility='default' filepath='kernel/audit.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='execve' type-id='type-id-347' visibility='default' filepath='kernel/audit.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='module' type-id='type-id-348' visibility='default' filepath='kernel/audit.h' line='205' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__1' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='158' column='1' id='type-id-339'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nargs' type-id='type-id-17' visibility='default' filepath='kernel/audit.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='args' type-id='type-id-349' visibility='default' filepath='kernel/audit.h' line='160' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__2' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='162' column='1' id='type-id-340'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='uid' type-id='type-id-42' visibility='default' filepath='kernel/audit.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='gid' type-id='type-id-330' visibility='default' filepath='kernel/audit.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mode' type-id='type-id-329' visibility='default' filepath='kernel/audit.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='osid' type-id='type-id-7' visibility='default' filepath='kernel/audit.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='has_perm' type-id='type-id-17' visibility='default' filepath='kernel/audit.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='perm_uid' type-id='type-id-350' visibility='default' filepath='kernel/audit.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='perm_gid' type-id='type-id-351' visibility='default' filepath='kernel/audit.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='perm_mode' type-id='type-id-329' visibility='default' filepath='kernel/audit.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='qbytes' type-id='type-id-16' visibility='default' filepath='kernel/audit.h' line='171' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__3' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='173' column='1' id='type-id-341'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mqdes' type-id='type-id-352' visibility='default' filepath='kernel/audit.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mqstat' type-id='type-id-353' visibility='default' filepath='kernel/audit.h' line='175' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='mqd_t' type-id='type-id-354' filepath='include/linux/types.h' line='28' column='1' id='type-id-352'/>
+      <typedef-decl name='__kernel_mqd_t' type-id='type-id-17' filepath='include/uapi/linux/posix_types.h' line='34' column='1' id='type-id-354'/>
+      <class-decl name='mq_attr' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/uapi/linux/mqueue.h' line='28' column='1' id='type-id-353'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mq_flags' type-id='type-id-105' visibility='default' filepath='include/uapi/linux/mqueue.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mq_maxmsg' type-id='type-id-105' visibility='default' filepath='include/uapi/linux/mqueue.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mq_msgsize' type-id='type-id-105' visibility='default' filepath='include/uapi/linux/mqueue.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mq_curmsgs' type-id='type-id-105' visibility='default' filepath='include/uapi/linux/mqueue.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='__reserved' type-id='type-id-106' visibility='default' filepath='include/uapi/linux/mqueue.h' line='33' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__4' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='177' column='1' id='type-id-342'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mqdes' type-id='type-id-352' visibility='default' filepath='kernel/audit.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='sigev_signo' type-id='type-id-17' visibility='default' filepath='kernel/audit.h' line='179' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__5' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='181' column='1' id='type-id-343'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mqdes' type-id='type-id-352' visibility='default' filepath='kernel/audit.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='msg_len' type-id='type-id-84' visibility='default' filepath='kernel/audit.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='msg_prio' type-id='type-id-5' visibility='default' filepath='kernel/audit.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='abs_timeout' type-id='type-id-355' visibility='default' filepath='kernel/audit.h' line='185' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__6' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='187' column='1' id='type-id-344'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='oflag' type-id='type-id-17' visibility='default' filepath='kernel/audit.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='mode' type-id='type-id-329' visibility='default' filepath='kernel/audit.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='attr' type-id='type-id-353' visibility='default' filepath='kernel/audit.h' line='190' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__7' size-in-bits='288' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='192' column='1' id='type-id-345'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pid' type-id='type-id-41' visibility='default' filepath='kernel/audit.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='cap' type-id='type-id-331' visibility='default' filepath='kernel/audit.h' line='194' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__8' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='196' column='1' id='type-id-346'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fd' type-id='type-id-17' visibility='default' filepath='kernel/audit.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='kernel/audit.h' line='198' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__9' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='200' column='1' id='type-id-347'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='argc' type-id='type-id-17' visibility='default' filepath='kernel/audit.h' line='201' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__10' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/audit.h' line='203' column='1' id='type-id-348'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='kernel/audit.h' line='204' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='audit_proctitle' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/audit.h' line='104' column='1' id='type-id-356'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='len' type-id='type-id-17' visibility='default' filepath='kernel/audit.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='value' type-id='type-id-2' visibility='default' filepath='kernel/audit.h' line='106' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bio_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bio.h' line='618' column='1' id='type-id-357'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-358' visibility='default' filepath='include/linux/bio.h' line='619' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tail' type-id='type-id-358' visibility='default' filepath='include/linux/bio.h' line='620' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bio' size-in-bits='1216' is-struct='yes' visibility='default' filepath='include/linux/blk_types.h' line='145' column='1' id='type-id-359'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bi_next' type-id='type-id-358' visibility='default' filepath='include/linux/blk_types.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bi_disk' type-id='type-id-360' visibility='default' filepath='include/linux/blk_types.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bi_opf' type-id='type-id-5' visibility='default' filepath='include/linux/blk_types.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='bi_flags' type-id='type-id-312' visibility='default' filepath='include/linux/blk_types.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='176'>
+          <var-decl name='bi_ioprio' type-id='type-id-312' visibility='default' filepath='include/linux/blk_types.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='bi_write_hint' type-id='type-id-312' visibility='default' filepath='include/linux/blk_types.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='208'>
+          <var-decl name='bi_status' type-id='type-id-361' visibility='default' filepath='include/linux/blk_types.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='216'>
+          <var-decl name='bi_partno' type-id='type-id-214' visibility='default' filepath='include/linux/blk_types.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='bi_phys_segments' type-id='type-id-5' visibility='default' filepath='include/linux/blk_types.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='bi_seg_front_size' type-id='type-id-5' visibility='default' filepath='include/linux/blk_types.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='bi_seg_back_size' type-id='type-id-5' visibility='default' filepath='include/linux/blk_types.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='bi_iter' type-id='type-id-362' visibility='default' filepath='include/linux/blk_types.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='__bi_remaining' type-id='type-id-26' visibility='default' filepath='include/linux/blk_types.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='bi_end_io' type-id='type-id-363' visibility='default' filepath='include/linux/blk_types.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='bi_private' type-id='type-id-15' visibility='default' filepath='include/linux/blk_types.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='bi_ioc' type-id='type-id-364' visibility='default' filepath='include/linux/blk_types.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='bi_css' type-id='type-id-365' visibility='default' filepath='include/linux/blk_types.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='bi_blkg' type-id='type-id-366' visibility='default' filepath='include/linux/blk_types.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='bi_issue' type-id='type-id-367' visibility='default' filepath='include/linux/blk_types.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='bi_crypt_context' type-id='type-id-368' visibility='default' filepath='include/linux/blk_types.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='' type-id='type-id-369' visibility='default' filepath='include/linux/blk_types.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='bi_vcnt' type-id='type-id-312' visibility='default' filepath='include/linux/blk_types.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1040'>
+          <var-decl name='bi_max_vecs' type-id='type-id-312' visibility='default' filepath='include/linux/blk_types.h' line='203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='__bi_cnt' type-id='type-id-26' visibility='default' filepath='include/linux/blk_types.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='bi_io_vec' type-id='type-id-370' visibility='default' filepath='include/linux/blk_types.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='bi_pool' type-id='type-id-371' visibility='default' filepath='include/linux/blk_types.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='bi_inline_vecs' type-id='type-id-132' visibility='default' filepath='include/linux/blk_types.h' line='216' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='gendisk' size-in-bits='9344' is-struct='yes' visibility='default' filepath='include/linux/genhd.h' line='174' column='1' id='type-id-372'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='major' type-id='type-id-17' visibility='default' filepath='include/linux/genhd.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='first_minor' type-id='type-id-17' visibility='default' filepath='include/linux/genhd.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='minors' type-id='type-id-17' visibility='default' filepath='include/linux/genhd.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='disk_name' type-id='type-id-373' visibility='default' filepath='include/linux/genhd.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='devnode' type-id='type-id-374' visibility='default' filepath='include/linux/genhd.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='events' type-id='type-id-5' visibility='default' filepath='include/linux/genhd.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='async_events' type-id='type-id-5' visibility='default' filepath='include/linux/genhd.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='part_tbl' type-id='type-id-375' visibility='default' filepath='include/linux/genhd.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='part0' type-id='type-id-376' visibility='default' filepath='include/linux/genhd.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8384'>
+          <var-decl name='fops' type-id='type-id-377' visibility='default' filepath='include/linux/genhd.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8448'>
+          <var-decl name='queue' type-id='type-id-378' visibility='default' filepath='include/linux/genhd.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8512'>
+          <var-decl name='private_data' type-id='type-id-15' visibility='default' filepath='include/linux/genhd.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8576'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/genhd.h' line='201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8640'>
+          <var-decl name='lookup_sem' type-id='type-id-246' visibility='default' filepath='include/linux/genhd.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8960'>
+          <var-decl name='slave_dir' type-id='type-id-379' visibility='default' filepath='include/linux/genhd.h' line='203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9024'>
+          <var-decl name='random' type-id='type-id-380' visibility='default' filepath='include/linux/genhd.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9088'>
+          <var-decl name='sync_io' type-id='type-id-26' visibility='default' filepath='include/linux/genhd.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9152'>
+          <var-decl name='ev' type-id='type-id-381' visibility='default' filepath='include/linux/genhd.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9216'>
+          <var-decl name='node_id' type-id='type-id-17' visibility='default' filepath='include/linux/genhd.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9280'>
+          <var-decl name='bb' type-id='type-id-382' visibility='default' filepath='include/linux/genhd.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9344'>
+          <var-decl name='lockdep_map' type-id='type-id-383' visibility='default' filepath='include/linux/genhd.h' line='213' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='disk_part_tbl' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/genhd.h' line='152' column='1' id='type-id-384'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/genhd.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='len' type-id='type-id-17' visibility='default' filepath='include/linux/genhd.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='last_lookup' type-id='type-id-184' visibility='default' filepath='include/linux/genhd.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='part' type-id='type-id-185' visibility='default' filepath='include/linux/genhd.h' line='156' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hd_struct' size-in-bits='7808' is-struct='yes' visibility='default' filepath='include/linux/genhd.h' line='106' column='1' id='type-id-376'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start_sect' type-id='type-id-386' visibility='default' filepath='include/linux/genhd.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nr_sects' type-id='type-id-386' visibility='default' filepath='include/linux/genhd.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='nr_sects_seq' type-id='type-id-387' visibility='default' filepath='include/linux/genhd.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='alignment_offset' type-id='type-id-386' visibility='default' filepath='include/linux/genhd.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='discard_alignment' type-id='type-id-5' visibility='default' filepath='include/linux/genhd.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='__dev' type-id='type-id-388' visibility='default' filepath='include/linux/genhd.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='holder_dir' type-id='type-id-379' visibility='default' filepath='include/linux/genhd.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='policy' type-id='type-id-17' visibility='default' filepath='include/linux/genhd.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6624'>
+          <var-decl name='partno' type-id='type-id-17' visibility='default' filepath='include/linux/genhd.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='info' type-id='type-id-389' visibility='default' filepath='include/linux/genhd.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6720'>
+          <var-decl name='stamp' type-id='type-id-16' visibility='default' filepath='include/linux/genhd.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6784'>
+          <var-decl name='in_flight' type-id='type-id-127' visibility='default' filepath='include/linux/genhd.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6848'>
+          <var-decl name='dkstats' type-id='type-id-390' visibility='default' filepath='include/linux/genhd.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6912'>
+          <var-decl name='ref' type-id='type-id-391' visibility='default' filepath='include/linux/genhd.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7360'>
+          <var-decl name='rcu_work' type-id='type-id-392' visibility='default' filepath='include/linux/genhd.h' line='132' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='partition_meta_info' size-in-bits='808' is-struct='yes' visibility='default' filepath='include/linux/genhd.h' line='101' column='1' id='type-id-393'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='uuid' type-id='type-id-147' visibility='default' filepath='include/linux/genhd.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='296'>
+          <var-decl name='volname' type-id='type-id-215' visibility='default' filepath='include/linux/genhd.h' line='103' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='disk_stats' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/linux/genhd.h' line='85' column='1' id='type-id-394'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nsecs' type-id='type-id-213' visibility='default' filepath='include/linux/genhd.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sectors' type-id='type-id-220' visibility='default' filepath='include/linux/genhd.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ios' type-id='type-id-220' visibility='default' filepath='include/linux/genhd.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='merges' type-id='type-id-220' visibility='default' filepath='include/linux/genhd.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='io_ticks' type-id='type-id-16' visibility='default' filepath='include/linux/genhd.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='time_in_queue' type-id='type-id-16' visibility='default' filepath='include/linux/genhd.h' line='91' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='block_device_operations' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/blkdev.h' line='1984' column='1' id='type-id-395'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='open' type-id='type-id-396' visibility='default' filepath='include/linux/blkdev.h' line='1985' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='release' type-id='type-id-397' visibility='default' filepath='include/linux/blkdev.h' line='1986' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rw_page' type-id='type-id-398' visibility='default' filepath='include/linux/blkdev.h' line='1987' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ioctl' type-id='type-id-399' visibility='default' filepath='include/linux/blkdev.h' line='1988' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='compat_ioctl' type-id='type-id-399' visibility='default' filepath='include/linux/blkdev.h' line='1989' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='check_events' type-id='type-id-400' visibility='default' filepath='include/linux/blkdev.h' line='1990' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='media_changed' type-id='type-id-401' visibility='default' filepath='include/linux/blkdev.h' line='1993' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='unlock_native_capacity' type-id='type-id-402' visibility='default' filepath='include/linux/blkdev.h' line='1994' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='revalidate_disk' type-id='type-id-401' visibility='default' filepath='include/linux/blkdev.h' line='1995' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='getgeo' type-id='type-id-403' visibility='default' filepath='include/linux/blkdev.h' line='1996' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='swap_slot_free_notify' type-id='type-id-404' visibility='default' filepath='include/linux/blkdev.h' line='1998' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/blkdev.h' line='1999' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='pr_ops' type-id='type-id-405' visibility='default' filepath='include/linux/blkdev.h' line='2000' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bdi_writeback' size-in-bits='5568' is-struct='yes' visibility='default' filepath='include/linux/backing-dev-defs.h' line='109' column='1' id='type-id-406'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bdi' type-id='type-id-407' visibility='default' filepath='include/linux/backing-dev-defs.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='state' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='last_old_flush' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='b_dirty' type-id='type-id-20' visibility='default' filepath='include/linux/backing-dev-defs.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='b_io' type-id='type-id-20' visibility='default' filepath='include/linux/backing-dev-defs.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='b_more_io' type-id='type-id-20' visibility='default' filepath='include/linux/backing-dev-defs.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='b_dirty_time' type-id='type-id-20' visibility='default' filepath='include/linux/backing-dev-defs.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='list_lock' type-id='type-id-247' visibility='default' filepath='include/linux/backing-dev-defs.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='stat' type-id='type-id-205' visibility='default' filepath='include/linux/backing-dev-defs.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='congested' type-id='type-id-408' visibility='default' filepath='include/linux/backing-dev-defs.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='bw_time_stamp' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='dirtied_stamp' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='written_stamp' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='write_bandwidth' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='avg_write_bandwidth' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='dirty_ratelimit' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='balanced_dirty_ratelimit' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='completions' type-id='type-id-409' visibility='default' filepath='include/linux/backing-dev-defs.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='dirty_exceeded' type-id='type-id-17' visibility='default' filepath='include/linux/backing-dev-defs.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2976'>
+          <var-decl name='start_all_reason' type-id='type-id-410' visibility='default' filepath='include/linux/backing-dev-defs.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='work_lock' type-id='type-id-247' visibility='default' filepath='include/linux/backing-dev-defs.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='work_list' type-id='type-id-20' visibility='default' filepath='include/linux/backing-dev-defs.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='dwork' type-id='type-id-411' visibility='default' filepath='include/linux/backing-dev-defs.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3904'>
+          <var-decl name='dirty_sleep' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='bdi_node' type-id='type-id-20' visibility='default' filepath='include/linux/backing-dev-defs.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='refcnt' type-id='type-id-391' visibility='default' filepath='include/linux/backing-dev-defs.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='memcg_completions' type-id='type-id-409' visibility='default' filepath='include/linux/backing-dev-defs.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='memcg_css' type-id='type-id-365' visibility='default' filepath='include/linux/backing-dev-defs.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='blkcg_css' type-id='type-id-365' visibility='default' filepath='include/linux/backing-dev-defs.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='memcg_node' type-id='type-id-20' visibility='default' filepath='include/linux/backing-dev-defs.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='blkcg_node' type-id='type-id-20' visibility='default' filepath='include/linux/backing-dev-defs.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='' type-id='type-id-412' visibility='default' filepath='include/linux/backing-dev-defs.h' line='160' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='backing_dev_info' size-in-bits='7936' is-struct='yes' visibility='default' filepath='include/linux/backing-dev-defs.h' line='167' column='1' id='type-id-413'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bdi_list' type-id='type-id-20' visibility='default' filepath='include/linux/backing-dev-defs.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ra_pages' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='io_pages' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='congested_fn' type-id='type-id-414' visibility='default' filepath='include/linux/backing-dev-defs.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='congested_data' type-id='type-id-15' visibility='default' filepath='include/linux/backing-dev-defs.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/backing-dev-defs.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='refcnt' type-id='type-id-239' visibility='default' filepath='include/linux/backing-dev-defs.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='capabilities' type-id='type-id-5' visibility='default' filepath='include/linux/backing-dev-defs.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='min_ratio' type-id='type-id-5' visibility='default' filepath='include/linux/backing-dev-defs.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='max_ratio' type-id='type-id-5' visibility='default' filepath='include/linux/backing-dev-defs.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='max_prop_frac' type-id='type-id-5' visibility='default' filepath='include/linux/backing-dev-defs.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='tot_write_bandwidth' type-id='type-id-115' visibility='default' filepath='include/linux/backing-dev-defs.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='wb' type-id='type-id-406' visibility='default' filepath='include/linux/backing-dev-defs.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='wb_list' type-id='type-id-20' visibility='default' filepath='include/linux/backing-dev-defs.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='cgwb_tree' type-id='type-id-415' visibility='default' filepath='include/linux/backing-dev-defs.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='cgwb_congested_tree' type-id='type-id-416' visibility='default' filepath='include/linux/backing-dev-defs.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='cgwb_release_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/backing-dev-defs.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6848'>
+          <var-decl name='wb_switch_rwsem' type-id='type-id-246' visibility='default' filepath='include/linux/backing-dev-defs.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7168'>
+          <var-decl name='wb_waitq' type-id='type-id-225' visibility='default' filepath='include/linux/backing-dev-defs.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7360'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/backing-dev-defs.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7424'>
+          <var-decl name='owner' type-id='type-id-240' visibility='default' filepath='include/linux/backing-dev-defs.h' line='200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='laptop_mode_wb_timer' type-id='type-id-417' visibility='default' filepath='include/linux/backing-dev-defs.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7808'>
+          <var-decl name='debug_dir' type-id='type-id-23' visibility='default' filepath='include/linux/backing-dev-defs.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7872'>
+          <var-decl name='debug_stats' type-id='type-id-23' visibility='default' filepath='include/linux/backing-dev-defs.h' line='206' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='congested_fn' type-id='type-id-418' filepath='include/linux/backing-dev-defs.h' line='36' column='1' id='type-id-419'/>
+      <class-decl name='bdi_writeback_congested' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/backing-dev-defs.h' line='77' column='1' id='type-id-420'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='state' type-id='type-id-16' visibility='default' filepath='include/linux/backing-dev-defs.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/linux/backing-dev-defs.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='__bdi' type-id='type-id-407' visibility='default' filepath='include/linux/backing-dev-defs.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='blkcg_id' type-id='type-id-17' visibility='default' filepath='include/linux/backing-dev-defs.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rb_node' type-id='type-id-422' visibility='default' filepath='include/linux/backing-dev-defs.h' line='86' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fprop_local_percpu' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/flex_proportions.h' line='76' column='1' id='type-id-409'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='events' type-id='type-id-204' visibility='default' filepath='include/linux/flex_proportions.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='period' type-id='type-id-5' visibility='default' filepath='include/linux/flex_proportions.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='include/linux/flex_proportions.h' line='81' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='wb_reason' filepath='include/linux/backing-dev-defs.h' line='51' column='1' id='type-id-410'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='WB_REASON_BACKGROUND' value='0'/>
+        <enumerator name='WB_REASON_VMSCAN' value='1'/>
+        <enumerator name='WB_REASON_SYNC' value='2'/>
+        <enumerator name='WB_REASON_PERIODIC' value='3'/>
+        <enumerator name='WB_REASON_LAPTOP_TIMER' value='4'/>
+        <enumerator name='WB_REASON_FREE_MORE_MEM' value='5'/>
+        <enumerator name='WB_REASON_FS_FREE_SPACE' value='6'/>
+        <enumerator name='WB_REASON_FORKER_THREAD' value='7'/>
+        <enumerator name='WB_REASON_MAX' value='8'/>
+      </enum-decl>
+      <class-decl name='mem_cgroup' size-in-bits='18432' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='197' column='1' id='type-id-423'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='css' type-id='type-id-424' visibility='default' filepath='include/linux/memcontrol.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='id' type-id='type-id-425' visibility='default' filepath='include/linux/memcontrol.h' line='201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='memory' type-id='type-id-426' visibility='default' filepath='include/linux/memcontrol.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='swap' type-id='type-id-426' visibility='default' filepath='include/linux/memcontrol.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='memsw' type-id='type-id-426' visibility='default' filepath='include/linux/memcontrol.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='kmem' type-id='type-id-426' visibility='default' filepath='include/linux/memcontrol.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='tcpmem' type-id='type-id-426' visibility='default' filepath='include/linux/memcontrol.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='high' type-id='type-id-16' visibility='default' filepath='include/linux/memcontrol.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='high_work' type-id='type-id-255' visibility='default' filepath='include/linux/memcontrol.h' line='216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='soft_limit' type-id='type-id-16' visibility='default' filepath='include/linux/memcontrol.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='vmpressure' type-id='type-id-427' visibility='default' filepath='include/linux/memcontrol.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='use_hierarchy' type-id='type-id-33' visibility='default' filepath='include/linux/memcontrol.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7496'>
+          <var-decl name='oom_group' type-id='type-id-33' visibility='default' filepath='include/linux/memcontrol.h' line='231' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7504'>
+          <var-decl name='oom_lock' type-id='type-id-33' visibility='default' filepath='include/linux/memcontrol.h' line='234' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7520'>
+          <var-decl name='under_oom' type-id='type-id-17' visibility='default' filepath='include/linux/memcontrol.h' line='235' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7552'>
+          <var-decl name='swappiness' type-id='type-id-17' visibility='default' filepath='include/linux/memcontrol.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7584'>
+          <var-decl name='oom_kill_disable' type-id='type-id-17' visibility='default' filepath='include/linux/memcontrol.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7616'>
+          <var-decl name='events_file' type-id='type-id-428' visibility='default' filepath='include/linux/memcontrol.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8064'>
+          <var-decl name='swap_events_file' type-id='type-id-428' visibility='default' filepath='include/linux/memcontrol.h' line='245' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8512'>
+          <var-decl name='thresholds_lock' type-id='type-id-245' visibility='default' filepath='include/linux/memcontrol.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8768'>
+          <var-decl name='thresholds' type-id='type-id-429' visibility='default' filepath='include/linux/memcontrol.h' line='251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8896'>
+          <var-decl name='memsw_thresholds' type-id='type-id-429' visibility='default' filepath='include/linux/memcontrol.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9024'>
+          <var-decl name='oom_notify' type-id='type-id-20' visibility='default' filepath='include/linux/memcontrol.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9152'>
+          <var-decl name='move_charge_at_immigrate' type-id='type-id-16' visibility='default' filepath='include/linux/memcontrol.h' line='263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9216'>
+          <var-decl name='move_lock' type-id='type-id-247' visibility='default' filepath='include/linux/memcontrol.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9280'>
+          <var-decl name='move_lock_flags' type-id='type-id-16' visibility='default' filepath='include/linux/memcontrol.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9728'>
+          <var-decl name='_pad1_' type-id='type-id-430' visibility='default' filepath='include/linux/memcontrol.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9728'>
+          <var-decl name='moving_account' type-id='type-id-26' visibility='default' filepath='include/linux/memcontrol.h' line='273' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9792'>
+          <var-decl name='move_lock_task' type-id='type-id-431' visibility='default' filepath='include/linux/memcontrol.h' line='274' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9856'>
+          <var-decl name='stat_cpu' type-id='type-id-432' visibility='default' filepath='include/linux/memcontrol.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10240'>
+          <var-decl name='_pad2_' type-id='type-id-430' visibility='default' filepath='include/linux/memcontrol.h' line='279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10240'>
+          <var-decl name='stat' type-id='type-id-120' visibility='default' filepath='include/linux/memcontrol.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12480'>
+          <var-decl name='events' type-id='type-id-122' visibility='default' filepath='include/linux/memcontrol.h' line='282' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16064'>
+          <var-decl name='memory_events' type-id='type-id-124' visibility='default' filepath='include/linux/memcontrol.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16512'>
+          <var-decl name='socket_pressure' type-id='type-id-16' visibility='default' filepath='include/linux/memcontrol.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16576'>
+          <var-decl name='tcpmem_active' type-id='type-id-33' visibility='default' filepath='include/linux/memcontrol.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16608'>
+          <var-decl name='tcpmem_pressure' type-id='type-id-17' visibility='default' filepath='include/linux/memcontrol.h' line='289' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16640'>
+          <var-decl name='kmemcg_id' type-id='type-id-17' visibility='default' filepath='include/linux/memcontrol.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16672'>
+          <var-decl name='kmem_state' type-id='type-id-433' visibility='default' filepath='include/linux/memcontrol.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16704'>
+          <var-decl name='kmem_caches' type-id='type-id-20' visibility='default' filepath='include/linux/memcontrol.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16832'>
+          <var-decl name='last_scanned_node' type-id='type-id-17' visibility='default' filepath='include/linux/memcontrol.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16896'>
+          <var-decl name='cgwb_list' type-id='type-id-20' visibility='default' filepath='include/linux/memcontrol.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17024'>
+          <var-decl name='cgwb_domain' type-id='type-id-434' visibility='default' filepath='include/linux/memcontrol.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17984'>
+          <var-decl name='event_list' type-id='type-id-20' visibility='default' filepath='include/linux/memcontrol.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18112'>
+          <var-decl name='event_list_lock' type-id='type-id-247' visibility='default' filepath='include/linux/memcontrol.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18176'>
+          <var-decl name='nodeinfo' type-id='type-id-198' visibility='default' filepath='include/linux/memcontrol.h' line='314' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mem_cgroup_id' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='79' column='1' id='type-id-425'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/memcontrol.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ref' type-id='type-id-26' visibility='default' filepath='include/linux/memcontrol.h' line='81' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='page_counter' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/page_counter.h' line='9' column='1' id='type-id-426'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='usage' type-id='type-id-115' visibility='default' filepath='include/linux/page_counter.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='min' type-id='type-id-16' visibility='default' filepath='include/linux/page_counter.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='low' type-id='type-id-16' visibility='default' filepath='include/linux/page_counter.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='max' type-id='type-id-16' visibility='default' filepath='include/linux/page_counter.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='parent' type-id='type-id-435' visibility='default' filepath='include/linux/page_counter.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='emin' type-id='type-id-16' visibility='default' filepath='include/linux/page_counter.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='min_usage' type-id='type-id-115' visibility='default' filepath='include/linux/page_counter.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='children_min_usage' type-id='type-id-115' visibility='default' filepath='include/linux/page_counter.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='elow' type-id='type-id-16' visibility='default' filepath='include/linux/page_counter.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='low_usage' type-id='type-id-115' visibility='default' filepath='include/linux/page_counter.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='children_low_usage' type-id='type-id-115' visibility='default' filepath='include/linux/page_counter.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='watermark' type-id='type-id-16' visibility='default' filepath='include/linux/page_counter.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='failcnt' type-id='type-id-16' visibility='default' filepath='include/linux/page_counter.h' line='28' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vmpressure' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/vmpressure.h' line='13' column='1' id='type-id-427'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='scanned' type-id='type-id-16' visibility='default' filepath='include/linux/vmpressure.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='reclaimed' type-id='type-id-16' visibility='default' filepath='include/linux/vmpressure.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tree_scanned' type-id='type-id-16' visibility='default' filepath='include/linux/vmpressure.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tree_reclaimed' type-id='type-id-16' visibility='default' filepath='include/linux/vmpressure.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='sr_lock' type-id='type-id-436' visibility='default' filepath='include/linux/vmpressure.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='events' type-id='type-id-20' visibility='default' filepath='include/linux/vmpressure.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='events_lock' type-id='type-id-245' visibility='default' filepath='include/linux/vmpressure.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='work' type-id='type-id-255' visibility='default' filepath='include/linux/vmpressure.h' line='27' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mem_cgroup_thresholds' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='165' column='1' id='type-id-429'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='primary' type-id='type-id-437' visibility='default' filepath='include/linux/memcontrol.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='spare' type-id='type-id-437' visibility='default' filepath='include/linux/memcontrol.h' line='173' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mem_cgroup_threshold_ary' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='156' column='1' id='type-id-438'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='current_threshold' type-id='type-id-17' visibility='default' filepath='include/linux/memcontrol.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='size' type-id='type-id-5' visibility='default' filepath='include/linux/memcontrol.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='entries' type-id='type-id-203' visibility='default' filepath='include/linux/memcontrol.h' line='162' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mem_cgroup_threshold' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='150' column='1' id='type-id-202'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='eventfd' type-id='type-id-439' visibility='default' filepath='include/linux/memcontrol.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='threshold' type-id='type-id-16' visibility='default' filepath='include/linux/memcontrol.h' line='152' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='memcg_padding' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='183' column='1' id='type-id-430'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='x' type-id='type-id-440' visibility='default' filepath='include/linux/memcontrol.h' line='184' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mem_cgroup_stat_cpu' size-in-bits='6080' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='97' column='1' id='type-id-441'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-194' visibility='default' filepath='include/linux/memcontrol.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='events' type-id='type-id-223' visibility='default' filepath='include/linux/memcontrol.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='nr_page_events' type-id='type-id-16' visibility='default' filepath='include/linux/memcontrol.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='targets' type-id='type-id-220' visibility='default' filepath='include/linux/memcontrol.h' line='101' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='memcg_kmem_state' filepath='include/linux/memcontrol.h' line='176' column='1' id='type-id-433'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='KMEM_NONE' value='0'/>
+        <enumerator name='KMEM_ALLOCATED' value='1'/>
+        <enumerator name='KMEM_ONLINE' value='2'/>
+      </enum-decl>
+      <class-decl name='wb_domain' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/writeback.h' line='102' column='1' id='type-id-434'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/writeback.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='completions' type-id='type-id-442' visibility='default' filepath='include/linux/writeback.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='period_timer' type-id='type-id-417' visibility='default' filepath='include/linux/writeback.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='period_time' type-id='type-id-16' visibility='default' filepath='include/linux/writeback.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='dirty_limit_tstamp' type-id='type-id-16' visibility='default' filepath='include/linux/writeback.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='dirty_limit' type-id='type-id-16' visibility='default' filepath='include/linux/writeback.h' line='137' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fprop_global' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/flex_proportions.h' line='28' column='1' id='type-id-442'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='events' type-id='type-id-204' visibility='default' filepath='include/linux/flex_proportions.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='period' type-id='type-id-5' visibility='default' filepath='include/linux/flex_proportions.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='sequence' type-id='type-id-387' visibility='default' filepath='include/linux/flex_proportions.h' line='34' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mem_cgroup_per_node' size-in-bits='6080' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='126' column='1' id='type-id-443'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lruvec' type-id='type-id-444' visibility='default' filepath='include/linux/memcontrol.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='lruvec_stat_cpu' type-id='type-id-445' visibility='default' filepath='include/linux/memcontrol.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='lruvec_stat' type-id='type-id-118' visibility='default' filepath='include/linux/memcontrol.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='lru_zone_size' type-id='type-id-221' visibility='default' filepath='include/linux/memcontrol.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='iter' type-id='type-id-200' visibility='default' filepath='include/linux/memcontrol.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5632'>
+          <var-decl name='shrinker_map' type-id='type-id-446' visibility='default' filepath='include/linux/memcontrol.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5696'>
+          <var-decl name='tree_node' type-id='type-id-422' visibility='default' filepath='include/linux/memcontrol.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='usage_in_excess' type-id='type-id-16' visibility='default' filepath='include/linux/memcontrol.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5952'>
+          <var-decl name='on_tree' type-id='type-id-33' visibility='default' filepath='include/linux/memcontrol.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5960'>
+          <var-decl name='congested' type-id='type-id-33' visibility='default' filepath='include/linux/memcontrol.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='memcg' type-id='type-id-447' visibility='default' filepath='include/linux/memcontrol.h' line='146' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='lruvec' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='240' column='1' id='type-id-444'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lists' type-id='type-id-189' visibility='default' filepath='include/linux/mmzone.h' line='241' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='reclaim_stat' type-id='type-id-448' visibility='default' filepath='include/linux/mmzone.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='inactive_age' type-id='type-id-115' visibility='default' filepath='include/linux/mmzone.h' line='244' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='refaults' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='pgdat' type-id='type-id-449' visibility='default' filepath='include/linux/mmzone.h' line='248' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='zone_reclaim_stat' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='227' column='1' id='type-id-448'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='recent_rotated' type-id='type-id-219' visibility='default' filepath='include/linux/mmzone.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='recent_scanned' type-id='type-id-219' visibility='default' filepath='include/linux/mmzone.h' line='237' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pglist_data' size-in-bits='42496' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='628' column='1' id='type-id-450'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node_zones' type-id='type-id-228' visibility='default' filepath='include/linux/mmzone.h' line='629' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36864'>
+          <var-decl name='node_zonelists' type-id='type-id-230' visibility='default' filepath='include/linux/mmzone.h' line='630' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='37376'>
+          <var-decl name='nr_zones' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='631' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='37440'>
+          <var-decl name='node_start_pfn' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='655' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='37504'>
+          <var-decl name='node_present_pages' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='656' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='37568'>
+          <var-decl name='node_spanned_pages' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='657' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='37632'>
+          <var-decl name='node_id' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='659' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='37696'>
+          <var-decl name='kswapd_wait' type-id='type-id-225' visibility='default' filepath='include/linux/mmzone.h' line='660' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='37888'>
+          <var-decl name='pfmemalloc_wait' type-id='type-id-225' visibility='default' filepath='include/linux/mmzone.h' line='661' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38080'>
+          <var-decl name='kswapd' type-id='type-id-431' visibility='default' filepath='include/linux/mmzone.h' line='662' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38144'>
+          <var-decl name='kswapd_order' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='664' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38176'>
+          <var-decl name='kswapd_classzone_idx' type-id='type-id-451' visibility='default' filepath='include/linux/mmzone.h' line='665' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38208'>
+          <var-decl name='kswapd_failures' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38240'>
+          <var-decl name='kcompactd_max_order' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38272'>
+          <var-decl name='kcompactd_classzone_idx' type-id='type-id-451' visibility='default' filepath='include/linux/mmzone.h' line='671' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38336'>
+          <var-decl name='kcompactd_wait' type-id='type-id-225' visibility='default' filepath='include/linux/mmzone.h' line='672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38528'>
+          <var-decl name='kcompactd' type-id='type-id-431' visibility='default' filepath='include/linux/mmzone.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38592'>
+          <var-decl name='totalreserve_pages' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='679' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38912'>
+          <var-decl name='_pad1_' type-id='type-id-452' visibility='default' filepath='include/linux/mmzone.h' line='690' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38912'>
+          <var-decl name='lru_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mmzone.h' line='691' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38976'>
+          <var-decl name='lruvec' type-id='type-id-444' visibility='default' filepath='include/linux/mmzone.h' line='710' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40064'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='712' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40448'>
+          <var-decl name='_pad2_' type-id='type-id-452' visibility='default' filepath='include/linux/mmzone.h' line='714' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40448'>
+          <var-decl name='per_cpu_nodestats' type-id='type-id-453' visibility='default' filepath='include/linux/mmzone.h' line='717' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40512'>
+          <var-decl name='vm_stat' type-id='type-id-118' visibility='default' filepath='include/linux/mmzone.h' line='718' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='zone' size-in-bits='12288' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='363' column='1' id='type-id-227'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='watermark' type-id='type-id-220' visibility='default' filepath='include/linux/mmzone.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='nr_reserved_highatomic' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='lowmem_reserve' type-id='type-id-195' visibility='default' filepath='include/linux/mmzone.h' line='380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='zone_pgdat' type-id='type-id-449' visibility='default' filepath='include/linux/mmzone.h' line='385' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pageset' type-id='type-id-454' visibility='default' filepath='include/linux/mmzone.h' line='386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='zone_start_pfn' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='397' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='managed_pages' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='440' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='spanned_pages' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='present_pages' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='442' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/mmzone.h' line='444' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='nr_isolate_pageblock' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='452' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='initialized' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='_pad1_' type-id='type-id-452' visibility='default' filepath='include/linux/mmzone.h' line='463' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='free_area' type-id='type-id-182' visibility='default' filepath='include/linux/mmzone.h' line='466' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10176'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='469' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10240'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/mmzone.h' line='472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10752'>
+          <var-decl name='_pad2_' type-id='type-id-452' visibility='default' filepath='include/linux/mmzone.h' line='475' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10752'>
+          <var-decl name='percpu_drift_mark' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='482' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10816'>
+          <var-decl name='compact_cached_free_pfn' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='486' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10880'>
+          <var-decl name='compact_cached_migrate_pfn' type-id='type-id-219' visibility='default' filepath='include/linux/mmzone.h' line='488' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11008'>
+          <var-decl name='compact_considered' type-id='type-id-5' visibility='default' filepath='include/linux/mmzone.h' line='497' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11040'>
+          <var-decl name='compact_defer_shift' type-id='type-id-5' visibility='default' filepath='include/linux/mmzone.h' line='498' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11072'>
+          <var-decl name='compact_order_failed' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='499' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11104'>
+          <var-decl name='compact_blockskip_flush' type-id='type-id-33' visibility='default' filepath='include/linux/mmzone.h' line='504' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11112'>
+          <var-decl name='contiguous' type-id='type-id-33' visibility='default' filepath='include/linux/mmzone.h' line='507' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11264'>
+          <var-decl name='_pad3_' type-id='type-id-452' visibility='default' filepath='include/linux/mmzone.h' line='509' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11264'>
+          <var-decl name='vm_stat' type-id='type-id-116' visibility='default' filepath='include/linux/mmzone.h' line='511' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12160'>
+          <var-decl name='vm_numa_stat' type-id='type-id-126' visibility='default' filepath='include/linux/mmzone.h' line='512' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='per_cpu_pageset' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='287' column='1' id='type-id-455'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pcp' type-id='type-id-456' visibility='default' filepath='include/linux/mmzone.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='stat_threshold' type-id='type-id-209' visibility='default' filepath='include/linux/mmzone.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='520'>
+          <var-decl name='vm_stat_diff' type-id='type-id-210' visibility='default' filepath='include/linux/mmzone.h' line='295' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='per_cpu_pages' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='278' column='1' id='type-id-456'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='high' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='280' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='batch' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lists' type-id='type-id-457' visibility='default' filepath='include/linux/mmzone.h' line='284' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='zone_padding' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='110' column='1' id='type-id-452'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='x' type-id='type-id-440' visibility='default' filepath='include/linux/mmzone.h' line='111' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='free_area' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='96' column='1' id='type-id-181'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='free_list' type-id='type-id-190' visibility='default' filepath='include/linux/mmzone.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='nr_free' type-id='type-id-16' visibility='default' filepath='include/linux/mmzone.h' line='98' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='zonelist' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='610' column='1' id='type-id-229'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_zonerefs' type-id='type-id-232' visibility='default' filepath='include/linux/mmzone.h' line='611' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='zoneref' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='591' column='1' id='type-id-231'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='zone' type-id='type-id-458' visibility='default' filepath='include/linux/mmzone.h' line='592' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='zone_idx' type-id='type-id-17' visibility='default' filepath='include/linux/mmzone.h' line='593' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='zone_type' filepath='include/linux/mmzone.h' line='306' column='1' id='type-id-451'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='ZONE_DMA32' value='0'/>
+        <enumerator name='ZONE_NORMAL' value='1'/>
+        <enumerator name='ZONE_MOVABLE' value='2'/>
+        <enumerator name='__MAX_NR_ZONES' value='3'/>
+      </enum-decl>
+      <class-decl name='per_cpu_nodestat' size-in-bits='240' is-struct='yes' visibility='default' filepath='include/linux/mmzone.h' line='299' column='1' id='type-id-459'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='stat_threshold' type-id='type-id-209' visibility='default' filepath='include/linux/mmzone.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='vm_node_stat_diff' type-id='type-id-211' visibility='default' filepath='include/linux/mmzone.h' line='301' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='lruvec_stat' size-in-bits='1856' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='110' column='1' id='type-id-460'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-193' visibility='default' filepath='include/linux/memcontrol.h' line='111' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mem_cgroup_reclaim_iter' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='104' column='1' id='type-id-199'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='position' type-id='type-id-447' visibility='default' filepath='include/linux/memcontrol.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='generation' type-id='type-id-5' visibility='default' filepath='include/linux/memcontrol.h' line='107' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='memcg_shrinker_map' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/memcontrol.h' line='118' column='1' id='type-id-461'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/memcontrol.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='map' type-id='type-id-280' visibility='default' filepath='include/linux/memcontrol.h' line='120' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='request_queue' size-in-bits='18048' is-struct='yes' visibility='default' filepath='include/linux/blkdev.h' line='434' column='1' id='type-id-462'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='queue_head' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='438' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='last_merge' type-id='type-id-463' visibility='default' filepath='include/linux/blkdev.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='elevator' type-id='type-id-464' visibility='default' filepath='include/linux/blkdev.h' line='440' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='nr_rqs' type-id='type-id-465' visibility='default' filepath='include/linux/blkdev.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='nr_rqs_elvpriv' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='442' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='stats' type-id='type-id-466' visibility='default' filepath='include/linux/blkdev.h' line='444' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='rq_qos' type-id='type-id-467' visibility='default' filepath='include/linux/blkdev.h' line='445' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='root_rl' type-id='type-id-468' visibility='default' filepath='include/linux/blkdev.h' line='453' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='request_fn' type-id='type-id-469' visibility='default' filepath='include/linux/blkdev.h' line='455' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='make_request_fn' type-id='type-id-470' visibility='default' filepath='include/linux/blkdev.h' line='456' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='poll_fn' type-id='type-id-471' visibility='default' filepath='include/linux/blkdev.h' line='457' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='prep_rq_fn' type-id='type-id-472' visibility='default' filepath='include/linux/blkdev.h' line='458' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='unprep_rq_fn' type-id='type-id-473' visibility='default' filepath='include/linux/blkdev.h' line='459' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='softirq_done_fn' type-id='type-id-474' visibility='default' filepath='include/linux/blkdev.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='rq_timed_out_fn' type-id='type-id-475' visibility='default' filepath='include/linux/blkdev.h' line='461' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='dma_drain_needed' type-id='type-id-476' visibility='default' filepath='include/linux/blkdev.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='lld_busy_fn' type-id='type-id-477' visibility='default' filepath='include/linux/blkdev.h' line='463' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='init_rq_fn' type-id='type-id-478' visibility='default' filepath='include/linux/blkdev.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='exit_rq_fn' type-id='type-id-479' visibility='default' filepath='include/linux/blkdev.h' line='467' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='initialize_rq_fn' type-id='type-id-480' visibility='default' filepath='include/linux/blkdev.h' line='469' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='mq_ops' type-id='type-id-481' visibility='default' filepath='include/linux/blkdev.h' line='471' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='mq_map' type-id='type-id-482' visibility='default' filepath='include/linux/blkdev.h' line='473' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='queue_ctx' type-id='type-id-483' visibility='default' filepath='include/linux/blkdev.h' line='476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='nr_queues' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='477' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2272'>
+          <var-decl name='queue_depth' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='479' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='queue_hw_ctx' type-id='type-id-484' visibility='default' filepath='include/linux/blkdev.h' line='482' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='nr_hw_queues' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='483' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='end_sector' type-id='type-id-386' visibility='default' filepath='include/linux/blkdev.h' line='488' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='boundary_rq' type-id='type-id-463' visibility='default' filepath='include/linux/blkdev.h' line='489' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='delay_work' type-id='type-id-411' visibility='default' filepath='include/linux/blkdev.h' line='494' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='backing_dev_info' type-id='type-id-407' visibility='default' filepath='include/linux/blkdev.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='queuedata' type-id='type-id-15' visibility='default' filepath='include/linux/blkdev.h' line='502' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='queue_flags' type-id='type-id-16' visibility='default' filepath='include/linux/blkdev.h' line='507' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='pm_only' type-id='type-id-26' visibility='default' filepath='include/linux/blkdev.h' line='513' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3488'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='519' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='bounce_gfp' type-id='type-id-485' visibility='default' filepath='include/linux/blkdev.h' line='524' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3552'>
+          <var-decl name='__queue_lock' type-id='type-id-247' visibility='default' filepath='include/linux/blkdev.h' line='531' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='queue_lock' type-id='type-id-486' visibility='default' filepath='include/linux/blkdev.h' line='532' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/blkdev.h' line='537' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='mq_kobj' type-id='type-id-267' visibility='default' filepath='include/linux/blkdev.h' line='542' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/blkdev.h' line='549' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='rpm_status' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='550' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4768'>
+          <var-decl name='nr_pending' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='551' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='nr_requests' type-id='type-id-16' visibility='default' filepath='include/linux/blkdev.h' line='557' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='nr_congestion_on' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='558' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4896'>
+          <var-decl name='nr_congestion_off' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='559' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='nr_batching' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='560' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4960'>
+          <var-decl name='dma_drain_size' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='562' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='dma_drain_buffer' type-id='type-id-15' visibility='default' filepath='include/linux/blkdev.h' line='563' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='dma_pad_mask' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='564' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5088'>
+          <var-decl name='dma_alignment' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='565' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='queue_tags' type-id='type-id-487' visibility='default' filepath='include/linux/blkdev.h' line='567' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='nr_sorted' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='569' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5216'>
+          <var-decl name='in_flight' type-id='type-id-488' visibility='default' filepath='include/linux/blkdev.h' line='570' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5280'>
+          <var-decl name='request_fn_active' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='577' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='ksm' type-id='type-id-489' visibility='default' filepath='include/linux/blkdev.h' line='580' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='rq_timeout' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='583' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5408'>
+          <var-decl name='poll_nsec' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='584' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='poll_cb' type-id='type-id-490' visibility='default' filepath='include/linux/blkdev.h' line='586' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='poll_stat' type-id='type-id-134' visibility='default' filepath='include/linux/blkdev.h' line='587' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10624'>
+          <var-decl name='timeout' type-id='type-id-417' visibility='default' filepath='include/linux/blkdev.h' line='589' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10944'>
+          <var-decl name='timeout_work' type-id='type-id-255' visibility='default' filepath='include/linux/blkdev.h' line='590' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11200'>
+          <var-decl name='timeout_list' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='591' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11328'>
+          <var-decl name='icq_list' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='593' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11456'>
+          <var-decl name='blkcg_pols' type-id='type-id-491' visibility='default' filepath='include/linux/blkdev.h' line='595' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11520'>
+          <var-decl name='root_blkg' type-id='type-id-366' visibility='default' filepath='include/linux/blkdev.h' line='596' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11584'>
+          <var-decl name='blkg_list' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='597' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11712'>
+          <var-decl name='limits' type-id='type-id-492' visibility='default' filepath='include/linux/blkdev.h' line='600' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12544'>
+          <var-decl name='sg_timeout' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='628' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12576'>
+          <var-decl name='sg_reserved_size' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='629' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12608'>
+          <var-decl name='node' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='630' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12672'>
+          <var-decl name='fq' type-id='type-id-493' visibility='default' filepath='include/linux/blkdev.h' line='638' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12736'>
+          <var-decl name='requeue_list' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='640' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12864'>
+          <var-decl name='requeue_lock' type-id='type-id-247' visibility='default' filepath='include/linux/blkdev.h' line='641' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12928'>
+          <var-decl name='requeue_work' type-id='type-id-411' visibility='default' filepath='include/linux/blkdev.h' line='642' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13632'>
+          <var-decl name='sysfs_lock' type-id='type-id-245' visibility='default' filepath='include/linux/blkdev.h' line='644' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13888'>
+          <var-decl name='bypass_depth' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='646' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13920'>
+          <var-decl name='mq_freeze_depth' type-id='type-id-26' visibility='default' filepath='include/linux/blkdev.h' line='647' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13952'>
+          <var-decl name='bsg_job_fn' type-id='type-id-494' visibility='default' filepath='include/linux/blkdev.h' line='650' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14016'>
+          <var-decl name='bsg_dev' type-id='type-id-495' visibility='default' filepath='include/linux/blkdev.h' line='651' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14272'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/blkdev.h' line='658' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14400'>
+          <var-decl name='mq_freeze_wq' type-id='type-id-225' visibility='default' filepath='include/linux/blkdev.h' line='659' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14592'>
+          <var-decl name='q_usage_counter' type-id='type-id-391' visibility='default' filepath='include/linux/blkdev.h' line='660' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15040'>
+          <var-decl name='all_q_node' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='661' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15168'>
+          <var-decl name='tag_set' type-id='type-id-496' visibility='default' filepath='include/linux/blkdev.h' line='663' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15232'>
+          <var-decl name='tag_set_list' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='664' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15360'>
+          <var-decl name='bio_split' type-id='type-id-497' visibility='default' filepath='include/linux/blkdev.h' line='665' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17152'>
+          <var-decl name='debugfs_dir' type-id='type-id-23' visibility='default' filepath='include/linux/blkdev.h' line='668' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17216'>
+          <var-decl name='sched_debugfs_dir' type-id='type-id-23' visibility='default' filepath='include/linux/blkdev.h' line='669' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17280'>
+          <var-decl name='mq_sysfs_init_done' type-id='type-id-33' visibility='default' filepath='include/linux/blkdev.h' line='672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17344'>
+          <var-decl name='cmd_size' type-id='type-id-84' visibility='default' filepath='include/linux/blkdev.h' line='674' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17408'>
+          <var-decl name='rq_alloc_data' type-id='type-id-15' visibility='default' filepath='include/linux/blkdev.h' line='675' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17472'>
+          <var-decl name='release_work' type-id='type-id-255' visibility='default' filepath='include/linux/blkdev.h' line='677' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17728'>
+          <var-decl name='write_hints' type-id='type-id-498' visibility='default' filepath='include/linux/blkdev.h' line='680' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='request' size-in-bits='2432' is-struct='yes' visibility='default' filepath='include/linux/blkdev.h' line='151' column='1' id='type-id-499'>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/blkdev.h' line='188' column='1' id='type-id-500'>
+              <data-member access='private'>
+                <var-decl name='rb_node' type-id='type-id-422' visibility='default' filepath='include/linux/blkdev.h' line='189' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='special_vec' type-id='type-id-131' visibility='default' filepath='include/linux/blkdev.h' line='190' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='completion_data' type-id='type-id-15' visibility='default' filepath='include/linux/blkdev.h' line='191' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='error_count' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='192' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__1' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/blkdev.h' line='201' column='1' id='type-id-501'>
+              <data-member access='private'>
+                <var-decl name='elv' type-id='type-id-502' visibility='default' filepath='include/linux/blkdev.h' line='205' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='flush' type-id='type-id-503' visibility='default' filepath='include/linux/blkdev.h' line='211' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+        <member-type access='public'>
+          <union-decl name='__anonymous_union__2' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/blkdev.h' line='255' column='1' id='type-id-504'>
+            <data-member access='private'>
+              <var-decl name='csd' type-id='type-id-505' visibility='default' filepath='include/linux/blkdev.h' line='256' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='fifo_time' type-id='type-id-40' visibility='default' filepath='include/linux/blkdev.h' line='257' column='1'/>
+            </data-member>
+          </union-decl>
+        </member-type>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='q' type-id='type-id-378' visibility='default' filepath='include/linux/blkdev.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mq_ctx' type-id='type-id-483' visibility='default' filepath='include/linux/blkdev.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cpu' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='cmd_flags' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rq_flags' type-id='type-id-506' visibility='default' filepath='include/linux/blkdev.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='internal_tag' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='__data_len' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='tag' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='__sector' type-id='type-id-386' visibility='default' filepath='include/linux/blkdev.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='bio' type-id='type-id-358' visibility='default' filepath='include/linux/blkdev.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='biotail' type-id='type-id-358' visibility='default' filepath='include/linux/blkdev.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='queuelist' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='' type-id='type-id-507' visibility='default' filepath='include/linux/blkdev.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='rq_disk' type-id='type-id-360' visibility='default' filepath='include/linux/blkdev.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='part' type-id='type-id-184' visibility='default' filepath='include/linux/blkdev.h' line='215' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='start_time_ns' type-id='type-id-40' visibility='default' filepath='include/linux/blkdev.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='io_start_time_ns' type-id='type-id-40' visibility='default' filepath='include/linux/blkdev.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='nr_phys_segments' type-id='type-id-312' visibility='default' filepath='include/linux/blkdev.h' line='232' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1488'>
+          <var-decl name='write_hint' type-id='type-id-312' visibility='default' filepath='include/linux/blkdev.h' line='238' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='ioprio' type-id='type-id-312' visibility='default' filepath='include/linux/blkdev.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='special' type-id='type-id-15' visibility='default' filepath='include/linux/blkdev.h' line='241' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='extra_len' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1632'>
+          <var-decl name='state' type-id='type-id-508' visibility='default' filepath='include/linux/blkdev.h' line='245' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='ref' type-id='type-id-421' visibility='default' filepath='include/linux/blkdev.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1696'>
+          <var-decl name='timeout' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='__deadline' type-id='type-id-16' visibility='default' filepath='include/linux/blkdev.h' line='251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='timeout_list' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='253' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='end_io' type-id='type-id-509' visibility='default' filepath='include/linux/blkdev.h' line='263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='end_io_data' type-id='type-id-15' visibility='default' filepath='include/linux/blkdev.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='next_rq' type-id='type-id-463' visibility='default' filepath='include/linux/blkdev.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='rl' type-id='type-id-510' visibility='default' filepath='include/linux/blkdev.h' line='270' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='req_flags_t' type-id='type-id-511' filepath='include/linux/blkdev.h' line='83' column='1' id='type-id-506'/>
+      <class-decl name='bio_vec' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bvec.h' line='30' column='1' id='type-id-131'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bv_page' type-id='type-id-512' visibility='default' filepath='include/linux/bvec.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bv_len' type-id='type-id-5' visibility='default' filepath='include/linux/bvec.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='bv_offset' type-id='type-id-5' visibility='default' filepath='include/linux/bvec.h' line='33' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__11' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/blkdev.h' line='202' column='1' id='type-id-502'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='icq' type-id='type-id-513' visibility='default' filepath='include/linux/blkdev.h' line='203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='priv' type-id='type-id-224' visibility='default' filepath='include/linux/blkdev.h' line='204' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__12' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/blkdev.h' line='207' column='1' id='type-id-503'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='seq' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='saved_end_io' type-id='type-id-509' visibility='default' filepath='include/linux/blkdev.h' line='210' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='rq_end_io_fn' type-id='type-id-514' filepath='include/linux/blkdev.h' line='60' column='1' id='type-id-515'/>
+      <typedef-decl name='blk_status_t' type-id='type-id-214' filepath='include/linux/blk_types.h' line='30' column='1' id='type-id-361'/>
+      <enum-decl name='mq_rq_state' filepath='include/linux/blkdev.h' line='139' column='1' id='type-id-508'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='MQ_RQ_IDLE' value='0'/>
+        <enumerator name='MQ_RQ_IN_FLIGHT' value='1'/>
+        <enumerator name='MQ_RQ_COMPLETE' value='2'/>
+      </enum-decl>
+      <class-decl name='__call_single_data' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/smp.h' line='18' column='1' id='type-id-505'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='llist' type-id='type-id-281' visibility='default' filepath='include/linux/smp.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='func' type-id='type-id-516' visibility='default' filepath='include/linux/smp.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='info' type-id='type-id-15' visibility='default' filepath='include/linux/smp.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/smp.h' line='22' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='smp_call_func_t' type-id='type-id-517' filepath='include/linux/smp.h' line='17' column='1' id='type-id-516'/>
+      <class-decl name='request_list' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/blkdev.h' line='65' column='1' id='type-id-468'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='q' type-id='type-id-378' visibility='default' filepath='include/linux/blkdev.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='blkg' type-id='type-id-366' visibility='default' filepath='include/linux/blkdev.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='count' type-id='type-id-465' visibility='default' filepath='include/linux/blkdev.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='starved' type-id='type-id-465' visibility='default' filepath='include/linux/blkdev.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rq_pool' type-id='type-id-518' visibility='default' filepath='include/linux/blkdev.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='wait' type-id='type-id-226' visibility='default' filepath='include/linux/blkdev.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='78' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkcg_gq' size-in-bits='5952' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='109' column='1' id='type-id-519'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='q' type-id='type-id-378' visibility='default' filepath='include/linux/blk-cgroup.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='q_node' type-id='type-id-20' visibility='default' filepath='include/linux/blk-cgroup.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='blkcg_node' type-id='type-id-520' visibility='default' filepath='include/linux/blk-cgroup.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='blkcg' type-id='type-id-521' visibility='default' filepath='include/linux/blk-cgroup.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='wb_congested' type-id='type-id-408' visibility='default' filepath='include/linux/blk-cgroup.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='parent' type-id='type-id-366' visibility='default' filepath='include/linux/blk-cgroup.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='rl' type-id='type-id-468' visibility='default' filepath='include/linux/blk-cgroup.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='refcnt' type-id='type-id-26' visibility='default' filepath='include/linux/blk-cgroup.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='online' type-id='type-id-33' visibility='default' filepath='include/linux/blk-cgroup.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='stat_bytes' type-id='type-id-522' visibility='default' filepath='include/linux/blk-cgroup.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='stat_ios' type-id='type-id-522' visibility='default' filepath='include/linux/blk-cgroup.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='pd' type-id='type-id-139' visibility='default' filepath='include/linux/blk-cgroup.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/blk-cgroup.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5632'>
+          <var-decl name='use_delay' type-id='type-id-26' visibility='default' filepath='include/linux/blk-cgroup.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5696'>
+          <var-decl name='delay_nsec' type-id='type-id-113' visibility='default' filepath='include/linux/blk-cgroup.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='delay_start' type-id='type-id-113' visibility='default' filepath='include/linux/blk-cgroup.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='last_delay' type-id='type-id-40' visibility='default' filepath='include/linux/blk-cgroup.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='last_use' type-id='type-id-17' visibility='default' filepath='include/linux/blk-cgroup.h' line='145' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkcg' size-in-bits='2880' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='46' column='1' id='type-id-523'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='css' type-id='type-id-424' visibility='default' filepath='include/linux/blk-cgroup.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/blk-cgroup.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='blkg_tree' type-id='type-id-415' visibility='default' filepath='include/linux/blk-cgroup.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='blkg_hint' type-id='type-id-366' visibility='default' filepath='include/linux/blk-cgroup.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='blkg_list' type-id='type-id-186' visibility='default' filepath='include/linux/blk-cgroup.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='cpd' type-id='type-id-137' visibility='default' filepath='include/linux/blk-cgroup.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='all_blkcgs_node' type-id='type-id-20' visibility='default' filepath='include/linux/blk-cgroup.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='cgwb_list' type-id='type-id-20' visibility='default' filepath='include/linux/blk-cgroup.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='cgwb_refcnt' type-id='type-id-421' visibility='default' filepath='include/linux/blk-cgroup.h' line='59' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkcg_policy_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='102' column='1' id='type-id-524'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='blkcg' type-id='type-id-521' visibility='default' filepath='include/linux/blk-cgroup.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='plid' type-id='type-id-17' visibility='default' filepath='include/linux/blk-cgroup.h' line='105' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkg_rwstat' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='73' column='1' id='type-id-522'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cpu_cnt' type-id='type-id-206' visibility='default' filepath='include/linux/blk-cgroup.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='aux_cnt' type-id='type-id-114' visibility='default' filepath='include/linux/blk-cgroup.h' line='75' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkg_policy_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='89' column='1' id='type-id-525'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='blkg' type-id='type-id-366' visibility='default' filepath='include/linux/blk-cgroup.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='plid' type-id='type-id-17' visibility='default' filepath='include/linux/blk-cgroup.h' line='92' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='mempool_t' type-id='type-id-526' filepath='include/linux/mempool.h' line='26' column='1' id='type-id-527'/>
+      <class-decl name='mempool_s' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/mempool.h' line='16' column='1' id='type-id-526'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/mempool.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='min_nr' type-id='type-id-17' visibility='default' filepath='include/linux/mempool.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='curr_nr' type-id='type-id-17' visibility='default' filepath='include/linux/mempool.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='elements' type-id='type-id-528' visibility='default' filepath='include/linux/mempool.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='pool_data' type-id='type-id-15' visibility='default' filepath='include/linux/mempool.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='alloc' type-id='type-id-529' visibility='default' filepath='include/linux/mempool.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='free' type-id='type-id-530' visibility='default' filepath='include/linux/mempool.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='wait' type-id='type-id-225' visibility='default' filepath='include/linux/mempool.h' line='25' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='mempool_alloc_t' type-id='type-id-531' filepath='include/linux/mempool.h' line='13' column='1' id='type-id-532'/>
+      <typedef-decl name='mempool_free_t' type-id='type-id-533' filepath='include/linux/mempool.h' line='14' column='1' id='type-id-534'/>
+      <class-decl name='elevator_queue' size-in-bits='5056' is-struct='yes' visibility='default' filepath='include/linux/elevator.h' line='172' column='1' id='type-id-535'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-536' visibility='default' filepath='include/linux/elevator.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='elevator_data' type-id='type-id-15' visibility='default' filepath='include/linux/elevator.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/elevator.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='sysfs_lock' type-id='type-id-245' visibility='default' filepath='include/linux/elevator.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='registered' type-id='type-id-5' visibility='default' filepath='include/linux/elevator.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='uses_mq' type-id='type-id-5' visibility='default' filepath='include/linux/elevator.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='hash' type-id='type-id-187' visibility='default' filepath='include/linux/elevator.h' line='180' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='elevator_type' size-in-bits='2496' is-struct='yes' visibility='default' filepath='include/linux/elevator.h' line='135' column='1' id='type-id-537'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='icq_cache' type-id='type-id-538' visibility='default' filepath='include/linux/elevator.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ops' type-id='type-id-539' visibility='default' filepath='include/linux/elevator.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='icq_size' type-id='type-id-84' visibility='default' filepath='include/linux/elevator.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='icq_align' type-id='type-id-84' visibility='default' filepath='include/linux/elevator.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='elevator_attrs' type-id='type-id-540' visibility='default' filepath='include/linux/elevator.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='elevator_name' type-id='type-id-43' visibility='default' filepath='include/linux/elevator.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='elevator_alias' type-id='type-id-4' visibility='default' filepath='include/linux/elevator.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='elevator_owner' type-id='type-id-260' visibility='default' filepath='include/linux/elevator.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='uses_mq' type-id='type-id-33' visibility='default' filepath='include/linux/elevator.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='queue_debugfs_attrs' type-id='type-id-541' visibility='default' filepath='include/linux/elevator.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='hctx_debugfs_attrs' type-id='type-id-541' visibility='default' filepath='include/linux/elevator.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='icq_cache_name' type-id='type-id-145' visibility='default' filepath='include/linux/elevator.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/elevator.h' line='159' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='elevator_ops' size-in-bits='1344' is-struct='yes' visibility='default' filepath='include/linux/elevator.h' line='62' column='1' id='type-id-542'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='elevator_merge_fn' type-id='type-id-543' visibility='default' filepath='include/linux/elevator.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='elevator_merged_fn' type-id='type-id-544' visibility='default' filepath='include/linux/elevator.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='elevator_merge_req_fn' type-id='type-id-545' visibility='default' filepath='include/linux/elevator.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='elevator_allow_bio_merge_fn' type-id='type-id-546' visibility='default' filepath='include/linux/elevator.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='elevator_allow_rq_merge_fn' type-id='type-id-547' visibility='default' filepath='include/linux/elevator.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='elevator_bio_merged_fn' type-id='type-id-548' visibility='default' filepath='include/linux/elevator.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='elevator_dispatch_fn' type-id='type-id-549' visibility='default' filepath='include/linux/elevator.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='elevator_add_req_fn' type-id='type-id-550' visibility='default' filepath='include/linux/elevator.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='elevator_activate_req_fn' type-id='type-id-551' visibility='default' filepath='include/linux/elevator.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='elevator_deactivate_req_fn' type-id='type-id-552' visibility='default' filepath='include/linux/elevator.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='elevator_completed_req_fn' type-id='type-id-553' visibility='default' filepath='include/linux/elevator.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='elevator_former_req_fn' type-id='type-id-554' visibility='default' filepath='include/linux/elevator.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='elevator_latter_req_fn' type-id='type-id-554' visibility='default' filepath='include/linux/elevator.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='elevator_init_icq_fn' type-id='type-id-555' visibility='default' filepath='include/linux/elevator.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='elevator_exit_icq_fn' type-id='type-id-556' visibility='default' filepath='include/linux/elevator.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='elevator_set_req_fn' type-id='type-id-557' visibility='default' filepath='include/linux/elevator.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='elevator_put_req_fn' type-id='type-id-558' visibility='default' filepath='include/linux/elevator.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='elevator_may_queue_fn' type-id='type-id-559' visibility='default' filepath='include/linux/elevator.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='elevator_init_fn' type-id='type-id-560' visibility='default' filepath='include/linux/elevator.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='elevator_exit_fn' type-id='type-id-561' visibility='default' filepath='include/linux/elevator.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='elevator_registered_fn' type-id='type-id-562' visibility='default' filepath='include/linux/elevator.h' line='91' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='elevator_merge_fn' type-id='type-id-563' filepath='include/linux/elevator.h' line='26' column='1' id='type-id-564'/>
+      <enum-decl name='elv_merge' filepath='include/linux/elevator.h' line='19' column='1' id='type-id-565'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='ELEVATOR_NO_MERGE' value='0'/>
+        <enumerator name='ELEVATOR_FRONT_MERGE' value='1'/>
+        <enumerator name='ELEVATOR_BACK_MERGE' value='2'/>
+        <enumerator name='ELEVATOR_DISCARD_MERGE' value='3'/>
+      </enum-decl>
+      <typedef-decl name='elevator_merged_fn' type-id='type-id-566' filepath='include/linux/elevator.h' line='31' column='1' id='type-id-567'/>
+      <typedef-decl name='elevator_merge_req_fn' type-id='type-id-568' filepath='include/linux/elevator.h' line='29' column='1' id='type-id-569'/>
+      <typedef-decl name='elevator_allow_bio_merge_fn' type-id='type-id-570' filepath='include/linux/elevator.h' line='33' column='1' id='type-id-571'/>
+      <typedef-decl name='elevator_allow_rq_merge_fn' type-id='type-id-572' filepath='include/linux/elevator.h' line='36' column='1' id='type-id-573'/>
+      <typedef-decl name='elevator_bio_merged_fn' type-id='type-id-574' filepath='include/linux/elevator.h' line='39' column='1' id='type-id-575'/>
+      <typedef-decl name='elevator_dispatch_fn' type-id='type-id-576' filepath='include/linux/elevator.h' line='42' column='1' id='type-id-577'/>
+      <typedef-decl name='elevator_add_req_fn' type-id='type-id-578' filepath='include/linux/elevator.h' line='44' column='1' id='type-id-579'/>
+      <typedef-decl name='elevator_activate_req_fn' type-id='type-id-578' filepath='include/linux/elevator.h' line='54' column='1' id='type-id-580'/>
+      <typedef-decl name='elevator_deactivate_req_fn' type-id='type-id-578' filepath='include/linux/elevator.h' line='55' column='1' id='type-id-581'/>
+      <typedef-decl name='elevator_completed_req_fn' type-id='type-id-578' filepath='include/linux/elevator.h' line='46' column='1' id='type-id-582'/>
+      <typedef-decl name='elevator_request_list_fn' type-id='type-id-583' filepath='include/linux/elevator.h' line='45' column='1' id='type-id-584'/>
+      <typedef-decl name='elevator_init_icq_fn' type-id='type-id-585' filepath='include/linux/elevator.h' line='49' column='1' id='type-id-586'/>
+      <typedef-decl name='elevator_exit_icq_fn' type-id='type-id-585' filepath='include/linux/elevator.h' line='50' column='1' id='type-id-587'/>
+      <typedef-decl name='elevator_set_req_fn' type-id='type-id-588' filepath='include/linux/elevator.h' line='51' column='1' id='type-id-589'/>
+      <typedef-decl name='elevator_put_req_fn' type-id='type-id-590' filepath='include/linux/elevator.h' line='53' column='1' id='type-id-591'/>
+      <typedef-decl name='elevator_may_queue_fn' type-id='type-id-592' filepath='include/linux/elevator.h' line='47' column='1' id='type-id-593'/>
+      <typedef-decl name='elevator_init_fn' type-id='type-id-594' filepath='include/linux/elevator.h' line='57' column='1' id='type-id-595'/>
+      <typedef-decl name='elevator_exit_fn' type-id='type-id-596' filepath='include/linux/elevator.h' line='59' column='1' id='type-id-597'/>
+      <typedef-decl name='elevator_registered_fn' type-id='type-id-598' filepath='include/linux/elevator.h' line='60' column='1' id='type-id-599'/>
+      <class-decl name='elevator_mq_ops' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/linux/elevator.h' line='97' column='1' id='type-id-600'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='init_sched' type-id='type-id-601' visibility='default' filepath='include/linux/elevator.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='exit_sched' type-id='type-id-602' visibility='default' filepath='include/linux/elevator.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='init_hctx' type-id='type-id-603' visibility='default' filepath='include/linux/elevator.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='exit_hctx' type-id='type-id-604' visibility='default' filepath='include/linux/elevator.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='depth_updated' type-id='type-id-605' visibility='default' filepath='include/linux/elevator.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='allow_merge' type-id='type-id-606' visibility='default' filepath='include/linux/elevator.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='bio_merge' type-id='type-id-607' visibility='default' filepath='include/linux/elevator.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='request_merge' type-id='type-id-608' visibility='default' filepath='include/linux/elevator.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='request_merged' type-id='type-id-609' visibility='default' filepath='include/linux/elevator.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='requests_merged' type-id='type-id-610' visibility='default' filepath='include/linux/elevator.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='limit_depth' type-id='type-id-611' visibility='default' filepath='include/linux/elevator.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='prepare_request' type-id='type-id-612' visibility='default' filepath='include/linux/elevator.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='finish_request' type-id='type-id-480' visibility='default' filepath='include/linux/elevator.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='insert_requests' type-id='type-id-613' visibility='default' filepath='include/linux/elevator.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='dispatch_request' type-id='type-id-614' visibility='default' filepath='include/linux/elevator.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='has_work' type-id='type-id-615' visibility='default' filepath='include/linux/elevator.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='completed_request' type-id='type-id-480' visibility='default' filepath='include/linux/elevator.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='started_request' type-id='type-id-480' visibility='default' filepath='include/linux/elevator.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='requeue_request' type-id='type-id-480' visibility='default' filepath='include/linux/elevator.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='former_request' type-id='type-id-616' visibility='default' filepath='include/linux/elevator.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='next_request' type-id='type-id-616' visibility='default' filepath='include/linux/elevator.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='init_icq' type-id='type-id-617' visibility='default' filepath='include/linux/elevator.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='exit_icq' type-id='type-id-617' visibility='default' filepath='include/linux/elevator.h' line='121' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='elv_fs_entry' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/elevator.h' line='126' column='1' id='type-id-618'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='attr' type-id='type-id-619' visibility='default' filepath='include/linux/elevator.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='show' type-id='type-id-620' visibility='default' filepath='include/linux/elevator.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='store' type-id='type-id-621' visibility='default' filepath='include/linux/elevator.h' line='129' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='request_fn_proc' type-id='type-id-598' filepath='include/linux/blkdev.h' line='315' column='1' id='type-id-622'/>
+      <typedef-decl name='make_request_fn' type-id='type-id-623' filepath='include/linux/blkdev.h' line='316' column='1' id='type-id-624'/>
+      <typedef-decl name='blk_qc_t' type-id='type-id-5' filepath='include/linux/blk_types.h' line='424' column='1' id='type-id-625'/>
+      <typedef-decl name='poll_q_fn' type-id='type-id-626' filepath='include/linux/blkdev.h' line='317' column='1' id='type-id-627'/>
+      <typedef-decl name='prep_rq_fn' type-id='type-id-628' filepath='include/linux/blkdev.h' line='318' column='1' id='type-id-629'/>
+      <typedef-decl name='unprep_rq_fn' type-id='type-id-578' filepath='include/linux/blkdev.h' line='319' column='1' id='type-id-630'/>
+      <typedef-decl name='softirq_done_fn' type-id='type-id-590' filepath='include/linux/blkdev.h' line='322' column='1' id='type-id-631'/>
+      <typedef-decl name='rq_timed_out_fn' type-id='type-id-632' filepath='include/linux/blkdev.h' line='334' column='1' id='type-id-633'/>
+      <enum-decl name='blk_eh_timer_return' filepath='include/linux/blkdev.h' line='329' column='1' id='type-id-634'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='BLK_EH_DONE' value='0'/>
+        <enumerator name='BLK_EH_RESET_TIMER' value='1'/>
+      </enum-decl>
+      <typedef-decl name='dma_drain_needed_fn' type-id='type-id-635' filepath='include/linux/blkdev.h' line='323' column='1' id='type-id-636'/>
+      <typedef-decl name='lld_busy_fn' type-id='type-id-637' filepath='include/linux/blkdev.h' line='324' column='1' id='type-id-638'/>
+      <typedef-decl name='init_rq_fn' type-id='type-id-639' filepath='include/linux/blkdev.h' line='326' column='1' id='type-id-640'/>
+      <typedef-decl name='exit_rq_fn' type-id='type-id-578' filepath='include/linux/blkdev.h' line='327' column='1' id='type-id-641'/>
+      <class-decl name='blk_queue_tag' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/blkdev.h' line='341' column='1' id='type-id-642'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tag_index' type-id='type-id-643' visibility='default' filepath='include/linux/blkdev.h' line='342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tag_map' type-id='type-id-45' visibility='default' filepath='include/linux/blkdev.h' line='343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='max_depth' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='344' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='real_max_depth' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='refcnt' type-id='type-id-26' visibility='default' filepath='include/linux/blkdev.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='alloc_policy' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='next_tag' type-id='type-id-17' visibility='default' filepath='include/linux/blkdev.h' line='348' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blk_rq_stat' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/blk_types.h' line='460' column='1' id='type-id-133'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mean' type-id='type-id-40' visibility='default' filepath='include/linux/blk_types.h' line='461' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='min' type-id='type-id-40' visibility='default' filepath='include/linux/blk_types.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='max' type-id='type-id-40' visibility='default' filepath='include/linux/blk_types.h' line='463' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='nr_samples' type-id='type-id-7' visibility='default' filepath='include/linux/blk_types.h' line='464' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='batch' type-id='type-id-40' visibility='default' filepath='include/linux/blk_types.h' line='465' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='queue_limits' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/blkdev.h' line='365' column='1' id='type-id-492'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bounce_pfn' type-id='type-id-16' visibility='default' filepath='include/linux/blkdev.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='seg_boundary_mask' type-id='type-id-16' visibility='default' filepath='include/linux/blkdev.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='virt_boundary_mask' type-id='type-id-16' visibility='default' filepath='include/linux/blkdev.h' line='368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='max_hw_sectors' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='max_dev_sectors' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='chunk_sectors' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='372' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='max_sectors' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='max_segment_size' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='374' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='physical_block_size' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='alignment_offset' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='376' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='io_min' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='377' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='io_opt' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='378' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='max_discard_sectors' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='max_hw_discard_sectors' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='max_write_same_sectors' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='max_write_zeroes_sectors' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='discard_granularity' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='383' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='discard_alignment' type-id='type-id-5' visibility='default' filepath='include/linux/blkdev.h' line='384' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='logical_block_size' type-id='type-id-312' visibility='default' filepath='include/linux/blkdev.h' line='386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='688'>
+          <var-decl name='max_segments' type-id='type-id-312' visibility='default' filepath='include/linux/blkdev.h' line='387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='max_integrity_segments' type-id='type-id-312' visibility='default' filepath='include/linux/blkdev.h' line='388' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='720'>
+          <var-decl name='max_discard_segments' type-id='type-id-312' visibility='default' filepath='include/linux/blkdev.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='misaligned' type-id='type-id-216' visibility='default' filepath='include/linux/blkdev.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='744'>
+          <var-decl name='discard_misaligned' type-id='type-id-216' visibility='default' filepath='include/linux/blkdev.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='752'>
+          <var-decl name='cluster' type-id='type-id-216' visibility='default' filepath='include/linux/blkdev.h' line='393' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='760'>
+          <var-decl name='raid_partial_stripes_expensive' type-id='type-id-216' visibility='default' filepath='include/linux/blkdev.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='zoned' type-id='type-id-644' visibility='default' filepath='include/linux/blkdev.h' line='395' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='blk_zoned_model' filepath='include/linux/blkdev.h' line='359' column='1' id='type-id-644'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='BLK_ZONED_NONE' value='0'/>
+        <enumerator name='BLK_ZONED_HA' value='1'/>
+        <enumerator name='BLK_ZONED_HM' value='2'/>
+      </enum-decl>
+      <typedef-decl name='bsg_job_fn' type-id='type-id-645' filepath='include/linux/blkdev.h' line='325' column='1' id='type-id-646'/>
+      <class-decl name='bsg_class_device' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/bsg.h' line='18' column='1' id='type-id-495'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='class_dev' type-id='type-id-240' visibility='default' filepath='include/linux/bsg.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='minor' type-id='type-id-17' visibility='default' filepath='include/linux/bsg.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='queue' type-id='type-id-378' visibility='default' filepath='include/linux/bsg.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ops' type-id='type-id-647' visibility='default' filepath='include/linux/bsg.h' line='22' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bsg_ops' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/bsg.h' line='10' column='1' id='type-id-648'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='check_proto' type-id='type-id-649' visibility='default' filepath='include/linux/bsg.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fill_hdr' type-id='type-id-650' visibility='default' filepath='include/linux/bsg.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='complete_rq' type-id='type-id-651' visibility='default' filepath='include/linux/bsg.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='free_rq' type-id='type-id-480' visibility='default' filepath='include/linux/bsg.h' line='15' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sg_io_v4' size-in-bits='1280' is-struct='yes' visibility='default' filepath='include/uapi/linux/bsg.h' line='22' column='1' id='type-id-652'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='guard' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/bsg.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='protocol' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='subprotocol' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='request_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='request' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bsg.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='request_tag' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bsg.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='request_attr' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='request_priority' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='request_extra' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='max_response_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='response' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bsg.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='dout_iovec_count' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='dout_xfer_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='din_iovec_count' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='din_xfer_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='dout_xferp' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bsg.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='din_xferp' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bsg.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='timeout' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='usr_ptr' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bsg.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='spare_in' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='driver_status' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='transport_status' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='device_status' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='retry_delay' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='info' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='duration' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='response_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='din_resid' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/bsg.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='dout_resid' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/bsg.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='generated_tag' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bsg.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='spare_out' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1248'>
+          <var-decl name='padding' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bsg.h' line='63' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bio_set' size-in-bits='1792' is-struct='yes' visibility='default' filepath='include/linux/bio.h' line='746' column='1' id='type-id-497'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bio_slab' type-id='type-id-538' visibility='default' filepath='include/linux/bio.h' line='747' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='front_pad' type-id='type-id-5' visibility='default' filepath='include/linux/bio.h' line='748' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bio_pool' type-id='type-id-527' visibility='default' filepath='include/linux/bio.h' line='750' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='bvec_pool' type-id='type-id-527' visibility='default' filepath='include/linux/bio.h' line='751' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='rescue_lock' type-id='type-id-247' visibility='default' filepath='include/linux/bio.h' line='761' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='rescue_list' type-id='type-id-357' visibility='default' filepath='include/linux/bio.h' line='762' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='rescue_work' type-id='type-id-255' visibility='default' filepath='include/linux/bio.h' line='763' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='rescue_workqueue' type-id='type-id-654' visibility='default' filepath='include/linux/bio.h' line='764' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='lockdep_map' is-struct='yes' visibility='default' filepath='include/linux/lockdep.h' line='438' column='1' id='type-id-383'/>
+      <class-decl name='bvec_iter' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/bvec.h' line='36' column='1' id='type-id-362'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bi_sector' type-id='type-id-386' visibility='default' filepath='include/linux/bvec.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bi_size' type-id='type-id-5' visibility='default' filepath='include/linux/bvec.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='bi_idx' type-id='type-id-5' visibility='default' filepath='include/linux/bvec.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bi_done' type-id='type-id-5' visibility='default' filepath='include/linux/bvec.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='bi_bvec_done' type-id='type-id-5' visibility='default' filepath='include/linux/bvec.h' line='45' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='bio_end_io_t' type-id='type-id-655' filepath='include/linux/blk_types.h' line='20' column='1' id='type-id-656'/>
+      <class-decl name='bio_issue' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/blk_types.h' line='113' column='1' id='type-id-367'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='value' type-id='type-id-40' visibility='default' filepath='include/linux/blk_types.h' line='114' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bio_crypt_ctx' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/bio-crypt-ctx.h' line='17' column='1' id='type-id-657'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='keyslot' type-id='type-id-17' visibility='default' filepath='include/linux/bio-crypt-ctx.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='raw_key' type-id='type-id-658' visibility='default' filepath='include/linux/bio-crypt-ctx.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='crypto_mode' type-id='type-id-659' visibility='default' filepath='include/linux/bio-crypt-ctx.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='data_unit_num' type-id='type-id-40' visibility='default' filepath='include/linux/bio-crypt-ctx.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='data_unit_size_bits' type-id='type-id-5' visibility='default' filepath='include/linux/bio-crypt-ctx.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='processing_ksm' type-id='type-id-489' visibility='default' filepath='include/linux/bio-crypt-ctx.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='crypt_iter' type-id='type-id-362' visibility='default' filepath='include/linux/bio-crypt-ctx.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='sw_data_unit_num' type-id='type-id-40' visibility='default' filepath='include/linux/bio-crypt-ctx.h' line='37' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='blk_crypto_mode_num' filepath='include/linux/bio-crypt-ctx.h' line='8' column='1' id='type-id-659'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='BLK_ENCRYPTION_MODE_INVALID' value='0'/>
+        <enumerator name='BLK_ENCRYPTION_MODE_AES_256_XTS' value='1'/>
+      </enum-decl>
+      <class-decl name='perf_event_context' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='722' column='1' id='type-id-660'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pmu' type-id='type-id-661' visibility='default' filepath='include/linux/perf_event.h' line='723' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='include/linux/perf_event.h' line='728' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/perf_event.h' line='734' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='active_ctx_list' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='736' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pinned_groups' type-id='type-id-662' visibility='default' filepath='include/linux/perf_event.h' line='737' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='flexible_groups' type-id='type-id-662' visibility='default' filepath='include/linux/perf_event.h' line='738' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='event_list' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='739' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='pinned_active' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='741' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='flexible_active' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='742' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='nr_events' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='744' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='nr_active' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='745' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='is_active' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='746' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1248'>
+          <var-decl name='nr_stat' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='747' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='nr_freq' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='748' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='rotate_disable' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='749' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='refcount' type-id='type-id-26' visibility='default' filepath='include/linux/perf_event.h' line='750' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='task' type-id='type-id-431' visibility='default' filepath='include/linux/perf_event.h' line='751' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='time' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='756' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='timestamp' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='757' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='parent_ctx' type-id='type-id-663' visibility='default' filepath='include/linux/perf_event.h' line='763' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='parent_gen' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='764' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='generation' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='765' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='pin_count' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='task_ctx_data' type-id='type-id-15' visibility='default' filepath='include/linux/perf_event.h' line='770' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/perf_event.h' line='771' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pmu' size-in-bits='2112' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='251' column='1' id='type-id-664'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='entry' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='252' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='module' type-id='type-id-260' visibility='default' filepath='include/linux/perf_event.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/perf_event.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='attr_groups' type-id='type-id-665' visibility='default' filepath='include/linux/perf_event.h' line='256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/perf_event.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='type' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='capabilities' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='pmu_disable_count' type-id='type-id-666' visibility='default' filepath='include/linux/perf_event.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pmu_cpu_context' type-id='type-id-667' visibility='default' filepath='include/linux/perf_event.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='exclusive_cnt' type-id='type-id-26' visibility='default' filepath='include/linux/perf_event.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='task_ctx_nr' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='hrtimer_interval_ms' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='269' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='nr_addr_filters' type-id='type-id-5' visibility='default' filepath='include/linux/perf_event.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='pmu_enable' type-id='type-id-668' visibility='default' filepath='include/linux/perf_event.h' line='278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='pmu_disable' type-id='type-id-668' visibility='default' filepath='include/linux/perf_event.h' line='279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='event_init' type-id='type-id-669' visibility='default' filepath='include/linux/perf_event.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='event_mapped' type-id='type-id-670' visibility='default' filepath='include/linux/perf_event.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='event_unmapped' type-id='type-id-670' visibility='default' filepath='include/linux/perf_event.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='add' type-id='type-id-671' visibility='default' filepath='include/linux/perf_event.h' line='332' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='del' type-id='type-id-672' visibility='default' filepath='include/linux/perf_event.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='start' type-id='type-id-672' visibility='default' filepath='include/linux/perf_event.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='stop' type-id='type-id-672' visibility='default' filepath='include/linux/perf_event.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='read' type-id='type-id-673' visibility='default' filepath='include/linux/perf_event.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='start_txn' type-id='type-id-674' visibility='default' filepath='include/linux/perf_event.h' line='374' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='commit_txn' type-id='type-id-675' visibility='default' filepath='include/linux/perf_event.h' line='383' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='cancel_txn' type-id='type-id-668' visibility='default' filepath='include/linux/perf_event.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='event_idx' type-id='type-id-669' visibility='default' filepath='include/linux/perf_event.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='sched_task' type-id='type-id-676' visibility='default' filepath='include/linux/perf_event.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='task_ctx_size' type-id='type-id-84' visibility='default' filepath='include/linux/perf_event.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='setup_aux' type-id='type-id-677' visibility='default' filepath='include/linux/perf_event.h' line='412' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='free_aux' type-id='type-id-517' visibility='default' filepath='include/linux/perf_event.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='addr_filters_validate' type-id='type-id-678' visibility='default' filepath='include/linux/perf_event.h' line='429' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='addr_filters_sync' type-id='type-id-673' visibility='default' filepath='include/linux/perf_event.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='filter_match' type-id='type-id-669' visibility='default' filepath='include/linux/perf_event.h' line='449' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='check_period' type-id='type-id-679' visibility='default' filepath='include/linux/perf_event.h' line='454' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_cpu_context' size-in-bits='3072' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='783' column='1' id='type-id-680'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ctx' type-id='type-id-660' visibility='default' filepath='include/linux/perf_event.h' line='784' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='task_ctx' type-id='type-id-663' visibility='default' filepath='include/linux/perf_event.h' line='785' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='active_oncpu' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='786' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2144'>
+          <var-decl name='exclusive' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='787' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='hrtimer_lock' type-id='type-id-36' visibility='default' filepath='include/linux/perf_event.h' line='789' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='hrtimer' type-id='type-id-681' visibility='default' filepath='include/linux/perf_event.h' line='790' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='hrtimer_interval' type-id='type-id-682' visibility='default' filepath='include/linux/perf_event.h' line='791' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='hrtimer_active' type-id='type-id-5' visibility='default' filepath='include/linux/perf_event.h' line='792' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='sched_cb_entry' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='799' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='sched_cb_usage' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='800' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3040'>
+          <var-decl name='online' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='802' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_event' size-in-bits='7744' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='560' column='1' id='type-id-683'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='event_entry' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='567' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='sibling_list' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='573' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='active_list' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='574' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='group_node' type-id='type-id-422' visibility='default' filepath='include/linux/perf_event.h' line='578' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='group_index' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='579' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='migrate_entry' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='585' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='hlist_entry' type-id='type-id-520' visibility='default' filepath='include/linux/perf_event.h' line='587' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='active_entry' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='588' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='nr_siblings' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='589' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='event_caps' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='592' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='group_caps' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='594' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='group_leader' type-id='type-id-684' visibility='default' filepath='include/linux/perf_event.h' line='596' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='pmu' type-id='type-id-661' visibility='default' filepath='include/linux/perf_event.h' line='597' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='pmu_private' type-id='type-id-15' visibility='default' filepath='include/linux/perf_event.h' line='598' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='state' type-id='type-id-685' visibility='default' filepath='include/linux/perf_event.h' line='600' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='attach_state' type-id='type-id-5' visibility='default' filepath='include/linux/perf_event.h' line='601' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='count' type-id='type-id-686' visibility='default' filepath='include/linux/perf_event.h' line='602' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='child_count' type-id='type-id-113' visibility='default' filepath='include/linux/perf_event.h' line='603' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='total_time_enabled' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='611' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='total_time_running' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='612' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='tstamp' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='613' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='shadow_ctx_time' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='623' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='attr' type-id='type-id-687' visibility='default' filepath='include/linux/perf_event.h' line='625' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='header_size' type-id='type-id-688' visibility='default' filepath='include/linux/perf_event.h' line='626' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2704'>
+          <var-decl name='id_header_size' type-id='type-id-688' visibility='default' filepath='include/linux/perf_event.h' line='627' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2720'>
+          <var-decl name='read_size' type-id='type-id-688' visibility='default' filepath='include/linux/perf_event.h' line='628' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='hw' type-id='type-id-689' visibility='default' filepath='include/linux/perf_event.h' line='629' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='ctx' type-id='type-id-663' visibility='default' filepath='include/linux/perf_event.h' line='631' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='refcount' type-id='type-id-115' visibility='default' filepath='include/linux/perf_event.h' line='632' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='child_total_time_enabled' type-id='type-id-113' visibility='default' filepath='include/linux/perf_event.h' line='638' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='child_total_time_running' type-id='type-id-113' visibility='default' filepath='include/linux/perf_event.h' line='639' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='child_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/perf_event.h' line='644' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='child_list' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='645' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='parent' type-id='type-id-684' visibility='default' filepath='include/linux/perf_event.h' line='646' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='oncpu' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='648' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5024'>
+          <var-decl name='cpu' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='649' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='owner_entry' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='651' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='owner' type-id='type-id-431' visibility='default' filepath='include/linux/perf_event.h' line='652' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5248'>
+          <var-decl name='mmap_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/perf_event.h' line='655' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='mmap_count' type-id='type-id-26' visibility='default' filepath='include/linux/perf_event.h' line='656' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='rb' type-id='type-id-12' visibility='default' filepath='include/linux/perf_event.h' line='658' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5632'>
+          <var-decl name='rb_entry' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='659' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='rcu_batches' type-id='type-id-16' visibility='default' filepath='include/linux/perf_event.h' line='660' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='rcu_pending' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='661' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='waitq' type-id='type-id-225' visibility='default' filepath='include/linux/perf_event.h' line='664' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='fasync' type-id='type-id-254' visibility='default' filepath='include/linux/perf_event.h' line='665' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='pending_wakeup' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='668' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6176'>
+          <var-decl name='pending_kill' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='669' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='pending_disable' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='pending' type-id='type-id-690' visibility='default' filepath='include/linux/perf_event.h' line='671' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='event_limit' type-id='type-id-26' visibility='default' filepath='include/linux/perf_event.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='addr_filters' type-id='type-id-691' visibility='default' filepath='include/linux/perf_event.h' line='676' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6720'>
+          <var-decl name='addr_filter_ranges' type-id='type-id-692' visibility='default' filepath='include/linux/perf_event.h' line='678' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6784'>
+          <var-decl name='addr_filters_gen' type-id='type-id-16' visibility='default' filepath='include/linux/perf_event.h' line='679' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6848'>
+          <var-decl name='destroy' type-id='type-id-673' visibility='default' filepath='include/linux/perf_event.h' line='681' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6912'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/perf_event.h' line='682' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7040'>
+          <var-decl name='ns' type-id='type-id-693' visibility='default' filepath='include/linux/perf_event.h' line='684' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7104'>
+          <var-decl name='id' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='685' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7168'>
+          <var-decl name='clock' type-id='type-id-694' visibility='default' filepath='include/linux/perf_event.h' line='687' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7232'>
+          <var-decl name='overflow_handler' type-id='type-id-695' visibility='default' filepath='include/linux/perf_event.h' line='688' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7296'>
+          <var-decl name='overflow_handler_context' type-id='type-id-15' visibility='default' filepath='include/linux/perf_event.h' line='689' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7360'>
+          <var-decl name='orig_overflow_handler' type-id='type-id-695' visibility='default' filepath='include/linux/perf_event.h' line='691' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7424'>
+          <var-decl name='prog' type-id='type-id-696' visibility='default' filepath='include/linux/perf_event.h' line='692' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='tp_event' type-id='type-id-21' visibility='default' filepath='include/linux/perf_event.h' line='696' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7552'>
+          <var-decl name='filter' type-id='type-id-22' visibility='default' filepath='include/linux/perf_event.h' line='697' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7616'>
+          <var-decl name='sb_list' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='707' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='perf_event_state' filepath='include/linux/perf_event.h' line='505' column='1' id='type-id-685'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='PERF_EVENT_STATE_DEAD' value='-4'/>
+        <enumerator name='PERF_EVENT_STATE_EXIT' value='-3'/>
+        <enumerator name='PERF_EVENT_STATE_ERROR' value='-2'/>
+        <enumerator name='PERF_EVENT_STATE_OFF' value='-1'/>
+        <enumerator name='PERF_EVENT_STATE_INACTIVE' value='0'/>
+        <enumerator name='PERF_EVENT_STATE_ACTIVE' value='1'/>
+      </enum-decl>
+      <typedef-decl name='local64_t' type-id='type-id-697' filepath='include/asm-generic/local64.h' line='26' column='1' id='type-id-686'/>
+      <class-decl name='__anonymous_struct__13' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-686' visibility='default' filepath='include/asm-generic/local64.h' line='24' column='1' id='type-id-697'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='a' type-id='type-id-698' visibility='default' filepath='include/asm-generic/local64.h' line='25' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='local_t' type-id='type-id-699' filepath='include/asm-generic/local.h' line='25' column='1' id='type-id-698'/>
+      <class-decl name='__anonymous_struct__14' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-698' visibility='default' filepath='include/asm-generic/local.h' line='22' column='1' id='type-id-699'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='a' type-id='type-id-115' visibility='default' filepath='include/asm-generic/local.h' line='24' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_event_attr' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='310' column='1' id='type-id-687'>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='377' column='1' id='type-id-700'>
+              <data-member access='private'>
+                <var-decl name='wakeup_events' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='378' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='wakeup_watermark' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='379' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='383' column='1' id='type-id-701'>
+              <data-member access='private'>
+                <var-decl name='bp_addr' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='384' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='kprobe_func' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='385' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='uprobe_path' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='386' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='config1' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='387' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='389' column='1' id='type-id-702'>
+              <data-member access='private'>
+                <var-decl name='bp_len' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='390' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='kprobe_addr' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='391' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='probe_offset' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='392' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='config2' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='393' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='315' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='size' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='320' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='config' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='' type-id='type-id-703' visibility='default' filepath='include/uapi/linux/perf_event.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sample_type' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='332' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='read_format' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='63'>
+          <var-decl name='disabled' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='62'>
+          <var-decl name='inherit' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='61'>
+          <var-decl name='pinned' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='60'>
+          <var-decl name='exclusive' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='59'>
+          <var-decl name='exclude_user' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='339' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='58'>
+          <var-decl name='exclude_kernel' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='340' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='57'>
+          <var-decl name='exclude_hv' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='exclude_idle' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='55'>
+          <var-decl name='mmap' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='54'>
+          <var-decl name='comm' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='344' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='53'>
+          <var-decl name='freq' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='52'>
+          <var-decl name='inherit_stat' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='51'>
+          <var-decl name='enable_on_exec' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='50'>
+          <var-decl name='task' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='49'>
+          <var-decl name='watermark' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='47'>
+          <var-decl name='precise_ip' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='46'>
+          <var-decl name='mmap_data' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='45'>
+          <var-decl name='sample_id_all' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='44'>
+          <var-decl name='exclude_host' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='43'>
+          <var-decl name='exclude_guest' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='42'>
+          <var-decl name='exclude_callchain_kernel' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='41'>
+          <var-decl name='exclude_callchain_user' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='mmap2' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39'>
+          <var-decl name='comm_exec' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38'>
+          <var-decl name='use_clockid' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='37'>
+          <var-decl name='context_switch' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='372' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36'>
+          <var-decl name='write_backward' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='35'>
+          <var-decl name='namespaces' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='374' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='__reserved_1' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='bp_type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='branch_sample_type' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='395' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='sample_regs_user' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='sample_stack_user' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='clockid' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/perf_event.h' line='408' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='sample_regs_intr' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='aux_watermark' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='sample_max_stack' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/perf_event.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='880'>
+          <var-decl name='__reserved_2' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/perf_event.h' line='424' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__11' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='327' column='1' id='type-id-703'>
+        <data-member access='private'>
+          <var-decl name='sample_period' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='sample_freq' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='329' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='hw_perf_event' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='120' column='1' id='type-id-689'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-704' visibility='default' filepath='include/linux/perf_event.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='target' type-id='type-id-431' visibility='default' filepath='include/linux/perf_event.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='addr_filters' type-id='type-id-15' visibility='default' filepath='include/linux/perf_event.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='addr_filters_gen' type-id='type-id-16' visibility='default' filepath='include/linux/perf_event.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='state' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='prev_count' type-id='type-id-686' visibility='default' filepath='include/linux/perf_event.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='sample_period' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='last_period' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='period_left' type-id='type-id-686' visibility='default' filepath='include/linux/perf_event.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='interrupts_seq' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='interrupts' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='freq_time_stamp' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='freq_count_stamp' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='225' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__12' size-in-bits='768' is-anonymous='yes' visibility='default' filepath='include/linux/perf_event.h' line='122' column='1' id='type-id-704'>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/perf_event.h' line='136' column='1' id='type-id-705'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='hrtimer' type-id='type-id-681' visibility='default' filepath='include/linux/perf_event.h' line='137' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/perf_event.h' line='139' column='1' id='type-id-706'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='tp_list' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='141' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/perf_event.h' line='143' column='1' id='type-id-707'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='pwr_acc' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='144' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='ptsc' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='145' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__3' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/perf_event.h' line='148' column='1' id='type-id-708'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='info' type-id='type-id-709' visibility='default' filepath='include/linux/perf_event.h' line='154' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='bp_list' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='155' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__4' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/perf_event.h' line='158' column='1' id='type-id-710'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='iommu_bank' type-id='type-id-214' visibility='default' filepath='include/linux/perf_event.h' line='159' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='8'>
+              <var-decl name='iommu_cntr' type-id='type-id-214' visibility='default' filepath='include/linux/perf_event.h' line='160' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='16'>
+              <var-decl name='padding' type-id='type-id-688' visibility='default' filepath='include/linux/perf_event.h' line='161' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='conf' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='162' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='conf1' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='163' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-711' visibility='default' filepath='include/linux/perf_event.h' line='123' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__15' size-in-bits='768' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/perf_event.h' line='123' column='1' id='type-id-711'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='config' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='last_tag' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='config_base' type-id='type-id-16' visibility='default' filepath='include/linux/perf_event.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='event_base' type-id='type-id-16' visibility='default' filepath='include/linux/perf_event.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='event_base_rdpmc' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='idx' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='last_cpu' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='extra_reg' type-id='type-id-712' visibility='default' filepath='include/linux/perf_event.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='branch_reg' type-id='type-id-712' visibility='default' filepath='include/linux/perf_event.h' line='134' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hw_perf_event_extra' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='110' column='1' id='type-id-712'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='config' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='reg' type-id='type-id-5' visibility='default' filepath='include/linux/perf_event.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='alloc' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='idx' type-id='type-id-17' visibility='default' filepath='include/linux/perf_event.h' line='114' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='arch_hw_breakpoint' size-in-bits='192' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/hw_breakpoint.h' line='34' column='1' id='type-id-709'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='address' type-id='type-id-40' visibility='default' filepath='arch/arm64/include/asm/hw_breakpoint.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='trigger' type-id='type-id-40' visibility='default' filepath='arch/arm64/include/asm/hw_breakpoint.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ctrl' type-id='type-id-713' visibility='default' filepath='arch/arm64/include/asm/hw_breakpoint.h' line='37' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='arch_hw_breakpoint_ctrl' size-in-bits='32' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/hw_breakpoint.h' line='26' column='1' id='type-id-713'>
+        <data-member access='public' layout-offset-in-bits='13'>
+          <var-decl name='__reserved' type-id='type-id-7' visibility='default' filepath='arch/arm64/include/asm/hw_breakpoint.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='len' type-id='type-id-7' visibility='default' filepath='arch/arm64/include/asm/hw_breakpoint.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='type' type-id='type-id-7' visibility='default' filepath='arch/arm64/include/asm/hw_breakpoint.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1'>
+          <var-decl name='privilege' type-id='type-id-7' visibility='default' filepath='arch/arm64/include/asm/hw_breakpoint.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='enabled' type-id='type-id-7' visibility='default' filepath='arch/arm64/include/asm/hw_breakpoint.h' line='31' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='irq_work' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/irq_work.h' line='24' column='1' id='type-id-690'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/irq_work.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='llnode' type-id='type-id-281' visibility='default' filepath='include/linux/irq_work.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='func' type-id='type-id-714' visibility='default' filepath='include/linux/irq_work.h' line='27' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_addr_filters_head' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='491' column='1' id='type-id-691'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/perf_event.h' line='492' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='include/linux/perf_event.h' line='493' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='nr_file_filters' type-id='type-id-5' visibility='default' filepath='include/linux/perf_event.h' line='494' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_addr_filter_range' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='497' column='1' id='type-id-715'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start' type-id='type-id-16' visibility='default' filepath='include/linux/perf_event.h' line='498' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='size' type-id='type-id-16' visibility='default' filepath='include/linux/perf_event.h' line='499' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='perf_overflow_handler_t' type-id='type-id-716' filepath='include/linux/perf_event.h' line='517' column='1' id='type-id-695'/>
+      <class-decl name='perf_sample_data' size-in-bits='4096' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='907' column='1' id='type-id-717'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='addr' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='912' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='raw' type-id='type-id-718' visibility='default' filepath='include/linux/perf_event.h' line='913' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='br_stack' type-id='type-id-719' visibility='default' filepath='include/linux/perf_event.h' line='914' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='period' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='915' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='weight' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='916' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='txn' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='917' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='data_src' type-id='type-id-720' visibility='default' filepath='include/linux/perf_event.h' line='918' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='type' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='924' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='ip' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='925' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='tid_entry' type-id='type-id-721' visibility='default' filepath='include/linux/perf_event.h' line='929' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='time' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='930' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='id' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='931' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='stream_id' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='932' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='cpu_entry' type-id='type-id-722' visibility='default' filepath='include/linux/perf_event.h' line='936' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='callchain' type-id='type-id-723' visibility='default' filepath='include/linux/perf_event.h' line='937' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='regs_user' type-id='type-id-724' visibility='default' filepath='include/linux/perf_event.h' line='943' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='regs_user_copy' type-id='type-id-725' visibility='default' filepath='include/linux/perf_event.h' line='944' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='regs_intr' type-id='type-id-724' visibility='default' filepath='include/linux/perf_event.h' line='946' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='stack_user_size' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='947' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='phys_addr' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='949' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_raw_record' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='86' column='1' id='type-id-726'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='frag' type-id='type-id-727' visibility='default' filepath='include/linux/perf_event.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='size' type-id='type-id-7' visibility='default' filepath='include/linux/perf_event.h' line='88' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_raw_frag' size-in-bits='224' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='76' column='1' id='type-id-727'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-728' visibility='default' filepath='include/linux/perf_event.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='copy' type-id='type-id-729' visibility='default' filepath='include/linux/perf_event.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/perf_event.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='size' type-id='type-id-7' visibility='default' filepath='include/linux/perf_event.h' line='83' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/perf_event.h' line='77' column='1' id='type-id-728'>
+        <data-member access='private'>
+          <var-decl name='next' type-id='type-id-730' visibility='default' filepath='include/linux/perf_event.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='pad' type-id='type-id-16' visibility='default' filepath='include/linux/perf_event.h' line='79' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='perf_copy_f' type-id='type-id-731' filepath='include/linux/perf_event.h' line='73' column='1' id='type-id-729'/>
+      <class-decl name='perf_branch_stack' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='100' column='1' id='type-id-732'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nr' type-id='type-id-100' visibility='default' filepath='include/linux/perf_event.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='entries' type-id='type-id-208' visibility='default' filepath='include/linux/perf_event.h' line='102' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_branch_entry' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1118' column='1' id='type-id-207'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='from' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='to' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='63'>
+          <var-decl name='mispred' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='62'>
+          <var-decl name='predicted' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='61'>
+          <var-decl name='in_tx' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='60'>
+          <var-decl name='abort' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='44'>
+          <var-decl name='cycles' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='type' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='reserved' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1127' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='perf_mem_data_src' size-in-bits='64' visibility='default' filepath='include/uapi/linux/perf_event.h' line='998' column='1' id='type-id-720'>
+        <data-member access='private'>
+          <var-decl name='val' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='999' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-733' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1000' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__16' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1000' column='1' id='type-id-733'>
+        <data-member access='public' layout-offset-in-bits='59'>
+          <var-decl name='mem_op' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1001' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='45'>
+          <var-decl name='mem_lvl' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1002' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='mem_snoop' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1003' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38'>
+          <var-decl name='mem_lock' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1004' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='mem_dtlb' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1005' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='mem_lvl_num' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1006' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26'>
+          <var-decl name='mem_remote' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1007' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='mem_snoopx' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1008' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mem_rsvd' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='1009' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__17' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/perf_event.h' line='926' column='1' id='type-id-721'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pid' type-id='type-id-7' visibility='default' filepath='include/linux/perf_event.h' line='927' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='tid' type-id='type-id-7' visibility='default' filepath='include/linux/perf_event.h' line='928' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__18' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/perf_event.h' line='933' column='1' id='type-id-722'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cpu' type-id='type-id-7' visibility='default' filepath='include/linux/perf_event.h' line='934' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='reserved' type-id='type-id-7' visibility='default' filepath='include/linux/perf_event.h' line='935' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_callchain_entry' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='60' column='1' id='type-id-734'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nr' type-id='type-id-100' visibility='default' filepath='include/linux/perf_event.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ip' type-id='type-id-735' visibility='default' filepath='include/linux/perf_event.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_regs' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/perf_regs.h' line='7' column='1' id='type-id-724'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='abi' type-id='type-id-100' visibility='default' filepath='include/linux/perf_regs.h' line='8' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='regs' type-id='type-id-736' visibility='default' filepath='include/linux/perf_regs.h' line='9' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pt_regs' size-in-bits='2560' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='147' column='1' id='type-id-725'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-737' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='orig_x0' type-id='type-id-40' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='syscallno' type-id='type-id-738' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2272'>
+          <var-decl name='unused2' type-id='type-id-7' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='orig_addr_limit' type-id='type-id-40' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='unused' type-id='type-id-40' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='stackframe' type-id='type-id-739' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='168' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__14' size-in-bits='2176' is-anonymous='yes' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='148' column='1' id='type-id-737'>
+        <data-member access='private'>
+          <var-decl name='user_regs' type-id='type-id-740' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-741' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='150' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='user_pt_regs' size-in-bits='2176' is-struct='yes' visibility='default' filepath='arch/arm64/include/uapi/asm/ptrace.h' line='71' column='1' id='type-id-740'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='regs' type-id='type-id-111' visibility='default' filepath='arch/arm64/include/uapi/asm/ptrace.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='sp' type-id='type-id-100' visibility='default' filepath='arch/arm64/include/uapi/asm/ptrace.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='pc' type-id='type-id-100' visibility='default' filepath='arch/arm64/include/uapi/asm/ptrace.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='pstate' type-id='type-id-100' visibility='default' filepath='arch/arm64/include/uapi/asm/ptrace.h' line='75' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__19' size-in-bits='2176' is-struct='yes' is-anonymous='yes' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='150' column='1' id='type-id-741'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='regs' type-id='type-id-212' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='sp' type-id='type-id-40' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='pc' type-id='type-id-40' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='pstate' type-id='type-id-40' visibility='default' filepath='arch/arm64/include/asm/ptrace.h' line='154' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_event_call' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/linux/trace_events.h' line='253' column='1' id='type-id-742'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/trace_events.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='class' type-id='type-id-743' visibility='default' filepath='include/linux/trace_events.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='' type-id='type-id-744' visibility='default' filepath='include/linux/trace_events.h' line='256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='event' type-id='type-id-745' visibility='default' filepath='include/linux/trace_events.h' line='261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='print_fmt' type-id='type-id-2' visibility='default' filepath='include/linux/trace_events.h' line='262' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='filter' type-id='type-id-22' visibility='default' filepath='include/linux/trace_events.h' line='263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mod' type-id='type-id-15' visibility='default' filepath='include/linux/trace_events.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/trace_events.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/trace_events.h' line='275' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='perf_refcount' type-id='type-id-17' visibility='default' filepath='include/linux/trace_events.h' line='278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='perf_events' type-id='type-id-746' visibility='default' filepath='include/linux/trace_events.h' line='279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='prog_array' type-id='type-id-747' visibility='default' filepath='include/linux/trace_events.h' line='280' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='perf_perm' type-id='type-id-748' visibility='default' filepath='include/linux/trace_events.h' line='282' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_event_class' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/trace_events.h' line='189' column='1' id='type-id-749'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='system' type-id='type-id-4' visibility='default' filepath='include/linux/trace_events.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='probe' type-id='type-id-15' visibility='default' filepath='include/linux/trace_events.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='perf_probe' type-id='type-id-15' visibility='default' filepath='include/linux/trace_events.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='reg' type-id='type-id-750' visibility='default' filepath='include/linux/trace_events.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='define_fields' type-id='type-id-751' visibility='default' filepath='include/linux/trace_events.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='get_fields' type-id='type-id-752' visibility='default' filepath='include/linux/trace_events.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='fields' type-id='type-id-20' visibility='default' filepath='include/linux/trace_events.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='raw_init' type-id='type-id-751' visibility='default' filepath='include/linux/trace_events.h' line='200' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='trace_reg' filepath='include/linux/trace_events.h' line='169' column='1' id='type-id-753'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='TRACE_REG_REGISTER' value='0'/>
+        <enumerator name='TRACE_REG_UNREGISTER' value='1'/>
+        <enumerator name='TRACE_REG_PERF_REGISTER' value='2'/>
+        <enumerator name='TRACE_REG_PERF_UNREGISTER' value='3'/>
+        <enumerator name='TRACE_REG_PERF_OPEN' value='4'/>
+        <enumerator name='TRACE_REG_PERF_CLOSE' value='5'/>
+        <enumerator name='TRACE_REG_PERF_ADD' value='6'/>
+        <enumerator name='TRACE_REG_PERF_DEL' value='7'/>
+      </enum-decl>
+      <class-decl name='trace_event' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/trace_events.h' line='124' column='1' id='type-id-745'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-520' visibility='default' filepath='include/linux/trace_events.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/trace_events.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='type' type-id='type-id-17' visibility='default' filepath='include/linux/trace_events.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='funcs' type-id='type-id-754' visibility='default' filepath='include/linux/trace_events.h' line='128' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_event_functions' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/trace_events.h' line='117' column='1' id='type-id-755'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='trace' type-id='type-id-756' visibility='default' filepath='include/linux/trace_events.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='raw' type-id='type-id-756' visibility='default' filepath='include/linux/trace_events.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hex' type-id='type-id-756' visibility='default' filepath='include/linux/trace_events.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='binary' type-id='type-id-756' visibility='default' filepath='include/linux/trace_events.h' line='121' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='trace_print_func' type-id='type-id-757' filepath='include/linux/trace_events.h' line='114' column='1' id='type-id-756'/>
+      <enum-decl name='print_line_t' filepath='include/linux/trace_events.h' line='135' column='1' id='type-id-80'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='TRACE_TYPE_PARTIAL_LINE' value='0'/>
+        <enumerator name='TRACE_TYPE_HANDLED' value='1'/>
+        <enumerator name='TRACE_TYPE_UNHANDLED' value='2'/>
+        <enumerator name='TRACE_TYPE_NO_CONSUME' value='3'/>
+      </enum-decl>
+      <class-decl name='trace_iterator' size-in-bits='67456' is-struct='yes' visibility='default' filepath='include/linux/trace_events.h' line='74' column='1' id='type-id-758'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tr' type-id='type-id-759' visibility='default' filepath='include/linux/trace_events.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='trace' type-id='type-id-34' visibility='default' filepath='include/linux/trace_events.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='trace_buffer' type-id='type-id-760' visibility='default' filepath='include/linux/trace_events.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/trace_events.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='cpu_file' type-id='type-id-17' visibility='default' filepath='include/linux/trace_events.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/trace_events.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='buffer_iter' type-id='type-id-761' visibility='default' filepath='include/linux/trace_events.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='iter_flags' type-id='type-id-16' visibility='default' filepath='include/linux/trace_events.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='tmp_seq' type-id='type-id-67' visibility='default' filepath='include/linux/trace_events.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33792'>
+          <var-decl name='started' type-id='type-id-38' visibility='default' filepath='include/linux/trace_events.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33856'>
+          <var-decl name='snapshot' type-id='type-id-33' visibility='default' filepath='include/linux/trace_events.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33920'>
+          <var-decl name='seq' type-id='type-id-67' visibility='default' filepath='include/linux/trace_events.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='67008'>
+          <var-decl name='ent' type-id='type-id-762' visibility='default' filepath='include/linux/trace_events.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='67072'>
+          <var-decl name='lost_events' type-id='type-id-16' visibility='default' filepath='include/linux/trace_events.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='67136'>
+          <var-decl name='leftover' type-id='type-id-17' visibility='default' filepath='include/linux/trace_events.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='67168'>
+          <var-decl name='ent_size' type-id='type-id-17' visibility='default' filepath='include/linux/trace_events.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='67200'>
+          <var-decl name='cpu' type-id='type-id-17' visibility='default' filepath='include/linux/trace_events.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='67264'>
+          <var-decl name='ts' type-id='type-id-40' visibility='default' filepath='include/linux/trace_events.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='67328'>
+          <var-decl name='pos' type-id='type-id-763' visibility='default' filepath='include/linux/trace_events.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='67392'>
+          <var-decl name='idx' type-id='type-id-192' visibility='default' filepath='include/linux/trace_events.h' line='102' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='trace_seq' size-in-bits='33088' is-struct='yes' visibility='default' filepath='include/linux/trace_seq.h' line='14' column='1' id='type-id-67'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buffer' type-id='type-id-217' visibility='default' filepath='include/linux/trace_seq.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32768'>
+          <var-decl name='seq' type-id='type-id-764' visibility='default' filepath='include/linux/trace_seq.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33024'>
+          <var-decl name='full' type-id='type-id-17' visibility='default' filepath='include/linux/trace_seq.h' line='17' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='seq_buf' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/seq_buf.h' line='19' column='1' id='type-id-764'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buffer' type-id='type-id-2' visibility='default' filepath='include/linux/seq_buf.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='size' type-id='type-id-84' visibility='default' filepath='include/linux/seq_buf.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='len' type-id='type-id-84' visibility='default' filepath='include/linux/seq_buf.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='readpos' type-id='type-id-763' visibility='default' filepath='include/linux/seq_buf.h' line='23' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='cpumask_var_t' type-id='type-id-179' filepath='include/linux/cpumask.h' line='722' column='1' id='type-id-38'/>
+      <class-decl name='trace_entry' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/trace_events.h' line='60' column='1' id='type-id-765'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-312' visibility='default' filepath='include/linux/trace_events.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='flags' type-id='type-id-216' visibility='default' filepath='include/linux/trace_events.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='preempt_count' type-id='type-id-216' visibility='default' filepath='include/linux/trace_events.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='pid' type-id='type-id-17' visibility='default' filepath='include/linux/trace_events.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_event_groups' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/perf_event.h' line='712' column='1' id='type-id-662'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tree' type-id='type-id-416' visibility='default' filepath='include/linux/perf_event.h' line='713' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='index' type-id='type-id-40' visibility='default' filepath='include/linux/perf_event.h' line='714' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-336' size-in-bits='64' id='type-id-766'/>
+      <pointer-type-def type-id='type-id-149' size-in-bits='64' id='type-id-767'/>
+      <pointer-type-def type-id='type-id-129' size-in-bits='64' id='type-id-333'/>
+      <pointer-type-def type-id='type-id-150' size-in-bits='64' id='type-id-768'/>
+      <pointer-type-def type-id='type-id-413' size-in-bits='64' id='type-id-407'/>
+      <pointer-type-def type-id='type-id-151' size-in-bits='64' id='type-id-382'/>
+      <pointer-type-def type-id='type-id-406' size-in-bits='64' id='type-id-769'/>
+      <pointer-type-def type-id='type-id-420' size-in-bits='64' id='type-id-408'/>
+      <pointer-type-def type-id='type-id-359' size-in-bits='64' id='type-id-358'/>
+      <pointer-type-def type-id='type-id-657' size-in-bits='64' id='type-id-368'/>
+      <pointer-type-def type-id='type-id-656' size-in-bits='64' id='type-id-363'/>
+      <pointer-type-def type-id='type-id-357' size-in-bits='64' id='type-id-770'/>
+      <pointer-type-def type-id='type-id-497' size-in-bits='64' id='type-id-371'/>
+      <pointer-type-def type-id='type-id-131' size-in-bits='64' id='type-id-370'/>
+      <pointer-type-def type-id='type-id-152' size-in-bits='64' id='type-id-493'/>
+      <pointer-type-def type-id='type-id-153' size-in-bits='64' id='type-id-771'/>
+      <pointer-type-def type-id='type-id-154' size-in-bits='64' id='type-id-483'/>
+      <pointer-type-def type-id='type-id-156' size-in-bits='64' id='type-id-772'/>
+      <pointer-type-def type-id='type-id-772' size-in-bits='64' id='type-id-484'/>
+      <pointer-type-def type-id='type-id-158' size-in-bits='64' id='type-id-496'/>
+      <pointer-type-def type-id='type-id-159' size-in-bits='64' id='type-id-466'/>
+      <pointer-type-def type-id='type-id-642' size-in-bits='64' id='type-id-487'/>
+      <pointer-type-def type-id='type-id-160' size-in-bits='64' id='type-id-490'/>
+      <pointer-type-def type-id='type-id-523' size-in-bits='64' id='type-id-521'/>
+      <pointer-type-def type-id='type-id-519' size-in-bits='64' id='type-id-366'/>
+      <pointer-type-def type-id='type-id-524' size-in-bits='64' id='type-id-136'/>
+      <pointer-type-def type-id='type-id-525' size-in-bits='64' id='type-id-138'/>
+      <pointer-type-def type-id='type-id-161' size-in-bits='64' id='type-id-696'/>
+      <pointer-type-def type-id='type-id-162' size-in-bits='64' id='type-id-773'/>
+      <pointer-type-def type-id='type-id-646' size-in-bits='64' id='type-id-494'/>
+      <pointer-type-def type-id='type-id-266' size-in-bits='64' id='type-id-774'/>
+      <pointer-type-def type-id='type-id-774' size-in-bits='64' id='type-id-259'/>
+      <pointer-type-def type-id='type-id-775' size-in-bits='64' id='type-id-374'/>
+      <pointer-type-def type-id='type-id-419' size-in-bits='64' id='type-id-414'/>
+      <qualified-type-def type-id='type-id-155' const='yes' id='type-id-776'/>
+      <pointer-type-def type-id='type-id-776' size-in-bits='64' id='type-id-541'/>
+      <qualified-type-def type-id='type-id-157' const='yes' id='type-id-777'/>
+      <pointer-type-def type-id='type-id-777' size-in-bits='64' id='type-id-481'/>
+      <qualified-type-def type-id='type-id-395' const='yes' id='type-id-778'/>
+      <pointer-type-def type-id='type-id-778' size-in-bits='64' id='type-id-377'/>
+      <qualified-type-def type-id='type-id-648' const='yes' id='type-id-779'/>
+      <pointer-type-def type-id='type-id-779' size-in-bits='64' id='type-id-647'/>
+      <qualified-type-def type-id='type-id-169' const='yes' id='type-id-780'/>
+      <pointer-type-def type-id='type-id-780' size-in-bits='64' id='type-id-405'/>
+      <qualified-type-def type-id='type-id-290' const='yes' id='type-id-781'/>
+      <pointer-type-def type-id='type-id-781' size-in-bits='64' id='type-id-242'/>
+      <qualified-type-def type-id='type-id-288' const='yes' id='type-id-782'/>
+      <pointer-type-def type-id='type-id-782' size-in-bits='64' id='type-id-275'/>
+      <qualified-type-def type-id='type-id-283' const='yes' id='type-id-783'/>
+      <pointer-type-def type-id='type-id-783' size-in-bits='64' id='type-id-274'/>
+      <pointer-type-def type-id='type-id-163' size-in-bits='64' id='type-id-381'/>
+      <pointer-type-def type-id='type-id-384' size-in-bits='64' id='type-id-375'/>
+      <pointer-type-def type-id='type-id-394' size-in-bits='64' id='type-id-390'/>
+      <pointer-type-def type-id='type-id-636' size-in-bits='64' id='type-id-476'/>
+      <pointer-type-def type-id='type-id-580' size-in-bits='64' id='type-id-551'/>
+      <pointer-type-def type-id='type-id-579' size-in-bits='64' id='type-id-550'/>
+      <pointer-type-def type-id='type-id-571' size-in-bits='64' id='type-id-546'/>
+      <pointer-type-def type-id='type-id-573' size-in-bits='64' id='type-id-547'/>
+      <pointer-type-def type-id='type-id-575' size-in-bits='64' id='type-id-548'/>
+      <pointer-type-def type-id='type-id-582' size-in-bits='64' id='type-id-553'/>
+      <pointer-type-def type-id='type-id-581' size-in-bits='64' id='type-id-552'/>
+      <pointer-type-def type-id='type-id-577' size-in-bits='64' id='type-id-549'/>
+      <pointer-type-def type-id='type-id-597' size-in-bits='64' id='type-id-561'/>
+      <pointer-type-def type-id='type-id-587' size-in-bits='64' id='type-id-556'/>
+      <pointer-type-def type-id='type-id-595' size-in-bits='64' id='type-id-560'/>
+      <pointer-type-def type-id='type-id-586' size-in-bits='64' id='type-id-555'/>
+      <pointer-type-def type-id='type-id-593' size-in-bits='64' id='type-id-559'/>
+      <pointer-type-def type-id='type-id-564' size-in-bits='64' id='type-id-543'/>
+      <pointer-type-def type-id='type-id-569' size-in-bits='64' id='type-id-545'/>
+      <pointer-type-def type-id='type-id-567' size-in-bits='64' id='type-id-544'/>
+      <pointer-type-def type-id='type-id-591' size-in-bits='64' id='type-id-558'/>
+      <pointer-type-def type-id='type-id-535' size-in-bits='64' id='type-id-464'/>
+      <pointer-type-def type-id='type-id-599' size-in-bits='64' id='type-id-562'/>
+      <pointer-type-def type-id='type-id-584' size-in-bits='64' id='type-id-554'/>
+      <pointer-type-def type-id='type-id-589' size-in-bits='64' id='type-id-557'/>
+      <pointer-type-def type-id='type-id-537' size-in-bits='64' id='type-id-536'/>
+      <pointer-type-def type-id='type-id-618' size-in-bits='64' id='type-id-540'/>
+      <pointer-type-def type-id='type-id-784' size-in-bits='64' id='type-id-757'/>
+      <pointer-type-def type-id='type-id-164' size-in-bits='64' id='type-id-22'/>
+      <pointer-type-def type-id='type-id-165' size-in-bits='64' id='type-id-439'/>
+      <pointer-type-def type-id='type-id-641' size-in-bits='64' id='type-id-479'/>
+      <pointer-type-def type-id='type-id-332' size-in-bits='64' id='type-id-328'/>
+      <pointer-type-def type-id='type-id-372' size-in-bits='64' id='type-id-360'/>
+      <pointer-type-def type-id='type-id-166' size-in-bits='64' id='type-id-785'/>
+      <pointer-type-def type-id='type-id-376' size-in-bits='64' id='type-id-184'/>
+      <pointer-type-def type-id='type-id-640' size-in-bits='64' id='type-id-478'/>
+      <pointer-type-def type-id='type-id-786' size-in-bits='64' id='type-id-603'/>
+      <pointer-type-def type-id='type-id-787' size-in-bits='64' id='type-id-403'/>
+      <pointer-type-def type-id='type-id-788' size-in-bits='64' id='type-id-396'/>
+      <pointer-type-def type-id='type-id-789' size-in-bits='64' id='type-id-399'/>
+      <pointer-type-def type-id='type-id-790' size-in-bits='64' id='type-id-398'/>
+      <pointer-type-def type-id='type-id-791' size-in-bits='64' id='type-id-401'/>
+      <pointer-type-def type-id='type-id-792' size-in-bits='64' id='type-id-678'/>
+      <pointer-type-def type-id='type-id-793' size-in-bits='64' id='type-id-669'/>
+      <pointer-type-def type-id='type-id-794' size-in-bits='64' id='type-id-671'/>
+      <pointer-type-def type-id='type-id-795' size-in-bits='64' id='type-id-679'/>
+      <pointer-type-def type-id='type-id-796' size-in-bits='64' id='type-id-675'/>
+      <pointer-type-def type-id='type-id-797' size-in-bits='64' id='type-id-651'/>
+      <pointer-type-def type-id='type-id-798' size-in-bits='64' id='type-id-650'/>
+      <pointer-type-def type-id='type-id-594' size-in-bits='64' id='type-id-601'/>
+      <pointer-type-def type-id='type-id-799' size-in-bits='64' id='type-id-608'/>
+      <pointer-type-def type-id='type-id-800' size-in-bits='64' id='type-id-649'/>
+      <pointer-type-def type-id='type-id-801' size-in-bits='64' id='type-id-751'/>
+      <pointer-type-def type-id='type-id-802' size-in-bits='64' id='type-id-750'/>
+      <pointer-type-def type-id='type-id-803' size-in-bits='64' id='type-id-748'/>
+      <pointer-type-def type-id='type-id-804' size-in-bits='64' id='type-id-292'/>
+      <pointer-type-def type-id='type-id-805' size-in-bits='64' id='type-id-284'/>
+      <pointer-type-def type-id='type-id-806' size-in-bits='64' id='type-id-289'/>
+      <pointer-type-def type-id='type-id-807' size-in-bits='64' id='type-id-287'/>
+      <pointer-type-def type-id='type-id-808' size-in-bits='64' id='type-id-299'/>
+      <pointer-type-def type-id='type-id-809' size-in-bits='64' id='type-id-324'/>
+      <pointer-type-def type-id='type-id-810' size-in-bits='64' id='type-id-297'/>
+      <pointer-type-def type-id='type-id-811' size-in-bits='64' id='type-id-294'/>
+      <pointer-type-def type-id='type-id-812' size-in-bits='64' id='type-id-319'/>
+      <pointer-type-def type-id='type-id-813' size-in-bits='64' id='type-id-303'/>
+      <pointer-type-def type-id='type-id-814' size-in-bits='64' id='type-id-309'/>
+      <pointer-type-def type-id='type-id-815' size-in-bits='64' id='type-id-308'/>
+      <pointer-type-def type-id='type-id-816' size-in-bits='64' id='type-id-298'/>
+      <pointer-type-def type-id='type-id-817' size-in-bits='64' id='type-id-306'/>
+      <pointer-type-def type-id='type-id-818' size-in-bits='64' id='type-id-300'/>
+      <pointer-type-def type-id='type-id-819' size-in-bits='64' id='type-id-307'/>
+      <pointer-type-def type-id='type-id-690' size-in-bits='64' id='type-id-820'/>
+      <pointer-type-def type-id='type-id-167' size-in-bits='64' id='type-id-489'/>
+      <pointer-type-def type-id='type-id-248' size-in-bits='64' id='type-id-821'/>
+      <pointer-type-def type-id='type-id-821' size-in-bits='64' id='type-id-265'/>
+      <pointer-type-def type-id='type-id-822' size-in-bits='64' id='type-id-752'/>
+      <pointer-type-def type-id='type-id-638' size-in-bits='64' id='type-id-477'/>
+      <pointer-type-def type-id='type-id-823' size-in-bits='64' id='type-id-320'/>
+      <pointer-type-def type-id='type-id-824' size-in-bits='64' id='type-id-301'/>
+      <pointer-type-def type-id='type-id-460' size-in-bits='64' id='type-id-445'/>
+      <pointer-type-def type-id='type-id-624' size-in-bits='64' id='type-id-470'/>
+      <pointer-type-def type-id='type-id-423' size-in-bits='64' id='type-id-447'/>
+      <pointer-type-def type-id='type-id-443' size-in-bits='64' id='type-id-197'/>
+      <pointer-type-def type-id='type-id-441' size-in-bits='64' id='type-id-432'/>
+      <pointer-type-def type-id='type-id-438' size-in-bits='64' id='type-id-437'/>
+      <pointer-type-def type-id='type-id-461' size-in-bits='64' id='type-id-446'/>
+      <pointer-type-def type-id='type-id-532' size-in-bits='64' id='type-id-529'/>
+      <pointer-type-def type-id='type-id-534' size-in-bits='64' id='type-id-530'/>
+      <pointer-type-def type-id='type-id-527' size-in-bits='64' id='type-id-518'/>
+      <pointer-type-def type-id='type-id-168' size-in-bits='64' id='type-id-825'/>
+      <pointer-type-def type-id='type-id-426' size-in-bits='64' id='type-id-435'/>
+      <pointer-type-def type-id='type-id-393' size-in-bits='64' id='type-id-389'/>
+      <pointer-type-def type-id='type-id-459' size-in-bits='64' id='type-id-453'/>
+      <pointer-type-def type-id='type-id-455' size-in-bits='64' id='type-id-454'/>
+      <pointer-type-def type-id='type-id-715' size-in-bits='64' id='type-id-692'/>
+      <pointer-type-def type-id='type-id-732' size-in-bits='64' id='type-id-719'/>
+      <pointer-type-def type-id='type-id-734' size-in-bits='64' id='type-id-723'/>
+      <pointer-type-def type-id='type-id-680' size-in-bits='64' id='type-id-667'/>
+      <pointer-type-def type-id='type-id-683' size-in-bits='64' id='type-id-684'/>
+      <pointer-type-def type-id='type-id-660' size-in-bits='64' id='type-id-663'/>
+      <pointer-type-def type-id='type-id-727' size-in-bits='64' id='type-id-730'/>
+      <pointer-type-def type-id='type-id-726' size-in-bits='64' id='type-id-718'/>
+      <pointer-type-def type-id='type-id-717' size-in-bits='64' id='type-id-826'/>
+      <pointer-type-def type-id='type-id-450' size-in-bits='64' id='type-id-449'/>
+      <pointer-type-def type-id='type-id-664' size-in-bits='64' id='type-id-661'/>
+      <pointer-type-def type-id='type-id-627' size-in-bits='64' id='type-id-471'/>
+      <pointer-type-def type-id='type-id-629' size-in-bits='64' id='type-id-472'/>
+      <pointer-type-def type-id='type-id-725' size-in-bits='64' id='type-id-736'/>
+      <pointer-type-def type-id='type-id-499' size-in-bits='64' id='type-id-463'/>
+      <pointer-type-def type-id='type-id-827' size-in-bits='64' id='type-id-614'/>
+      <pointer-type-def type-id='type-id-583' size-in-bits='64' id='type-id-616'/>
+      <pointer-type-def type-id='type-id-463' size-in-bits='64' id='type-id-643'/>
+      <pointer-type-def type-id='type-id-622' size-in-bits='64' id='type-id-469'/>
+      <pointer-type-def type-id='type-id-468' size-in-bits='64' id='type-id-510'/>
+      <pointer-type-def type-id='type-id-462' size-in-bits='64' id='type-id-378'/>
+      <pointer-type-def type-id='type-id-170' size-in-bits='64' id='type-id-12'/>
+      <pointer-type-def type-id='type-id-171' size-in-bits='64' id='type-id-828'/>
+      <pointer-type-def type-id='type-id-828' size-in-bits='64' id='type-id-761'/>
+      <pointer-type-def type-id='type-id-515' size-in-bits='64' id='type-id-509'/>
+      <pointer-type-def type-id='type-id-172' size-in-bits='64' id='type-id-467'/>
+      <pointer-type-def type-id='type-id-633' size-in-bits='64' id='type-id-475'/>
+      <pointer-type-def type-id='type-id-173' size-in-bits='64' id='type-id-829'/>
+      <pointer-type-def type-id='type-id-652' size-in-bits='64' id='type-id-830'/>
+      <pointer-type-def type-id='type-id-631' size-in-bits='64' id='type-id-474'/>
+      <pointer-type-def type-id='type-id-313' size-in-bits='64' id='type-id-249'/>
+      <pointer-type-def type-id='type-id-174' size-in-bits='64' id='type-id-380'/>
+      <pointer-type-def type-id='type-id-175' size-in-bits='64' id='type-id-759'/>
+      <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-760'/>
+      <pointer-type-def type-id='type-id-765' size-in-bits='64' id='type-id-762'/>
+      <pointer-type-def type-id='type-id-745' size-in-bits='64' id='type-id-831'/>
+      <pointer-type-def type-id='type-id-742' size-in-bits='64' id='type-id-21'/>
+      <pointer-type-def type-id='type-id-749' size-in-bits='64' id='type-id-743'/>
+      <pointer-type-def type-id='type-id-755' size-in-bits='64' id='type-id-754'/>
+      <pointer-type-def type-id='type-id-758' size-in-bits='64' id='type-id-82'/>
+      <pointer-type-def type-id='type-id-176' size-in-bits='64' id='type-id-34'/>
+      <pointer-type-def type-id='type-id-277' size-in-bits='64' id='type-id-276'/>
+      <pointer-type-def type-id='type-id-258' size-in-bits='64' id='type-id-241'/>
+      <pointer-type-def type-id='type-id-314' size-in-bits='64' id='type-id-244'/>
+      <pointer-type-def type-id='type-id-316' size-in-bits='64' id='type-id-315'/>
+      <pointer-type-def type-id='type-id-272' size-in-bits='64' id='type-id-257'/>
+      <pointer-type-def type-id='type-id-257' size-in-bits='64' id='type-id-264'/>
+      <pointer-type-def type-id='type-id-238' size-in-bits='64' id='type-id-253'/>
+      <pointer-type-def type-id='type-id-832' size-in-bits='64' id='type-id-291'/>
+      <pointer-type-def type-id='type-id-253' size-in-bits='64' id='type-id-263'/>
+      <pointer-type-def type-id='type-id-833' size-in-bits='64' id='type-id-321'/>
+      <pointer-type-def type-id='type-id-834' size-in-bits='64' id='type-id-615'/>
+      <pointer-type-def type-id='type-id-835' size-in-bits='64' id='type-id-607'/>
+      <pointer-type-def type-id='type-id-836' size-in-bits='64' id='type-id-606'/>
+      <pointer-type-def type-id='type-id-837' size-in-bits='64' id='type-id-620'/>
+      <pointer-type-def type-id='type-id-838' size-in-bits='64' id='type-id-621'/>
+      <pointer-type-def type-id='type-id-839' size-in-bits='64' id='type-id-318'/>
+      <pointer-type-def type-id='type-id-840' size-in-bits='64' id='type-id-317'/>
+      <pointer-type-def type-id='type-id-841' size-in-bits='64' id='type-id-694'/>
+      <pointer-type-def type-id='type-id-630' size-in-bits='64' id='type-id-473'/>
+      <pointer-type-def type-id='type-id-842' size-in-bits='64' id='type-id-400'/>
+      <pointer-type-def type-id='type-id-843' size-in-bits='64' id='type-id-731'/>
+      <pointer-type-def type-id='type-id-844' size-in-bits='64' id='type-id-605'/>
+      <pointer-type-def type-id='type-id-845' size-in-bits='64' id='type-id-613'/>
+      <pointer-type-def type-id='type-id-846' size-in-bits='64' id='type-id-604'/>
+      <pointer-type-def type-id='type-id-847' size-in-bits='64' id='type-id-404'/>
+      <pointer-type-def type-id='type-id-596' size-in-bits='64' id='type-id-602'/>
+      <pointer-type-def type-id='type-id-848' size-in-bits='64' id='type-id-325'/>
+      <pointer-type-def type-id='type-id-849' size-in-bits='64' id='type-id-402'/>
+      <pointer-type-def type-id='type-id-850' size-in-bits='64' id='type-id-397'/>
+      <pointer-type-def type-id='type-id-585' size-in-bits='64' id='type-id-617'/>
+      <pointer-type-def type-id='type-id-851' size-in-bits='64' id='type-id-714'/>
+      <pointer-type-def type-id='type-id-852' size-in-bits='64' id='type-id-673'/>
+      <pointer-type-def type-id='type-id-853' size-in-bits='64' id='type-id-672'/>
+      <pointer-type-def type-id='type-id-854' size-in-bits='64' id='type-id-670'/>
+      <pointer-type-def type-id='type-id-855' size-in-bits='64' id='type-id-716'/>
+      <pointer-type-def type-id='type-id-856' size-in-bits='64' id='type-id-676'/>
+      <pointer-type-def type-id='type-id-857' size-in-bits='64' id='type-id-668'/>
+      <pointer-type-def type-id='type-id-858' size-in-bits='64' id='type-id-674'/>
+      <pointer-type-def type-id='type-id-590' size-in-bits='64' id='type-id-480'/>
+      <pointer-type-def type-id='type-id-859' size-in-bits='64' id='type-id-612'/>
+      <pointer-type-def type-id='type-id-566' size-in-bits='64' id='type-id-609'/>
+      <pointer-type-def type-id='type-id-568' size-in-bits='64' id='type-id-610'/>
+      <pointer-type-def type-id='type-id-860' size-in-bits='64' id='type-id-293'/>
+      <pointer-type-def type-id='type-id-861' size-in-bits='64' id='type-id-286'/>
+      <pointer-type-def type-id='type-id-862' size-in-bits='64' id='type-id-285'/>
+      <pointer-type-def type-id='type-id-863' size-in-bits='64' id='type-id-296'/>
+      <pointer-type-def type-id='type-id-864' size-in-bits='64' id='type-id-305'/>
+      <pointer-type-def type-id='type-id-865' size-in-bits='64' id='type-id-322'/>
+      <pointer-type-def type-id='type-id-866' size-in-bits='64' id='type-id-295'/>
+      <pointer-type-def type-id='type-id-867' size-in-bits='64' id='type-id-304'/>
+      <pointer-type-def type-id='type-id-868' size-in-bits='64' id='type-id-302'/>
+      <pointer-type-def type-id='type-id-869' size-in-bits='64' id='type-id-310'/>
+      <pointer-type-def type-id='type-id-870' size-in-bits='64' id='type-id-323'/>
+      <pointer-type-def type-id='type-id-871' size-in-bits='64' id='type-id-611'/>
+      <pointer-type-def type-id='type-id-872' size-in-bits='64' id='type-id-677'/>
+      <pointer-type-def type-id='type-id-252' size-in-bits='64' id='type-id-873'/>
+      <pointer-type-def type-id='type-id-227' size-in-bits='64' id='type-id-458'/>
+      <function-decl name='send_sig' mangled-name='send_sig' filepath='kernel/signal.c' line='1548' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='send_sig'>
+        <parameter type-id='type-id-17' name='sig' filepath='kernel/signal.c' line='1548' column='1'/>
+        <parameter type-id='type-id-431' name='p' filepath='kernel/signal.c' line='1548' column='1'/>
+        <parameter type-id='type-id-17' name='priv' filepath='kernel/signal.c' line='1548' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-775'>
+        <parameter type-id='type-id-360'/>
+        <parameter type-id='type-id-874'/>
+        <return type-id='type-id-2'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-632'>
+        <parameter type-id='type-id-463'/>
+        <return type-id='type-id-634'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-563'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-643'/>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-565'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-784'>
+        <parameter type-id='type-id-82'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-831'/>
+        <return type-id='type-id-80'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-786'>
+        <parameter type-id='type-id-772'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-787'>
+        <parameter type-id='type-id-875'/>
+        <parameter type-id='type-id-785'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-788'>
+        <parameter type-id='type-id-875'/>
+        <parameter type-id='type-id-876'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-789'>
+        <parameter type-id='type-id-875'/>
+        <parameter type-id='type-id-876'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-790'>
+        <parameter type-id='type-id-875'/>
+        <parameter type-id='type-id-386'/>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-645'>
+        <parameter type-id='type-id-773'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-791'>
+        <parameter type-id='type-id-360'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-792'>
+        <parameter type-id='type-id-877'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-793'>
+        <parameter type-id='type-id-684'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-794'>
+        <parameter type-id='type-id-684'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-795'>
+        <parameter type-id='type-id-684'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-796'>
+        <parameter type-id='type-id-661'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-635'>
+        <parameter type-id='type-id-463'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-797'>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-830'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-798'>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-830'/>
+        <parameter type-id='type-id-876'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-637'>
+        <parameter type-id='type-id-378'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-594'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-536'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-576'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-628'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-799'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-643'/>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-570'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-588'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-358'/>
+        <parameter type-id='type-id-485'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-572'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-463'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-639'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-485'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-592'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-800'>
+        <parameter type-id='type-id-830'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-801'>
+        <parameter type-id='type-id-21'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-802'>
+        <parameter type-id='type-id-21'/>
+        <parameter type-id='type-id-753'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-803'>
+        <parameter type-id='type-id-21'/>
+        <parameter type-id='type-id-684'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-804'>
+        <parameter type-id='type-id-241'/>
+        <parameter type-id='type-id-253'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-805'>
+        <parameter type-id='type-id-257'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-806'>
+        <parameter type-id='type-id-257'/>
+        <parameter type-id='type-id-878'/>
+        <parameter type-id='type-id-878'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-807'>
+        <parameter type-id='type-id-257'/>
+        <parameter type-id='type-id-253'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-808'>
+        <parameter type-id='type-id-253'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-809'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-878'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-810'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-878'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-811'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-83'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-812'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-813'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-814'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-829'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-815'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-249'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-816'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-216'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-817'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-818'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-819'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-873'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-418'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-822'>
+        <parameter type-id='type-id-21'/>
+        <return type-id='type-id-877'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-823'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-192'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-824'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-192'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-827'>
+        <parameter type-id='type-id-772'/>
+        <return type-id='type-id-463'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-583'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <return type-id='type-id-463'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-832'>
+        <parameter type-id='type-id-241'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-253'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-833'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-879'/>
+        <return type-id='type-id-880'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-623'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-625'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-834'>
+        <parameter type-id='type-id-772'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-835'>
+        <parameter type-id='type-id-772'/>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-836'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-626'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-625'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-837'>
+        <parameter type-id='type-id-464'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-838'>
+        <parameter type-id='type-id-464'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-839'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-878'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-840'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-256'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-841'>
+        <return type-id='type-id-40'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-842'>
+        <parameter type-id='type-id-360'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-843'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-16'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-655'>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-844'>
+        <parameter type-id='type-id-772'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-845'>
+        <parameter type-id='type-id-772'/>
+        <parameter type-id='type-id-877'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-846'>
+        <parameter type-id='type-id-772'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-847'>
+        <parameter type-id='type-id-875'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-596'>
+        <parameter type-id='type-id-464'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-848'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-881'/>
+        <parameter type-id='type-id-879'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-849'>
+        <parameter type-id='type-id-360'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-850'>
+        <parameter type-id='type-id-360'/>
+        <parameter type-id='type-id-876'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-585'>
+        <parameter type-id='type-id-513'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-851'>
+        <parameter type-id='type-id-820'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-852'>
+        <parameter type-id='type-id-684'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-853'>
+        <parameter type-id='type-id-684'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-854'>
+        <parameter type-id='type-id-684'/>
+        <parameter type-id='type-id-882'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-855'>
+        <parameter type-id='type-id-684'/>
+        <parameter type-id='type-id-826'/>
+        <parameter type-id='type-id-736'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-856'>
+        <parameter type-id='type-id-663'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-857'>
+        <parameter type-id='type-id-661'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-858'>
+        <parameter type-id='type-id-661'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-590'>
+        <parameter type-id='type-id-463'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-859'>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-514'>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-361'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-598'>
+        <parameter type-id='type-id-378'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-578'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-574'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-566'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-565'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-568'>
+        <parameter type-id='type-id-378'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-463'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-860'>
+        <parameter type-id='type-id-241'/>
+        <parameter type-id='type-id-253'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-861'>
+        <parameter type-id='type-id-257'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-862'>
+        <parameter type-id='type-id-257'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-863'>
+        <parameter type-id='type-id-253'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-864'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-1'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-865'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-878'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-866'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-83'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-867'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-868'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-821'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-869'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-88'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-870'>
+        <parameter type-id='type-id-253'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-871'>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-771'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-533'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-872'>
+        <parameter type-id='type-id-684'/>
+        <parameter type-id='type-id-528'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-531'>
+        <parameter type-id='type-id-485'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <union-decl name='__anonymous_union__15' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/trace_events.h' line='256' column='1' id='type-id-744'>
+        <data-member access='private'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/linux/trace_events.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='tp' type-id='type-id-883' visibility='default' filepath='include/linux/trace_events.h' line='259' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__9' size-in-bits='1472' is-anonymous='yes' visibility='default' filepath='include/linux/elevator.h' line='141' column='1' id='type-id-539'>
+        <data-member access='private'>
+          <var-decl name='sq' type-id='type-id-542' visibility='default' filepath='include/linux/elevator.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='mq' type-id='type-id-600' visibility='default' filepath='include/linux/elevator.h' line='143' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__7' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/blkdev.h' line='178' column='1' id='type-id-507'>
+        <data-member access='private'>
+          <var-decl name='hash' type-id='type-id-520' visibility='default' filepath='include/linux/blkdev.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ipi_list' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='180' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__5' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/backing-dev-defs.h' line='160' column='1' id='type-id-412'>
+        <data-member access='private'>
+          <var-decl name='release_work' type-id='type-id-255' visibility='default' filepath='include/linux/backing-dev-defs.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/backing-dev-defs.h' line='162' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__10' is-anonymous='yes' visibility='default' filepath='include/linux/blk_types.h' line='191' column='1' id='type-id-369'/>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/locking/spinlock.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-884'/>
+      <pointer-type-def type-id='type-id-885' size-in-bits='64' id='type-id-886'/>
+      <function-decl name='_raw_spin_trylock' mangled-name='_raw_spin_trylock' filepath='kernel/locking/spinlock.c' line='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_spin_trylock'>
+        <parameter type-id='type-id-884' name='lock' filepath='kernel/locking/spinlock.c' line='126' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='_raw_spin_lock' mangled-name='_raw_spin_lock' filepath='kernel/locking/spinlock.c' line='142' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_spin_lock'>
+        <parameter type-id='type-id-884' name='lock' filepath='kernel/locking/spinlock.c' line='142' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_raw_spin_lock_irqsave' mangled-name='_raw_spin_lock_irqsave' filepath='kernel/locking/spinlock.c' line='150' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_spin_lock_irqsave'>
+        <parameter type-id='type-id-884' name='lock' filepath='kernel/locking/spinlock.c' line='150' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+      <function-decl name='_raw_spin_lock_irq' mangled-name='_raw_spin_lock_irq' filepath='kernel/locking/spinlock.c' line='158' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_spin_lock_irq'>
+        <parameter type-id='type-id-884' name='lock' filepath='kernel/locking/spinlock.c' line='158' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_raw_spin_lock_bh' mangled-name='_raw_spin_lock_bh' filepath='kernel/locking/spinlock.c' line='166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_spin_lock_bh'>
+        <parameter type-id='type-id-884' name='lock' filepath='kernel/locking/spinlock.c' line='166' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_raw_spin_unlock' mangled-name='_raw_spin_unlock' filepath='kernel/locking/spinlock.c' line='174' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_spin_unlock'>
+        <parameter type-id='type-id-884' name='lock' filepath='kernel/locking/spinlock.c' line='174' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_raw_spin_unlock_irqrestore' mangled-name='_raw_spin_unlock_irqrestore' filepath='kernel/locking/spinlock.c' line='182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_spin_unlock_irqrestore'>
+        <parameter type-id='type-id-884' name='lock' filepath='kernel/locking/spinlock.c' line='182' column='1'/>
+        <parameter type-id='type-id-16' name='flags' filepath='kernel/locking/spinlock.c' line='182' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_raw_spin_unlock_irq' mangled-name='_raw_spin_unlock_irq' filepath='kernel/locking/spinlock.c' line='190' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_spin_unlock_irq'>
+        <parameter type-id='type-id-884' name='lock' filepath='kernel/locking/spinlock.c' line='190' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_raw_spin_unlock_bh' mangled-name='_raw_spin_unlock_bh' filepath='kernel/locking/spinlock.c' line='198' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_spin_unlock_bh'>
+        <parameter type-id='type-id-884' name='lock' filepath='kernel/locking/spinlock.c' line='198' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_raw_read_lock' mangled-name='_raw_read_lock' filepath='kernel/locking/spinlock.c' line='214' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_read_lock'>
+        <parameter type-id='type-id-886' name='lock' filepath='kernel/locking/spinlock.c' line='214' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_raw_read_unlock' mangled-name='_raw_read_unlock' filepath='kernel/locking/spinlock.c' line='246' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_read_unlock'>
+        <parameter type-id='type-id-886' name='lock' filepath='kernel/locking/spinlock.c' line='246' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_raw_write_lock_bh' mangled-name='_raw_write_lock_bh' filepath='kernel/locking/spinlock.c' line='310' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_write_lock_bh'>
+        <parameter type-id='type-id-886' name='lock' filepath='kernel/locking/spinlock.c' line='310' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_raw_write_unlock_bh' mangled-name='_raw_write_unlock_bh' filepath='kernel/locking/spinlock.c' line='342' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_raw_write_unlock_bh'>
+        <parameter type-id='type-id-886' name='lock' filepath='kernel/locking/spinlock.c' line='342' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/panic.c' language='LANG_C89'>
+      <function-decl name='panic' mangled-name='panic' filepath='kernel/panic.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='panic'>
+        <parameter type-id='type-id-4' name='fmt' filepath='kernel/panic.c' line='136' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__warn_printk' mangled-name='__warn_printk' filepath='kernel/panic.c' line='591' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__warn_printk'>
+        <parameter type-id='type-id-4' name='fmt' filepath='kernel/panic.c' line='591' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__stack_chk_fail' mangled-name='__stack_chk_fail' filepath='kernel/panic.c' line='637' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__stack_chk_fail'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='arch/arm64/kernel/io.c' language='LANG_C89'>
+      <type-decl name='int' size-in-bits='32' id='type-id-17'/>
+      <type-decl name='unsigned long int' size-in-bits='64' id='type-id-16'/>
+      <type-decl name='void' id='type-id-81'/>
+      <typedef-decl name='size_t' type-id='type-id-887' filepath='include/linux/types.h' line='55' column='1' id='type-id-84'/>
+      <typedef-decl name='__kernel_size_t' type-id='type-id-888' filepath='include/uapi/asm-generic/posix_types.h' line='72' column='1' id='type-id-887'/>
+      <typedef-decl name='__kernel_ulong_t' type-id='type-id-16' filepath='include/uapi/asm-generic/posix_types.h' line='16' column='1' id='type-id-888'/>
+      <qualified-type-def type-id='type-id-889' const='yes' id='type-id-890'/>
+      <pointer-type-def type-id='type-id-890' size-in-bits='64' id='type-id-891'/>
+      <pointer-type-def type-id='type-id-81' size-in-bits='64' id='type-id-15'/>
+      <qualified-type-def type-id='type-id-81' volatile='yes' id='type-id-889'/>
+      <pointer-type-def type-id='type-id-889' size-in-bits='64' id='type-id-104'/>
+      <function-decl name='__memcpy_fromio' mangled-name='__memcpy_fromio' filepath='arch/arm64/kernel/io.c' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__memcpy_fromio'>
+        <parameter type-id='type-id-15' name='to' filepath='arch/arm64/kernel/io.c' line='26' column='1'/>
+        <parameter type-id='type-id-891' name='from' filepath='arch/arm64/kernel/io.c' line='26' column='1'/>
+        <parameter type-id='type-id-84' name='count' filepath='arch/arm64/kernel/io.c' line='26' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__memcpy_toio' mangled-name='__memcpy_toio' filepath='arch/arm64/kernel/io.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__memcpy_toio'>
+        <parameter type-id='type-id-104' name='to' filepath='arch/arm64/kernel/io.c' line='54' column='1'/>
+        <parameter type-id='type-id-15' name='from' filepath='arch/arm64/kernel/io.c' line='54' column='1'/>
+        <parameter type-id='type-id-84' name='count' filepath='arch/arm64/kernel/io.c' line='54' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__memset_io' mangled-name='__memset_io' filepath='arch/arm64/kernel/io.c' line='82' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__memset_io'>
+        <parameter type-id='type-id-104' name='dst' filepath='arch/arm64/kernel/io.c' line='82' column='1'/>
+        <parameter type-id='type-id-17' name='c' filepath='arch/arm64/kernel/io.c' line='82' column='1'/>
+        <parameter type-id='type-id-84' name='count' filepath='arch/arm64/kernel/io.c' line='82' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/mmap.c' language='LANG_C89'>
+      <function-decl name='vm_get_page_prot' mangled-name='vm_get_page_prot' filepath='mm/mmap.c' line='111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_get_page_prot'>
+        <parameter type-id='type-id-16' name='vm_flags' filepath='mm/mmap.c' line='111' column='1'/>
+        <return type-id='type-id-102'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/sysfs/group.c' language='LANG_C89'>
+      <function-decl name='sysfs_create_group' mangled-name='sysfs_create_group' filepath='fs/sysfs/group.c' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sysfs_create_group'>
+        <parameter type-id='type-id-379' name='kobj' filepath='fs/sysfs/group.c' line='170' column='1'/>
+        <parameter type-id='type-id-892' name='grp' filepath='fs/sysfs/group.c' line='171' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sysfs_remove_group' mangled-name='sysfs_remove_group' filepath='fs/sysfs/group.c' line='244' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sysfs_remove_group'>
+        <parameter type-id='type-id-379' name='kobj' filepath='fs/sysfs/group.c' line='244' column='1'/>
+        <parameter type-id='type-id-892' name='grp' filepath='fs/sysfs/group.c' line='245' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/events/core.c' language='LANG_C89'>
+
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='7584' id='type-id-894'>
+        <subrange length='948' type-id='type-id-9' id='type-id-895'/>
+
+      </array-type-def>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/trace_events.h' line='256' column='1' id='type-id-896'>
+        <data-member access='private'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/linux/trace_events.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='tp' type-id='type-id-883' visibility='default' filepath='include/linux/trace_events.h' line='259' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='perf_event_mmap_page' size-in-bits='8704' is-struct='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='473' column='1' id='type-id-897'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='version' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='474' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='compat_version' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='475' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='lock' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='512' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='index' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='513' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='offset' type-id='type-id-898' visibility='default' filepath='include/uapi/linux/perf_event.h' line='514' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='time_enabled' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='515' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='time_running' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='516' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='' type-id='type-id-899' visibility='default' filepath='include/uapi/linux/perf_event.h' line='517' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='pmc_width' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/perf_event.h' line='539' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='400'>
+          <var-decl name='time_shift' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/perf_event.h' line='565' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='time_mult' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='566' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='time_offset' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='567' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='time_zero' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='584' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='size' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/perf_event.h' line='585' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='__reserved' type-id='type-id-894' visibility='default' filepath='include/uapi/linux/perf_event.h' line='591' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8192'>
+          <var-decl name='data_head' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='609' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8256'>
+          <var-decl name='data_tail' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='610' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8320'>
+          <var-decl name='data_offset' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='611' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8384'>
+          <var-decl name='data_size' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='612' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8448'>
+          <var-decl name='aux_head' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='625' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8512'>
+          <var-decl name='aux_tail' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='626' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8576'>
+          <var-decl name='aux_offset' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='627' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8640'>
+          <var-decl name='aux_size' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='628' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='517' column='1' id='type-id-899'>
+        <data-member access='private'>
+          <var-decl name='capabilities' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='518' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-900' visibility='default' filepath='include/uapi/linux/perf_event.h' line='519' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='519' column='1' id='type-id-900'>
+        <data-member access='public' layout-offset-in-bits='63'>
+          <var-decl name='cap_bit0' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='520' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='62'>
+          <var-decl name='cap_bit0_is_deprecated' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='521' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='61'>
+          <var-decl name='cap_user_rdpmc' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='523' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='60'>
+          <var-decl name='cap_user_time' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='524' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='59'>
+          <var-decl name='cap_user_time_zero' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='525' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cap_____res' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/perf_event.h' line='526' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-901' size-in-bits='64' id='type-id-902'/>
+      <pointer-type-def type-id='type-id-903' size-in-bits='64' id='type-id-904'/>
+      <pointer-type-def type-id='type-id-905' size-in-bits='64' id='type-id-906'/>
+      <pointer-type-def type-id='type-id-907' size-in-bits='64' id='type-id-908'/>
+      <pointer-type-def type-id='type-id-897' size-in-bits='64' id='type-id-909'/>
+      <pointer-type-def type-id='type-id-910' size-in-bits='64' id='type-id-911'/>
+      <pointer-type-def type-id='type-id-912' size-in-bits='64' id='type-id-913'/>
+      <function-decl name='perf_trace_run_bpf_submit' mangled-name='perf_trace_run_bpf_submit' filepath='kernel/events/core.c' line='8354' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='perf_trace_run_bpf_submit'>
+        <parameter type-id='type-id-15' name='raw_data' filepath='kernel/events/core.c' line='8354' column='1'/>
+        <parameter type-id='type-id-17' name='size' filepath='kernel/events/core.c' line='8354' column='1'/>
+        <parameter type-id='type-id-17' name='rctx' filepath='kernel/events/core.c' line='8354' column='1'/>
+        <parameter type-id='type-id-21' name='call' filepath='kernel/events/core.c' line='8355' column='1'/>
+        <parameter type-id='type-id-40' name='count' filepath='kernel/events/core.c' line='8355' column='1'/>
+        <parameter type-id='type-id-736' name='regs' filepath='kernel/events/core.c' line='8356' column='1'/>
+        <parameter type-id='type-id-746' name='head' filepath='kernel/events/core.c' line='8356' column='1'/>
+        <parameter type-id='type-id-431' name='task' filepath='kernel/events/core.c' line='8357' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-901'>
+        <parameter type-id='type-id-914'/>
+        <parameter type-id='type-id-904'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-905'>
+        <parameter type-id='type-id-904'/>
+        <return type-id='type-id-904'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-907'>
+        <parameter type-id='type-id-431'/>
+        <return type-id='type-id-904'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-910'>
+        <parameter type-id='type-id-904'/>
+        <return type-id='type-id-915'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-912'>
+        <parameter type-id='type-id-904'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/scatterlist.c' language='LANG_C89'>
+      <class-decl name='sg_mapping_iter' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/scatterlist.h' line='413' column='1' id='type-id-916'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='page' type-id='type-id-512' visibility='default' filepath='include/linux/scatterlist.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='addr' type-id='type-id-15' visibility='default' filepath='include/linux/scatterlist.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='length' type-id='type-id-84' visibility='default' filepath='include/linux/scatterlist.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='consumed' type-id='type-id-84' visibility='default' filepath='include/linux/scatterlist.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='piter' type-id='type-id-917' visibility='default' filepath='include/linux/scatterlist.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='__offset' type-id='type-id-5' visibility='default' filepath='include/linux/scatterlist.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='__remaining' type-id='type-id-5' visibility='default' filepath='include/linux/scatterlist.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='__flags' type-id='type-id-5' visibility='default' filepath='include/linux/scatterlist.h' line='424' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sg_page_iter' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/scatterlist.h' line='349' column='1' id='type-id-917'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sg' type-id='type-id-918' visibility='default' filepath='include/linux/scatterlist.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sg_pgoffset' type-id='type-id-5' visibility='default' filepath='include/linux/scatterlist.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='__nents' type-id='type-id-5' visibility='default' filepath='include/linux/scatterlist.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='__pg_advance' type-id='type-id-17' visibility='default' filepath='include/linux/scatterlist.h' line='355' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-916' size-in-bits='64' id='type-id-919'/>
+      <function-decl name='sg_next' mangled-name='sg_next' filepath='lib/scatterlist.c' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_next'>
+        <parameter type-id='type-id-918' name='sg' filepath='lib/scatterlist.c' line='25' column='1'/>
+        <return type-id='type-id-918'/>
+      </function-decl>
+      <function-decl name='sg_nents' mangled-name='sg_nents' filepath='lib/scatterlist.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_nents'>
+        <parameter type-id='type-id-918' name='sg' filepath='lib/scatterlist.c' line='47' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sg_nents_for_len' mangled-name='sg_nents_for_len' filepath='lib/scatterlist.c' line='70' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_nents_for_len'>
+        <parameter type-id='type-id-918' name='sg' filepath='lib/scatterlist.c' line='70' column='1'/>
+        <parameter type-id='type-id-40' name='len' filepath='lib/scatterlist.c' line='70' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sg_init_table' mangled-name='sg_init_table' filepath='lib/scatterlist.c' line='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_init_table'>
+        <parameter type-id='type-id-918' name='sgl' filepath='lib/scatterlist.c' line='126' column='1'/>
+        <parameter type-id='type-id-5' name='nents' filepath='lib/scatterlist.c' line='126' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sg_init_one' mangled-name='sg_init_one' filepath='lib/scatterlist.c' line='140' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_init_one'>
+        <parameter type-id='type-id-918' name='sg' filepath='lib/scatterlist.c' line='140' column='1'/>
+        <parameter type-id='type-id-15' name='buf' filepath='lib/scatterlist.c' line='140' column='1'/>
+        <parameter type-id='type-id-5' name='buflen' filepath='lib/scatterlist.c' line='140' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sg_free_table' mangled-name='sg_free_table' filepath='lib/scatterlist.c' line='238' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_free_table'>
+        <parameter type-id='type-id-920' name='table' filepath='lib/scatterlist.c' line='238' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sg_alloc_table' mangled-name='sg_alloc_table' filepath='lib/scatterlist.c' line='347' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_alloc_table'>
+        <parameter type-id='type-id-920' name='table' filepath='lib/scatterlist.c' line='347' column='1'/>
+        <parameter type-id='type-id-5' name='nents' filepath='lib/scatterlist.c' line='347' column='1'/>
+        <parameter type-id='type-id-485' name='gfp_mask' filepath='lib/scatterlist.c' line='347' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sg_alloc_table_from_pages' mangled-name='sg_alloc_table_from_pages' filepath='lib/scatterlist.c' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_alloc_table_from_pages'>
+        <parameter type-id='type-id-920' name='sgt' filepath='lib/scatterlist.c' line='456' column='1'/>
+        <parameter type-id='type-id-921' name='pages' filepath='lib/scatterlist.c' line='456' column='1'/>
+        <parameter type-id='type-id-5' name='n_pages' filepath='lib/scatterlist.c' line='457' column='1'/>
+        <parameter type-id='type-id-5' name='offset' filepath='lib/scatterlist.c' line='457' column='1'/>
+        <parameter type-id='type-id-16' name='size' filepath='lib/scatterlist.c' line='458' column='1'/>
+        <parameter type-id='type-id-485' name='gfp_mask' filepath='lib/scatterlist.c' line='458' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sg_miter_start' mangled-name='sg_miter_start' filepath='lib/scatterlist.c' line='640' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_miter_start'>
+        <parameter type-id='type-id-919' name='miter' filepath='lib/scatterlist.c' line='640' column='1'/>
+        <parameter type-id='type-id-918' name='sgl' filepath='lib/scatterlist.c' line='640' column='1'/>
+        <parameter type-id='type-id-5' name='nents' filepath='lib/scatterlist.c' line='641' column='1'/>
+        <parameter type-id='type-id-5' name='flags' filepath='lib/scatterlist.c' line='641' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sg_miter_stop' mangled-name='sg_miter_stop' filepath='lib/scatterlist.c' line='766' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_miter_stop'>
+        <parameter type-id='type-id-919' name='miter' filepath='lib/scatterlist.c' line='766' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sg_miter_next' mangled-name='sg_miter_next' filepath='lib/scatterlist.c' line='729' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_miter_next'>
+        <parameter type-id='type-id-919' name='miter' filepath='lib/scatterlist.c' line='729' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='sg_copy_from_buffer' mangled-name='sg_copy_from_buffer' filepath='lib/scatterlist.c' line='852' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_copy_from_buffer'>
+        <parameter type-id='type-id-918' name='sgl' filepath='lib/scatterlist.c' line='852' column='1'/>
+        <parameter type-id='type-id-5' name='nents' filepath='lib/scatterlist.c' line='852' column='1'/>
+        <parameter type-id='type-id-15' name='buf' filepath='lib/scatterlist.c' line='853' column='1'/>
+        <parameter type-id='type-id-84' name='buflen' filepath='lib/scatterlist.c' line='853' column='1'/>
+        <return type-id='type-id-84'/>
+      </function-decl>
+      <function-decl name='sg_copy_to_buffer' mangled-name='sg_copy_to_buffer' filepath='lib/scatterlist.c' line='869' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sg_copy_to_buffer'>
+        <parameter type-id='type-id-918' name='sgl' filepath='lib/scatterlist.c' line='869' column='1'/>
+        <parameter type-id='type-id-5' name='nents' filepath='lib/scatterlist.c' line='869' column='1'/>
+        <parameter type-id='type-id-15' name='buf' filepath='lib/scatterlist.c' line='870' column='1'/>
+        <parameter type-id='type-id-84' name='buflen' filepath='lib/scatterlist.c' line='870' column='1'/>
+        <return type-id='type-id-84'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/vmalloc.c' language='LANG_C89'>
+      <class-decl name='device' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-922'/>
+      <pointer-type-def type-id='type-id-922' size-in-bits='64' id='type-id-923'/>
+      <function-decl name='vmalloc_to_page' mangled-name='vmalloc_to_page' filepath='mm/vmalloc.c' line='266' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vmalloc_to_page'>
+        <parameter type-id='type-id-15' name='vmalloc_addr' filepath='mm/vmalloc.c' line='266' column='1'/>
+        <return type-id='type-id-512'/>
+      </function-decl>
+      <function-decl name='vunmap' mangled-name='vunmap' filepath='mm/vmalloc.c' line='1618' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vunmap'>
+        <parameter type-id='type-id-15' name='addr' filepath='mm/vmalloc.c' line='1618' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='vmap' mangled-name='vmap' filepath='mm/vmalloc.c' line='1637' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vmap'>
+        <parameter type-id='type-id-921' name='pages' filepath='mm/vmalloc.c' line='1637' column='1'/>
+        <parameter type-id='type-id-5' name='count' filepath='mm/vmalloc.c' line='1637' column='1'/>
+        <parameter type-id='type-id-16' name='flags' filepath='mm/vmalloc.c' line='1638' column='1'/>
+        <parameter type-id='type-id-102' name='prot' filepath='mm/vmalloc.c' line='1638' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='arch/arm64/net/bpf_jit_comp.c' language='LANG_C89'>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+      <type-decl name='__ARRAY_SIZE_TYPE__' size-in-bits='64' id='type-id-9'/>
+      <array-type-def dimensions='1' type-id='type-id-924' size-in-bits='128' id='type-id-925'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-927' size-in-bits='64' id='type-id-928'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-927' size-in-bits='128' id='type-id-929'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-511' size-in-bits='64' id='type-id-930'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-511' size-in-bits='96' id='type-id-931'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-511' size-in-bits='224' id='type-id-932'>
+        <subrange length='7' type-id='type-id-9' id='type-id-125'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-511' size-in-bits='256' id='type-id-933'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-511' size-in-bits='infinite' id='type-id-934'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-100' size-in-bits='128' id='type-id-935'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-100' size-in-bits='infinite' id='type-id-735'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='128' id='type-id-936'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='16' id='type-id-937'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='256' id='type-id-938'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='24' id='type-id-940'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='416' id='type-id-941'>
+        <subrange length='52' type-id='type-id-9' id='type-id-942'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='48' id='type-id-943'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='infinite' id='type-id-944'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-945' size-in-bits='4096' id='type-id-946'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-115' size-in-bits='256' id='type-id-947'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-115' size-in-bits='32768' id='type-id-948'>
+        <subrange length='512' type-id='type-id-9' id='type-id-949'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-26' size-in-bits='288' id='type-id-950'>
+        <subrange length='9' type-id='type-id-9' id='type-id-951'/>
+
+      </array-type-def>
+      <type-decl name='bool' size-in-bits='8' id='type-id-952'/>
+      <array-type-def dimensions='1' type-id='type-id-953' size-in-bits='infinite' id='type-id-954'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-747' size-in-bits='1344' id='type-id-955'>
+        <subrange length='21' type-id='type-id-9' id='type-id-956'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-957' size-in-bits='infinite' id='type-id-958'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-365' size-in-bits='448' id='type-id-959'>
+        <subrange length='7' type-id='type-id-9' id='type-id-125'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='2048' id='type-id-960'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='192' id='type-id-961'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='1024' id='type-id-962'>
+        <subrange length='128' type-id='type-id-9' id='type-id-963'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='96' id='type-id-964'>
+        <subrange length='12' type-id='type-id-9' id='type-id-965'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='112' id='type-id-966'>
+        <subrange length='14' type-id='type-id-9' id='type-id-117'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='128' id='type-id-43'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='16384' id='type-id-967'>
+        <subrange length='2048' type-id='type-id-9' id='type-id-968'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='256' id='type-id-373'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='32768' id='type-id-969'>
+        <subrange length='4096' type-id='type-id-9' id='type-id-218'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='384' id='type-id-970'>
+        <subrange length='48' type-id='type-id-9' id='type-id-971'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='448' id='type-id-972'>
+        <subrange length='56' type-id='type-id-9' id='type-id-123'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='512' id='type-id-250'>
+        <subrange length='64' type-id='type-id-9' id='type-id-188'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='64' id='type-id-973'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' id='type-id-440'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='acpi_device_id' size-in-bits='256' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-974'/>
+      <class-decl name='anon_vma' size-in-bits='640' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-975'/>
+      <class-decl name='assoc_array_ptr' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-976'/>
+      <class-decl name='audit_context' size-in-bits='7360' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-977'/>
+      <class-decl name='autogroup' size-in-bits='576' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-978'/>
+      <class-decl name='backing_dev_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-979'/>
+      <class-decl name='bdi_writeback' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-980'/>
+      <class-decl name='bio_list' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-981'/>
+      <class-decl name='bio_vec' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-982'/>
+      <class-decl name='blk_plug' size-in-bits='384' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-983'/>
+      <class-decl name='bpf_cgroup_storage_map' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-984'/>
+      <class-decl name='bpf_verifier_env' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-985'/>
+      <class-decl name='btf' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-986'/>
+      <class-decl name='btf_type' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-987'/>
+      <class-decl name='bucket_table' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-988'/>
+      <class-decl name='can_dev_rcv_lists' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-989'/>
+      <class-decl name='cdev' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-990'/>
+      <class-decl name='cfs_rq' size-in-bits='3072' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-991'/>
+      <class-decl name='cgroup_taskset' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-992'/>
+      <class-decl name='cma' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-993'/>
+      <class-decl name='cpu_rmap' size-in-bits='128' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-994'/>
+      <class-decl name='dev_pin_info' size-in-bits='320' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-995'/>
+      <class-decl name='dev_pm_qos' size-in-bits='1024' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-996'/>
+      <class-decl name='device_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-997'/>
+      <class-decl name='device_private' size-in-bits='1344' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-998'/>
+      <class-decl name='dma_coherent_mem' size-in-bits='384' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-999'/>
+      <class-decl name='driver_private' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1000'/>
+      <class-decl name='dst_entry' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1001'/>
+      <class-decl name='export_operations' size-in-bits='576' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1002'/>
+      <class-decl name='fib6_info' size-in-bits='1792' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1003'/>
+      <class-decl name='fib6_table' size-in-bits='960' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1004'/>
+      <class-decl name='fib_notifier_ops' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1005'/>
+      <class-decl name='fib_rules_ops' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1006'/>
+      <class-decl name='fib_table' size-in-bits='384' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1007'/>
+      <class-decl name='files_struct' size-in-bits='5632' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1008'/>
+      <class-decl name='fs_struct' size-in-bits='448' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1009'/>
+      <class-decl name='fscrypt_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1010'/>
+      <class-decl name='fscrypt_operations' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1011'/>
+      <class-decl name='fsnotify_mark_connector' size-in-bits='192' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1012'/>
+      <class-decl name='fsverity_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1013'/>
+      <class-decl name='fsverity_operations' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1014'/>
+      <class-decl name='futex_pi_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1015'/>
+      <class-decl name='gendisk' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1016'/>
+      <class-decl name='hd_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1017'/>
+      <class-decl name='in_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1018'/>
+      <class-decl name='inet6_dev' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1019'/>
+      <class-decl name='inet_hashinfo' size-in-bits='4608' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1020'/>
+      <class-decl name='inet_peer_base' size-in-bits='192' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1021'/>
+      <class-decl name='iommu_fwspec' size-in-bits='256' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1022'/>
+      <class-decl name='iommu_group' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1023'/>
+      <class-decl name='iommu_ops' size-in-bits='1664' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1024'/>
+      <class-decl name='ip_ra_chain' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1025'/>
+      <class-decl name='ipc_namespace' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1026'/>
+      <class-decl name='ipv4_devconf' size-in-bits='1152' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1027'/>
+      <class-decl name='ipv6_devconf' size-in-bits='1792' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1028'/>
+      <class-decl name='irq_domain' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1029'/>
+      <class-decl name='iw_handler_def' size-in-bits='320' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1030'/>
+      <class-decl name='iw_public_data' size-in-bits='128' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1031'/>
+      <class-decl name='kernfs_iattrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1032'/>
+      <class-decl name='kernfs_open_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1033'/>
+      <class-decl name='key_type' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1034'/>
+      <class-decl name='key_user' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1035'/>
+      <class-decl name='kioctx_table' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1036'/>
+      <class-decl name='kmem_cache' size-in-bits='2752' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1037'/>
+      <class-decl name='kstatfs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1038'/>
+      <class-decl name='linux_binfmt' size-in-bits='448' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1039'/>
+      <class-decl name='mem_cgroup' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1040'/>
+      <class-decl name='mnt_namespace' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1041'/>
+      <class-decl name='module_notes_attrs' size-in-bits='128' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1042'/>
+      <class-decl name='module_param_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1043'/>
+      <class-decl name='module_sect_attrs' size-in-bits='384' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1044'/>
+      <class-decl name='mtd_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1045'/>
+      <class-decl name='nameidata' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1046'/>
+      <class-decl name='ndisc_ops' size-in-bits='384' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1047'/>
+      <class-decl name='neigh_parms' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1048'/>
+      <class-decl name='neighbour' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1049'/>
+      <class-decl name='net_generic' size-in-bits='192' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1050'/>
+      <class-decl name='net_rate_estimator' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1051'/>
+      <class-decl name='nf_ct_event_notifier' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1052'/>
+      <class-decl name='nf_exp_event_notifier' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1053'/>
+      <class-decl name='nf_hook_entries' size-in-bits='64' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1054'/>
+      <class-decl name='nf_logger' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1055'/>
+      <class-decl name='nf_queue_handler' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1056'/>
+      <class-decl name='nfs4_lock_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1057'/>
+      <class-decl name='nlm_lockowner' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1058'/>
+      <class-decl name='of_device_id' size-in-bits='1600' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1059'/>
+      <class-decl name='pcpu_dstats' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1060'/>
+      <class-decl name='pcpu_lstats' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1061'/>
+      <class-decl name='pcpu_vstats' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1062'/>
+      <class-decl name='perf_event' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1063'/>
+      <class-decl name='perf_event_context' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1064'/>
+      <class-decl name='phy_device' size-in-bits='9408' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1065'/>
+      <class-decl name='poll_table_struct' size-in-bits='128' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1066'/>
+      <class-decl name='pollfd' size-in-bits='64' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1067'/>
+      <class-decl name='posix_acl' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1068'/>
+      <class-decl name='proc_dir_entry' size-in-bits='1408' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1069'/>
+      <class-decl name='proc_ns_operations' size-in-bits='512' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1070'/>
+      <class-decl name='prot_inuse' size-in-bits='2048' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1071'/>
+      <class-decl name='qdisc_walker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1072'/>
+      <class-decl name='rcu_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1073'/>
+      <class-decl name='reclaim_state' size-in-bits='64' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1074'/>
+      <class-decl name='request_queue' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1075'/>
+      <class-decl name='robust_list_head' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1076'/>
+      <class-decl name='rt6_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1077'/>
+      <class-decl name='rt6_statistics' size-in-bits='224' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1078'/>
+      <class-decl name='rt_mutex_waiter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1079'/>
+      <class-decl name='rt_rq' size-in-bits='13824' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1080'/>
+      <class-decl name='s_pstats' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1081'/>
+      <class-decl name='s_stats' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1082'/>
+      <class-decl name='sched_class' size-in-bits='1536' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1083'/>
+      <class-decl name='sec_path' size-in-bits='704' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1084'/>
+      <class-decl name='seccomp_filter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1085'/>
+      <class-decl name='seg6_pernet_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1086'/>
+      <class-decl name='sfp_bus' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1087'/>
+      <class-decl name='sock' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1088'/>
+      <class-decl name='subsys_private' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1089'/>
+      <class-decl name='swap_info_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1090'/>
+      <class-decl name='task_group' size-in-bits='4608' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1091'/>
+      <class-decl name='tcf_walker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1092'/>
+      <class-decl name='tcp_congestion_ops' size-in-bits='1216' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1093'/>
+      <class-decl name='tcp_fastopen_context' size-in-bits='320' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1094'/>
+      <class-decl name='tipc_bearer' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1095'/>
+      <class-decl name='trace_eval_map' size-in-bits='192' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1096'/>
+      <class-decl name='trace_event_call' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1097'/>
+      <class-decl name='tty_audit_buf' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1098'/>
+      <class-decl name='tty_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1099'/>
+      <class-decl name='udp_tunnel_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1100'/>
+      <class-decl name='uevent_sock' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1101'/>
+      <class-decl name='uprobe' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1102'/>
+      <class-decl name='uts_namespace' size-in-bits='3520' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1103'/>
+      <class-decl name='vfsmount' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1104'/>
+      <class-decl name='wake_irq' size-in-bits='192' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1105'/>
+      <class-decl name='wireless_dev' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1106'/>
+      <class-decl name='workqueue_struct' size-in-bits='2560' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1107'/>
+      <class-decl name='wpan_dev' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1108'/>
+      <class-decl name='writeback_control' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1109'/>
+      <class-decl name='xattr_handler' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1110'/>
+      <class-decl name='xdp_umem' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1111'/>
+      <class-decl name='xol_area' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1112'/>
+      <class-decl name='xt_table' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1113'/>
+      <array-type-def dimensions='1' type-id='type-id-892' size-in-bits='256' id='type-id-1114'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1115' size-in-bits='832' id='type-id-1116'>
+        <subrange length='13' type-id='type-id-9' id='type-id-201'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1117' size-in-bits='192' id='type-id-1118'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1119' size-in-bits='256' id='type-id-1120'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-186' size-in-bits='1024' id='type-id-1121'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-186' size-in-bits='192' id='type-id-1122'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-186' size-in-bits='256' id='type-id-1123'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-520' size-in-bits='512' id='type-id-1124'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1125' size-in-bits='4096' id='type-id-1126'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1127' size-in-bits='192' id='type-id-1128'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='896' id='type-id-1129'>
+        <subrange length='28' type-id='type-id-9' id='type-id-1130'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='64' id='type-id-465'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='96' id='type-id-1131'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='128' id='type-id-1132'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='288' id='type-id-1133'>
+        <subrange length='9' type-id='type-id-9' id='type-id-951'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='infinite' id='type-id-1134'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1135' size-in-bits='16384' id='type-id-1136'>
+        <subrange length='64' type-id='type-id-9' id='type-id-188'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-330' size-in-bits='64' id='type-id-1137'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-330' size-in-bits='infinite' id='type-id-1138'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='1664' id='type-id-1139'>
+        <subrange length='13' type-id='type-id-9' id='type-id-201'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='2688' id='type-id-1140'>
+        <subrange length='21' type-id='type-id-9' id='type-id-956'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='384' id='type-id-457'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='896' id='type-id-1141'>
+        <subrange length='7' type-id='type-id-9' id='type-id-125'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1142' size-in-bits='infinite' id='type-id-1143'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1144' id='type-id-1145'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <type-decl name='long int' size-in-bits='64' id='type-id-192'/>
+      <array-type-def dimensions='1' type-id='type-id-192' size-in-bits='384' id='type-id-349'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <type-decl name='long long int' size-in-bits='64' id='type-id-1146'/>
+      <array-type-def dimensions='1' type-id='type-id-1147' size-in-bits='1728' id='type-id-1148'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1149' size-in-bits='512' id='type-id-1150'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1151' size-in-bits='192' id='type-id-1152'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1151' size-in-bits='320' id='type-id-1153'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1154' size-in-bits='3072' id='type-id-1155'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1156' size-in-bits='1024' id='type-id-1157'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1158' size-in-bits='128' id='type-id-1159'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-251' size-in-bits='256' id='type-id-1160'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1161' size-in-bits='1344' id='type-id-1162'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-422' size-in-bits='384' id='type-id-1163'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1164' size-in-bits='2048' id='type-id-1165'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1166' size-in-bits='infinite' id='type-id-1167'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <type-decl name='short int' size-in-bits='16' id='type-id-261'/>
+      <type-decl name='signed char' size-in-bits='8' id='type-id-1168'/>
+      <array-type-def dimensions='1' type-id='type-id-1169' size-in-bits='infinite' id='type-id-1170'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <typedef-decl name='__uint128_t' type-id='type-id-1171' id='type-id-945'/>
+      <array-type-def dimensions='1' type-id='type-id-688' size-in-bits='infinite' id='type-id-1172'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='672' id='type-id-1173'>
+        <subrange length='21' type-id='type-id-9' id='type-id-956'/>
+
+      </array-type-def>
+      <array-type-def dimensions='2' type-id='type-id-7' size-in-bits='256' id='type-id-1174'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='160' id='type-id-1175'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='192' id='type-id-1176'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-40' size-in-bits='128' id='type-id-739'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='2' type-id='type-id-40' size-in-bits='448' id='type-id-1177'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-40' size-in-bits='2368' id='type-id-1178'>
+        <subrange length='37' type-id='type-id-9' id='type-id-148'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-40' size-in-bits='320' id='type-id-498'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-40' size-in-bits='512' id='type-id-1179'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='128' id='type-id-1180'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='160' id='type-id-1181'>
+        <subrange length='20' type-id='type-id-9' id='type-id-1182'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='24' id='type-id-1183'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='64' id='type-id-1184'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1185' size-in-bits='480' id='type-id-1186'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-94'/>
+      <type-decl name='unsigned __int128' size-in-bits='128' id='type-id-1171'/>
+      <type-decl name='unsigned char' size-in-bits='8' id='type-id-216'/>
+      <array-type-def dimensions='1' type-id='type-id-216' size-in-bits='256' id='type-id-35'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-216' size-in-bits='48' id='type-id-1187'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <type-decl name='unsigned int' size-in-bits='32' id='type-id-5'/>
+      <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='320' id='type-id-1188'>
+        <subrange length='10' type-id='type-id-9' id='type-id-1189'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='448' id='type-id-1190'>
+        <subrange length='14' type-id='type-id-9' id='type-id-117'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='64' id='type-id-488'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='96' id='type-id-1191'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='192' id='type-id-1192'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='7552' id='type-id-1193'>
+        <subrange length='118' type-id='type-id-9' id='type-id-1194'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='768' id='type-id-1195'>
+        <subrange length='12' type-id='type-id-9' id='type-id-965'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='1024' id='type-id-1196'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='64' id='type-id-491'>
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='1792' id='type-id-1197'>
+        <subrange length='28' type-id='type-id-9' id='type-id-1130'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='1856' id='type-id-1198'>
+        <subrange length='29' type-id='type-id-9' id='type-id-119'/>
+
+      </array-type-def>
+      <array-type-def dimensions='2' type-id='type-id-16' size-in-bits='256' id='type-id-1199'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='2944' id='type-id-1200'>
+        <subrange length='46' type-id='type-id-9' id='type-id-1201'/>
+
+      </array-type-def>
+      <array-type-def dimensions='2' type-id='type-id-16' size-in-bits='512' id='type-id-1202'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='384' id='type-id-1203'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='576' id='type-id-1204'>
+        <subrange length='9' type-id='type-id-9' id='type-id-951'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='infinite' id='type-id-280'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <type-decl name='unsigned short int' size-in-bits='16' id='type-id-312'/>
+      <array-type-def dimensions='1' type-id='type-id-1205' size-in-bits='128' id='type-id-1206'>
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1207' size-in-bits='256' id='type-id-1208'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-15' size-in-bits='256' id='type-id-1209'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-15' size-in-bits='4096' id='type-id-1210'>
+        <subrange length='64' type-id='type-id-9' id='type-id-188'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-15' size-in-bits='infinite' id='type-id-1211'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1212' size-in-bits='384' id='type-id-1213'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1214' size-in-bits='infinite' id='type-id-1215'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <typedef-decl name='bool' type-id='type-id-952' filepath='include/linux/types.h' line='30' column='1' id='type-id-33'/>
+      <class-decl name='bpf_prog' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='480' column='1' id='type-id-1216'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pages' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='481' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15'>
+          <var-decl name='jited' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='482' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14'>
+          <var-decl name='jit_requested' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='483' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13'>
+          <var-decl name='undo_set_mem' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='484' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12'>
+          <var-decl name='gpl_compatible' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='485' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11'>
+          <var-decl name='cb_access' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='486' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10'>
+          <var-decl name='dst_needed' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='487' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9'>
+          <var-decl name='blinded' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='488' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='is_func' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='489' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='kprobe_override' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='490' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='has_callchain_buf' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='491' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='type' type-id='type-id-1217' visibility='default' filepath='include/linux/filter.h' line='492' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='expected_attach_type' type-id='type-id-1218' visibility='default' filepath='include/linux/filter.h' line='493' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='len' type-id='type-id-7' visibility='default' filepath='include/linux/filter.h' line='494' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='jited_len' type-id='type-id-7' visibility='default' filepath='include/linux/filter.h' line='495' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='tag' type-id='type-id-1184' visibility='default' filepath='include/linux/filter.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='aux' type-id='type-id-1219' visibility='default' filepath='include/linux/filter.h' line='497' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='orig_prog' type-id='type-id-1220' visibility='default' filepath='include/linux/filter.h' line='498' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='bpf_func' type-id='type-id-1221' visibility='default' filepath='include/linux/filter.h' line='499' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='' type-id='type-id-1222' visibility='default' filepath='include/linux/filter.h' line='502' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='u16' type-id='type-id-108' filepath='include/asm-generic/int-ll64.h' line='19' column='1' id='type-id-688'/>
+      <typedef-decl name='__u16' type-id='type-id-312' filepath='include/uapi/asm-generic/int-ll64.h' line='24' column='1' id='type-id-108'/>
+      <enum-decl name='bpf_prog_type' filepath='include/uapi/linux/bpf.h' line='132' column='1' id='type-id-1217'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='BPF_PROG_TYPE_UNSPEC' value='0'/>
+        <enumerator name='BPF_PROG_TYPE_SOCKET_FILTER' value='1'/>
+        <enumerator name='BPF_PROG_TYPE_KPROBE' value='2'/>
+        <enumerator name='BPF_PROG_TYPE_SCHED_CLS' value='3'/>
+        <enumerator name='BPF_PROG_TYPE_SCHED_ACT' value='4'/>
+        <enumerator name='BPF_PROG_TYPE_TRACEPOINT' value='5'/>
+        <enumerator name='BPF_PROG_TYPE_XDP' value='6'/>
+        <enumerator name='BPF_PROG_TYPE_PERF_EVENT' value='7'/>
+        <enumerator name='BPF_PROG_TYPE_CGROUP_SKB' value='8'/>
+        <enumerator name='BPF_PROG_TYPE_CGROUP_SOCK' value='9'/>
+        <enumerator name='BPF_PROG_TYPE_LWT_IN' value='10'/>
+        <enumerator name='BPF_PROG_TYPE_LWT_OUT' value='11'/>
+        <enumerator name='BPF_PROG_TYPE_LWT_XMIT' value='12'/>
+        <enumerator name='BPF_PROG_TYPE_SOCK_OPS' value='13'/>
+        <enumerator name='BPF_PROG_TYPE_SK_SKB' value='14'/>
+        <enumerator name='BPF_PROG_TYPE_CGROUP_DEVICE' value='15'/>
+        <enumerator name='BPF_PROG_TYPE_SK_MSG' value='16'/>
+        <enumerator name='BPF_PROG_TYPE_RAW_TRACEPOINT' value='17'/>
+        <enumerator name='BPF_PROG_TYPE_CGROUP_SOCK_ADDR' value='18'/>
+        <enumerator name='BPF_PROG_TYPE_LWT_SEG6LOCAL' value='19'/>
+        <enumerator name='BPF_PROG_TYPE_LIRC_MODE2' value='20'/>
+        <enumerator name='BPF_PROG_TYPE_SK_REUSEPORT' value='21'/>
+      </enum-decl>
+      <enum-decl name='bpf_attach_type' filepath='include/uapi/linux/bpf.h' line='157' column='1' id='type-id-1218'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='BPF_CGROUP_INET_INGRESS' value='0'/>
+        <enumerator name='BPF_CGROUP_INET_EGRESS' value='1'/>
+        <enumerator name='BPF_CGROUP_INET_SOCK_CREATE' value='2'/>
+        <enumerator name='BPF_CGROUP_SOCK_OPS' value='3'/>
+        <enumerator name='BPF_SK_SKB_STREAM_PARSER' value='4'/>
+        <enumerator name='BPF_SK_SKB_STREAM_VERDICT' value='5'/>
+        <enumerator name='BPF_CGROUP_DEVICE' value='6'/>
+        <enumerator name='BPF_SK_MSG_VERDICT' value='7'/>
+        <enumerator name='BPF_CGROUP_INET4_BIND' value='8'/>
+        <enumerator name='BPF_CGROUP_INET6_BIND' value='9'/>
+        <enumerator name='BPF_CGROUP_INET4_CONNECT' value='10'/>
+        <enumerator name='BPF_CGROUP_INET6_CONNECT' value='11'/>
+        <enumerator name='BPF_CGROUP_INET4_POST_BIND' value='12'/>
+        <enumerator name='BPF_CGROUP_INET6_POST_BIND' value='13'/>
+        <enumerator name='BPF_CGROUP_UDP4_SENDMSG' value='14'/>
+        <enumerator name='BPF_CGROUP_UDP6_SENDMSG' value='15'/>
+        <enumerator name='BPF_LIRC_MODE2' value='16'/>
+        <enumerator name='BPF_CGROUP_UDP4_RECVMSG' value='19'/>
+        <enumerator name='BPF_CGROUP_UDP6_RECVMSG' value='20'/>
+        <enumerator name='__MAX_BPF_ATTACH_TYPE' value='21'/>
+      </enum-decl>
+      <typedef-decl name='u32' type-id='type-id-511' filepath='include/asm-generic/int-ll64.h' line='21' column='1' id='type-id-7'/>
+      <typedef-decl name='__u32' type-id='type-id-5' filepath='include/uapi/asm-generic/int-ll64.h' line='27' column='1' id='type-id-511'/>
+      <typedef-decl name='u8' type-id='type-id-893' filepath='include/asm-generic/int-ll64.h' line='17' column='1' id='type-id-214'/>
+      <typedef-decl name='__u8' type-id='type-id-216' filepath='include/uapi/asm-generic/int-ll64.h' line='21' column='1' id='type-id-893'/>
+      <class-decl name='bpf_prog_aux' size-in-bits='1792' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='275' column='1' id='type-id-1223'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refcnt' type-id='type-id-26' visibility='default' filepath='include/linux/bpf.h' line='276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='used_map_cnt' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='max_ctx_offset' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='stack_depth' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='id' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='280' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='func_cnt' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='offload_requested' type-id='type-id-33' visibility='default' filepath='include/linux/bpf.h' line='282' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='func' type-id='type-id-1224' visibility='default' filepath='include/linux/bpf.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='jit_data' type-id='type-id-15' visibility='default' filepath='include/linux/bpf.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ksym_tnode' type-id='type-id-1225' visibility='default' filepath='include/linux/bpf.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='ksym_lnode' type-id='type-id-20' visibility='default' filepath='include/linux/bpf.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='ops' type-id='type-id-1226' visibility='default' filepath='include/linux/bpf.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='used_maps' type-id='type-id-1227' visibility='default' filepath='include/linux/bpf.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='prog' type-id='type-id-1228' visibility='default' filepath='include/linux/bpf.h' line='289' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='user' type-id='type-id-1229' visibility='default' filepath='include/linux/bpf.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='load_time' type-id='type-id-40' visibility='default' filepath='include/linux/bpf.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='cgroup_storage' type-id='type-id-1230' visibility='default' filepath='include/linux/bpf.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='name' type-id='type-id-43' visibility='default' filepath='include/linux/bpf.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='security' type-id='type-id-15' visibility='default' filepath='include/linux/bpf.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='offload' type-id='type-id-1231' visibility='default' filepath='include/linux/bpf.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='' type-id='type-id-1232' visibility='default' filepath='include/linux/bpf.h' line='298' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='atomic_t' type-id='type-id-1233' filepath='include/linux/types.h' line='178' column='1' id='type-id-26'/>
+      <class-decl name='__anonymous_struct__' size-in-bits='32' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-26' visibility='default' filepath='include/linux/types.h' line='176' column='1' id='type-id-1233'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='counter' type-id='type-id-17' visibility='default' filepath='include/linux/types.h' line='177' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='latch_tree_node' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/rbtree_latch.h' line='40' column='1' id='type-id-1225'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-1163' visibility='default' filepath='include/linux/rbtree_latch.h' line='41' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='rcu_special' size-in-bits='32' visibility='default' filepath='include/linux/sched.h' line='561' column='1' id='type-id-1234'>
+        <data-member access='private'>
+          <var-decl name='b' type-id='type-id-1235' visibility='default' filepath='include/linux/sched.h' line='569' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='s' type-id='type-id-7' visibility='default' filepath='include/linux/sched.h' line='570' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='rb_node' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/rbtree.h' line='36' column='1' id='type-id-422'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='__rb_parent_color' type-id='type-id-16' visibility='default' filepath='include/linux/rbtree.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rb_right' type-id='type-id-1236' visibility='default' filepath='include/linux/rbtree.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rb_left' type-id='type-id-1236' visibility='default' filepath='include/linux/rbtree.h' line='39' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='list_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/types.h' line='186' column='1' id='type-id-20'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-877' visibility='default' filepath='include/linux/types.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prev' type-id='type-id-877' visibility='default' filepath='include/linux/types.h' line='187' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_prog_ops' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='232' column='1' id='type-id-1237'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='test_run' type-id='type-id-1238' visibility='default' filepath='include/linux/bpf.h' line='233' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='bpf_attr' size-in-bits='576' visibility='default' filepath='include/uapi/linux/bpf.h' line='287' column='1' id='type-id-1239'>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='307' column='1' id='type-id-1240'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='map_fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='308' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='key' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='309' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='' type-id='type-id-1241' visibility='default' filepath='include/uapi/linux/bpf.h' line='310' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='flags' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='314' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__1' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='317' column='1' id='type-id-1242'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='prog_type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='318' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='32'>
+              <var-decl name='insn_cnt' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='319' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='insns' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='320' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='license' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='321' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='log_level' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='322' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='224'>
+              <var-decl name='log_size' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='323' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='256'>
+              <var-decl name='log_buf' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='324' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='320'>
+              <var-decl name='kern_version' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='325' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='352'>
+              <var-decl name='prog_flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='326' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='384'>
+              <var-decl name='prog_name' type-id='type-id-43' visibility='default' filepath='include/uapi/linux/bpf.h' line='327' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='512'>
+              <var-decl name='prog_ifindex' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='328' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='544'>
+              <var-decl name='expected_attach_type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='333' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='336' column='1' id='type-id-1243'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='pathname' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='337' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='bpf_fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='338' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='96'>
+              <var-decl name='file_flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='339' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__3' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='342' column='1' id='type-id-1244'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='target_fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='343' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='32'>
+              <var-decl name='attach_bpf_fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='344' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='attach_type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='345' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='96'>
+              <var-decl name='attach_flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='346' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__4' size-in-bits='96' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='360' column='1' id='type-id-1245'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='' type-id='type-id-1246' visibility='default' filepath='include/uapi/linux/bpf.h' line='361' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='32'>
+              <var-decl name='next_id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='367' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='open_flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='368' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__5' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='391' column='1' id='type-id-1247'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='btf' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='392' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='btf_log_buf' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='393' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='btf_size' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='394' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='160'>
+              <var-decl name='btf_log_size' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='395' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='btf_log_level' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='396' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-1248' visibility='default' filepath='include/uapi/linux/bpf.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='test' type-id='type-id-1249' visibility='default' filepath='include/uapi/linux/bpf.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='info' type-id='type-id-1250' visibility='default' filepath='include/uapi/linux/bpf.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='query' type-id='type-id-1251' visibility='default' filepath='include/uapi/linux/bpf.h' line='384' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='raw_tracepoint' type-id='type-id-1252' visibility='default' filepath='include/uapi/linux/bpf.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='task_fd_query' type-id='type-id-1253' visibility='default' filepath='include/uapi/linux/bpf.h' line='413' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__1' size-in-bits='480' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='288' column='1' id='type-id-1248'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='map_type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='289' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='key_size' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='value_size' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='max_entries' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='map_flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='inner_map_fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='numa_node' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='map_name' type-id='type-id-43' visibility='default' filepath='include/uapi/linux/bpf.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='map_ifindex' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='btf_fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='btf_key_type_id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='btf_value_type_id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='304' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='310' column='1' id='type-id-1241'>
+        <data-member access='private'>
+          <var-decl name='value' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='next_key' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='312' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__2' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='349' column='1' id='type-id-1249'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prog_fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='retval' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='data_size_in' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='data_size_out' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='data_in' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='data_out' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='repeat' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='duration' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='357' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='361' column='1' id='type-id-1246'>
+        <data-member access='private'>
+          <var-decl name='start_id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='prog_id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='map_id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='364' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='btf_id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='365' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__3' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='371' column='1' id='type-id-1250'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bpf_fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='372' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='info_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='info' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='374' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__4' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='377' column='1' id='type-id-1251'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='target_fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='378' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='attach_type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='query_flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='attach_flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='prog_ids' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='prog_cnt' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='383' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__5' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='386' column='1' id='type-id-1252'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prog_fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='388' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__6' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='399' column='1' id='type-id-1253'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pid' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='400' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='fd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='buf_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='buf' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='prog_id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='409' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='fd_type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='probe_offset' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='probe_addr' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='412' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_map' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='57' column='1' id='type-id-1254'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ops' type-id='type-id-1255' visibility='default' filepath='include/linux/bpf.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='inner_map_meta' type-id='type-id-1230' visibility='default' filepath='include/linux/bpf.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='security' type-id='type-id-15' visibility='default' filepath='include/linux/bpf.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='map_type' type-id='type-id-1256' visibility='default' filepath='include/linux/bpf.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='key_size' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='value_size' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='max_entries' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='map_flags' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='pages' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='id' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='numa_node' type-id='type-id-17' visibility='default' filepath='include/linux/bpf.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='btf_key_type_id' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='btf_value_type_id' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='btf' type-id='type-id-1257' visibility='default' filepath='include/linux/bpf.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='unpriv_array' type-id='type-id-33' visibility='default' filepath='include/linux/bpf.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='user' type-id='type-id-1229' visibility='default' filepath='include/linux/bpf.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='refcnt' type-id='type-id-26' visibility='default' filepath='include/linux/bpf.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='usercnt' type-id='type-id-26' visibility='default' filepath='include/linux/bpf.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='work' type-id='type-id-255' visibility='default' filepath='include/linux/bpf.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='name' type-id='type-id-43' visibility='default' filepath='include/linux/bpf.h' line='87' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_map_ops' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='29' column='1' id='type-id-1258'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='map_alloc_check' type-id='type-id-1259' visibility='default' filepath='include/linux/bpf.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='map_alloc' type-id='type-id-1260' visibility='default' filepath='include/linux/bpf.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='map_release' type-id='type-id-1261' visibility='default' filepath='include/linux/bpf.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='map_free' type-id='type-id-1262' visibility='default' filepath='include/linux/bpf.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='map_get_next_key' type-id='type-id-1263' visibility='default' filepath='include/linux/bpf.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='map_release_uref' type-id='type-id-1262' visibility='default' filepath='include/linux/bpf.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='map_lookup_elem_sys_only' type-id='type-id-1264' visibility='default' filepath='include/linux/bpf.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='map_lookup_elem' type-id='type-id-1264' visibility='default' filepath='include/linux/bpf.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='map_update_elem' type-id='type-id-1265' visibility='default' filepath='include/linux/bpf.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='map_delete_elem' type-id='type-id-1266' visibility='default' filepath='include/linux/bpf.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='map_fd_get_ptr' type-id='type-id-1267' visibility='default' filepath='include/linux/bpf.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='map_fd_put_ptr' type-id='type-id-517' visibility='default' filepath='include/linux/bpf.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='map_gen_lookup' type-id='type-id-1268' visibility='default' filepath='include/linux/bpf.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='map_fd_sys_lookup_elem' type-id='type-id-1269' visibility='default' filepath='include/linux/bpf.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='map_seq_show_elem' type-id='type-id-1270' visibility='default' filepath='include/linux/bpf.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='map_check_btf' type-id='type-id-1271' visibility='default' filepath='include/linux/bpf.h' line='52' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='file' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='897' column='1' id='type-id-1272'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='f_u' type-id='type-id-1273' visibility='default' filepath='include/linux/fs.h' line='901' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='f_path' type-id='type-id-1274' visibility='default' filepath='include/linux/fs.h' line='902' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='f_inode' type-id='type-id-1127' visibility='default' filepath='include/linux/fs.h' line='903' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='f_op' type-id='type-id-268' visibility='default' filepath='include/linux/fs.h' line='904' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='f_lock' type-id='type-id-247' visibility='default' filepath='include/linux/fs.h' line='910' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='f_write_hint' type-id='type-id-1275' visibility='default' filepath='include/linux/fs.h' line='911' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='f_count' type-id='type-id-115' visibility='default' filepath='include/linux/fs.h' line='912' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='f_flags' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='913' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='f_mode' type-id='type-id-876' visibility='default' filepath='include/linux/fs.h' line='914' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='f_pos_lock' type-id='type-id-245' visibility='default' filepath='include/linux/fs.h' line='915' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='f_pos' type-id='type-id-763' visibility='default' filepath='include/linux/fs.h' line='916' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='f_owner' type-id='type-id-1276' visibility='default' filepath='include/linux/fs.h' line='917' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='f_cred' type-id='type-id-1277' visibility='default' filepath='include/linux/fs.h' line='918' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='f_ra' type-id='type-id-1278' visibility='default' filepath='include/linux/fs.h' line='919' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='f_version' type-id='type-id-40' visibility='default' filepath='include/linux/fs.h' line='921' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='f_security' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='923' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='private_data' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='926' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='f_ep_links' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='930' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='f_tfile_llink' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='931' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='f_mapping' type-id='type-id-1279' visibility='default' filepath='include/linux/fs.h' line='933' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='f_wb_err' type-id='type-id-1280' visibility='default' filepath='include/linux/fs.h' line='934' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='llist_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/llist.h' line='70' column='1' id='type-id-281'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-282' visibility='default' filepath='include/linux/llist.h' line='71' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='callback_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/types.h' line='224' column='1' id='type-id-385'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-91' visibility='default' filepath='include/linux/types.h' line='225' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='func' type-id='type-id-89' visibility='default' filepath='include/linux/types.h' line='226' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='key_payload' size-in-bits='256' visibility='default' filepath='include/linux/key.h' line='94' column='1' id='type-id-1281'>
+        <data-member access='private'>
+          <var-decl name='rcu_data0' type-id='type-id-15' visibility='default' filepath='include/linux/key.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='data' type-id='type-id-1209' visibility='default' filepath='include/linux/key.h' line='96' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='path' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/path.h' line='8' column='1' id='type-id-1274'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mnt' type-id='type-id-1282' visibility='default' filepath='include/linux/path.h' line='9' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dentry' type-id='type-id-23' visibility='default' filepath='include/linux/path.h' line='10' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dentry' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/linux/dcache.h' line='88' column='1' id='type-id-1283'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='d_flags' type-id='type-id-5' visibility='default' filepath='include/linux/dcache.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='d_seq' type-id='type-id-387' visibility='default' filepath='include/linux/dcache.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='d_hash' type-id='type-id-1284' visibility='default' filepath='include/linux/dcache.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='d_parent' type-id='type-id-23' visibility='default' filepath='include/linux/dcache.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='d_name' type-id='type-id-1285' visibility='default' filepath='include/linux/dcache.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='d_inode' type-id='type-id-1127' visibility='default' filepath='include/linux/dcache.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='d_iname' type-id='type-id-35' visibility='default' filepath='include/linux/dcache.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='d_lockref' type-id='type-id-1286' visibility='default' filepath='include/linux/dcache.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='d_op' type-id='type-id-1287' visibility='default' filepath='include/linux/dcache.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='d_sb' type-id='type-id-28' visibility='default' filepath='include/linux/dcache.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='d_time' type-id='type-id-16' visibility='default' filepath='include/linux/dcache.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='d_fsdata' type-id='type-id-15' visibility='default' filepath='include/linux/dcache.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='' type-id='type-id-1288' visibility='default' filepath='include/linux/dcache.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='d_child' type-id='type-id-20' visibility='default' filepath='include/linux/dcache.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='d_subdirs' type-id='type-id-20' visibility='default' filepath='include/linux/dcache.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='d_u' type-id='type-id-1289' visibility='default' filepath='include/linux/dcache.h' line='119' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='seqcount_t' type-id='type-id-1290' filepath='include/linux/seqlock.h' line='53' column='1' id='type-id-387'/>
+      <class-decl name='seqcount' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/seqlock.h' line='48' column='1' id='type-id-1290'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sequence' type-id='type-id-5' visibility='default' filepath='include/linux/seqlock.h' line='49' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hlist_bl_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/list_bl.h' line='38' column='1' id='type-id-1284'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-1291' visibility='default' filepath='include/linux/list_bl.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pprev' type-id='type-id-1292' visibility='default' filepath='include/linux/list_bl.h' line='39' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='qstr' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/dcache.h' line='47' column='1' id='type-id-1285'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-1293' visibility='default' filepath='include/linux/dcache.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-878' visibility='default' filepath='include/linux/dcache.h' line='54' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='48' column='1' id='type-id-1293'>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-1294' visibility='default' filepath='include/linux/dcache.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='hash_len' type-id='type-id-40' visibility='default' filepath='include/linux/dcache.h' line='52' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__7' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='49' column='1' id='type-id-1294'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hash' type-id='type-id-7' visibility='default' filepath='include/linux/dcache.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='len' type-id='type-id-7' visibility='default' filepath='include/linux/dcache.h' line='50' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='inode' size-in-bits='4800' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='595' column='1' id='type-id-1295'>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/fs.h' line='663' column='1' id='type-id-1296'>
+              <data-member access='private'>
+                <var-decl name='i_dentry' type-id='type-id-186' visibility='default' filepath='include/linux/fs.h' line='664' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='i_rcu' type-id='type-id-385' visibility='default' filepath='include/linux/fs.h' line='665' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/fs.h' line='678' column='1' id='type-id-1297'>
+              <data-member access='private'>
+                <var-decl name='i_pipe' type-id='type-id-87' visibility='default' filepath='include/linux/fs.h' line='679' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='i_bdev' type-id='type-id-875' visibility='default' filepath='include/linux/fs.h' line='680' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='i_cdev' type-id='type-id-1298' visibility='default' filepath='include/linux/fs.h' line='681' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='i_link' type-id='type-id-2' visibility='default' filepath='include/linux/fs.h' line='682' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='i_dir_seq' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='683' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='i_mode' type-id='type-id-329' visibility='default' filepath='include/linux/fs.h' line='596' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='i_opflags' type-id='type-id-312' visibility='default' filepath='include/linux/fs.h' line='597' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='i_uid' type-id='type-id-42' visibility='default' filepath='include/linux/fs.h' line='598' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='i_gid' type-id='type-id-330' visibility='default' filepath='include/linux/fs.h' line='599' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='i_flags' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='600' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='i_acl' type-id='type-id-1299' visibility='default' filepath='include/linux/fs.h' line='603' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='i_default_acl' type-id='type-id-1299' visibility='default' filepath='include/linux/fs.h' line='604' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='i_op' type-id='type-id-1300' visibility='default' filepath='include/linux/fs.h' line='607' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='i_sb' type-id='type-id-28' visibility='default' filepath='include/linux/fs.h' line='608' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='i_mapping' type-id='type-id-1279' visibility='default' filepath='include/linux/fs.h' line='609' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='i_security' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='612' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='i_ino' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='616' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='' type-id='type-id-1301' visibility='default' filepath='include/linux/fs.h' line='624' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='i_rdev' type-id='type-id-269' visibility='default' filepath='include/linux/fs.h' line='628' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='i_size' type-id='type-id-763' visibility='default' filepath='include/linux/fs.h' line='629' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='i_atime' type-id='type-id-355' visibility='default' filepath='include/linux/fs.h' line='630' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='i_mtime' type-id='type-id-355' visibility='default' filepath='include/linux/fs.h' line='631' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='i_ctime' type-id='type-id-355' visibility='default' filepath='include/linux/fs.h' line='632' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='i_lock' type-id='type-id-247' visibility='default' filepath='include/linux/fs.h' line='633' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='i_bytes' type-id='type-id-312' visibility='default' filepath='include/linux/fs.h' line='634' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1136'>
+          <var-decl name='i_blkbits' type-id='type-id-214' visibility='default' filepath='include/linux/fs.h' line='635' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1144'>
+          <var-decl name='i_write_hint' type-id='type-id-214' visibility='default' filepath='include/linux/fs.h' line='636' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='i_blocks' type-id='type-id-1302' visibility='default' filepath='include/linux/fs.h' line='637' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='i_state' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='644' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='i_rwsem' type-id='type-id-246' visibility='default' filepath='include/linux/fs.h' line='645' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='dirtied_when' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='647' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='dirtied_time_when' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='648' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='i_hash' type-id='type-id-520' visibility='default' filepath='include/linux/fs.h' line='650' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='i_io_list' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='651' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='i_wb' type-id='type-id-1303' visibility='default' filepath='include/linux/fs.h' line='653' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='i_wb_frn_winner' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='656' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2080'>
+          <var-decl name='i_wb_frn_avg_time' type-id='type-id-688' visibility='default' filepath='include/linux/fs.h' line='657' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2096'>
+          <var-decl name='i_wb_frn_history' type-id='type-id-688' visibility='default' filepath='include/linux/fs.h' line='658' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='i_lru' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='660' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='i_sb_list' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='661' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='i_wb_list' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='662' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='i_version' type-id='type-id-113' visibility='default' filepath='include/linux/fs.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='i_count' type-id='type-id-26' visibility='default' filepath='include/linux/fs.h' line='668' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2720'>
+          <var-decl name='i_dio_count' type-id='type-id-26' visibility='default' filepath='include/linux/fs.h' line='669' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='i_writecount' type-id='type-id-26' visibility='default' filepath='include/linux/fs.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='i_fop' type-id='type-id-268' visibility='default' filepath='include/linux/fs.h' line='674' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='i_flctx' type-id='type-id-1304' visibility='default' filepath='include/linux/fs.h' line='675' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='i_data' type-id='type-id-1305' visibility='default' filepath='include/linux/fs.h' line='676' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='i_devices' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='677' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='i_generation' type-id='type-id-511' visibility='default' filepath='include/linux/fs.h' line='686' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4512'>
+          <var-decl name='i_fsnotify_mask' type-id='type-id-511' visibility='default' filepath='include/linux/fs.h' line='689' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='i_fsnotify_marks' type-id='type-id-1306' visibility='default' filepath='include/linux/fs.h' line='690' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='i_crypt_info' type-id='type-id-1307' visibility='default' filepath='include/linux/fs.h' line='694' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='i_verity_info' type-id='type-id-1308' visibility='default' filepath='include/linux/fs.h' line='698' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='i_private' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='701' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='umode_t' type-id='type-id-312' filepath='include/linux/types.h' line='19' column='1' id='type-id-329'/>
+      <typedef-decl name='kuid_t' type-id='type-id-1309' filepath='include/linux/uidgid.h' line='23' column='1' id='type-id-42'/>
+      <class-decl name='__anonymous_struct__8' size-in-bits='32' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-42' visibility='default' filepath='include/linux/uidgid.h' line='21' column='1' id='type-id-1309'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='val' type-id='type-id-350' visibility='default' filepath='include/linux/uidgid.h' line='22' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='uid_t' type-id='type-id-1310' filepath='include/linux/types.h' line='32' column='1' id='type-id-350'/>
+      <typedef-decl name='__kernel_uid32_t' type-id='type-id-5' filepath='include/uapi/asm-generic/posix_types.h' line='49' column='1' id='type-id-1310'/>
+      <typedef-decl name='kgid_t' type-id='type-id-1311' filepath='include/linux/uidgid.h' line='28' column='1' id='type-id-330'/>
+      <class-decl name='__anonymous_struct__9' size-in-bits='32' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-330' visibility='default' filepath='include/linux/uidgid.h' line='26' column='1' id='type-id-1311'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='val' type-id='type-id-351' visibility='default' filepath='include/linux/uidgid.h' line='27' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='gid_t' type-id='type-id-1312' filepath='include/linux/types.h' line='33' column='1' id='type-id-351'/>
+      <typedef-decl name='__kernel_gid32_t' type-id='type-id-5' filepath='include/uapi/asm-generic/posix_types.h' line='50' column='1' id='type-id-1312'/>
+      <class-decl name='inode_operations' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1802' column='1' id='type-id-1313'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lookup' type-id='type-id-1314' visibility='default' filepath='include/linux/fs.h' line='1803' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='get_link' type-id='type-id-1315' visibility='default' filepath='include/linux/fs.h' line='1804' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='permission' type-id='type-id-1316' visibility='default' filepath='include/linux/fs.h' line='1805' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='permission2' type-id='type-id-1317' visibility='default' filepath='include/linux/fs.h' line='1806' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='get_acl' type-id='type-id-1318' visibility='default' filepath='include/linux/fs.h' line='1807' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='readlink' type-id='type-id-1319' visibility='default' filepath='include/linux/fs.h' line='1809' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='create' type-id='type-id-1320' visibility='default' filepath='include/linux/fs.h' line='1811' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='link' type-id='type-id-1321' visibility='default' filepath='include/linux/fs.h' line='1812' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='unlink' type-id='type-id-1322' visibility='default' filepath='include/linux/fs.h' line='1813' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='symlink' type-id='type-id-1323' visibility='default' filepath='include/linux/fs.h' line='1814' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='mkdir' type-id='type-id-1324' visibility='default' filepath='include/linux/fs.h' line='1815' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='rmdir' type-id='type-id-1322' visibility='default' filepath='include/linux/fs.h' line='1816' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mknod' type-id='type-id-1325' visibility='default' filepath='include/linux/fs.h' line='1817' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='rename' type-id='type-id-1326' visibility='default' filepath='include/linux/fs.h' line='1818' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='setattr' type-id='type-id-1327' visibility='default' filepath='include/linux/fs.h' line='1820' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='setattr2' type-id='type-id-1328' visibility='default' filepath='include/linux/fs.h' line='1821' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='getattr' type-id='type-id-1329' visibility='default' filepath='include/linux/fs.h' line='1822' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='listxattr' type-id='type-id-1330' visibility='default' filepath='include/linux/fs.h' line='1823' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='fiemap' type-id='type-id-1331' visibility='default' filepath='include/linux/fs.h' line='1824' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='update_time' type-id='type-id-1332' visibility='default' filepath='include/linux/fs.h' line='1826' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='atomic_open' type-id='type-id-1333' visibility='default' filepath='include/linux/fs.h' line='1827' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='tmpfile' type-id='type-id-1324' visibility='default' filepath='include/linux/fs.h' line='1830' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='set_acl' type-id='type-id-1334' visibility='default' filepath='include/linux/fs.h' line='1831' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='delayed_call' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/delayed_call.h' line='10' column='1' id='type-id-1335'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fn' type-id='type-id-517' visibility='default' filepath='include/linux/delayed_call.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='arg' type-id='type-id-15' visibility='default' filepath='include/linux/delayed_call.h' line='12' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='dev_t' type-id='type-id-1336' filepath='include/linux/types.h' line='16' column='1' id='type-id-269'/>
+      <typedef-decl name='__kernel_dev_t' type-id='type-id-7' filepath='include/linux/types.h' line='13' column='1' id='type-id-1336'/>
+      <class-decl name='iattr' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='216' column='1' id='type-id-1337'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ia_valid' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ia_mode' type-id='type-id-329' visibility='default' filepath='include/linux/fs.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ia_uid' type-id='type-id-42' visibility='default' filepath='include/linux/fs.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='ia_gid' type-id='type-id-330' visibility='default' filepath='include/linux/fs.h' line='220' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ia_size' type-id='type-id-763' visibility='default' filepath='include/linux/fs.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ia_atime' type-id='type-id-355' visibility='default' filepath='include/linux/fs.h' line='222' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ia_mtime' type-id='type-id-355' visibility='default' filepath='include/linux/fs.h' line='223' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ia_ctime' type-id='type-id-355' visibility='default' filepath='include/linux/fs.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='ia_file' type-id='type-id-83' visibility='default' filepath='include/linux/fs.h' line='231' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='loff_t' type-id='type-id-1338' filepath='include/linux/types.h' line='46' column='1' id='type-id-763'/>
+      <typedef-decl name='__kernel_loff_t' type-id='type-id-1146' filepath='include/uapi/asm-generic/posix_types.h' line='88' column='1' id='type-id-1338'/>
+      <class-decl name='timespec64' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/time64.h' line='20' column='1' id='type-id-355'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tv_sec' type-id='type-id-1339' visibility='default' filepath='include/linux/time64.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tv_nsec' type-id='type-id-192' visibility='default' filepath='include/linux/time64.h' line='22' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='time64_t' type-id='type-id-898' filepath='include/linux/time64.h' line='7' column='1' id='type-id-1339'/>
+      <typedef-decl name='__s64' type-id='type-id-1146' filepath='include/uapi/asm-generic/int-ll64.h' line='30' column='1' id='type-id-898'/>
+      <class-decl name='kstat' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/linux/stat.h' line='24' column='1' id='type-id-1340'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='result_mask' type-id='type-id-7' visibility='default' filepath='include/linux/stat.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='mode' type-id='type-id-329' visibility='default' filepath='include/linux/stat.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nlink' type-id='type-id-5' visibility='default' filepath='include/linux/stat.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='blksize' type-id='type-id-1341' visibility='default' filepath='include/linux/stat.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='attributes' type-id='type-id-40' visibility='default' filepath='include/linux/stat.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='attributes_mask' type-id='type-id-40' visibility='default' filepath='include/linux/stat.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ino' type-id='type-id-40' visibility='default' filepath='include/linux/stat.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dev' type-id='type-id-269' visibility='default' filepath='include/linux/stat.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='rdev' type-id='type-id-269' visibility='default' filepath='include/linux/stat.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='uid' type-id='type-id-42' visibility='default' filepath='include/linux/stat.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='gid' type-id='type-id-330' visibility='default' filepath='include/linux/stat.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='size' type-id='type-id-763' visibility='default' filepath='include/linux/stat.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='atime' type-id='type-id-355' visibility='default' filepath='include/linux/stat.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='mtime' type-id='type-id-355' visibility='default' filepath='include/linux/stat.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='ctime' type-id='type-id-355' visibility='default' filepath='include/linux/stat.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='btime' type-id='type-id-355' visibility='default' filepath='include/linux/stat.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='blocks' type-id='type-id-40' visibility='default' filepath='include/linux/stat.h' line='48' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='uint32_t' type-id='type-id-7' filepath='include/linux/types.h' line='109' column='1' id='type-id-1341'/>
+      <typedef-decl name='ssize_t' type-id='type-id-1342' filepath='include/linux/types.h' line='60' column='1' id='type-id-86'/>
+      <typedef-decl name='__kernel_ssize_t' type-id='type-id-105' filepath='include/uapi/asm-generic/posix_types.h' line='73' column='1' id='type-id-1342'/>
+      <typedef-decl name='__kernel_long_t' type-id='type-id-192' filepath='include/uapi/asm-generic/posix_types.h' line='15' column='1' id='type-id-105'/>
+      <class-decl name='fiemap_extent_info' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1688' column='1' id='type-id-1343'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fi_flags' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='1689' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='fi_extents_mapped' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='1690' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fi_extents_max' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='1691' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fi_extents_start' type-id='type-id-1344' visibility='default' filepath='include/linux/fs.h' line='1692' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fiemap_extent' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/uapi/linux/fiemap.h' line='17' column='1' id='type-id-1345'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fe_logical' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/fiemap.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fe_physical' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/fiemap.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fe_length' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/fiemap.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='fe_reserved64' type-id='type-id-935' visibility='default' filepath='include/uapi/linux/fiemap.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='fe_flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fiemap.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='fe_reserved' type-id='type-id-931' visibility='default' filepath='include/uapi/linux/fiemap.h' line='25' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='super_block' size-in-bits='12288' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1375' column='1' id='type-id-1346'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='s_list' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='1376' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='s_dev' type-id='type-id-269' visibility='default' filepath='include/linux/fs.h' line='1377' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='s_blocksize_bits' type-id='type-id-216' visibility='default' filepath='include/linux/fs.h' line='1378' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='s_blocksize' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='1379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='s_maxbytes' type-id='type-id-763' visibility='default' filepath='include/linux/fs.h' line='1380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='s_type' type-id='type-id-1347' visibility='default' filepath='include/linux/fs.h' line='1381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='s_op' type-id='type-id-1348' visibility='default' filepath='include/linux/fs.h' line='1382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='dq_op' type-id='type-id-1349' visibility='default' filepath='include/linux/fs.h' line='1383' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='s_qcop' type-id='type-id-1350' visibility='default' filepath='include/linux/fs.h' line='1384' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='s_export_op' type-id='type-id-1351' visibility='default' filepath='include/linux/fs.h' line='1385' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='s_flags' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='1386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='s_iflags' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='1387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='s_magic' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='1388' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='s_root' type-id='type-id-23' visibility='default' filepath='include/linux/fs.h' line='1389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='s_umount' type-id='type-id-246' visibility='default' filepath='include/linux/fs.h' line='1390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='s_count' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='1391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1248'>
+          <var-decl name='s_active' type-id='type-id-26' visibility='default' filepath='include/linux/fs.h' line='1392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='s_security' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='1394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='s_xattr' type-id='type-id-1352' visibility='default' filepath='include/linux/fs.h' line='1396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='s_cop' type-id='type-id-1353' visibility='default' filepath='include/linux/fs.h' line='1398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='s_master_keys' type-id='type-id-1354' visibility='default' filepath='include/linux/fs.h' line='1399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='s_vop' type-id='type-id-1355' visibility='default' filepath='include/linux/fs.h' line='1402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='s_roots' type-id='type-id-1356' visibility='default' filepath='include/linux/fs.h' line='1404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='s_mounts' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='1405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='s_bdev' type-id='type-id-875' visibility='default' filepath='include/linux/fs.h' line='1406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='s_bdi' type-id='type-id-1357' visibility='default' filepath='include/linux/fs.h' line='1407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='s_mtd' type-id='type-id-1358' visibility='default' filepath='include/linux/fs.h' line='1408' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='s_instances' type-id='type-id-520' visibility='default' filepath='include/linux/fs.h' line='1409' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='s_quota_types' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='1410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='s_dquot' type-id='type-id-1359' visibility='default' filepath='include/linux/fs.h' line='1411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='s_writers' type-id='type-id-1360' visibility='default' filepath='include/linux/fs.h' line='1413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8000'>
+          <var-decl name='s_id' type-id='type-id-373' visibility='default' filepath='include/linux/fs.h' line='1415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8256'>
+          <var-decl name='s_uuid' type-id='type-id-1361' visibility='default' filepath='include/linux/fs.h' line='1416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8384'>
+          <var-decl name='s_fs_info' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='1418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8448'>
+          <var-decl name='s_max_links' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='1419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8480'>
+          <var-decl name='s_mode' type-id='type-id-876' visibility='default' filepath='include/linux/fs.h' line='1420' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8512'>
+          <var-decl name='s_time_gran' type-id='type-id-7' visibility='default' filepath='include/linux/fs.h' line='1424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8576'>
+          <var-decl name='s_vfs_rename_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/fs.h' line='1430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8832'>
+          <var-decl name='s_subtype' type-id='type-id-2' visibility='default' filepath='include/linux/fs.h' line='1436' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8896'>
+          <var-decl name='s_d_op' type-id='type-id-1287' visibility='default' filepath='include/linux/fs.h' line='1438' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8960'>
+          <var-decl name='cleancache_poolid' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='1443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9024'>
+          <var-decl name='s_shrink' type-id='type-id-1362' visibility='default' filepath='include/linux/fs.h' line='1445' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9536'>
+          <var-decl name='s_remove_count' type-id='type-id-115' visibility='default' filepath='include/linux/fs.h' line='1448' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9600'>
+          <var-decl name='s_fsnotify_inode_refs' type-id='type-id-115' visibility='default' filepath='include/linux/fs.h' line='1451' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9664'>
+          <var-decl name='s_readonly_remount' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='1454' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9728'>
+          <var-decl name='s_dio_done_wq' type-id='type-id-654' visibility='default' filepath='include/linux/fs.h' line='1457' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9792'>
+          <var-decl name='s_pins' type-id='type-id-186' visibility='default' filepath='include/linux/fs.h' line='1458' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9856'>
+          <var-decl name='s_user_ns' type-id='type-id-915' visibility='default' filepath='include/linux/fs.h' line='1465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10240'>
+          <var-decl name='s_dentry_lru' type-id='type-id-1363' visibility='default' filepath='include/linux/fs.h' line='1471' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10752'>
+          <var-decl name='s_inode_lru' type-id='type-id-1363' visibility='default' filepath='include/linux/fs.h' line='1472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11008'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/fs.h' line='1473' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11136'>
+          <var-decl name='destroy_work' type-id='type-id-255' visibility='default' filepath='include/linux/fs.h' line='1474' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11392'>
+          <var-decl name='s_sync_lock' type-id='type-id-245' visibility='default' filepath='include/linux/fs.h' line='1476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11648'>
+          <var-decl name='s_stack_depth' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='1481' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11776'>
+          <var-decl name='s_inode_list_lock' type-id='type-id-247' visibility='default' filepath='include/linux/fs.h' line='1484' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11840'>
+          <var-decl name='s_inodes' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='1485' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11968'>
+          <var-decl name='s_inode_wblist_lock' type-id='type-id-247' visibility='default' filepath='include/linux/fs.h' line='1487' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12032'>
+          <var-decl name='s_inodes_wb' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='1488' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='file_system_type' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='2156' column='1' id='type-id-1364'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/fs.h' line='2157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fs_flags' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='2158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mount' type-id='type-id-1365' visibility='default' filepath='include/linux/fs.h' line='2164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mount2' type-id='type-id-1366' visibility='default' filepath='include/linux/fs.h' line='2166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='alloc_mnt_data' type-id='type-id-1367' visibility='default' filepath='include/linux/fs.h' line='2168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='kill_sb' type-id='type-id-1368' visibility='default' filepath='include/linux/fs.h' line='2169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/fs.h' line='2170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='next' type-id='type-id-1347' visibility='default' filepath='include/linux/fs.h' line='2171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='fs_supers' type-id='type-id-186' visibility='default' filepath='include/linux/fs.h' line='2172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='s_lock_key' type-id='type-id-1144' visibility='default' filepath='include/linux/fs.h' line='2174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='s_umount_key' type-id='type-id-1144' visibility='default' filepath='include/linux/fs.h' line='2175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='s_vfs_rename_key' type-id='type-id-1144' visibility='default' filepath='include/linux/fs.h' line='2176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='s_writers_key' type-id='type-id-1145' visibility='default' filepath='include/linux/fs.h' line='2177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='i_lock_key' type-id='type-id-1144' visibility='default' filepath='include/linux/fs.h' line='2179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='i_mutex_key' type-id='type-id-1144' visibility='default' filepath='include/linux/fs.h' line='2180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='i_mutex_dir_key' type-id='type-id-1144' visibility='default' filepath='include/linux/fs.h' line='2181' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='module' size-in-bits='6656' is-struct='yes' visibility='default' filepath='include/linux/module.h' line='331' column='1' id='type-id-1369'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='state' type-id='type-id-1370' visibility='default' filepath='include/linux/module.h' line='332' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/module.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='name' type-id='type-id-972' visibility='default' filepath='include/linux/module.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='mkobj' type-id='type-id-1371' visibility='default' filepath='include/linux/module.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='modinfo_attrs' type-id='type-id-1372' visibility='default' filepath='include/linux/module.h' line='342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='version' type-id='type-id-4' visibility='default' filepath='include/linux/module.h' line='343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='srcversion' type-id='type-id-4' visibility='default' filepath='include/linux/module.h' line='344' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='holders_dir' type-id='type-id-379' visibility='default' filepath='include/linux/module.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='syms' type-id='type-id-1373' visibility='default' filepath='include/linux/module.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='crcs' type-id='type-id-1374' visibility='default' filepath='include/linux/module.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='num_syms' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='cfi_check' type-id='type-id-1375' visibility='default' filepath='include/linux/module.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='param_lock' type-id='type-id-245' visibility='default' filepath='include/linux/module.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='kp' type-id='type-id-1376' visibility='default' filepath='include/linux/module.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='num_kp' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2272'>
+          <var-decl name='num_gpl_syms' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='gpl_syms' type-id='type-id-1373' visibility='default' filepath='include/linux/module.h' line='365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='gpl_crcs' type-id='type-id-1374' visibility='default' filepath='include/linux/module.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='sig_ok' type-id='type-id-33' visibility='default' filepath='include/linux/module.h' line='385' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2440'>
+          <var-decl name='async_probe_requested' type-id='type-id-33' visibility='default' filepath='include/linux/module.h' line='387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='gpl_future_syms' type-id='type-id-1373' visibility='default' filepath='include/linux/module.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='gpl_future_crcs' type-id='type-id-1374' visibility='default' filepath='include/linux/module.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='num_gpl_future_syms' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2656'>
+          <var-decl name='num_exentries' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='395' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='extable' type-id='type-id-1377' visibility='default' filepath='include/linux/module.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='init' type-id='type-id-1378' visibility='default' filepath='include/linux/module.h' line='399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='core_layout' type-id='type-id-1379' visibility='default' filepath='include/linux/module.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='init_layout' type-id='type-id-1379' visibility='default' filepath='include/linux/module.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='arch' type-id='type-id-1380' visibility='default' filepath='include/linux/module.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='taints' type-id='type-id-16' visibility='default' filepath='include/linux/module.h' line='408' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='num_bugs' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='412' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='bug_list' type-id='type-id-20' visibility='default' filepath='include/linux/module.h' line='413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='bug_table' type-id='type-id-1381' visibility='default' filepath='include/linux/module.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='kallsyms' type-id='type-id-1382' visibility='default' filepath='include/linux/module.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='core_kallsyms' type-id='type-id-1383' visibility='default' filepath='include/linux/module.h' line='420' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5248'>
+          <var-decl name='sect_attrs' type-id='type-id-1384' visibility='default' filepath='include/linux/module.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='notes_attrs' type-id='type-id-1385' visibility='default' filepath='include/linux/module.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='args' type-id='type-id-2' visibility='default' filepath='include/linux/module.h' line='431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='percpu' type-id='type-id-15' visibility='default' filepath='include/linux/module.h' line='435' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='percpu_size' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='436' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5536'>
+          <var-decl name='num_tracepoints' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='440' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='tracepoints_ptrs' type-id='type-id-1386' visibility='default' filepath='include/linux/module.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5632'>
+          <var-decl name='num_trace_bprintk_fmt' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='448' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5696'>
+          <var-decl name='trace_bprintk_fmt_start' type-id='type-id-1387' visibility='default' filepath='include/linux/module.h' line='449' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='trace_events' type-id='type-id-1388' visibility='default' filepath='include/linux/module.h' line='452' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='num_trace_events' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='453' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='trace_evals' type-id='type-id-1389' visibility='default' filepath='include/linux/module.h' line='454' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5952'>
+          <var-decl name='num_trace_evals' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='455' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='source_list' type-id='type-id-20' visibility='default' filepath='include/linux/module.h' line='472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='target_list' type-id='type-id-20' visibility='default' filepath='include/linux/module.h' line='474' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='exit' type-id='type-id-1390' visibility='default' filepath='include/linux/module.h' line='477' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='refcnt' type-id='type-id-26' visibility='default' filepath='include/linux/module.h' line='479' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='module_state' filepath='include/linux/module.h' line='280' column='1' id='type-id-1370'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='MODULE_STATE_LIVE' value='0'/>
+        <enumerator name='MODULE_STATE_COMING' value='1'/>
+        <enumerator name='MODULE_STATE_GOING' value='2'/>
+        <enumerator name='MODULE_STATE_UNFORMED' value='3'/>
+      </enum-decl>
+      <class-decl name='module_kobject' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/module.h' line='45' column='1' id='type-id-1371'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/module.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='mod' type-id='type-id-260' visibility='default' filepath='include/linux/module.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='drivers_dir' type-id='type-id-379' visibility='default' filepath='include/linux/module.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='mp' type-id='type-id-1391' visibility='default' filepath='include/linux/module.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='kobj_completion' type-id='type-id-1392' visibility='default' filepath='include/linux/module.h' line='50' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kobject' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/kobject.h' line='65' column='1' id='type-id-267'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/kobject.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='entry' type-id='type-id-20' visibility='default' filepath='include/linux/kobject.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='parent' type-id='type-id-379' visibility='default' filepath='include/linux/kobject.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='kset' type-id='type-id-1393' visibility='default' filepath='include/linux/kobject.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ktype' type-id='type-id-1394' visibility='default' filepath='include/linux/kobject.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='sd' type-id='type-id-1395' visibility='default' filepath='include/linux/kobject.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='kref' type-id='type-id-239' visibility='default' filepath='include/linux/kobject.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='state_initialized' type-id='type-id-5' visibility='default' filepath='include/linux/kobject.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='state_in_sysfs' type-id='type-id-5' visibility='default' filepath='include/linux/kobject.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='state_add_uevent_sent' type-id='type-id-5' visibility='default' filepath='include/linux/kobject.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='state_remove_uevent_sent' type-id='type-id-5' visibility='default' filepath='include/linux/kobject.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='uevent_suppress' type-id='type-id-5' visibility='default' filepath='include/linux/kobject.h' line='80' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kset' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/kobject.h' line='192' column='1' id='type-id-1396'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/kobject.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='list_lock' type-id='type-id-247' visibility='default' filepath='include/linux/kobject.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/kobject.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='uevent_ops' type-id='type-id-1397' visibility='default' filepath='include/linux/kobject.h' line='196' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='spinlock_t' type-id='type-id-436' filepath='include/linux/spinlock_types.h' line='73' column='1' id='type-id-247'/>
+      <class-decl name='spinlock' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/spinlock_types.h' line='61' column='1' id='type-id-436'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-1398' visibility='default' filepath='include/linux/spinlock_types.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__4' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/linux/spinlock_types.h' line='62' column='1' id='type-id-1398'>
+        <data-member access='private'>
+          <var-decl name='rlock' type-id='type-id-1399' visibility='default' filepath='include/linux/spinlock_types.h' line='63' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='raw_spinlock' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/spinlock_types.h' line='20' column='1' id='type-id-1399'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='raw_lock' type-id='type-id-32' visibility='default' filepath='include/linux/spinlock_types.h' line='21' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='arch_spinlock_t' type-id='type-id-1400' filepath='include/asm-generic/qspinlock_types.h' line='61' column='1' id='type-id-32'/>
+      <class-decl name='qspinlock' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='31' column='1' id='type-id-1400'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-1401' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='32' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__5' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='32' column='1' id='type-id-1401'>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='45' column='1' id='type-id-1402'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='locked_pending' type-id='type-id-688' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='46' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='16'>
+              <var-decl name='tail' type-id='type-id-688' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='47' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='private'>
+          <var-decl name='val' type-id='type-id-26' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-1403' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='41' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__10' size-in-bits='16' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='41' column='1' id='type-id-1403'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='locked' type-id='type-id-214' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='pending' type-id='type-id-214' visibility='default' filepath='include/asm-generic/qspinlock_types.h' line='43' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kset_uevent_ops' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/kobject.h' line='156' column='1' id='type-id-1404'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='filter' type-id='type-id-1405' visibility='default' filepath='include/linux/kobject.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-1406' visibility='default' filepath='include/linux/kobject.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='uevent' type-id='type-id-1407' visibility='default' filepath='include/linux/kobject.h' line='159' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kobj_uevent_env' size-in-bits='18688' is-struct='yes' visibility='default' filepath='include/linux/kobject.h' line='148' column='1' id='type-id-1408'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='argv' type-id='type-id-961' visibility='default' filepath='include/linux/kobject.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='envp' type-id='type-id-960' visibility='default' filepath='include/linux/kobject.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='envp_idx' type-id='type-id-17' visibility='default' filepath='include/linux/kobject.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2272'>
+          <var-decl name='buf' type-id='type-id-967' visibility='default' filepath='include/linux/kobject.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18656'>
+          <var-decl name='buflen' type-id='type-id-17' visibility='default' filepath='include/linux/kobject.h' line='153' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kobj_type' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/kobject.h' line='139' column='1' id='type-id-1409'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='release' type-id='type-id-1410' visibility='default' filepath='include/linux/kobject.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sysfs_ops' type-id='type-id-1411' visibility='default' filepath='include/linux/kobject.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='default_attrs' type-id='type-id-1412' visibility='default' filepath='include/linux/kobject.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='child_ns_type' type-id='type-id-1413' visibility='default' filepath='include/linux/kobject.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='namespace' type-id='type-id-1414' visibility='default' filepath='include/linux/kobject.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='get_ownership' type-id='type-id-1415' visibility='default' filepath='include/linux/kobject.h' line='145' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sysfs_ops' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/sysfs.h' line='214' column='1' id='type-id-1416'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='show' type-id='type-id-1417' visibility='default' filepath='include/linux/sysfs.h' line='215' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='store' type-id='type-id-1418' visibility='default' filepath='include/linux/sysfs.h' line='216' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='attribute' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/sysfs.h' line='30' column='1' id='type-id-619'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/sysfs.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mode' type-id='type-id-329' visibility='default' filepath='include/linux/sysfs.h' line='32' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kobj_ns_type_operations' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/kobject_ns.h' line='39' column='1' id='type-id-1419'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-1420' visibility='default' filepath='include/linux/kobject_ns.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='current_may_mount' type-id='type-id-1421' visibility='default' filepath='include/linux/kobject_ns.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='grab_current_ns' type-id='type-id-1367' visibility='default' filepath='include/linux/kobject_ns.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='netlink_ns' type-id='type-id-1422' visibility='default' filepath='include/linux/kobject_ns.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='initial_ns' type-id='type-id-1367' visibility='default' filepath='include/linux/kobject_ns.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='drop_ns' type-id='type-id-517' visibility='default' filepath='include/linux/kobject_ns.h' line='45' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='kobj_ns_type' filepath='include/linux/kobject_ns.h' line='26' column='1' id='type-id-1420'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='KOBJ_NS_TYPE_NONE' value='0'/>
+        <enumerator name='KOBJ_NS_TYPE_NET' value='1'/>
+        <enumerator name='KOBJ_NS_TYPES' value='2'/>
+      </enum-decl>
+      <class-decl name='kernfs_node' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/kernfs.h' line='130' column='1' id='type-id-1423'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-26' visibility='default' filepath='include/linux/kernfs.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='active' type-id='type-id-26' visibility='default' filepath='include/linux/kernfs.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='parent' type-id='type-id-1395' visibility='default' filepath='include/linux/kernfs.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/kernfs.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rb' type-id='type-id-422' visibility='default' filepath='include/linux/kernfs.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ns' type-id='type-id-15' visibility='default' filepath='include/linux/kernfs.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='hash' type-id='type-id-5' visibility='default' filepath='include/linux/kernfs.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='' type-id='type-id-1424' visibility='default' filepath='include/linux/kernfs.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='priv' type-id='type-id-15' visibility='default' filepath='include/linux/kernfs.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='id' type-id='type-id-1425' visibility='default' filepath='include/linux/kernfs.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='flags' type-id='type-id-312' visibility='default' filepath='include/linux/kernfs.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='912'>
+          <var-decl name='mode' type-id='type-id-329' visibility='default' filepath='include/linux/kernfs.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='iattr' type-id='type-id-1426' visibility='default' filepath='include/linux/kernfs.h' line='160' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__6' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/kernfs.h' line='149' column='1' id='type-id-1424'>
+        <data-member access='private'>
+          <var-decl name='dir' type-id='type-id-1427' visibility='default' filepath='include/linux/kernfs.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='symlink' type-id='type-id-1428' visibility='default' filepath='include/linux/kernfs.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='attr' type-id='type-id-1429' visibility='default' filepath='include/linux/kernfs.h' line='152' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='kernfs_elem_dir' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/kernfs.h' line='83' column='1' id='type-id-1427'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='subdirs' type-id='type-id-16' visibility='default' filepath='include/linux/kernfs.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='children' type-id='type-id-416' visibility='default' filepath='include/linux/kernfs.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='root' type-id='type-id-1430' visibility='default' filepath='include/linux/kernfs.h' line='92' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rb_root' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/rbtree.h' line='43' column='1' id='type-id-416'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rb_node' type-id='type-id-1236' visibility='default' filepath='include/linux/rbtree.h' line='44' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kernfs_root' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/kernfs.h' line='183' column='1' id='type-id-1431'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kn' type-id='type-id-1395' visibility='default' filepath='include/linux/kernfs.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/kernfs.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ino_idr' type-id='type-id-1432' visibility='default' filepath='include/linux/kernfs.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='last_ino' type-id='type-id-7' visibility='default' filepath='include/linux/kernfs.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='next_generation' type-id='type-id-7' visibility='default' filepath='include/linux/kernfs.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='syscall_ops' type-id='type-id-1433' visibility='default' filepath='include/linux/kernfs.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='supers' type-id='type-id-20' visibility='default' filepath='include/linux/kernfs.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='deactivate_waitq' type-id='type-id-225' visibility='default' filepath='include/linux/kernfs.h' line='197' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='idr' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/idr.h' line='19' column='1' id='type-id-1432'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='idr_rt' type-id='type-id-415' visibility='default' filepath='include/linux/idr.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='idr_base' type-id='type-id-5' visibility='default' filepath='include/linux/idr.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='idr_next' type-id='type-id-5' visibility='default' filepath='include/linux/idr.h' line='22' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='radix_tree_root' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/radix-tree.h' line='112' column='1' id='type-id-415'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='xa_lock' type-id='type-id-247' visibility='default' filepath='include/linux/radix-tree.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='gfp_mask' type-id='type-id-485' visibility='default' filepath='include/linux/radix-tree.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rnode' type-id='type-id-1434' visibility='default' filepath='include/linux/radix-tree.h' line='115' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='gfp_t' type-id='type-id-5' filepath='include/linux/types.h' line='158' column='1' id='type-id-485'/>
+      <class-decl name='radix_tree_node' size-in-bits='4608' is-struct='yes' visibility='default' filepath='include/linux/radix-tree.h' line='92' column='1' id='type-id-1435'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='shift' type-id='type-id-216' visibility='default' filepath='include/linux/radix-tree.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='offset' type-id='type-id-216' visibility='default' filepath='include/linux/radix-tree.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='count' type-id='type-id-216' visibility='default' filepath='include/linux/radix-tree.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='exceptional' type-id='type-id-216' visibility='default' filepath='include/linux/radix-tree.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='parent' type-id='type-id-1434' visibility='default' filepath='include/linux/radix-tree.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='root' type-id='type-id-1436' visibility='default' filepath='include/linux/radix-tree.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='' type-id='type-id-1437' visibility='default' filepath='include/linux/radix-tree.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='slots' type-id='type-id-1210' visibility='default' filepath='include/linux/radix-tree.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='tags' type-id='type-id-1199' visibility='default' filepath='include/linux/radix-tree.h' line='104' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__7' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/radix-tree.h' line='99' column='1' id='type-id-1437'>
+        <data-member access='private'>
+          <var-decl name='private_list' type-id='type-id-20' visibility='default' filepath='include/linux/radix-tree.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/radix-tree.h' line='101' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='kernfs_syscall_ops' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/kernfs.h' line='170' column='1' id='type-id-1438'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='remount_fs' type-id='type-id-1439' visibility='default' filepath='include/linux/kernfs.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='show_options' type-id='type-id-1440' visibility='default' filepath='include/linux/kernfs.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mkdir' type-id='type-id-1441' visibility='default' filepath='include/linux/kernfs.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rmdir' type-id='type-id-1442' visibility='default' filepath='include/linux/kernfs.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rename' type-id='type-id-1443' visibility='default' filepath='include/linux/kernfs.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='show_path' type-id='type-id-1444' visibility='default' filepath='include/linux/kernfs.h' line='179' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='seq_file' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/seq_file.h' line='16' column='1' id='type-id-1445'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buf' type-id='type-id-2' visibility='default' filepath='include/linux/seq_file.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='size' type-id='type-id-84' visibility='default' filepath='include/linux/seq_file.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='from' type-id='type-id-84' visibility='default' filepath='include/linux/seq_file.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='count' type-id='type-id-84' visibility='default' filepath='include/linux/seq_file.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='pad_until' type-id='type-id-84' visibility='default' filepath='include/linux/seq_file.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='index' type-id='type-id-763' visibility='default' filepath='include/linux/seq_file.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='read_pos' type-id='type-id-763' visibility='default' filepath='include/linux/seq_file.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='version' type-id='type-id-40' visibility='default' filepath='include/linux/seq_file.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='lock' type-id='type-id-245' visibility='default' filepath='include/linux/seq_file.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='op' type-id='type-id-1446' visibility='default' filepath='include/linux/seq_file.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='poll_event' type-id='type-id-17' visibility='default' filepath='include/linux/seq_file.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='file' type-id='type-id-1447' visibility='default' filepath='include/linux/seq_file.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/seq_file.h' line='29' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mutex' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/mutex.h' line='53' column='1' id='type-id-245'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='owner' type-id='type-id-115' visibility='default' filepath='include/linux/mutex.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wait_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mutex.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='osq' type-id='type-id-1448' visibility='default' filepath='include/linux/mutex.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='wait_list' type-id='type-id-20' visibility='default' filepath='include/linux/mutex.h' line='59' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='atomic_long_t' type-id='type-id-113' filepath='include/asm-generic/atomic-long.h' line='24' column='1' id='type-id-115'/>
+      <typedef-decl name='atomic64_t' type-id='type-id-1449' filepath='include/linux/types.h' line='183' column='1' id='type-id-113'/>
+      <class-decl name='__anonymous_struct__11' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-113' visibility='default' filepath='include/linux/types.h' line='181' column='1' id='type-id-1449'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='counter' type-id='type-id-192' visibility='default' filepath='include/linux/types.h' line='182' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='optimistic_spin_queue' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/osq_lock.h' line='15' column='1' id='type-id-1448'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tail' type-id='type-id-26' visibility='default' filepath='include/linux/osq_lock.h' line='20' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='seq_operations' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/seq_file.h' line='32' column='1' id='type-id-1450'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start' type-id='type-id-1451' visibility='default' filepath='include/linux/seq_file.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='stop' type-id='type-id-1452' visibility='default' filepath='include/linux/seq_file.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='next' type-id='type-id-1453' visibility='default' filepath='include/linux/seq_file.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='show' type-id='type-id-311' visibility='default' filepath='include/linux/seq_file.h' line='36' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='wait_queue_head_t' type-id='type-id-1454' filepath='include/linux/wait.h' line='38' column='1' id='type-id-225'/>
+      <class-decl name='wait_queue_head' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/wait.h' line='34' column='1' id='type-id-1454'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/wait.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/linux/wait.h' line='36' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kernfs_elem_symlink' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/kernfs.h' line='95' column='1' id='type-id-1428'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='target_kn' type-id='type-id-1395' visibility='default' filepath='include/linux/kernfs.h' line='96' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kernfs_elem_attr' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/kernfs.h' line='99' column='1' id='type-id-1429'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ops' type-id='type-id-1455' visibility='default' filepath='include/linux/kernfs.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='open' type-id='type-id-1456' visibility='default' filepath='include/linux/kernfs.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='size' type-id='type-id-763' visibility='default' filepath='include/linux/kernfs.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='notify_next' type-id='type-id-1395' visibility='default' filepath='include/linux/kernfs.h' line='103' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kernfs_ops' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/kernfs.h' line='220' column='1' id='type-id-1457'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='open' type-id='type-id-1458' visibility='default' filepath='include/linux/kernfs.h' line='225' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='release' type-id='type-id-1459' visibility='default' filepath='include/linux/kernfs.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='seq_show' type-id='type-id-311' visibility='default' filepath='include/linux/kernfs.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='seq_start' type-id='type-id-1451' visibility='default' filepath='include/linux/kernfs.h' line='241' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='seq_next' type-id='type-id-1453' visibility='default' filepath='include/linux/kernfs.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='seq_stop' type-id='type-id-1452' visibility='default' filepath='include/linux/kernfs.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='read' type-id='type-id-1460' visibility='default' filepath='include/linux/kernfs.h' line='245' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='atomic_write_len' type-id='type-id-84' visibility='default' filepath='include/linux/kernfs.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='prealloc' type-id='type-id-33' visibility='default' filepath='include/linux/kernfs.h' line='262' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='write' type-id='type-id-1460' visibility='default' filepath='include/linux/kernfs.h' line='263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='poll' type-id='type-id-1461' visibility='default' filepath='include/linux/kernfs.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='mmap' type-id='type-id-1462' visibility='default' filepath='include/linux/kernfs.h' line='269' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kernfs_open_file' size-in-bits='1216' is-struct='yes' visibility='default' filepath='include/linux/kernfs.h' line='200' column='1' id='type-id-1463'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kn' type-id='type-id-1395' visibility='default' filepath='include/linux/kernfs.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='file' type-id='type-id-83' visibility='default' filepath='include/linux/kernfs.h' line='203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='seq_file' type-id='type-id-88' visibility='default' filepath='include/linux/kernfs.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='priv' type-id='type-id-15' visibility='default' filepath='include/linux/kernfs.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/kernfs.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='prealloc_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/kernfs.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='event' type-id='type-id-17' visibility='default' filepath='include/linux/kernfs.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/kernfs.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='prealloc_buf' type-id='type-id-2' visibility='default' filepath='include/linux/kernfs.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='atomic_write_len' type-id='type-id-84' visibility='default' filepath='include/linux/kernfs.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='mmapped' type-id='type-id-33' visibility='default' filepath='include/linux/kernfs.h' line='215' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='released' type-id='type-id-33' visibility='default' filepath='include/linux/kernfs.h' line='216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='vm_ops' type-id='type-id-1464' visibility='default' filepath='include/linux/kernfs.h' line='217' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vm_operations_struct' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/mm.h' line='404' column='1' id='type-id-1465'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='open' type-id='type-id-1466' visibility='default' filepath='include/linux/mm.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='close' type-id='type-id-1466' visibility='default' filepath='include/linux/mm.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='split' type-id='type-id-1467' visibility='default' filepath='include/linux/mm.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mremap' type-id='type-id-1468' visibility='default' filepath='include/linux/mm.h' line='408' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='fault' type-id='type-id-1469' visibility='default' filepath='include/linux/mm.h' line='409' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='huge_fault' type-id='type-id-1470' visibility='default' filepath='include/linux/mm.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='map_pages' type-id='type-id-1471' visibility='default' filepath='include/linux/mm.h' line='412' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='pagesize' type-id='type-id-1472' visibility='default' filepath='include/linux/mm.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='page_mkwrite' type-id='type-id-1469' visibility='default' filepath='include/linux/mm.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='pfn_mkwrite' type-id='type-id-1469' visibility='default' filepath='include/linux/mm.h' line='421' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='access' type-id='type-id-1473' visibility='default' filepath='include/linux/mm.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='name' type-id='type-id-1474' visibility='default' filepath='include/linux/mm.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='find_special_page' type-id='type-id-1475' visibility='default' filepath='include/linux/mm.h' line='462' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vm_area_struct' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/linux/mm_types.h' line='269' column='1' id='type-id-1476'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='vm_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='vm_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='273' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='vm_next' type-id='type-id-1207' visibility='default' filepath='include/linux/mm_types.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='vm_prev' type-id='type-id-1207' visibility='default' filepath='include/linux/mm_types.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='vm_rb' type-id='type-id-422' visibility='default' filepath='include/linux/mm_types.h' line='279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='rb_subtree_gap' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='vm_mm' type-id='type-id-882' visibility='default' filepath='include/linux/mm_types.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='vm_page_prot' type-id='type-id-102' visibility='default' filepath='include/linux/mm_types.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='vm_flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='' type-id='type-id-1477' visibility='default' filepath='include/linux/mm_types.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='anon_vma_chain' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='anon_vma' type-id='type-id-1478' visibility='default' filepath='include/linux/mm_types.h' line='319' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='vm_ops' type-id='type-id-1464' visibility='default' filepath='include/linux/mm_types.h' line='322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='vm_pgoff' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='vm_file' type-id='type-id-83' visibility='default' filepath='include/linux/mm_types.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='vm_private_data' type-id='type-id-15' visibility='default' filepath='include/linux/mm_types.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='swap_readahead_info' type-id='type-id-115' visibility='default' filepath='include/linux/mm_types.h' line='330' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='vm_userfaultfd_ctx' type-id='type-id-1479' visibility='default' filepath='include/linux/mm_types.h' line='337' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mm_struct' size-in-bits='6848' is-struct='yes' visibility='default' filepath='include/linux/mm_types.h' line='352' column='1' id='type-id-1480'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-1481' visibility='default' filepath='include/linux/mm_types.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6848'>
+          <var-decl name='cpu_bitmap' type-id='type-id-280' visibility='default' filepath='include/linux/mm_types.h' line='512' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__12' size-in-bits='6848' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='353' column='1' id='type-id-1481'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mmap' type-id='type-id-1207' visibility='default' filepath='include/linux/mm_types.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mm_rb' type-id='type-id-416' visibility='default' filepath='include/linux/mm_types.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='vmacache_seqnum' type-id='type-id-40' visibility='default' filepath='include/linux/mm_types.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='get_unmapped_area' type-id='type-id-1482' visibility='default' filepath='include/linux/mm_types.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mmap_base' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mmap_legacy_base' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='task_size' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='highest_vm_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pgd' type-id='type-id-1483' visibility='default' filepath='include/linux/mm_types.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mm_users' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='mm_count' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='pgtables_bytes' type-id='type-id-115' visibility='default' filepath='include/linux/mm_types.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='map_count' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='page_table_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mmap_sem' type-id='type-id-246' visibility='default' filepath='include/linux/mm_types.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='mmlist' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='hiwater_rss' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='hiwater_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='total_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='locked_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='pinned_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='data_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='exec_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='stack_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='def_flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='arg_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='421' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='start_code' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='end_code' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='start_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='end_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='start_brk' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='brk' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='start_stack' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='arg_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='arg_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='env_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='env_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='saved_auxv' type-id='type-id-1200' visibility='default' filepath='include/linux/mm_types.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='rss_stat' type-id='type-id-1484' visibility='default' filepath='include/linux/mm_types.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='binfmt' type-id='type-id-1485' visibility='default' filepath='include/linux/mm_types.h' line='434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='context' type-id='type-id-1486' visibility='default' filepath='include/linux/mm_types.h' line='437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='core_state' type-id='type-id-1487' visibility='default' filepath='include/linux/mm_types.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='membarrier_state' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6176'>
+          <var-decl name='ioctx_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='ioctx_table' type-id='type-id-1488' visibility='default' filepath='include/linux/mm_types.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='owner' type-id='type-id-431' visibility='default' filepath='include/linux/mm_types.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='user_ns' type-id='type-id-915' visibility='default' filepath='include/linux/mm_types.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='exe_file' type-id='type-id-83' visibility='default' filepath='include/linux/mm_types.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='tlb_flush_pending' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='491' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='uprobes_state' type-id='type-id-1489' visibility='default' filepath='include/linux/mm_types.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='async_put_work' type-id='type-id-255' visibility='default' filepath='include/linux/mm_types.h' line='500' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pgd_t' type-id='type-id-1490' filepath='arch/arm64/include/asm/pgtable-types.h' line='49' column='1' id='type-id-1491'/>
+      <class-decl name='__anonymous_struct__13' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1491' visibility='default' filepath='arch/arm64/include/asm/pgtable-types.h' line='49' column='1' id='type-id-1490'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pgd' type-id='type-id-1492' visibility='default' filepath='arch/arm64/include/asm/pgtable-types.h' line='49' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pgdval_t' type-id='type-id-40' filepath='arch/arm64/include/asm/pgtable-types.h' line='28' column='1' id='type-id-1492'/>
+      <class-decl name='rw_semaphore' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/rwsem.h' line='30' column='1' id='type-id-246'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-115' visibility='default' filepath='include/linux/rwsem.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wait_list' type-id='type-id-20' visibility='default' filepath='include/linux/rwsem.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='wait_lock' type-id='type-id-36' visibility='default' filepath='include/linux/rwsem.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='osq' type-id='type-id-1448' visibility='default' filepath='include/linux/rwsem.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='owner' type-id='type-id-431' visibility='default' filepath='include/linux/rwsem.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='raw_spinlock_t' type-id='type-id-1399' filepath='include/linux/spinlock_types.h' line='29' column='1' id='type-id-36'/>
+      <class-decl name='task_struct' size-in-bits='27648' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='584' column='1' id='type-id-1493'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='thread_info' type-id='type-id-1494' visibility='default' filepath='include/linux/sched.h' line='590' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='state' type-id='type-id-1495' visibility='default' filepath='include/linux/sched.h' line='593' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='stack' type-id='type-id-15' visibility='default' filepath='include/linux/sched.h' line='601' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='usage' type-id='type-id-26' visibility='default' filepath='include/linux/sched.h' line='602' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='604' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='ptrace' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='605' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='wake_entry' type-id='type-id-281' visibility='default' filepath='include/linux/sched.h' line='608' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='on_cpu' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='609' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='cpu' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='612' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='wakee_flips' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='614' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='wakee_flip_decay_ts' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='615' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='last_wakee' type-id='type-id-431' visibility='default' filepath='include/linux/sched.h' line='616' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='recent_used_cpu' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='625' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='wake_cpu' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='626' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='on_rq' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='628' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='prio' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='630' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='static_prio' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='631' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='normal_prio' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='632' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='rt_priority' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='633' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='sched_class' type-id='type-id-1496' visibility='default' filepath='include/linux/sched.h' line='635' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='se' type-id='type-id-1497' visibility='default' filepath='include/linux/sched.h' line='636' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='rt' type-id='type-id-1498' visibility='default' filepath='include/linux/sched.h' line='637' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5696'>
+          <var-decl name='sched_task_group' type-id='type-id-1499' visibility='default' filepath='include/linux/sched.h' line='639' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='dl' type-id='type-id-1500' visibility='default' filepath='include/linux/sched.h' line='641' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='policy' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='652' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7520'>
+          <var-decl name='nr_cpus_allowed' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='653' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7552'>
+          <var-decl name='cpus_allowed' type-id='type-id-1501' visibility='default' filepath='include/linux/sched.h' line='654' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7616'>
+          <var-decl name='rcu_read_lock_nesting' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='657' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7648'>
+          <var-decl name='rcu_read_unlock_special' type-id='type-id-1234' visibility='default' filepath='include/linux/sched.h' line='658' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7680'>
+          <var-decl name='rcu_node_entry' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='659' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7808'>
+          <var-decl name='rcu_blocked_node' type-id='type-id-1502' visibility='default' filepath='include/linux/sched.h' line='660' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7872'>
+          <var-decl name='rcu_tasks_nvcsw' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='664' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7936'>
+          <var-decl name='rcu_tasks_holdout' type-id='type-id-214' visibility='default' filepath='include/linux/sched.h' line='665' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7944'>
+          <var-decl name='rcu_tasks_idx' type-id='type-id-214' visibility='default' filepath='include/linux/sched.h' line='666' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7968'>
+          <var-decl name='rcu_tasks_idle_cpu' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8000'>
+          <var-decl name='rcu_tasks_holdout_list' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='668' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8128'>
+          <var-decl name='sched_info' type-id='type-id-1503' visibility='default' filepath='include/linux/sched.h' line='671' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8384'>
+          <var-decl name='tasks' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8512'>
+          <var-decl name='pushable_tasks' type-id='type-id-1504' visibility='default' filepath='include/linux/sched.h' line='675' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8832'>
+          <var-decl name='pushable_dl_tasks' type-id='type-id-422' visibility='default' filepath='include/linux/sched.h' line='676' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9024'>
+          <var-decl name='mm' type-id='type-id-882' visibility='default' filepath='include/linux/sched.h' line='679' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9088'>
+          <var-decl name='active_mm' type-id='type-id-882' visibility='default' filepath='include/linux/sched.h' line='680' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9152'>
+          <var-decl name='vmacache' type-id='type-id-1505' visibility='default' filepath='include/linux/sched.h' line='683' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9472'>
+          <var-decl name='rss_stat' type-id='type-id-1506' visibility='default' filepath='include/linux/sched.h' line='686' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9632'>
+          <var-decl name='exit_state' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='688' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9664'>
+          <var-decl name='exit_code' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='689' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9696'>
+          <var-decl name='exit_signal' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='690' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9728'>
+          <var-decl name='pdeath_signal' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='692' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9792'>
+          <var-decl name='jobctl' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='694' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9856'>
+          <var-decl name='personality' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='697' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='sched_reset_on_fork' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='700' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='sched_contributes_to_load' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='701' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='sched_migrated' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='702' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='sched_remote_wakeup' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='703' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='sched_psi_wake_requeue' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='705' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='in_execve' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='714' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='in_iowait' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='715' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='in_user_fault' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='720' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='memcg_kmem_skip_account' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='722' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='no_cgroup_migration' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='730' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26'>
+          <var-decl name='use_memdelay' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='734' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9984'>
+          <var-decl name='atomic_flags' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='737' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10048'>
+          <var-decl name='restart_block' type-id='type-id-1507' visibility='default' filepath='include/linux/sched.h' line='739' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10432'>
+          <var-decl name='pid' type-id='type-id-41' visibility='default' filepath='include/linux/sched.h' line='741' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10464'>
+          <var-decl name='tgid' type-id='type-id-41' visibility='default' filepath='include/linux/sched.h' line='742' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10496'>
+          <var-decl name='stack_canary' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='746' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10560'>
+          <var-decl name='real_parent' type-id='type-id-431' visibility='default' filepath='include/linux/sched.h' line='755' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10624'>
+          <var-decl name='parent' type-id='type-id-431' visibility='default' filepath='include/linux/sched.h' line='758' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10688'>
+          <var-decl name='children' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='763' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10816'>
+          <var-decl name='sibling' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='764' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10944'>
+          <var-decl name='group_leader' type-id='type-id-431' visibility='default' filepath='include/linux/sched.h' line='765' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11008'>
+          <var-decl name='ptraced' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='773' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11136'>
+          <var-decl name='ptrace_entry' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='774' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11264'>
+          <var-decl name='thread_pid' type-id='type-id-251' visibility='default' filepath='include/linux/sched.h' line='777' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11328'>
+          <var-decl name='pid_links' type-id='type-id-1124' visibility='default' filepath='include/linux/sched.h' line='778' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11840'>
+          <var-decl name='thread_group' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='779' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11968'>
+          <var-decl name='thread_node' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='780' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12096'>
+          <var-decl name='vfork_done' type-id='type-id-1392' visibility='default' filepath='include/linux/sched.h' line='782' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12160'>
+          <var-decl name='set_child_tid' type-id='type-id-666' visibility='default' filepath='include/linux/sched.h' line='785' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12224'>
+          <var-decl name='clear_child_tid' type-id='type-id-666' visibility='default' filepath='include/linux/sched.h' line='788' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12288'>
+          <var-decl name='utime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='790' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12352'>
+          <var-decl name='stime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='791' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12416'>
+          <var-decl name='gtime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='796' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12480'>
+          <var-decl name='time_in_state' type-id='type-id-1508' visibility='default' filepath='include/linux/sched.h' line='798' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12544'>
+          <var-decl name='max_state' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='799' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12608'>
+          <var-decl name='prev_cputime' type-id='type-id-1509' visibility='default' filepath='include/linux/sched.h' line='801' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12800'>
+          <var-decl name='nvcsw' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='810' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12864'>
+          <var-decl name='nivcsw' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='811' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12928'>
+          <var-decl name='start_time' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='814' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12992'>
+          <var-decl name='real_start_time' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='817' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13056'>
+          <var-decl name='min_flt' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='820' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13120'>
+          <var-decl name='maj_flt' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='821' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13184'>
+          <var-decl name='cputime_expires' type-id='type-id-1510' visibility='default' filepath='include/linux/sched.h' line='824' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13376'>
+          <var-decl name='cpu_timers' type-id='type-id-457' visibility='default' filepath='include/linux/sched.h' line='825' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13760'>
+          <var-decl name='ptracer_cred' type-id='type-id-1277' visibility='default' filepath='include/linux/sched.h' line='831' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13824'>
+          <var-decl name='real_cred' type-id='type-id-1277' visibility='default' filepath='include/linux/sched.h' line='834' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13888'>
+          <var-decl name='cred' type-id='type-id-1277' visibility='default' filepath='include/linux/sched.h' line='837' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13952'>
+          <var-decl name='comm' type-id='type-id-43' visibility='default' filepath='include/linux/sched.h' line='846' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14080'>
+          <var-decl name='nameidata' type-id='type-id-1511' visibility='default' filepath='include/linux/sched.h' line='848' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14144'>
+          <var-decl name='fs' type-id='type-id-1512' visibility='default' filepath='include/linux/sched.h' line='859' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14208'>
+          <var-decl name='files' type-id='type-id-1513' visibility='default' filepath='include/linux/sched.h' line='862' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14272'>
+          <var-decl name='nsproxy' type-id='type-id-914' visibility='default' filepath='include/linux/sched.h' line='865' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14336'>
+          <var-decl name='signal' type-id='type-id-1514' visibility='default' filepath='include/linux/sched.h' line='868' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14400'>
+          <var-decl name='sighand' type-id='type-id-1515' visibility='default' filepath='include/linux/sched.h' line='869' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14464'>
+          <var-decl name='blocked' type-id='type-id-1516' visibility='default' filepath='include/linux/sched.h' line='870' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14528'>
+          <var-decl name='real_blocked' type-id='type-id-1516' visibility='default' filepath='include/linux/sched.h' line='871' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14592'>
+          <var-decl name='saved_sigmask' type-id='type-id-1516' visibility='default' filepath='include/linux/sched.h' line='873' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14656'>
+          <var-decl name='pending' type-id='type-id-1517' visibility='default' filepath='include/linux/sched.h' line='874' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14848'>
+          <var-decl name='sas_ss_sp' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='875' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14912'>
+          <var-decl name='sas_ss_size' type-id='type-id-84' visibility='default' filepath='include/linux/sched.h' line='876' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14976'>
+          <var-decl name='sas_ss_flags' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='877' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15040'>
+          <var-decl name='task_works' type-id='type-id-91' visibility='default' filepath='include/linux/sched.h' line='879' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15104'>
+          <var-decl name='audit_context' type-id='type-id-1518' visibility='default' filepath='include/linux/sched.h' line='881' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15168'>
+          <var-decl name='loginuid' type-id='type-id-42' visibility='default' filepath='include/linux/sched.h' line='883' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15200'>
+          <var-decl name='sessionid' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='884' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15232'>
+          <var-decl name='seccomp' type-id='type-id-1519' visibility='default' filepath='include/linux/sched.h' line='886' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15360'>
+          <var-decl name='parent_exec_id' type-id='type-id-7' visibility='default' filepath='include/linux/sched.h' line='889' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15392'>
+          <var-decl name='self_exec_id' type-id='type-id-7' visibility='default' filepath='include/linux/sched.h' line='890' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15424'>
+          <var-decl name='alloc_lock' type-id='type-id-247' visibility='default' filepath='include/linux/sched.h' line='893' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15456'>
+          <var-decl name='pi_lock' type-id='type-id-36' visibility='default' filepath='include/linux/sched.h' line='896' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15488'>
+          <var-decl name='wake_q' type-id='type-id-1520' visibility='default' filepath='include/linux/sched.h' line='898' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15552'>
+          <var-decl name='pi_waiters' type-id='type-id-1521' visibility='default' filepath='include/linux/sched.h' line='902' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15680'>
+          <var-decl name='pi_top_task' type-id='type-id-431' visibility='default' filepath='include/linux/sched.h' line='904' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15744'>
+          <var-decl name='pi_blocked_on' type-id='type-id-1522' visibility='default' filepath='include/linux/sched.h' line='906' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15808'>
+          <var-decl name='journal_info' type-id='type-id-15' visibility='default' filepath='include/linux/sched.h' line='943' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15872'>
+          <var-decl name='bio_list' type-id='type-id-1523' visibility='default' filepath='include/linux/sched.h' line='946' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15936'>
+          <var-decl name='plug' type-id='type-id-1524' visibility='default' filepath='include/linux/sched.h' line='950' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16000'>
+          <var-decl name='reclaim_state' type-id='type-id-1525' visibility='default' filepath='include/linux/sched.h' line='954' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16064'>
+          <var-decl name='backing_dev_info' type-id='type-id-1357' visibility='default' filepath='include/linux/sched.h' line='956' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16128'>
+          <var-decl name='io_context' type-id='type-id-364' visibility='default' filepath='include/linux/sched.h' line='958' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16192'>
+          <var-decl name='ptrace_message' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='961' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16256'>
+          <var-decl name='last_siginfo' type-id='type-id-1526' visibility='default' filepath='include/linux/sched.h' line='962' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16320'>
+          <var-decl name='ioac' type-id='type-id-1527' visibility='default' filepath='include/linux/sched.h' line='964' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16832'>
+          <var-decl name='psi_flags' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='967' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16896'>
+          <var-decl name='acct_rss_mem1' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='971' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16960'>
+          <var-decl name='acct_vm_mem1' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='973' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17024'>
+          <var-decl name='acct_timexpd' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='975' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17088'>
+          <var-decl name='mems_allowed' type-id='type-id-1528' visibility='default' filepath='include/linux/sched.h' line='979' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17152'>
+          <var-decl name='mems_allowed_seq' type-id='type-id-387' visibility='default' filepath='include/linux/sched.h' line='981' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17184'>
+          <var-decl name='cpuset_mem_spread_rotor' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='982' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17216'>
+          <var-decl name='cpuset_slab_spread_rotor' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='983' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17280'>
+          <var-decl name='cgroups' type-id='type-id-1529' visibility='default' filepath='include/linux/sched.h' line='987' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17344'>
+          <var-decl name='cg_list' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='989' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17472'>
+          <var-decl name='robust_list' type-id='type-id-1530' visibility='default' filepath='include/linux/sched.h' line='996' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17536'>
+          <var-decl name='compat_robust_list' type-id='type-id-1531' visibility='default' filepath='include/linux/sched.h' line='998' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17600'>
+          <var-decl name='pi_state_list' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='1000' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17728'>
+          <var-decl name='pi_state_cache' type-id='type-id-1532' visibility='default' filepath='include/linux/sched.h' line='1001' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17792'>
+          <var-decl name='perf_event_ctxp' type-id='type-id-1159' visibility='default' filepath='include/linux/sched.h' line='1004' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17920'>
+          <var-decl name='perf_event_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/sched.h' line='1005' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18176'>
+          <var-decl name='perf_event_list' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='1006' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18304'>
+          <var-decl name='preempt_disable_ip' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='1009' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18368'>
+          <var-decl name='tlb_ubc' type-id='type-id-1533' visibility='default' filepath='include/linux/sched.h' line='1078' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18368'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/sched.h' line='1080' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18496'>
+          <var-decl name='splice_pipe' type-id='type-id-87' visibility='default' filepath='include/linux/sched.h' line='1083' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18560'>
+          <var-decl name='task_frag' type-id='type-id-1534' visibility='default' filepath='include/linux/sched.h' line='1085' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18688'>
+          <var-decl name='nr_dirtied' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='1099' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18720'>
+          <var-decl name='nr_dirtied_pause' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='1100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18752'>
+          <var-decl name='dirty_paused_when' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='1102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18816'>
+          <var-decl name='timer_slack_ns' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='1112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18880'>
+          <var-decl name='default_timer_slack_ns' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='1113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18944'>
+          <var-decl name='trace' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='1142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19008'>
+          <var-decl name='trace_recursion' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='1145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19072'>
+          <var-decl name='memcg_in_oom' type-id='type-id-1535' visibility='default' filepath='include/linux/sched.h' line='1163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19136'>
+          <var-decl name='memcg_oom_gfp_mask' type-id='type-id-485' visibility='default' filepath='include/linux/sched.h' line='1164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19168'>
+          <var-decl name='memcg_oom_order' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='1165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19200'>
+          <var-decl name='memcg_nr_pages_over_high' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='1168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19264'>
+          <var-decl name='active_memcg' type-id='type-id-1535' visibility='default' filepath='include/linux/sched.h' line='1171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19328'>
+          <var-decl name='throttle_queue' type-id='type-id-1536' visibility='default' filepath='include/linux/sched.h' line='1175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19392'>
+          <var-decl name='utask' type-id='type-id-1537' visibility='default' filepath='include/linux/sched.h' line='1179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19456'>
+          <var-decl name='pagefault_disabled' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='1188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19520'>
+          <var-decl name='oom_reaper_list' type-id='type-id-431' visibility='default' filepath='include/linux/sched.h' line='1190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19584'>
+          <var-decl name='stack_vm_area' type-id='type-id-1538' visibility='default' filepath='include/linux/sched.h' line='1193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19648'>
+          <var-decl name='stack_refcount' type-id='type-id-26' visibility='default' filepath='include/linux/sched.h' line='1197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19712'>
+          <var-decl name='security' type-id='type-id-15' visibility='default' filepath='include/linux/sched.h' line='1204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19840'>
+          <var-decl name='thread' type-id='type-id-1539' visibility='default' filepath='include/linux/sched.h' line='1214' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='thread_info' size-in-bits='320' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/thread_info.h' line='39' column='1' id='type-id-1494'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/thread_info.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='addr_limit' type-id='type-id-1540' visibility='default' filepath='arch/arm64/include/asm/thread_info.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ttbr0' type-id='type-id-40' visibility='default' filepath='arch/arm64/include/asm/thread_info.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='preempt_count' type-id='type-id-17' visibility='default' filepath='arch/arm64/include/asm/thread_info.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='shadow_call_stack' type-id='type-id-15' visibility='default' filepath='arch/arm64/include/asm/thread_info.h' line='47' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='mm_segment_t' type-id='type-id-16' filepath='arch/arm64/include/asm/thread_info.h' line='34' column='1' id='type-id-1540'/>
+      <class-decl name='sched_entity' size-in-bits='3584' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='437' column='1' id='type-id-1497'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='load' type-id='type-id-1541' visibility='default' filepath='include/linux/sched.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='runnable_weight' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='440' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='run_node' type-id='type-id-422' visibility='default' filepath='include/linux/sched.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='group_node' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='442' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='on_rq' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='exec_start' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='445' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='sum_exec_runtime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='vruntime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='prev_sum_exec_runtime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='448' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='nr_migrations' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='450' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='statistics' type-id='type-id-1542' visibility='default' filepath='include/linux/sched.h' line='452' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='depth' type-id='type-id-17' visibility='default' filepath='include/linux/sched.h' line='455' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='parent' type-id='type-id-1543' visibility='default' filepath='include/linux/sched.h' line='456' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='cfs_rq' type-id='type-id-1544' visibility='default' filepath='include/linux/sched.h' line='458' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='my_q' type-id='type-id-1544' visibility='default' filepath='include/linux/sched.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='avg' type-id='type-id-1545' visibility='default' filepath='include/linux/sched.h' line='470' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='load_weight' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='313' column='1' id='type-id-1541'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='weight' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='inv_weight' type-id='type-id-7' visibility='default' filepath='include/linux/sched.h' line='315' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sched_statistics' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='401' column='1' id='type-id-1542'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='wait_start' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wait_max' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='wait_count' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='wait_sum' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='iowait_count' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='iowait_sum' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='408' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='sleep_start' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='sleep_max' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='sum_sleep_runtime' type-id='type-id-1546' visibility='default' filepath='include/linux/sched.h' line='412' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='block_start' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='block_max' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='exec_max' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='slice_max' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='nr_migrations_cold' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='nr_failed_migrations_affine' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='420' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='nr_failed_migrations_running' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='421' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='nr_failed_migrations_hot' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='nr_forced_migrations' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='nr_wakeups' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='425' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='nr_wakeups_sync' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='nr_wakeups_migrate' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='427' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='nr_wakeups_local' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='428' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='nr_wakeups_remote' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='429' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='nr_wakeups_affine' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='nr_wakeups_affine_attempts' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='nr_wakeups_passive' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='nr_wakeups_idle' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='433' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='s64' type-id='type-id-898' filepath='include/asm-generic/int-ll64.h' line='22' column='1' id='type-id-1546'/>
+      <class-decl name='sched_avg' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='389' column='1' id='type-id-1545'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='last_update_time' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='load_sum' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='runnable_load_sum' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='util_sum' type-id='type-id-7' visibility='default' filepath='include/linux/sched.h' line='393' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='period_contrib' type-id='type-id-7' visibility='default' filepath='include/linux/sched.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='load_avg' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='395' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='runnable_load_avg' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='util_avg' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='397' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='util_est' type-id='type-id-1547' visibility='default' filepath='include/linux/sched.h' line='398' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='util_est' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='340' column='1' id='type-id-1547'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='enqueued' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ewma' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='342' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sched_rt_entity' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='474' column='1' id='type-id-1498'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='run_list' type-id='type-id-20' visibility='default' filepath='include/linux/sched.h' line='475' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='timeout' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='watchdog_stamp' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='477' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='time_slice' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='478' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='on_rq' type-id='type-id-312' visibility='default' filepath='include/linux/sched.h' line='479' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='304'>
+          <var-decl name='on_list' type-id='type-id-312' visibility='default' filepath='include/linux/sched.h' line='480' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='back' type-id='type-id-1548' visibility='default' filepath='include/linux/sched.h' line='482' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='parent' type-id='type-id-1548' visibility='default' filepath='include/linux/sched.h' line='484' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='rt_rq' type-id='type-id-1549' visibility='default' filepath='include/linux/sched.h' line='486' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='my_q' type-id='type-id-1549' visibility='default' filepath='include/linux/sched.h' line='488' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sched_dl_entity' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='492' column='1' id='type-id-1500'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rb_node' type-id='type-id-422' visibility='default' filepath='include/linux/sched.h' line='493' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dl_runtime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='500' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dl_deadline' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='501' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dl_period' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='502' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dl_bw' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='503' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='dl_density' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='504' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='runtime' type-id='type-id-1546' visibility='default' filepath='include/linux/sched.h' line='511' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='deadline' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='512' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='513' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='dl_throttled' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='539' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='dl_boosted' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='540' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='dl_yielded' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='541' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='dl_non_contending' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='542' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='dl_overrun' type-id='type-id-5' visibility='default' filepath='include/linux/sched.h' line='543' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='dl_timer' type-id='type-id-681' visibility='default' filepath='include/linux/sched.h' line='549' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='inactive_timer' type-id='type-id-681' visibility='default' filepath='include/linux/sched.h' line='558' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hrtimer' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/hrtimer.h' line='110' column='1' id='type-id-681'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-1550' visibility='default' filepath='include/linux/hrtimer.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='_softexpires' type-id='type-id-682' visibility='default' filepath='include/linux/hrtimer.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='function' type-id='type-id-1551' visibility='default' filepath='include/linux/hrtimer.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='base' type-id='type-id-1552' visibility='default' filepath='include/linux/hrtimer.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='state' type-id='type-id-214' visibility='default' filepath='include/linux/hrtimer.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='456'>
+          <var-decl name='is_rel' type-id='type-id-214' visibility='default' filepath='include/linux/hrtimer.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='464'>
+          <var-decl name='is_soft' type-id='type-id-214' visibility='default' filepath='include/linux/hrtimer.h' line='117' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='timerqueue_node' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/timerqueue.h' line='9' column='1' id='type-id-1550'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-422' visibility='default' filepath='include/linux/timerqueue.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='expires' type-id='type-id-682' visibility='default' filepath='include/linux/timerqueue.h' line='11' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='ktime_t' type-id='type-id-1546' filepath='include/linux/ktime.h' line='28' column='1' id='type-id-682'/>
+      <enum-decl name='hrtimer_restart' filepath='include/linux/hrtimer.h' line='59' column='1' id='type-id-1553'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='HRTIMER_NORESTART' value='0'/>
+        <enumerator name='HRTIMER_RESTART' value='1'/>
+      </enum-decl>
+      <class-decl name='hrtimer_clock_base' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/hrtimer.h' line='150' column='1' id='type-id-1125'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cpu_base' type-id='type-id-1554' visibility='default' filepath='include/linux/hrtimer.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='index' type-id='type-id-5' visibility='default' filepath='include/linux/hrtimer.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='clockid' type-id='type-id-1555' visibility='default' filepath='include/linux/hrtimer.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='seq' type-id='type-id-387' visibility='default' filepath='include/linux/hrtimer.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='running' type-id='type-id-1556' visibility='default' filepath='include/linux/hrtimer.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='active' type-id='type-id-1557' visibility='default' filepath='include/linux/hrtimer.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='get_time' type-id='type-id-1558' visibility='default' filepath='include/linux/hrtimer.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='offset' type-id='type-id-682' visibility='default' filepath='include/linux/hrtimer.h' line='158' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hrtimer_cpu_base' size-in-bits='4608' is-struct='yes' visibility='default' filepath='include/linux/hrtimer.h' line='201' column='1' id='type-id-1559'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='include/linux/hrtimer.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='cpu' type-id='type-id-5' visibility='default' filepath='include/linux/hrtimer.h' line='203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='active_bases' type-id='type-id-5' visibility='default' filepath='include/linux/hrtimer.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='clock_was_set_seq' type-id='type-id-5' visibility='default' filepath='include/linux/hrtimer.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='hres_active' type-id='type-id-5' visibility='default' filepath='include/linux/hrtimer.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='in_hrtirq' type-id='type-id-5' visibility='default' filepath='include/linux/hrtimer.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='hang_detected' type-id='type-id-5' visibility='default' filepath='include/linux/hrtimer.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='softirq_activated' type-id='type-id-5' visibility='default' filepath='include/linux/hrtimer.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='nr_events' type-id='type-id-5' visibility='default' filepath='include/linux/hrtimer.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='nr_retries' type-id='type-id-312' visibility='default' filepath='include/linux/hrtimer.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='208'>
+          <var-decl name='nr_hangs' type-id='type-id-312' visibility='default' filepath='include/linux/hrtimer.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='max_hang_time' type-id='type-id-5' visibility='default' filepath='include/linux/hrtimer.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='expires_next' type-id='type-id-682' visibility='default' filepath='include/linux/hrtimer.h' line='216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='next_timer' type-id='type-id-1556' visibility='default' filepath='include/linux/hrtimer.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='softirq_expires_next' type-id='type-id-682' visibility='default' filepath='include/linux/hrtimer.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='softirq_next_timer' type-id='type-id-1556' visibility='default' filepath='include/linux/hrtimer.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='clock_base' type-id='type-id-1126' visibility='default' filepath='include/linux/hrtimer.h' line='220' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='clockid_t' type-id='type-id-1560' filepath='include/linux/types.h' line='27' column='1' id='type-id-1555'/>
+      <typedef-decl name='__kernel_clockid_t' type-id='type-id-17' filepath='include/uapi/asm-generic/posix_types.h' line='93' column='1' id='type-id-1560'/>
+      <class-decl name='timerqueue_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/timerqueue.h' line='14' column='1' id='type-id-1557'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-416' visibility='default' filepath='include/linux/timerqueue.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='next' type-id='type-id-1561' visibility='default' filepath='include/linux/timerqueue.h' line='16' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='cpumask_t' type-id='type-id-178' filepath='include/linux/cpumask.h' line='16' column='1' id='type-id-1501'/>
+      <class-decl name='cpumask' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/cpumask.h' line='16' column='1' id='type-id-178'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bits' type-id='type-id-491' visibility='default' filepath='include/linux/cpumask.h' line='16' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__14' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='562' column='1' id='type-id-1235'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='blocked' type-id='type-id-214' visibility='default' filepath='include/linux/sched.h' line='563' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='need_qs' type-id='type-id-214' visibility='default' filepath='include/linux/sched.h' line='564' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='exp_need_qs' type-id='type-id-214' visibility='default' filepath='include/linux/sched.h' line='565' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='pad' type-id='type-id-214' visibility='default' filepath='include/linux/sched.h' line='568' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sched_info' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='282' column='1' id='type-id-1503'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pcount' type-id='type-id-16' visibility='default' filepath='include/linux/sched.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='run_delay' type-id='type-id-98' visibility='default' filepath='include/linux/sched.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='last_arrival' type-id='type-id-98' visibility='default' filepath='include/linux/sched.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='last_queued' type-id='type-id-98' visibility='default' filepath='include/linux/sched.h' line='298' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='plist_node' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/plist.h' line='85' column='1' id='type-id-1504'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prio' type-id='type-id-17' visibility='default' filepath='include/linux/plist.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prio_list' type-id='type-id-20' visibility='default' filepath='include/linux/plist.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='node_list' type-id='type-id-20' visibility='default' filepath='include/linux/plist.h' line='88' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vmacache' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/mm_types_task.h' line='34' column='1' id='type-id-1505'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='seqnum' type-id='type-id-40' visibility='default' filepath='include/linux/mm_types_task.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='vmas' type-id='type-id-1208' visibility='default' filepath='include/linux/mm_types_task.h' line='36' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='task_rss_stat' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/linux/mm_types_task.h' line='50' column='1' id='type-id-1506'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='events' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types_task.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='count' type-id='type-id-1132' visibility='default' filepath='include/linux/mm_types_task.h' line='52' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='restart_block' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/restart_block.h' line='25' column='1' id='type-id-1507'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fn' type-id='type-id-1562' visibility='default' filepath='include/linux/restart_block.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='' type-id='type-id-1563' visibility='default' filepath='include/linux/restart_block.h' line='27' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__8' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='include/linux/restart_block.h' line='27' column='1' id='type-id-1563'>
+        <data-member access='private'>
+          <var-decl name='futex' type-id='type-id-234' visibility='default' filepath='include/linux/restart_block.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='nanosleep' type-id='type-id-235' visibility='default' filepath='include/linux/restart_block.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='poll' type-id='type-id-1564' visibility='default' filepath='include/linux/restart_block.h' line='54' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__15' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/restart_block.h' line='29' column='1' id='type-id-234'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='uaddr' type-id='type-id-1565' visibility='default' filepath='include/linux/restart_block.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='val' type-id='type-id-7' visibility='default' filepath='include/linux/restart_block.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/linux/restart_block.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bitset' type-id='type-id-7' visibility='default' filepath='include/linux/restart_block.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='time' type-id='type-id-40' visibility='default' filepath='include/linux/restart_block.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='uaddr2' type-id='type-id-1565' visibility='default' filepath='include/linux/restart_block.h' line='35' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__16' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/restart_block.h' line='38' column='1' id='type-id-235'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='clockid' type-id='type-id-1555' visibility='default' filepath='include/linux/restart_block.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='type' type-id='type-id-1566' visibility='default' filepath='include/linux/restart_block.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='' type-id='type-id-1567' visibility='default' filepath='include/linux/restart_block.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='expires' type-id='type-id-40' visibility='default' filepath='include/linux/restart_block.h' line='45' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='timespec_type' filepath='include/linux/restart_block.h' line='16' column='1' id='type-id-1566'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='TT_NONE' value='0'/>
+        <enumerator name='TT_NATIVE' value='1'/>
+        <enumerator name='TT_COMPAT' value='2'/>
+      </enum-decl>
+      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/restart_block.h' line='41' column='1' id='type-id-1567'>
+        <data-member access='private'>
+          <var-decl name='rmtp' type-id='type-id-1568' visibility='default' filepath='include/linux/restart_block.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='compat_rmtp' type-id='type-id-1569' visibility='default' filepath='include/linux/restart_block.h' line='43' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/time.h' line='10' column='1' id='type-id-1570'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tv_sec' type-id='type-id-1571' visibility='default' filepath='include/uapi/linux/time.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tv_nsec' type-id='type-id-192' visibility='default' filepath='include/uapi/linux/time.h' line='12' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__kernel_time_t' type-id='type-id-105' filepath='include/uapi/asm-generic/posix_types.h' line='89' column='1' id='type-id-1571'/>
+      <class-decl name='compat_timespec' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/compat_time.h' line='10' column='1' id='type-id-1572'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tv_sec' type-id='type-id-1573' visibility='default' filepath='include/linux/compat_time.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='tv_nsec' type-id='type-id-738' visibility='default' filepath='include/linux/compat_time.h' line='12' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='compat_time_t' type-id='type-id-738' filepath='include/linux/compat_time.h' line='8' column='1' id='type-id-1573'/>
+      <typedef-decl name='s32' type-id='type-id-653' filepath='include/asm-generic/int-ll64.h' line='20' column='1' id='type-id-738'/>
+      <typedef-decl name='__s32' type-id='type-id-17' filepath='include/uapi/asm-generic/int-ll64.h' line='26' column='1' id='type-id-653'/>
+      <class-decl name='__anonymous_struct__17' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/restart_block.h' line='48' column='1' id='type-id-1564'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ufds' type-id='type-id-237' visibility='default' filepath='include/linux/restart_block.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nfds' type-id='type-id-17' visibility='default' filepath='include/linux/restart_block.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='has_timeout' type-id='type-id-17' visibility='default' filepath='include/linux/restart_block.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tv_sec' type-id='type-id-16' visibility='default' filepath='include/linux/restart_block.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tv_nsec' type-id='type-id-16' visibility='default' filepath='include/linux/restart_block.h' line='53' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pid_t' type-id='type-id-1574' filepath='include/linux/types.h' line='22' column='1' id='type-id-41'/>
+      <typedef-decl name='__kernel_pid_t' type-id='type-id-17' filepath='include/uapi/asm-generic/posix_types.h' line='28' column='1' id='type-id-1574'/>
+      <class-decl name='pid' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/pid.h' line='58' column='1' id='type-id-1575'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-26' visibility='default' filepath='include/linux/pid.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='level' type-id='type-id-5' visibility='default' filepath='include/linux/pid.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tasks' type-id='type-id-1123' visibility='default' filepath='include/linux/pid.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='wait_pidfd' type-id='type-id-225' visibility='default' filepath='include/linux/pid.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/pid.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='numbers' type-id='type-id-1206' visibility='default' filepath='include/linux/pid.h' line='67' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hlist_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/types.h' line='190' column='1' id='type-id-186'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='first' type-id='type-id-97' visibility='default' filepath='include/linux/types.h' line='191' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hlist_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/types.h' line='194' column='1' id='type-id-520'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-97' visibility='default' filepath='include/linux/types.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pprev' type-id='type-id-1576' visibility='default' filepath='include/linux/types.h' line='195' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='upid' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/pid.h' line='53' column='1' id='type-id-1205'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nr' type-id='type-id-17' visibility='default' filepath='include/linux/pid.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ns' type-id='type-id-693' visibility='default' filepath='include/linux/pid.h' line='55' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pid_namespace' size-in-bits='1600' is-struct='yes' visibility='default' filepath='include/linux/pid_namespace.h' line='24' column='1' id='type-id-1577'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kref' type-id='type-id-239' visibility='default' filepath='include/linux/pid_namespace.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='idr' type-id='type-id-1432' visibility='default' filepath='include/linux/pid_namespace.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/pid_namespace.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='pid_allocated' type-id='type-id-5' visibility='default' filepath='include/linux/pid_namespace.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='child_reaper' type-id='type-id-431' visibility='default' filepath='include/linux/pid_namespace.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pid_cachep' type-id='type-id-538' visibility='default' filepath='include/linux/pid_namespace.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='level' type-id='type-id-5' visibility='default' filepath='include/linux/pid_namespace.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='parent' type-id='type-id-693' visibility='default' filepath='include/linux/pid_namespace.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='proc_mnt' type-id='type-id-1282' visibility='default' filepath='include/linux/pid_namespace.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='proc_self' type-id='type-id-23' visibility='default' filepath='include/linux/pid_namespace.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='proc_thread_self' type-id='type-id-23' visibility='default' filepath='include/linux/pid_namespace.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='user_ns' type-id='type-id-915' visibility='default' filepath='include/linux/pid_namespace.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='ucounts' type-id='type-id-1578' visibility='default' filepath='include/linux/pid_namespace.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='proc_work' type-id='type-id-255' visibility='default' filepath='include/linux/pid_namespace.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='pid_gid' type-id='type-id-330' visibility='default' filepath='include/linux/pid_namespace.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='hide_pid' type-id='type-id-17' visibility='default' filepath='include/linux/pid_namespace.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='reboot' type-id='type-id-17' visibility='default' filepath='include/linux/pid_namespace.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='ns' type-id='type-id-903' visibility='default' filepath='include/linux/pid_namespace.h' line='47' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kref' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/kref.h' line='21' column='1' id='type-id-239'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refcount' type-id='type-id-421' visibility='default' filepath='include/linux/kref.h' line='22' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='refcount_t' type-id='type-id-1579' filepath='include/linux/refcount.h' line='21' column='1' id='type-id-421'/>
+      <class-decl name='refcount_struct' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/refcount.h' line='19' column='1' id='type-id-1579'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refs' type-id='type-id-26' visibility='default' filepath='include/linux/refcount.h' line='20' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='user_namespace' size-in-bits='3712' is-struct='yes' visibility='default' filepath='include/linux/user_namespace.h' line='55' column='1' id='type-id-1580'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='uid_map' type-id='type-id-1581' visibility='default' filepath='include/linux/user_namespace.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='gid_map' type-id='type-id-1581' visibility='default' filepath='include/linux/user_namespace.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='projid_map' type-id='type-id-1581' visibility='default' filepath='include/linux/user_namespace.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='count' type-id='type-id-26' visibility='default' filepath='include/linux/user_namespace.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='parent' type-id='type-id-915' visibility='default' filepath='include/linux/user_namespace.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='level' type-id='type-id-17' visibility='default' filepath='include/linux/user_namespace.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1888'>
+          <var-decl name='owner' type-id='type-id-42' visibility='default' filepath='include/linux/user_namespace.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='group' type-id='type-id-330' visibility='default' filepath='include/linux/user_namespace.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='ns' type-id='type-id-903' visibility='default' filepath='include/linux/user_namespace.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/user_namespace.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='work' type-id='type-id-255' visibility='default' filepath='include/linux/user_namespace.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='set' type-id='type-id-1582' visibility='default' filepath='include/linux/user_namespace.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='sysctls' type-id='type-id-1583' visibility='default' filepath='include/linux/user_namespace.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='ucounts' type-id='type-id-1578' visibility='default' filepath='include/linux/user_namespace.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='ucount_max' type-id='type-id-1133' visibility='default' filepath='include/linux/user_namespace.h' line='78' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='uid_gid_map' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/user_namespace.h' line='23' column='1' id='type-id-1581'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nr_extents' type-id='type-id-7' visibility='default' filepath='include/linux/user_namespace.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='' type-id='type-id-1584' visibility='default' filepath='include/linux/user_namespace.h' line='25' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__10' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/linux/user_namespace.h' line='25' column='1' id='type-id-1584'>
+        <data-member access='private'>
+          <var-decl name='extent' type-id='type-id-1186' visibility='default' filepath='include/linux/user_namespace.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-1585' visibility='default' filepath='include/linux/user_namespace.h' line='27' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='uid_gid_extent' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/linux/user_namespace.h' line='17' column='1' id='type-id-1185'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='first' type-id='type-id-7' visibility='default' filepath='include/linux/user_namespace.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='lower_first' type-id='type-id-7' visibility='default' filepath='include/linux/user_namespace.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='count' type-id='type-id-7' visibility='default' filepath='include/linux/user_namespace.h' line='20' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__18' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/user_namespace.h' line='27' column='1' id='type-id-1585'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='forward' type-id='type-id-1586' visibility='default' filepath='include/linux/user_namespace.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='reverse' type-id='type-id-1586' visibility='default' filepath='include/linux/user_namespace.h' line='29' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ns_common' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/ns_common.h' line='7' column='1' id='type-id-903'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='stashed' type-id='type-id-115' visibility='default' filepath='include/linux/ns_common.h' line='8' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ops' type-id='type-id-1587' visibility='default' filepath='include/linux/ns_common.h' line='9' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='inum' type-id='type-id-5' visibility='default' filepath='include/linux/ns_common.h' line='10' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='work_struct' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/workqueue.h' line='102' column='1' id='type-id-255'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='data' type-id='type-id-115' visibility='default' filepath='include/linux/workqueue.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='entry' type-id='type-id-20' visibility='default' filepath='include/linux/workqueue.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='func' type-id='type-id-1588' visibility='default' filepath='include/linux/workqueue.h' line='105' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='work_func_t' type-id='type-id-1589' filepath='include/linux/workqueue.h' line='21' column='1' id='type-id-1588'/>
+      <class-decl name='ctl_table_set' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/sysctl.h' line='159' column='1' id='type-id-1582'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='is_seen' type-id='type-id-1590' visibility='default' filepath='include/linux/sysctl.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dir' type-id='type-id-1591' visibility='default' filepath='include/linux/sysctl.h' line='161' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ctl_dir' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/sysctl.h' line='153' column='1' id='type-id-1591'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='header' type-id='type-id-1592' visibility='default' filepath='include/linux/sysctl.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='root' type-id='type-id-416' visibility='default' filepath='include/linux/sysctl.h' line='156' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ctl_table_header' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/sysctl.h' line='133' column='1' id='type-id-1592'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-1593' visibility='default' filepath='include/linux/sysctl.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='unregistering' type-id='type-id-1392' visibility='default' filepath='include/linux/sysctl.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ctl_table_arg' type-id='type-id-1594' visibility='default' filepath='include/linux/sysctl.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='root' type-id='type-id-1595' visibility='default' filepath='include/linux/sysctl.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='set' type-id='type-id-1596' visibility='default' filepath='include/linux/sysctl.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='parent' type-id='type-id-1597' visibility='default' filepath='include/linux/sysctl.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='node' type-id='type-id-1598' visibility='default' filepath='include/linux/sysctl.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='inodes' type-id='type-id-186' visibility='default' filepath='include/linux/sysctl.h' line='150' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__11' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/sysctl.h' line='135' column='1' id='type-id-1593'>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-1599' visibility='default' filepath='include/linux/sysctl.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/sysctl.h' line='142' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__19' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/sysctl.h' line='136' column='1' id='type-id-1599'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ctl_table' type-id='type-id-1594' visibility='default' filepath='include/linux/sysctl.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='used' type-id='type-id-17' visibility='default' filepath='include/linux/sysctl.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='count' type-id='type-id-17' visibility='default' filepath='include/linux/sysctl.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='nreg' type-id='type-id-17' visibility='default' filepath='include/linux/sysctl.h' line='140' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ctl_table' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/sysctl.h' line='113' column='1' id='type-id-1600'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='procname' type-id='type-id-4' visibility='default' filepath='include/linux/sysctl.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/sysctl.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='maxlen' type-id='type-id-17' visibility='default' filepath='include/linux/sysctl.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='mode' type-id='type-id-329' visibility='default' filepath='include/linux/sysctl.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='child' type-id='type-id-1594' visibility='default' filepath='include/linux/sysctl.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='proc_handler' type-id='type-id-1601' visibility='default' filepath='include/linux/sysctl.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='poll' type-id='type-id-1602' visibility='default' filepath='include/linux/sysctl.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='extra1' type-id='type-id-15' visibility='default' filepath='include/linux/sysctl.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='extra2' type-id='type-id-15' visibility='default' filepath='include/linux/sysctl.h' line='123' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='proc_handler' type-id='type-id-1603' filepath='include/linux/sysctl.h' line='40' column='1' id='type-id-1604'/>
+      <class-decl name='ctl_table_poll' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/sysctl.h' line='95' column='1' id='type-id-1605'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='event' type-id='type-id-26' visibility='default' filepath='include/linux/sysctl.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wait' type-id='type-id-225' visibility='default' filepath='include/linux/sysctl.h' line='97' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='completion' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/completion.h' line='26' column='1' id='type-id-1606'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='done' type-id='type-id-5' visibility='default' filepath='include/linux/completion.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wait' type-id='type-id-225' visibility='default' filepath='include/linux/completion.h' line='28' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ctl_table_root' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/sysctl.h' line='164' column='1' id='type-id-1607'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='default_set' type-id='type-id-1582' visibility='default' filepath='include/linux/sysctl.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='lookup' type-id='type-id-1608' visibility='default' filepath='include/linux/sysctl.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='set_ownership' type-id='type-id-1609' visibility='default' filepath='include/linux/sysctl.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='permissions' type-id='type-id-1610' visibility='default' filepath='include/linux/sysctl.h' line='170' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ctl_node' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/sysctl.h' line='126' column='1' id='type-id-1611'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-422' visibility='default' filepath='include/linux/sysctl.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='header' type-id='type-id-1583' visibility='default' filepath='include/linux/sysctl.h' line='128' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ucounts' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/user_namespace.h' line='81' column='1' id='type-id-1612'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-520' visibility='default' filepath='include/linux/user_namespace.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ns' type-id='type-id-915' visibility='default' filepath='include/linux/user_namespace.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='uid' type-id='type-id-42' visibility='default' filepath='include/linux/user_namespace.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='count' type-id='type-id-17' visibility='default' filepath='include/linux/user_namespace.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ucount' type-id='type-id-950' visibility='default' filepath='include/linux/user_namespace.h' line='86' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='prev_cputime' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='235' column='1' id='type-id-1509'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='utime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='stime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='238' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='include/linux/sched.h' line='239' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='task_cputime' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='253' column='1' id='type-id-1510'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='utime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='stime' type-id='type-id-40' visibility='default' filepath='include/linux/sched.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='sum_exec_runtime' type-id='type-id-98' visibility='default' filepath='include/linux/sched.h' line='256' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cred' size-in-bits='1344' is-struct='yes' visibility='default' filepath='include/linux/cred.h' line='116' column='1' id='type-id-1613'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='usage' type-id='type-id-26' visibility='default' filepath='include/linux/cred.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='uid' type-id='type-id-42' visibility='default' filepath='include/linux/cred.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='gid' type-id='type-id-330' visibility='default' filepath='include/linux/cred.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='suid' type-id='type-id-42' visibility='default' filepath='include/linux/cred.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='sgid' type-id='type-id-330' visibility='default' filepath='include/linux/cred.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='euid' type-id='type-id-42' visibility='default' filepath='include/linux/cred.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='egid' type-id='type-id-330' visibility='default' filepath='include/linux/cred.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='fsuid' type-id='type-id-42' visibility='default' filepath='include/linux/cred.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='fsgid' type-id='type-id-330' visibility='default' filepath='include/linux/cred.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='securebits' type-id='type-id-5' visibility='default' filepath='include/linux/cred.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='cap_inheritable' type-id='type-id-334' visibility='default' filepath='include/linux/cred.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='cap_permitted' type-id='type-id-334' visibility='default' filepath='include/linux/cred.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='cap_effective' type-id='type-id-334' visibility='default' filepath='include/linux/cred.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='cap_bset' type-id='type-id-334' visibility='default' filepath='include/linux/cred.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='cap_ambient' type-id='type-id-334' visibility='default' filepath='include/linux/cred.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='jit_keyring' type-id='type-id-216' visibility='default' filepath='include/linux/cred.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='session_keyring' type-id='type-id-1354' visibility='default' filepath='include/linux/cred.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='process_keyring' type-id='type-id-1354' visibility='default' filepath='include/linux/cred.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='thread_keyring' type-id='type-id-1354' visibility='default' filepath='include/linux/cred.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='request_key_auth' type-id='type-id-1354' visibility='default' filepath='include/linux/cred.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='security' type-id='type-id-15' visibility='default' filepath='include/linux/cred.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='user' type-id='type-id-1229' visibility='default' filepath='include/linux/cred.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='user_ns' type-id='type-id-915' visibility='default' filepath='include/linux/cred.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='group_info' type-id='type-id-1614' visibility='default' filepath='include/linux/cred.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='' type-id='type-id-1615' visibility='default' filepath='include/linux/cred.h' line='154' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='kernel_cap_t' type-id='type-id-1616' filepath='include/linux/capability.h' line='26' column='1' id='type-id-334'/>
+      <class-decl name='kernel_cap_struct' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/capability.h' line='24' column='1' id='type-id-1616'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cap' type-id='type-id-930' visibility='default' filepath='include/linux/capability.h' line='25' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='key' size-in-bits='1600' is-struct='yes' visibility='default' filepath='include/linux/key.h' line='155' column='1' id='type-id-1617'>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='165' column='1' id='type-id-1618'>
+              <data-member access='private'>
+                <var-decl name='expiry' type-id='type-id-1339' visibility='default' filepath='include/linux/key.h' line='166' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='revoked_at' type-id='type-id-1339' visibility='default' filepath='include/linux/key.h' line='167' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__1' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='202' column='1' id='type-id-1619'>
+              <data-member access='private'>
+                <var-decl name='index_key' type-id='type-id-1620' visibility='default' filepath='include/linux/key.h' line='203' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='' type-id='type-id-1621' visibility='default' filepath='include/linux/key.h' line='204' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+        <member-type access='public'>
+          <union-decl name='__anonymous_union__2' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='214' column='1' id='type-id-1622'>
+            <data-member access='private'>
+              <var-decl name='payload' type-id='type-id-1281' visibility='default' filepath='include/linux/key.h' line='215' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='' type-id='type-id-1623' visibility='default' filepath='include/linux/key.h' line='216' column='1'/>
+            </data-member>
+          </union-decl>
+        </member-type>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='usage' type-id='type-id-421' visibility='default' filepath='include/linux/key.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='serial' type-id='type-id-1624' visibility='default' filepath='include/linux/key.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='' type-id='type-id-1625' visibility='default' filepath='include/linux/key.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='sem' type-id='type-id-246' visibility='default' filepath='include/linux/key.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='user' type-id='type-id-1626' visibility='default' filepath='include/linux/key.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='security' type-id='type-id-15' visibility='default' filepath='include/linux/key.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='last_used_at' type-id='type-id-1339' visibility='default' filepath='include/linux/key.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='uid' type-id='type-id-42' visibility='default' filepath='include/linux/key.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='gid' type-id='type-id-330' visibility='default' filepath='include/linux/key.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='perm' type-id='type-id-1627' visibility='default' filepath='include/linux/key.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='quotalen' type-id='type-id-312' visibility='default' filepath='include/linux/key.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='944'>
+          <var-decl name='datalen' type-id='type-id-312' visibility='default' filepath='include/linux/key.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='state' type-id='type-id-261' visibility='default' filepath='include/linux/key.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/key.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='restrict_link' type-id='type-id-1628' visibility='default' filepath='include/linux/key.h' line='234' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='key_serial_t' type-id='type-id-1629' filepath='include/linux/key.h' line='33' column='1' id='type-id-1624'/>
+      <typedef-decl name='int32_t' type-id='type-id-738' filepath='include/linux/types.h' line='103' column='1' id='type-id-1629'/>
+      <typedef-decl name='key_perm_t' type-id='type-id-1341' filepath='include/linux/key.h' line='36' column='1' id='type-id-1627'/>
+      <class-decl name='keyring_index_key' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/key.h' line='88' column='1' id='type-id-1620'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-1630' visibility='default' filepath='include/linux/key.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='description' type-id='type-id-4' visibility='default' filepath='include/linux/key.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='desc_len' type-id='type-id-84' visibility='default' filepath='include/linux/key.h' line='91' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__20' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='204' column='1' id='type-id-1621'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-1630' visibility='default' filepath='include/linux/key.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='description' type-id='type-id-2' visibility='default' filepath='include/linux/key.h' line='206' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__21' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='216' column='1' id='type-id-1623'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name_link' type-id='type-id-20' visibility='default' filepath='include/linux/key.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='keys' type-id='type-id-1631' visibility='default' filepath='include/linux/key.h' line='219' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='assoc_array' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/assoc_array.h' line='26' column='1' id='type-id-1631'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='root' type-id='type-id-1632' visibility='default' filepath='include/linux/assoc_array.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nr_leaves_on_tree' type-id='type-id-16' visibility='default' filepath='include/linux/assoc_array.h' line='28' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='key_restriction' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/key.h' line='136' column='1' id='type-id-1633'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='check' type-id='type-id-1634' visibility='default' filepath='include/linux/key.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='key' type-id='type-id-1354' visibility='default' filepath='include/linux/key.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='keytype' type-id='type-id-1630' visibility='default' filepath='include/linux/key.h' line='139' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='key_restrict_link_func_t' type-id='type-id-1635' filepath='include/linux/key.h' line='131' column='1' id='type-id-1634'/>
+      <class-decl name='user_struct' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/linux/sched/user.h' line='15' column='1' id='type-id-1636'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='__count' type-id='type-id-421' visibility='default' filepath='include/linux/sched/user.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='processes' type-id='type-id-26' visibility='default' filepath='include/linux/sched/user.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sigpending' type-id='type-id-26' visibility='default' filepath='include/linux/sched/user.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='epoll_watches' type-id='type-id-115' visibility='default' filepath='include/linux/sched/user.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='locked_shm' type-id='type-id-16' visibility='default' filepath='include/linux/sched/user.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='unix_inflight' type-id='type-id-16' visibility='default' filepath='include/linux/sched/user.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='pipe_bufs' type-id='type-id-115' visibility='default' filepath='include/linux/sched/user.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='uid_keyring' type-id='type-id-1354' visibility='default' filepath='include/linux/sched/user.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='session_keyring' type-id='type-id-1354' visibility='default' filepath='include/linux/sched/user.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='uidhash_node' type-id='type-id-520' visibility='default' filepath='include/linux/sched/user.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='uid' type-id='type-id-42' visibility='default' filepath='include/linux/sched/user.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='locked_vm' type-id='type-id-115' visibility='default' filepath='include/linux/sched/user.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='ratelimit' type-id='type-id-1637' visibility='default' filepath='include/linux/sched/user.h' line='48' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ratelimit_state' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/ratelimit.h' line='15' column='1' id='type-id-1637'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='include/linux/ratelimit.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='interval' type-id='type-id-17' visibility='default' filepath='include/linux/ratelimit.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='burst' type-id='type-id-17' visibility='default' filepath='include/linux/ratelimit.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='printed' type-id='type-id-17' visibility='default' filepath='include/linux/ratelimit.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='missed' type-id='type-id-17' visibility='default' filepath='include/linux/ratelimit.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='begin' type-id='type-id-16' visibility='default' filepath='include/linux/ratelimit.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/ratelimit.h' line='23' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='group_info' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/cred.h' line='30' column='1' id='type-id-1638'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='usage' type-id='type-id-26' visibility='default' filepath='include/linux/cred.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ngroups' type-id='type-id-17' visibility='default' filepath='include/linux/cred.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='gid' type-id='type-id-1138' visibility='default' filepath='include/linux/cred.h' line='33' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nsproxy' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/nsproxy.h' line='31' column='1' id='type-id-1639'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-26' visibility='default' filepath='include/linux/nsproxy.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='uts_ns' type-id='type-id-1640' visibility='default' filepath='include/linux/nsproxy.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ipc_ns' type-id='type-id-1641' visibility='default' filepath='include/linux/nsproxy.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mnt_ns' type-id='type-id-1642' visibility='default' filepath='include/linux/nsproxy.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='pid_ns_for_children' type-id='type-id-693' visibility='default' filepath='include/linux/nsproxy.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='net_ns' type-id='type-id-1643' visibility='default' filepath='include/linux/nsproxy.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='cgroup_ns' type-id='type-id-1644' visibility='default' filepath='include/linux/nsproxy.h' line='38' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='net' size-in-bits='42496' is-struct='yes' visibility='default' filepath='include/net/net_namespace.h' line='51' column='1' id='type-id-1645'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='passive' type-id='type-id-421' visibility='default' filepath='include/net/net_namespace.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='count' type-id='type-id-421' visibility='default' filepath='include/net/net_namespace.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rules_mod_lock' type-id='type-id-247' visibility='default' filepath='include/net/net_namespace.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='hash_mix' type-id='type-id-7' visibility='default' filepath='include/net/net_namespace.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cookie_gen' type-id='type-id-113' visibility='default' filepath='include/net/net_namespace.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/net_namespace.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='exit_list' type-id='type-id-20' visibility='default' filepath='include/net/net_namespace.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='cleanup_list' type-id='type-id-281' visibility='default' filepath='include/net/net_namespace.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='user_ns' type-id='type-id-915' visibility='default' filepath='include/net/net_namespace.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='ucounts' type-id='type-id-1578' visibility='default' filepath='include/net/net_namespace.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='nsid_lock' type-id='type-id-247' visibility='default' filepath='include/net/net_namespace.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='netns_ids' type-id='type-id-1432' visibility='default' filepath='include/net/net_namespace.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='ns' type-id='type-id-903' visibility='default' filepath='include/net/net_namespace.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='proc_net' type-id='type-id-262' visibility='default' filepath='include/net/net_namespace.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='proc_net_stat' type-id='type-id-262' visibility='default' filepath='include/net/net_namespace.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='sysctls' type-id='type-id-1582' visibility='default' filepath='include/net/net_namespace.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='rtnl' type-id='type-id-1646' visibility='default' filepath='include/net/net_namespace.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='genl_sock' type-id='type-id-1646' visibility='default' filepath='include/net/net_namespace.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='uevent_sock' type-id='type-id-1647' visibility='default' filepath='include/net/net_namespace.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='dev_base_head' type-id='type-id-20' visibility='default' filepath='include/net/net_namespace.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='dev_name_head' type-id='type-id-746' visibility='default' filepath='include/net/net_namespace.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='dev_index_head' type-id='type-id-746' visibility='default' filepath='include/net/net_namespace.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='dev_base_seq' type-id='type-id-5' visibility='default' filepath='include/net/net_namespace.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2464'>
+          <var-decl name='ifindex' type-id='type-id-17' visibility='default' filepath='include/net/net_namespace.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='dev_unreg_count' type-id='type-id-5' visibility='default' filepath='include/net/net_namespace.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='rules_ops' type-id='type-id-20' visibility='default' filepath='include/net/net_namespace.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='fib_notifier_ops' type-id='type-id-20' visibility='default' filepath='include/net/net_namespace.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='loopback_dev' type-id='type-id-1648' visibility='default' filepath='include/net/net_namespace.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='core' type-id='type-id-1649' visibility='default' filepath='include/net/net_namespace.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='mib' type-id='type-id-1650' visibility='default' filepath='include/net/net_namespace.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='packet' type-id='type-id-1651' visibility='default' filepath='include/net/net_namespace.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='unx' type-id='type-id-1652' visibility='default' filepath='include/net/net_namespace.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='ipv4' type-id='type-id-1653' visibility='default' filepath='include/net/net_namespace.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14336'>
+          <var-decl name='ipv6' type-id='type-id-1654' visibility='default' filepath='include/net/net_namespace.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23040'>
+          <var-decl name='nf' type-id='type-id-1655' visibility='default' filepath='include/net/net_namespace.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24960'>
+          <var-decl name='xt' type-id='type-id-1656' visibility='default' filepath='include/net/net_namespace.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26688'>
+          <var-decl name='ct' type-id='type-id-1657' visibility='default' filepath='include/net/net_namespace.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31232'>
+          <var-decl name='nf_frag' type-id='type-id-1658' visibility='default' filepath='include/net/net_namespace.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33792'>
+          <var-decl name='nf_frag_frags_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/net_namespace.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33856'>
+          <var-decl name='nfnl' type-id='type-id-1646' visibility='default' filepath='include/net/net_namespace.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33920'>
+          <var-decl name='nfnl_stash' type-id='type-id-1646' visibility='default' filepath='include/net/net_namespace.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33984'>
+          <var-decl name='wext_nlevents' type-id='type-id-1659' visibility='default' filepath='include/net/net_namespace.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='34176'>
+          <var-decl name='gen' type-id='type-id-1660' visibility='default' filepath='include/net/net_namespace.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='34304'>
+          <var-decl name='xfrm' type-id='type-id-1661' visibility='default' filepath='include/net/net_namespace.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40960'>
+          <var-decl name='can' type-id='type-id-1662' visibility='default' filepath='include/net/net_namespace.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='42304'>
+          <var-decl name='diag_nlsk' type-id='type-id-1646' visibility='default' filepath='include/net/net_namespace.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='42368'>
+          <var-decl name='fnhe_genid' type-id='type-id-26' visibility='default' filepath='include/net/net_namespace.h' line='163' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='net_device' size-in-bits='17408' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='1745' column='1' id='type-id-1663'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-43' visibility='default' filepath='include/linux/netdevice.h' line='1746' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name_hlist' type-id='type-id-520' visibility='default' filepath='include/linux/netdevice.h' line='1747' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ifalias' type-id='type-id-1664' visibility='default' filepath='include/linux/netdevice.h' line='1748' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mem_end' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='1753' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='mem_start' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='1754' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='base_addr' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='1755' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='irq' type-id='type-id-17' visibility='default' filepath='include/linux/netdevice.h' line='1756' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='state' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='1764' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='dev_list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='1766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='napi_list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='1767' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='unreg_list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='1768' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='close_list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='1769' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='ptype_all' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='1770' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='ptype_specific' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='1771' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='adj_list' type-id='type-id-1665' visibility='default' filepath='include/linux/netdevice.h' line='1776' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='features' type-id='type-id-1666' visibility='default' filepath='include/linux/netdevice.h' line='1778' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='hw_features' type-id='type-id-1666' visibility='default' filepath='include/linux/netdevice.h' line='1779' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='wanted_features' type-id='type-id-1666' visibility='default' filepath='include/linux/netdevice.h' line='1780' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='vlan_features' type-id='type-id-1666' visibility='default' filepath='include/linux/netdevice.h' line='1781' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='hw_enc_features' type-id='type-id-1666' visibility='default' filepath='include/linux/netdevice.h' line='1782' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='mpls_features' type-id='type-id-1666' visibility='default' filepath='include/linux/netdevice.h' line='1783' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='gso_partial_features' type-id='type-id-1666' visibility='default' filepath='include/linux/netdevice.h' line='1784' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='ifindex' type-id='type-id-17' visibility='default' filepath='include/linux/netdevice.h' line='1786' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2144'>
+          <var-decl name='group' type-id='type-id-17' visibility='default' filepath='include/linux/netdevice.h' line='1787' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='stats' type-id='type-id-1667' visibility='default' filepath='include/linux/netdevice.h' line='1789' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='rx_dropped' type-id='type-id-115' visibility='default' filepath='include/linux/netdevice.h' line='1791' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='tx_dropped' type-id='type-id-115' visibility='default' filepath='include/linux/netdevice.h' line='1792' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='rx_nohandler' type-id='type-id-115' visibility='default' filepath='include/linux/netdevice.h' line='1793' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='carrier_up_count' type-id='type-id-26' visibility='default' filepath='include/linux/netdevice.h' line='1796' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3872'>
+          <var-decl name='carrier_down_count' type-id='type-id-26' visibility='default' filepath='include/linux/netdevice.h' line='1797' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3904'>
+          <var-decl name='wireless_handlers' type-id='type-id-1668' visibility='default' filepath='include/linux/netdevice.h' line='1800' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='wireless_data' type-id='type-id-1669' visibility='default' filepath='include/linux/netdevice.h' line='1801' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='netdev_ops' type-id='type-id-1670' visibility='default' filepath='include/linux/netdevice.h' line='1803' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='ethtool_ops' type-id='type-id-1671' visibility='default' filepath='include/linux/netdevice.h' line='1804' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='ndisc_ops' type-id='type-id-1672' visibility='default' filepath='include/linux/netdevice.h' line='1812' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='header_ops' type-id='type-id-1673' visibility='default' filepath='include/linux/netdevice.h' line='1823' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1825' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4320'>
+          <var-decl name='priv_flags' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1826' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='gflags' type-id='type-id-312' visibility='default' filepath='include/linux/netdevice.h' line='1828' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4368'>
+          <var-decl name='padded' type-id='type-id-312' visibility='default' filepath='include/linux/netdevice.h' line='1829' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4384'>
+          <var-decl name='operstate' type-id='type-id-216' visibility='default' filepath='include/linux/netdevice.h' line='1831' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4392'>
+          <var-decl name='link_mode' type-id='type-id-216' visibility='default' filepath='include/linux/netdevice.h' line='1832' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4400'>
+          <var-decl name='if_port' type-id='type-id-216' visibility='default' filepath='include/linux/netdevice.h' line='1834' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4408'>
+          <var-decl name='dma' type-id='type-id-216' visibility='default' filepath='include/linux/netdevice.h' line='1835' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='mtu' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1842' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4448'>
+          <var-decl name='min_mtu' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1843' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='max_mtu' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1844' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4512'>
+          <var-decl name='type' type-id='type-id-312' visibility='default' filepath='include/linux/netdevice.h' line='1845' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4528'>
+          <var-decl name='hard_header_len' type-id='type-id-312' visibility='default' filepath='include/linux/netdevice.h' line='1846' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='min_header_len' type-id='type-id-216' visibility='default' filepath='include/linux/netdevice.h' line='1847' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4560'>
+          <var-decl name='needed_headroom' type-id='type-id-312' visibility='default' filepath='include/linux/netdevice.h' line='1849' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4576'>
+          <var-decl name='needed_tailroom' type-id='type-id-312' visibility='default' filepath='include/linux/netdevice.h' line='1850' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4592'>
+          <var-decl name='perm_addr' type-id='type-id-35' visibility='default' filepath='include/linux/netdevice.h' line='1853' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4848'>
+          <var-decl name='addr_assign_type' type-id='type-id-216' visibility='default' filepath='include/linux/netdevice.h' line='1854' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4856'>
+          <var-decl name='addr_len' type-id='type-id-216' visibility='default' filepath='include/linux/netdevice.h' line='1855' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='neigh_priv_len' type-id='type-id-312' visibility='default' filepath='include/linux/netdevice.h' line='1856' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4880'>
+          <var-decl name='dev_id' type-id='type-id-312' visibility='default' filepath='include/linux/netdevice.h' line='1857' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4896'>
+          <var-decl name='dev_port' type-id='type-id-312' visibility='default' filepath='include/linux/netdevice.h' line='1858' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='addr_list_lock' type-id='type-id-247' visibility='default' filepath='include/linux/netdevice.h' line='1859' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4960'>
+          <var-decl name='name_assign_type' type-id='type-id-216' visibility='default' filepath='include/linux/netdevice.h' line='1860' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4968'>
+          <var-decl name='uc_promisc' type-id='type-id-33' visibility='default' filepath='include/linux/netdevice.h' line='1861' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='uc' type-id='type-id-1674' visibility='default' filepath='include/linux/netdevice.h' line='1862' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='mc' type-id='type-id-1674' visibility='default' filepath='include/linux/netdevice.h' line='1863' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='dev_addrs' type-id='type-id-1674' visibility='default' filepath='include/linux/netdevice.h' line='1864' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='queues_kset' type-id='type-id-1393' visibility='default' filepath='include/linux/netdevice.h' line='1867' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5632'>
+          <var-decl name='promiscuity' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1869' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5664'>
+          <var-decl name='allmulti' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1870' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5696'>
+          <var-decl name='tipc_ptr' type-id='type-id-1675' visibility='default' filepath='include/linux/netdevice.h' line='1882' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='ip_ptr' type-id='type-id-1676' visibility='default' filepath='include/linux/netdevice.h' line='1887' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='ip6_ptr' type-id='type-id-1677' visibility='default' filepath='include/linux/netdevice.h' line='1891' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='ieee80211_ptr' type-id='type-id-1678' visibility='default' filepath='include/linux/netdevice.h' line='1895' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5952'>
+          <var-decl name='ieee802154_ptr' type-id='type-id-1679' visibility='default' filepath='include/linux/netdevice.h' line='1896' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='dev_addr' type-id='type-id-256' visibility='default' filepath='include/linux/netdevice.h' line='1905' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='_rx' type-id='type-id-1680' visibility='default' filepath='include/linux/netdevice.h' line='1907' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='num_rx_queues' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1908' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6176'>
+          <var-decl name='real_num_rx_queues' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1909' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='xdp_prog' type-id='type-id-1228' visibility='default' filepath='include/linux/netdevice.h' line='1911' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='gro_flush_timeout' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='1912' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='rx_handler' type-id='type-id-1681' visibility='default' filepath='include/linux/netdevice.h' line='1913' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='rx_handler_data' type-id='type-id-15' visibility='default' filepath='include/linux/netdevice.h' line='1914' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='miniq_ingress' type-id='type-id-1682' visibility='default' filepath='include/linux/netdevice.h' line='1917' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='ingress_queue' type-id='type-id-1683' visibility='default' filepath='include/linux/netdevice.h' line='1919' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='nf_hooks_ingress' type-id='type-id-1151' visibility='default' filepath='include/linux/netdevice.h' line='1921' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='broadcast' type-id='type-id-35' visibility='default' filepath='include/linux/netdevice.h' line='1924' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6912'>
+          <var-decl name='rx_cpu_rmap' type-id='type-id-1684' visibility='default' filepath='include/linux/netdevice.h' line='1926' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6976'>
+          <var-decl name='index_hlist' type-id='type-id-520' visibility='default' filepath='include/linux/netdevice.h' line='1928' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7168'>
+          <var-decl name='_tx' type-id='type-id-1683' visibility='default' filepath='include/linux/netdevice.h' line='1933' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7232'>
+          <var-decl name='num_tx_queues' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1934' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7264'>
+          <var-decl name='real_num_tx_queues' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1935' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7296'>
+          <var-decl name='qdisc' type-id='type-id-1685' visibility='default' filepath='include/linux/netdevice.h' line='1936' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7360'>
+          <var-decl name='qdisc_hash' type-id='type-id-1121' visibility='default' filepath='include/linux/netdevice.h' line='1938' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8384'>
+          <var-decl name='tx_queue_len' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='1940' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8416'>
+          <var-decl name='tx_global_lock' type-id='type-id-247' visibility='default' filepath='include/linux/netdevice.h' line='1941' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8448'>
+          <var-decl name='watchdog_timeo' type-id='type-id-17' visibility='default' filepath='include/linux/netdevice.h' line='1942' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8512'>
+          <var-decl name='xps_cpus_map' type-id='type-id-1686' visibility='default' filepath='include/linux/netdevice.h' line='1945' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8576'>
+          <var-decl name='xps_rxqs_map' type-id='type-id-1686' visibility='default' filepath='include/linux/netdevice.h' line='1946' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8640'>
+          <var-decl name='miniq_egress' type-id='type-id-1682' visibility='default' filepath='include/linux/netdevice.h' line='1949' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8704'>
+          <var-decl name='watchdog_timer' type-id='type-id-417' visibility='default' filepath='include/linux/netdevice.h' line='1953' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9024'>
+          <var-decl name='pcpu_refcnt' type-id='type-id-666' visibility='default' filepath='include/linux/netdevice.h' line='1955' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9088'>
+          <var-decl name='todo_list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='1956' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9216'>
+          <var-decl name='link_watch_list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='1958' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='reg_state' type-id='type-id-1687' visibility='default' filepath='include/linux/netdevice.h' line='1966' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9352'>
+          <var-decl name='dismantle' type-id='type-id-33' visibility='default' filepath='include/linux/netdevice.h' line='1968' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9344'>
+          <var-decl name='rtnl_link_state' type-id='type-id-1688' visibility='default' filepath='include/linux/netdevice.h' line='1973' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9376'>
+          <var-decl name='needs_free_netdev' type-id='type-id-33' visibility='default' filepath='include/linux/netdevice.h' line='1975' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9408'>
+          <var-decl name='priv_destructor' type-id='type-id-1689' visibility='default' filepath='include/linux/netdevice.h' line='1976' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9472'>
+          <var-decl name='nd_net' type-id='type-id-1690' visibility='default' filepath='include/linux/netdevice.h' line='1982' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9472'>
+          <var-decl name='' type-id='type-id-1691' visibility='default' filepath='include/linux/netdevice.h' line='1985' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9536'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/netdevice.h' line='2000' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15744'>
+          <var-decl name='sysfs_groups' type-id='type-id-1114' visibility='default' filepath='include/linux/netdevice.h' line='2001' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16000'>
+          <var-decl name='sysfs_rx_queue_group' type-id='type-id-892' visibility='default' filepath='include/linux/netdevice.h' line='2002' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16064'>
+          <var-decl name='rtnl_link_ops' type-id='type-id-1692' visibility='default' filepath='include/linux/netdevice.h' line='2004' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16128'>
+          <var-decl name='gso_max_size' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='2008' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16160'>
+          <var-decl name='gso_max_segs' type-id='type-id-688' visibility='default' filepath='include/linux/netdevice.h' line='2010' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16176'>
+          <var-decl name='num_tc' type-id='type-id-1693' visibility='default' filepath='include/linux/netdevice.h' line='2015' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16192'>
+          <var-decl name='tc_to_txq' type-id='type-id-1150' visibility='default' filepath='include/linux/netdevice.h' line='2016' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16704'>
+          <var-decl name='prio_tc_map' type-id='type-id-1180' visibility='default' filepath='include/linux/netdevice.h' line='2017' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16832'>
+          <var-decl name='phydev' type-id='type-id-1694' visibility='default' filepath='include/linux/netdevice.h' line='2025' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16896'>
+          <var-decl name='sfp_bus' type-id='type-id-1695' visibility='default' filepath='include/linux/netdevice.h' line='2026' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16960'>
+          <var-decl name='qdisc_tx_busylock' type-id='type-id-1696' visibility='default' filepath='include/linux/netdevice.h' line='2027' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17024'>
+          <var-decl name='qdisc_running_key' type-id='type-id-1696' visibility='default' filepath='include/linux/netdevice.h' line='2028' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17088'>
+          <var-decl name='proto_down' type-id='type-id-33' visibility='default' filepath='include/linux/netdevice.h' line='2029' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23'>
+          <var-decl name='wol_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='2030' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dev_ifalias' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='916' column='1' id='type-id-1697'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcuhead' type-id='type-id-385' visibility='default' filepath='include/linux/netdevice.h' line='917' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ifalias' type-id='type-id-440' visibility='default' filepath='include/linux/netdevice.h' line='918' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__22' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='1773' column='1' id='type-id-1665'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='upper' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='1774' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lower' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='1775' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='netdev_features_t' type-id='type-id-40' filepath='include/linux/netdev_features.h' line='17' column='1' id='type-id-1666'/>
+      <class-decl name='net_device_stats' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='165' column='1' id='type-id-1667'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rx_packets' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tx_packets' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rx_bytes' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tx_bytes' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rx_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='tx_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='rx_dropped' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='tx_dropped' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='multicast' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='collisions' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='rx_length_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='rx_over_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='rx_crc_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='rx_frame_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='rx_fifo_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='rx_missed_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='tx_aborted_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='tx_carrier_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='tx_fifo_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='tx_heartbeat_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='tx_window_errors' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='rx_compressed' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='tx_compressed' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='188' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='net_device_ops' size-in-bits='4096' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='1225' column='1' id='type-id-1698'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ndo_init' type-id='type-id-1699' visibility='default' filepath='include/linux/netdevice.h' line='1226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ndo_uninit' type-id='type-id-1689' visibility='default' filepath='include/linux/netdevice.h' line='1227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ndo_open' type-id='type-id-1699' visibility='default' filepath='include/linux/netdevice.h' line='1228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ndo_stop' type-id='type-id-1699' visibility='default' filepath='include/linux/netdevice.h' line='1229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ndo_start_xmit' type-id='type-id-1700' visibility='default' filepath='include/linux/netdevice.h' line='1230' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ndo_features_check' type-id='type-id-1701' visibility='default' filepath='include/linux/netdevice.h' line='1232' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ndo_select_queue' type-id='type-id-1702' visibility='default' filepath='include/linux/netdevice.h' line='1235' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ndo_change_rx_flags' type-id='type-id-1703' visibility='default' filepath='include/linux/netdevice.h' line='1239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='ndo_set_rx_mode' type-id='type-id-1689' visibility='default' filepath='include/linux/netdevice.h' line='1241' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='ndo_set_mac_address' type-id='type-id-1704' visibility='default' filepath='include/linux/netdevice.h' line='1242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='ndo_validate_addr' type-id='type-id-1699' visibility='default' filepath='include/linux/netdevice.h' line='1244' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='ndo_do_ioctl' type-id='type-id-1705' visibility='default' filepath='include/linux/netdevice.h' line='1245' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='ndo_set_config' type-id='type-id-1706' visibility='default' filepath='include/linux/netdevice.h' line='1247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='ndo_change_mtu' type-id='type-id-1707' visibility='default' filepath='include/linux/netdevice.h' line='1249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='ndo_neigh_setup' type-id='type-id-1708' visibility='default' filepath='include/linux/netdevice.h' line='1251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='ndo_tx_timeout' type-id='type-id-1689' visibility='default' filepath='include/linux/netdevice.h' line='1253' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='ndo_get_stats64' type-id='type-id-1709' visibility='default' filepath='include/linux/netdevice.h' line='1255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='ndo_has_offload_stats' type-id='type-id-1710' visibility='default' filepath='include/linux/netdevice.h' line='1257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='ndo_get_offload_stats' type-id='type-id-1711' visibility='default' filepath='include/linux/netdevice.h' line='1258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='ndo_get_stats' type-id='type-id-1712' visibility='default' filepath='include/linux/netdevice.h' line='1261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='ndo_vlan_rx_add_vid' type-id='type-id-1713' visibility='default' filepath='include/linux/netdevice.h' line='1263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='ndo_vlan_rx_kill_vid' type-id='type-id-1713' visibility='default' filepath='include/linux/netdevice.h' line='1265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='ndo_set_vf_mac' type-id='type-id-1714' visibility='default' filepath='include/linux/netdevice.h' line='1273' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='ndo_set_vf_vlan' type-id='type-id-1715' visibility='default' filepath='include/linux/netdevice.h' line='1275' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='ndo_set_vf_rate' type-id='type-id-1716' visibility='default' filepath='include/linux/netdevice.h' line='1278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='ndo_set_vf_spoofchk' type-id='type-id-1717' visibility='default' filepath='include/linux/netdevice.h' line='1281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='ndo_set_vf_trust' type-id='type-id-1717' visibility='default' filepath='include/linux/netdevice.h' line='1283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='ndo_get_vf_config' type-id='type-id-1718' visibility='default' filepath='include/linux/netdevice.h' line='1285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='ndo_set_vf_link_state' type-id='type-id-1719' visibility='default' filepath='include/linux/netdevice.h' line='1288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='ndo_get_vf_stats' type-id='type-id-1720' visibility='default' filepath='include/linux/netdevice.h' line='1290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='ndo_set_vf_port' type-id='type-id-1721' visibility='default' filepath='include/linux/netdevice.h' line='1294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='ndo_get_vf_port' type-id='type-id-1722' visibility='default' filepath='include/linux/netdevice.h' line='1297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='ndo_set_vf_guid' type-id='type-id-1723' visibility='default' filepath='include/linux/netdevice.h' line='1299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='ndo_set_vf_rss_query_en' type-id='type-id-1717' visibility='default' filepath='include/linux/netdevice.h' line='1302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='ndo_setup_tc' type-id='type-id-1724' visibility='default' filepath='include/linux/netdevice.h' line='1305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='ndo_rx_flow_steer' type-id='type-id-1725' visibility='default' filepath='include/linux/netdevice.h' line='1333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='ndo_add_slave' type-id='type-id-1726' visibility='default' filepath='include/linux/netdevice.h' line='1338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='ndo_del_slave' type-id='type-id-1727' visibility='default' filepath='include/linux/netdevice.h' line='1341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='ndo_fix_features' type-id='type-id-1728' visibility='default' filepath='include/linux/netdevice.h' line='1343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='ndo_set_features' type-id='type-id-1729' visibility='default' filepath='include/linux/netdevice.h' line='1345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='ndo_neigh_construct' type-id='type-id-1730' visibility='default' filepath='include/linux/netdevice.h' line='1347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='ndo_neigh_destroy' type-id='type-id-1731' visibility='default' filepath='include/linux/netdevice.h' line='1349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='ndo_fdb_add' type-id='type-id-1732' visibility='default' filepath='include/linux/netdevice.h' line='1352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='ndo_fdb_del' type-id='type-id-1733' visibility='default' filepath='include/linux/netdevice.h' line='1358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='ndo_fdb_dump' type-id='type-id-1734' visibility='default' filepath='include/linux/netdevice.h' line='1363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='ndo_bridge_setlink' type-id='type-id-1735' visibility='default' filepath='include/linux/netdevice.h' line='1369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='ndo_bridge_getlink' type-id='type-id-1736' visibility='default' filepath='include/linux/netdevice.h' line='1372' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='ndo_bridge_dellink' type-id='type-id-1735' visibility='default' filepath='include/linux/netdevice.h' line='1377' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='ndo_change_carrier' type-id='type-id-1737' visibility='default' filepath='include/linux/netdevice.h' line='1380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='ndo_get_phys_port_id' type-id='type-id-1738' visibility='default' filepath='include/linux/netdevice.h' line='1382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='ndo_get_phys_port_name' type-id='type-id-1739' visibility='default' filepath='include/linux/netdevice.h' line='1384' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='ndo_udp_tunnel_add' type-id='type-id-1740' visibility='default' filepath='include/linux/netdevice.h' line='1386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='ndo_udp_tunnel_del' type-id='type-id-1740' visibility='default' filepath='include/linux/netdevice.h' line='1388' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='ndo_dfwd_add_station' type-id='type-id-1741' visibility='default' filepath='include/linux/netdevice.h' line='1390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='ndo_dfwd_del_station' type-id='type-id-1742' visibility='default' filepath='include/linux/netdevice.h' line='1392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='ndo_get_lock_subclass' type-id='type-id-1699' visibility='default' filepath='include/linux/netdevice.h' line='1395' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='ndo_set_tx_maxrate' type-id='type-id-1743' visibility='default' filepath='include/linux/netdevice.h' line='1396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='ndo_get_iflink' type-id='type-id-1744' visibility='default' filepath='include/linux/netdevice.h' line='1399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='ndo_change_proto_down' type-id='type-id-1737' visibility='default' filepath='include/linux/netdevice.h' line='1400' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='ndo_fill_metadata_dst' type-id='type-id-1745' visibility='default' filepath='include/linux/netdevice.h' line='1402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='ndo_set_rx_headroom' type-id='type-id-1703' visibility='default' filepath='include/linux/netdevice.h' line='1404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3904'>
+          <var-decl name='ndo_bpf' type-id='type-id-1746' visibility='default' filepath='include/linux/netdevice.h' line='1406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='ndo_xdp_xmit' type-id='type-id-1747' visibility='default' filepath='include/linux/netdevice.h' line='1408' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='ndo_xsk_async_xmit' type-id='type-id-1748' visibility='default' filepath='include/linux/netdevice.h' line='1411' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='netdev_tx_t' type-id='type-id-1749' filepath='include/linux/netdevice.h' line='116' column='1' id='type-id-1750'/>
+      <enum-decl name='netdev_tx' filepath='include/linux/netdevice.h' line='111' column='1' id='type-id-1749'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='__NETDEV_TX_MIN' value='-2147483648'/>
+        <enumerator name='NETDEV_TX_OK' value='0'/>
+        <enumerator name='NETDEV_TX_BUSY' value='16'/>
+      </enum-decl>
+      <class-decl name='sk_buff' size-in-bits='1792' is-struct='yes' visibility='default' filepath='include/linux/skbuff.h' line='665' column='1' id='type-id-1751'>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='685' column='1' id='type-id-1752'>
+              <data-member access='private'>
+                <var-decl name='sk' type-id='type-id-1646' visibility='default' filepath='include/linux/skbuff.h' line='686' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='ip_defrag_offset' type-id='type-id-17' visibility='default' filepath='include/linux/skbuff.h' line='687' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='690' column='1' id='type-id-1753'>
+              <data-member access='private'>
+                <var-decl name='tstamp' type-id='type-id-682' visibility='default' filepath='include/linux/skbuff.h' line='691' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='skb_mstamp' type-id='type-id-40' visibility='default' filepath='include/linux/skbuff.h' line='692' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='702' column='1' id='type-id-1754'>
+              <data-member access='private'>
+                <var-decl name='' type-id='type-id-1755' visibility='default' filepath='include/linux/skbuff.h' line='703' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='tcp_tsorted_anchor' type-id='type-id-20' visibility='default' filepath='include/linux/skbuff.h' line='707' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__3' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='807' column='1' id='type-id-1756'>
+              <data-member access='private'>
+                <var-decl name='csum' type-id='type-id-1757' visibility='default' filepath='include/linux/skbuff.h' line='808' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='' type-id='type-id-1758' visibility='default' filepath='include/linux/skbuff.h' line='809' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__4' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='820' column='1' id='type-id-1759'>
+              <data-member access='private'>
+                <var-decl name='napi_id' type-id='type-id-5' visibility='default' filepath='include/linux/skbuff.h' line='821' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='sender_cpu' type-id='type-id-5' visibility='default' filepath='include/linux/skbuff.h' line='822' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__5' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='829' column='1' id='type-id-1760'>
+              <data-member access='private'>
+                <var-decl name='mark' type-id='type-id-511' visibility='default' filepath='include/linux/skbuff.h' line='830' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='reserved_tailroom' type-id='type-id-511' visibility='default' filepath='include/linux/skbuff.h' line='831' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+        <member-type access='public'>
+          <union-decl name='__anonymous_union__6' size-in-bits='16' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='834' column='1' id='type-id-1761'>
+            <data-member access='private'>
+              <var-decl name='inner_protocol' type-id='type-id-924' visibility='default' filepath='include/linux/skbuff.h' line='835' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='inner_ipproto' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='836' column='1'/>
+            </data-member>
+          </union-decl>
+        </member-type>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-1762' visibility='default' filepath='include/linux/skbuff.h' line='666' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='cb' type-id='type-id-970' visibility='default' filepath='include/linux/skbuff.h' line='700' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='sp' type-id='type-id-1763' visibility='default' filepath='include/linux/skbuff.h' line='711' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='_nfct' type-id='type-id-16' visibility='default' filepath='include/linux/skbuff.h' line='714' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='len' type-id='type-id-5' visibility='default' filepath='include/linux/skbuff.h' line='719' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='data_len' type-id='type-id-5' visibility='default' filepath='include/linux/skbuff.h' line='720' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='mac_len' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='721' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1040'>
+          <var-decl name='hdr_len' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='722' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='queue_mapping' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='727' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1072'>
+          <var-decl name='__cloned_offset' type-id='type-id-944' visibility='default' filepath='include/linux/skbuff.h' line='737' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='cloned' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='738' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='nohdr' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='739' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='fclone' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='740' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='peeked' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='741' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2'>
+          <var-decl name='head_frag' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='742' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1'>
+          <var-decl name='xmit_more' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='743' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1072'>
+          <var-decl name='pfmemalloc' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='744' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='headers_start' type-id='type-id-934' visibility='default' filepath='include/linux/skbuff.h' line='750' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='__pkt_type_offset' type-id='type-id-944' visibility='default' filepath='include/linux/skbuff.h' line='761' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='pkt_type' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='762' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='ignore_df' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='763' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='nf_trace' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='764' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1'>
+          <var-decl name='ip_summed' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='765' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='ooo_okay' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='l4_hash' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='768' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='sw_hash' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='769' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='wifi_acked_valid' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='770' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='wifi_acked' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='771' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='no_fcs' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='772' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2'>
+          <var-decl name='encapsulation' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='774' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1'>
+          <var-decl name='encap_hdr_csum' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='775' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1096'>
+          <var-decl name='csum_valid' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='776' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='csum_complete_sw' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='778' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='csum_level' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='779' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='csum_not_inet' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='780' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='dst_pending_confirm' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='781' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1'>
+          <var-decl name='ndisc_nodetype' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='783' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1104'>
+          <var-decl name='ipvs_property' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='785' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='inner_protocol_type' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='787' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='remcsum_offload' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='788' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='tc_skip_classify' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='794' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='tc_at_ingress' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='795' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='tc_redirected' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='796' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2'>
+          <var-decl name='tc_from_ingress' type-id='type-id-893' visibility='default' filepath='include/linux/skbuff.h' line='797' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='tc_index' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='804' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='priority' type-id='type-id-511' visibility='default' filepath='include/linux/skbuff.h' line='814' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='skb_iif' type-id='type-id-17' visibility='default' filepath='include/linux/skbuff.h' line='815' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1248'>
+          <var-decl name='hash' type-id='type-id-511' visibility='default' filepath='include/linux/skbuff.h' line='816' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='vlan_proto' type-id='type-id-924' visibility='default' filepath='include/linux/skbuff.h' line='817' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1296'>
+          <var-decl name='vlan_tci' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='818' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='secmark' type-id='type-id-511' visibility='default' filepath='include/linux/skbuff.h' line='826' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1424'>
+          <var-decl name='inner_transport_header' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='839' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1440'>
+          <var-decl name='inner_network_header' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='840' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1456'>
+          <var-decl name='inner_mac_header' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='841' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='protocol' type-id='type-id-924' visibility='default' filepath='include/linux/skbuff.h' line='843' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1488'>
+          <var-decl name='transport_header' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='844' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='network_header' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='845' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1520'>
+          <var-decl name='mac_header' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='846' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='headers_end' type-id='type-id-934' visibility='default' filepath='include/linux/skbuff.h' line='849' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='tail' type-id='type-id-1764' visibility='default' filepath='include/linux/skbuff.h' line='853' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1568'>
+          <var-decl name='end' type-id='type-id-1764' visibility='default' filepath='include/linux/skbuff.h' line='854' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='head' type-id='type-id-256' visibility='default' filepath='include/linux/skbuff.h' line='855' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='data' type-id='type-id-256' visibility='default' filepath='include/linux/skbuff.h' line='856' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='truesize' type-id='type-id-5' visibility='default' filepath='include/linux/skbuff.h' line='857' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1760'>
+          <var-decl name='users' type-id='type-id-421' visibility='default' filepath='include/linux/skbuff.h' line='858' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__23' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='667' column='1' id='type-id-1765'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-1766' visibility='default' filepath='include/linux/skbuff.h' line='669' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prev' type-id='type-id-1766' visibility='default' filepath='include/linux/skbuff.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='' type-id='type-id-1767' visibility='default' filepath='include/linux/skbuff.h' line='672' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__15' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='672' column='1' id='type-id-1767'>
+        <data-member access='private'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/linux/skbuff.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='dev_scratch' type-id='type-id-16' visibility='default' filepath='include/linux/skbuff.h' line='678' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__24' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='703' column='1' id='type-id-1755'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_skb_refdst' type-id='type-id-16' visibility='default' filepath='include/linux/skbuff.h' line='704' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='destructor' type-id='type-id-1768' visibility='default' filepath='include/linux/skbuff.h' line='705' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__wsum' type-id='type-id-511' filepath='include/uapi/linux/types.h' line='37' column='1' id='type-id-1757'/>
+      <class-decl name='__anonymous_struct__25' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='809' column='1' id='type-id-1758'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='csum_start' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='810' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='csum_offset' type-id='type-id-108' visibility='default' filepath='include/linux/skbuff.h' line='811' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__be16' type-id='type-id-108' filepath='include/uapi/linux/types.h' line='30' column='1' id='type-id-924'/>
+      <typedef-decl name='sk_buff_data_t' type-id='type-id-5' filepath='include/linux/skbuff.h' line='585' column='1' id='type-id-1764'/>
+      <typedef-decl name='select_queue_fallback_t' type-id='type-id-1769' filepath='include/linux/netdevice.h' line='800' column='1' id='type-id-1770'/>
+      <class-decl name='ifreq' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/uapi/linux/if.h' line='231' column='1' id='type-id-1771'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ifr_ifrn' type-id='type-id-1772' visibility='default' filepath='include/uapi/linux/if.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ifr_ifru' type-id='type-id-1773' visibility='default' filepath='include/uapi/linux/if.h' line='252' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__16' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/if.h' line='233' column='1' id='type-id-1772'>
+        <data-member access='private'>
+          <var-decl name='ifrn_name' type-id='type-id-43' visibility='default' filepath='include/uapi/linux/if.h' line='235' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__17' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/if.h' line='238' column='1' id='type-id-1773'>
+        <data-member access='private'>
+          <var-decl name='ifru_addr' type-id='type-id-1774' visibility='default' filepath='include/uapi/linux/if.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_dstaddr' type-id='type-id-1774' visibility='default' filepath='include/uapi/linux/if.h' line='240' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_broadaddr' type-id='type-id-1774' visibility='default' filepath='include/uapi/linux/if.h' line='241' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_netmask' type-id='type-id-1774' visibility='default' filepath='include/uapi/linux/if.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_hwaddr' type-id='type-id-1774' visibility='default' filepath='include/uapi/linux/if.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_flags' type-id='type-id-261' visibility='default' filepath='include/uapi/linux/if.h' line='244' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_ivalue' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/if.h' line='245' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_mtu' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/if.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_map' type-id='type-id-1775' visibility='default' filepath='include/uapi/linux/if.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_slave' type-id='type-id-43' visibility='default' filepath='include/uapi/linux/if.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_newname' type-id='type-id-43' visibility='default' filepath='include/uapi/linux/if.h' line='249' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_data' type-id='type-id-15' visibility='default' filepath='include/uapi/linux/if.h' line='250' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ifru_settings' type-id='type-id-1776' visibility='default' filepath='include/uapi/linux/if.h' line='251' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='sockaddr' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/socket.h' line='30' column='1' id='type-id-1774'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sa_family' type-id='type-id-1777' visibility='default' filepath='include/linux/socket.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='sa_data' type-id='type-id-966' visibility='default' filepath='include/linux/socket.h' line='32' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='sa_family_t' type-id='type-id-337' filepath='include/linux/socket.h' line='24' column='1' id='type-id-1777'/>
+      <typedef-decl name='__kernel_sa_family_t' type-id='type-id-312' filepath='include/uapi/linux/socket.h' line='12' column='1' id='type-id-337'/>
+      <class-decl name='ifmap' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/if.h' line='194' column='1' id='type-id-1775'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mem_start' type-id='type-id-16' visibility='default' filepath='include/uapi/linux/if.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mem_end' type-id='type-id-16' visibility='default' filepath='include/uapi/linux/if.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='base_addr' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/if.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='144'>
+          <var-decl name='irq' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/if.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='152'>
+          <var-decl name='dma' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/if.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='port' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/if.h' line='200' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='if_settings' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/if.h' line='205' column='1' id='type-id-1776'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/if.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='size' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/if.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ifs_ifsu' type-id='type-id-1778' visibility='default' filepath='include/uapi/linux/if.h' line='219' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__18' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/if.h' line='208' column='1' id='type-id-1778'>
+        <data-member access='private'>
+          <var-decl name='raw_hdlc' type-id='type-id-1779' visibility='default' filepath='include/uapi/linux/if.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='cisco' type-id='type-id-1780' visibility='default' filepath='include/uapi/linux/if.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='fr' type-id='type-id-1781' visibility='default' filepath='include/uapi/linux/if.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='fr_pvc' type-id='type-id-1782' visibility='default' filepath='include/uapi/linux/if.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='fr_pvc_info' type-id='type-id-1783' visibility='default' filepath='include/uapi/linux/if.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='sync' type-id='type-id-1784' visibility='default' filepath='include/uapi/linux/if.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='te1' type-id='type-id-1785' visibility='default' filepath='include/uapi/linux/if.h' line='218' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='raw_hdlc_proto' type-id='type-id-1786' filepath='include/uapi/linux/hdlc/ioctl.h' line='56' column='1' id='type-id-1787'/>
+      <class-decl name='__anonymous_struct__26' size-in-bits='32' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1787' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='53' column='1' id='type-id-1786'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='encoding' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='parity' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='55' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='cisco_proto' type-id='type-id-1788' filepath='include/uapi/linux/hdlc/ioctl.h' line='80' column='1' id='type-id-1789'/>
+      <class-decl name='__anonymous_struct__27' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1789' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='77' column='1' id='type-id-1788'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='interval' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='timeout' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='79' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='fr_proto' type-id='type-id-1790' filepath='include/uapi/linux/hdlc/ioctl.h' line='66' column='1' id='type-id-1791'/>
+      <class-decl name='__anonymous_struct__28' size-in-bits='192' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1791' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='58' column='1' id='type-id-1790'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='t391' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='t392' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='n391' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='n392' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='n393' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='lmi' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='176'>
+          <var-decl name='dce' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='65' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='fr_proto_pvc' type-id='type-id-1792' filepath='include/uapi/linux/hdlc/ioctl.h' line='70' column='1' id='type-id-1793'/>
+      <class-decl name='__anonymous_struct__29' size-in-bits='32' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1793' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='68' column='1' id='type-id-1792'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dlci' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='69' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='fr_proto_pvc_info' type-id='type-id-1794' filepath='include/uapi/linux/hdlc/ioctl.h' line='75' column='1' id='type-id-1795'/>
+      <class-decl name='__anonymous_struct__30' size-in-bits='160' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1795' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='72' column='1' id='type-id-1794'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dlci' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='master' type-id='type-id-43' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='sync_serial_settings' type-id='type-id-1796' filepath='include/uapi/linux/hdlc/ioctl.h' line='44' column='1' id='type-id-1797'/>
+      <class-decl name='__anonymous_struct__31' size-in-bits='96' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1797' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='40' column='1' id='type-id-1796'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='clock_rate' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='clock_type' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='loopback' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='43' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='te1_settings' type-id='type-id-1798' filepath='include/uapi/linux/hdlc/ioctl.h' line='51' column='1' id='type-id-1799'/>
+      <class-decl name='__anonymous_struct__32' size-in-bits='128' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1799' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='46' column='1' id='type-id-1798'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='clock_rate' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='clock_type' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='loopback' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='slot_map' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/hdlc/ioctl.h' line='50' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rtnl_link_stats64' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/uapi/linux/if_link.h' line='44' column='1' id='type-id-1800'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rx_packets' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tx_packets' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rx_bytes' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tx_bytes' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rx_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='tx_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='rx_dropped' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='tx_dropped' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='multicast' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='collisions' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='rx_length_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='rx_over_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='rx_crc_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='rx_frame_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='rx_fifo_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='rx_missed_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='tx_aborted_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='tx_carrier_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='tx_fifo_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='tx_heartbeat_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='tx_window_errors' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='rx_compressed' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='tx_compressed' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='rx_nohandler' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/if_link.h' line='75' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ifla_vf_info' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/if_link.h' line='20' column='1' id='type-id-1801'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='vf' type-id='type-id-511' visibility='default' filepath='include/linux/if_link.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='mac' type-id='type-id-938' visibility='default' filepath='include/linux/if_link.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='vlan' type-id='type-id-511' visibility='default' filepath='include/linux/if_link.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='qos' type-id='type-id-511' visibility='default' filepath='include/linux/if_link.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='spoofchk' type-id='type-id-511' visibility='default' filepath='include/linux/if_link.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='linkstate' type-id='type-id-511' visibility='default' filepath='include/linux/if_link.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='min_tx_rate' type-id='type-id-511' visibility='default' filepath='include/linux/if_link.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='max_tx_rate' type-id='type-id-511' visibility='default' filepath='include/linux/if_link.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='rss_query_en' type-id='type-id-511' visibility='default' filepath='include/linux/if_link.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='trusted' type-id='type-id-511' visibility='default' filepath='include/linux/if_link.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='vlan_proto' type-id='type-id-924' visibility='default' filepath='include/linux/if_link.h' line='31' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ifla_vf_stats' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/if_link.h' line='9' column='1' id='type-id-1802'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rx_packets' type-id='type-id-100' visibility='default' filepath='include/linux/if_link.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tx_packets' type-id='type-id-100' visibility='default' filepath='include/linux/if_link.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rx_bytes' type-id='type-id-100' visibility='default' filepath='include/linux/if_link.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tx_bytes' type-id='type-id-100' visibility='default' filepath='include/linux/if_link.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='broadcast' type-id='type-id-100' visibility='default' filepath='include/linux/if_link.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='multicast' type-id='type-id-100' visibility='default' filepath='include/linux/if_link.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='rx_dropped' type-id='type-id-100' visibility='default' filepath='include/linux/if_link.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='tx_dropped' type-id='type-id-100' visibility='default' filepath='include/linux/if_link.h' line='17' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nlattr' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/netlink.h' line='210' column='1' id='type-id-1803'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nla_len' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/netlink.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='nla_type' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/netlink.h' line='212' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='tc_setup_type' filepath='include/linux/netdevice.h' line='804' column='1' id='type-id-1804'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='TC_SETUP_QDISC_MQPRIO' value='0'/>
+        <enumerator name='TC_SETUP_CLSU32' value='1'/>
+        <enumerator name='TC_SETUP_CLSFLOWER' value='2'/>
+        <enumerator name='TC_SETUP_CLSMATCHALL' value='3'/>
+        <enumerator name='TC_SETUP_CLSBPF' value='4'/>
+        <enumerator name='TC_SETUP_BLOCK' value='5'/>
+        <enumerator name='TC_SETUP_QDISC_CBS' value='6'/>
+        <enumerator name='TC_SETUP_QDISC_RED' value='7'/>
+        <enumerator name='TC_SETUP_QDISC_PRIO' value='8'/>
+        <enumerator name='TC_SETUP_QDISC_MQ' value='9'/>
+        <enumerator name='TC_SETUP_QDISC_ETF' value='10'/>
+      </enum-decl>
+      <class-decl name='netlink_ext_ack' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/netlink.h' line='74' column='1' id='type-id-1805'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_msg' type-id='type-id-4' visibility='default' filepath='include/linux/netlink.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bad_attr' type-id='type-id-1806' visibility='default' filepath='include/linux/netlink.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cookie' type-id='type-id-1181' visibility='default' filepath='include/linux/netlink.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='cookie_len' type-id='type-id-214' visibility='default' filepath='include/linux/netlink.h' line='78' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ndmsg' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/neighbour.h' line='8' column='1' id='type-id-1807'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ndm_family' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/neighbour.h' line='9' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='ndm_pad1' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/neighbour.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='ndm_pad2' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/neighbour.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ndm_ifindex' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/neighbour.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ndm_state' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/neighbour.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='ndm_flags' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/neighbour.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='88'>
+          <var-decl name='ndm_type' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/neighbour.h' line='15' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netlink_callback' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/linux/netlink.h' line='170' column='1' id='type-id-1808'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='skb' type-id='type-id-1766' visibility='default' filepath='include/linux/netlink.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nlh' type-id='type-id-1809' visibility='default' filepath='include/linux/netlink.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dump' type-id='type-id-1810' visibility='default' filepath='include/linux/netlink.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='done' type-id='type-id-1811' visibility='default' filepath='include/linux/netlink.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/netlink.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='module' type-id='type-id-260' visibility='default' filepath='include/linux/netlink.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='family' type-id='type-id-688' visibility='default' filepath='include/linux/netlink.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='400'>
+          <var-decl name='min_dump_alloc' type-id='type-id-688' visibility='default' filepath='include/linux/netlink.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='prev_seq' type-id='type-id-5' visibility='default' filepath='include/linux/netlink.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='seq' type-id='type-id-5' visibility='default' filepath='include/linux/netlink.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='args' type-id='type-id-349' visibility='default' filepath='include/linux/netlink.h' line='182' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nlmsghdr' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/netlink.h' line='44' column='1' id='type-id-1812'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nlmsg_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/netlink.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='nlmsg_type' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/netlink.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='nlmsg_flags' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/netlink.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nlmsg_seq' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/netlink.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='nlmsg_pid' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/netlink.h' line='49' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netdev_phys_item_id' size-in-bits='264' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='788' column='1' id='type-id-1813'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='id' type-id='type-id-35' visibility='default' filepath='include/linux/netdevice.h' line='789' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='id_len' type-id='type-id-216' visibility='default' filepath='include/linux/netdevice.h' line='790' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netdev_bpf' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='847' column='1' id='type-id-1814'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='command' type-id='type-id-1815' visibility='default' filepath='include/linux/netdevice.h' line='848' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='' type-id='type-id-1816' visibility='default' filepath='include/linux/netdevice.h' line='849' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='bpf_netdev_command' filepath='include/linux/netdevice.h' line='821' column='1' id='type-id-1815'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='XDP_SETUP_PROG' value='0'/>
+        <enumerator name='XDP_SETUP_PROG_HW' value='1'/>
+        <enumerator name='XDP_QUERY_PROG' value='2'/>
+        <enumerator name='XDP_QUERY_PROG_HW' value='3'/>
+        <enumerator name='BPF_OFFLOAD_VERIFIER_PREP' value='4'/>
+        <enumerator name='BPF_OFFLOAD_TRANSLATE' value='5'/>
+        <enumerator name='BPF_OFFLOAD_DESTROY' value='6'/>
+        <enumerator name='BPF_OFFLOAD_MAP_ALLOC' value='7'/>
+        <enumerator name='BPF_OFFLOAD_MAP_FREE' value='8'/>
+        <enumerator name='XDP_QUERY_XSK_UMEM' value='9'/>
+        <enumerator name='XDP_SETUP_XSK_UMEM' value='10'/>
+      </enum-decl>
+      <union-decl name='__anonymous_union__19' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='849' column='1' id='type-id-1816'>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='857' column='1' id='type-id-1817'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='prog_id' type-id='type-id-7' visibility='default' filepath='include/linux/netdevice.h' line='858' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='32'>
+              <var-decl name='prog_flags' type-id='type-id-7' visibility='default' filepath='include/linux/netdevice.h' line='860' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='872' column='1' id='type-id-1818'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='offmap' type-id='type-id-1819' visibility='default' filepath='include/linux/netdevice.h' line='873' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-1820' visibility='default' filepath='include/linux/netdevice.h' line='851' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='verifier' type-id='type-id-1821' visibility='default' filepath='include/linux/netdevice.h' line='866' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='offload' type-id='type-id-1822' visibility='default' filepath='include/linux/netdevice.h' line='870' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='xsk' type-id='type-id-1823' visibility='default' filepath='include/linux/netdevice.h' line='879' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__33' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='851' column='1' id='type-id-1820'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/linux/netdevice.h' line='852' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prog' type-id='type-id-1228' visibility='default' filepath='include/linux/netdevice.h' line='853' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='extack' type-id='type-id-1824' visibility='default' filepath='include/linux/netdevice.h' line='854' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__34' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='863' column='1' id='type-id-1821'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prog' type-id='type-id-1228' visibility='default' filepath='include/linux/netdevice.h' line='864' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ops' type-id='type-id-1825' visibility='default' filepath='include/linux/netdevice.h' line='865' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_prog_offload_ops' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='259' column='1' id='type-id-1826'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='insn_hook' type-id='type-id-1827' visibility='default' filepath='include/linux/bpf.h' line='260' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__35' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='868' column='1' id='type-id-1822'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prog' type-id='type-id-1228' visibility='default' filepath='include/linux/netdevice.h' line='869' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_offloaded_map' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='103' column='1' id='type-id-1828'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='map' type-id='type-id-1254' visibility='default' filepath='include/linux/bpf.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='netdev' type-id='type-id-1648' visibility='default' filepath='include/linux/bpf.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='dev_ops' type-id='type-id-1829' visibility='default' filepath='include/linux/bpf.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='dev_priv' type-id='type-id-15' visibility='default' filepath='include/linux/bpf.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='offloads' type-id='type-id-20' visibility='default' filepath='include/linux/bpf.h' line='108' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_map_dev_ops' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='93' column='1' id='type-id-1830'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='map_get_next_key' type-id='type-id-1831' visibility='default' filepath='include/linux/bpf.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='map_lookup_elem' type-id='type-id-1831' visibility='default' filepath='include/linux/bpf.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='map_update_elem' type-id='type-id-1832' visibility='default' filepath='include/linux/bpf.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='map_delete_elem' type-id='type-id-1833' visibility='default' filepath='include/linux/bpf.h' line='100' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__36' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='876' column='1' id='type-id-1823'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='umem' type-id='type-id-1834' visibility='default' filepath='include/linux/netdevice.h' line='877' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='queue_id' type-id='type-id-688' visibility='default' filepath='include/linux/netdevice.h' line='878' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xdp_frame' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/xdp.h' line='75' column='1' id='type-id-1835'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/net/xdp.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='len' type-id='type-id-688' visibility='default' filepath='include/net/xdp.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='headroom' type-id='type-id-688' visibility='default' filepath='include/net/xdp.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='metasize' type-id='type-id-688' visibility='default' filepath='include/net/xdp.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mem' type-id='type-id-1836' visibility='default' filepath='include/net/xdp.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dev_rx' type-id='type-id-1648' visibility='default' filepath='include/net/xdp.h' line='84' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xdp_mem_info' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/net/xdp.h' line='48' column='1' id='type-id-1836'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-7' visibility='default' filepath='include/net/xdp.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='id' type-id='type-id-7' visibility='default' filepath='include/net/xdp.h' line='50' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_ops' size-in-bits='3712' is-struct='yes' visibility='default' filepath='include/linux/ethtool.h' line='331' column='1' id='type-id-1837'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='get_settings' type-id='type-id-1838' visibility='default' filepath='include/linux/ethtool.h' line='332' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='set_settings' type-id='type-id-1838' visibility='default' filepath='include/linux/ethtool.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='get_drvinfo' type-id='type-id-1839' visibility='default' filepath='include/linux/ethtool.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='get_regs_len' type-id='type-id-1699' visibility='default' filepath='include/linux/ethtool.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='get_regs' type-id='type-id-1840' visibility='default' filepath='include/linux/ethtool.h' line='336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='get_wol' type-id='type-id-1841' visibility='default' filepath='include/linux/ethtool.h' line='337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='set_wol' type-id='type-id-1842' visibility='default' filepath='include/linux/ethtool.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_msglevel' type-id='type-id-1843' visibility='default' filepath='include/linux/ethtool.h' line='339' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='set_msglevel' type-id='type-id-1844' visibility='default' filepath='include/linux/ethtool.h' line='340' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='nway_reset' type-id='type-id-1699' visibility='default' filepath='include/linux/ethtool.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='get_link' type-id='type-id-1843' visibility='default' filepath='include/linux/ethtool.h' line='342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='get_eeprom_len' type-id='type-id-1699' visibility='default' filepath='include/linux/ethtool.h' line='343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='get_eeprom' type-id='type-id-1845' visibility='default' filepath='include/linux/ethtool.h' line='344' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='set_eeprom' type-id='type-id-1845' visibility='default' filepath='include/linux/ethtool.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='get_coalesce' type-id='type-id-1846' visibility='default' filepath='include/linux/ethtool.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='set_coalesce' type-id='type-id-1846' visibility='default' filepath='include/linux/ethtool.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='get_ringparam' type-id='type-id-1847' visibility='default' filepath='include/linux/ethtool.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='set_ringparam' type-id='type-id-1848' visibility='default' filepath='include/linux/ethtool.h' line='352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='get_pauseparam' type-id='type-id-1849' visibility='default' filepath='include/linux/ethtool.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='set_pauseparam' type-id='type-id-1850' visibility='default' filepath='include/linux/ethtool.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='self_test' type-id='type-id-1851' visibility='default' filepath='include/linux/ethtool.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='get_strings' type-id='type-id-1852' visibility='default' filepath='include/linux/ethtool.h' line='359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='set_phys_id' type-id='type-id-1853' visibility='default' filepath='include/linux/ethtool.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='get_ethtool_stats' type-id='type-id-1854' visibility='default' filepath='include/linux/ethtool.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='begin' type-id='type-id-1699' visibility='default' filepath='include/linux/ethtool.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='complete' type-id='type-id-1689' visibility='default' filepath='include/linux/ethtool.h' line='364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='get_priv_flags' type-id='type-id-1843' visibility='default' filepath='include/linux/ethtool.h' line='365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='set_priv_flags' type-id='type-id-1748' visibility='default' filepath='include/linux/ethtool.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='get_sset_count' type-id='type-id-1707' visibility='default' filepath='include/linux/ethtool.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='get_rxnfc' type-id='type-id-1855' visibility='default' filepath='include/linux/ethtool.h' line='368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='set_rxnfc' type-id='type-id-1856' visibility='default' filepath='include/linux/ethtool.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='flash_device' type-id='type-id-1857' visibility='default' filepath='include/linux/ethtool.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='reset' type-id='type-id-1858' visibility='default' filepath='include/linux/ethtool.h' line='372' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='get_rxfh_key_size' type-id='type-id-1843' visibility='default' filepath='include/linux/ethtool.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='get_rxfh_indir_size' type-id='type-id-1843' visibility='default' filepath='include/linux/ethtool.h' line='374' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='get_rxfh' type-id='type-id-1859' visibility='default' filepath='include/linux/ethtool.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='set_rxfh' type-id='type-id-1860' visibility='default' filepath='include/linux/ethtool.h' line='377' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='get_rxfh_context' type-id='type-id-1861' visibility='default' filepath='include/linux/ethtool.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='set_rxfh_context' type-id='type-id-1862' visibility='default' filepath='include/linux/ethtool.h' line='381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='get_channels' type-id='type-id-1863' visibility='default' filepath='include/linux/ethtool.h' line='384' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='set_channels' type-id='type-id-1864' visibility='default' filepath='include/linux/ethtool.h' line='385' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='get_dump_flag' type-id='type-id-1865' visibility='default' filepath='include/linux/ethtool.h' line='386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='get_dump_data' type-id='type-id-1866' visibility='default' filepath='include/linux/ethtool.h' line='387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='set_dump' type-id='type-id-1865' visibility='default' filepath='include/linux/ethtool.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='get_ts_info' type-id='type-id-1867' visibility='default' filepath='include/linux/ethtool.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='get_module_info' type-id='type-id-1868' visibility='default' filepath='include/linux/ethtool.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='get_module_eeprom' type-id='type-id-1845' visibility='default' filepath='include/linux/ethtool.h' line='393' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='get_eee' type-id='type-id-1869' visibility='default' filepath='include/linux/ethtool.h' line='395' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='set_eee' type-id='type-id-1869' visibility='default' filepath='include/linux/ethtool.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='get_tunable' type-id='type-id-1870' visibility='default' filepath='include/linux/ethtool.h' line='397' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='set_tunable' type-id='type-id-1870' visibility='default' filepath='include/linux/ethtool.h' line='399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='get_per_queue_coalesce' type-id='type-id-1871' visibility='default' filepath='include/linux/ethtool.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='set_per_queue_coalesce' type-id='type-id-1871' visibility='default' filepath='include/linux/ethtool.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='get_link_ksettings' type-id='type-id-1872' visibility='default' filepath='include/linux/ethtool.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='set_link_ksettings' type-id='type-id-1873' visibility='default' filepath='include/linux/ethtool.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='get_fecparam' type-id='type-id-1874' visibility='default' filepath='include/linux/ethtool.h' line='409' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='set_fecparam' type-id='type-id-1874' visibility='default' filepath='include/linux/ethtool.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='get_ethtool_phy_stats' type-id='type-id-1854' visibility='default' filepath='include/linux/ethtool.h' line='413' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_cmd' size-in-bits='352' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='100' column='1' id='type-id-1875'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='supported' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='advertising' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='speed' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/ethtool.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='duplex' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='port' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='phy_address' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='136'>
+          <var-decl name='transceiver' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='144'>
+          <var-decl name='autoneg' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='152'>
+          <var-decl name='mdio_support' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='maxtxpkt' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='maxrxpkt' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='speed_hi' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/ethtool.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='240'>
+          <var-decl name='eth_tp_mdix' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='248'>
+          <var-decl name='eth_tp_mdix_ctrl' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='lp_advertising' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='reserved' type-id='type-id-930' visibility='default' filepath='include/uapi/linux/ethtool.h' line='117' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_drvinfo' size-in-bits='1568' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='181' column='1' id='type-id-1876'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='driver' type-id='type-id-373' visibility='default' filepath='include/uapi/linux/ethtool.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='version' type-id='type-id-373' visibility='default' filepath='include/uapi/linux/ethtool.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='fw_version' type-id='type-id-373' visibility='default' filepath='include/uapi/linux/ethtool.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='bus_info' type-id='type-id-373' visibility='default' filepath='include/uapi/linux/ethtool.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='erom_version' type-id='type-id-373' visibility='default' filepath='include/uapi/linux/ethtool.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='reserved2' type-id='type-id-964' visibility='default' filepath='include/uapi/linux/ethtool.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='n_priv_flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1440'>
+          <var-decl name='n_stats' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='testinfo_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='eedump_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='regdump_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='193' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_regs' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='284' column='1' id='type-id-1877'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='version' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='data' type-id='type-id-944' visibility='default' filepath='include/uapi/linux/ethtool.h' line='288' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_wolinfo' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='207' column='1' id='type-id-1878'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='supported' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wolopts' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='sopass' type-id='type-id-943' visibility='default' filepath='include/uapi/linux/ethtool.h' line='211' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_eeprom' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='309' column='1' id='type-id-1879'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='310' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='magic' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='offset' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='data' type-id='type-id-944' visibility='default' filepath='include/uapi/linux/ethtool.h' line='314' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_coalesce' size-in-bits='736' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='436' column='1' id='type-id-1880'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='rx_coalesce_usecs' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='438' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rx_max_coalesced_frames' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='rx_coalesce_usecs_irq' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='440' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rx_max_coalesced_frames_irq' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='tx_coalesce_usecs' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='442' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tx_max_coalesced_frames' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='tx_coalesce_usecs_irq' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='444' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='tx_max_coalesced_frames_irq' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='445' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='stats_block_coalesce_usecs' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='use_adaptive_rx_coalesce' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='use_adaptive_tx_coalesce' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='448' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='pkt_rate_low' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='449' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='rx_coalesce_usecs_low' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='450' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='rx_max_coalesced_frames_low' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='451' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='tx_coalesce_usecs_low' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='452' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='tx_max_coalesced_frames_low' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='453' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='pkt_rate_high' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='454' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='rx_coalesce_usecs_high' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='455' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='rx_max_coalesced_frames_high' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='456' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='tx_coalesce_usecs_high' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='457' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='tx_max_coalesced_frames_high' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='458' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='rate_sample_interval' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='459' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_ringparam' size-in-bits='288' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='487' column='1' id='type-id-1881'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='488' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='rx_max_pending' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='489' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rx_mini_max_pending' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='490' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='rx_jumbo_max_pending' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='491' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tx_max_pending' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='492' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='rx_pending' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='493' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rx_mini_pending' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='494' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='rx_jumbo_pending' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='495' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='tx_pending' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='496' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_pauseparam' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='549' column='1' id='type-id-1882'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='550' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='autoneg' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='551' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rx_pause' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='552' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='tx_pause' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='553' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_test' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='657' column='1' id='type-id-1883'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='658' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='659' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='reserved' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='660' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='661' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='data' type-id='type-id-735' visibility='default' filepath='include/uapi/linux/ethtool.h' line='662' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='ethtool_phys_id_state' filepath='include/linux/ethtool.h' line='54' column='1' id='type-id-1884'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='ETHTOOL_ID_INACTIVE' value='0'/>
+        <enumerator name='ETHTOOL_ID_ACTIVE' value='1'/>
+        <enumerator name='ETHTOOL_ID_ON' value='2'/>
+        <enumerator name='ETHTOOL_ID_OFF' value='3'/>
+      </enum-decl>
+      <class-decl name='ethtool_stats' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='676' column='1' id='type-id-1885'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='677' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='n_stats' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='678' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='data' type-id='type-id-735' visibility='default' filepath='include/uapi/linux/ethtool.h' line='679' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_rxnfc' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='975' column='1' id='type-id-1886'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='976' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='flow_type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='977' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='data' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/ethtool.h' line='978' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fs' type-id='type-id-1887' visibility='default' filepath='include/uapi/linux/ethtool.h' line='979' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='' type-id='type-id-1888' visibility='default' filepath='include/uapi/linux/ethtool.h' line='980' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='rule_locs' type-id='type-id-934' visibility='default' filepath='include/uapi/linux/ethtool.h' line='984' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_rx_flow_spec' size-in-bits='1344' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='879' column='1' id='type-id-1887'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flow_type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='880' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='h_u' type-id='type-id-1889' visibility='default' filepath='include/uapi/linux/ethtool.h' line='881' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='h_ext' type-id='type-id-1890' visibility='default' filepath='include/uapi/linux/ethtool.h' line='882' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='m_u' type-id='type-id-1889' visibility='default' filepath='include/uapi/linux/ethtool.h' line='883' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='m_ext' type-id='type-id-1890' visibility='default' filepath='include/uapi/linux/ethtool.h' line='884' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='ring_cookie' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/ethtool.h' line='885' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='location' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='886' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='ethtool_flow_union' size-in-bits='416' visibility='default' filepath='include/uapi/linux/ethtool.h' line='826' column='1' id='type-id-1889'>
+        <data-member access='private'>
+          <var-decl name='tcp_ip4_spec' type-id='type-id-1891' visibility='default' filepath='include/uapi/linux/ethtool.h' line='827' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='udp_ip4_spec' type-id='type-id-1891' visibility='default' filepath='include/uapi/linux/ethtool.h' line='828' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='sctp_ip4_spec' type-id='type-id-1891' visibility='default' filepath='include/uapi/linux/ethtool.h' line='829' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ah_ip4_spec' type-id='type-id-1892' visibility='default' filepath='include/uapi/linux/ethtool.h' line='830' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='esp_ip4_spec' type-id='type-id-1892' visibility='default' filepath='include/uapi/linux/ethtool.h' line='831' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='usr_ip4_spec' type-id='type-id-1893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='832' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='tcp_ip6_spec' type-id='type-id-1894' visibility='default' filepath='include/uapi/linux/ethtool.h' line='833' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='udp_ip6_spec' type-id='type-id-1894' visibility='default' filepath='include/uapi/linux/ethtool.h' line='834' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='sctp_ip6_spec' type-id='type-id-1894' visibility='default' filepath='include/uapi/linux/ethtool.h' line='835' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ah_ip6_spec' type-id='type-id-1895' visibility='default' filepath='include/uapi/linux/ethtool.h' line='836' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='esp_ip6_spec' type-id='type-id-1895' visibility='default' filepath='include/uapi/linux/ethtool.h' line='837' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='usr_ip6_spec' type-id='type-id-1896' visibility='default' filepath='include/uapi/linux/ethtool.h' line='838' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ether_spec' type-id='type-id-1897' visibility='default' filepath='include/uapi/linux/ethtool.h' line='839' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='hdata' type-id='type-id-941' visibility='default' filepath='include/uapi/linux/ethtool.h' line='840' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='ethtool_tcpip4_spec' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='732' column='1' id='type-id-1891'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ip4src' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/ethtool.h' line='733' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ip4dst' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/ethtool.h' line='734' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='psrc' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/ethtool.h' line='735' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='pdst' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/ethtool.h' line='736' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='tos' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='737' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__be32' type-id='type-id-511' filepath='include/uapi/linux/types.h' line='32' column='1' id='type-id-927'/>
+      <class-decl name='ethtool_ah_espip4_spec' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='749' column='1' id='type-id-1892'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ip4src' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/ethtool.h' line='750' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ip4dst' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/ethtool.h' line='751' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='spi' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/ethtool.h' line='752' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='tos' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='753' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_usrip4_spec' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='767' column='1' id='type-id-1893'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ip4src' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/ethtool.h' line='768' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ip4dst' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/ethtool.h' line='769' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='l4_4_bytes' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/ethtool.h' line='770' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='tos' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='771' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='104'>
+          <var-decl name='ip_ver' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='772' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='proto' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='773' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_tcpip6_spec' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='786' column='1' id='type-id-1894'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ip6src' type-id='type-id-929' visibility='default' filepath='include/uapi/linux/ethtool.h' line='787' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ip6dst' type-id='type-id-929' visibility='default' filepath='include/uapi/linux/ethtool.h' line='788' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='psrc' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/ethtool.h' line='789' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='pdst' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/ethtool.h' line='790' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='tclass' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='791' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_ah_espip6_spec' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='803' column='1' id='type-id-1895'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ip6src' type-id='type-id-929' visibility='default' filepath='include/uapi/linux/ethtool.h' line='804' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ip6dst' type-id='type-id-929' visibility='default' filepath='include/uapi/linux/ethtool.h' line='805' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='spi' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/ethtool.h' line='806' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='tclass' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='807' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_usrip6_spec' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='818' column='1' id='type-id-1896'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ip6src' type-id='type-id-929' visibility='default' filepath='include/uapi/linux/ethtool.h' line='819' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ip6dst' type-id='type-id-929' visibility='default' filepath='include/uapi/linux/ethtool.h' line='820' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='l4_4_bytes' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/ethtool.h' line='821' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='tclass' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='822' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='296'>
+          <var-decl name='l4_proto' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='823' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethhdr' size-in-bits='112' is-struct='yes' visibility='default' filepath='include/uapi/linux/if_ether.h' line='161' column='1' id='type-id-1897'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='h_dest' type-id='type-id-1187' visibility='default' filepath='include/uapi/linux/if_ether.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='h_source' type-id='type-id-1187' visibility='default' filepath='include/uapi/linux/if_ether.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='h_proto' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/if_ether.h' line='164' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_flow_ext' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='854' column='1' id='type-id-1890'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='padding' type-id='type-id-937' visibility='default' filepath='include/uapi/linux/ethtool.h' line='855' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='h_dest' type-id='type-id-1187' visibility='default' filepath='include/uapi/linux/ethtool.h' line='856' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='vlan_etype' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/ethtool.h' line='857' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='vlan_tci' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/ethtool.h' line='858' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='data' type-id='type-id-928' visibility='default' filepath='include/uapi/linux/ethtool.h' line='859' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__20' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='980' column='1' id='type-id-1888'>
+        <data-member access='private'>
+          <var-decl name='rule_cnt' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='981' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rss_context' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='982' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='ethtool_flash' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1104' column='1' id='type-id-1898'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='region' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='data' type-id='type-id-962' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1107' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_channels' size-in-bits='288' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='515' column='1' id='type-id-1899'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='516' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='max_rx' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='517' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='max_tx' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='518' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='max_other' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='519' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='max_combined' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='520' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='rx_count' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='521' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tx_count' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='522' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='other_count' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='523' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='combined_count' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='524' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_dump' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1124' column='1' id='type-id-1900'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='version' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flag' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='data' type-id='type-id-944' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1129' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_ts_info' size-in-bits='352' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1204' column='1' id='type-id-1901'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='so_timestamping' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='phc_index' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='tx_types' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tx_reserved' type-id='type-id-931' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='rx_filters' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rx_reserved' type-id='type-id-931' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1211' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_modinfo' size-in-bits='352' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='356' column='1' id='type-id-1902'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='eeprom_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='reserved' type-id='type-id-933' visibility='default' filepath='include/uapi/linux/ethtool.h' line='360' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_eee' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='334' column='1' id='type-id-1903'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='supported' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='advertised' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='lp_advertised' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='eee_active' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='339' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='eee_enabled' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='340' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tx_lpi_enabled' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='tx_lpi_timer' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='reserved' type-id='type-id-930' visibility='default' filepath='include/uapi/linux/ethtool.h' line='343' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_tunable' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='248' column='1' id='type-id-1904'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='250' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='type_id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='252' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='data' type-id='type-id-1211' visibility='default' filepath='include/uapi/linux/ethtool.h' line='253' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_link_ksettings' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/ethtool.h' line='112' column='1' id='type-id-1905'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-1906' visibility='default' filepath='include/linux/ethtool.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='link_modes' type-id='type-id-1907' visibility='default' filepath='include/linux/ethtool.h' line='118' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_link_settings' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1827' column='1' id='type-id-1906'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1828' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='speed' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1829' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='duplex' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1830' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='72'>
+          <var-decl name='port' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1831' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='phy_address' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1832' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='88'>
+          <var-decl name='autoneg' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1833' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='mdio_support' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1834' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='104'>
+          <var-decl name='eth_tp_mdix' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1835' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='eth_tp_mdix_ctrl' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1836' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='link_mode_masks_nwords' type-id='type-id-1908' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1837' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='transceiver' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1838' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='136'>
+          <var-decl name='reserved1' type-id='type-id-940' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1839' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='reserved' type-id='type-id-932' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1840' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='link_mode_masks' type-id='type-id-934' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1841' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__s8' type-id='type-id-1168' filepath='include/uapi/asm-generic/int-ll64.h' line='20' column='1' id='type-id-1908'/>
+      <class-decl name='__anonymous_struct__37' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/ethtool.h' line='114' column='1' id='type-id-1907'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='supported' type-id='type-id-491' visibility='default' filepath='include/linux/ethtool.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='advertising' type-id='type-id-491' visibility='default' filepath='include/linux/ethtool.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lp_advertising' type-id='type-id-491' visibility='default' filepath='include/linux/ethtool.h' line='117' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ethtool_fecparam' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1276' column='1' id='type-id-1909'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='active_fec' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fec' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1280' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='reserved' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/ethtool.h' line='1281' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='header_ops' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='267' column='1' id='type-id-1910'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='create' type-id='type-id-1911' visibility='default' filepath='include/linux/netdevice.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='parse' type-id='type-id-1912' visibility='default' filepath='include/linux/netdevice.h' line='271' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cache' type-id='type-id-1913' visibility='default' filepath='include/linux/netdevice.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='cache_update' type-id='type-id-1914' visibility='default' filepath='include/linux/netdevice.h' line='273' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='validate' type-id='type-id-1915' visibility='default' filepath='include/linux/netdevice.h' line='276' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hh_cache' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='241' column='1' id='type-id-1916'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hh_len' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='hh_lock' type-id='type-id-1917' visibility='default' filepath='include/linux/netdevice.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hh_data' type-id='type-id-1195' visibility='default' filepath='include/linux/netdevice.h' line='251' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='seqlock_t' type-id='type-id-1918' filepath='include/linux/seqlock.h' line='407' column='1' id='type-id-1917'/>
+      <class-decl name='__anonymous_struct__38' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1917' visibility='default' filepath='include/linux/seqlock.h' line='404' column='1' id='type-id-1918'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='seqcount' type-id='type-id-1290' visibility='default' filepath='include/linux/seqlock.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/seqlock.h' line='406' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netdev_hw_addr_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='221' column='1' id='type-id-1674'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='222' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='count' type-id='type-id-17' visibility='default' filepath='include/linux/netdevice.h' line='223' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netdev_rx_queue' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='707' column='1' id='type-id-1919'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rps_map' type-id='type-id-1920' visibility='default' filepath='include/linux/netdevice.h' line='709' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rps_flow_table' type-id='type-id-1921' visibility='default' filepath='include/linux/netdevice.h' line='710' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/netdevice.h' line='712' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/linux/netdevice.h' line='713' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='xdp_rxq' type-id='type-id-1922' visibility='default' filepath='include/linux/netdevice.h' line='714' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rps_map' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='633' column='1' id='type-id-1923'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='len' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='634' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/netdevice.h' line='635' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='cpus' type-id='type-id-1172' visibility='default' filepath='include/linux/netdevice.h' line='636' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rps_dev_flow_table' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='655' column='1' id='type-id-1924'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mask' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='656' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/netdevice.h' line='657' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='flows' type-id='type-id-1167' visibility='default' filepath='include/linux/netdevice.h' line='658' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rps_dev_flow' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='645' column='1' id='type-id-1166'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cpu' type-id='type-id-688' visibility='default' filepath='include/linux/netdevice.h' line='646' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='filter' type-id='type-id-688' visibility='default' filepath='include/linux/netdevice.h' line='647' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='last_qtail' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='648' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xdp_rxq_info' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/xdp.h' line='59' column='1' id='type-id-1922'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/net/xdp.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='queue_index' type-id='type-id-7' visibility='default' filepath='include/net/xdp.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='reg_state' type-id='type-id-7' visibility='default' filepath='include/net/xdp.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mem' type-id='type-id-1836' visibility='default' filepath='include/net/xdp.h' line='63' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='rx_handler_func_t' type-id='type-id-1925' filepath='include/linux/netdevice.h' line='422' column='1' id='type-id-1926'/>
+      <typedef-decl name='rx_handler_result_t' type-id='type-id-1927' filepath='include/linux/netdevice.h' line='421' column='1' id='type-id-1928'/>
+      <enum-decl name='rx_handler_result' filepath='include/linux/netdevice.h' line='415' column='1' id='type-id-1927'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='RX_HANDLER_CONSUMED' value='0'/>
+        <enumerator name='RX_HANDLER_ANOTHER' value='1'/>
+        <enumerator name='RX_HANDLER_EXACT' value='2'/>
+        <enumerator name='RX_HANDLER_PASS' value='3'/>
+      </enum-decl>
+      <class-decl name='mini_Qdisc' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='1097' column='1' id='type-id-1929'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='filter_list' type-id='type-id-1930' visibility='default' filepath='include/net/sch_generic.h' line='1098' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cpu_bstats' type-id='type-id-1931' visibility='default' filepath='include/net/sch_generic.h' line='1099' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cpu_qstats' type-id='type-id-1932' visibility='default' filepath='include/net/sch_generic.h' line='1100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/sch_generic.h' line='1101' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tcf_proto' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='293' column='1' id='type-id-1933'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-1930' visibility='default' filepath='include/net/sch_generic.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='root' type-id='type-id-15' visibility='default' filepath='include/net/sch_generic.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='classify' type-id='type-id-1934' visibility='default' filepath='include/net/sch_generic.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='protocol' type-id='type-id-924' visibility='default' filepath='include/net/sch_generic.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='prio' type-id='type-id-7' visibility='default' filepath='include/net/sch_generic.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/net/sch_generic.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ops' type-id='type-id-1935' visibility='default' filepath='include/net/sch_generic.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='chain' type-id='type-id-1936' visibility='default' filepath='include/net/sch_generic.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/sch_generic.h' line='309' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tcf_result' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='234' column='1' id='type-id-1937'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-1938' visibility='default' filepath='include/net/sch_generic.h' line='235' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__21' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='235' column='1' id='type-id-1938'>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='243' column='1' id='type-id-1939'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='ingress' type-id='type-id-33' visibility='default' filepath='include/net/sch_generic.h' line='244' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='qstats' type-id='type-id-1932' visibility='default' filepath='include/net/sch_generic.h' line='245' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-1940' visibility='default' filepath='include/net/sch_generic.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='goto_tp' type-id='type-id-1941' visibility='default' filepath='include/net/sch_generic.h' line='240' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__39' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='236' column='1' id='type-id-1940'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='class' type-id='type-id-16' visibility='default' filepath='include/net/sch_generic.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='classid' type-id='type-id-7' visibility='default' filepath='include/net/sch_generic.h' line='238' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='gnet_stats_queue' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/uapi/linux/gen_stats.h' line='61' column='1' id='type-id-1942'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='qlen' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/gen_stats.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='backlog' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/gen_stats.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='drops' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/gen_stats.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='requeues' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/gen_stats.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='overlimits' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/gen_stats.h' line='66' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tcf_proto_ops' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='252' column='1' id='type-id-1943'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/net/sch_generic.h' line='253' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='kind' type-id='type-id-43' visibility='default' filepath='include/net/sch_generic.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='classify' type-id='type-id-1934' visibility='default' filepath='include/net/sch_generic.h' line='256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='init' type-id='type-id-1944' visibility='default' filepath='include/net/sch_generic.h' line='259' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='destroy' type-id='type-id-1945' visibility='default' filepath='include/net/sch_generic.h' line='260' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get' type-id='type-id-1946' visibility='default' filepath='include/net/sch_generic.h' line='263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='change' type-id='type-id-1947' visibility='default' filepath='include/net/sch_generic.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='delete' type-id='type-id-1948' visibility='default' filepath='include/net/sch_generic.h' line='269' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='walk' type-id='type-id-1949' visibility='default' filepath='include/net/sch_generic.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='reoffload' type-id='type-id-1950' visibility='default' filepath='include/net/sch_generic.h' line='273' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='bind_class' type-id='type-id-1951' visibility='default' filepath='include/net/sch_generic.h' line='276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='tmplt_create' type-id='type-id-1952' visibility='default' filepath='include/net/sch_generic.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='tmplt_destroy' type-id='type-id-517' visibility='default' filepath='include/net/sch_generic.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='dump' type-id='type-id-1953' visibility='default' filepath='include/net/sch_generic.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='tmplt_dump' type-id='type-id-1954' visibility='default' filepath='include/net/sch_generic.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/net/sch_generic.h' line='290' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='tc_setup_cb_t' type-id='type-id-1955' filepath='include/net/sch_generic.h' line='23' column='1' id='type-id-1956'/>
+      <class-decl name='tcf_chain' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='322' column='1' id='type-id-1957'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='filter_chain' type-id='type-id-1930' visibility='default' filepath='include/net/sch_generic.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/sch_generic.h' line='324' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='block' type-id='type-id-1958' visibility='default' filepath='include/net/sch_generic.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='index' type-id='type-id-7' visibility='default' filepath='include/net/sch_generic.h' line='326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='refcnt' type-id='type-id-5' visibility='default' filepath='include/net/sch_generic.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='action_refcnt' type-id='type-id-5' visibility='default' filepath='include/net/sch_generic.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='explicitly_created' type-id='type-id-33' visibility='default' filepath='include/net/sch_generic.h' line='329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='tmplt_ops' type-id='type-id-1935' visibility='default' filepath='include/net/sch_generic.h' line='330' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='tmplt_priv' type-id='type-id-15' visibility='default' filepath='include/net/sch_generic.h' line='331' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tcf_block' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='334' column='1' id='type-id-1959'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chain_list' type-id='type-id-20' visibility='default' filepath='include/net/sch_generic.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='index' type-id='type-id-7' visibility='default' filepath='include/net/sch_generic.h' line='336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='refcnt' type-id='type-id-5' visibility='default' filepath='include/net/sch_generic.h' line='337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='net' type-id='type-id-1643' visibility='default' filepath='include/net/sch_generic.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='q' type-id='type-id-1685' visibility='default' filepath='include/net/sch_generic.h' line='339' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='cb_list' type-id='type-id-20' visibility='default' filepath='include/net/sch_generic.h' line='340' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='owner_list' type-id='type-id-20' visibility='default' filepath='include/net/sch_generic.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='keep_dst' type-id='type-id-33' visibility='default' filepath='include/net/sch_generic.h' line='342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='offloadcnt' type-id='type-id-5' visibility='default' filepath='include/net/sch_generic.h' line='343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='nooffloaddevcnt' type-id='type-id-5' visibility='default' filepath='include/net/sch_generic.h' line='344' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='chain0' type-id='type-id-1960' visibility='default' filepath='include/net/sch_generic.h' line='348' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='Qdisc' size-in-bits='2560' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='57' column='1' id='type-id-1961'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='enqueue' type-id='type-id-1962' visibility='default' filepath='include/net/sch_generic.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dequeue' type-id='type-id-1963' visibility='default' filepath='include/net/sch_generic.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/net/sch_generic.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='limit' type-id='type-id-7' visibility='default' filepath='include/net/sch_generic.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ops' type-id='type-id-1964' visibility='default' filepath='include/net/sch_generic.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='stab' type-id='type-id-1965' visibility='default' filepath='include/net/sch_generic.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='hash' type-id='type-id-520' visibility='default' filepath='include/net/sch_generic.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='handle' type-id='type-id-7' visibility='default' filepath='include/net/sch_generic.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='parent' type-id='type-id-7' visibility='default' filepath='include/net/sch_generic.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dev_queue' type-id='type-id-1683' visibility='default' filepath='include/net/sch_generic.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='rate_est' type-id='type-id-1966' visibility='default' filepath='include/net/sch_generic.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='cpu_bstats' type-id='type-id-1931' visibility='default' filepath='include/net/sch_generic.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='cpu_qstats' type-id='type-id-1932' visibility='default' filepath='include/net/sch_generic.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='padded' type-id='type-id-17' visibility='default' filepath='include/net/sch_generic.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/net/sch_generic.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='gso_skb' type-id='type-id-1659' visibility='default' filepath='include/net/sch_generic.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='q' type-id='type-id-1967' visibility='default' filepath='include/net/sch_generic.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='bstats' type-id='type-id-1968' visibility='default' filepath='include/net/sch_generic.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='running' type-id='type-id-387' visibility='default' filepath='include/net/sch_generic.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='qstats' type-id='type-id-1942' visibility='default' filepath='include/net/sch_generic.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='state' type-id='type-id-16' visibility='default' filepath='include/net/sch_generic.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='next_sched' type-id='type-id-1685' visibility='default' filepath='include/net/sch_generic.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='skb_bad_txq' type-id='type-id-1659' visibility='default' filepath='include/net/sch_generic.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='busylock' type-id='type-id-247' visibility='default' filepath='include/net/sch_generic.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2080'>
+          <var-decl name='seqlock' type-id='type-id-247' visibility='default' filepath='include/net/sch_generic.h' line='110' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='Qdisc_ops' size-in-bits='1344' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='197' column='1' id='type-id-1969'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-1970' visibility='default' filepath='include/net/sch_generic.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cl_ops' type-id='type-id-1971' visibility='default' filepath='include/net/sch_generic.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='id' type-id='type-id-43' visibility='default' filepath='include/net/sch_generic.h' line='200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='priv_size' type-id='type-id-17' visibility='default' filepath='include/net/sch_generic.h' line='201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='static_flags' type-id='type-id-5' visibility='default' filepath='include/net/sch_generic.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='enqueue' type-id='type-id-1962' visibility='default' filepath='include/net/sch_generic.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dequeue' type-id='type-id-1963' visibility='default' filepath='include/net/sch_generic.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='peek' type-id='type-id-1963' visibility='default' filepath='include/net/sch_generic.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='init' type-id='type-id-1972' visibility='default' filepath='include/net/sch_generic.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='reset' type-id='type-id-1973' visibility='default' filepath='include/net/sch_generic.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='destroy' type-id='type-id-1973' visibility='default' filepath='include/net/sch_generic.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='change' type-id='type-id-1972' visibility='default' filepath='include/net/sch_generic.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='attach' type-id='type-id-1973' visibility='default' filepath='include/net/sch_generic.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='change_tx_queue_len' type-id='type-id-1974' visibility='default' filepath='include/net/sch_generic.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='dump' type-id='type-id-1975' visibility='default' filepath='include/net/sch_generic.h' line='220' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='dump_stats' type-id='type-id-1976' visibility='default' filepath='include/net/sch_generic.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='ingress_block_set' type-id='type-id-1977' visibility='default' filepath='include/net/sch_generic.h' line='223' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='egress_block_set' type-id='type-id-1977' visibility='default' filepath='include/net/sch_generic.h' line='225' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='ingress_block_get' type-id='type-id-1978' visibility='default' filepath='include/net/sch_generic.h' line='227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='egress_block_get' type-id='type-id-1978' visibility='default' filepath='include/net/sch_generic.h' line='228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/net/sch_generic.h' line='230' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='Qdisc_class_ops' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='165' column='1' id='type-id-1979'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='select_queue' type-id='type-id-1980' visibility='default' filepath='include/net/sch_generic.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='graft' type-id='type-id-1981' visibility='default' filepath='include/net/sch_generic.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='leaf' type-id='type-id-1982' visibility='default' filepath='include/net/sch_generic.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='qlen_notify' type-id='type-id-1983' visibility='default' filepath='include/net/sch_generic.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='find' type-id='type-id-1984' visibility='default' filepath='include/net/sch_generic.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='change' type-id='type-id-1985' visibility='default' filepath='include/net/sch_generic.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='delete' type-id='type-id-1986' visibility='default' filepath='include/net/sch_generic.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='walk' type-id='type-id-1987' visibility='default' filepath='include/net/sch_generic.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='tcf_block' type-id='type-id-1988' visibility='default' filepath='include/net/sch_generic.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='bind_tcf' type-id='type-id-1989' visibility='default' filepath='include/net/sch_generic.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='unbind_tcf' type-id='type-id-1983' visibility='default' filepath='include/net/sch_generic.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='dump' type-id='type-id-1990' visibility='default' filepath='include/net/sch_generic.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='dump_stats' type-id='type-id-1991' visibility='default' filepath='include/net/sch_generic.h' line='193' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netdev_queue' size-in-bits='2560' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='564' column='1' id='type-id-1992'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/linux/netdevice.h' line='568' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='qdisc' type-id='type-id-1685' visibility='default' filepath='include/linux/netdevice.h' line='569' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='qdisc_sleeping' type-id='type-id-1685' visibility='default' filepath='include/linux/netdevice.h' line='570' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/netdevice.h' line='572' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='tx_maxrate' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='577' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='trans_timeout' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='582' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='sb_dev' type-id='type-id-1648' visibility='default' filepath='include/linux/netdevice.h' line='585' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='_xmit_lock' type-id='type-id-247' visibility='default' filepath='include/linux/netdevice.h' line='589' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='xmit_lock_owner' type-id='type-id-17' visibility='default' filepath='include/linux/netdevice.h' line='590' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='trans_start' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='594' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='state' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='596' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='dql' type-id='type-id-1993' visibility='default' filepath='include/linux/netdevice.h' line='599' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dql' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='41' column='1' id='type-id-1993'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='num_queued' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='adj_limit' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='last_obj_cnt' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='limit' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='num_completed' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='prev_ovlimit' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='prev_num_queued' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='prev_last_obj_cnt' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='lowest_slack' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='slack_start_time' type-id='type-id-16' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='max_limit' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='min_limit' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='slack_hold_time' type-id='type-id-5' visibility='default' filepath='include/linux/dynamic_queue_limits.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tcmsg' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='552' column='1' id='type-id-1994'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tcm_family' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='553' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='tcm__pad1' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='554' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='tcm__pad2' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='555' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='tcm_ifindex' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='556' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tcm_handle' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='557' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='tcm_parent' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='558' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tcm_info' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='563' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='gnet_dump' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/net/gen_stats.h' line='17' column='1' id='type-id-1995'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-486' visibility='default' filepath='include/net/gen_stats.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='skb' type-id='type-id-1766' visibility='default' filepath='include/net/gen_stats.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tail' type-id='type-id-1996' visibility='default' filepath='include/net/gen_stats.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='compat_tc_stats' type-id='type-id-17' visibility='default' filepath='include/net/gen_stats.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='compat_xstats' type-id='type-id-17' visibility='default' filepath='include/net/gen_stats.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='padattr' type-id='type-id-17' visibility='default' filepath='include/net/gen_stats.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='xstats' type-id='type-id-15' visibility='default' filepath='include/net/gen_stats.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='xstats_len' type-id='type-id-17' visibility='default' filepath='include/net/gen_stats.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='tc_stats' type-id='type-id-1997' visibility='default' filepath='include/net/gen_stats.h' line='28' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tc_stats' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='33' column='1' id='type-id-1997'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bytes' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='packets' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='drops' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='overlimits' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='bps' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='pps' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='qlen' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='backlog' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='42' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='qdisc_size_table' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='38' column='1' id='type-id-1998'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/sch_generic.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/sch_generic.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='szopts' type-id='type-id-1999' visibility='default' filepath='include/net/sch_generic.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='refcnt' type-id='type-id-17' visibility='default' filepath='include/net/sch_generic.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='data' type-id='type-id-1172' visibility='default' filepath='include/net/sch_generic.h' line='43' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tc_sizespec' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='101' column='1' id='type-id-1999'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cell_log' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='size_log' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='cell_align' type-id='type-id-261' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='overhead' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='linklayer' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='mpu' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mtu' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='tsize' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/pkt_sched.h' line='109' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='gnet_stats_basic_cpu' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/net/gen_stats.h' line='10' column='1' id='type-id-2000'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bstats' type-id='type-id-1968' visibility='default' filepath='include/net/gen_stats.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='syncp' type-id='type-id-2001' visibility='default' filepath='include/net/gen_stats.h' line='12' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='gnet_stats_basic_packed' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/gen_stats.h' line='28' column='1' id='type-id-1968'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bytes' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/gen_stats.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='packets' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/gen_stats.h' line='30' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='u64_stats_sync' is-struct='yes' visibility='default' filepath='include/linux/u64_stats_sync.h' line='65' column='1' id='type-id-2001'/>
+      <class-decl name='sk_buff_head' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/skbuff.h' line='283' column='1' id='type-id-1659'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-1766' visibility='default' filepath='include/linux/skbuff.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prev' type-id='type-id-1766' visibility='default' filepath='include/linux/skbuff.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='qlen' type-id='type-id-511' visibility='default' filepath='include/linux/skbuff.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/skbuff.h' line='289' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='qdisc_skb_head' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/sch_generic.h' line='47' column='1' id='type-id-1967'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-1766' visibility='default' filepath='include/net/sch_generic.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tail' type-id='type-id-1766' visibility='default' filepath='include/net/sch_generic.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='' type-id='type-id-2002' visibility='default' filepath='include/net/sch_generic.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/net/sch_generic.h' line='54' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__22' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='50' column='1' id='type-id-2002'>
+        <data-member access='private'>
+          <var-decl name='qlen' type-id='type-id-7' visibility='default' filepath='include/net/sch_generic.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='atomic_qlen' type-id='type-id-26' visibility='default' filepath='include/net/sch_generic.h' line='52' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__40' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='345' column='1' id='type-id-1960'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chain' type-id='type-id-1936' visibility='default' filepath='include/net/sch_generic.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='filter_chain_list' type-id='type-id-20' visibility='default' filepath='include/net/sch_generic.h' line='347' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xps_dev_maps' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='745' column='1' id='type-id-2003'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/netdevice.h' line='746' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='attr_map' type-id='type-id-1215' visibility='default' filepath='include/linux/netdevice.h' line='747' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xps_map' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='732' column='1' id='type-id-2004'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='len' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='733' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='alloc_len' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='734' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/netdevice.h' line='735' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='queues' type-id='type-id-1172' visibility='default' filepath='include/linux/netdevice.h' line='736' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='timer_list' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/timer.h' line='11' column='1' id='type-id-417'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='entry' type-id='type-id-520' visibility='default' filepath='include/linux/timer.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='expires' type-id='type-id-16' visibility='default' filepath='include/linux/timer.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='function' type-id='type-id-2005' visibility='default' filepath='include/linux/timer.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/linux/timer.h' line='19' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='include/linux/netdevice.h' line='1960' column='1' id='type-id-1687'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NETREG_UNINITIALIZED' value='0'/>
+        <enumerator name='NETREG_REGISTERED' value='1'/>
+        <enumerator name='NETREG_UNREGISTERING' value='2'/>
+        <enumerator name='NETREG_UNREGISTERED' value='3'/>
+        <enumerator name='NETREG_RELEASED' value='4'/>
+        <enumerator name='NETREG_DUMMY' value='5'/>
+      </enum-decl>
+      <enum-decl name='__anonymous_enum__1' is-anonymous='yes' filepath='include/linux/netdevice.h' line='1970' column='1' id='type-id-1688'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='RTNL_LINK_INITIALIZED' value='0'/>
+        <enumerator name='RTNL_LINK_INITIALIZING' value='1'/>
+      </enum-decl>
+      <typedef-decl name='possible_net_t' type-id='type-id-2006' filepath='include/net/net_namespace.h' line='288' column='1' id='type-id-1690'/>
+      <class-decl name='__anonymous_struct__41' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1690' visibility='default' filepath='include/net/net_namespace.h' line='284' column='1' id='type-id-2006'/>
+      <class-decl name='pcpu_sw_netstats' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='2364' column='1' id='type-id-2007'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rx_packets' type-id='type-id-40' visibility='default' filepath='include/linux/netdevice.h' line='2365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rx_bytes' type-id='type-id-40' visibility='default' filepath='include/linux/netdevice.h' line='2366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tx_packets' type-id='type-id-40' visibility='default' filepath='include/linux/netdevice.h' line='2367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tx_bytes' type-id='type-id-40' visibility='default' filepath='include/linux/netdevice.h' line='2368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='syncp' type-id='type-id-2001' visibility='default' filepath='include/linux/netdevice.h' line='2369' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='device' size-in-bits='6208' is-struct='yes' visibility='default' filepath='include/linux/device.h' line='991' column='1' id='type-id-388'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='parent' type-id='type-id-240' visibility='default' filepath='include/linux/device.h' line='992' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='p' type-id='type-id-2008' visibility='default' filepath='include/linux/device.h' line='994' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/device.h' line='996' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='init_name' type-id='type-id-4' visibility='default' filepath='include/linux/device.h' line='997' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='type' type-id='type-id-2009' visibility='default' filepath='include/linux/device.h' line='998' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/device.h' line='1000' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='bus' type-id='type-id-2010' visibility='default' filepath='include/linux/device.h' line='1004' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='driver' type-id='type-id-2011' visibility='default' filepath='include/linux/device.h' line='1005' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='platform_data' type-id='type-id-15' visibility='default' filepath='include/linux/device.h' line='1007' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='driver_data' type-id='type-id-15' visibility='default' filepath='include/linux/device.h' line='1009' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='links' type-id='type-id-2012' visibility='default' filepath='include/linux/device.h' line='1011' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='power' type-id='type-id-2013' visibility='default' filepath='include/linux/device.h' line='1012' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='pm_domain' type-id='type-id-2014' visibility='default' filepath='include/linux/device.h' line='1013' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='msi_domain' type-id='type-id-2015' visibility='default' filepath='include/linux/device.h' line='1016' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='pins' type-id='type-id-2016' visibility='default' filepath='include/linux/device.h' line='1019' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='msi_list' type-id='type-id-20' visibility='default' filepath='include/linux/device.h' line='1022' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='dma_ops' type-id='type-id-2017' visibility='default' filepath='include/linux/device.h' line='1028' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='dma_mask' type-id='type-id-1508' visibility='default' filepath='include/linux/device.h' line='1029' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='coherent_dma_mask' type-id='type-id-40' visibility='default' filepath='include/linux/device.h' line='1030' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='bus_dma_mask' type-id='type-id-40' visibility='default' filepath='include/linux/device.h' line='1035' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='dma_pfn_offset' type-id='type-id-16' visibility='default' filepath='include/linux/device.h' line='1036' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='dma_parms' type-id='type-id-2018' visibility='default' filepath='include/linux/device.h' line='1038' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='dma_pools' type-id='type-id-20' visibility='default' filepath='include/linux/device.h' line='1040' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='dma_mem' type-id='type-id-2019' visibility='default' filepath='include/linux/device.h' line='1042' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='cma_area' type-id='type-id-2020' visibility='default' filepath='include/linux/device.h' line='1045' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='archdata' type-id='type-id-2021' visibility='default' filepath='include/linux/device.h' line='1049' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='of_node' type-id='type-id-2022' visibility='default' filepath='include/linux/device.h' line='1051' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5248'>
+          <var-decl name='fwnode' type-id='type-id-2023' visibility='default' filepath='include/linux/device.h' line='1052' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='devt' type-id='type-id-269' visibility='default' filepath='include/linux/device.h' line='1054' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5344'>
+          <var-decl name='id' type-id='type-id-7' visibility='default' filepath='include/linux/device.h' line='1055' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='devres_lock' type-id='type-id-247' visibility='default' filepath='include/linux/device.h' line='1057' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='devres_head' type-id='type-id-20' visibility='default' filepath='include/linux/device.h' line='1058' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='knode_class' type-id='type-id-2024' visibility='default' filepath='include/linux/device.h' line='1060' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='class' type-id='type-id-2025' visibility='default' filepath='include/linux/device.h' line='1061' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='groups' type-id='type-id-665' visibility='default' filepath='include/linux/device.h' line='1062' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5952'>
+          <var-decl name='release' type-id='type-id-2026' visibility='default' filepath='include/linux/device.h' line='1064' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='iommu_group' type-id='type-id-2027' visibility='default' filepath='include/linux/device.h' line='1065' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='iommu_fwspec' type-id='type-id-2028' visibility='default' filepath='include/linux/device.h' line='1066' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='offline_disabled' type-id='type-id-33' visibility='default' filepath='include/linux/device.h' line='1068' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='offline' type-id='type-id-33' visibility='default' filepath='include/linux/device.h' line='1069' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='of_node_reused' type-id='type-id-33' visibility='default' filepath='include/linux/device.h' line='1070' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='state_synced' type-id='type-id-33' visibility='default' filepath='include/linux/device.h' line='1071' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='device_type' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/device.h' line='568' column='1' id='type-id-2029'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/device.h' line='569' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='groups' type-id='type-id-665' visibility='default' filepath='include/linux/device.h' line='570' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='uevent' type-id='type-id-2030' visibility='default' filepath='include/linux/device.h' line='571' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='devnode' type-id='type-id-2031' visibility='default' filepath='include/linux/device.h' line='572' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='release' type-id='type-id-2026' visibility='default' filepath='include/linux/device.h' line='574' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='pm' type-id='type-id-2032' visibility='default' filepath='include/linux/device.h' line='576' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='attribute_group' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/sysfs.h' line='84' column='1' id='type-id-2033'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/sysfs.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='is_visible' type-id='type-id-2034' visibility='default' filepath='include/linux/sysfs.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='is_bin_visible' type-id='type-id-2035' visibility='default' filepath='include/linux/sysfs.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='attrs' type-id='type-id-1412' visibility='default' filepath='include/linux/sysfs.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='bin_attrs' type-id='type-id-2036' visibility='default' filepath='include/linux/sysfs.h' line='91' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bin_attribute' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/sysfs.h' line='161' column='1' id='type-id-2037'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='attr' type-id='type-id-619' visibility='default' filepath='include/linux/sysfs.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='size' type-id='type-id-84' visibility='default' filepath='include/linux/sysfs.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/sysfs.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='read' type-id='type-id-2038' visibility='default' filepath='include/linux/sysfs.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='write' type-id='type-id-2038' visibility='default' filepath='include/linux/sysfs.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='mmap' type-id='type-id-2039' visibility='default' filepath='include/linux/sysfs.h' line='169' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dev_pm_ops' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/linux/pm.h' line='290' column='1' id='type-id-2040'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prepare' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='complete' type-id='type-id-2026' visibility='default' filepath='include/linux/pm.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='suspend' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='resume' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='freeze' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='thaw' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='poweroff' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='restore' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='suspend_late' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='resume_early' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='freeze_late' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='thaw_early' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='poweroff_late' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='restore_early' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='suspend_noirq' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='resume_noirq' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='freeze_noirq' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='thaw_noirq' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='poweroff_noirq' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='restore_noirq' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='310' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='runtime_suspend' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='runtime_resume' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='runtime_idle' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='313' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bus_type' size-in-bits='1408' is-struct='yes' visibility='default' filepath='include/linux/device.h' line='121' column='1' id='type-id-2042'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/device.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev_name' type-id='type-id-4' visibility='default' filepath='include/linux/device.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dev_root' type-id='type-id-240' visibility='default' filepath='include/linux/device.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='bus_groups' type-id='type-id-665' visibility='default' filepath='include/linux/device.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dev_groups' type-id='type-id-665' visibility='default' filepath='include/linux/device.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='drv_groups' type-id='type-id-665' visibility='default' filepath='include/linux/device.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='match' type-id='type-id-2043' visibility='default' filepath='include/linux/device.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='uevent' type-id='type-id-2030' visibility='default' filepath='include/linux/device.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='probe' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='sync_state' type-id='type-id-2026' visibility='default' filepath='include/linux/device.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='remove' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='shutdown' type-id='type-id-2026' visibility='default' filepath='include/linux/device.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='online' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='offline' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='suspend' type-id='type-id-2044' visibility='default' filepath='include/linux/device.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='resume' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='num_vf' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='dma_configure' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='pm' type-id='type-id-2032' visibility='default' filepath='include/linux/device.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='iommu_ops' type-id='type-id-2045' visibility='default' filepath='include/linux/device.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='p' type-id='type-id-2046' visibility='default' filepath='include/linux/device.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='lock_key' type-id='type-id-1144' visibility='default' filepath='include/linux/device.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='need_parent_lock' type-id='type-id-33' visibility='default' filepath='include/linux/device.h' line='153' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='device_driver' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/linux/device.h' line='292' column='1' id='type-id-2047'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/device.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bus' type-id='type-id-2010' visibility='default' filepath='include/linux/device.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/device.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mod_name' type-id='type-id-4' visibility='default' filepath='include/linux/device.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='suppress_bind_attrs' type-id='type-id-33' visibility='default' filepath='include/linux/device.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='probe_type' type-id='type-id-2048' visibility='default' filepath='include/linux/device.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='of_match_table' type-id='type-id-2049' visibility='default' filepath='include/linux/device.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='acpi_match_table' type-id='type-id-2050' visibility='default' filepath='include/linux/device.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='probe' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='sync_state' type-id='type-id-2026' visibility='default' filepath='include/linux/device.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='remove' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='shutdown' type-id='type-id-2026' visibility='default' filepath='include/linux/device.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='suspend' type-id='type-id-2044' visibility='default' filepath='include/linux/device.h' line='309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='resume' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='310' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='groups' type-id='type-id-665' visibility='default' filepath='include/linux/device.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='pm' type-id='type-id-2032' visibility='default' filepath='include/linux/device.h' line='313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='coredump' type-id='type-id-2026' visibility='default' filepath='include/linux/device.h' line='314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='p' type-id='type-id-2051' visibility='default' filepath='include/linux/device.h' line='316' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='probe_type' filepath='include/linux/device.h' line='243' column='1' id='type-id-2048'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='PROBE_DEFAULT_STRATEGY' value='0'/>
+        <enumerator name='PROBE_PREFER_ASYNCHRONOUS' value='1'/>
+        <enumerator name='PROBE_FORCE_SYNCHRONOUS' value='2'/>
+      </enum-decl>
+      <typedef-decl name='pm_message_t' type-id='type-id-2052' filepath='include/linux/pm.h' line='64' column='1' id='type-id-2053'/>
+      <class-decl name='pm_message' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/pm.h' line='62' column='1' id='type-id-2052'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='event' type-id='type-id-17' visibility='default' filepath='include/linux/pm.h' line='63' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='lock_class_key' is-struct='yes' visibility='default' filepath='include/linux/lockdep.h' line='433' column='1' id='type-id-1144'/>
+      <class-decl name='dev_links_info' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/device.h' line='901' column='1' id='type-id-2012'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='suppliers' type-id='type-id-20' visibility='default' filepath='include/linux/device.h' line='902' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='consumers' type-id='type-id-20' visibility='default' filepath='include/linux/device.h' line='903' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='needs_suppliers' type-id='type-id-20' visibility='default' filepath='include/linux/device.h' line='904' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='defer_sync' type-id='type-id-20' visibility='default' filepath='include/linux/device.h' line='905' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='need_for_probe' type-id='type-id-33' visibility='default' filepath='include/linux/device.h' line='906' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='status' type-id='type-id-2054' visibility='default' filepath='include/linux/device.h' line='907' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='dl_dev_state' filepath='include/linux/device.h' line='884' column='1' id='type-id-2054'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DL_DEV_NO_DRIVER' value='0'/>
+        <enumerator name='DL_DEV_PROBING' value='1'/>
+        <enumerator name='DL_DEV_DRIVER_BOUND' value='2'/>
+        <enumerator name='DL_DEV_UNBINDING' value='3'/>
+      </enum-decl>
+      <class-decl name='dev_pm_info' size-in-bits='2240' is-struct='yes' visibility='default' filepath='include/linux/pm.h' line='585' column='1' id='type-id-2013'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='power_state' type-id='type-id-2053' visibility='default' filepath='include/linux/pm.h' line='586' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='can_wakeup' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='587' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='async_suspend' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='588' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='in_dpm_list' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='589' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='is_prepared' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='590' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='is_suspended' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='591' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2'>
+          <var-decl name='is_noirq_suspended' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='592' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1'>
+          <var-decl name='is_late_suspended' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='593' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='no_pm' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='594' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='early_init' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='595' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='direct_complete' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='596' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='driver_flags' type-id='type-id-7' visibility='default' filepath='include/linux/pm.h' line='597' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/pm.h' line='598' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='entry' type-id='type-id-20' visibility='default' filepath='include/linux/pm.h' line='600' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='completion' type-id='type-id-1606' visibility='default' filepath='include/linux/pm.h' line='601' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='wakeup' type-id='type-id-2055' visibility='default' filepath='include/linux/pm.h' line='602' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='wakeup_path' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='603' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='syscore' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='604' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='no_pm_callbacks' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='605' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='must_resume' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='606' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='may_skip_resume' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='607' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='suspend_timer' type-id='type-id-417' visibility='default' filepath='include/linux/pm.h' line='612' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='timer_expires' type-id='type-id-16' visibility='default' filepath='include/linux/pm.h' line='613' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='work' type-id='type-id-255' visibility='default' filepath='include/linux/pm.h' line='614' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='wait_queue' type-id='type-id-225' visibility='default' filepath='include/linux/pm.h' line='615' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='wakeirq' type-id='type-id-2056' visibility='default' filepath='include/linux/pm.h' line='616' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='usage_count' type-id='type-id-26' visibility='default' filepath='include/linux/pm.h' line='617' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1568'>
+          <var-decl name='child_count' type-id='type-id-26' visibility='default' filepath='include/linux/pm.h' line='618' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='disable_depth' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='619' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='idle_notification' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='620' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='request_pending' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='621' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26'>
+          <var-decl name='deferred_resume' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='622' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='25'>
+          <var-decl name='runtime_auto' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='623' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='ignore_children' type-id='type-id-33' visibility='default' filepath='include/linux/pm.h' line='624' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23'>
+          <var-decl name='no_callbacks' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='625' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22'>
+          <var-decl name='irq_safe' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='626' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='21'>
+          <var-decl name='use_autosuspend' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='627' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20'>
+          <var-decl name='timer_autosuspends' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='628' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19'>
+          <var-decl name='memalloc_noio' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='629' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1632'>
+          <var-decl name='links_count' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='630' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='request' type-id='type-id-2057' visibility='default' filepath='include/linux/pm.h' line='631' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1696'>
+          <var-decl name='runtime_status' type-id='type-id-2058' visibility='default' filepath='include/linux/pm.h' line='632' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='runtime_error' type-id='type-id-17' visibility='default' filepath='include/linux/pm.h' line='633' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1760'>
+          <var-decl name='autosuspend_delay' type-id='type-id-17' visibility='default' filepath='include/linux/pm.h' line='634' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='last_busy' type-id='type-id-16' visibility='default' filepath='include/linux/pm.h' line='635' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='active_jiffies' type-id='type-id-16' visibility='default' filepath='include/linux/pm.h' line='636' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='suspended_jiffies' type-id='type-id-16' visibility='default' filepath='include/linux/pm.h' line='637' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='accounting_timestamp' type-id='type-id-16' visibility='default' filepath='include/linux/pm.h' line='638' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='subsys_data' type-id='type-id-2059' visibility='default' filepath='include/linux/pm.h' line='640' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='set_latency_tolerance' type-id='type-id-2060' visibility='default' filepath='include/linux/pm.h' line='641' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='qos' type-id='type-id-2061' visibility='default' filepath='include/linux/pm.h' line='642' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='wakeup_source' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/linux/pm_wakeup.h' line='56' column='1' id='type-id-2062'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/pm_wakeup.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/pm_wakeup.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='entry' type-id='type-id-20' visibility='default' filepath='include/linux/pm_wakeup.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/pm_wakeup.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='wakeirq' type-id='type-id-2056' visibility='default' filepath='include/linux/pm_wakeup.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='timer' type-id='type-id-417' visibility='default' filepath='include/linux/pm_wakeup.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='timer_expires' type-id='type-id-16' visibility='default' filepath='include/linux/pm_wakeup.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='total_time' type-id='type-id-682' visibility='default' filepath='include/linux/pm_wakeup.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='max_time' type-id='type-id-682' visibility='default' filepath='include/linux/pm_wakeup.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='last_time' type-id='type-id-682' visibility='default' filepath='include/linux/pm_wakeup.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='start_prevent_time' type-id='type-id-682' visibility='default' filepath='include/linux/pm_wakeup.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='prevent_sleep_time' type-id='type-id-682' visibility='default' filepath='include/linux/pm_wakeup.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='event_count' type-id='type-id-16' visibility='default' filepath='include/linux/pm_wakeup.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='active_count' type-id='type-id-16' visibility='default' filepath='include/linux/pm_wakeup.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='relax_count' type-id='type-id-16' visibility='default' filepath='include/linux/pm_wakeup.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='expire_count' type-id='type-id-16' visibility='default' filepath='include/linux/pm_wakeup.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='wakeup_count' type-id='type-id-16' visibility='default' filepath='include/linux/pm_wakeup.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/pm_wakeup.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='active' type-id='type-id-33' visibility='default' filepath='include/linux/pm_wakeup.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='autosleep_enabled' type-id='type-id-33' visibility='default' filepath='include/linux/pm_wakeup.h' line='76' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='rpm_request' filepath='include/linux/pm.h' line='530' column='1' id='type-id-2057'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='RPM_REQ_NONE' value='0'/>
+        <enumerator name='RPM_REQ_IDLE' value='1'/>
+        <enumerator name='RPM_REQ_SUSPEND' value='2'/>
+        <enumerator name='RPM_REQ_AUTOSUSPEND' value='3'/>
+        <enumerator name='RPM_REQ_RESUME' value='4'/>
+      </enum-decl>
+      <enum-decl name='rpm_status' filepath='include/linux/pm.h' line='508' column='1' id='type-id-2058'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='RPM_ACTIVE' value='0'/>
+        <enumerator name='RPM_RESUMING' value='1'/>
+        <enumerator name='RPM_SUSPENDED' value='2'/>
+        <enumerator name='RPM_SUSPENDING' value='3'/>
+      </enum-decl>
+      <class-decl name='pm_subsys_data' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/pm.h' line='542' column='1' id='type-id-2063'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/pm.h' line='543' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='refcount' type-id='type-id-5' visibility='default' filepath='include/linux/pm.h' line='544' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='clock_list' type-id='type-id-20' visibility='default' filepath='include/linux/pm.h' line='546' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dev_pm_domain' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/linux/pm.h' line='662' column='1' id='type-id-2064'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ops' type-id='type-id-2040' visibility='default' filepath='include/linux/pm.h' line='663' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='detach' type-id='type-id-2065' visibility='default' filepath='include/linux/pm.h' line='664' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='activate' type-id='type-id-2041' visibility='default' filepath='include/linux/pm.h' line='665' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='sync' type-id='type-id-2026' visibility='default' filepath='include/linux/pm.h' line='666' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='dismiss' type-id='type-id-2026' visibility='default' filepath='include/linux/pm.h' line='667' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_map_ops' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/linux/dma-mapping.h' line='79' column='1' id='type-id-2066'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='alloc' type-id='type-id-2067' visibility='default' filepath='include/linux/dma-mapping.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='free' type-id='type-id-2068' visibility='default' filepath='include/linux/dma-mapping.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mmap' type-id='type-id-2069' visibility='default' filepath='include/linux/dma-mapping.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='get_sgtable' type-id='type-id-2070' visibility='default' filepath='include/linux/dma-mapping.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='map_page' type-id='type-id-2071' visibility='default' filepath='include/linux/dma-mapping.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='unmap_page' type-id='type-id-2072' visibility='default' filepath='include/linux/dma-mapping.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='map_sg' type-id='type-id-2073' visibility='default' filepath='include/linux/dma-mapping.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='unmap_sg' type-id='type-id-2074' visibility='default' filepath='include/linux/dma-mapping.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='map_resource' type-id='type-id-2075' visibility='default' filepath='include/linux/dma-mapping.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='unmap_resource' type-id='type-id-2072' visibility='default' filepath='include/linux/dma-mapping.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='sync_single_for_cpu' type-id='type-id-2076' visibility='default' filepath='include/linux/dma-mapping.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='sync_single_for_device' type-id='type-id-2076' visibility='default' filepath='include/linux/dma-mapping.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='sync_sg_for_cpu' type-id='type-id-2077' visibility='default' filepath='include/linux/dma-mapping.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='sync_sg_for_device' type-id='type-id-2077' visibility='default' filepath='include/linux/dma-mapping.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='cache_sync' type-id='type-id-2078' visibility='default' filepath='include/linux/dma-mapping.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='mapping_error' type-id='type-id-2079' visibility='default' filepath='include/linux/dma-mapping.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='dma_supported' type-id='type-id-2080' visibility='default' filepath='include/linux/dma-mapping.h' line='132' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='dma_addr_t' type-id='type-id-40' filepath='include/linux/types.h' line='153' column='1' id='type-id-2081'/>
+      <class-decl name='sg_table' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/scatterlist.h' line='42' column='1' id='type-id-2082'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sgl' type-id='type-id-918' visibility='default' filepath='include/linux/scatterlist.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nents' type-id='type-id-5' visibility='default' filepath='include/linux/scatterlist.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='orig_nents' type-id='type-id-5' visibility='default' filepath='include/linux/scatterlist.h' line='45' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='scatterlist' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/scatterlist.h' line='11' column='1' id='type-id-2083'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='page_link' type-id='type-id-16' visibility='default' filepath='include/linux/scatterlist.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='offset' type-id='type-id-5' visibility='default' filepath='include/linux/scatterlist.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='length' type-id='type-id-5' visibility='default' filepath='include/linux/scatterlist.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dma_address' type-id='type-id-2081' visibility='default' filepath='include/linux/scatterlist.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dma_length' type-id='type-id-5' visibility='default' filepath='include/linux/scatterlist.h' line='17' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='page' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/mm_types.h' line='70' column='1' id='type-id-2084'>
+        <member-type access='public'>
+          <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='163' column='1' id='type-id-2085'>
+            <data-member access='private'>
+              <var-decl name='_mapcount' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='168' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='page_type' type-id='type-id-5' visibility='default' filepath='include/linux/mm_types.h' line='176' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='active' type-id='type-id-5' visibility='default' filepath='include/linux/mm_types.h' line='178' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='units' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types.h' line='179' column='1'/>
+            </data-member>
+          </union-decl>
+        </member-type>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='' type-id='type-id-2086' visibility='default' filepath='include/linux/mm_types.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='_refcount' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='mem_cgroup' type-id='type-id-1535' visibility='default' filepath='include/linux/mm_types.h' line='186' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__42' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='80' column='1' id='type-id-2087'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lru' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mapping' type-id='type-id-1279' visibility='default' filepath='include/linux/mm_types.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='index' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='private' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='96' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='address_space' size-in-bits='1344' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='417' column='1' id='type-id-1305'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='host' type-id='type-id-1127' visibility='default' filepath='include/linux/fs.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='i_pages' type-id='type-id-415' visibility='default' filepath='include/linux/fs.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='i_mmap_writable' type-id='type-id-26' visibility='default' filepath='include/linux/fs.h' line='420' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='i_mmap' type-id='type-id-1521' visibility='default' filepath='include/linux/fs.h' line='421' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='i_mmap_rwsem' type-id='type-id-246' visibility='default' filepath='include/linux/fs.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='nrpages' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='nrexceptional' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='writeback_index' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='427' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='a_ops' type-id='type-id-2088' visibility='default' filepath='include/linux/fs.h' line='428' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='429' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='private_lock' type-id='type-id-247' visibility='default' filepath='include/linux/fs.h' line='430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='gfp_mask' type-id='type-id-485' visibility='default' filepath='include/linux/fs.h' line='431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='private_list' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='private_data' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='433' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='wb_err' type-id='type-id-1280' visibility='default' filepath='include/linux/fs.h' line='434' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rb_root_cached' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/rbtree.h' line='57' column='1' id='type-id-1521'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rb_root' type-id='type-id-416' visibility='default' filepath='include/linux/rbtree.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rb_leftmost' type-id='type-id-1236' visibility='default' filepath='include/linux/rbtree.h' line='59' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='address_space_operations' size-in-bits='1344' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='353' column='1' id='type-id-2089'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='writepage' type-id='type-id-2090' visibility='default' filepath='include/linux/fs.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='readpage' type-id='type-id-2091' visibility='default' filepath='include/linux/fs.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='writepages' type-id='type-id-2092' visibility='default' filepath='include/linux/fs.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='set_page_dirty' type-id='type-id-2093' visibility='default' filepath='include/linux/fs.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='readpages' type-id='type-id-2094' visibility='default' filepath='include/linux/fs.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='write_begin' type-id='type-id-2095' visibility='default' filepath='include/linux/fs.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='write_end' type-id='type-id-2096' visibility='default' filepath='include/linux/fs.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='bmap' type-id='type-id-2097' visibility='default' filepath='include/linux/fs.h' line='378' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='invalidatepage' type-id='type-id-2098' visibility='default' filepath='include/linux/fs.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='releasepage' type-id='type-id-2099' visibility='default' filepath='include/linux/fs.h' line='380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='freepage' type-id='type-id-2100' visibility='default' filepath='include/linux/fs.h' line='381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='direct_IO' type-id='type-id-2101' visibility='default' filepath='include/linux/fs.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='migratepage' type-id='type-id-2102' visibility='default' filepath='include/linux/fs.h' line='387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='isolate_page' type-id='type-id-2103' visibility='default' filepath='include/linux/fs.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='putback_page' type-id='type-id-2100' visibility='default' filepath='include/linux/fs.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='launder_page' type-id='type-id-2093' visibility='default' filepath='include/linux/fs.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='is_partially_uptodate' type-id='type-id-2104' visibility='default' filepath='include/linux/fs.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='is_dirty_writeback' type-id='type-id-2105' visibility='default' filepath='include/linux/fs.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='error_remove_page' type-id='type-id-2106' visibility='default' filepath='include/linux/fs.h' line='395' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='swap_activate' type-id='type-id-2107' visibility='default' filepath='include/linux/fs.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='swap_deactivate' type-id='type-id-2108' visibility='default' filepath='include/linux/fs.h' line='400' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='sector_t' type-id='type-id-16' filepath='include/linux/types.h' line='134' column='1' id='type-id-386'/>
+      <class-decl name='kiocb' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='310' column='1' id='type-id-2109'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ki_filp' type-id='type-id-83' visibility='default' filepath='include/linux/fs.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ki_pos' type-id='type-id-763' visibility='default' filepath='include/linux/fs.h' line='316' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ki_complete' type-id='type-id-2110' visibility='default' filepath='include/linux/fs.h' line='317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ki_flags' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='319' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='ki_hint' type-id='type-id-688' visibility='default' filepath='include/linux/fs.h' line='320' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='304'>
+          <var-decl name='ki_ioprio' type-id='type-id-688' visibility='default' filepath='include/linux/fs.h' line='321' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iov_iter' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/uio.h' line='31' column='1' id='type-id-2111'>
+        <member-type access='public'>
+          <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/uio.h' line='41' column='1' id='type-id-2112'>
+            <data-member access='private'>
+              <var-decl name='nr_segs' type-id='type-id-16' visibility='default' filepath='include/linux/uio.h' line='42' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='' type-id='type-id-2113' visibility='default' filepath='include/linux/uio.h' line='43' column='1'/>
+            </data-member>
+          </union-decl>
+        </member-type>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-17' visibility='default' filepath='include/linux/uio.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='iov_offset' type-id='type-id-84' visibility='default' filepath='include/linux/uio.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='count' type-id='type-id-84' visibility='default' filepath='include/linux/uio.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='' type-id='type-id-2114' visibility='default' filepath='include/linux/uio.h' line='35' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__25' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/uio.h' line='35' column='1' id='type-id-2114'>
+        <data-member access='private'>
+          <var-decl name='iov' type-id='type-id-2115' visibility='default' filepath='include/linux/uio.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='kvec' type-id='type-id-2116' visibility='default' filepath='include/linux/uio.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='bvec' type-id='type-id-2117' visibility='default' filepath='include/linux/uio.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='pipe' type-id='type-id-87' visibility='default' filepath='include/linux/uio.h' line='39' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='iovec' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/uio.h' line='17' column='1' id='type-id-2118'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='iov_base' type-id='type-id-15' visibility='default' filepath='include/uapi/linux/uio.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='iov_len' type-id='type-id-887' visibility='default' filepath='include/uapi/linux/uio.h' line='20' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kvec' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/uio.h' line='19' column='1' id='type-id-2119'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='iov_base' type-id='type-id-15' visibility='default' filepath='include/linux/uio.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='iov_len' type-id='type-id-84' visibility='default' filepath='include/linux/uio.h' line='21' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pipe_inode_info' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/linux/pipe_fs_i.h' line='48' column='1' id='type-id-2120'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/pipe_fs_i.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='wait' type-id='type-id-225' visibility='default' filepath='include/linux/pipe_fs_i.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='nrbufs' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='curbuf' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='buffers' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='readers' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='writers' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='files' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='waiting_writers' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='r_counter' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='w_counter' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='tmp_page' type-id='type-id-512' visibility='default' filepath='include/linux/pipe_fs_i.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='fasync_readers' type-id='type-id-254' visibility='default' filepath='include/linux/pipe_fs_i.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='fasync_writers' type-id='type-id-254' visibility='default' filepath='include/linux/pipe_fs_i.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='bufs' type-id='type-id-2121' visibility='default' filepath='include/linux/pipe_fs_i.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='user' type-id='type-id-1229' visibility='default' filepath='include/linux/pipe_fs_i.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fasync_struct' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1283' column='1' id='type-id-2122'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fa_lock' type-id='type-id-885' visibility='default' filepath='include/linux/fs.h' line='1284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='magic' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='1285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='fa_fd' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='1286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fa_next' type-id='type-id-254' visibility='default' filepath='include/linux/fs.h' line='1287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='fa_file' type-id='type-id-83' visibility='default' filepath='include/linux/fs.h' line='1288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='fa_rcu' type-id='type-id-385' visibility='default' filepath='include/linux/fs.h' line='1289' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='rwlock_t' type-id='type-id-2123' filepath='include/linux/rwlock_types.h' line='20' column='1' id='type-id-885'/>
+      <class-decl name='__anonymous_struct__43' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-885' visibility='default' filepath='include/linux/rwlock_types.h' line='11' column='1' id='type-id-2123'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='raw_lock' type-id='type-id-2124' visibility='default' filepath='include/linux/rwlock_types.h' line='12' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='arch_rwlock_t' type-id='type-id-2125' filepath='include/asm-generic/qrwlock_types.h' line='27' column='1' id='type-id-2124'/>
+      <class-decl name='qrwlock' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/asm-generic/qrwlock_types.h' line='13' column='1' id='type-id-2125'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-2126' visibility='default' filepath='include/asm-generic/qrwlock_types.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='wait_lock' type-id='type-id-32' visibility='default' filepath='include/asm-generic/qrwlock_types.h' line='26' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__26' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/asm-generic/qrwlock_types.h' line='14' column='1' id='type-id-2126'>
+        <data-member access='private'>
+          <var-decl name='cnts' type-id='type-id-26' visibility='default' filepath='include/asm-generic/qrwlock_types.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-2127' visibility='default' filepath='include/asm-generic/qrwlock_types.h' line='16' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__44' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/asm-generic/qrwlock_types.h' line='16' column='1' id='type-id-2127'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='wlocked' type-id='type-id-214' visibility='default' filepath='include/asm-generic/qrwlock_types.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='__lstate' type-id='type-id-1183' visibility='default' filepath='include/asm-generic/qrwlock_types.h' line='19' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pipe_buffer' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/pipe_fs_i.h' line='21' column='1' id='type-id-2128'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='page' type-id='type-id-512' visibility='default' filepath='include/linux/pipe_fs_i.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='offset' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='len' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ops' type-id='type-id-2129' visibility='default' filepath='include/linux/pipe_fs_i.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/pipe_fs_i.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='private' type-id='type-id-16' visibility='default' filepath='include/linux/pipe_fs_i.h' line='26' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pipe_buf_operations' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/pipe_fs_i.h' line='75' column='1' id='type-id-2130'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='can_merge' type-id='type-id-17' visibility='default' filepath='include/linux/pipe_fs_i.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='confirm' type-id='type-id-2131' visibility='default' filepath='include/linux/pipe_fs_i.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='release' type-id='type-id-2132' visibility='default' filepath='include/linux/pipe_fs_i.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='steal' type-id='type-id-2131' visibility='default' filepath='include/linux/pipe_fs_i.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='get' type-id='type-id-2133' visibility='default' filepath='include/linux/pipe_fs_i.h' line='111' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__45' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/uio.h' line='43' column='1' id='type-id-2113'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='idx' type-id='type-id-17' visibility='default' filepath='include/linux/uio.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='start_idx' type-id='type-id-17' visibility='default' filepath='include/linux/uio.h' line='45' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='migrate_mode' filepath='include/linux/migrate_mode.h' line='15' column='1' id='type-id-2134'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='MIGRATE_ASYNC' value='0'/>
+        <enumerator name='MIGRATE_SYNC_LIGHT' value='1'/>
+        <enumerator name='MIGRATE_SYNC' value='2'/>
+        <enumerator name='MIGRATE_SYNC_NO_COPY' value='3'/>
+      </enum-decl>
+      <typedef-decl name='isolate_mode_t' type-id='type-id-5' filepath='include/linux/mmzone.h' line='265' column='1' id='type-id-2135'/>
+      <typedef-decl name='errseq_t' type-id='type-id-7' filepath='include/linux/errseq.h' line='8' column='1' id='type-id-1280'/>
+      <class-decl name='__anonymous_struct__46' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='101' column='1' id='type-id-2136'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-512' visibility='default' filepath='include/linux/mm_types.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pages' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='pobjects' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types.h' line='105' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__47' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='118' column='1' id='type-id-2137'>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='inuse' type-id='type-id-5' visibility='default' filepath='include/linux/mm_types.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1'>
+          <var-decl name='objects' type-id='type-id-5' visibility='default' filepath='include/linux/mm_types.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='frozen' type-id='type-id-5' visibility='default' filepath='include/linux/mm_types.h' line='121' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pgtable_t' type-id='type-id-512' filepath='arch/arm64/include/asm/page.h' line='38' column='1' id='type-id-2138'/>
+      <union-decl name='__anonymous_union__28' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='142' column='1' id='type-id-2139'>
+        <data-member access='private'>
+          <var-decl name='pt_mm' type-id='type-id-882' visibility='default' filepath='include/linux/mm_types.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='pt_frag_refcount' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='144' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='dev_pagemap' size-in-bits='1344' is-struct='yes' visibility='default' filepath='include/linux/memremap.h' line='114' column='1' id='type-id-2140'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='page_fault' type-id='type-id-2141' visibility='default' filepath='include/linux/memremap.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='page_free' type-id='type-id-2142' visibility='default' filepath='include/linux/memremap.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='altmap' type-id='type-id-2143' visibility='default' filepath='include/linux/memremap.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='altmap_valid' type-id='type-id-33' visibility='default' filepath='include/linux/memremap.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='res' type-id='type-id-2144' visibility='default' filepath='include/linux/memremap.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='ref' type-id='type-id-2145' visibility='default' filepath='include/linux/memremap.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='kill' type-id='type-id-2146' visibility='default' filepath='include/linux/memremap.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/memremap.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/memremap.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='type' type-id='type-id-2147' visibility='default' filepath='include/linux/memremap.h' line='124' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='dev_page_fault_t' type-id='type-id-2148' filepath='include/linux/memremap.h' line='95' column='1' id='type-id-2141'/>
+      <typedef-decl name='pmd_t' type-id='type-id-2149' filepath='arch/arm64/include/asm/pgtable-types.h' line='38' column='1' id='type-id-2150'/>
+      <class-decl name='__anonymous_struct__48' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-2150' visibility='default' filepath='arch/arm64/include/asm/pgtable-types.h' line='38' column='1' id='type-id-2149'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pmd' type-id='type-id-2151' visibility='default' filepath='arch/arm64/include/asm/pgtable-types.h' line='38' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pmdval_t' type-id='type-id-40' filepath='arch/arm64/include/asm/pgtable-types.h' line='26' column='1' id='type-id-2151'/>
+      <typedef-decl name='dev_page_free_t' type-id='type-id-2152' filepath='include/linux/memremap.h' line='100' column='1' id='type-id-2142'/>
+      <class-decl name='vmem_altmap' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/memremap.h' line='20' column='1' id='type-id-2143'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base_pfn' type-id='type-id-2153' visibility='default' filepath='include/linux/memremap.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='reserve' type-id='type-id-2153' visibility='default' filepath='include/linux/memremap.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='free' type-id='type-id-16' visibility='default' filepath='include/linux/memremap.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='align' type-id='type-id-16' visibility='default' filepath='include/linux/memremap.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='alloc' type-id='type-id-16' visibility='default' filepath='include/linux/memremap.h' line='25' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='resource' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/ioport.h' line='19' column='1' id='type-id-2144'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start' type-id='type-id-2154' visibility='default' filepath='include/linux/ioport.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='end' type-id='type-id-2154' visibility='default' filepath='include/linux/ioport.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/ioport.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/ioport.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='desc' type-id='type-id-16' visibility='default' filepath='include/linux/ioport.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='parent' type-id='type-id-2155' visibility='default' filepath='include/linux/ioport.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='sibling' type-id='type-id-2155' visibility='default' filepath='include/linux/ioport.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='child' type-id='type-id-2155' visibility='default' filepath='include/linux/ioport.h' line='25' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='resource_size_t' type-id='type-id-99' filepath='include/linux/types.h' line='168' column='1' id='type-id-2154'/>
+      <class-decl name='percpu_ref' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/percpu-refcount.h' line='88' column='1' id='type-id-391'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-115' visibility='default' filepath='include/linux/percpu-refcount.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='percpu_count_ptr' type-id='type-id-16' visibility='default' filepath='include/linux/percpu-refcount.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='release' type-id='type-id-2156' visibility='default' filepath='include/linux/percpu-refcount.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='confirm_switch' type-id='type-id-2156' visibility='default' filepath='include/linux/percpu-refcount.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='force_atomic' type-id='type-id-33' visibility='default' filepath='include/linux/percpu-refcount.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/percpu-refcount.h' line='98' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='percpu_ref_func_t' type-id='type-id-2157' filepath='include/linux/percpu-refcount.h' line='60' column='1' id='type-id-2158'/>
+      <enum-decl name='memory_type' filepath='include/linux/memremap.h' line='57' column='1' id='type-id-2147'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='MEMORY_DEVICE_PRIVATE' value='1'/>
+        <enumerator name='MEMORY_DEVICE_PUBLIC' value='2'/>
+        <enumerator name='MEMORY_DEVICE_FS_DAX' value='3'/>
+      </enum-decl>
+      <enum-decl name='dma_data_direction' filepath='include/linux/dma-direction.h' line='5' column='1' id='type-id-2159'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DMA_BIDIRECTIONAL' value='0'/>
+        <enumerator name='DMA_TO_DEVICE' value='1'/>
+        <enumerator name='DMA_FROM_DEVICE' value='2'/>
+        <enumerator name='DMA_NONE' value='3'/>
+      </enum-decl>
+      <class-decl name='device_dma_parameters' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/device.h' line='761' column='1' id='type-id-2160'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='max_segment_size' type-id='type-id-5' visibility='default' filepath='include/linux/device.h' line='766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='segment_boundary_mask' type-id='type-id-16' visibility='default' filepath='include/linux/device.h' line='767' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dev_archdata' size-in-bits='128' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/device.h' line='19' column='1' id='type-id-2021'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='iommu' type-id='type-id-15' visibility='default' filepath='arch/arm64/include/asm/device.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dma_coherent' type-id='type-id-33' visibility='default' filepath='arch/arm64/include/asm/device.h' line='26' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fwnode_handle' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/fwnode.h' line='20' column='1' id='type-id-2161'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='secondary' type-id='type-id-2023' visibility='default' filepath='include/linux/fwnode.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ops' type-id='type-id-2162' visibility='default' filepath='include/linux/fwnode.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/fwnode.h' line='23' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fwnode_operations' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/fwnode.h' line='111' column='1' id='type-id-2163'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='get' type-id='type-id-2164' visibility='default' filepath='include/linux/fwnode.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='put' type-id='type-id-2165' visibility='default' filepath='include/linux/fwnode.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='device_is_available' type-id='type-id-2166' visibility='default' filepath='include/linux/fwnode.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='device_get_match_data' type-id='type-id-2167' visibility='default' filepath='include/linux/fwnode.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='property_present' type-id='type-id-2168' visibility='default' filepath='include/linux/fwnode.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='property_read_int_array' type-id='type-id-2169' visibility='default' filepath='include/linux/fwnode.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='property_read_string_array' type-id='type-id-2170' visibility='default' filepath='include/linux/fwnode.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_parent' type-id='type-id-2171' visibility='default' filepath='include/linux/fwnode.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='get_next_child_node' type-id='type-id-2172' visibility='default' filepath='include/linux/fwnode.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='get_named_child_node' type-id='type-id-2173' visibility='default' filepath='include/linux/fwnode.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='get_reference_args' type-id='type-id-2174' visibility='default' filepath='include/linux/fwnode.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='graph_get_next_endpoint' type-id='type-id-2172' visibility='default' filepath='include/linux/fwnode.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='graph_get_remote_endpoint' type-id='type-id-2171' visibility='default' filepath='include/linux/fwnode.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='graph_get_port_parent' type-id='type-id-2164' visibility='default' filepath='include/linux/fwnode.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='graph_parse_endpoint' type-id='type-id-2175' visibility='default' filepath='include/linux/fwnode.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='add_links' type-id='type-id-2176' visibility='default' filepath='include/linux/fwnode.h' line='147' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fwnode_reference_args' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/fwnode.h' line='46' column='1' id='type-id-2177'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fwnode' type-id='type-id-2023' visibility='default' filepath='include/linux/fwnode.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nargs' type-id='type-id-5' visibility='default' filepath='include/linux/fwnode.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='args' type-id='type-id-1179' visibility='default' filepath='include/linux/fwnode.h' line='49' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fwnode_endpoint' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/fwnode.h' line='32' column='1' id='type-id-2178'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='port' type-id='type-id-5' visibility='default' filepath='include/linux/fwnode.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='id' type-id='type-id-5' visibility='default' filepath='include/linux/fwnode.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='local_fwnode' type-id='type-id-2179' visibility='default' filepath='include/linux/fwnode.h' line='35' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='klist_node' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/klist.h' line='39' column='1' id='type-id-2024'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='n_klist' type-id='type-id-15' visibility='default' filepath='include/linux/klist.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='n_node' type-id='type-id-20' visibility='default' filepath='include/linux/klist.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='n_ref' type-id='type-id-239' visibility='default' filepath='include/linux/klist.h' line='42' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='class' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/device.h' line='418' column='1' id='type-id-2180'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/device.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/device.h' line='420' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='class_groups' type-id='type-id-665' visibility='default' filepath='include/linux/device.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dev_groups' type-id='type-id-665' visibility='default' filepath='include/linux/device.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dev_kobj' type-id='type-id-379' visibility='default' filepath='include/linux/device.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dev_uevent' type-id='type-id-2030' visibility='default' filepath='include/linux/device.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='devnode' type-id='type-id-2181' visibility='default' filepath='include/linux/device.h' line='427' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='class_release' type-id='type-id-2182' visibility='default' filepath='include/linux/device.h' line='429' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dev_release' type-id='type-id-2026' visibility='default' filepath='include/linux/device.h' line='430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='shutdown_pre' type-id='type-id-2041' visibility='default' filepath='include/linux/device.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='ns_type' type-id='type-id-2183' visibility='default' filepath='include/linux/device.h' line='434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='namespace' type-id='type-id-2184' visibility='default' filepath='include/linux/device.h' line='435' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='get_ownership' type-id='type-id-2185' visibility='default' filepath='include/linux/device.h' line='437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='pm' type-id='type-id-2032' visibility='default' filepath='include/linux/device.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='p' type-id='type-id-2046' visibility='default' filepath='include/linux/device.h' line='441' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rtnl_link_ops' size-in-bits='1600' is-struct='yes' visibility='default' filepath='include/net/rtnetlink.h' line='59' column='1' id='type-id-2186'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/rtnetlink.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='kind' type-id='type-id-4' visibility='default' filepath='include/net/rtnetlink.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='priv_size' type-id='type-id-84' visibility='default' filepath='include/net/rtnetlink.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='setup' type-id='type-id-1689' visibility='default' filepath='include/net/rtnetlink.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='maxtype' type-id='type-id-5' visibility='default' filepath='include/net/rtnetlink.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='policy' type-id='type-id-2187' visibility='default' filepath='include/net/rtnetlink.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='validate' type-id='type-id-2188' visibility='default' filepath='include/net/rtnetlink.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='newlink' type-id='type-id-2189' visibility='default' filepath='include/net/rtnetlink.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='changelink' type-id='type-id-2190' visibility='default' filepath='include/net/rtnetlink.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='dellink' type-id='type-id-2191' visibility='default' filepath='include/net/rtnetlink.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='get_size' type-id='type-id-2192' visibility='default' filepath='include/net/rtnetlink.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='fill_info' type-id='type-id-2193' visibility='default' filepath='include/net/rtnetlink.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='get_xstats_size' type-id='type-id-2192' visibility='default' filepath='include/net/rtnetlink.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='fill_xstats' type-id='type-id-2193' visibility='default' filepath='include/net/rtnetlink.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='get_num_tx_queues' type-id='type-id-2194' visibility='default' filepath='include/net/rtnetlink.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='get_num_rx_queues' type-id='type-id-2194' visibility='default' filepath='include/net/rtnetlink.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='slave_maxtype' type-id='type-id-5' visibility='default' filepath='include/net/rtnetlink.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='slave_policy' type-id='type-id-2187' visibility='default' filepath='include/net/rtnetlink.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='slave_changelink' type-id='type-id-2195' visibility='default' filepath='include/net/rtnetlink.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='get_slave_size' type-id='type-id-2196' visibility='default' filepath='include/net/rtnetlink.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='fill_slave_info' type-id='type-id-2197' visibility='default' filepath='include/net/rtnetlink.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='get_link_net' type-id='type-id-2198' visibility='default' filepath='include/net/rtnetlink.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='get_linkxstats_size' type-id='type-id-2199' visibility='default' filepath='include/net/rtnetlink.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='fill_linkxstats' type-id='type-id-2200' visibility='default' filepath='include/net/rtnetlink.h' line='110' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nla_policy' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/netlink.h' line='222' column='1' id='type-id-2201'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-688' visibility='default' filepath='include/net/netlink.h' line='223' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='len' type-id='type-id-688' visibility='default' filepath='include/net/netlink.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='validation_data' type-id='type-id-15' visibility='default' filepath='include/net/netlink.h' line='225' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='s16' type-id='type-id-2202' filepath='include/asm-generic/int-ll64.h' line='18' column='1' id='type-id-1693'/>
+      <typedef-decl name='__s16' type-id='type-id-261' filepath='include/uapi/asm-generic/int-ll64.h' line='23' column='1' id='type-id-2202'/>
+      <class-decl name='netdev_tc_txq' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='761' column='1' id='type-id-1149'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-688' visibility='default' filepath='include/linux/netdevice.h' line='762' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='offset' type-id='type-id-688' visibility='default' filepath='include/linux/netdevice.h' line='763' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_core' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/netns/core.h' line='8' column='1' id='type-id-1649'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sysctl_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/core.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sysctl_somaxconn' type-id='type-id-17' visibility='default' filepath='include/net/netns/core.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='sock_inuse' type-id='type-id-666' visibility='default' filepath='include/net/netns/core.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='prot_inuse' type-id='type-id-2203' visibility='default' filepath='include/net/netns/core.h' line='16' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_mib' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/net/netns/mib.h' line='7' column='1' id='type-id-1650'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tcp_statistics' type-id='type-id-2204' visibility='default' filepath='include/net/netns/mib.h' line='8' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ip_statistics' type-id='type-id-2205' visibility='default' filepath='include/net/netns/mib.h' line='9' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='net_statistics' type-id='type-id-2206' visibility='default' filepath='include/net/netns/mib.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='udp_statistics' type-id='type-id-2207' visibility='default' filepath='include/net/netns/mib.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='udplite_statistics' type-id='type-id-2207' visibility='default' filepath='include/net/netns/mib.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='icmp_statistics' type-id='type-id-2208' visibility='default' filepath='include/net/netns/mib.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='icmpmsg_statistics' type-id='type-id-2209' visibility='default' filepath='include/net/netns/mib.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='proc_net_devsnmp6' type-id='type-id-262' visibility='default' filepath='include/net/netns/mib.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='udp_stats_in6' type-id='type-id-2207' visibility='default' filepath='include/net/netns/mib.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='udplite_stats_in6' type-id='type-id-2207' visibility='default' filepath='include/net/netns/mib.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='ipv6_statistics' type-id='type-id-2205' visibility='default' filepath='include/net/netns/mib.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='icmpv6_statistics' type-id='type-id-2210' visibility='default' filepath='include/net/netns/mib.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='icmpv6msg_statistics' type-id='type-id-2211' visibility='default' filepath='include/net/netns/mib.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='xfrm_statistics' type-id='type-id-2212' visibility='default' filepath='include/net/netns/mib.h' line='25' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tcp_mib' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='97' column='1' id='type-id-2213'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-1196' visibility='default' filepath='include/net/snmp.h' line='98' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ipstats_mib' size-in-bits='2368' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='56' column='1' id='type-id-2214'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-1178' visibility='default' filepath='include/net/snmp.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='syncp' type-id='type-id-2001' visibility='default' filepath='include/net/snmp.h' line='59' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='linux_mib' size-in-bits='7552' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='109' column='1' id='type-id-2215'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-1193' visibility='default' filepath='include/net/snmp.h' line='110' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='udp_mib' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='103' column='1' id='type-id-2216'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-1204' visibility='default' filepath='include/net/snmp.h' line='104' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='icmp_mib' size-in-bits='1792' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='64' column='1' id='type-id-2217'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-1197' visibility='default' filepath='include/net/snmp.h' line='65' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='icmpmsg_mib' size-in-bits='32768' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='69' column='1' id='type-id-2218'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-948' visibility='default' filepath='include/net/snmp.h' line='70' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='icmpv6_mib' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='76' column='1' id='type-id-2219'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-1203' visibility='default' filepath='include/net/snmp.h' line='77' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='icmpv6msg_mib' size-in-bits='32768' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='86' column='1' id='type-id-2220'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-948' visibility='default' filepath='include/net/snmp.h' line='87' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='linux_xfrm_mib' size-in-bits='1856' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='115' column='1' id='type-id-2221'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-1198' visibility='default' filepath='include/net/snmp.h' line='116' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_packet' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/netns/packet.h' line='11' column='1' id='type-id-1651'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sklist_lock' type-id='type-id-245' visibility='default' filepath='include/net/netns/packet.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='sklist' type-id='type-id-186' visibility='default' filepath='include/net/netns/packet.h' line='13' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_unix' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/netns/unix.h' line='9' column='1' id='type-id-1652'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sysctl_max_dgram_qlen' type-id='type-id-17' visibility='default' filepath='include/net/netns/unix.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ctl' type-id='type-id-1583' visibility='default' filepath='include/net/netns/unix.h' line='11' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_ipv4' size-in-bits='9728' is-struct='yes' visibility='default' filepath='include/net/netns/ipv4.h' line='43' column='1' id='type-id-1653'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='forw_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/ipv4.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='frags_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/ipv4.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ipv4_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/ipv4.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='route_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/ipv4.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='xfrm4_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/ipv4.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='devconf_all' type-id='type-id-2222' visibility='default' filepath='include/net/netns/ipv4.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='devconf_dflt' type-id='type-id-2222' visibility='default' filepath='include/net/netns/ipv4.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ra_chain' type-id='type-id-2223' visibility='default' filepath='include/net/netns/ipv4.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='ra_mutex' type-id='type-id-245' visibility='default' filepath='include/net/netns/ipv4.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='rules_ops' type-id='type-id-2224' visibility='default' filepath='include/net/netns/ipv4.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='fib_has_custom_rules' type-id='type-id-33' visibility='default' filepath='include/net/netns/ipv4.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='fib_rules_require_fldissect' type-id='type-id-5' visibility='default' filepath='include/net/netns/ipv4.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='fib_main' type-id='type-id-2225' visibility='default' filepath='include/net/netns/ipv4.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='fib_default' type-id='type-id-2225' visibility='default' filepath='include/net/netns/ipv4.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='fib_has_custom_local_routes' type-id='type-id-33' visibility='default' filepath='include/net/netns/ipv4.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='fib_table_hash' type-id='type-id-746' visibility='default' filepath='include/net/netns/ipv4.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='fib_offload_disabled' type-id='type-id-33' visibility='default' filepath='include/net/netns/ipv4.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='fibnl' type-id='type-id-1646' visibility='default' filepath='include/net/netns/ipv4.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='icmp_sk' type-id='type-id-2226' visibility='default' filepath='include/net/netns/ipv4.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='mc_autojoin_sk' type-id='type-id-1646' visibility='default' filepath='include/net/netns/ipv4.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='peers' type-id='type-id-2227' visibility='default' filepath='include/net/netns/ipv4.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='tcp_sk' type-id='type-id-2226' visibility='default' filepath='include/net/netns/ipv4.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='frags' type-id='type-id-2228' visibility='default' filepath='include/net/netns/ipv4.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='iptable_filter' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv4.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='iptable_mangle' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv4.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='iptable_raw' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv4.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='arptable_filter' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv4.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='iptable_security' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv4.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='nat_table' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv4.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='sysctl_icmp_echo_ignore_all' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4512'>
+          <var-decl name='sysctl_icmp_echo_ignore_broadcasts' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='sysctl_icmp_ignore_bogus_error_responses' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4576'>
+          <var-decl name='sysctl_icmp_ratelimit' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='sysctl_icmp_ratemask' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4640'>
+          <var-decl name='sysctl_icmp_errors_use_inbound_ifaddr' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='ip_local_ports' type-id='type-id-2230' visibility='default' filepath='include/net/netns/ipv4.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4832'>
+          <var-decl name='sysctl_tcp_ecn' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='sysctl_tcp_ecn_fallback' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4896'>
+          <var-decl name='sysctl_ip_default_ttl' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='sysctl_ip_no_pmtu_disc' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4960'>
+          <var-decl name='sysctl_ip_fwd_use_pmtu' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='sysctl_ip_fwd_update_priority' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5024'>
+          <var-decl name='sysctl_ip_nonlocal_bind' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='sysctl_ip_dynaddr' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5088'>
+          <var-decl name='sysctl_ip_early_demux' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='sysctl_tcp_early_demux' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5152'>
+          <var-decl name='sysctl_udp_early_demux' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='sysctl_fwmark_reflect' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5216'>
+          <var-decl name='sysctl_tcp_fwmark_accept' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5248'>
+          <var-decl name='sysctl_tcp_mtu_probing' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5280'>
+          <var-decl name='sysctl_tcp_base_mss' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='sysctl_tcp_min_snd_mss' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5344'>
+          <var-decl name='sysctl_tcp_probe_threshold' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='sysctl_tcp_probe_interval' type-id='type-id-7' visibility='default' filepath='include/net/netns/ipv4.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5408'>
+          <var-decl name='sysctl_tcp_keepalive_time' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='sysctl_tcp_keepalive_probes' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5472'>
+          <var-decl name='sysctl_tcp_keepalive_intvl' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='sysctl_tcp_syn_retries' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5536'>
+          <var-decl name='sysctl_tcp_synack_retries' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='sysctl_tcp_syncookies' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5600'>
+          <var-decl name='sysctl_tcp_reordering' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5632'>
+          <var-decl name='sysctl_tcp_retries1' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5664'>
+          <var-decl name='sysctl_tcp_retries2' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5696'>
+          <var-decl name='sysctl_tcp_orphan_retries' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5728'>
+          <var-decl name='sysctl_tcp_fin_timeout' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='sysctl_tcp_notsent_lowat' type-id='type-id-5' visibility='default' filepath='include/net/netns/ipv4.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5792'>
+          <var-decl name='sysctl_tcp_tw_reuse' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='sysctl_tcp_sack' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5856'>
+          <var-decl name='sysctl_tcp_window_scaling' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='sysctl_tcp_timestamps' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5920'>
+          <var-decl name='sysctl_tcp_early_retrans' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5952'>
+          <var-decl name='sysctl_tcp_recovery' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5984'>
+          <var-decl name='sysctl_tcp_thin_linear_timeouts' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='sysctl_tcp_slow_start_after_idle' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6048'>
+          <var-decl name='sysctl_tcp_retrans_collapse' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='sysctl_tcp_stdurg' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6112'>
+          <var-decl name='sysctl_tcp_rfc1337' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='sysctl_tcp_abort_on_overflow' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6176'>
+          <var-decl name='sysctl_tcp_fack' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='sysctl_tcp_max_reordering' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6240'>
+          <var-decl name='sysctl_tcp_dsack' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='sysctl_tcp_app_win' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6304'>
+          <var-decl name='sysctl_tcp_adv_win_scale' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='sysctl_tcp_frto' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6368'>
+          <var-decl name='sysctl_tcp_nometrics_save' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='sysctl_tcp_moderate_rcvbuf' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6432'>
+          <var-decl name='sysctl_tcp_tso_win_divisor' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='sysctl_tcp_workaround_signed_windows' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6496'>
+          <var-decl name='sysctl_tcp_limit_output_bytes' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='sysctl_tcp_challenge_ack_limit' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6560'>
+          <var-decl name='sysctl_tcp_min_tso_segs' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='sysctl_tcp_min_rtt_wlen' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6624'>
+          <var-decl name='sysctl_tcp_autocorking' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='sysctl_tcp_invalid_ratelimit' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6688'>
+          <var-decl name='sysctl_tcp_pacing_ss_ratio' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6720'>
+          <var-decl name='sysctl_tcp_pacing_ca_ratio' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6752'>
+          <var-decl name='sysctl_tcp_wmem' type-id='type-id-1131' visibility='default' filepath='include/net/netns/ipv4.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6848'>
+          <var-decl name='sysctl_tcp_rmem' type-id='type-id-1131' visibility='default' filepath='include/net/netns/ipv4.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6944'>
+          <var-decl name='sysctl_tcp_comp_sack_nr' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6976'>
+          <var-decl name='sysctl_tcp_comp_sack_delay_ns' type-id='type-id-16' visibility='default' filepath='include/net/netns/ipv4.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7168'>
+          <var-decl name='tcp_death_row' type-id='type-id-2231' visibility='default' filepath='include/net/netns/ipv4.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8192'>
+          <var-decl name='sysctl_max_syn_backlog' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8224'>
+          <var-decl name='sysctl_tcp_fastopen' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8256'>
+          <var-decl name='tcp_congestion_control' type-id='type-id-2232' visibility='default' filepath='include/net/netns/ipv4.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8320'>
+          <var-decl name='tcp_fastopen_ctx' type-id='type-id-2233' visibility='default' filepath='include/net/netns/ipv4.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8384'>
+          <var-decl name='tcp_fastopen_ctx_lock' type-id='type-id-247' visibility='default' filepath='include/net/netns/ipv4.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8416'>
+          <var-decl name='sysctl_tcp_fastopen_blackhole_timeout' type-id='type-id-5' visibility='default' filepath='include/net/netns/ipv4.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8448'>
+          <var-decl name='tfo_active_disable_times' type-id='type-id-26' visibility='default' filepath='include/net/netns/ipv4.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8512'>
+          <var-decl name='tfo_active_disable_stamp' type-id='type-id-16' visibility='default' filepath='include/net/netns/ipv4.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8576'>
+          <var-decl name='sysctl_udp_wmem_min' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8608'>
+          <var-decl name='sysctl_udp_rmem_min' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8640'>
+          <var-decl name='sysctl_igmp_max_memberships' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8672'>
+          <var-decl name='sysctl_igmp_max_msf' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8704'>
+          <var-decl name='sysctl_igmp_llm_reports' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8736'>
+          <var-decl name='sysctl_igmp_qrv' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8768'>
+          <var-decl name='ping_group_range' type-id='type-id-2234' visibility='default' filepath='include/net/netns/ipv4.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8896'>
+          <var-decl name='dev_addr_genid' type-id='type-id-26' visibility='default' filepath='include/net/netns/ipv4.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8960'>
+          <var-decl name='sysctl_local_reserved_ports' type-id='type-id-45' visibility='default' filepath='include/net/netns/ipv4.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9024'>
+          <var-decl name='sysctl_ip_prot_sock' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9088'>
+          <var-decl name='notifier_ops' type-id='type-id-2235' visibility='default' filepath='include/net/netns/ipv4.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9152'>
+          <var-decl name='fib_seq' type-id='type-id-5' visibility='default' filepath='include/net/netns/ipv4.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9216'>
+          <var-decl name='ipmr_notifier_ops' type-id='type-id-2235' visibility='default' filepath='include/net/netns/ipv4.h' line='215' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9280'>
+          <var-decl name='ipmr_seq' type-id='type-id-5' visibility='default' filepath='include/net/netns/ipv4.h' line='216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9312'>
+          <var-decl name='rt_genid' type-id='type-id-26' visibility='default' filepath='include/net/netns/ipv4.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9344'>
+          <var-decl name='ip_id_key' type-id='type-id-2236' visibility='default' filepath='include/net/netns/ipv4.h' line='219' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_frags' size-in-bits='2560' is-struct='yes' visibility='default' filepath='include/net/inet_frag.h' line='7' column='1' id='type-id-2228'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='high_thresh' type-id='type-id-192' visibility='default' filepath='include/net/inet_frag.h' line='9' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='low_thresh' type-id='type-id-192' visibility='default' filepath='include/net/inet_frag.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='timeout' type-id='type-id-17' visibility='default' filepath='include/net/inet_frag.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='max_dist' type-id='type-id-17' visibility='default' filepath='include/net/inet_frag.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='f' type-id='type-id-2237' visibility='default' filepath='include/net/inet_frag.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='rhashtable' type-id='type-id-2238' visibility='default' filepath='include/net/inet_frag.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='mem' type-id='type-id-115' visibility='default' filepath='include/net/inet_frag.h' line='18' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='inet_frags' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/net/inet_frag.h' line='93' column='1' id='type-id-2239'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='qsize' type-id='type-id-5' visibility='default' filepath='include/net/inet_frag.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='constructor' type-id='type-id-2240' visibility='default' filepath='include/net/inet_frag.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='destructor' type-id='type-id-2241' visibility='default' filepath='include/net/inet_frag.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='frag_expire' type-id='type-id-2005' visibility='default' filepath='include/net/inet_frag.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='frags_cachep' type-id='type-id-538' visibility='default' filepath='include/net/inet_frag.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='frags_cache_name' type-id='type-id-4' visibility='default' filepath='include/net/inet_frag.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='rhash_params' type-id='type-id-2242' visibility='default' filepath='include/net/inet_frag.h' line='102' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='inet_frag_queue' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/net/inet_frag.h' line='71' column='1' id='type-id-2243'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-2244' visibility='default' filepath='include/net/inet_frag.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='key' type-id='type-id-2245' visibility='default' filepath='include/net/inet_frag.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='timer' type-id='type-id-417' visibility='default' filepath='include/net/inet_frag.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/net/inet_frag.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/net/inet_frag.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='fragments' type-id='type-id-1766' visibility='default' filepath='include/net/inet_frag.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='rb_fragments' type-id='type-id-416' visibility='default' filepath='include/net/inet_frag.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='fragments_tail' type-id='type-id-1766' visibility='default' filepath='include/net/inet_frag.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='last_run_head' type-id='type-id-1766' visibility='default' filepath='include/net/inet_frag.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='stamp' type-id='type-id-682' visibility='default' filepath='include/net/inet_frag.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='len' type-id='type-id-17' visibility='default' filepath='include/net/inet_frag.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='meat' type-id='type-id-17' visibility='default' filepath='include/net/inet_frag.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='flags' type-id='type-id-893' visibility='default' filepath='include/net/inet_frag.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1232'>
+          <var-decl name='max_size' type-id='type-id-688' visibility='default' filepath='include/net/inet_frag.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='net' type-id='type-id-2246' visibility='default' filepath='include/net/inet_frag.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/inet_frag.h' line='90' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rhash_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/rhashtable-types.h' line='17' column='1' id='type-id-2244'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-2247' visibility='default' filepath='include/linux/rhashtable-types.h' line='18' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__29' size-in-bits='352' is-anonymous='yes' visibility='default' filepath='include/net/inet_frag.h' line='73' column='1' id='type-id-2245'>
+        <data-member access='private'>
+          <var-decl name='v4' type-id='type-id-2248' visibility='default' filepath='include/net/inet_frag.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='v6' type-id='type-id-2249' visibility='default' filepath='include/net/inet_frag.h' line='75' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='frag_v4_compare_key' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/net/inet_frag.h' line='34' column='1' id='type-id-2248'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='saddr' type-id='type-id-927' visibility='default' filepath='include/net/inet_frag.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='daddr' type-id='type-id-927' visibility='default' filepath='include/net/inet_frag.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='user' type-id='type-id-7' visibility='default' filepath='include/net/inet_frag.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='vif' type-id='type-id-7' visibility='default' filepath='include/net/inet_frag.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='id' type-id='type-id-924' visibility='default' filepath='include/net/inet_frag.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='144'>
+          <var-decl name='protocol' type-id='type-id-688' visibility='default' filepath='include/net/inet_frag.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='frag_v6_compare_key' size-in-bits='352' is-struct='yes' visibility='default' filepath='include/net/inet_frag.h' line='43' column='1' id='type-id-2249'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='saddr' type-id='type-id-2250' visibility='default' filepath='include/net/inet_frag.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='daddr' type-id='type-id-2250' visibility='default' filepath='include/net/inet_frag.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='user' type-id='type-id-7' visibility='default' filepath='include/net/inet_frag.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='id' type-id='type-id-927' visibility='default' filepath='include/net/inet_frag.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='iif' type-id='type-id-7' visibility='default' filepath='include/net/inet_frag.h' line='48' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='in6_addr' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/in6.h' line='33' column='1' id='type-id-2250'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='in6_u' type-id='type-id-2251' visibility='default' filepath='include/uapi/linux/in6.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__30' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/in6.h' line='34' column='1' id='type-id-2251'>
+        <data-member access='private'>
+          <var-decl name='u6_addr8' type-id='type-id-936' visibility='default' filepath='include/uapi/linux/in6.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='u6_addr16' type-id='type-id-925' visibility='default' filepath='include/uapi/linux/in6.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='u6_addr32' type-id='type-id-929' visibility='default' filepath='include/uapi/linux/in6.h' line='38' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='rhashtable_params' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/rhashtable-types.h' line='57' column='1' id='type-id-2242'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nelem_hint' type-id='type-id-688' visibility='default' filepath='include/linux/rhashtable-types.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='key_len' type-id='type-id-688' visibility='default' filepath='include/linux/rhashtable-types.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='key_offset' type-id='type-id-688' visibility='default' filepath='include/linux/rhashtable-types.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='head_offset' type-id='type-id-688' visibility='default' filepath='include/linux/rhashtable-types.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='max_size' type-id='type-id-5' visibility='default' filepath='include/linux/rhashtable-types.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='min_size' type-id='type-id-688' visibility='default' filepath='include/linux/rhashtable-types.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='automatic_shrinking' type-id='type-id-33' visibility='default' filepath='include/linux/rhashtable-types.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='locks_mul' type-id='type-id-214' visibility='default' filepath='include/linux/rhashtable-types.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hashfn' type-id='type-id-2252' visibility='default' filepath='include/linux/rhashtable-types.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='obj_hashfn' type-id='type-id-2253' visibility='default' filepath='include/linux/rhashtable-types.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='obj_cmpfn' type-id='type-id-2254' visibility='default' filepath='include/linux/rhashtable-types.h' line='68' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='rht_hashfn_t' type-id='type-id-2255' filepath='include/linux/rhashtable-types.h' line='38' column='1' id='type-id-2252'/>
+      <typedef-decl name='rht_obj_hashfn_t' type-id='type-id-2255' filepath='include/linux/rhashtable-types.h' line='39' column='1' id='type-id-2253'/>
+      <typedef-decl name='rht_obj_cmpfn_t' type-id='type-id-2256' filepath='include/linux/rhashtable-types.h' line='40' column='1' id='type-id-2254'/>
+      <class-decl name='rhashtable_compare_arg' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/rhashtable-types.h' line='33' column='1' id='type-id-2257'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ht' type-id='type-id-2258' visibility='default' filepath='include/linux/rhashtable-types.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='key' type-id='type-id-15' visibility='default' filepath='include/linux/rhashtable-types.h' line='35' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rhashtable' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/linux/rhashtable-types.h' line='83' column='1' id='type-id-2238'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tbl' type-id='type-id-2259' visibility='default' filepath='include/linux/rhashtable-types.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='key_len' type-id='type-id-5' visibility='default' filepath='include/linux/rhashtable-types.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='max_elems' type-id='type-id-5' visibility='default' filepath='include/linux/rhashtable-types.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='p' type-id='type-id-2242' visibility='default' filepath='include/linux/rhashtable-types.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='rhlist' type-id='type-id-33' visibility='default' filepath='include/linux/rhashtable-types.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='run_work' type-id='type-id-255' visibility='default' filepath='include/linux/rhashtable-types.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/rhashtable-types.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/rhashtable-types.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='nelems' type-id='type-id-26' visibility='default' filepath='include/linux/rhashtable-types.h' line='92' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='local_ports' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/net/netns/ipv4.h' line='21' column='1' id='type-id-2230'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-1917' visibility='default' filepath='include/net/netns/ipv4.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='range' type-id='type-id-465' visibility='default' filepath='include/net/netns/ipv4.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='warned' type-id='type-id-33' visibility='default' filepath='include/net/netns/ipv4.h' line='24' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='inet_timewait_death_row' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/net/netns/ipv4.h' line='34' column='1' id='type-id-2231'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tw_count' type-id='type-id-26' visibility='default' filepath='include/net/netns/ipv4.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='hashinfo' type-id='type-id-2260' visibility='default' filepath='include/net/netns/ipv4.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='sysctl_max_tw_buckets' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv4.h' line='38' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ping_group_range' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/netns/ipv4.h' line='27' column='1' id='type-id-2234'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-1917' visibility='default' filepath='include/net/netns/ipv4.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='range' type-id='type-id-1137' visibility='default' filepath='include/net/netns/ipv4.h' line='29' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='siphash_key_t' type-id='type-id-2261' filepath='include/linux/siphash.h' line='22' column='1' id='type-id-2236'/>
+      <class-decl name='__anonymous_struct__49' size-in-bits='128' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-2236' visibility='default' filepath='include/linux/siphash.h' line='20' column='1' id='type-id-2261'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='key' type-id='type-id-739' visibility='default' filepath='include/linux/siphash.h' line='21' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_ipv6' size-in-bits='8704' is-struct='yes' visibility='default' filepath='include/net/netns/ipv6.h' line='50' column='1' id='type-id-1654'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sysctl' type-id='type-id-2262' visibility='default' filepath='include/net/netns/ipv6.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='devconf_all' type-id='type-id-2263' visibility='default' filepath='include/net/netns/ipv6.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='devconf_dflt' type-id='type-id-2263' visibility='default' filepath='include/net/netns/ipv6.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='peers' type-id='type-id-2227' visibility='default' filepath='include/net/netns/ipv6.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='frags' type-id='type-id-2228' visibility='default' filepath='include/net/netns/ipv6.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='ip6table_filter' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv6.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='ip6table_mangle' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv6.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='ip6table_raw' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv6.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='ip6table_security' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv6.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='ip6table_nat' type-id='type-id-2229' visibility='default' filepath='include/net/netns/ipv6.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='fib6_null_entry' type-id='type-id-2264' visibility='default' filepath='include/net/netns/ipv6.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='ip6_null_entry' type-id='type-id-2265' visibility='default' filepath='include/net/netns/ipv6.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='rt6_stats' type-id='type-id-2266' visibility='default' filepath='include/net/netns/ipv6.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='ip6_fib_timer' type-id='type-id-417' visibility='default' filepath='include/net/netns/ipv6.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='fib_table_hash' type-id='type-id-746' visibility='default' filepath='include/net/netns/ipv6.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='fib6_main_tbl' type-id='type-id-2267' visibility='default' filepath='include/net/netns/ipv6.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='fib6_walkers' type-id='type-id-20' visibility='default' filepath='include/net/netns/ipv6.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5632'>
+          <var-decl name='ip6_dst_ops' type-id='type-id-2268' visibility='default' filepath='include/net/netns/ipv6.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7168'>
+          <var-decl name='fib6_walker_lock' type-id='type-id-885' visibility='default' filepath='include/net/netns/ipv6.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7232'>
+          <var-decl name='fib6_gc_lock' type-id='type-id-247' visibility='default' filepath='include/net/netns/ipv6.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7264'>
+          <var-decl name='ip6_rt_gc_expire' type-id='type-id-5' visibility='default' filepath='include/net/netns/ipv6.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7296'>
+          <var-decl name='ip6_rt_last_gc' type-id='type-id-16' visibility='default' filepath='include/net/netns/ipv6.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7360'>
+          <var-decl name='fib6_rules_require_fldissect' type-id='type-id-5' visibility='default' filepath='include/net/netns/ipv6.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7392'>
+          <var-decl name='fib6_has_custom_rules' type-id='type-id-33' visibility='default' filepath='include/net/netns/ipv6.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7424'>
+          <var-decl name='ip6_prohibit_entry' type-id='type-id-2265' visibility='default' filepath='include/net/netns/ipv6.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='ip6_blk_hole_entry' type-id='type-id-2265' visibility='default' filepath='include/net/netns/ipv6.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7552'>
+          <var-decl name='fib6_local_tbl' type-id='type-id-2267' visibility='default' filepath='include/net/netns/ipv6.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7616'>
+          <var-decl name='fib6_rules_ops' type-id='type-id-2224' visibility='default' filepath='include/net/netns/ipv6.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7680'>
+          <var-decl name='icmp_sk' type-id='type-id-2226' visibility='default' filepath='include/net/netns/ipv6.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7744'>
+          <var-decl name='ndisc_sk' type-id='type-id-1646' visibility='default' filepath='include/net/netns/ipv6.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7808'>
+          <var-decl name='tcp_sk' type-id='type-id-1646' visibility='default' filepath='include/net/netns/ipv6.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7872'>
+          <var-decl name='igmp_sk' type-id='type-id-1646' visibility='default' filepath='include/net/netns/ipv6.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7936'>
+          <var-decl name='mc_autojoin_sk' type-id='type-id-1646' visibility='default' filepath='include/net/netns/ipv6.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8000'>
+          <var-decl name='dev_addr_genid' type-id='type-id-26' visibility='default' filepath='include/net/netns/ipv6.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8032'>
+          <var-decl name='fib6_sernum' type-id='type-id-26' visibility='default' filepath='include/net/netns/ipv6.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8064'>
+          <var-decl name='seg6_data' type-id='type-id-2269' visibility='default' filepath='include/net/netns/ipv6.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8128'>
+          <var-decl name='notifier_ops' type-id='type-id-2235' visibility='default' filepath='include/net/netns/ipv6.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8192'>
+          <var-decl name='ip6mr_notifier_ops' type-id='type-id-2235' visibility='default' filepath='include/net/netns/ipv6.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8256'>
+          <var-decl name='ipmr_seq' type-id='type-id-5' visibility='default' filepath='include/net/netns/ipv6.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8320'>
+          <var-decl name='ip6addrlbl_table' type-id='type-id-2270' visibility='default' filepath='include/net/netns/ipv6.h' line='108' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_sysctl_ipv6' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/net/netns/ipv6.h' line='14' column='1' id='type-id-2262'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/ipv6.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='route_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/ipv6.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='icmp_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/ipv6.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='frags_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/ipv6.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='xfrm6_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/ipv6.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='bindv6only' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='flush_delay' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ip6_rt_max_size' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='ip6_rt_gc_min_interval' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ip6_rt_gc_timeout' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='ip6_rt_gc_interval' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='ip6_rt_gc_elasticity' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='ip6_rt_mtu_expires' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='ip6_rt_min_advmss' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='multipath_hash_policy' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='flowlabel_consistency' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='auto_flowlabels' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='icmpv6_time' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='icmpv6_echo_ignore_all' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='anycast_src_echo_reply' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='ip_nonlocal_bind' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='fwmark_reflect' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='idgen_retries' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='idgen_delay' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='flowlabel_state_ranges' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='flowlabel_reflect' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='max_dst_opts_cnt' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='max_hbh_opts_cnt' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='max_dst_opts_len' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='max_hbh_opts_len' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='seg6_flowlabel' type-id='type-id-17' visibility='default' filepath='include/net/netns/ipv6.h' line='47' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dst_ops' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/net/dst_ops.h' line='15' column='1' id='type-id-2268'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-312' visibility='default' filepath='include/net/dst_ops.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='gc_thresh' type-id='type-id-5' visibility='default' filepath='include/net/dst_ops.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='gc' type-id='type-id-2271' visibility='default' filepath='include/net/dst_ops.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='check' type-id='type-id-2272' visibility='default' filepath='include/net/dst_ops.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='default_advmss' type-id='type-id-2273' visibility='default' filepath='include/net/dst_ops.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mtu' type-id='type-id-2273' visibility='default' filepath='include/net/dst_ops.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='cow_metrics' type-id='type-id-2274' visibility='default' filepath='include/net/dst_ops.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='destroy' type-id='type-id-2275' visibility='default' filepath='include/net/dst_ops.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ifdown' type-id='type-id-2276' visibility='default' filepath='include/net/dst_ops.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='negative_advice' type-id='type-id-2277' visibility='default' filepath='include/net/dst_ops.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='link_failure' type-id='type-id-1768' visibility='default' filepath='include/net/dst_ops.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='update_pmtu' type-id='type-id-2278' visibility='default' filepath='include/net/dst_ops.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='redirect' type-id='type-id-2279' visibility='default' filepath='include/net/dst_ops.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='local_out' type-id='type-id-2280' visibility='default' filepath='include/net/dst_ops.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='neigh_lookup' type-id='type-id-2281' visibility='default' filepath='include/net/dst_ops.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='confirm_neigh' type-id='type-id-2282' visibility='default' filepath='include/net/dst_ops.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='kmem_cachep' type-id='type-id-538' visibility='default' filepath='include/net/dst_ops.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='pcpuc_entries' type-id='type-id-204' visibility='default' filepath='include/net/dst_ops.h' line='42' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='percpu_counter' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/percpu_counter.h' line='20' column='1' id='type-id-204'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='include/linux/percpu_counter.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='count' type-id='type-id-1546' visibility='default' filepath='include/linux/percpu_counter.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/percpu_counter.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='counters' type-id='type-id-2283' visibility='default' filepath='include/linux/percpu_counter.h' line='26' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__50' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/netns/ipv6.h' line='104' column='1' id='type-id-2270'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-186' visibility='default' filepath='include/net/netns/ipv6.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/net/netns/ipv6.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='seq' type-id='type-id-7' visibility='default' filepath='include/net/netns/ipv6.h' line='107' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_nf' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/net/netns/netfilter.h' line='11' column='1' id='type-id-1655'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='proc_netfilter' type-id='type-id-262' visibility='default' filepath='include/net/netns/netfilter.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='queue_handler' type-id='type-id-2284' visibility='default' filepath='include/net/netns/netfilter.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='nf_loggers' type-id='type-id-1116' visibility='default' filepath='include/net/netns/netfilter.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='nf_log_dir_header' type-id='type-id-1583' visibility='default' filepath='include/net/netns/netfilter.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='hooks_ipv4' type-id='type-id-1153' visibility='default' filepath='include/net/netns/netfilter.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='hooks_ipv6' type-id='type-id-1153' visibility='default' filepath='include/net/netns/netfilter.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='hooks_arp' type-id='type-id-1152' visibility='default' filepath='include/net/netns/netfilter.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='defrag_ipv4' type-id='type-id-33' visibility='default' filepath='include/net/netns/netfilter.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1864'>
+          <var-decl name='defrag_ipv6' type-id='type-id-33' visibility='default' filepath='include/net/netns/netfilter.h' line='35' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_xt' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/net/netns/x_tables.h' line='10' column='1' id='type-id-1656'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tables' type-id='type-id-1139' visibility='default' filepath='include/net/netns/x_tables.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='notrack_deprecated_warning' type-id='type-id-33' visibility='default' filepath='include/net/netns/x_tables.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1672'>
+          <var-decl name='clusterip_deprecated_warning' type-id='type-id-33' visibility='default' filepath='include/net/netns/x_tables.h' line='13' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_ct' size-in-bits='4544' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='93' column='1' id='type-id-1657'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-26' visibility='default' filepath='include/net/netns/conntrack.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='expect_count' type-id='type-id-5' visibility='default' filepath='include/net/netns/conntrack.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ecache_dwork' type-id='type-id-411' visibility='default' filepath='include/net/netns/conntrack.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='ecache_dwork_pending' type-id='type-id-33' visibility='default' filepath='include/net/netns/conntrack.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='sysctl_header' type-id='type-id-1583' visibility='default' filepath='include/net/netns/conntrack.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='acct_sysctl_header' type-id='type-id-1583' visibility='default' filepath='include/net/netns/conntrack.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='tstamp_sysctl_header' type-id='type-id-1583' visibility='default' filepath='include/net/netns/conntrack.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='event_sysctl_header' type-id='type-id-1583' visibility='default' filepath='include/net/netns/conntrack.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='helper_sysctl_header' type-id='type-id-1583' visibility='default' filepath='include/net/netns/conntrack.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='sysctl_log_invalid' type-id='type-id-5' visibility='default' filepath='include/net/netns/conntrack.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='sysctl_events' type-id='type-id-17' visibility='default' filepath='include/net/netns/conntrack.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='sysctl_acct' type-id='type-id-17' visibility='default' filepath='include/net/netns/conntrack.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1248'>
+          <var-decl name='sysctl_auto_assign_helper' type-id='type-id-17' visibility='default' filepath='include/net/netns/conntrack.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='auto_assign_helper_warned' type-id='type-id-33' visibility='default' filepath='include/net/netns/conntrack.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='sysctl_tstamp' type-id='type-id-17' visibility='default' filepath='include/net/netns/conntrack.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='sysctl_checksum' type-id='type-id-17' visibility='default' filepath='include/net/netns/conntrack.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='pcpu_lists' type-id='type-id-2285' visibility='default' filepath='include/net/netns/conntrack.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='stat' type-id='type-id-2286' visibility='default' filepath='include/net/netns/conntrack.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='nf_conntrack_event_cb' type-id='type-id-2287' visibility='default' filepath='include/net/netns/conntrack.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='nf_expect_event_cb' type-id='type-id-2288' visibility='default' filepath='include/net/netns/conntrack.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='nf_ct_proto' type-id='type-id-2289' visibility='default' filepath='include/net/netns/conntrack.h' line='119' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='delayed_work' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/workqueue.h' line='115' column='1' id='type-id-411'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='work' type-id='type-id-255' visibility='default' filepath='include/linux/workqueue.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='timer' type-id='type-id-417' visibility='default' filepath='include/linux/workqueue.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='wq' type-id='type-id-654' visibility='default' filepath='include/linux/workqueue.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='cpu' type-id='type-id-17' visibility='default' filepath='include/linux/workqueue.h' line='121' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ct_pcpu' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='87' column='1' id='type-id-2290'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/net/netns/conntrack.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='unconfirmed' type-id='type-id-2291' visibility='default' filepath='include/net/netns/conntrack.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dying' type-id='type-id-2291' visibility='default' filepath='include/net/netns/conntrack.h' line='90' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hlist_nulls_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/list_nulls.h' line='21' column='1' id='type-id-2291'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='first' type-id='type-id-2292' visibility='default' filepath='include/linux/list_nulls.h' line='22' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hlist_nulls_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/list_nulls.h' line='25' column='1' id='type-id-2293'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-2292' visibility='default' filepath='include/linux/list_nulls.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pprev' type-id='type-id-2294' visibility='default' filepath='include/linux/list_nulls.h' line='26' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ip_conntrack_stat' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='7' column='1' id='type-id-2295'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='found' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='8' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='invalid' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='9' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ignore' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='insert' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='insert_failed' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='drop' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='early_drop' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='error' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='expect_new' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='expect_create' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='expect_delete' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='search_restart' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='19' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nf_ip_net' size-in-bits='2880' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='73' column='1' id='type-id-2289'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='generic' type-id='type-id-2296' visibility='default' filepath='include/net/netns/conntrack.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='tcp' type-id='type-id-2297' visibility='default' filepath='include/net/netns/conntrack.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='udp' type-id='type-id-2298' visibility='default' filepath='include/net/netns/conntrack.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='icmp' type-id='type-id-2299' visibility='default' filepath='include/net/netns/conntrack.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='icmpv6' type-id='type-id-2299' visibility='default' filepath='include/net/netns/conntrack.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='dccp' type-id='type-id-2300' visibility='default' filepath='include/net/netns/conntrack.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='sctp' type-id='type-id-2301' visibility='default' filepath='include/net/netns/conntrack.h' line='83' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nf_generic_net' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='29' column='1' id='type-id-2296'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pn' type-id='type-id-2302' visibility='default' filepath='include/net/netns/conntrack.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='timeout' type-id='type-id-5' visibility='default' filepath='include/net/netns/conntrack.h' line='31' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nf_proto_net' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='21' column='1' id='type-id-2302'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ctl_table_header' type-id='type-id-1583' visibility='default' filepath='include/net/netns/conntrack.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ctl_table' type-id='type-id-1594' visibility='default' filepath='include/net/netns/conntrack.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='users' type-id='type-id-5' visibility='default' filepath='include/net/netns/conntrack.h' line='26' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nf_tcp_net' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='34' column='1' id='type-id-2297'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pn' type-id='type-id-2302' visibility='default' filepath='include/net/netns/conntrack.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='timeouts' type-id='type-id-1190' visibility='default' filepath='include/net/netns/conntrack.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='tcp_loose' type-id='type-id-5' visibility='default' filepath='include/net/netns/conntrack.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='tcp_be_liberal' type-id='type-id-5' visibility='default' filepath='include/net/netns/conntrack.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='tcp_max_retrans' type-id='type-id-5' visibility='default' filepath='include/net/netns/conntrack.h' line='39' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nf_udp_net' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='48' column='1' id='type-id-2298'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pn' type-id='type-id-2302' visibility='default' filepath='include/net/netns/conntrack.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='timeouts' type-id='type-id-488' visibility='default' filepath='include/net/netns/conntrack.h' line='50' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nf_icmp_net' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='53' column='1' id='type-id-2299'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pn' type-id='type-id-2302' visibility='default' filepath='include/net/netns/conntrack.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='timeout' type-id='type-id-5' visibility='default' filepath='include/net/netns/conntrack.h' line='55' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nf_dccp_net' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='59' column='1' id='type-id-2300'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pn' type-id='type-id-2302' visibility='default' filepath='include/net/netns/conntrack.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dccp_loose' type-id='type-id-17' visibility='default' filepath='include/net/netns/conntrack.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='dccp_timeout' type-id='type-id-1188' visibility='default' filepath='include/net/netns/conntrack.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nf_sctp_net' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='67' column='1' id='type-id-2301'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pn' type-id='type-id-2302' visibility='default' filepath='include/net/netns/conntrack.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='timeouts' type-id='type-id-1188' visibility='default' filepath='include/net/netns/conntrack.h' line='69' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_nf_frag' size-in-bits='2560' is-struct='yes' visibility='default' filepath='include/net/netns/ipv6.h' line='112' column='1' id='type-id-1658'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='frags' type-id='type-id-2228' visibility='default' filepath='include/net/netns/ipv6.h' line='113' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_xfrm' size-in-bits='6656' is-struct='yes' visibility='default' filepath='include/net/netns/xfrm.h' line='31' column='1' id='type-id-1661'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='state_all' type-id='type-id-20' visibility='default' filepath='include/net/netns/xfrm.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='state_bydst' type-id='type-id-746' visibility='default' filepath='include/net/netns/xfrm.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='state_bysrc' type-id='type-id-746' visibility='default' filepath='include/net/netns/xfrm.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='state_byspi' type-id='type-id-746' visibility='default' filepath='include/net/netns/xfrm.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='state_hmask' type-id='type-id-5' visibility='default' filepath='include/net/netns/xfrm.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='state_num' type-id='type-id-5' visibility='default' filepath='include/net/netns/xfrm.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='state_hash_work' type-id='type-id-255' visibility='default' filepath='include/net/netns/xfrm.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='policy_all' type-id='type-id-20' visibility='default' filepath='include/net/netns/xfrm.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='policy_byidx' type-id='type-id-746' visibility='default' filepath='include/net/netns/xfrm.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='policy_idx_hmask' type-id='type-id-5' visibility='default' filepath='include/net/netns/xfrm.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='policy_inexact' type-id='type-id-1122' visibility='default' filepath='include/net/netns/xfrm.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='policy_bydst' type-id='type-id-1213' visibility='default' filepath='include/net/netns/xfrm.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='policy_count' type-id='type-id-1192' visibility='default' filepath='include/net/netns/xfrm.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='policy_hash_work' type-id='type-id-255' visibility='default' filepath='include/net/netns/xfrm.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='policy_hthresh' type-id='type-id-2303' visibility='default' filepath='include/net/netns/xfrm.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='nlsk' type-id='type-id-1646' visibility='default' filepath='include/net/netns/xfrm.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='nlsk_stash' type-id='type-id-1646' visibility='default' filepath='include/net/netns/xfrm.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='sysctl_aevent_etime' type-id='type-id-7' visibility='default' filepath='include/net/netns/xfrm.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2464'>
+          <var-decl name='sysctl_aevent_rseqth' type-id='type-id-7' visibility='default' filepath='include/net/netns/xfrm.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='sysctl_larval_drop' type-id='type-id-17' visibility='default' filepath='include/net/netns/xfrm.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2528'>
+          <var-decl name='sysctl_acq_expires' type-id='type-id-7' visibility='default' filepath='include/net/netns/xfrm.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='sysctl_hdr' type-id='type-id-1583' visibility='default' filepath='include/net/netns/xfrm.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='xfrm4_dst_ops' type-id='type-id-2268' visibility='default' filepath='include/net/netns/xfrm.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='xfrm6_dst_ops' type-id='type-id-2268' visibility='default' filepath='include/net/netns/xfrm.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='xfrm_state_lock' type-id='type-id-247' visibility='default' filepath='include/net/netns/xfrm.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6176'>
+          <var-decl name='xfrm_policy_lock' type-id='type-id-247' visibility='default' filepath='include/net/netns/xfrm.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='xfrm_cfg_mutex' type-id='type-id-245' visibility='default' filepath='include/net/netns/xfrm.h' line='75' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_policy_hash' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/netns/xfrm.h' line='13' column='1' id='type-id-1212'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='table' type-id='type-id-746' visibility='default' filepath='include/net/netns/xfrm.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='hmask' type-id='type-id-5' visibility='default' filepath='include/net/netns/xfrm.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='dbits4' type-id='type-id-214' visibility='default' filepath='include/net/netns/xfrm.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='104'>
+          <var-decl name='sbits4' type-id='type-id-214' visibility='default' filepath='include/net/netns/xfrm.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='dbits6' type-id='type-id-214' visibility='default' filepath='include/net/netns/xfrm.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='sbits6' type-id='type-id-214' visibility='default' filepath='include/net/netns/xfrm.h' line='19' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_policy_hthresh' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/netns/xfrm.h' line='22' column='1' id='type-id-2303'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='work' type-id='type-id-255' visibility='default' filepath='include/net/netns/xfrm.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='lock' type-id='type-id-1917' visibility='default' filepath='include/net/netns/xfrm.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='lbits4' type-id='type-id-214' visibility='default' filepath='include/net/netns/xfrm.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='328'>
+          <var-decl name='rbits4' type-id='type-id-214' visibility='default' filepath='include/net/netns/xfrm.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='336'>
+          <var-decl name='lbits6' type-id='type-id-214' visibility='default' filepath='include/net/netns/xfrm.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='344'>
+          <var-decl name='rbits6' type-id='type-id-214' visibility='default' filepath='include/net/netns/xfrm.h' line='28' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='netns_can' size-in-bits='1344' is-struct='yes' visibility='default' filepath='include/net/netns/can.h' line='15' column='1' id='type-id-1662'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='proc_dir' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pde_version' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='pde_stats' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='pde_reset_stats' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='pde_rcvlist_all' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='pde_rcvlist_fil' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='pde_rcvlist_inv' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='pde_rcvlist_sff' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pde_rcvlist_eff' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='pde_rcvlist_err' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='bcmproc_dir' type-id='type-id-262' visibility='default' filepath='include/net/netns/can.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='can_rx_alldev_list' type-id='type-id-2304' visibility='default' filepath='include/net/netns/can.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='can_rcvlists_lock' type-id='type-id-247' visibility='default' filepath='include/net/netns/can.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='can_stattimer' type-id='type-id-417' visibility='default' filepath='include/net/netns/can.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='can_stats' type-id='type-id-2305' visibility='default' filepath='include/net/netns/can.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='can_pstats' type-id='type-id-2306' visibility='default' filepath='include/net/netns/can.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='cgw_list' type-id='type-id-186' visibility='default' filepath='include/net/netns/can.h' line='38' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cgroup_namespace' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/cgroup.h' line='856' column='1' id='type-id-2307'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-421' visibility='default' filepath='include/linux/cgroup.h' line='857' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ns' type-id='type-id-903' visibility='default' filepath='include/linux/cgroup.h' line='858' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='user_ns' type-id='type-id-915' visibility='default' filepath='include/linux/cgroup.h' line='859' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ucounts' type-id='type-id-1578' visibility='default' filepath='include/linux/cgroup.h' line='860' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='root_cset' type-id='type-id-1529' visibility='default' filepath='include/linux/cgroup.h' line='861' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='css_set' size-in-bits='3264' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='178' column='1' id='type-id-2308'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='subsys' type-id='type-id-959' visibility='default' filepath='include/linux/cgroup-defs.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='refcount' type-id='type-id-421' visibility='default' filepath='include/linux/cgroup-defs.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dom_cset' type-id='type-id-1529' visibility='default' filepath='include/linux/cgroup-defs.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='dfl_cgrp' type-id='type-id-2309' visibility='default' filepath='include/linux/cgroup-defs.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='nr_tasks' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='tasks' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='mg_tasks' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='dying_tasks' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='task_iters' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='215' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='e_cset_node' type-id='type-id-1141' visibility='default' filepath='include/linux/cgroup-defs.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='threaded_csets' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='threaded_csets_node' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='hlist' type-id='type-id-520' visibility='default' filepath='include/linux/cgroup-defs.h' line='234' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='cgrp_links' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='240' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='mg_preload_node' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='mg_node' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='mg_src_cgrp' type-id='type-id-2309' visibility='default' filepath='include/linux/cgroup-defs.h' line='256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='mg_dst_cgrp' type-id='type-id-2309' visibility='default' filepath='include/linux/cgroup-defs.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='mg_dst_cset' type-id='type-id-1529' visibility='default' filepath='include/linux/cgroup-defs.h' line='258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='dead' type-id='type-id-33' visibility='default' filepath='include/linux/cgroup-defs.h' line='261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/cgroup-defs.h' line='264' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cgroup_subsys_state' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='121' column='1' id='type-id-424'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cgroup' type-id='type-id-2309' visibility='default' filepath='include/linux/cgroup-defs.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ss' type-id='type-id-2310' visibility='default' filepath='include/linux/cgroup-defs.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='refcnt' type-id='type-id-391' visibility='default' filepath='include/linux/cgroup-defs.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='sibling' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='children' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='rstat_css_node' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/cgroup-defs.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='serial_nr' type-id='type-id-40' visibility='default' filepath='include/linux/cgroup-defs.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='online_cnt' type-id='type-id-26' visibility='default' filepath='include/linux/cgroup-defs.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='destroy_work' type-id='type-id-255' visibility='default' filepath='include/linux/cgroup-defs.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='destroy_rwork' type-id='type-id-392' visibility='default' filepath='include/linux/cgroup-defs.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='parent' type-id='type-id-365' visibility='default' filepath='include/linux/cgroup-defs.h' line='168' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cgroup' size-in-bits='16384' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='320' column='1' id='type-id-2311'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='self' type-id='type-id-424' visibility='default' filepath='include/linux/cgroup-defs.h' line='322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/cgroup-defs.h' line='324' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2016'>
+          <var-decl name='level' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='max_depth' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2080'>
+          <var-decl name='nr_descendants' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='nr_dying_descendants' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2144'>
+          <var-decl name='max_descendants' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='nr_populated_csets' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2208'>
+          <var-decl name='nr_populated_domain_children' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='374' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='nr_populated_threaded_children' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2272'>
+          <var-decl name='nr_threaded_children' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='377' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='kn' type-id='type-id-1395' visibility='default' filepath='include/linux/cgroup-defs.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='procs_file' type-id='type-id-428' visibility='default' filepath='include/linux/cgroup-defs.h' line='380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='events_file' type-id='type-id-428' visibility='default' filepath='include/linux/cgroup-defs.h' line='381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='subtree_control' type-id='type-id-688' visibility='default' filepath='include/linux/cgroup-defs.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3280'>
+          <var-decl name='subtree_ss_mask' type-id='type-id-688' visibility='default' filepath='include/linux/cgroup-defs.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3296'>
+          <var-decl name='old_subtree_control' type-id='type-id-688' visibility='default' filepath='include/linux/cgroup-defs.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3312'>
+          <var-decl name='old_subtree_ss_mask' type-id='type-id-688' visibility='default' filepath='include/linux/cgroup-defs.h' line='393' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='subsys' type-id='type-id-959' visibility='default' filepath='include/linux/cgroup-defs.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='root' type-id='type-id-2312' visibility='default' filepath='include/linux/cgroup-defs.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='cset_links' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='e_csets' type-id='type-id-1141' visibility='default' filepath='include/linux/cgroup-defs.h' line='413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='dom_cgrp' type-id='type-id-2309' visibility='default' filepath='include/linux/cgroup-defs.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='old_dom_cgrp' type-id='type-id-2309' visibility='default' filepath='include/linux/cgroup-defs.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='rstat_cpu' type-id='type-id-2313' visibility='default' filepath='include/linux/cgroup-defs.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='rstat_css_list' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='427' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='pending_bstat' type-id='type-id-2314' visibility='default' filepath='include/linux/cgroup-defs.h' line='430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='bstat' type-id='type-id-2314' visibility='default' filepath='include/linux/cgroup-defs.h' line='431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='prev_cputime' type-id='type-id-1509' visibility='default' filepath='include/linux/cgroup-defs.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='pidlists' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='438' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='pidlist_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/cgroup-defs.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='offline_waitq' type-id='type-id-225' visibility='default' filepath='include/linux/cgroup-defs.h' line='442' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='release_agent_work' type-id='type-id-255' visibility='default' filepath='include/linux/cgroup-defs.h' line='445' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='psi' type-id='type-id-2315' visibility='default' filepath='include/linux/cgroup-defs.h' line='448' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11520'>
+          <var-decl name='bpf' type-id='type-id-2316' visibility='default' filepath='include/linux/cgroup-defs.h' line='451' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16320'>
+          <var-decl name='congestion_count' type-id='type-id-26' visibility='default' filepath='include/linux/cgroup-defs.h' line='454' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16352'>
+          <var-decl name='ancestor_ids' type-id='type-id-1134' visibility='default' filepath='include/linux/cgroup-defs.h' line='457' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cgroup_file' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='107' column='1' id='type-id-428'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kn' type-id='type-id-1395' visibility='default' filepath='include/linux/cgroup-defs.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='notified_at' type-id='type-id-16' visibility='default' filepath='include/linux/cgroup-defs.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='notify_timer' type-id='type-id-417' visibility='default' filepath='include/linux/cgroup-defs.h' line='111' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cgroup_root' size-in-bits='50240' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='465' column='1' id='type-id-2317'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kf_root' type-id='type-id-1430' visibility='default' filepath='include/linux/cgroup-defs.h' line='466' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='subsys_mask' type-id='type-id-5' visibility='default' filepath='include/linux/cgroup-defs.h' line='469' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='hierarchy_id' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cgrp' type-id='type-id-2311' visibility='default' filepath='include/linux/cgroup-defs.h' line='475' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16512'>
+          <var-decl name='cgrp_ancestor_id_storage' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='478' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16544'>
+          <var-decl name='nr_cgrps' type-id='type-id-26' visibility='default' filepath='include/linux/cgroup-defs.h' line='481' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16576'>
+          <var-decl name='root_list' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='484' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16704'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/cgroup-defs.h' line='487' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16768'>
+          <var-decl name='cgroup_idr' type-id='type-id-1432' visibility='default' filepath='include/linux/cgroup-defs.h' line='490' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16960'>
+          <var-decl name='release_agent_path' type-id='type-id-969' visibility='default' filepath='include/linux/cgroup-defs.h' line='493' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='49728'>
+          <var-decl name='name' type-id='type-id-250' visibility='default' filepath='include/linux/cgroup-defs.h' line='496' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cgroup_rstat_cpu' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='291' column='1' id='type-id-2318'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bsync' type-id='type-id-2001' visibility='default' filepath='include/linux/cgroup-defs.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bstat' type-id='type-id-2314' visibility='default' filepath='include/linux/cgroup-defs.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='last_bstat' type-id='type-id-2314' visibility='default' filepath='include/linux/cgroup-defs.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='updated_children' type-id='type-id-2309' visibility='default' filepath='include/linux/cgroup-defs.h' line='316' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='updated_next' type-id='type-id-2309' visibility='default' filepath='include/linux/cgroup-defs.h' line='317' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cgroup_base_stat' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='267' column='1' id='type-id-2314'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cputime' type-id='type-id-1510' visibility='default' filepath='include/linux/cgroup-defs.h' line='268' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='psi_group' size-in-bits='4928' is-struct='yes' visibility='default' filepath='include/linux/psi_types.h' line='128' column='1' id='type-id-2315'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='avgs_lock' type-id='type-id-245' visibility='default' filepath='include/linux/psi_types.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='pcpu' type-id='type-id-2319' visibility='default' filepath='include/linux/psi_types.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='avg_total' type-id='type-id-498' visibility='default' filepath='include/linux/psi_types.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='avg_last_update' type-id='type-id-40' visibility='default' filepath='include/linux/psi_types.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='avg_next_update' type-id='type-id-40' visibility='default' filepath='include/linux/psi_types.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='avgs_work' type-id='type-id-411' visibility='default' filepath='include/linux/psi_types.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='total' type-id='type-id-1177' visibility='default' filepath='include/linux/psi_types.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='avg' type-id='type-id-1202' visibility='default' filepath='include/linux/psi_types.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='poll_scheduled' type-id='type-id-26' visibility='default' filepath='include/linux/psi_types.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='poll_kworker' type-id='type-id-2320' visibility='default' filepath='include/linux/psi_types.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='poll_work' type-id='type-id-2321' visibility='default' filepath='include/linux/psi_types.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='trigger_lock' type-id='type-id-245' visibility='default' filepath='include/linux/psi_types.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='triggers' type-id='type-id-20' visibility='default' filepath='include/linux/psi_types.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='nr_triggers' type-id='type-id-1175' visibility='default' filepath='include/linux/psi_types.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4384'>
+          <var-decl name='poll_states' type-id='type-id-7' visibility='default' filepath='include/linux/psi_types.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='poll_min_period' type-id='type-id-40' visibility='default' filepath='include/linux/psi_types.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='polling_total' type-id='type-id-498' visibility='default' filepath='include/linux/psi_types.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='polling_next_update' type-id='type-id-40' visibility='default' filepath='include/linux/psi_types.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='polling_until' type-id='type-id-40' visibility='default' filepath='include/linux/psi_types.h' line='164' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='psi_group_cpu' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/psi_types.h' line='56' column='1' id='type-id-2322'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='seq' type-id='type-id-387' visibility='default' filepath='include/linux/psi_types.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='tasks' type-id='type-id-1191' visibility='default' filepath='include/linux/psi_types.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='state_mask' type-id='type-id-7' visibility='default' filepath='include/linux/psi_types.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='times' type-id='type-id-1176' visibility='default' filepath='include/linux/psi_types.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='state_start' type-id='type-id-40' visibility='default' filepath='include/linux/psi_types.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='times_prev' type-id='type-id-1174' visibility='default' filepath='include/linux/psi_types.h' line='77' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kthread_worker' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/kthread.h' line='85' column='1' id='type-id-2323'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/kthread.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/kthread.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='work_list' type-id='type-id-20' visibility='default' filepath='include/linux/kthread.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='delayed_work_list' type-id='type-id-20' visibility='default' filepath='include/linux/kthread.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='task' type-id='type-id-431' visibility='default' filepath='include/linux/kthread.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='current_work' type-id='type-id-2324' visibility='default' filepath='include/linux/kthread.h' line='91' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kthread_work' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/kthread.h' line='94' column='1' id='type-id-2325'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/linux/kthread.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='func' type-id='type-id-2326' visibility='default' filepath='include/linux/kthread.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='worker' type-id='type-id-2320' visibility='default' filepath='include/linux/kthread.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='canceling' type-id='type-id-17' visibility='default' filepath='include/linux/kthread.h' line='99' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='kthread_work_func_t' type-id='type-id-2327' filepath='include/linux/kthread.h' line='78' column='1' id='type-id-2326'/>
+      <class-decl name='kthread_delayed_work' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/kthread.h' line='102' column='1' id='type-id-2321'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='work' type-id='type-id-2325' visibility='default' filepath='include/linux/kthread.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='timer' type-id='type-id-417' visibility='default' filepath='include/linux/kthread.h' line='104' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cgroup_bpf' size-in-bits='4800' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='51' column='1' id='type-id-2316'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='effective' type-id='type-id-955' visibility='default' filepath='include/linux/bpf-cgroup.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='progs' type-id='type-id-1140' visibility='default' filepath='include/linux/bpf-cgroup.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='flags' type-id='type-id-1173' visibility='default' filepath='include/linux/bpf-cgroup.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='inactive' type-id='type-id-747' visibility='default' filepath='include/linux/bpf-cgroup.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_prog_array' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='364' column='1' id='type-id-2328'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/bpf.h' line='365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='items' type-id='type-id-958' visibility='default' filepath='include/linux/bpf.h' line='366' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_prog_array_item' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='359' column='1' id='type-id-957'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prog' type-id='type-id-1228' visibility='default' filepath='include/linux/bpf.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cgroup_storage' type-id='type-id-2329' visibility='default' filepath='include/linux/bpf.h' line='361' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_cgroup_storage' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='34' column='1' id='type-id-2330'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buf' type-id='type-id-2331' visibility='default' filepath='include/linux/bpf-cgroup.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='map' type-id='type-id-2332' visibility='default' filepath='include/linux/bpf-cgroup.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='key' type-id='type-id-2333' visibility='default' filepath='include/linux/bpf-cgroup.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/bpf-cgroup.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='node' type-id='type-id-422' visibility='default' filepath='include/linux/bpf-cgroup.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/bpf-cgroup.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_storage_buffer' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='29' column='1' id='type-id-2334'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/bpf-cgroup.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='data' type-id='type-id-440' visibility='default' filepath='include/linux/bpf-cgroup.h' line='31' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_cgroup_storage_key' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='78' column='1' id='type-id-2333'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cgroup_inode_id' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/bpf.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='attach_type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/bpf.h' line='80' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cgroup_subsys' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='595' column='1' id='type-id-2335'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='css_alloc' type-id='type-id-2336' visibility='default' filepath='include/linux/cgroup-defs.h' line='596' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='css_online' type-id='type-id-2337' visibility='default' filepath='include/linux/cgroup-defs.h' line='597' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='css_offline' type-id='type-id-2338' visibility='default' filepath='include/linux/cgroup-defs.h' line='598' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='css_released' type-id='type-id-2338' visibility='default' filepath='include/linux/cgroup-defs.h' line='599' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='css_free' type-id='type-id-2338' visibility='default' filepath='include/linux/cgroup-defs.h' line='600' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='css_reset' type-id='type-id-2338' visibility='default' filepath='include/linux/cgroup-defs.h' line='601' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='css_rstat_flush' type-id='type-id-2339' visibility='default' filepath='include/linux/cgroup-defs.h' line='602' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='css_extra_stat_show' type-id='type-id-2340' visibility='default' filepath='include/linux/cgroup-defs.h' line='603' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='can_attach' type-id='type-id-2341' visibility='default' filepath='include/linux/cgroup-defs.h' line='606' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='cancel_attach' type-id='type-id-2342' visibility='default' filepath='include/linux/cgroup-defs.h' line='607' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='attach' type-id='type-id-2342' visibility='default' filepath='include/linux/cgroup-defs.h' line='608' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='post_attach' type-id='type-id-1390' visibility='default' filepath='include/linux/cgroup-defs.h' line='609' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='can_fork' type-id='type-id-2343' visibility='default' filepath='include/linux/cgroup-defs.h' line='610' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='cancel_fork' type-id='type-id-2344' visibility='default' filepath='include/linux/cgroup-defs.h' line='611' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='fork' type-id='type-id-2344' visibility='default' filepath='include/linux/cgroup-defs.h' line='612' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='exit' type-id='type-id-2344' visibility='default' filepath='include/linux/cgroup-defs.h' line='613' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='release' type-id='type-id-2344' visibility='default' filepath='include/linux/cgroup-defs.h' line='614' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='bind' type-id='type-id-2338' visibility='default' filepath='include/linux/cgroup-defs.h' line='615' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='early_init' type-id='type-id-33' visibility='default' filepath='include/linux/cgroup-defs.h' line='617' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='implicit_on_dfl' type-id='type-id-33' visibility='default' filepath='include/linux/cgroup-defs.h' line='630' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='threaded' type-id='type-id-33' visibility='default' filepath='include/linux/cgroup-defs.h' line='642' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='broken_hierarchy' type-id='type-id-33' visibility='default' filepath='include/linux/cgroup-defs.h' line='656' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='warned_broken_hierarchy' type-id='type-id-33' visibility='default' filepath='include/linux/cgroup-defs.h' line='657' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/cgroup-defs.h' line='660' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/cgroup-defs.h' line='661' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='legacy_name' type-id='type-id-4' visibility='default' filepath='include/linux/cgroup-defs.h' line='664' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='root' type-id='type-id-2312' visibility='default' filepath='include/linux/cgroup-defs.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='css_idr' type-id='type-id-1432' visibility='default' filepath='include/linux/cgroup-defs.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='cfts' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='676' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='dfl_cftypes' type-id='type-id-2345' visibility='default' filepath='include/linux/cgroup-defs.h' line='682' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='legacy_cftypes' type-id='type-id-2345' visibility='default' filepath='include/linux/cgroup-defs.h' line='683' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='depends_on' type-id='type-id-5' visibility='default' filepath='include/linux/cgroup-defs.h' line='692' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cftype' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='506' column='1' id='type-id-2346'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-250' visibility='default' filepath='include/linux/cgroup-defs.h' line='512' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='private' type-id='type-id-16' visibility='default' filepath='include/linux/cgroup-defs.h' line='513' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='max_write_len' type-id='type-id-84' visibility='default' filepath='include/linux/cgroup-defs.h' line='519' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/cgroup-defs.h' line='522' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='file_offset' type-id='type-id-5' visibility='default' filepath='include/linux/cgroup-defs.h' line='530' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='ss' type-id='type-id-2310' visibility='default' filepath='include/linux/cgroup-defs.h' line='536' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/linux/cgroup-defs.h' line='537' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='kf_ops' type-id='type-id-2347' visibility='default' filepath='include/linux/cgroup-defs.h' line='538' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='open' type-id='type-id-1458' visibility='default' filepath='include/linux/cgroup-defs.h' line='540' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='release' type-id='type-id-1459' visibility='default' filepath='include/linux/cgroup-defs.h' line='541' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='read_u64' type-id='type-id-2348' visibility='default' filepath='include/linux/cgroup-defs.h' line='547' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='read_s64' type-id='type-id-2349' visibility='default' filepath='include/linux/cgroup-defs.h' line='551' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='seq_show' type-id='type-id-311' visibility='default' filepath='include/linux/cgroup-defs.h' line='554' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='seq_start' type-id='type-id-1451' visibility='default' filepath='include/linux/cgroup-defs.h' line='557' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='seq_next' type-id='type-id-1453' visibility='default' filepath='include/linux/cgroup-defs.h' line='558' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='seq_stop' type-id='type-id-1452' visibility='default' filepath='include/linux/cgroup-defs.h' line='559' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='write_u64' type-id='type-id-2350' visibility='default' filepath='include/linux/cgroup-defs.h' line='566' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='write_s64' type-id='type-id-2351' visibility='default' filepath='include/linux/cgroup-defs.h' line='571' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='write' type-id='type-id-1460' visibility='default' filepath='include/linux/cgroup-defs.h' line='580' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='poll' type-id='type-id-1461' visibility='default' filepath='include/linux/cgroup-defs.h' line='583' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__poll_t' type-id='type-id-5' filepath='include/uapi/linux/types.h' line='52' column='1' id='type-id-880'/>
+      <class-decl name='rcu_work' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/workqueue.h' line='124' column='1' id='type-id-392'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='work' type-id='type-id-255' visibility='default' filepath='include/linux/workqueue.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/workqueue.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='wq' type-id='type-id-654' visibility='default' filepath='include/linux/workqueue.h' line='129' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='signal_struct' size-in-bits='8064' is-struct='yes' visibility='default' filepath='include/linux/sched/signal.h' line='84' column='1' id='type-id-2352'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sigcnt' type-id='type-id-26' visibility='default' filepath='include/linux/sched/signal.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='live' type-id='type-id-26' visibility='default' filepath='include/linux/sched/signal.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nr_threads' type-id='type-id-17' visibility='default' filepath='include/linux/sched/signal.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='thread_head' type-id='type-id-20' visibility='default' filepath='include/linux/sched/signal.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='wait_chldexit' type-id='type-id-225' visibility='default' filepath='include/linux/sched/signal.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='curr_target' type-id='type-id-431' visibility='default' filepath='include/linux/sched/signal.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='shared_pending' type-id='type-id-1517' visibility='default' filepath='include/linux/sched/signal.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='multiprocess' type-id='type-id-186' visibility='default' filepath='include/linux/sched/signal.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='group_exit_code' type-id='type-id-17' visibility='default' filepath='include/linux/sched/signal.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='notify_count' type-id='type-id-17' visibility='default' filepath='include/linux/sched/signal.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='group_exit_task' type-id='type-id-431' visibility='default' filepath='include/linux/sched/signal.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='group_stop_count' type-id='type-id-17' visibility='default' filepath='include/linux/sched/signal.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/sched/signal.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='is_child_subreaper' type-id='type-id-5' visibility='default' filepath='include/linux/sched/signal.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='has_child_subreaper' type-id='type-id-5' visibility='default' filepath='include/linux/sched/signal.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='posix_timer_id' type-id='type-id-17' visibility='default' filepath='include/linux/sched/signal.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='posix_timers' type-id='type-id-20' visibility='default' filepath='include/linux/sched/signal.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='real_timer' type-id='type-id-681' visibility='default' filepath='include/linux/sched/signal.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='it_real_incr' type-id='type-id-682' visibility='default' filepath='include/linux/sched/signal.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='it' type-id='type-id-1120' visibility='default' filepath='include/linux/sched/signal.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='cputimer' type-id='type-id-2353' visibility='default' filepath='include/linux/sched/signal.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='cputime_expires' type-id='type-id-1510' visibility='default' filepath='include/linux/sched/signal.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='cpu_timers' type-id='type-id-457' visibility='default' filepath='include/linux/sched/signal.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='pids' type-id='type-id-1160' visibility='default' filepath='include/linux/sched/signal.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='tty_old_pgrp' type-id='type-id-251' visibility='default' filepath='include/linux/sched/signal.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='leader' type-id='type-id-17' visibility='default' filepath='include/linux/sched/signal.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='tty' type-id='type-id-2354' visibility='default' filepath='include/linux/sched/signal.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='autogroup' type-id='type-id-2355' visibility='default' filepath='include/linux/sched/signal.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='stats_lock' type-id='type-id-1917' visibility='default' filepath='include/linux/sched/signal.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='utime' type-id='type-id-40' visibility='default' filepath='include/linux/sched/signal.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='stime' type-id='type-id-40' visibility='default' filepath='include/linux/sched/signal.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='cutime' type-id='type-id-40' visibility='default' filepath='include/linux/sched/signal.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='cstime' type-id='type-id-40' visibility='default' filepath='include/linux/sched/signal.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='gtime' type-id='type-id-40' visibility='default' filepath='include/linux/sched/signal.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='cgtime' type-id='type-id-40' visibility='default' filepath='include/linux/sched/signal.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='prev_cputime' type-id='type-id-1509' visibility='default' filepath='include/linux/sched/signal.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='nvcsw' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='nivcsw' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='cnvcsw' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='cnivcsw' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='min_flt' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='maj_flt' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='cmin_flt' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='cmaj_flt' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='inblock' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='oublock' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='cinblock' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='coublock' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='maxrss' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='cmaxrss' type-id='type-id-16' visibility='default' filepath='include/linux/sched/signal.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='ioac' type-id='type-id-1527' visibility='default' filepath='include/linux/sched/signal.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='sum_sched_runtime' type-id='type-id-98' visibility='default' filepath='include/linux/sched/signal.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='rlim' type-id='type-id-1165' visibility='default' filepath='include/linux/sched/signal.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='stats' type-id='type-id-2356' visibility='default' filepath='include/linux/sched/signal.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7552'>
+          <var-decl name='audit_tty' type-id='type-id-5' visibility='default' filepath='include/linux/sched/signal.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7616'>
+          <var-decl name='tty_audit_buf' type-id='type-id-2357' visibility='default' filepath='include/linux/sched/signal.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7680'>
+          <var-decl name='oom_flag_origin' type-id='type-id-33' visibility='default' filepath='include/linux/sched/signal.h' line='225' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7696'>
+          <var-decl name='oom_score_adj' type-id='type-id-261' visibility='default' filepath='include/linux/sched/signal.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7712'>
+          <var-decl name='oom_score_adj_min' type-id='type-id-261' visibility='default' filepath='include/linux/sched/signal.h' line='227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7744'>
+          <var-decl name='oom_mm' type-id='type-id-882' visibility='default' filepath='include/linux/sched/signal.h' line='229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7808'>
+          <var-decl name='cred_guard_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/sched/signal.h' line='232' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sigpending' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/signal_types.h' line='26' column='1' id='type-id-1517'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/signal_types.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='signal' type-id='type-id-1516' visibility='default' filepath='include/linux/signal_types.h' line='28' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='sigset_t' type-id='type-id-2358' filepath='include/uapi/asm-generic/signal.h' line='92' column='1' id='type-id-1516'/>
+      <class-decl name='__anonymous_struct__51' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1516' visibility='default' filepath='include/uapi/asm-generic/signal.h' line='90' column='1' id='type-id-2358'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sig' type-id='type-id-491' visibility='default' filepath='include/uapi/asm-generic/signal.h' line='91' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpu_itimer' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/sched/signal.h' line='34' column='1' id='type-id-1119'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='expires' type-id='type-id-40' visibility='default' filepath='include/linux/sched/signal.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='incr' type-id='type-id-40' visibility='default' filepath='include/linux/sched/signal.h' line='36' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='thread_group_cputimer' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/sched/signal.h' line='66' column='1' id='type-id-2353'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cputime_atomic' type-id='type-id-2359' visibility='default' filepath='include/linux/sched/signal.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='running' type-id='type-id-33' visibility='default' filepath='include/linux/sched/signal.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='200'>
+          <var-decl name='checking_timer' type-id='type-id-33' visibility='default' filepath='include/linux/sched/signal.h' line='69' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='task_cputime_atomic' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/sched/signal.h' line='43' column='1' id='type-id-2359'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='utime' type-id='type-id-113' visibility='default' filepath='include/linux/sched/signal.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='stime' type-id='type-id-113' visibility='default' filepath='include/linux/sched/signal.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='sum_exec_runtime' type-id='type-id-113' visibility='default' filepath='include/linux/sched/signal.h' line='46' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='task_io_accounting' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/task_io_accounting.h' line='12' column='1' id='type-id-1527'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rchar' type-id='type-id-40' visibility='default' filepath='include/linux/task_io_accounting.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wchar' type-id='type-id-40' visibility='default' filepath='include/linux/task_io_accounting.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='syscr' type-id='type-id-40' visibility='default' filepath='include/linux/task_io_accounting.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='syscw' type-id='type-id-40' visibility='default' filepath='include/linux/task_io_accounting.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='syscfs' type-id='type-id-40' visibility='default' filepath='include/linux/task_io_accounting.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='read_bytes' type-id='type-id-40' visibility='default' filepath='include/linux/task_io_accounting.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='write_bytes' type-id='type-id-40' visibility='default' filepath='include/linux/task_io_accounting.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='cancelled_write_bytes' type-id='type-id-40' visibility='default' filepath='include/linux/task_io_accounting.h' line='46' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rlimit' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/resource.h' line='43' column='1' id='type-id-1164'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rlim_cur' type-id='type-id-888' visibility='default' filepath='include/uapi/linux/resource.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rlim_max' type-id='type-id-888' visibility='default' filepath='include/uapi/linux/resource.h' line='45' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='taskstats' size-in-bits='2752' is-struct='yes' visibility='default' filepath='include/uapi/linux/taskstats.h' line='41' column='1' id='type-id-2360'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='version' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/taskstats.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ac_exitcode' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/taskstats.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ac_flag' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/taskstats.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='72'>
+          <var-decl name='ac_nice' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/taskstats.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cpu_count' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='cpu_delay_total' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='blkio_count' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='blkio_delay_total' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='swapin_count' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='swapin_delay_total' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='cpu_run_real_total' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='cpu_run_virtual_total' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='ac_comm' type-id='type-id-373' visibility='default' filepath='include/uapi/linux/taskstats.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='ac_sched' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/taskstats.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='904'>
+          <var-decl name='ac_pad' type-id='type-id-940' visibility='default' filepath='include/uapi/linux/taskstats.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='ac_uid' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/taskstats.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='ac_gid' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/taskstats.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='ac_pid' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/taskstats.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='ac_ppid' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/taskstats.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='ac_btime' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/taskstats.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='ac_etime' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='ac_utime' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='ac_stime' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='ac_minflt' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='ac_majflt' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='coremem' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='virtmem' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='hiwater_rss' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='hiwater_vm' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='read_char' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='write_char' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='read_syscalls' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='write_syscalls' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='read_bytes' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='write_bytes' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='cancelled_write_bytes' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='nvcsw' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='nivcsw' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='ac_utimescaled' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='ac_stimescaled' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='cpu_scaled_run_real_total' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='freepages_count' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='freepages_delay_total' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='thrashing_count' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='thrashing_delay_total' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/taskstats.h' line='170' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sighand_struct' size-in-bits='16704' is-struct='yes' visibility='default' filepath='include/linux/sched/signal.h' line='16' column='1' id='type-id-2361'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-26' visibility='default' filepath='include/linux/sched/signal.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='action' type-id='type-id-1136' visibility='default' filepath='include/linux/sched/signal.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16448'>
+          <var-decl name='siglock' type-id='type-id-247' visibility='default' filepath='include/linux/sched/signal.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16512'>
+          <var-decl name='signalfd_wqh' type-id='type-id-225' visibility='default' filepath='include/linux/sched/signal.h' line='20' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='k_sigaction' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/signal_types.h' line='45' column='1' id='type-id-1135'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sa' type-id='type-id-2362' visibility='default' filepath='include/linux/signal_types.h' line='46' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sigaction' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/signal_types.h' line='31' column='1' id='type-id-2362'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sa_handler' type-id='type-id-2363' visibility='default' filepath='include/linux/signal_types.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sa_flags' type-id='type-id-16' visibility='default' filepath='include/linux/signal_types.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='sa_restorer' type-id='type-id-2364' visibility='default' filepath='include/linux/signal_types.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sa_mask' type-id='type-id-1516' visibility='default' filepath='include/linux/signal_types.h' line='42' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__sighandler_t' type-id='type-id-2365' filepath='include/uapi/asm-generic/signal-defs.h' line='19' column='1' id='type-id-2363'/>
+      <typedef-decl name='__signalfn_t' type-id='type-id-2366' filepath='include/uapi/asm-generic/signal-defs.h' line='18' column='1' id='type-id-2367'/>
+      <typedef-decl name='__sigrestore_t' type-id='type-id-2368' filepath='include/uapi/asm-generic/signal-defs.h' line='22' column='1' id='type-id-2364'/>
+      <typedef-decl name='__restorefn_t' type-id='type-id-2369' filepath='include/uapi/asm-generic/signal-defs.h' line='21' column='1' id='type-id-2370'/>
+      <class-decl name='seccomp' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/seccomp.h' line='28' column='1' id='type-id-1519'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mode' type-id='type-id-17' visibility='default' filepath='include/linux/seccomp.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='filter' type-id='type-id-2371' visibility='default' filepath='include/linux/seccomp.h' line='30' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='wake_q_node' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/sched.h' line='580' column='1' id='type-id-1520'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-2372' visibility='default' filepath='include/linux/sched.h' line='581' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='io_context' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/iocontext.h' line='98' column='1' id='type-id-2373'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refcount' type-id='type-id-115' visibility='default' filepath='include/linux/iocontext.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='active_ref' type-id='type-id-26' visibility='default' filepath='include/linux/iocontext.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='nr_tasks' type-id='type-id-26' visibility='default' filepath='include/linux/iocontext.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/iocontext.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='ioprio' type-id='type-id-312' visibility='default' filepath='include/linux/iocontext.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='nr_batch_requests' type-id='type-id-17' visibility='default' filepath='include/linux/iocontext.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='last_waited' type-id='type-id-16' visibility='default' filepath='include/linux/iocontext.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='icq_tree' type-id='type-id-415' visibility='default' filepath='include/linux/iocontext.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='icq_hint' type-id='type-id-513' visibility='default' filepath='include/linux/iocontext.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='icq_list' type-id='type-id-186' visibility='default' filepath='include/linux/iocontext.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='release_work' type-id='type-id-255' visibility='default' filepath='include/linux/iocontext.h' line='118' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='io_cq' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/iocontext.h' line='72' column='1' id='type-id-2374'>
+        <member-type access='public'>
+          <union-decl name='__anonymous_union__' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='86' column='1' id='type-id-2375'>
+            <data-member access='private'>
+              <var-decl name='ioc_node' type-id='type-id-520' visibility='default' filepath='include/linux/iocontext.h' line='87' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='__rcu_head' type-id='type-id-385' visibility='default' filepath='include/linux/iocontext.h' line='88' column='1'/>
+            </data-member>
+          </union-decl>
+        </member-type>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='q' type-id='type-id-1536' visibility='default' filepath='include/linux/iocontext.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ioc' type-id='type-id-364' visibility='default' filepath='include/linux/iocontext.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='' type-id='type-id-2376' visibility='default' filepath='include/linux/iocontext.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/iocontext.h' line='91' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='siginfo_t' type-id='type-id-2377' filepath='include/uapi/asm-generic/siginfo.h' line='133' column='1' id='type-id-2378'/>
+      <class-decl name='siginfo' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='43' column='1' id='type-id-2377'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='si_signo' type-id='type-id-17' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='si_errno' type-id='type-id-17' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='si_code' type-id='type-id-17' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='_sifields' type-id='type-id-2379' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='132' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__32' size-in-bits='896' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='53' column='1' id='type-id-2379'>
+        <data-member access='private'>
+          <var-decl name='_pad' type-id='type-id-1129' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='_kill' type-id='type-id-2380' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='_timer' type-id='type-id-2381' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='_rt' type-id='type-id-2382' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='_sigchld' type-id='type-id-2383' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='_sigfault' type-id='type-id-2384' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='_sigpoll' type-id='type-id-2385' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='_sigsys' type-id='type-id-2386' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='131' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__52' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='57' column='1' id='type-id-2380'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_pid' type-id='type-id-1574' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='_uid' type-id='type-id-1310' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='59' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__53' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='63' column='1' id='type-id-2381'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_tid' type-id='type-id-2387' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='_overrun' type-id='type-id-17' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='_sigval' type-id='type-id-2388' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='_sys_private' type-id='type-id-17' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='67' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__kernel_timer_t' type-id='type-id-17' filepath='include/uapi/asm-generic/posix_types.h' line='92' column='1' id='type-id-2387'/>
+      <typedef-decl name='sigval_t' type-id='type-id-2389' filepath='include/uapi/asm-generic/siginfo.h' line='11' column='1' id='type-id-2388'/>
+      <union-decl name='sigval' size-in-bits='64' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='8' column='1' id='type-id-2389'>
+        <data-member access='private'>
+          <var-decl name='sival_int' type-id='type-id-17' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='9' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='sival_ptr' type-id='type-id-15' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='10' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__54' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='71' column='1' id='type-id-2382'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_pid' type-id='type-id-1574' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='_uid' type-id='type-id-1310' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='_sigval' type-id='type-id-2388' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__55' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='78' column='1' id='type-id-2383'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_pid' type-id='type-id-1574' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='_uid' type-id='type-id-1310' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='_status' type-id='type-id-17' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='_utime' type-id='type-id-2390' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='_stime' type-id='type-id-2390' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='83' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__kernel_clock_t' type-id='type-id-105' filepath='include/uapi/asm-generic/posix_types.h' line='91' column='1' id='type-id-2390'/>
+      <class-decl name='__anonymous_struct__56' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='87' column='1' id='type-id-2384'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_addr' type-id='type-id-15' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='' type-id='type-id-2391' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='100' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__33' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='100' column='1' id='type-id-2391'>
+        <data-member access='private'>
+          <var-decl name='_addr_lsb' type-id='type-id-261' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='_addr_bnd' type-id='type-id-2392' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='_addr_pkey' type-id='type-id-2393' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='116' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__57' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='107' column='1' id='type-id-2392'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_dummy_bnd' type-id='type-id-973' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='_lower' type-id='type-id-15' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='_upper' type-id='type-id-15' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='110' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__58' size-in-bits='96' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='113' column='1' id='type-id-2393'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_dummy_pkey' type-id='type-id-973' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='_pkey' type-id='type-id-511' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='115' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__59' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='121' column='1' id='type-id-2385'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_band' type-id='type-id-192' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='_fd' type-id='type-id-17' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='123' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__60' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='127' column='1' id='type-id-2386'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='_call_addr' type-id='type-id-15' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='_syscall' type-id='type-id-17' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='_arch' type-id='type-id-5' visibility='default' filepath='include/uapi/asm-generic/siginfo.h' line='130' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='nodemask_t' type-id='type-id-2394' filepath='include/linux/nodemask.h' line='98' column='1' id='type-id-1528'/>
+      <class-decl name='__anonymous_struct__61' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1528' visibility='default' filepath='include/linux/nodemask.h' line='98' column='1' id='type-id-2394'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bits' type-id='type-id-491' visibility='default' filepath='include/linux/nodemask.h' line='98' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='compat_robust_list_head' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/linux/compat.h' line='413' column='1' id='type-id-2395'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-2396' visibility='default' filepath='include/linux/compat.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='futex_offset' type-id='type-id-2397' visibility='default' filepath='include/linux/compat.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list_op_pending' type-id='type-id-2398' visibility='default' filepath='include/linux/compat.h' line='416' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='compat_robust_list' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/compat.h' line='409' column='1' id='type-id-2396'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-2398' visibility='default' filepath='include/linux/compat.h' line='410' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='compat_uptr_t' type-id='type-id-7' filepath='arch/arm64/include/asm/compat.h' line='66' column='1' id='type-id-2398'/>
+      <typedef-decl name='compat_long_t' type-id='type-id-738' filepath='arch/arm64/include/asm/compat.h' line='60' column='1' id='type-id-2397'/>
+      <class-decl name='tlbflush_unmap_batch' is-struct='yes' visibility='default' filepath='include/linux/mm_types_task.h' line='72' column='1' id='type-id-1533'/>
+      <class-decl name='page_frag' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/mm_types_task.h' line='60' column='1' id='type-id-1534'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='page' type-id='type-id-512' visibility='default' filepath='include/linux/mm_types_task.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='offset' type-id='type-id-511' visibility='default' filepath='include/linux/mm_types_task.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='size' type-id='type-id-511' visibility='default' filepath='include/linux/mm_types_task.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='uprobe_task' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/uprobes.h' line='74' column='1' id='type-id-2399'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='state' type-id='type-id-2400' visibility='default' filepath='include/linux/uprobes.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='' type-id='type-id-2401' visibility='default' filepath='include/linux/uprobes.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='active_uprobe' type-id='type-id-2402' visibility='default' filepath='include/linux/uprobes.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='xol_vaddr' type-id='type-id-16' visibility='default' filepath='include/linux/uprobes.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='return_instances' type-id='type-id-2403' visibility='default' filepath='include/linux/uprobes.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='depth' type-id='type-id-5' visibility='default' filepath='include/linux/uprobes.h' line='93' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='uprobe_task_state' filepath='include/linux/uprobes.h' line='64' column='1' id='type-id-2400'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='UTASK_RUNNING' value='0'/>
+        <enumerator name='UTASK_SSTEP' value='1'/>
+        <enumerator name='UTASK_SSTEP_ACK' value='2'/>
+        <enumerator name='UTASK_SSTEP_TRAPPED' value='3'/>
+      </enum-decl>
+      <union-decl name='__anonymous_union__34' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/uprobes.h' line='77' column='1' id='type-id-2401'>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/uprobes.h' line='83' column='1' id='type-id-2404'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='dup_xol_work' type-id='type-id-385' visibility='default' filepath='include/linux/uprobes.h' line='84' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='dup_xol_addr' type-id='type-id-16' visibility='default' filepath='include/linux/uprobes.h' line='85' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-2405' visibility='default' filepath='include/linux/uprobes.h' line='78' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__62' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/uprobes.h' line='78' column='1' id='type-id-2405'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='autask' type-id='type-id-2406' visibility='default' filepath='include/linux/uprobes.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='vaddr' type-id='type-id-16' visibility='default' filepath='include/linux/uprobes.h' line='80' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='arch_uprobe_task' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/uprobes.h' line='24' column='1' id='type-id-2406'/>
+      <class-decl name='return_instance' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/uprobes.h' line='96' column='1' id='type-id-2407'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='uprobe' type-id='type-id-2402' visibility='default' filepath='include/linux/uprobes.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='func' type-id='type-id-16' visibility='default' filepath='include/linux/uprobes.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='stack' type-id='type-id-16' visibility='default' filepath='include/linux/uprobes.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='orig_ret_vaddr' type-id='type-id-16' visibility='default' filepath='include/linux/uprobes.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='chained' type-id='type-id-33' visibility='default' filepath='include/linux/uprobes.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='next' type-id='type-id-2403' visibility='default' filepath='include/linux/uprobes.h' line='103' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vm_struct' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/vmalloc.h' line='34' column='1' id='type-id-2408'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-1538' visibility='default' filepath='include/linux/vmalloc.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='addr' type-id='type-id-15' visibility='default' filepath='include/linux/vmalloc.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='size' type-id='type-id-16' visibility='default' filepath='include/linux/vmalloc.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/vmalloc.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='pages' type-id='type-id-921' visibility='default' filepath='include/linux/vmalloc.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='nr_pages' type-id='type-id-5' visibility='default' filepath='include/linux/vmalloc.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='phys_addr' type-id='type-id-99' visibility='default' filepath='include/linux/vmalloc.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='caller' type-id='type-id-15' visibility='default' filepath='include/linux/vmalloc.h' line='42' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='thread_struct' size-in-bits='7808' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='116' column='1' id='type-id-1539'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cpu_context' type-id='type-id-2409' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='uw' type-id='type-id-2410' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5248'>
+          <var-decl name='fpsimd_cpu' type-id='type-id-5' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='sve_state' type-id='type-id-15' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='sve_vl' type-id='type-id-5' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5408'>
+          <var-decl name='sve_vl_onexec' type-id='type-id-5' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='fault_address' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='fault_code' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='debug' type-id='type-id-2411' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='136' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpu_context' size-in-bits='832' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='100' column='1' id='type-id-2409'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='x19' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='x20' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='x21' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='x22' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='x23' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='x24' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='x25' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='x26' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='x27' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='x28' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='fp' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='sp' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='pc' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='113' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__63' size-in-bits='4352' is-struct='yes' is-anonymous='yes' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='124' column='1' id='type-id-2410'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tp_value' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tp2_value' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fpsimd_state' type-id='type-id-2412' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='127' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='user_fpsimd_state' size-in-bits='4224' is-struct='yes' visibility='default' filepath='arch/arm64/include/uapi/asm/ptrace.h' line='78' column='1' id='type-id-2412'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='vregs' type-id='type-id-946' visibility='default' filepath='arch/arm64/include/uapi/asm/ptrace.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='fpsr' type-id='type-id-511' visibility='default' filepath='arch/arm64/include/uapi/asm/ptrace.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4128'>
+          <var-decl name='fpcr' type-id='type-id-511' visibility='default' filepath='arch/arm64/include/uapi/asm/ptrace.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='__reserved' type-id='type-id-930' visibility='default' filepath='arch/arm64/include/uapi/asm/ptrace.h' line='82' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='debug_info' size-in-bits='2176' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='87' column='1' id='type-id-2411'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='suspended_step' type-id='type-id-17' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='bps_disabled' type-id='type-id-17' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wps_disabled' type-id='type-id-17' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hbp_break' type-id='type-id-1157' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='hbp_watch' type-id='type-id-1157' visibility='default' filepath='arch/arm64/include/asm/processor.h' line='96' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mm_rss_stat' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/mm_types_task.h' line='56' column='1' id='type-id-1484'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-947' visibility='default' filepath='include/linux/mm_types_task.h' line='57' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='mm_context_t' type-id='type-id-2413' filepath='arch/arm64/include/asm/mmu.h' line='32' column='1' id='type-id-1486'/>
+      <class-decl name='__anonymous_struct__64' size-in-bits='192' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1486' visibility='default' filepath='arch/arm64/include/asm/mmu.h' line='28' column='1' id='type-id-2413'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='id' type-id='type-id-113' visibility='default' filepath='arch/arm64/include/asm/mmu.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='vdso' type-id='type-id-15' visibility='default' filepath='arch/arm64/include/asm/mmu.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='arch/arm64/include/asm/mmu.h' line='31' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='core_state' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/mm_types.h' line='345' column='1' id='type-id-2414'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nr_threads' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dumper' type-id='type-id-2415' visibility='default' filepath='include/linux/mm_types.h' line='347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='startup' type-id='type-id-1606' visibility='default' filepath='include/linux/mm_types.h' line='348' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='core_thread' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/mm_types.h' line='340' column='1' id='type-id-2415'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='task' type-id='type-id-431' visibility='default' filepath='include/linux/mm_types.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='next' type-id='type-id-2416' visibility='default' filepath='include/linux/mm_types.h' line='342' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='uprobes_state' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/uprobes.h' line='114' column='1' id='type-id-1489'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='xol_area' type-id='type-id-2417' visibility='default' filepath='include/linux/uprobes.h' line='115' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__65' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='304' column='1' id='type-id-2418'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rb' type-id='type-id-422' visibility='default' filepath='include/linux/mm_types.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rb_subtree_last' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='306' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vm_userfaultfd_ctx' is-struct='yes' visibility='default' filepath='include/linux/mm_types.h' line='260' column='1' id='type-id-1479'/>
+      <typedef-decl name='vm_fault_t' type-id='type-id-17' filepath='include/linux/mm_types.h' line='25' column='1' id='type-id-2419'/>
+      <class-decl name='vm_fault' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/mm.h' line='354' column='1' id='type-id-2420'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='vma' type-id='type-id-1207' visibility='default' filepath='include/linux/mm.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/mm.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='gfp_mask' type-id='type-id-485' visibility='default' filepath='include/linux/mm.h' line='357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='pgoff' type-id='type-id-16' visibility='default' filepath='include/linux/mm.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='address' type-id='type-id-16' visibility='default' filepath='include/linux/mm.h' line='359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='pmd' type-id='type-id-2421' visibility='default' filepath='include/linux/mm.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='pud' type-id='type-id-2422' visibility='default' filepath='include/linux/mm.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='orig_pte' type-id='type-id-2423' visibility='default' filepath='include/linux/mm.h' line='365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='cow_page' type-id='type-id-512' visibility='default' filepath='include/linux/mm.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='memcg' type-id='type-id-1535' visibility='default' filepath='include/linux/mm.h' line='368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='page' type-id='type-id-512' visibility='default' filepath='include/linux/mm.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='pte' type-id='type-id-2424' visibility='default' filepath='include/linux/mm.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='ptl' type-id='type-id-486' visibility='default' filepath='include/linux/mm.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='prealloc_pte' type-id='type-id-2138' visibility='default' filepath='include/linux/mm.h' line='383' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pud_t' type-id='type-id-2425' filepath='include/asm-generic/pgtable-nop4d-hack.h' line='15' column='1' id='type-id-2426'/>
+      <class-decl name='__anonymous_struct__66' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-2426' visibility='default' filepath='include/asm-generic/pgtable-nop4d-hack.h' line='15' column='1' id='type-id-2425'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pgd' type-id='type-id-1491' visibility='default' filepath='include/asm-generic/pgtable-nop4d-hack.h' line='15' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pte_t' type-id='type-id-2427' filepath='arch/arm64/include/asm/pgtable-types.h' line='33' column='1' id='type-id-2423'/>
+      <class-decl name='__anonymous_struct__67' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-2423' visibility='default' filepath='arch/arm64/include/asm/pgtable-types.h' line='33' column='1' id='type-id-2427'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pte' type-id='type-id-103' visibility='default' filepath='arch/arm64/include/asm/pgtable-types.h' line='33' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='page_entry_size' filepath='include/linux/mm.h' line='393' column='1' id='type-id-2428'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='PE_SIZE_PTE' value='0'/>
+        <enumerator name='PE_SIZE_PMD' value='1'/>
+        <enumerator name='PE_SIZE_PUD' value='2'/>
+      </enum-decl>
+      <union-decl name='kernfs_node_id' size-in-bits='64' visibility='default' filepath='include/linux/kernfs.h' line='107' column='1' id='type-id-1425'>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-2429' visibility='default' filepath='include/linux/kernfs.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='id' type-id='type-id-40' visibility='default' filepath='include/linux/kernfs.h' line='118' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__68' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/kernfs.h' line='108' column='1' id='type-id-2429'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ino' type-id='type-id-7' visibility='default' filepath='include/linux/kernfs.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='generation' type-id='type-id-7' visibility='default' filepath='include/linux/kernfs.h' line='116' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='module_attribute' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/module.h' line='53' column='1' id='type-id-2430'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='attr' type-id='type-id-619' visibility='default' filepath='include/linux/module.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='show' type-id='type-id-2431' visibility='default' filepath='include/linux/module.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='store' type-id='type-id-2432' visibility='default' filepath='include/linux/module.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='setup' type-id='type-id-2433' visibility='default' filepath='include/linux/module.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='test' type-id='type-id-2434' visibility='default' filepath='include/linux/module.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='free' type-id='type-id-2435' visibility='default' filepath='include/linux/module.h' line='61' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kernel_symbol' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/export.h' line='71' column='1' id='type-id-2436'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='value' type-id='type-id-16' visibility='default' filepath='include/linux/export.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/export.h' line='73' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='cfi_check_fn' type-id='type-id-2437' filepath='include/linux/cfi.h' line='9' column='1' id='type-id-1375'/>
+      <typedef-decl name='uint64_t' type-id='type-id-40' filepath='include/linux/types.h' line='112' column='1' id='type-id-2438'/>
+      <class-decl name='kernel_param' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/moduleparam.h' line='71' column='1' id='type-id-2439'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/moduleparam.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mod' type-id='type-id-260' visibility='default' filepath='include/linux/moduleparam.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ops' type-id='type-id-2440' visibility='default' filepath='include/linux/moduleparam.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='perm' type-id='type-id-2441' visibility='default' filepath='include/linux/moduleparam.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='208'>
+          <var-decl name='level' type-id='type-id-209' visibility='default' filepath='include/linux/moduleparam.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='216'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/linux/moduleparam.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='' type-id='type-id-2442' visibility='default' filepath='include/linux/moduleparam.h' line='78' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kernel_param_ops' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/moduleparam.h' line='49' column='1' id='type-id-2443'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/moduleparam.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='set' type-id='type-id-2444' visibility='default' filepath='include/linux/moduleparam.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='get' type-id='type-id-2445' visibility='default' filepath='include/linux/moduleparam.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='free' type-id='type-id-517' visibility='default' filepath='include/linux/moduleparam.h' line='57' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='s8' type-id='type-id-1908' filepath='include/asm-generic/int-ll64.h' line='16' column='1' id='type-id-209'/>
+      <union-decl name='__anonymous_union__36' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/moduleparam.h' line='78' column='1' id='type-id-2442'>
+        <data-member access='private'>
+          <var-decl name='arg' type-id='type-id-15' visibility='default' filepath='include/linux/moduleparam.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='str' type-id='type-id-2446' visibility='default' filepath='include/linux/moduleparam.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='arr' type-id='type-id-2447' visibility='default' filepath='include/linux/moduleparam.h' line='81' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='kparam_string' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/moduleparam.h' line='88' column='1' id='type-id-2448'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='maxlen' type-id='type-id-5' visibility='default' filepath='include/linux/moduleparam.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='string' type-id='type-id-2' visibility='default' filepath='include/linux/moduleparam.h' line='90' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kparam_array' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/moduleparam.h' line='94' column='1' id='type-id-2449'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='max' type-id='type-id-5' visibility='default' filepath='include/linux/moduleparam.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='elemsize' type-id='type-id-5' visibility='default' filepath='include/linux/moduleparam.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='num' type-id='type-id-482' visibility='default' filepath='include/linux/moduleparam.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ops' type-id='type-id-2440' visibility='default' filepath='include/linux/moduleparam.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='elem' type-id='type-id-15' visibility='default' filepath='include/linux/moduleparam.h' line='100' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='exception_table_entry' size-in-bits='64' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/extable.h' line='18' column='1' id='type-id-2450'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='insn' type-id='type-id-17' visibility='default' filepath='arch/arm64/include/asm/extable.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='fixup' type-id='type-id-17' visibility='default' filepath='arch/arm64/include/asm/extable.h' line='20' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='module_layout' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/module.h' line='292' column='1' id='type-id-1379'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-15' visibility='default' filepath='include/linux/module.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='size' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='text_size' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ro_size' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='ro_after_init_size' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mtn' type-id='type-id-2451' visibility='default' filepath='include/linux/module.h' line='305' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mod_tree_node' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/module.h' line='287' column='1' id='type-id-2451'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mod' type-id='type-id-260' visibility='default' filepath='include/linux/module.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='node' type-id='type-id-1225' visibility='default' filepath='include/linux/module.h' line='289' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mod_arch_specific' size-in-bits='320' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/module.h' line='30' column='1' id='type-id-1380'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='core' type-id='type-id-2452' visibility='default' filepath='arch/arm64/include/asm/module.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='init' type-id='type-id-2452' visibility='default' filepath='arch/arm64/include/asm/module.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ftrace_trampoline' type-id='type-id-2453' visibility='default' filepath='arch/arm64/include/asm/module.h' line='35' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mod_plt_sec' size-in-bits='128' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/module.h' line='24' column='1' id='type-id-2452'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='plt' type-id='type-id-2454' visibility='default' filepath='arch/arm64/include/asm/module.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='plt_num_entries' type-id='type-id-17' visibility='default' filepath='arch/arm64/include/asm/module.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='plt_max_entries' type-id='type-id-17' visibility='default' filepath='arch/arm64/include/asm/module.h' line='27' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='elf64_shdr' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/uapi/linux/elf.h' line='316' column='1' id='type-id-2455'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sh_name' type-id='type-id-2456' visibility='default' filepath='include/uapi/linux/elf.h' line='317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='sh_type' type-id='type-id-2456' visibility='default' filepath='include/uapi/linux/elf.h' line='318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sh_flags' type-id='type-id-2457' visibility='default' filepath='include/uapi/linux/elf.h' line='319' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='sh_addr' type-id='type-id-2458' visibility='default' filepath='include/uapi/linux/elf.h' line='320' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sh_offset' type-id='type-id-2459' visibility='default' filepath='include/uapi/linux/elf.h' line='321' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='sh_size' type-id='type-id-2457' visibility='default' filepath='include/uapi/linux/elf.h' line='322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='sh_link' type-id='type-id-2456' visibility='default' filepath='include/uapi/linux/elf.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='sh_info' type-id='type-id-2456' visibility='default' filepath='include/uapi/linux/elf.h' line='324' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='sh_addralign' type-id='type-id-2457' visibility='default' filepath='include/uapi/linux/elf.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='sh_entsize' type-id='type-id-2457' visibility='default' filepath='include/uapi/linux/elf.h' line='326' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='Elf64_Word' type-id='type-id-511' filepath='include/uapi/linux/elf.h' line='21' column='1' id='type-id-2456'/>
+      <typedef-decl name='Elf64_Xword' type-id='type-id-100' filepath='include/uapi/linux/elf.h' line='22' column='1' id='type-id-2457'/>
+      <typedef-decl name='Elf64_Addr' type-id='type-id-100' filepath='include/uapi/linux/elf.h' line='16' column='1' id='type-id-2458'/>
+      <typedef-decl name='Elf64_Off' type-id='type-id-100' filepath='include/uapi/linux/elf.h' line='19' column='1' id='type-id-2459'/>
+      <class-decl name='plt_entry' size-in-bits='128' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/module.h' line='50' column='1' id='type-id-2460'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mov0' type-id='type-id-2461' visibility='default' filepath='arch/arm64/include/asm/module.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='mov1' type-id='type-id-2461' visibility='default' filepath='arch/arm64/include/asm/module.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mov2' type-id='type-id-2461' visibility='default' filepath='arch/arm64/include/asm/module.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='br' type-id='type-id-2461' visibility='default' filepath='arch/arm64/include/asm/module.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__le32' type-id='type-id-511' filepath='include/uapi/linux/types.h' line='31' column='1' id='type-id-2461'/>
+      <class-decl name='bug_entry' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/asm-generic/bug.h' line='23' column='1' id='type-id-2462'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bug_addr_disp' type-id='type-id-17' visibility='default' filepath='include/asm-generic/bug.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='file_disp' type-id='type-id-17' visibility='default' filepath='include/asm-generic/bug.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='line' type-id='type-id-312' visibility='default' filepath='include/asm-generic/bug.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='flags' type-id='type-id-312' visibility='default' filepath='include/asm-generic/bug.h' line='37' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mod_kallsyms' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/module.h' line='316' column='1' id='type-id-1383'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='symtab' type-id='type-id-2463' visibility='default' filepath='include/linux/module.h' line='317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='num_symtab' type-id='type-id-5' visibility='default' filepath='include/linux/module.h' line='318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='strtab' type-id='type-id-2' visibility='default' filepath='include/linux/module.h' line='319' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='Elf64_Sym' type-id='type-id-2464' filepath='include/uapi/linux/elf.h' line='199' column='1' id='type-id-2465'/>
+      <class-decl name='elf64_sym' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/elf.h' line='192' column='1' id='type-id-2464'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='st_name' type-id='type-id-2456' visibility='default' filepath='include/uapi/linux/elf.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='st_info' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/elf.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='st_other' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/elf.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='st_shndx' type-id='type-id-2466' visibility='default' filepath='include/uapi/linux/elf.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='st_value' type-id='type-id-2458' visibility='default' filepath='include/uapi/linux/elf.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='st_size' type-id='type-id-2457' visibility='default' filepath='include/uapi/linux/elf.h' line='198' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='Elf64_Half' type-id='type-id-108' filepath='include/uapi/linux/elf.h' line='17' column='1' id='type-id-2466'/>
+      <typedef-decl name='tracepoint_ptr_t' type-id='type-id-2467' filepath='include/linux/tracepoint-defs.h' line='41' column='1' id='type-id-2468'/>
+      <class-decl name='tracepoint' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/tracepoint-defs.h' line='30' column='1' id='type-id-2469'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/tracepoint-defs.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='key' type-id='type-id-2470' visibility='default' filepath='include/linux/tracepoint-defs.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='regfunc' type-id='type-id-1378' visibility='default' filepath='include/linux/tracepoint-defs.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='unregfunc' type-id='type-id-1390' visibility='default' filepath='include/linux/tracepoint-defs.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='funcs' type-id='type-id-2471' visibility='default' filepath='include/linux/tracepoint-defs.h' line='35' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='static_key' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/jump_label.h' line='110' column='1' id='type-id-2470'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='enabled' type-id='type-id-26' visibility='default' filepath='include/linux/jump_label.h' line='111' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tracepoint_func' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/tracepoint-defs.h' line='24' column='1' id='type-id-2472'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='func' type-id='type-id-15' visibility='default' filepath='include/linux/tracepoint-defs.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/tracepoint-defs.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='prio' type-id='type-id-17' visibility='default' filepath='include/linux/tracepoint-defs.h' line='27' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='super_operations' size-in-bits='1856' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1880' column='1' id='type-id-2473'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='alloc_inode' type-id='type-id-2474' visibility='default' filepath='include/linux/fs.h' line='1881' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='destroy_inode' type-id='type-id-2475' visibility='default' filepath='include/linux/fs.h' line='1882' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dirty_inode' type-id='type-id-2476' visibility='default' filepath='include/linux/fs.h' line='1884' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='write_inode' type-id='type-id-2477' visibility='default' filepath='include/linux/fs.h' line='1885' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='drop_inode' type-id='type-id-2478' visibility='default' filepath='include/linux/fs.h' line='1886' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='evict_inode' type-id='type-id-2475' visibility='default' filepath='include/linux/fs.h' line='1887' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='put_super' type-id='type-id-1368' visibility='default' filepath='include/linux/fs.h' line='1888' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='sync_fs' type-id='type-id-2479' visibility='default' filepath='include/linux/fs.h' line='1889' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='freeze_super' type-id='type-id-2480' visibility='default' filepath='include/linux/fs.h' line='1890' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='freeze_fs' type-id='type-id-2480' visibility='default' filepath='include/linux/fs.h' line='1891' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='thaw_super' type-id='type-id-2480' visibility='default' filepath='include/linux/fs.h' line='1892' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='unfreeze_fs' type-id='type-id-2480' visibility='default' filepath='include/linux/fs.h' line='1893' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='statfs' type-id='type-id-2481' visibility='default' filepath='include/linux/fs.h' line='1894' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='remount_fs' type-id='type-id-2482' visibility='default' filepath='include/linux/fs.h' line='1895' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='remount_fs2' type-id='type-id-2483' visibility='default' filepath='include/linux/fs.h' line='1896' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='clone_mnt_data' type-id='type-id-2484' visibility='default' filepath='include/linux/fs.h' line='1897' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='copy_mnt_data' type-id='type-id-2485' visibility='default' filepath='include/linux/fs.h' line='1898' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='umount_begin' type-id='type-id-1368' visibility='default' filepath='include/linux/fs.h' line='1899' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='show_options' type-id='type-id-2486' visibility='default' filepath='include/linux/fs.h' line='1901' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='show_options2' type-id='type-id-2487' visibility='default' filepath='include/linux/fs.h' line='1902' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='show_devname' type-id='type-id-2486' visibility='default' filepath='include/linux/fs.h' line='1903' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='show_path' type-id='type-id-2486' visibility='default' filepath='include/linux/fs.h' line='1904' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='show_stats' type-id='type-id-2486' visibility='default' filepath='include/linux/fs.h' line='1905' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='quota_read' type-id='type-id-2488' visibility='default' filepath='include/linux/fs.h' line='1907' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='quota_write' type-id='type-id-2489' visibility='default' filepath='include/linux/fs.h' line='1908' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='get_dquots' type-id='type-id-2490' visibility='default' filepath='include/linux/fs.h' line='1909' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='bdev_try_to_free_page' type-id='type-id-2491' visibility='default' filepath='include/linux/fs.h' line='1911' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='nr_cached_objects' type-id='type-id-2492' visibility='default' filepath='include/linux/fs.h' line='1912' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='free_cached_objects' type-id='type-id-2492' visibility='default' filepath='include/linux/fs.h' line='1914' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dquot' size-in-bits='1664' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='294' column='1' id='type-id-2493'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dq_hash' type-id='type-id-520' visibility='default' filepath='include/linux/quota.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dq_inuse' type-id='type-id-20' visibility='default' filepath='include/linux/quota.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dq_free' type-id='type-id-20' visibility='default' filepath='include/linux/quota.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dq_dirty' type-id='type-id-20' visibility='default' filepath='include/linux/quota.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dq_lock' type-id='type-id-245' visibility='default' filepath='include/linux/quota.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='dq_dqb_lock' type-id='type-id-247' visibility='default' filepath='include/linux/quota.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='dq_count' type-id='type-id-26' visibility='default' filepath='include/linux/quota.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='dq_sb' type-id='type-id-28' visibility='default' filepath='include/linux/quota.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='dq_id' type-id='type-id-2494' visibility='default' filepath='include/linux/quota.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='dq_off' type-id='type-id-763' visibility='default' filepath='include/linux/quota.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='dq_flags' type-id='type-id-16' visibility='default' filepath='include/linux/quota.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='dq_dqb' type-id='type-id-2495' visibility='default' filepath='include/linux/quota.h' line='306' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='kqid' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='68' column='1' id='type-id-2494'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-2496' visibility='default' filepath='include/linux/quota.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='type' type-id='type-id-2497' visibility='default' filepath='include/linux/quota.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__37' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/linux/quota.h' line='69' column='1' id='type-id-2496'>
+        <data-member access='private'>
+          <var-decl name='uid' type-id='type-id-42' visibility='default' filepath='include/linux/quota.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='gid' type-id='type-id-330' visibility='default' filepath='include/linux/quota.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='projid' type-id='type-id-2498' visibility='default' filepath='include/linux/quota.h' line='72' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='kprojid_t' type-id='type-id-2499' filepath='include/linux/projid.h' line='24' column='1' id='type-id-2498'/>
+      <class-decl name='__anonymous_struct__69' size-in-bits='32' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-2498' visibility='default' filepath='include/linux/projid.h' line='22' column='1' id='type-id-2499'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='val' type-id='type-id-2500' visibility='default' filepath='include/linux/projid.h' line='23' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='projid_t' type-id='type-id-1310' filepath='include/linux/projid.h' line='20' column='1' id='type-id-2500'/>
+      <enum-decl name='quota_type' filepath='include/linux/quota.h' line='54' column='1' id='type-id-2497'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='USRQUOTA' value='0'/>
+        <enumerator name='GRPQUOTA' value='1'/>
+        <enumerator name='PRJQUOTA' value='2'/>
+      </enum-decl>
+      <class-decl name='mem_dqblk' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='205' column='1' id='type-id-2495'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dqb_bhardlimit' type-id='type-id-2501' visibility='default' filepath='include/linux/quota.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dqb_bsoftlimit' type-id='type-id-2501' visibility='default' filepath='include/linux/quota.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dqb_curspace' type-id='type-id-2501' visibility='default' filepath='include/linux/quota.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dqb_rsvspace' type-id='type-id-2501' visibility='default' filepath='include/linux/quota.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dqb_ihardlimit' type-id='type-id-2501' visibility='default' filepath='include/linux/quota.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dqb_isoftlimit' type-id='type-id-2501' visibility='default' filepath='include/linux/quota.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dqb_curinodes' type-id='type-id-2501' visibility='default' filepath='include/linux/quota.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='dqb_btime' type-id='type-id-1339' visibility='default' filepath='include/linux/quota.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dqb_itime' type-id='type-id-1339' visibility='default' filepath='include/linux/quota.h' line='214' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='qsize_t' type-id='type-id-1146' filepath='include/linux/quota.h' line='66' column='1' id='type-id-2501'/>
+      <class-decl name='shrink_control' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/shrinker.h' line='12' column='1' id='type-id-2502'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='gfp_mask' type-id='type-id-485' visibility='default' filepath='include/linux/shrinker.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='nid' type-id='type-id-17' visibility='default' filepath='include/linux/shrinker.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nr_to_scan' type-id='type-id-16' visibility='default' filepath='include/linux/shrinker.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='nr_scanned' type-id='type-id-16' visibility='default' filepath='include/linux/shrinker.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='memcg' type-id='type-id-1535' visibility='default' filepath='include/linux/shrinker.h' line='33' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dquot_operations' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='322' column='1' id='type-id-2503'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='write_dquot' type-id='type-id-2504' visibility='default' filepath='include/linux/quota.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='alloc_dquot' type-id='type-id-2505' visibility='default' filepath='include/linux/quota.h' line='324' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='destroy_dquot' type-id='type-id-2506' visibility='default' filepath='include/linux/quota.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='acquire_dquot' type-id='type-id-2504' visibility='default' filepath='include/linux/quota.h' line='326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='release_dquot' type-id='type-id-2504' visibility='default' filepath='include/linux/quota.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mark_dirty' type-id='type-id-2504' visibility='default' filepath='include/linux/quota.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='write_info' type-id='type-id-2479' visibility='default' filepath='include/linux/quota.h' line='329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_reserved_space' type-id='type-id-2507' visibility='default' filepath='include/linux/quota.h' line='332' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='get_projid' type-id='type-id-2508' visibility='default' filepath='include/linux/quota.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='get_inode_usage' type-id='type-id-2509' visibility='default' filepath='include/linux/quota.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='get_next_id' type-id='type-id-2510' visibility='default' filepath='include/linux/quota.h' line='337' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='quotactl_ops' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='428' column='1' id='type-id-2511'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='quota_on' type-id='type-id-2512' visibility='default' filepath='include/linux/quota.h' line='429' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='quota_off' type-id='type-id-2479' visibility='default' filepath='include/linux/quota.h' line='430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='quota_enable' type-id='type-id-2513' visibility='default' filepath='include/linux/quota.h' line='431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='quota_disable' type-id='type-id-2513' visibility='default' filepath='include/linux/quota.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='quota_sync' type-id='type-id-2479' visibility='default' filepath='include/linux/quota.h' line='433' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='set_info' type-id='type-id-2514' visibility='default' filepath='include/linux/quota.h' line='434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='get_dqblk' type-id='type-id-2515' visibility='default' filepath='include/linux/quota.h' line='435' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_nextdqblk' type-id='type-id-2516' visibility='default' filepath='include/linux/quota.h' line='436' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='set_dqblk' type-id='type-id-2515' visibility='default' filepath='include/linux/quota.h' line='438' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='get_state' type-id='type-id-2517' visibility='default' filepath='include/linux/quota.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='rm_xquota' type-id='type-id-2513' visibility='default' filepath='include/linux/quota.h' line='440' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='qc_info' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='415' column='1' id='type-id-2518'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='i_fieldmask' type-id='type-id-17' visibility='default' filepath='include/linux/quota.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='i_flags' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='i_spc_timelimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='i_ino_timelimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='420' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='i_rt_spc_timelimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='421' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='i_spc_warnlimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='i_ino_warnlimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='i_rt_spc_warnlimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='424' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='qc_dqblk' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='343' column='1' id='type-id-2519'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='d_fieldmask' type-id='type-id-17' visibility='default' filepath='include/linux/quota.h' line='344' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='d_spc_hardlimit' type-id='type-id-40' visibility='default' filepath='include/linux/quota.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='d_spc_softlimit' type-id='type-id-40' visibility='default' filepath='include/linux/quota.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='d_ino_hardlimit' type-id='type-id-40' visibility='default' filepath='include/linux/quota.h' line='347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='d_ino_softlimit' type-id='type-id-40' visibility='default' filepath='include/linux/quota.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='d_space' type-id='type-id-40' visibility='default' filepath='include/linux/quota.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='d_ino_count' type-id='type-id-40' visibility='default' filepath='include/linux/quota.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='d_ino_timer' type-id='type-id-1546' visibility='default' filepath='include/linux/quota.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='d_spc_timer' type-id='type-id-1546' visibility='default' filepath='include/linux/quota.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='d_ino_warns' type-id='type-id-17' visibility='default' filepath='include/linux/quota.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='d_spc_warns' type-id='type-id-17' visibility='default' filepath='include/linux/quota.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='d_rt_spc_hardlimit' type-id='type-id-40' visibility='default' filepath='include/linux/quota.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='d_rt_spc_softlimit' type-id='type-id-40' visibility='default' filepath='include/linux/quota.h' line='357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='d_rt_space' type-id='type-id-40' visibility='default' filepath='include/linux/quota.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='d_rt_spc_timer' type-id='type-id-1546' visibility='default' filepath='include/linux/quota.h' line='359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='d_rt_spc_warns' type-id='type-id-17' visibility='default' filepath='include/linux/quota.h' line='360' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='qc_state' size-in-bits='1408' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='409' column='1' id='type-id-2520'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='s_incoredqs' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='s_state' type-id='type-id-1162' visibility='default' filepath='include/linux/quota.h' line='411' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='qc_type_state' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='395' column='1' id='type-id-1161'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='spc_timelimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='397' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ino_timelimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='rt_spc_timelimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='400' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='spc_warnlimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='ino_warnlimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rt_spc_warnlimit' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ino' type-id='type-id-98' visibility='default' filepath='include/linux/quota.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='blocks' type-id='type-id-1302' visibility='default' filepath='include/linux/quota.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='nextents' type-id='type-id-1302' visibility='default' filepath='include/linux/quota.h' line='406' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='blkcnt_t' type-id='type-id-16' filepath='include/linux/types.h' line='135' column='1' id='type-id-1302'/>
+      <class-decl name='hlist_bl_head' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/list_bl.h' line='34' column='1' id='type-id-1356'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='first' type-id='type-id-1291' visibility='default' filepath='include/linux/list_bl.h' line='35' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='block_device' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='443' column='1' id='type-id-2521'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bd_dev' type-id='type-id-269' visibility='default' filepath='include/linux/fs.h' line='444' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='bd_openers' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='445' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bd_inode' type-id='type-id-1127' visibility='default' filepath='include/linux/fs.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bd_super' type-id='type-id-28' visibility='default' filepath='include/linux/fs.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='bd_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/fs.h' line='448' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='bd_claiming' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='449' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='bd_holder' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='450' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='bd_holders' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='451' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='bd_write_holder' type-id='type-id-33' visibility='default' filepath='include/linux/fs.h' line='452' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='bd_holder_disks' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='454' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='bd_contains' type-id='type-id-875' visibility='default' filepath='include/linux/fs.h' line='456' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='bd_block_size' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='457' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='bd_partno' type-id='type-id-214' visibility='default' filepath='include/linux/fs.h' line='458' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='bd_part' type-id='type-id-2522' visibility='default' filepath='include/linux/fs.h' line='459' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='bd_part_count' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='461' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='bd_invalidated' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='bd_disk' type-id='type-id-2523' visibility='default' filepath='include/linux/fs.h' line='463' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='bd_queue' type-id='type-id-1536' visibility='default' filepath='include/linux/fs.h' line='464' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='bd_bdi' type-id='type-id-1357' visibility='default' filepath='include/linux/fs.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='bd_list' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='466' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='bd_private' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='473' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='bd_fsfreeze_count' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='bd_fsfreeze_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/fs.h' line='478' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='quota_info' size-in-bits='2496' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='518' column='1' id='type-id-1359'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='519' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dqio_sem' type-id='type-id-246' visibility='default' filepath='include/linux/quota.h' line='520' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='files' type-id='type-id-1128' visibility='default' filepath='include/linux/quota.h' line='521' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='info' type-id='type-id-1148' visibility='default' filepath='include/linux/quota.h' line='522' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='ops' type-id='type-id-1118' visibility='default' filepath='include/linux/quota.h' line='523' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mem_dqinfo' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='222' column='1' id='type-id-1147'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dqi_format' type-id='type-id-2524' visibility='default' filepath='include/linux/quota.h' line='223' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dqi_fmt_id' type-id='type-id-17' visibility='default' filepath='include/linux/quota.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dqi_dirty_list' type-id='type-id-20' visibility='default' filepath='include/linux/quota.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dqi_flags' type-id='type-id-16' visibility='default' filepath='include/linux/quota.h' line='227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dqi_bgrace' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='dqi_igrace' type-id='type-id-5' visibility='default' filepath='include/linux/quota.h' line='229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dqi_max_spc_limit' type-id='type-id-2501' visibility='default' filepath='include/linux/quota.h' line='230' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='dqi_max_ino_limit' type-id='type-id-2501' visibility='default' filepath='include/linux/quota.h' line='231' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dqi_priv' type-id='type-id-15' visibility='default' filepath='include/linux/quota.h' line='232' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='quota_format_type' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='443' column='1' id='type-id-2525'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='qf_fmt_id' type-id='type-id-17' visibility='default' filepath='include/linux/quota.h' line='444' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='qf_ops' type-id='type-id-1117' visibility='default' filepath='include/linux/quota.h' line='445' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='qf_owner' type-id='type-id-260' visibility='default' filepath='include/linux/quota.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='qf_next' type-id='type-id-2524' visibility='default' filepath='include/linux/quota.h' line='447' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='quota_format_ops' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/quota.h' line='310' column='1' id='type-id-2526'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='check_quota_file' type-id='type-id-2479' visibility='default' filepath='include/linux/quota.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='read_file_info' type-id='type-id-2479' visibility='default' filepath='include/linux/quota.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='write_file_info' type-id='type-id-2479' visibility='default' filepath='include/linux/quota.h' line='313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='free_file_info' type-id='type-id-2479' visibility='default' filepath='include/linux/quota.h' line='314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='read_dqblk' type-id='type-id-2504' visibility='default' filepath='include/linux/quota.h' line='315' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='commit_dqblk' type-id='type-id-2504' visibility='default' filepath='include/linux/quota.h' line='316' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='release_dqblk' type-id='type-id-2504' visibility='default' filepath='include/linux/quota.h' line='317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_next_id' type-id='type-id-2510' visibility='default' filepath='include/linux/quota.h' line='318' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sb_writers' size-in-bits='3328' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1369' column='1' id='type-id-1360'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='frozen' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='1370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wait_unfrozen' type-id='type-id-225' visibility='default' filepath='include/linux/fs.h' line='1371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rw_sem' type-id='type-id-1155' visibility='default' filepath='include/linux/fs.h' line='1372' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='percpu_rw_semaphore' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/percpu-rwsem.h' line='12' column='1' id='type-id-1154'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rss' type-id='type-id-2527' visibility='default' filepath='include/linux/percpu-rwsem.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='read_count' type-id='type-id-482' visibility='default' filepath='include/linux/percpu-rwsem.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='rw_sem' type-id='type-id-246' visibility='default' filepath='include/linux/percpu-rwsem.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='writer' type-id='type-id-2528' visibility='default' filepath='include/linux/percpu-rwsem.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='readers_block' type-id='type-id-17' visibility='default' filepath='include/linux/percpu-rwsem.h' line='17' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rcu_sync' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/rcu_sync.h' line='32' column='1' id='type-id-2527'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='gp_state' type-id='type-id-17' visibility='default' filepath='include/linux/rcu_sync.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='gp_count' type-id='type-id-17' visibility='default' filepath='include/linux/rcu_sync.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='gp_wait' type-id='type-id-225' visibility='default' filepath='include/linux/rcu_sync.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='cb_state' type-id='type-id-17' visibility='default' filepath='include/linux/rcu_sync.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='cb_head' type-id='type-id-385' visibility='default' filepath='include/linux/rcu_sync.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='gp_type' type-id='type-id-2529' visibility='default' filepath='include/linux/rcu_sync.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='rcu_sync_type' filepath='include/linux/rcu_sync.h' line='29' column='1' id='type-id-2529'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='RCU_SYNC' value='0'/>
+        <enumerator name='RCU_SCHED_SYNC' value='1'/>
+        <enumerator name='RCU_BH_SYNC' value='2'/>
+      </enum-decl>
+      <class-decl name='rcuwait' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/rcuwait.h' line='20' column='1' id='type-id-2528'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='task' type-id='type-id-431' visibility='default' filepath='include/linux/rcuwait.h' line='21' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='uuid_t' type-id='type-id-2530' filepath='include/linux/uuid.h' line='26' column='1' id='type-id-1361'/>
+      <class-decl name='__anonymous_struct__70' size-in-bits='128' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-1361' visibility='default' filepath='include/linux/uuid.h' line='24' column='1' id='type-id-2530'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='b' type-id='type-id-936' visibility='default' filepath='include/linux/uuid.h' line='25' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='fmode_t' type-id='type-id-5' filepath='include/linux/types.h' line='160' column='1' id='type-id-876'/>
+      <class-decl name='dentry_operations' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/dcache.h' line='134' column='1' id='type-id-2531'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='d_revalidate' type-id='type-id-2532' visibility='default' filepath='include/linux/dcache.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='d_weak_revalidate' type-id='type-id-2532' visibility='default' filepath='include/linux/dcache.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='d_hash' type-id='type-id-2533' visibility='default' filepath='include/linux/dcache.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='d_compare' type-id='type-id-2534' visibility='default' filepath='include/linux/dcache.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='d_delete' type-id='type-id-2535' visibility='default' filepath='include/linux/dcache.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='d_init' type-id='type-id-2536' visibility='default' filepath='include/linux/dcache.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='d_release' type-id='type-id-2537' visibility='default' filepath='include/linux/dcache.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='d_prune' type-id='type-id-2537' visibility='default' filepath='include/linux/dcache.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='d_iput' type-id='type-id-2538' visibility='default' filepath='include/linux/dcache.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='d_dname' type-id='type-id-2539' visibility='default' filepath='include/linux/dcache.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='d_automount' type-id='type-id-2540' visibility='default' filepath='include/linux/dcache.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='d_manage' type-id='type-id-2541' visibility='default' filepath='include/linux/dcache.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='d_real' type-id='type-id-2542' visibility='default' filepath='include/linux/dcache.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='d_canonical_path' type-id='type-id-2543' visibility='default' filepath='include/linux/dcache.h' line='149' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='shrinker' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/shrinker.h' line='60' column='1' id='type-id-1362'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count_objects' type-id='type-id-2544' visibility='default' filepath='include/linux/shrinker.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='scan_objects' type-id='type-id-2544' visibility='default' filepath='include/linux/shrinker.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='batch' type-id='type-id-192' visibility='default' filepath='include/linux/shrinker.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='seeks' type-id='type-id-17' visibility='default' filepath='include/linux/shrinker.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/shrinker.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/shrinker.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/shrinker.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='nr_deferred' type-id='type-id-2545' visibility='default' filepath='include/linux/shrinker.h' line='77' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='list_lru' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/list_lru.h' line='52' column='1' id='type-id-1363'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-2546' visibility='default' filepath='include/linux/list_lru.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/list_lru.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='shrinker_id' type-id='type-id-17' visibility='default' filepath='include/linux/list_lru.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='memcg_aware' type-id='type-id-33' visibility='default' filepath='include/linux/list_lru.h' line='57' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='list_lru_node' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/list_lru.h' line='40' column='1' id='type-id-2547'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/list_lru.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='lru' type-id='type-id-2548' visibility='default' filepath='include/linux/list_lru.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='memcg_lrus' type-id='type-id-2549' visibility='default' filepath='include/linux/list_lru.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='nr_items' type-id='type-id-192' visibility='default' filepath='include/linux/list_lru.h' line='49' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='list_lru_one' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/list_lru.h' line='28' column='1' id='type-id-2548'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/list_lru.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='nr_items' type-id='type-id-192' visibility='default' filepath='include/linux/list_lru.h' line='31' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='list_lru_memcg' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/list_lru.h' line='34' column='1' id='type-id-2550'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/list_lru.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lru' type-id='type-id-1143' visibility='default' filepath='include/linux/list_lru.h' line='37' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='file_operations' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1760' column='1' id='type-id-2551'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/fs.h' line='1761' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='llseek' type-id='type-id-2552' visibility='default' filepath='include/linux/fs.h' line='1762' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='read' type-id='type-id-2553' visibility='default' filepath='include/linux/fs.h' line='1763' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='write' type-id='type-id-2554' visibility='default' filepath='include/linux/fs.h' line='1764' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='read_iter' type-id='type-id-2101' visibility='default' filepath='include/linux/fs.h' line='1765' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='write_iter' type-id='type-id-2101' visibility='default' filepath='include/linux/fs.h' line='1766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='iterate' type-id='type-id-2555' visibility='default' filepath='include/linux/fs.h' line='1767' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='iterate_shared' type-id='type-id-2555' visibility='default' filepath='include/linux/fs.h' line='1768' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='poll' type-id='type-id-2556' visibility='default' filepath='include/linux/fs.h' line='1769' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='unlocked_ioctl' type-id='type-id-2557' visibility='default' filepath='include/linux/fs.h' line='1770' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='compat_ioctl' type-id='type-id-2557' visibility='default' filepath='include/linux/fs.h' line='1771' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='mmap' type-id='type-id-2558' visibility='default' filepath='include/linux/fs.h' line='1772' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mmap_supported_flags' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='1773' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='open' type-id='type-id-2559' visibility='default' filepath='include/linux/fs.h' line='1774' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='flush' type-id='type-id-2560' visibility='default' filepath='include/linux/fs.h' line='1775' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='release' type-id='type-id-2559' visibility='default' filepath='include/linux/fs.h' line='1776' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='fsync' type-id='type-id-2561' visibility='default' filepath='include/linux/fs.h' line='1777' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='fasync' type-id='type-id-2562' visibility='default' filepath='include/linux/fs.h' line='1778' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='lock' type-id='type-id-2563' visibility='default' filepath='include/linux/fs.h' line='1779' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='sendpage' type-id='type-id-2564' visibility='default' filepath='include/linux/fs.h' line='1780' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='get_unmapped_area' type-id='type-id-1482' visibility='default' filepath='include/linux/fs.h' line='1781' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='check_flags' type-id='type-id-2565' visibility='default' filepath='include/linux/fs.h' line='1782' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='flock' type-id='type-id-2563' visibility='default' filepath='include/linux/fs.h' line='1783' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='splice_write' type-id='type-id-2566' visibility='default' filepath='include/linux/fs.h' line='1784' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='splice_read' type-id='type-id-2567' visibility='default' filepath='include/linux/fs.h' line='1785' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='setlease' type-id='type-id-2568' visibility='default' filepath='include/linux/fs.h' line='1786' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='fallocate' type-id='type-id-2569' visibility='default' filepath='include/linux/fs.h' line='1787' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='show_fdinfo' type-id='type-id-2570' visibility='default' filepath='include/linux/fs.h' line='1789' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='copy_file_range' type-id='type-id-2571' visibility='default' filepath='include/linux/fs.h' line='1793' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='clone_file_range' type-id='type-id-2572' visibility='default' filepath='include/linux/fs.h' line='1795' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='dedupe_file_range' type-id='type-id-2572' visibility='default' filepath='include/linux/fs.h' line='1797' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='fadvise' type-id='type-id-2561' visibility='default' filepath='include/linux/fs.h' line='1799' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dir_context' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1725' column='1' id='type-id-2573'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='actor' type-id='type-id-2574' visibility='default' filepath='include/linux/fs.h' line='1726' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pos' type-id='type-id-763' visibility='default' filepath='include/linux/fs.h' line='1727' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='filldir_t' type-id='type-id-2575' filepath='include/linux/fs.h' line='1722' column='1' id='type-id-2574'/>
+      <typedef-decl name='fl_owner_t' type-id='type-id-15' filepath='include/linux/fs.h' line='986' column='1' id='type-id-2576'/>
+      <class-decl name='file_lock' size-in-bits='1600' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1042' column='1' id='type-id-2577'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fl_next' type-id='type-id-2578' visibility='default' filepath='include/linux/fs.h' line='1043' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fl_list' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='1044' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='fl_link' type-id='type-id-520' visibility='default' filepath='include/linux/fs.h' line='1045' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='fl_block' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='1046' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='fl_owner' type-id='type-id-2576' visibility='default' filepath='include/linux/fs.h' line='1047' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='fl_flags' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='1048' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='fl_type' type-id='type-id-216' visibility='default' filepath='include/linux/fs.h' line='1049' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='fl_pid' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='1050' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='fl_link_cpu' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='1051' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='fl_wait' type-id='type-id-225' visibility='default' filepath='include/linux/fs.h' line='1052' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='fl_file' type-id='type-id-83' visibility='default' filepath='include/linux/fs.h' line='1053' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='fl_start' type-id='type-id-763' visibility='default' filepath='include/linux/fs.h' line='1054' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='fl_end' type-id='type-id-763' visibility='default' filepath='include/linux/fs.h' line='1055' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='fl_fasync' type-id='type-id-254' visibility='default' filepath='include/linux/fs.h' line='1057' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='fl_break_time' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='1059' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='fl_downgrade_time' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='1060' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='fl_ops' type-id='type-id-2579' visibility='default' filepath='include/linux/fs.h' line='1062' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='fl_lmops' type-id='type-id-2580' visibility='default' filepath='include/linux/fs.h' line='1063' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='fl_u' type-id='type-id-2581' visibility='default' filepath='include/linux/fs.h' line='1071' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='file_lock_operations' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='990' column='1' id='type-id-2582'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fl_copy_lock' type-id='type-id-2583' visibility='default' filepath='include/linux/fs.h' line='991' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fl_release_private' type-id='type-id-2584' visibility='default' filepath='include/linux/fs.h' line='992' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='lock_manager_operations' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='995' column='1' id='type-id-2585'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lm_compare_owner' type-id='type-id-2586' visibility='default' filepath='include/linux/fs.h' line='996' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='lm_owner_key' type-id='type-id-2587' visibility='default' filepath='include/linux/fs.h' line='997' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lm_get_owner' type-id='type-id-2588' visibility='default' filepath='include/linux/fs.h' line='998' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='lm_put_owner' type-id='type-id-2589' visibility='default' filepath='include/linux/fs.h' line='999' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='lm_notify' type-id='type-id-2584' visibility='default' filepath='include/linux/fs.h' line='1000' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='lm_grant' type-id='type-id-2590' visibility='default' filepath='include/linux/fs.h' line='1001' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='lm_break' type-id='type-id-2591' visibility='default' filepath='include/linux/fs.h' line='1002' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='lm_change' type-id='type-id-2592' visibility='default' filepath='include/linux/fs.h' line='1003' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='lm_setup' type-id='type-id-2593' visibility='default' filepath='include/linux/fs.h' line='1004' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nfs_lock_info' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/nfs_fs_i.h' line='10' column='1' id='type-id-2594'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='state' type-id='type-id-7' visibility='default' filepath='include/linux/nfs_fs_i.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='owner' type-id='type-id-2595' visibility='default' filepath='include/linux/nfs_fs_i.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/nfs_fs_i.h' line='13' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nfs4_lock_info' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/nfs_fs_i.h' line='17' column='1' id='type-id-2596'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='owner' type-id='type-id-2597' visibility='default' filepath='include/linux/nfs_fs_i.h' line='18' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__71' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/fs.h' line='1067' column='1' id='type-id-2598'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='link' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='1068' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='state' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='1069' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='file_lock_context' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1074' column='1' id='type-id-2599'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flc_lock' type-id='type-id-247' visibility='default' filepath='include/linux/fs.h' line='1075' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flc_flock' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='1076' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='flc_posix' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='1077' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='flc_lease' type-id='type-id-20' visibility='default' filepath='include/linux/fs.h' line='1078' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='lockref' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/lockref.h' line='25' column='1' id='type-id-1286'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-2600' visibility='default' filepath='include/linux/lockref.h' line='26' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__40' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/lockref.h' line='26' column='1' id='type-id-2600'>
+        <data-member access='private'>
+          <var-decl name='lock_count' type-id='type-id-100' visibility='default' filepath='include/linux/lockref.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-2601' visibility='default' filepath='include/linux/lockref.h' line='30' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__72' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/lockref.h' line='30' column='1' id='type-id-2601'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/lockref.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='count' type-id='type-id-17' visibility='default' filepath='include/linux/lockref.h' line='32' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='rw_hint' filepath='include/linux/fs.h' line='292' column='1' id='type-id-1275'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='WRITE_LIFE_NOT_SET' value='0'/>
+        <enumerator name='WRITE_LIFE_NONE' value='1'/>
+        <enumerator name='WRITE_LIFE_SHORT' value='2'/>
+        <enumerator name='WRITE_LIFE_MEDIUM' value='3'/>
+        <enumerator name='WRITE_LIFE_LONG' value='4'/>
+        <enumerator name='WRITE_LIFE_EXTREME' value='5'/>
+      </enum-decl>
+      <class-decl name='fown_struct' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='866' column='1' id='type-id-1276'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-885' visibility='default' filepath='include/linux/fs.h' line='867' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pid' type-id='type-id-251' visibility='default' filepath='include/linux/fs.h' line='868' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='pid_type' type-id='type-id-2602' visibility='default' filepath='include/linux/fs.h' line='869' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='uid' type-id='type-id-42' visibility='default' filepath='include/linux/fs.h' line='870' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='euid' type-id='type-id-42' visibility='default' filepath='include/linux/fs.h' line='870' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='signum' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='871' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='pid_type' filepath='include/linux/pid.h' line='8' column='1' id='type-id-2602'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='PIDTYPE_PID' value='0'/>
+        <enumerator name='PIDTYPE_TGID' value='1'/>
+        <enumerator name='PIDTYPE_PGID' value='2'/>
+        <enumerator name='PIDTYPE_SID' value='3'/>
+        <enumerator name='PIDTYPE_MAX' value='4'/>
+      </enum-decl>
+      <class-decl name='file_ra_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='877' column='1' id='type-id-1278'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start' type-id='type-id-16' visibility='default' filepath='include/linux/fs.h' line='878' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='size' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='879' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='async_size' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='880' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ra_pages' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='883' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='mmap_miss' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='884' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='prev_pos' type-id='type-id-763' visibility='default' filepath='include/linux/fs.h' line='885' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_insn' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='64' column='1' id='type-id-953'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='code' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/bpf.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='dst_reg' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/bpf.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='src_reg' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/bpf.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='off' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/bpf.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='imm' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/bpf.h' line='69' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='bpf_map_type' filepath='include/uapi/linux/bpf.h' line='108' column='1' id='type-id-1256'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='BPF_MAP_TYPE_UNSPEC' value='0'/>
+        <enumerator name='BPF_MAP_TYPE_HASH' value='1'/>
+        <enumerator name='BPF_MAP_TYPE_ARRAY' value='2'/>
+        <enumerator name='BPF_MAP_TYPE_PROG_ARRAY' value='3'/>
+        <enumerator name='BPF_MAP_TYPE_PERF_EVENT_ARRAY' value='4'/>
+        <enumerator name='BPF_MAP_TYPE_PERCPU_HASH' value='5'/>
+        <enumerator name='BPF_MAP_TYPE_PERCPU_ARRAY' value='6'/>
+        <enumerator name='BPF_MAP_TYPE_STACK_TRACE' value='7'/>
+        <enumerator name='BPF_MAP_TYPE_CGROUP_ARRAY' value='8'/>
+        <enumerator name='BPF_MAP_TYPE_LRU_HASH' value='9'/>
+        <enumerator name='BPF_MAP_TYPE_LRU_PERCPU_HASH' value='10'/>
+        <enumerator name='BPF_MAP_TYPE_LPM_TRIE' value='11'/>
+        <enumerator name='BPF_MAP_TYPE_ARRAY_OF_MAPS' value='12'/>
+        <enumerator name='BPF_MAP_TYPE_HASH_OF_MAPS' value='13'/>
+        <enumerator name='BPF_MAP_TYPE_DEVMAP' value='14'/>
+        <enumerator name='BPF_MAP_TYPE_SOCKMAP' value='15'/>
+        <enumerator name='BPF_MAP_TYPE_CPUMAP' value='16'/>
+        <enumerator name='BPF_MAP_TYPE_XSKMAP' value='17'/>
+        <enumerator name='BPF_MAP_TYPE_SOCKHASH' value='18'/>
+        <enumerator name='BPF_MAP_TYPE_CGROUP_STORAGE' value='19'/>
+        <enumerator name='BPF_MAP_TYPE_REUSEPORT_SOCKARRAY' value='20'/>
+      </enum-decl>
+      <class-decl name='bpf_prog_offload' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='264' column='1' id='type-id-2603'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prog' type-id='type-id-1228' visibility='default' filepath='include/linux/bpf.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='netdev' type-id='type-id-1648' visibility='default' filepath='include/linux/bpf.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dev_priv' type-id='type-id-15' visibility='default' filepath='include/linux/bpf.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='offloads' type-id='type-id-20' visibility='default' filepath='include/linux/bpf.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dev_state' type-id='type-id-33' visibility='default' filepath='include/linux/bpf.h' line='269' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dev_ops' type-id='type-id-1825' visibility='default' filepath='include/linux/bpf.h' line='270' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='jited_image' type-id='type-id-15' visibility='default' filepath='include/linux/bpf.h' line='271' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='jited_len' type-id='type-id-7' visibility='default' filepath='include/linux/bpf.h' line='272' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sock_fprog_kern' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='464' column='1' id='type-id-2604'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='len' type-id='type-id-688' visibility='default' filepath='include/linux/filter.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='filter' type-id='type-id-2605' visibility='default' filepath='include/linux/filter.h' line='466' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sock_filter' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/filter.h' line='24' column='1' id='type-id-1169'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='code' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/filter.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='jt' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/filter.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='jf' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/filter.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='k' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/filter.h' line='28' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-2465' size-in-bits='64' id='type-id-2463'/>
+      <pointer-type-def type-id='type-id-1961' size-in-bits='64' id='type-id-1685'/>
+      <pointer-type-def type-id='type-id-2606' size-in-bits='64' id='type-id-1982'/>
+      <pointer-type-def type-id='type-id-1685' size-in-bits='64' id='type-id-2607'/>
+      <pointer-type-def type-id='type-id-1969' size-in-bits='64' id='type-id-1970'/>
+      <pointer-type-def type-id='type-id-2370' size-in-bits='64' id='type-id-2368'/>
+      <pointer-type-def type-id='type-id-2367' size-in-bits='64' id='type-id-2365'/>
+      <pointer-type-def type-id='type-id-1305' size-in-bits='64' id='type-id-1279'/>
+      <pointer-type-def type-id='type-id-975' size-in-bits='64' id='type-id-1478'/>
+      <pointer-type-def type-id='type-id-976' size-in-bits='64' id='type-id-1632'/>
+      <pointer-type-def type-id='type-id-115' size-in-bits='64' id='type-id-2545'/>
+      <pointer-type-def type-id='type-id-619' size-in-bits='64' id='type-id-2608'/>
+      <pointer-type-def type-id='type-id-2608' size-in-bits='64' id='type-id-1412'/>
+      <pointer-type-def type-id='type-id-977' size-in-bits='64' id='type-id-1518'/>
+      <pointer-type-def type-id='type-id-978' size-in-bits='64' id='type-id-2355'/>
+      <pointer-type-def type-id='type-id-979' size-in-bits='64' id='type-id-1357'/>
+      <pointer-type-def type-id='type-id-980' size-in-bits='64' id='type-id-1303'/>
+      <pointer-type-def type-id='type-id-2037' size-in-bits='64' id='type-id-2609'/>
+      <pointer-type-def type-id='type-id-2609' size-in-bits='64' id='type-id-2036'/>
+      <pointer-type-def type-id='type-id-981' size-in-bits='64' id='type-id-1523'/>
+      <pointer-type-def type-id='type-id-983' size-in-bits='64' id='type-id-1524'/>
+      <pointer-type-def type-id='type-id-2521' size-in-bits='64' id='type-id-875'/>
+      <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-2610'/>
+      <pointer-type-def type-id='type-id-1239' size-in-bits='64' id='type-id-2611'/>
+      <pointer-type-def type-id='type-id-2330' size-in-bits='64' id='type-id-2329'/>
+      <pointer-type-def type-id='type-id-984' size-in-bits='64' id='type-id-2332'/>
+      <pointer-type-def type-id='type-id-953' size-in-bits='64' id='type-id-2612'/>
+      <pointer-type-def type-id='type-id-1254' size-in-bits='64' id='type-id-1230'/>
+      <pointer-type-def type-id='type-id-2613' size-in-bits='64' id='type-id-1260'/>
+      <pointer-type-def type-id='type-id-1230' size-in-bits='64' id='type-id-1227'/>
+      <pointer-type-def type-id='type-id-1828' size-in-bits='64' id='type-id-1819'/>
+      <pointer-type-def type-id='type-id-1216' size-in-bits='64' id='type-id-1228'/>
+      <pointer-type-def type-id='type-id-1228' size-in-bits='64' id='type-id-1224'/>
+      <pointer-type-def type-id='type-id-2328' size-in-bits='64' id='type-id-747'/>
+      <pointer-type-def type-id='type-id-1223' size-in-bits='64' id='type-id-1219'/>
+      <pointer-type-def type-id='type-id-2603' size-in-bits='64' id='type-id-1231'/>
+      <pointer-type-def type-id='type-id-2334' size-in-bits='64' id='type-id-2331'/>
+      <pointer-type-def type-id='type-id-985' size-in-bits='64' id='type-id-2614'/>
+      <pointer-type-def type-id='type-id-986' size-in-bits='64' id='type-id-1257'/>
+      <pointer-type-def type-id='type-id-988' size-in-bits='64' id='type-id-2259'/>
+      <pointer-type-def type-id='type-id-2462' size-in-bits='64' id='type-id-1381'/>
+      <pointer-type-def type-id='type-id-2042' size-in-bits='64' id='type-id-2010'/>
+      <pointer-type-def type-id='type-id-385' size-in-bits='64' id='type-id-91'/>
+      <pointer-type-def type-id='type-id-989' size-in-bits='64' id='type-id-2304'/>
+      <pointer-type-def type-id='type-id-990' size-in-bits='64' id='type-id-1298'/>
+      <pointer-type-def type-id='type-id-991' size-in-bits='64' id='type-id-1544'/>
+      <pointer-type-def type-id='type-id-2346' size-in-bits='64' id='type-id-2345'/>
+      <pointer-type-def type-id='type-id-2311' size-in-bits='64' id='type-id-2309'/>
+      <pointer-type-def type-id='type-id-2307' size-in-bits='64' id='type-id-1644'/>
+      <pointer-type-def type-id='type-id-2317' size-in-bits='64' id='type-id-2312'/>
+      <pointer-type-def type-id='type-id-2318' size-in-bits='64' id='type-id-2313'/>
+      <pointer-type-def type-id='type-id-2335' size-in-bits='64' id='type-id-2310'/>
+      <pointer-type-def type-id='type-id-424' size-in-bits='64' id='type-id-365'/>
+      <pointer-type-def type-id='type-id-2615' size-in-bits='64' id='type-id-2336'/>
+      <pointer-type-def type-id='type-id-992' size-in-bits='64' id='type-id-2616'/>
+      <pointer-type-def type-id='type-id-2617' size-in-bits='64' id='type-id-2539'/>
+      <pointer-type-def type-id='type-id-2618' size-in-bits='64' id='type-id-2181'/>
+      <pointer-type-def type-id='type-id-2619' size-in-bits='64' id='type-id-2031'/>
+      <pointer-type-def type-id='type-id-1789' size-in-bits='64' id='type-id-1780'/>
+      <pointer-type-def type-id='type-id-2180' size-in-bits='64' id='type-id-2025'/>
+      <pointer-type-def type-id='type-id-993' size-in-bits='64' id='type-id-2020'/>
+      <pointer-type-def type-id='type-id-2395' size-in-bits='64' id='type-id-1531'/>
+      <pointer-type-def type-id='type-id-1572' size-in-bits='64' id='type-id-1569'/>
+      <pointer-type-def type-id='type-id-1606' size-in-bits='64' id='type-id-1392'/>
+      <qualified-type-def type-id='type-id-1979' const='yes' id='type-id-2620'/>
+      <pointer-type-def type-id='type-id-2620' size-in-bits='64' id='type-id-1971'/>
+      <qualified-type-def type-id='type-id-1969' const='yes' id='type-id-2621'/>
+      <pointer-type-def type-id='type-id-2621' size-in-bits='64' id='type-id-1964'/>
+      <qualified-type-def type-id='type-id-974' const='yes' id='type-id-2622'/>
+      <pointer-type-def type-id='type-id-2622' size-in-bits='64' id='type-id-2050'/>
+      <qualified-type-def type-id='type-id-2089' const='yes' id='type-id-2623'/>
+      <pointer-type-def type-id='type-id-2623' size-in-bits='64' id='type-id-2088'/>
+      <qualified-type-def type-id='type-id-2033' const='yes' id='type-id-2624'/>
+      <pointer-type-def type-id='type-id-2624' size-in-bits='64' id='type-id-892'/>
+      <pointer-type-def type-id='type-id-892' size-in-bits='64' id='type-id-665'/>
+      <qualified-type-def type-id='type-id-982' const='yes' id='type-id-2625'/>
+      <pointer-type-def type-id='type-id-2625' size-in-bits='64' id='type-id-2117'/>
+      <qualified-type-def type-id='type-id-1239' const='yes' id='type-id-2626'/>
+      <pointer-type-def type-id='type-id-2626' size-in-bits='64' id='type-id-2627'/>
+      <qualified-type-def type-id='type-id-953' const='yes' id='type-id-2628'/>
+      <pointer-type-def type-id='type-id-2628' size-in-bits='64' id='type-id-2629'/>
+      <qualified-type-def type-id='type-id-1254' const='yes' id='type-id-2630'/>
+      <pointer-type-def type-id='type-id-2630' size-in-bits='64' id='type-id-2631'/>
+      <qualified-type-def type-id='type-id-1830' const='yes' id='type-id-2632'/>
+      <pointer-type-def type-id='type-id-2632' size-in-bits='64' id='type-id-1829'/>
+      <qualified-type-def type-id='type-id-1258' const='yes' id='type-id-2633'/>
+      <pointer-type-def type-id='type-id-2633' size-in-bits='64' id='type-id-1255'/>
+      <qualified-type-def type-id='type-id-1216' const='yes' id='type-id-2634'/>
+      <pointer-type-def type-id='type-id-2634' size-in-bits='64' id='type-id-2635'/>
+      <qualified-type-def type-id='type-id-1826' const='yes' id='type-id-2636'/>
+      <pointer-type-def type-id='type-id-2636' size-in-bits='64' id='type-id-1825'/>
+      <qualified-type-def type-id='type-id-1237' const='yes' id='type-id-2637'/>
+      <pointer-type-def type-id='type-id-2637' size-in-bits='64' id='type-id-1226'/>
+      <qualified-type-def type-id='type-id-987' const='yes' id='type-id-2638'/>
+      <pointer-type-def type-id='type-id-2638' size-in-bits='64' id='type-id-2639'/>
+      <pointer-type-def type-id='type-id-2640' size-in-bits='64' id='type-id-1315'/>
+      <pointer-type-def type-id='type-id-2641' size-in-bits='64' id='type-id-2642'/>
+      <qualified-type-def type-id='type-id-2642' const='yes' id='type-id-1406'/>
+      <pointer-type-def type-id='type-id-2643' size-in-bits='64' id='type-id-1474'/>
+      <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-1387'/>
+      <qualified-type-def type-id='type-id-1613' const='yes' id='type-id-2644'/>
+      <pointer-type-def type-id='type-id-2644' size-in-bits='64' id='type-id-1277'/>
+      <qualified-type-def type-id='type-id-1283' const='yes' id='type-id-2645'/>
+      <pointer-type-def type-id='type-id-2645' size-in-bits='64' id='type-id-2646'/>
+      <qualified-type-def type-id='type-id-2531' const='yes' id='type-id-2647'/>
+      <pointer-type-def type-id='type-id-2647' size-in-bits='64' id='type-id-1287'/>
+      <qualified-type-def type-id='type-id-2040' const='yes' id='type-id-2648'/>
+      <pointer-type-def type-id='type-id-2648' size-in-bits='64' id='type-id-2032'/>
+      <qualified-type-def type-id='type-id-388' const='yes' id='type-id-2649'/>
+      <pointer-type-def type-id='type-id-2649' size-in-bits='64' id='type-id-2650'/>
+      <qualified-type-def type-id='type-id-2029' const='yes' id='type-id-2651'/>
+      <pointer-type-def type-id='type-id-2651' size-in-bits='64' id='type-id-2009'/>
+      <qualified-type-def type-id='type-id-2066' const='yes' id='type-id-2652'/>
+      <pointer-type-def type-id='type-id-2652' size-in-bits='64' id='type-id-2017'/>
+      <qualified-type-def type-id='type-id-2503' const='yes' id='type-id-2653'/>
+      <pointer-type-def type-id='type-id-2653' size-in-bits='64' id='type-id-1349'/>
+      <qualified-type-def type-id='type-id-1001' const='yes' id='type-id-2654'/>
+      <pointer-type-def type-id='type-id-2654' size-in-bits='64' id='type-id-2655'/>
+      <qualified-type-def type-id='type-id-1905' const='yes' id='type-id-2656'/>
+      <pointer-type-def type-id='type-id-2656' size-in-bits='64' id='type-id-2657'/>
+      <qualified-type-def type-id='type-id-1837' const='yes' id='type-id-2658'/>
+      <pointer-type-def type-id='type-id-2658' size-in-bits='64' id='type-id-1671'/>
+      <qualified-type-def type-id='type-id-1904' const='yes' id='type-id-2659'/>
+      <pointer-type-def type-id='type-id-2659' size-in-bits='64' id='type-id-2660'/>
+      <qualified-type-def type-id='type-id-1002' const='yes' id='type-id-2661'/>
+      <pointer-type-def type-id='type-id-2661' size-in-bits='64' id='type-id-1351'/>
+      <qualified-type-def type-id='type-id-1272' const='yes' id='type-id-2662'/>
+      <pointer-type-def type-id='type-id-2662' size-in-bits='64' id='type-id-1447'/>
+      <qualified-type-def type-id='type-id-2582' const='yes' id='type-id-2663'/>
+      <pointer-type-def type-id='type-id-2663' size-in-bits='64' id='type-id-2579'/>
+      <qualified-type-def type-id='type-id-2551' const='yes' id='type-id-2664'/>
+      <pointer-type-def type-id='type-id-2664' size-in-bits='64' id='type-id-268'/>
+      <qualified-type-def type-id='type-id-1011' const='yes' id='type-id-2665'/>
+      <pointer-type-def type-id='type-id-2665' size-in-bits='64' id='type-id-1353'/>
+      <qualified-type-def type-id='type-id-1014' const='yes' id='type-id-2666'/>
+      <pointer-type-def type-id='type-id-2666' size-in-bits='64' id='type-id-1355'/>
+      <qualified-type-def type-id='type-id-2161' const='yes' id='type-id-2667'/>
+      <pointer-type-def type-id='type-id-2667' size-in-bits='64' id='type-id-2179'/>
+      <qualified-type-def type-id='type-id-2163' const='yes' id='type-id-2668'/>
+      <pointer-type-def type-id='type-id-2668' size-in-bits='64' id='type-id-2162'/>
+      <qualified-type-def type-id='type-id-1910' const='yes' id='type-id-2669'/>
+      <pointer-type-def type-id='type-id-2669' size-in-bits='64' id='type-id-1673'/>
+      <qualified-type-def type-id='type-id-1295' const='yes' id='type-id-2670'/>
+      <pointer-type-def type-id='type-id-2670' size-in-bits='64' id='type-id-2671'/>
+      <qualified-type-def type-id='type-id-1313' const='yes' id='type-id-2672'/>
+      <pointer-type-def type-id='type-id-2672' size-in-bits='64' id='type-id-1300'/>
+      <qualified-type-def type-id='type-id-1024' const='yes' id='type-id-2673'/>
+      <pointer-type-def type-id='type-id-2673' size-in-bits='64' id='type-id-2045'/>
+      <qualified-type-def type-id='type-id-2118' const='yes' id='type-id-2674'/>
+      <pointer-type-def type-id='type-id-2674' size-in-bits='64' id='type-id-2115'/>
+      <qualified-type-def type-id='type-id-1030' const='yes' id='type-id-2675'/>
+      <pointer-type-def type-id='type-id-2675' size-in-bits='64' id='type-id-1668'/>
+      <qualified-type-def type-id='type-id-2439' const='yes' id='type-id-2676'/>
+      <pointer-type-def type-id='type-id-2676' size-in-bits='64' id='type-id-2677'/>
+      <qualified-type-def type-id='type-id-2443' const='yes' id='type-id-2678'/>
+      <pointer-type-def type-id='type-id-2678' size-in-bits='64' id='type-id-2440'/>
+      <qualified-type-def type-id='type-id-2436' const='yes' id='type-id-2679'/>
+      <pointer-type-def type-id='type-id-2679' size-in-bits='64' id='type-id-1373'/>
+      <qualified-type-def type-id='type-id-1457' const='yes' id='type-id-2680'/>
+      <pointer-type-def type-id='type-id-2680' size-in-bits='64' id='type-id-1455'/>
+      <qualified-type-def type-id='type-id-1281' const='yes' id='type-id-2681'/>
+      <pointer-type-def type-id='type-id-2681' size-in-bits='64' id='type-id-2682'/>
+      <qualified-type-def type-id='type-id-1034' const='yes' id='type-id-2683'/>
+      <pointer-type-def type-id='type-id-2683' size-in-bits='64' id='type-id-2684'/>
+      <qualified-type-def type-id='type-id-1419' const='yes' id='type-id-2685'/>
+      <pointer-type-def type-id='type-id-2685' size-in-bits='64' id='type-id-2183'/>
+      <pointer-type-def type-id='type-id-2686' size-in-bits='64' id='type-id-1413'/>
+      <qualified-type-def type-id='type-id-2449' const='yes' id='type-id-2687'/>
+      <pointer-type-def type-id='type-id-2687' size-in-bits='64' id='type-id-2447'/>
+      <qualified-type-def type-id='type-id-2448' const='yes' id='type-id-2688'/>
+      <pointer-type-def type-id='type-id-2688' size-in-bits='64' id='type-id-2446'/>
+      <qualified-type-def type-id='type-id-1404' const='yes' id='type-id-2689'/>
+      <pointer-type-def type-id='type-id-2689' size-in-bits='64' id='type-id-1397'/>
+      <qualified-type-def type-id='type-id-2119' const='yes' id='type-id-2690'/>
+      <pointer-type-def type-id='type-id-2690' size-in-bits='64' id='type-id-2116'/>
+      <qualified-type-def type-id='type-id-2585' const='yes' id='type-id-2691'/>
+      <pointer-type-def type-id='type-id-2691' size-in-bits='64' id='type-id-2580'/>
+      <qualified-type-def type-id='type-id-1047' const='yes' id='type-id-2692'/>
+      <pointer-type-def type-id='type-id-2692' size-in-bits='64' id='type-id-1672'/>
+      <qualified-type-def type-id='type-id-1049' const='yes' id='type-id-2693'/>
+      <pointer-type-def type-id='type-id-2693' size-in-bits='64' id='type-id-2694'/>
+      <qualified-type-def type-id='type-id-1663' const='yes' id='type-id-2695'/>
+      <pointer-type-def type-id='type-id-2695' size-in-bits='64' id='type-id-2696'/>
+      <qualified-type-def type-id='type-id-1698' const='yes' id='type-id-2697'/>
+      <pointer-type-def type-id='type-id-2697' size-in-bits='64' id='type-id-1670'/>
+      <qualified-type-def type-id='type-id-1055' const='yes' id='type-id-2698'/>
+      <pointer-type-def type-id='type-id-2698' size-in-bits='64' id='type-id-1115'/>
+      <qualified-type-def type-id='type-id-1056' const='yes' id='type-id-2699'/>
+      <pointer-type-def type-id='type-id-2699' size-in-bits='64' id='type-id-2284'/>
+      <qualified-type-def type-id='type-id-2201' const='yes' id='type-id-2700'/>
+      <pointer-type-def type-id='type-id-2700' size-in-bits='64' id='type-id-2187'/>
+      <qualified-type-def type-id='type-id-1803' const='yes' id='type-id-2701'/>
+      <pointer-type-def type-id='type-id-2701' size-in-bits='64' id='type-id-1806'/>
+      <qualified-type-def type-id='type-id-1812' const='yes' id='type-id-2702'/>
+      <pointer-type-def type-id='type-id-2702' size-in-bits='64' id='type-id-1809'/>
+      <qualified-type-def type-id='type-id-1059' const='yes' id='type-id-2703'/>
+      <pointer-type-def type-id='type-id-2703' size-in-bits='64' id='type-id-2049'/>
+      <qualified-type-def type-id='type-id-2084' const='yes' id='type-id-2704'/>
+      <pointer-type-def type-id='type-id-2704' size-in-bits='64' id='type-id-2705'/>
+      <qualified-type-def type-id='type-id-1274' const='yes' id='type-id-2706'/>
+      <pointer-type-def type-id='type-id-2706' size-in-bits='64' id='type-id-2707'/>
+      <qualified-type-def type-id='type-id-2130' const='yes' id='type-id-2708'/>
+      <pointer-type-def type-id='type-id-2708' size-in-bits='64' id='type-id-2129'/>
+      <qualified-type-def type-id='type-id-1070' const='yes' id='type-id-2709'/>
+      <pointer-type-def type-id='type-id-2709' size-in-bits='64' id='type-id-1587'/>
+      <qualified-type-def type-id='type-id-1285' const='yes' id='type-id-2710'/>
+      <pointer-type-def type-id='type-id-2710' size-in-bits='64' id='type-id-2711'/>
+      <qualified-type-def type-id='type-id-2526' const='yes' id='type-id-2712'/>
+      <pointer-type-def type-id='type-id-2712' size-in-bits='64' id='type-id-1117'/>
+      <qualified-type-def type-id='type-id-2511' const='yes' id='type-id-2713'/>
+      <pointer-type-def type-id='type-id-2713' size-in-bits='64' id='type-id-1350'/>
+      <qualified-type-def type-id='type-id-2186' const='yes' id='type-id-2714'/>
+      <pointer-type-def type-id='type-id-2714' size-in-bits='64' id='type-id-1692'/>
+      <qualified-type-def type-id='type-id-738' const='yes' id='type-id-2715'/>
+      <pointer-type-def type-id='type-id-2715' size-in-bits='64' id='type-id-1374'/>
+      <qualified-type-def type-id='type-id-1083' const='yes' id='type-id-2716'/>
+      <pointer-type-def type-id='type-id-2716' size-in-bits='64' id='type-id-1496'/>
+      <qualified-type-def type-id='type-id-1450' const='yes' id='type-id-2717'/>
+      <pointer-type-def type-id='type-id-2717' size-in-bits='64' id='type-id-1446'/>
+      <qualified-type-def type-id='type-id-1751' const='yes' id='type-id-2718'/>
+      <pointer-type-def type-id='type-id-2718' size-in-bits='64' id='type-id-2719'/>
+      <qualified-type-def type-id='type-id-2473' const='yes' id='type-id-2720'/>
+      <pointer-type-def type-id='type-id-2720' size-in-bits='64' id='type-id-1348'/>
+      <qualified-type-def type-id='type-id-1416' const='yes' id='type-id-2721'/>
+      <pointer-type-def type-id='type-id-2721' size-in-bits='64' id='type-id-1411'/>
+      <qualified-type-def type-id='type-id-1933' const='yes' id='type-id-2722'/>
+      <pointer-type-def type-id='type-id-2722' size-in-bits='64' id='type-id-1941'/>
+      <qualified-type-def type-id='type-id-1943' const='yes' id='type-id-2723'/>
+      <pointer-type-def type-id='type-id-2723' size-in-bits='64' id='type-id-1935'/>
+      <qualified-type-def type-id='type-id-1093' const='yes' id='type-id-2724'/>
+      <pointer-type-def type-id='type-id-2724' size-in-bits='64' id='type-id-2232'/>
+      <qualified-type-def type-id='type-id-688' const='yes' id='type-id-2441'/>
+      <qualified-type-def type-id='type-id-7' const='yes' id='type-id-2725'/>
+      <pointer-type-def type-id='type-id-2725' size-in-bits='64' id='type-id-2726'/>
+      <qualified-type-def type-id='type-id-214' const='yes' id='type-id-2727'/>
+      <pointer-type-def type-id='type-id-2727' size-in-bits='64' id='type-id-658'/>
+      <qualified-type-def type-id='type-id-216' const='yes' id='type-id-2728'/>
+      <pointer-type-def type-id='type-id-2728' size-in-bits='64' id='type-id-878'/>
+      <qualified-type-def type-id='type-id-5' const='yes' id='type-id-2729'/>
+      <qualified-type-def type-id='type-id-16' const='yes' id='type-id-2153'/>
+      <qualified-type-def type-id='type-id-1465' const='yes' id='type-id-2730'/>
+      <pointer-type-def type-id='type-id-2730' size-in-bits='64' id='type-id-1464'/>
+      <qualified-type-def type-id='type-id-1110' const='yes' id='type-id-2731'/>
+      <pointer-type-def type-id='type-id-2731' size-in-bits='64' id='type-id-2732'/>
+      <pointer-type-def type-id='type-id-2732' size-in-bits='64' id='type-id-1352'/>
+      <pointer-type-def type-id='type-id-2414' size-in-bits='64' id='type-id-1487'/>
+      <pointer-type-def type-id='type-id-2415' size-in-bits='64' id='type-id-2416'/>
+      <pointer-type-def type-id='type-id-994' size-in-bits='64' id='type-id-1684'/>
+      <pointer-type-def type-id='type-id-2308' size-in-bits='64' id='type-id-1529'/>
+      <pointer-type-def type-id='type-id-2290' size-in-bits='64' id='type-id-2285'/>
+      <pointer-type-def type-id='type-id-1591' size-in-bits='64' id='type-id-1597'/>
+      <pointer-type-def type-id='type-id-1611' size-in-bits='64' id='type-id-1598'/>
+      <pointer-type-def type-id='type-id-1600' size-in-bits='64' id='type-id-1594'/>
+      <pointer-type-def type-id='type-id-1592' size-in-bits='64' id='type-id-1583'/>
+      <pointer-type-def type-id='type-id-1605' size-in-bits='64' id='type-id-1602'/>
+      <pointer-type-def type-id='type-id-1607' size-in-bits='64' id='type-id-1595'/>
+      <pointer-type-def type-id='type-id-1582' size-in-bits='64' id='type-id-1596'/>
+      <pointer-type-def type-id='type-id-2733' size-in-bits='64' id='type-id-1608'/>
+      <pointer-type-def type-id='type-id-1335' size-in-bits='64' id='type-id-2734'/>
+      <pointer-type-def type-id='type-id-1283' size-in-bits='64' id='type-id-23'/>
+      <pointer-type-def type-id='type-id-2735' size-in-bits='64' id='type-id-2542'/>
+      <pointer-type-def type-id='type-id-2736' size-in-bits='64' id='type-id-1365'/>
+      <pointer-type-def type-id='type-id-2737' size-in-bits='64' id='type-id-1314'/>
+      <pointer-type-def type-id='type-id-2738' size-in-bits='64' id='type-id-1366'/>
+      <pointer-type-def type-id='type-id-1697' size-in-bits='64' id='type-id-1664'/>
+      <pointer-type-def type-id='type-id-2140' size-in-bits='64' id='type-id-2739'/>
+      <pointer-type-def type-id='type-id-995' size-in-bits='64' id='type-id-2016'/>
+      <pointer-type-def type-id='type-id-2064' size-in-bits='64' id='type-id-2014'/>
+      <pointer-type-def type-id='type-id-996' size-in-bits='64' id='type-id-2061'/>
+      <pointer-type-def type-id='type-id-388' size-in-bits='64' id='type-id-240'/>
+      <pointer-type-def type-id='type-id-2160' size-in-bits='64' id='type-id-2018'/>
+      <pointer-type-def type-id='type-id-2047' size-in-bits='64' id='type-id-2011'/>
+      <pointer-type-def type-id='type-id-997' size-in-bits='64' id='type-id-2022'/>
+      <pointer-type-def type-id='type-id-998' size-in-bits='64' id='type-id-2008'/>
+      <pointer-type-def type-id='type-id-2573' size-in-bits='64' id='type-id-2740'/>
+      <pointer-type-def type-id='type-id-2081' size-in-bits='64' id='type-id-2741'/>
+      <pointer-type-def type-id='type-id-999' size-in-bits='64' id='type-id-2019'/>
+      <pointer-type-def type-id='type-id-2493' size-in-bits='64' id='type-id-2742'/>
+      <pointer-type-def type-id='type-id-2743' size-in-bits='64' id='type-id-2505'/>
+      <pointer-type-def type-id='type-id-2742' size-in-bits='64' id='type-id-2744'/>
+      <pointer-type-def type-id='type-id-2745' size-in-bits='64' id='type-id-2490'/>
+      <pointer-type-def type-id='type-id-1000' size-in-bits='64' id='type-id-2051'/>
+      <pointer-type-def type-id='type-id-1001' size-in-bits='64' id='type-id-2746'/>
+      <pointer-type-def type-id='type-id-2747' size-in-bits='64' id='type-id-2277'/>
+      <pointer-type-def type-id='type-id-2748' size-in-bits='64' id='type-id-2272'/>
+      <pointer-type-def type-id='type-id-2268' size-in-bits='64' id='type-id-2749'/>
+      <pointer-type-def type-id='type-id-2455' size-in-bits='64' id='type-id-2454'/>
+      <pointer-type-def type-id='type-id-2750' size-in-bits='64' id='type-id-1551'/>
+      <pointer-type-def type-id='type-id-1899' size-in-bits='64' id='type-id-2751'/>
+      <pointer-type-def type-id='type-id-1875' size-in-bits='64' id='type-id-2752'/>
+      <pointer-type-def type-id='type-id-1880' size-in-bits='64' id='type-id-2753'/>
+      <pointer-type-def type-id='type-id-1876' size-in-bits='64' id='type-id-2754'/>
+      <pointer-type-def type-id='type-id-1900' size-in-bits='64' id='type-id-2755'/>
+      <pointer-type-def type-id='type-id-1903' size-in-bits='64' id='type-id-2756'/>
+      <pointer-type-def type-id='type-id-1879' size-in-bits='64' id='type-id-2757'/>
+      <pointer-type-def type-id='type-id-1909' size-in-bits='64' id='type-id-2758'/>
+      <pointer-type-def type-id='type-id-1898' size-in-bits='64' id='type-id-2759'/>
+      <pointer-type-def type-id='type-id-1905' size-in-bits='64' id='type-id-2760'/>
+      <pointer-type-def type-id='type-id-1902' size-in-bits='64' id='type-id-2761'/>
+      <pointer-type-def type-id='type-id-1882' size-in-bits='64' id='type-id-2762'/>
+      <pointer-type-def type-id='type-id-1877' size-in-bits='64' id='type-id-2763'/>
+      <pointer-type-def type-id='type-id-1881' size-in-bits='64' id='type-id-2764'/>
+      <pointer-type-def type-id='type-id-1886' size-in-bits='64' id='type-id-2765'/>
+      <pointer-type-def type-id='type-id-1885' size-in-bits='64' id='type-id-2766'/>
+      <pointer-type-def type-id='type-id-1883' size-in-bits='64' id='type-id-2767'/>
+      <pointer-type-def type-id='type-id-1901' size-in-bits='64' id='type-id-2768'/>
+      <pointer-type-def type-id='type-id-1878' size-in-bits='64' id='type-id-2769'/>
+      <pointer-type-def type-id='type-id-2450' size-in-bits='64' id='type-id-1377'/>
+      <pointer-type-def type-id='type-id-2122' size-in-bits='64' id='type-id-254'/>
+      <pointer-type-def type-id='type-id-1003' size-in-bits='64' id='type-id-2264'/>
+      <pointer-type-def type-id='type-id-1004' size-in-bits='64' id='type-id-2267'/>
+      <pointer-type-def type-id='type-id-1005' size-in-bits='64' id='type-id-2235'/>
+      <pointer-type-def type-id='type-id-1006' size-in-bits='64' id='type-id-2224'/>
+      <pointer-type-def type-id='type-id-1007' size-in-bits='64' id='type-id-2225'/>
+      <pointer-type-def type-id='type-id-1345' size-in-bits='64' id='type-id-1344'/>
+      <pointer-type-def type-id='type-id-1343' size-in-bits='64' id='type-id-2770'/>
+      <pointer-type-def type-id='type-id-1272' size-in-bits='64' id='type-id-83'/>
+      <pointer-type-def type-id='type-id-2577' size-in-bits='64' id='type-id-2578'/>
+      <pointer-type-def type-id='type-id-2578' size-in-bits='64' id='type-id-2771'/>
+      <pointer-type-def type-id='type-id-2599' size-in-bits='64' id='type-id-1304'/>
+      <pointer-type-def type-id='type-id-1364' size-in-bits='64' id='type-id-1347'/>
+      <pointer-type-def type-id='type-id-1008' size-in-bits='64' id='type-id-1513'/>
+      <pointer-type-def type-id='type-id-1791' size-in-bits='64' id='type-id-1781'/>
+      <pointer-type-def type-id='type-id-1793' size-in-bits='64' id='type-id-1782'/>
+      <pointer-type-def type-id='type-id-1795' size-in-bits='64' id='type-id-1783'/>
+      <pointer-type-def type-id='type-id-1009' size-in-bits='64' id='type-id-1512'/>
+      <pointer-type-def type-id='type-id-1010' size-in-bits='64' id='type-id-1307'/>
+      <pointer-type-def type-id='type-id-1012' size-in-bits='64' id='type-id-1306'/>
+      <pointer-type-def type-id='type-id-1013' size-in-bits='64' id='type-id-1308'/>
+      <pointer-type-def type-id='type-id-1015' size-in-bits='64' id='type-id-1532'/>
+      <pointer-type-def type-id='type-id-2178' size-in-bits='64' id='type-id-2772'/>
+      <pointer-type-def type-id='type-id-2161' size-in-bits='64' id='type-id-2023'/>
+      <pointer-type-def type-id='type-id-2773' size-in-bits='64' id='type-id-2171'/>
+      <pointer-type-def type-id='type-id-2774' size-in-bits='64' id='type-id-2173'/>
+      <pointer-type-def type-id='type-id-2775' size-in-bits='64' id='type-id-2172'/>
+      <pointer-type-def type-id='type-id-2776' size-in-bits='64' id='type-id-2164'/>
+      <pointer-type-def type-id='type-id-2177' size-in-bits='64' id='type-id-2777'/>
+      <pointer-type-def type-id='type-id-1016' size-in-bits='64' id='type-id-2523'/>
+      <pointer-type-def type-id='type-id-1995' size-in-bits='64' id='type-id-2778'/>
+      <pointer-type-def type-id='type-id-2000' size-in-bits='64' id='type-id-1931'/>
+      <pointer-type-def type-id='type-id-1942' size-in-bits='64' id='type-id-1932'/>
+      <pointer-type-def type-id='type-id-1638' size-in-bits='64' id='type-id-1614'/>
+      <pointer-type-def type-id='type-id-1017' size-in-bits='64' id='type-id-2522'/>
+      <pointer-type-def type-id='type-id-1916' size-in-bits='64' id='type-id-2779'/>
+      <pointer-type-def type-id='type-id-1284' size-in-bits='64' id='type-id-1291'/>
+      <pointer-type-def type-id='type-id-1291' size-in-bits='64' id='type-id-1292'/>
+      <pointer-type-def type-id='type-id-186' size-in-bits='64' id='type-id-746'/>
+      <pointer-type-def type-id='type-id-520' size-in-bits='64' id='type-id-97'/>
+      <pointer-type-def type-id='type-id-97' size-in-bits='64' id='type-id-1576'/>
+      <pointer-type-def type-id='type-id-2293' size-in-bits='64' id='type-id-2292'/>
+      <pointer-type-def type-id='type-id-2292' size-in-bits='64' id='type-id-2294'/>
+      <pointer-type-def type-id='type-id-681' size-in-bits='64' id='type-id-1556'/>
+      <pointer-type-def type-id='type-id-1125' size-in-bits='64' id='type-id-1552'/>
+      <pointer-type-def type-id='type-id-1559' size-in-bits='64' id='type-id-1554'/>
+      <pointer-type-def type-id='type-id-1337' size-in-bits='64' id='type-id-2780'/>
+      <pointer-type-def type-id='type-id-2217' size-in-bits='64' id='type-id-2208'/>
+      <pointer-type-def type-id='type-id-2218' size-in-bits='64' id='type-id-2209'/>
+      <pointer-type-def type-id='type-id-2219' size-in-bits='64' id='type-id-2210'/>
+      <pointer-type-def type-id='type-id-2220' size-in-bits='64' id='type-id-2211'/>
+      <pointer-type-def type-id='type-id-1801' size-in-bits='64' id='type-id-2781'/>
+      <pointer-type-def type-id='type-id-1802' size-in-bits='64' id='type-id-2782'/>
+      <pointer-type-def type-id='type-id-1775' size-in-bits='64' id='type-id-2783'/>
+      <pointer-type-def type-id='type-id-1771' size-in-bits='64' id='type-id-2784'/>
+      <pointer-type-def type-id='type-id-1018' size-in-bits='64' id='type-id-1676'/>
+      <pointer-type-def type-id='type-id-1019' size-in-bits='64' id='type-id-1677'/>
+      <pointer-type-def type-id='type-id-2243' size-in-bits='64' id='type-id-2785'/>
+      <pointer-type-def type-id='type-id-2239' size-in-bits='64' id='type-id-2237'/>
+      <pointer-type-def type-id='type-id-1020' size-in-bits='64' id='type-id-2260'/>
+      <pointer-type-def type-id='type-id-1021' size-in-bits='64' id='type-id-2227'/>
+      <pointer-type-def type-id='type-id-1295' size-in-bits='64' id='type-id-1127'/>
+      <pointer-type-def type-id='type-id-2786' size-in-bits='64' id='type-id-2474'/>
+      <pointer-type-def type-id='type-id-2787' size-in-bits='64' id='type-id-1378'/>
+      <pointer-type-def type-id='type-id-2788' size-in-bits='64' id='type-id-1976'/>
+      <pointer-type-def type-id='type-id-2789' size-in-bits='64' id='type-id-1972'/>
+      <pointer-type-def type-id='type-id-2790' size-in-bits='64' id='type-id-1975'/>
+      <pointer-type-def type-id='type-id-2791' size-in-bits='64' id='type-id-1985'/>
+      <pointer-type-def type-id='type-id-2792' size-in-bits='64' id='type-id-1974'/>
+      <pointer-type-def type-id='type-id-2793' size-in-bits='64' id='type-id-1986'/>
+      <pointer-type-def type-id='type-id-2794' size-in-bits='64' id='type-id-1981'/>
+      <pointer-type-def type-id='type-id-2795' size-in-bits='64' id='type-id-1991'/>
+      <pointer-type-def type-id='type-id-2796' size-in-bits='64' id='type-id-1990'/>
+      <pointer-type-def type-id='type-id-2797' size-in-bits='64' id='type-id-2106'/>
+      <pointer-type-def type-id='type-id-2798' size-in-bits='64' id='type-id-2102'/>
+      <pointer-type-def type-id='type-id-2799' size-in-bits='64' id='type-id-2092'/>
+      <pointer-type-def type-id='type-id-2800' size-in-bits='64' id='type-id-1259'/>
+      <pointer-type-def type-id='type-id-2801' size-in-bits='64' id='type-id-1266'/>
+      <pointer-type-def type-id='type-id-2802' size-in-bits='64' id='type-id-1263'/>
+      <pointer-type-def type-id='type-id-2803' size-in-bits='64' id='type-id-1265'/>
+      <pointer-type-def type-id='type-id-2804' size-in-bits='64' id='type-id-1833'/>
+      <pointer-type-def type-id='type-id-2805' size-in-bits='64' id='type-id-1831'/>
+      <pointer-type-def type-id='type-id-2806' size-in-bits='64' id='type-id-1832'/>
+      <pointer-type-def type-id='type-id-2807' size-in-bits='64' id='type-id-1238'/>
+      <pointer-type-def type-id='type-id-2808' size-in-bits='64' id='type-id-1827'/>
+      <pointer-type-def type-id='type-id-2809' size-in-bits='64' id='type-id-2337'/>
+      <pointer-type-def type-id='type-id-2810' size-in-bits='64' id='type-id-2351'/>
+      <pointer-type-def type-id='type-id-2811' size-in-bits='64' id='type-id-2350'/>
+      <pointer-type-def type-id='type-id-2812' size-in-bits='64' id='type-id-2341'/>
+      <pointer-type-def type-id='type-id-2813' size-in-bits='64' id='type-id-2445'/>
+      <pointer-type-def type-id='type-id-2814' size-in-bits='64' id='type-id-1271'/>
+      <pointer-type-def type-id='type-id-2815' size-in-bits='64' id='type-id-2444'/>
+      <pointer-type-def type-id='type-id-2816' size-in-bits='64' id='type-id-2535'/>
+      <pointer-type-def type-id='type-id-2817' size-in-bits='64' id='type-id-2533'/>
+      <pointer-type-def type-id='type-id-2818' size-in-bits='64' id='type-id-2534'/>
+      <pointer-type-def type-id='type-id-2819' size-in-bits='64' id='type-id-2170'/>
+      <pointer-type-def type-id='type-id-2820' size-in-bits='64' id='type-id-2174'/>
+      <pointer-type-def type-id='type-id-2821' size-in-bits='64' id='type-id-2169'/>
+      <pointer-type-def type-id='type-id-2822' size-in-bits='64' id='type-id-2176'/>
+      <pointer-type-def type-id='type-id-2823' size-in-bits='64' id='type-id-2175'/>
+      <pointer-type-def type-id='type-id-2824' size-in-bits='64' id='type-id-1913'/>
+      <pointer-type-def type-id='type-id-2825' size-in-bits='64' id='type-id-1744'/>
+      <pointer-type-def type-id='type-id-2826' size-in-bits='64' id='type-id-1329'/>
+      <pointer-type-def type-id='type-id-2827' size-in-bits='64' id='type-id-2541'/>
+      <pointer-type-def type-id='type-id-2828' size-in-bits='64' id='type-id-1912'/>
+      <pointer-type-def type-id='type-id-2829' size-in-bits='64' id='type-id-1610'/>
+      <pointer-type-def type-id='type-id-2830' size-in-bits='64' id='type-id-1590'/>
+      <pointer-type-def type-id='type-id-2831' size-in-bits='64' id='type-id-2536'/>
+      <pointer-type-def type-id='type-id-2832' size-in-bits='64' id='type-id-1319'/>
+      <pointer-type-def type-id='type-id-2833' size-in-bits='64' id='type-id-1327'/>
+      <pointer-type-def type-id='type-id-2834' size-in-bits='64' id='type-id-1321'/>
+      <pointer-type-def type-id='type-id-2835' size-in-bits='64' id='type-id-2481'/>
+      <pointer-type-def type-id='type-id-2836' size-in-bits='64' id='type-id-2532'/>
+      <pointer-type-def type-id='type-id-2837' size-in-bits='64' id='type-id-2041'/>
+      <pointer-type-def type-id='type-id-2838' size-in-bits='64' id='type-id-2043'/>
+      <pointer-type-def type-id='type-id-2839' size-in-bits='64' id='type-id-2030'/>
+      <pointer-type-def type-id='type-id-2840' size-in-bits='64' id='type-id-2073'/>
+      <pointer-type-def type-id='type-id-2841' size-in-bits='64' id='type-id-2070'/>
+      <pointer-type-def type-id='type-id-2842' size-in-bits='64' id='type-id-2079'/>
+      <pointer-type-def type-id='type-id-2843' size-in-bits='64' id='type-id-2044'/>
+      <pointer-type-def type-id='type-id-2844' size-in-bits='64' id='type-id-2080'/>
+      <pointer-type-def type-id='type-id-2845' size-in-bits='64' id='type-id-2069'/>
+      <pointer-type-def type-id='type-id-2846' size-in-bits='64' id='type-id-2575'/>
+      <pointer-type-def type-id='type-id-2847' size-in-bits='64' id='type-id-2504'/>
+      <pointer-type-def type-id='type-id-2848' size-in-bits='64' id='type-id-2271'/>
+      <pointer-type-def type-id='type-id-2849' size-in-bits='64' id='type-id-2094'/>
+      <pointer-type-def type-id='type-id-2850' size-in-bits='64' id='type-id-2095'/>
+      <pointer-type-def type-id='type-id-2851' size-in-bits='64' id='type-id-2096'/>
+      <pointer-type-def type-id='type-id-2852' size-in-bits='64' id='type-id-2555'/>
+      <pointer-type-def type-id='type-id-2853' size-in-bits='64' id='type-id-2563'/>
+      <pointer-type-def type-id='type-id-2854' size-in-bits='64' id='type-id-2039'/>
+      <pointer-type-def type-id='type-id-2855' size-in-bits='64' id='type-id-2568'/>
+      <pointer-type-def type-id='type-id-2856' size-in-bits='64' id='type-id-2091'/>
+      <pointer-type-def type-id='type-id-2857' size-in-bits='64' id='type-id-2560'/>
+      <pointer-type-def type-id='type-id-2858' size-in-bits='64' id='type-id-2572'/>
+      <pointer-type-def type-id='type-id-2859' size-in-bits='64' id='type-id-2561'/>
+      <pointer-type-def type-id='type-id-2860' size-in-bits='64' id='type-id-2558'/>
+      <pointer-type-def type-id='type-id-2861' size-in-bits='64' id='type-id-2586'/>
+      <pointer-type-def type-id='type-id-2862' size-in-bits='64' id='type-id-2590'/>
+      <pointer-type-def type-id='type-id-2863' size-in-bits='64' id='type-id-2592'/>
+      <pointer-type-def type-id='type-id-2864' size-in-bits='64' id='type-id-2478'/>
+      <pointer-type-def type-id='type-id-2865' size-in-bits='64' id='type-id-1322'/>
+      <pointer-type-def type-id='type-id-2866' size-in-bits='64' id='type-id-1323'/>
+      <pointer-type-def type-id='type-id-2867' size-in-bits='64' id='type-id-1333'/>
+      <pointer-type-def type-id='type-id-2868' size-in-bits='64' id='type-id-1326'/>
+      <pointer-type-def type-id='type-id-2869' size-in-bits='64' id='type-id-1324'/>
+      <pointer-type-def type-id='type-id-2870' size-in-bits='64' id='type-id-1320'/>
+      <pointer-type-def type-id='type-id-2871' size-in-bits='64' id='type-id-1325'/>
+      <pointer-type-def type-id='type-id-2872' size-in-bits='64' id='type-id-1331'/>
+      <pointer-type-def type-id='type-id-2873' size-in-bits='64' id='type-id-2559'/>
+      <pointer-type-def type-id='type-id-2874' size-in-bits='64' id='type-id-1316'/>
+      <pointer-type-def type-id='type-id-2875' size-in-bits='64' id='type-id-2508'/>
+      <pointer-type-def type-id='type-id-2876' size-in-bits='64' id='type-id-1334'/>
+      <pointer-type-def type-id='type-id-2877' size-in-bits='64' id='type-id-2509'/>
+      <pointer-type-def type-id='type-id-2878' size-in-bits='64' id='type-id-1332'/>
+      <pointer-type-def type-id='type-id-2879' size-in-bits='64' id='type-id-2477'/>
+      <pointer-type-def type-id='type-id-2880' size-in-bits='64' id='type-id-2565'/>
+      <pointer-type-def type-id='type-id-2881' size-in-bits='64' id='type-id-1711'/>
+      <pointer-type-def type-id='type-id-2882' size-in-bits='64' id='type-id-2562'/>
+      <pointer-type-def type-id='type-id-2883' size-in-bits='64' id='type-id-1442'/>
+      <pointer-type-def type-id='type-id-2884' size-in-bits='64' id='type-id-1441'/>
+      <pointer-type-def type-id='type-id-2885' size-in-bits='64' id='type-id-1443'/>
+      <pointer-type-def type-id='type-id-2886' size-in-bits='64' id='type-id-1458'/>
+      <pointer-type-def type-id='type-id-2887' size-in-bits='64' id='type-id-1462'/>
+      <pointer-type-def type-id='type-id-2888' size-in-bits='64' id='type-id-1439'/>
+      <pointer-type-def type-id='type-id-2889' size-in-bits='64' id='type-id-1635'/>
+      <pointer-type-def type-id='type-id-2890' size-in-bits='64' id='type-id-2891'/>
+      <qualified-type-def type-id='type-id-2891' const='yes' id='type-id-1405'/>
+      <pointer-type-def type-id='type-id-2892' size-in-bits='64' id='type-id-2893'/>
+      <qualified-type-def type-id='type-id-2893' const='yes' id='type-id-1407'/>
+      <pointer-type-def type-id='type-id-2894' size-in-bits='64' id='type-id-2434'/>
+      <pointer-type-def type-id='type-id-2895' size-in-bits='64' id='type-id-1733'/>
+      <pointer-type-def type-id='type-id-2896' size-in-bits='64' id='type-id-1732'/>
+      <pointer-type-def type-id='type-id-2897' size-in-bits='64' id='type-id-2189'/>
+      <pointer-type-def type-id='type-id-2898' size-in-bits='64' id='type-id-1947'/>
+      <pointer-type-def type-id='type-id-2899' size-in-bits='64' id='type-id-2280'/>
+      <pointer-type-def type-id='type-id-2900' size-in-bits='64' id='type-id-1953'/>
+      <pointer-type-def type-id='type-id-2901' size-in-bits='64' id='type-id-1699'/>
+      <pointer-type-def type-id='type-id-2902' size-in-bits='64' id='type-id-1739'/>
+      <pointer-type-def type-id='type-id-2903' size-in-bits='64' id='type-id-1873'/>
+      <pointer-type-def type-id='type-id-2904' size-in-bits='64' id='type-id-1870'/>
+      <pointer-type-def type-id='type-id-2905' size-in-bits='64' id='type-id-1725'/>
+      <pointer-type-def type-id='type-id-2906' size-in-bits='64' id='type-id-1860'/>
+      <pointer-type-def type-id='type-id-2907' size-in-bits='64' id='type-id-1862'/>
+      <pointer-type-def type-id='type-id-2908' size-in-bits='64' id='type-id-1853'/>
+      <pointer-type-def type-id='type-id-2909' size-in-bits='64' id='type-id-1724'/>
+      <pointer-type-def type-id='type-id-2910' size-in-bits='64' id='type-id-1864'/>
+      <pointer-type-def type-id='type-id-2911' size-in-bits='64' id='type-id-1838'/>
+      <pointer-type-def type-id='type-id-2912' size-in-bits='64' id='type-id-1846'/>
+      <pointer-type-def type-id='type-id-2913' size-in-bits='64' id='type-id-1865'/>
+      <pointer-type-def type-id='type-id-2914' size-in-bits='64' id='type-id-1866'/>
+      <pointer-type-def type-id='type-id-2915' size-in-bits='64' id='type-id-1869'/>
+      <pointer-type-def type-id='type-id-2916' size-in-bits='64' id='type-id-1845'/>
+      <pointer-type-def type-id='type-id-2917' size-in-bits='64' id='type-id-1874'/>
+      <pointer-type-def type-id='type-id-2918' size-in-bits='64' id='type-id-1857'/>
+      <pointer-type-def type-id='type-id-2919' size-in-bits='64' id='type-id-1872'/>
+      <pointer-type-def type-id='type-id-2920' size-in-bits='64' id='type-id-1868'/>
+      <pointer-type-def type-id='type-id-2921' size-in-bits='64' id='type-id-1850'/>
+      <pointer-type-def type-id='type-id-2922' size-in-bits='64' id='type-id-1848'/>
+      <pointer-type-def type-id='type-id-2923' size-in-bits='64' id='type-id-1856'/>
+      <pointer-type-def type-id='type-id-2924' size-in-bits='64' id='type-id-1855'/>
+      <pointer-type-def type-id='type-id-2925' size-in-bits='64' id='type-id-1867'/>
+      <pointer-type-def type-id='type-id-2926' size-in-bits='64' id='type-id-1842'/>
+      <pointer-type-def type-id='type-id-2927' size-in-bits='64' id='type-id-1706'/>
+      <pointer-type-def type-id='type-id-2928' size-in-bits='64' id='type-id-1705'/>
+      <pointer-type-def type-id='type-id-2929' size-in-bits='64' id='type-id-1707'/>
+      <pointer-type-def type-id='type-id-2930' size-in-bits='64' id='type-id-1718'/>
+      <pointer-type-def type-id='type-id-2931' size-in-bits='64' id='type-id-1720'/>
+      <pointer-type-def type-id='type-id-2932' size-in-bits='64' id='type-id-1719'/>
+      <pointer-type-def type-id='type-id-2933' size-in-bits='64' id='type-id-1716'/>
+      <pointer-type-def type-id='type-id-2934' size-in-bits='64' id='type-id-1721'/>
+      <pointer-type-def type-id='type-id-2935' size-in-bits='64' id='type-id-1722'/>
+      <pointer-type-def type-id='type-id-2936' size-in-bits='64' id='type-id-1717'/>
+      <pointer-type-def type-id='type-id-2937' size-in-bits='64' id='type-id-1715'/>
+      <pointer-type-def type-id='type-id-2938' size-in-bits='64' id='type-id-1743'/>
+      <pointer-type-def type-id='type-id-2939' size-in-bits='64' id='type-id-1723'/>
+      <pointer-type-def type-id='type-id-2940' size-in-bits='64' id='type-id-1714'/>
+      <pointer-type-def type-id='type-id-2941' size-in-bits='64' id='type-id-1747'/>
+      <pointer-type-def type-id='type-id-2942' size-in-bits='64' id='type-id-1708'/>
+      <pointer-type-def type-id='type-id-2943' size-in-bits='64' id='type-id-1730'/>
+      <pointer-type-def type-id='type-id-2944' size-in-bits='64' id='type-id-1727'/>
+      <pointer-type-def type-id='type-id-2945' size-in-bits='64' id='type-id-1726'/>
+      <pointer-type-def type-id='type-id-2946' size-in-bits='64' id='type-id-2195'/>
+      <pointer-type-def type-id='type-id-2947' size-in-bits='64' id='type-id-1746'/>
+      <pointer-type-def type-id='type-id-2948' size-in-bits='64' id='type-id-1738'/>
+      <pointer-type-def type-id='type-id-2949' size-in-bits='64' id='type-id-2190'/>
+      <pointer-type-def type-id='type-id-2950' size-in-bits='64' id='type-id-1735'/>
+      <pointer-type-def type-id='type-id-2951' size-in-bits='64' id='type-id-1745'/>
+      <pointer-type-def type-id='type-id-2952' size-in-bits='64' id='type-id-1713'/>
+      <pointer-type-def type-id='type-id-2953' size-in-bits='64' id='type-id-1737'/>
+      <pointer-type-def type-id='type-id-2954' size-in-bits='64' id='type-id-1729'/>
+      <pointer-type-def type-id='type-id-2955' size-in-bits='64' id='type-id-1748'/>
+      <pointer-type-def type-id='type-id-2956' size-in-bits='64' id='type-id-1871'/>
+      <pointer-type-def type-id='type-id-2957' size-in-bits='64' id='type-id-1858'/>
+      <pointer-type-def type-id='type-id-2958' size-in-bits='64' id='type-id-1859'/>
+      <pointer-type-def type-id='type-id-2959' size-in-bits='64' id='type-id-1861'/>
+      <pointer-type-def type-id='type-id-2960' size-in-bits='64' id='type-id-1704'/>
+      <pointer-type-def type-id='type-id-2961' size-in-bits='64' id='type-id-1811'/>
+      <pointer-type-def type-id='type-id-2962' size-in-bits='64' id='type-id-2188'/>
+      <pointer-type-def type-id='type-id-2963' size-in-bits='64' id='type-id-2093'/>
+      <pointer-type-def type-id='type-id-2964' size-in-bits='64' id='type-id-2099'/>
+      <pointer-type-def type-id='type-id-2965' size-in-bits='64' id='type-id-2104'/>
+      <pointer-type-def type-id='type-id-2966' size-in-bits='64' id='type-id-2090'/>
+      <pointer-type-def type-id='type-id-2967' size-in-bits='64' id='type-id-2131'/>
+      <pointer-type-def type-id='type-id-2968' size-in-bits='64' id='type-id-2256'/>
+      <pointer-type-def type-id='type-id-2969' size-in-bits='64' id='type-id-2340'/>
+      <pointer-type-def type-id='type-id-2970' size-in-bits='64' id='type-id-2486'/>
+      <pointer-type-def type-id='type-id-2971' size-in-bits='64' id='type-id-1444'/>
+      <pointer-type-def type-id='type-id-2972' size-in-bits='64' id='type-id-1440'/>
+      <pointer-type-def type-id='type-id-2973' size-in-bits='64' id='type-id-311'/>
+      <pointer-type-def type-id='type-id-2974' size-in-bits='64' id='type-id-1962'/>
+      <pointer-type-def type-id='type-id-2975' size-in-bits='64' id='type-id-2193'/>
+      <pointer-type-def type-id='type-id-2976' size-in-bits='64' id='type-id-2197'/>
+      <pointer-type-def type-id='type-id-2977' size-in-bits='64' id='type-id-2200'/>
+      <pointer-type-def type-id='type-id-2978' size-in-bits='64' id='type-id-1934'/>
+      <pointer-type-def type-id='type-id-2979' size-in-bits='64' id='type-id-1954'/>
+      <pointer-type-def type-id='type-id-2980' size-in-bits='64' id='type-id-1911'/>
+      <pointer-type-def type-id='type-id-2981' size-in-bits='64' id='type-id-1810'/>
+      <pointer-type-def type-id='type-id-2982' size-in-bits='64' id='type-id-1734'/>
+      <pointer-type-def type-id='type-id-2983' size-in-bits='64' id='type-id-1736'/>
+      <pointer-type-def type-id='type-id-2984' size-in-bits='64' id='type-id-2480'/>
+      <pointer-type-def type-id='type-id-2985' size-in-bits='64' id='type-id-2515'/>
+      <pointer-type-def type-id='type-id-2986' size-in-bits='64' id='type-id-2479'/>
+      <pointer-type-def type-id='type-id-2987' size-in-bits='64' id='type-id-2482'/>
+      <pointer-type-def type-id='type-id-2988' size-in-bits='64' id='type-id-2512'/>
+      <pointer-type-def type-id='type-id-2989' size-in-bits='64' id='type-id-2514'/>
+      <pointer-type-def type-id='type-id-2990' size-in-bits='64' id='type-id-2510'/>
+      <pointer-type-def type-id='type-id-2991' size-in-bits='64' id='type-id-2516'/>
+      <pointer-type-def type-id='type-id-2992' size-in-bits='64' id='type-id-2491'/>
+      <pointer-type-def type-id='type-id-2993' size-in-bits='64' id='type-id-2517'/>
+      <pointer-type-def type-id='type-id-2994' size-in-bits='64' id='type-id-2513'/>
+      <pointer-type-def type-id='type-id-2995' size-in-bits='64' id='type-id-2107'/>
+      <pointer-type-def type-id='type-id-2996' size-in-bits='64' id='type-id-2343'/>
+      <pointer-type-def type-id='type-id-2997' size-in-bits='64' id='type-id-1944'/>
+      <pointer-type-def type-id='type-id-2998' size-in-bits='64' id='type-id-1950'/>
+      <pointer-type-def type-id='type-id-2999' size-in-bits='64' id='type-id-1948'/>
+      <pointer-type-def type-id='type-id-3000' size-in-bits='64' id='type-id-1328'/>
+      <pointer-type-def type-id='type-id-3001' size-in-bits='64' id='type-id-1317'/>
+      <pointer-type-def type-id='type-id-3002' size-in-bits='64' id='type-id-2487'/>
+      <pointer-type-def type-id='type-id-3003' size-in-bits='64' id='type-id-2483'/>
+      <pointer-type-def type-id='type-id-3004' size-in-bits='64' id='type-id-1468'/>
+      <pointer-type-def type-id='type-id-3005' size-in-bits='64' id='type-id-1467'/>
+      <pointer-type-def type-id='type-id-3006' size-in-bits='64' id='type-id-2148'/>
+      <pointer-type-def type-id='type-id-3007' size-in-bits='64' id='type-id-1473'/>
+      <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-666'/>
+      <pointer-type-def type-id='type-id-2373' size-in-bits='64' id='type-id-364'/>
+      <pointer-type-def type-id='type-id-2374' size-in-bits='64' id='type-id-513'/>
+      <pointer-type-def type-id='type-id-1022' size-in-bits='64' id='type-id-2028'/>
+      <pointer-type-def type-id='type-id-1023' size-in-bits='64' id='type-id-2027'/>
+      <pointer-type-def type-id='type-id-2111' size-in-bits='64' id='type-id-3008'/>
+      <pointer-type-def type-id='type-id-2295' size-in-bits='64' id='type-id-2286'/>
+      <pointer-type-def type-id='type-id-1025' size-in-bits='64' id='type-id-2223'/>
+      <pointer-type-def type-id='type-id-1026' size-in-bits='64' id='type-id-1641'/>
+      <pointer-type-def type-id='type-id-2214' size-in-bits='64' id='type-id-2205'/>
+      <pointer-type-def type-id='type-id-1027' size-in-bits='64' id='type-id-2222'/>
+      <pointer-type-def type-id='type-id-1028' size-in-bits='64' id='type-id-2263'/>
+      <pointer-type-def type-id='type-id-1029' size-in-bits='64' id='type-id-2015'/>
+      <pointer-type-def type-id='type-id-1031' size-in-bits='64' id='type-id-1669'/>
+      <pointer-type-def type-id='type-id-2439' size-in-bits='64' id='type-id-1376'/>
+      <pointer-type-def type-id='type-id-1032' size-in-bits='64' id='type-id-1426'/>
+      <pointer-type-def type-id='type-id-1423' size-in-bits='64' id='type-id-1395'/>
+      <pointer-type-def type-id='type-id-1463' size-in-bits='64' id='type-id-3009'/>
+      <pointer-type-def type-id='type-id-1033' size-in-bits='64' id='type-id-1456'/>
+      <pointer-type-def type-id='type-id-1457' size-in-bits='64' id='type-id-2347'/>
+      <pointer-type-def type-id='type-id-1431' size-in-bits='64' id='type-id-1430'/>
+      <pointer-type-def type-id='type-id-1438' size-in-bits='64' id='type-id-1433'/>
+      <pointer-type-def type-id='type-id-1617' size-in-bits='64' id='type-id-1354'/>
+      <pointer-type-def type-id='type-id-1633' size-in-bits='64' id='type-id-1628'/>
+      <pointer-type-def type-id='type-id-1034' size-in-bits='64' id='type-id-1630'/>
+      <pointer-type-def type-id='type-id-1035' size-in-bits='64' id='type-id-1626'/>
+      <pointer-type-def type-id='type-id-330' size-in-bits='64' id='type-id-3010'/>
+      <pointer-type-def type-id='type-id-2109' size-in-bits='64' id='type-id-3011'/>
+      <pointer-type-def type-id='type-id-1036' size-in-bits='64' id='type-id-1488'/>
+      <pointer-type-def type-id='type-id-1037' size-in-bits='64' id='type-id-538'/>
+      <pointer-type-def type-id='type-id-1409' size-in-bits='64' id='type-id-1394'/>
+      <pointer-type-def type-id='type-id-1408' size-in-bits='64' id='type-id-3012'/>
+      <pointer-type-def type-id='type-id-267' size-in-bits='64' id='type-id-379'/>
+      <pointer-type-def type-id='type-id-2498' size-in-bits='64' id='type-id-3013'/>
+      <pointer-type-def type-id='type-id-2494' size-in-bits='64' id='type-id-3014'/>
+      <pointer-type-def type-id='type-id-1396' size-in-bits='64' id='type-id-1393'/>
+      <pointer-type-def type-id='type-id-1340' size-in-bits='64' id='type-id-3015'/>
+      <pointer-type-def type-id='type-id-1038' size-in-bits='64' id='type-id-3016'/>
+      <pointer-type-def type-id='type-id-2325' size-in-bits='64' id='type-id-2324'/>
+      <pointer-type-def type-id='type-id-2323' size-in-bits='64' id='type-id-2320'/>
+      <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-3017'/>
+      <pointer-type-def type-id='type-id-1039' size-in-bits='64' id='type-id-1485'/>
+      <pointer-type-def type-id='type-id-2215' size-in-bits='64' id='type-id-2206'/>
+      <pointer-type-def type-id='type-id-2221' size-in-bits='64' id='type-id-2212'/>
+      <pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-877'/>
+      <pointer-type-def type-id='type-id-2550' size-in-bits='64' id='type-id-2549'/>
+      <pointer-type-def type-id='type-id-2547' size-in-bits='64' id='type-id-2546'/>
+      <pointer-type-def type-id='type-id-2548' size-in-bits='64' id='type-id-1142'/>
+      <pointer-type-def type-id='type-id-281' size-in-bits='64' id='type-id-282'/>
+      <pointer-type-def type-id='type-id-1144' size-in-bits='64' id='type-id-1696'/>
+      <pointer-type-def type-id='type-id-763' size-in-bits='64' id='type-id-85'/>
+      <pointer-type-def type-id='type-id-3018' size-in-bits='64' id='type-id-2569'/>
+      <pointer-type-def type-id='type-id-3019' size-in-bits='64' id='type-id-2557'/>
+      <pointer-type-def type-id='type-id-3020' size-in-bits='64' id='type-id-1562'/>
+      <pointer-type-def type-id='type-id-3021' size-in-bits='64' id='type-id-2492'/>
+      <pointer-type-def type-id='type-id-1040' size-in-bits='64' id='type-id-1535'/>
+      <pointer-type-def type-id='type-id-1929' size-in-bits='64' id='type-id-1682'/>
+      <pointer-type-def type-id='type-id-1480' size-in-bits='64' id='type-id-882'/>
+      <pointer-type-def type-id='type-id-1041' size-in-bits='64' id='type-id-1642'/>
+      <pointer-type-def type-id='type-id-1383' size-in-bits='64' id='type-id-1382'/>
+      <pointer-type-def type-id='type-id-1369' size-in-bits='64' id='type-id-260'/>
+      <pointer-type-def type-id='type-id-2430' size-in-bits='64' id='type-id-1372'/>
+      <pointer-type-def type-id='type-id-1371' size-in-bits='64' id='type-id-3022'/>
+      <pointer-type-def type-id='type-id-1042' size-in-bits='64' id='type-id-1385'/>
+      <pointer-type-def type-id='type-id-1043' size-in-bits='64' id='type-id-1391'/>
+      <pointer-type-def type-id='type-id-1044' size-in-bits='64' id='type-id-1384'/>
+      <pointer-type-def type-id='type-id-1045' size-in-bits='64' id='type-id-1358'/>
+      <pointer-type-def type-id='type-id-1046' size-in-bits='64' id='type-id-1511'/>
+      <pointer-type-def type-id='type-id-1807' size-in-bits='64' id='type-id-3023'/>
+      <pointer-type-def type-id='type-id-1048' size-in-bits='64' id='type-id-3024'/>
+      <pointer-type-def type-id='type-id-1049' size-in-bits='64' id='type-id-3025'/>
+      <pointer-type-def type-id='type-id-3026' size-in-bits='64' id='type-id-2281'/>
+      <pointer-type-def type-id='type-id-1645' size-in-bits='64' id='type-id-1643'/>
+      <pointer-type-def type-id='type-id-3027' size-in-bits='64' id='type-id-2198'/>
+      <pointer-type-def type-id='type-id-1663' size-in-bits='64' id='type-id-1648'/>
+      <pointer-type-def type-id='type-id-1667' size-in-bits='64' id='type-id-3028'/>
+      <pointer-type-def type-id='type-id-3029' size-in-bits='64' id='type-id-1712'/>
+      <pointer-type-def type-id='type-id-1050' size-in-bits='64' id='type-id-1660'/>
+      <pointer-type-def type-id='type-id-1051' size-in-bits='64' id='type-id-1966'/>
+      <pointer-type-def type-id='type-id-1814' size-in-bits='64' id='type-id-3030'/>
+      <pointer-type-def type-id='type-id-1813' size-in-bits='64' id='type-id-3031'/>
+      <pointer-type-def type-id='type-id-1992' size-in-bits='64' id='type-id-1683'/>
+      <pointer-type-def type-id='type-id-3032' size-in-bits='64' id='type-id-1980'/>
+      <pointer-type-def type-id='type-id-1919' size-in-bits='64' id='type-id-1680'/>
+      <pointer-type-def type-id='type-id-1808' size-in-bits='64' id='type-id-3033'/>
+      <pointer-type-def type-id='type-id-1805' size-in-bits='64' id='type-id-1824'/>
+      <pointer-type-def type-id='type-id-2228' size-in-bits='64' id='type-id-2246'/>
+      <pointer-type-def type-id='type-id-1052' size-in-bits='64' id='type-id-2287'/>
+      <pointer-type-def type-id='type-id-1053' size-in-bits='64' id='type-id-2288'/>
+      <pointer-type-def type-id='type-id-1054' size-in-bits='64' id='type-id-1151'/>
+      <pointer-type-def type-id='type-id-1057' size-in-bits='64' id='type-id-2597'/>
+      <pointer-type-def type-id='type-id-1803' size-in-bits='64' id='type-id-1996'/>
+      <pointer-type-def type-id='type-id-1996' size-in-bits='64' id='type-id-3034'/>
+      <pointer-type-def type-id='type-id-1058' size-in-bits='64' id='type-id-2595'/>
+      <pointer-type-def type-id='type-id-1812' size-in-bits='64' id='type-id-3035'/>
+      <pointer-type-def type-id='type-id-1639' size-in-bits='64' id='type-id-914'/>
+      <pointer-type-def type-id='type-id-2084' size-in-bits='64' id='type-id-512'/>
+      <pointer-type-def type-id='type-id-3036' size-in-bits='64' id='type-id-1475'/>
+      <pointer-type-def type-id='type-id-512' size-in-bits='64' id='type-id-921'/>
+      <pointer-type-def type-id='type-id-1274' size-in-bits='64' id='type-id-3037'/>
+      <pointer-type-def type-id='type-id-1060' size-in-bits='64' id='type-id-3038'/>
+      <pointer-type-def type-id='type-id-1061' size-in-bits='64' id='type-id-3039'/>
+      <pointer-type-def type-id='type-id-2007' size-in-bits='64' id='type-id-3040'/>
+      <pointer-type-def type-id='type-id-1062' size-in-bits='64' id='type-id-3041'/>
+      <pointer-type-def type-id='type-id-391' size-in-bits='64' id='type-id-2145'/>
+      <pointer-type-def type-id='type-id-2158' size-in-bits='64' id='type-id-2156'/>
+      <pointer-type-def type-id='type-id-1063' size-in-bits='64' id='type-id-1156'/>
+      <pointer-type-def type-id='type-id-1064' size-in-bits='64' id='type-id-1158'/>
+      <pointer-type-def type-id='type-id-1491' size-in-bits='64' id='type-id-1483'/>
+      <pointer-type-def type-id='type-id-1065' size-in-bits='64' id='type-id-1694'/>
+      <pointer-type-def type-id='type-id-1575' size-in-bits='64' id='type-id-251'/>
+      <pointer-type-def type-id='type-id-1577' size-in-bits='64' id='type-id-693'/>
+      <pointer-type-def type-id='type-id-2128' size-in-bits='64' id='type-id-2121'/>
+      <pointer-type-def type-id='type-id-2120' size-in-bits='64' id='type-id-87'/>
+      <pointer-type-def type-id='type-id-2460' size-in-bits='64' id='type-id-2453'/>
+      <pointer-type-def type-id='type-id-2063' size-in-bits='64' id='type-id-2059'/>
+      <pointer-type-def type-id='type-id-2150' size-in-bits='64' id='type-id-2421'/>
+      <pointer-type-def type-id='type-id-1066' size-in-bits='64' id='type-id-879'/>
+      <pointer-type-def type-id='type-id-1067' size-in-bits='64' id='type-id-237'/>
+      <pointer-type-def type-id='type-id-1068' size-in-bits='64' id='type-id-1299'/>
+      <pointer-type-def type-id='type-id-3042' size-in-bits='64' id='type-id-1318'/>
+      <pointer-type-def type-id='type-id-1069' size-in-bits='64' id='type-id-262'/>
+      <pointer-type-def type-id='type-id-1604' size-in-bits='64' id='type-id-1601'/>
+      <pointer-type-def type-id='type-id-1071' size-in-bits='64' id='type-id-2203'/>
+      <pointer-type-def type-id='type-id-2322' size-in-bits='64' id='type-id-2319'/>
+      <pointer-type-def type-id='type-id-2423' size-in-bits='64' id='type-id-2424'/>
+      <pointer-type-def type-id='type-id-2426' size-in-bits='64' id='type-id-2422'/>
+      <pointer-type-def type-id='type-id-2519' size-in-bits='64' id='type-id-3043'/>
+      <pointer-type-def type-id='type-id-2518' size-in-bits='64' id='type-id-3044'/>
+      <pointer-type-def type-id='type-id-2520' size-in-bits='64' id='type-id-3045'/>
+      <pointer-type-def type-id='type-id-1998' size-in-bits='64' id='type-id-1965'/>
+      <pointer-type-def type-id='type-id-1072' size-in-bits='64' id='type-id-3046'/>
+      <pointer-type-def type-id='type-id-2501' size-in-bits='64' id='type-id-3047'/>
+      <pointer-type-def type-id='type-id-3048' size-in-bits='64' id='type-id-2507'/>
+      <pointer-type-def type-id='type-id-1285' size-in-bits='64' id='type-id-3049'/>
+      <pointer-type-def type-id='type-id-2525' size-in-bits='64' id='type-id-2524'/>
+      <pointer-type-def type-id='type-id-1435' size-in-bits='64' id='type-id-1434'/>
+      <pointer-type-def type-id='type-id-415' size-in-bits='64' id='type-id-1436'/>
+      <pointer-type-def type-id='type-id-1787' size-in-bits='64' id='type-id-1779'/>
+      <pointer-type-def type-id='type-id-422' size-in-bits='64' id='type-id-1236'/>
+      <pointer-type-def type-id='type-id-1073' size-in-bits='64' id='type-id-1502'/>
+      <pointer-type-def type-id='type-id-1074' size-in-bits='64' id='type-id-1525'/>
+      <pointer-type-def type-id='type-id-1075' size-in-bits='64' id='type-id-1536'/>
+      <pointer-type-def type-id='type-id-2144' size-in-bits='64' id='type-id-2155'/>
+      <pointer-type-def type-id='type-id-1507' size-in-bits='64' id='type-id-3050'/>
+      <pointer-type-def type-id='type-id-2407' size-in-bits='64' id='type-id-2403'/>
+      <pointer-type-def type-id='type-id-2244' size-in-bits='64' id='type-id-2247'/>
+      <pointer-type-def type-id='type-id-2238' size-in-bits='64' id='type-id-2258'/>
+      <pointer-type-def type-id='type-id-2257' size-in-bits='64' id='type-id-3051'/>
+      <pointer-type-def type-id='type-id-1076' size-in-bits='64' id='type-id-1530'/>
+      <pointer-type-def type-id='type-id-1924' size-in-bits='64' id='type-id-1921'/>
+      <pointer-type-def type-id='type-id-1923' size-in-bits='64' id='type-id-1920'/>
+      <pointer-type-def type-id='type-id-1077' size-in-bits='64' id='type-id-2265'/>
+      <pointer-type-def type-id='type-id-1078' size-in-bits='64' id='type-id-2266'/>
+      <pointer-type-def type-id='type-id-1079' size-in-bits='64' id='type-id-1522'/>
+      <pointer-type-def type-id='type-id-1080' size-in-bits='64' id='type-id-1549'/>
+      <pointer-type-def type-id='type-id-1800' size-in-bits='64' id='type-id-3052'/>
+      <pointer-type-def type-id='type-id-1926' size-in-bits='64' id='type-id-1681'/>
+      <pointer-type-def type-id='type-id-738' size-in-bits='64' id='type-id-2283'/>
+      <pointer-type-def type-id='type-id-1081' size-in-bits='64' id='type-id-2306'/>
+      <pointer-type-def type-id='type-id-1082' size-in-bits='64' id='type-id-2305'/>
+      <pointer-type-def type-id='type-id-2083' size-in-bits='64' id='type-id-918'/>
+      <pointer-type-def type-id='type-id-1497' size-in-bits='64' id='type-id-1543'/>
+      <pointer-type-def type-id='type-id-1498' size-in-bits='64' id='type-id-1548'/>
+      <pointer-type-def type-id='type-id-1084' size-in-bits='64' id='type-id-1763'/>
+      <pointer-type-def type-id='type-id-1085' size-in-bits='64' id='type-id-2371'/>
+      <pointer-type-def type-id='type-id-386' size-in-bits='64' id='type-id-3053'/>
+      <pointer-type-def type-id='type-id-1086' size-in-bits='64' id='type-id-2269'/>
+      <pointer-type-def type-id='type-id-1445' size-in-bits='64' id='type-id-88'/>
+      <pointer-type-def type-id='type-id-1087' size-in-bits='64' id='type-id-1695'/>
+      <pointer-type-def type-id='type-id-2082' size-in-bits='64' id='type-id-920'/>
+      <pointer-type-def type-id='type-id-2502' size-in-bits='64' id='type-id-3054'/>
+      <pointer-type-def type-id='type-id-1362' size-in-bits='64' id='type-id-3055'/>
+      <pointer-type-def type-id='type-id-2361' size-in-bits='64' id='type-id-1515'/>
+      <pointer-type-def type-id='type-id-2378' size-in-bits='64' id='type-id-1526'/>
+      <pointer-type-def type-id='type-id-2352' size-in-bits='64' id='type-id-1514'/>
+      <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-3056'/>
+      <pointer-type-def type-id='type-id-1751' size-in-bits='64' id='type-id-1766'/>
+      <pointer-type-def type-id='type-id-3057' size-in-bits='64' id='type-id-1963'/>
+      <pointer-type-def type-id='type-id-1766' size-in-bits='64' id='type-id-3058'/>
+      <pointer-type-def type-id='type-id-1088' size-in-bits='64' id='type-id-1646'/>
+      <pointer-type-def type-id='type-id-1646' size-in-bits='64' id='type-id-2226'/>
+      <pointer-type-def type-id='type-id-1169' size-in-bits='64' id='type-id-2605'/>
+      <pointer-type-def type-id='type-id-2604' size-in-bits='64' id='type-id-1220'/>
+      <pointer-type-def type-id='type-id-247' size-in-bits='64' id='type-id-486'/>
+      <pointer-type-def type-id='type-id-1089' size-in-bits='64' id='type-id-2046'/>
+      <pointer-type-def type-id='type-id-1346' size-in-bits='64' id='type-id-28'/>
+      <pointer-type-def type-id='type-id-1090' size-in-bits='64' id='type-id-3059'/>
+      <pointer-type-def type-id='type-id-1797' size-in-bits='64' id='type-id-1784'/>
+      <pointer-type-def type-id='type-id-1091' size-in-bits='64' id='type-id-1499'/>
+      <pointer-type-def type-id='type-id-1493' size-in-bits='64' id='type-id-431'/>
+      <pointer-type-def type-id='type-id-2360' size-in-bits='64' id='type-id-2356'/>
+      <pointer-type-def type-id='type-id-1956' size-in-bits='64' id='type-id-3060'/>
+      <pointer-type-def type-id='type-id-1959' size-in-bits='64' id='type-id-1958'/>
+      <pointer-type-def type-id='type-id-3061' size-in-bits='64' id='type-id-1988'/>
+      <pointer-type-def type-id='type-id-1957' size-in-bits='64' id='type-id-1936'/>
+      <pointer-type-def type-id='type-id-1933' size-in-bits='64' id='type-id-1930'/>
+      <pointer-type-def type-id='type-id-1937' size-in-bits='64' id='type-id-3062'/>
+      <pointer-type-def type-id='type-id-1092' size-in-bits='64' id='type-id-3063'/>
+      <pointer-type-def type-id='type-id-1994' size-in-bits='64' id='type-id-3064'/>
+      <pointer-type-def type-id='type-id-1094' size-in-bits='64' id='type-id-2233'/>
+      <pointer-type-def type-id='type-id-2213' size-in-bits='64' id='type-id-2204'/>
+      <pointer-type-def type-id='type-id-1799' size-in-bits='64' id='type-id-1785'/>
+      <pointer-type-def type-id='type-id-417' size-in-bits='64' id='type-id-3065'/>
+      <pointer-type-def type-id='type-id-1550' size-in-bits='64' id='type-id-1561'/>
+      <pointer-type-def type-id='type-id-1570' size-in-bits='64' id='type-id-1568'/>
+      <pointer-type-def type-id='type-id-355' size-in-bits='64' id='type-id-3066'/>
+      <pointer-type-def type-id='type-id-1095' size-in-bits='64' id='type-id-1675'/>
+      <pointer-type-def type-id='type-id-1096' size-in-bits='64' id='type-id-3067'/>
+      <pointer-type-def type-id='type-id-3067' size-in-bits='64' id='type-id-1389'/>
+      <pointer-type-def type-id='type-id-1097' size-in-bits='64' id='type-id-3068'/>
+      <pointer-type-def type-id='type-id-3068' size-in-bits='64' id='type-id-1388'/>
+      <pointer-type-def type-id='type-id-2469' size-in-bits='64' id='type-id-883'/>
+      <qualified-type-def type-id='type-id-883' const='yes' id='type-id-2467'/>
+      <pointer-type-def type-id='type-id-2472' size-in-bits='64' id='type-id-2471'/>
+      <pointer-type-def type-id='type-id-2468' size-in-bits='64' id='type-id-1386'/>
+      <pointer-type-def type-id='type-id-1098' size-in-bits='64' id='type-id-2357'/>
+      <pointer-type-def type-id='type-id-1099' size-in-bits='64' id='type-id-2354'/>
+      <pointer-type-def type-id='type-id-3069' size-in-bits='64' id='type-id-2556'/>
+      <pointer-type-def type-id='type-id-3070' size-in-bits='64' id='type-id-1461'/>
+      <pointer-type-def type-id='type-id-3071' size-in-bits='64' id='type-id-1421'/>
+      <pointer-type-def type-id='type-id-3072' size-in-bits='64' id='type-id-1915'/>
+      <pointer-type-def type-id='type-id-3073' size-in-bits='64' id='type-id-2166'/>
+      <pointer-type-def type-id='type-id-3074' size-in-bits='64' id='type-id-2168'/>
+      <pointer-type-def type-id='type-id-3075' size-in-bits='64' id='type-id-1710'/>
+      <pointer-type-def type-id='type-id-3076' size-in-bits='64' id='type-id-2591'/>
+      <pointer-type-def type-id='type-id-3077' size-in-bits='64' id='type-id-2103'/>
+      <pointer-type-def type-id='type-id-3078' size-in-bits='64' id='type-id-2133'/>
+      <pointer-type-def type-id='type-id-3079' size-in-bits='64' id='type-id-2071'/>
+      <pointer-type-def type-id='type-id-3080' size-in-bits='64' id='type-id-2075'/>
+      <pointer-type-def type-id='type-id-3081' size-in-bits='64' id='type-id-2588'/>
+      <pointer-type-def type-id='type-id-3082' size-in-bits='64' id='type-id-1558'/>
+      <pointer-type-def type-id='type-id-3083' size-in-bits='64' id='type-id-2552'/>
+      <pointer-type-def type-id='type-id-3084' size-in-bits='64' id='type-id-1728'/>
+      <pointer-type-def type-id='type-id-3085' size-in-bits='64' id='type-id-1701'/>
+      <pointer-type-def type-id='type-id-3086' size-in-bits='64' id='type-id-1700'/>
+      <pointer-type-def type-id='type-id-3087' size-in-bits='64' id='type-id-2349'/>
+      <pointer-type-def type-id='type-id-3088' size-in-bits='64' id='type-id-2097'/>
+      <pointer-type-def type-id='type-id-3089' size-in-bits='64' id='type-id-2192'/>
+      <pointer-type-def type-id='type-id-3090' size-in-bits='64' id='type-id-2196'/>
+      <pointer-type-def type-id='type-id-3091' size-in-bits='64' id='type-id-2199'/>
+      <pointer-type-def type-id='type-id-3092' size-in-bits='64' id='type-id-1330'/>
+      <pointer-type-def type-id='type-id-3093' size-in-bits='64' id='type-id-2553'/>
+      <pointer-type-def type-id='type-id-3094' size-in-bits='64' id='type-id-2554'/>
+      <pointer-type-def type-id='type-id-3095' size-in-bits='64' id='type-id-2038'/>
+      <pointer-type-def type-id='type-id-3096' size-in-bits='64' id='type-id-2567'/>
+      <pointer-type-def type-id='type-id-3097' size-in-bits='64' id='type-id-2564'/>
+      <pointer-type-def type-id='type-id-3098' size-in-bits='64' id='type-id-2571'/>
+      <pointer-type-def type-id='type-id-3099' size-in-bits='64' id='type-id-1460'/>
+      <pointer-type-def type-id='type-id-3100' size-in-bits='64' id='type-id-2101'/>
+      <pointer-type-def type-id='type-id-3101' size-in-bits='64' id='type-id-1417'/>
+      <pointer-type-def type-id='type-id-3102' size-in-bits='64' id='type-id-1418'/>
+      <pointer-type-def type-id='type-id-3103' size-in-bits='64' id='type-id-2431'/>
+      <pointer-type-def type-id='type-id-3104' size-in-bits='64' id='type-id-2432'/>
+      <pointer-type-def type-id='type-id-3105' size-in-bits='64' id='type-id-2566'/>
+      <pointer-type-def type-id='type-id-3106' size-in-bits='64' id='type-id-2488'/>
+      <pointer-type-def type-id='type-id-3107' size-in-bits='64' id='type-id-2489'/>
+      <pointer-type-def type-id='type-id-3108' size-in-bits='64' id='type-id-1769'/>
+      <pointer-type-def type-id='type-id-3109' size-in-bits='64' id='type-id-1702'/>
+      <pointer-type-def type-id='type-id-3110' size-in-bits='64' id='type-id-1978'/>
+      <pointer-type-def type-id='type-id-3111' size-in-bits='64' id='type-id-1268'/>
+      <pointer-type-def type-id='type-id-3112' size-in-bits='64' id='type-id-1843'/>
+      <pointer-type-def type-id='type-id-3113' size-in-bits='64' id='type-id-1269'/>
+      <pointer-type-def type-id='type-id-3114' size-in-bits='64' id='type-id-2255'/>
+      <pointer-type-def type-id='type-id-3115' size-in-bits='64' id='type-id-2348'/>
+      <pointer-type-def type-id='type-id-3116' size-in-bits='64' id='type-id-2034'/>
+      <pointer-type-def type-id='type-id-3117' size-in-bits='64' id='type-id-2035'/>
+      <pointer-type-def type-id='type-id-3118' size-in-bits='64' id='type-id-1469'/>
+      <pointer-type-def type-id='type-id-3119' size-in-bits='64' id='type-id-1470'/>
+      <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-1565'/>
+      <pointer-type-def type-id='type-id-3120' size-in-bits='64' id='type-id-2274'/>
+      <pointer-type-def type-id='type-id-40' size-in-bits='64' id='type-id-1508'/>
+      <pointer-type-def type-id='type-id-214' size-in-bits='64' id='type-id-3121'/>
+      <pointer-type-def type-id='type-id-1612' size-in-bits='64' id='type-id-1578'/>
+      <pointer-type-def type-id='type-id-2216' size-in-bits='64' id='type-id-2207'/>
+      <pointer-type-def type-id='type-id-1100' size-in-bits='64' id='type-id-3122'/>
+      <pointer-type-def type-id='type-id-1101' size-in-bits='64' id='type-id-1647'/>
+      <pointer-type-def type-id='type-id-1185' size-in-bits='64' id='type-id-1586'/>
+      <pointer-type-def type-id='type-id-329' size-in-bits='64' id='type-id-874'/>
+      <pointer-type-def type-id='type-id-216' size-in-bits='64' id='type-id-256'/>
+      <pointer-type-def type-id='type-id-3123' size-in-bits='64' id='type-id-2194'/>
+      <pointer-type-def type-id='type-id-3124' size-in-bits='64' id='type-id-2273'/>
+      <pointer-type-def type-id='type-id-3125' size-in-bits='64' id='type-id-1221'/>
+      <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-482'/>
+      <pointer-type-def type-id='type-id-3126' size-in-bits='64' id='type-id-1984'/>
+      <pointer-type-def type-id='type-id-3127' size-in-bits='64' id='type-id-1989'/>
+      <pointer-type-def type-id='type-id-3128' size-in-bits='64' id='type-id-1482'/>
+      <pointer-type-def type-id='type-id-3129' size-in-bits='64' id='type-id-2587'/>
+      <pointer-type-def type-id='type-id-3130' size-in-bits='64' id='type-id-2544'/>
+      <pointer-type-def type-id='type-id-3131' size-in-bits='64' id='type-id-1472'/>
+      <pointer-type-def type-id='type-id-16' size-in-bits='64' id='type-id-45'/>
+      <pointer-type-def type-id='type-id-1102' size-in-bits='64' id='type-id-2402'/>
+      <pointer-type-def type-id='type-id-2399' size-in-bits='64' id='type-id-1537'/>
+      <pointer-type-def type-id='type-id-1580' size-in-bits='64' id='type-id-915'/>
+      <pointer-type-def type-id='type-id-1636' size-in-bits='64' id='type-id-1229'/>
+      <pointer-type-def type-id='type-id-1103' size-in-bits='64' id='type-id-1640'/>
+      <pointer-type-def type-id='type-id-1104' size-in-bits='64' id='type-id-1282'/>
+      <pointer-type-def type-id='type-id-3132' size-in-bits='64' id='type-id-2540'/>
+      <pointer-type-def type-id='type-id-1476' size-in-bits='64' id='type-id-1207'/>
+      <pointer-type-def type-id='type-id-2420' size-in-bits='64' id='type-id-3133'/>
+      <pointer-type-def type-id='type-id-2408' size-in-bits='64' id='type-id-1538'/>
+      <pointer-type-def type-id='type-id-2369' size-in-bits='64' id='type-id-1390'/>
+      <pointer-type-def type-id='type-id-3134' size-in-bits='64' id='type-id-1973'/>
+      <pointer-type-def type-id='type-id-3135' size-in-bits='64' id='type-id-1987'/>
+      <pointer-type-def type-id='type-id-3136' size-in-bits='64' id='type-id-1977'/>
+      <pointer-type-def type-id='type-id-3137' size-in-bits='64' id='type-id-1983'/>
+      <pointer-type-def type-id='type-id-3138' size-in-bits='64' id='type-id-1262'/>
+      <pointer-type-def type-id='type-id-3139' size-in-bits='64' id='type-id-1261'/>
+      <pointer-type-def type-id='type-id-3140' size-in-bits='64' id='type-id-1270'/>
+      <pointer-type-def type-id='type-id-3141' size-in-bits='64' id='type-id-89'/>
+      <pointer-type-def type-id='type-id-3142' size-in-bits='64' id='type-id-2338'/>
+      <pointer-type-def type-id='type-id-3143' size-in-bits='64' id='type-id-2339'/>
+      <pointer-type-def type-id='type-id-3144' size-in-bits='64' id='type-id-2342'/>
+      <pointer-type-def type-id='type-id-3145' size-in-bits='64' id='type-id-2182'/>
+      <pointer-type-def type-id='type-id-3146' size-in-bits='64' id='type-id-2282'/>
+      <pointer-type-def type-id='type-id-3147' size-in-bits='64' id='type-id-2543'/>
+      <pointer-type-def type-id='type-id-3148' size-in-bits='64' id='type-id-1609'/>
+      <pointer-type-def type-id='type-id-3149' size-in-bits='64' id='type-id-2537'/>
+      <pointer-type-def type-id='type-id-3150' size-in-bits='64' id='type-id-2538'/>
+      <pointer-type-def type-id='type-id-3151' size-in-bits='64' id='type-id-2026'/>
+      <pointer-type-def type-id='type-id-3152' size-in-bits='64' id='type-id-2185'/>
+      <pointer-type-def type-id='type-id-3153' size-in-bits='64' id='type-id-2077'/>
+      <pointer-type-def type-id='type-id-3154' size-in-bits='64' id='type-id-2074'/>
+      <pointer-type-def type-id='type-id-3155' size-in-bits='64' id='type-id-2065'/>
+      <pointer-type-def type-id='type-id-3156' size-in-bits='64' id='type-id-2076'/>
+      <pointer-type-def type-id='type-id-3157' size-in-bits='64' id='type-id-2072'/>
+      <pointer-type-def type-id='type-id-3158' size-in-bits='64' id='type-id-2060'/>
+      <pointer-type-def type-id='type-id-3159' size-in-bits='64' id='type-id-2068'/>
+      <pointer-type-def type-id='type-id-3160' size-in-bits='64' id='type-id-2078'/>
+      <pointer-type-def type-id='type-id-3161' size-in-bits='64' id='type-id-2506'/>
+      <pointer-type-def type-id='type-id-3162' size-in-bits='64' id='type-id-2275'/>
+      <pointer-type-def type-id='type-id-3163' size-in-bits='64' id='type-id-2276'/>
+      <pointer-type-def type-id='type-id-3164' size-in-bits='64' id='type-id-2279'/>
+      <pointer-type-def type-id='type-id-3165' size-in-bits='64' id='type-id-2278'/>
+      <pointer-type-def type-id='type-id-3166' size-in-bits='64' id='type-id-2108'/>
+      <pointer-type-def type-id='type-id-3167' size-in-bits='64' id='type-id-2584'/>
+      <pointer-type-def type-id='type-id-3168' size-in-bits='64' id='type-id-2583'/>
+      <pointer-type-def type-id='type-id-3169' size-in-bits='64' id='type-id-2593'/>
+      <pointer-type-def type-id='type-id-3170' size-in-bits='64' id='type-id-2165'/>
+      <pointer-type-def type-id='type-id-3171' size-in-bits='64' id='type-id-1914'/>
+      <pointer-type-def type-id='type-id-3172' size-in-bits='64' id='type-id-2241'/>
+      <pointer-type-def type-id='type-id-3173' size-in-bits='64' id='type-id-2240'/>
+      <pointer-type-def type-id='type-id-3174' size-in-bits='64' id='type-id-2475'/>
+      <pointer-type-def type-id='type-id-3175' size-in-bits='64' id='type-id-2476'/>
+      <pointer-type-def type-id='type-id-3176' size-in-bits='64' id='type-id-1459'/>
+      <pointer-type-def type-id='type-id-3177' size-in-bits='64' id='type-id-2110'/>
+      <pointer-type-def type-id='type-id-3178' size-in-bits='64' id='type-id-1410'/>
+      <pointer-type-def type-id='type-id-3179' size-in-bits='64' id='type-id-1415'/>
+      <pointer-type-def type-id='type-id-3180' size-in-bits='64' id='type-id-2327'/>
+      <pointer-type-def type-id='type-id-3181' size-in-bits='64' id='type-id-2435'/>
+      <pointer-type-def type-id='type-id-3182' size-in-bits='64' id='type-id-2433'/>
+      <pointer-type-def type-id='type-id-3183' size-in-bits='64' id='type-id-1689'/>
+      <pointer-type-def type-id='type-id-3184' size-in-bits='64' id='type-id-1863'/>
+      <pointer-type-def type-id='type-id-3185' size-in-bits='64' id='type-id-1839'/>
+      <pointer-type-def type-id='type-id-3186' size-in-bits='64' id='type-id-1849'/>
+      <pointer-type-def type-id='type-id-3187' size-in-bits='64' id='type-id-1840'/>
+      <pointer-type-def type-id='type-id-3188' size-in-bits='64' id='type-id-1847'/>
+      <pointer-type-def type-id='type-id-3189' size-in-bits='64' id='type-id-1854'/>
+      <pointer-type-def type-id='type-id-3190' size-in-bits='64' id='type-id-1851'/>
+      <pointer-type-def type-id='type-id-3191' size-in-bits='64' id='type-id-1841'/>
+      <pointer-type-def type-id='type-id-3192' size-in-bits='64' id='type-id-1703'/>
+      <pointer-type-def type-id='type-id-3193' size-in-bits='64' id='type-id-2191'/>
+      <pointer-type-def type-id='type-id-3194' size-in-bits='64' id='type-id-1731'/>
+      <pointer-type-def type-id='type-id-3195' size-in-bits='64' id='type-id-1709'/>
+      <pointer-type-def type-id='type-id-3196' size-in-bits='64' id='type-id-1844'/>
+      <pointer-type-def type-id='type-id-3197' size-in-bits='64' id='type-id-1852'/>
+      <pointer-type-def type-id='type-id-3198' size-in-bits='64' id='type-id-1740'/>
+      <pointer-type-def type-id='type-id-3199' size-in-bits='64' id='type-id-1742'/>
+      <pointer-type-def type-id='type-id-3200' size-in-bits='64' id='type-id-2100'/>
+      <pointer-type-def type-id='type-id-3201' size-in-bits='64' id='type-id-2105'/>
+      <pointer-type-def type-id='type-id-3202' size-in-bits='64' id='type-id-2098'/>
+      <pointer-type-def type-id='type-id-3203' size-in-bits='64' id='type-id-2152'/>
+      <pointer-type-def type-id='type-id-2157' size-in-bits='64' id='type-id-2146'/>
+      <pointer-type-def type-id='type-id-3204' size-in-bits='64' id='type-id-2132'/>
+      <pointer-type-def type-id='type-id-3205' size-in-bits='64' id='type-id-2570'/>
+      <pointer-type-def type-id='type-id-3206' size-in-bits='64' id='type-id-1452'/>
+      <pointer-type-def type-id='type-id-3207' size-in-bits='64' id='type-id-1768'/>
+      <pointer-type-def type-id='type-id-3208' size-in-bits='64' id='type-id-1368'/>
+      <pointer-type-def type-id='type-id-3209' size-in-bits='64' id='type-id-2344'/>
+      <pointer-type-def type-id='type-id-3210' size-in-bits='64' id='type-id-1945'/>
+      <pointer-type-def type-id='type-id-3211' size-in-bits='64' id='type-id-1949'/>
+      <pointer-type-def type-id='type-id-3212' size-in-bits='64' id='type-id-2005'/>
+      <pointer-type-def type-id='type-id-3213' size-in-bits='64' id='type-id-2589'/>
+      <pointer-type-def type-id='type-id-3214' size-in-bits='64' id='type-id-2437'/>
+      <pointer-type-def type-id='type-id-3215' size-in-bits='64' id='type-id-1466'/>
+      <pointer-type-def type-id='type-id-3216' size-in-bits='64' id='type-id-1471'/>
+      <pointer-type-def type-id='type-id-3217' size-in-bits='64' id='type-id-517'/>
+      <pointer-type-def type-id='type-id-3218' size-in-bits='64' id='type-id-1951'/>
+      <pointer-type-def type-id='type-id-533' size-in-bits='64' id='type-id-2485'/>
+      <pointer-type-def type-id='type-id-3219' size-in-bits='64' id='type-id-1589'/>
+      <pointer-type-def type-id='type-id-3220' size-in-bits='64' id='type-id-1367'/>
+      <pointer-type-def type-id='type-id-3221' size-in-bits='64' id='type-id-1267'/>
+      <pointer-type-def type-id='type-id-3222' size-in-bits='64' id='type-id-1264'/>
+      <pointer-type-def type-id='type-id-3223' size-in-bits='64' id='type-id-2167'/>
+      <pointer-type-def type-id='type-id-3224' size-in-bits='64' id='type-id-2184'/>
+      <pointer-type-def type-id='type-id-3225' size-in-bits='64' id='type-id-2067'/>
+      <pointer-type-def type-id='type-id-3226' size-in-bits='64' id='type-id-1414'/>
+      <pointer-type-def type-id='type-id-3227' size-in-bits='64' id='type-id-1952'/>
+      <pointer-type-def type-id='type-id-3228' size-in-bits='64' id='type-id-1741'/>
+      <pointer-type-def type-id='type-id-3229' size-in-bits='64' id='type-id-1451'/>
+      <pointer-type-def type-id='type-id-3230' size-in-bits='64' id='type-id-1453'/>
+      <pointer-type-def type-id='type-id-3231' size-in-bits='64' id='type-id-1422'/>
+      <pointer-type-def type-id='type-id-3232' size-in-bits='64' id='type-id-1946'/>
+      <pointer-type-def type-id='type-id-3233' size-in-bits='64' id='type-id-2484'/>
+      <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-528'/>
+      <qualified-type-def type-id='type-id-192' volatile='yes' id='type-id-1495'/>
+      <pointer-type-def type-id='type-id-225' size-in-bits='64' id='type-id-881'/>
+      <pointer-type-def type-id='type-id-1105' size-in-bits='64' id='type-id-2056'/>
+      <pointer-type-def type-id='type-id-1520' size-in-bits='64' id='type-id-2372'/>
+      <pointer-type-def type-id='type-id-2062' size-in-bits='64' id='type-id-2055'/>
+      <pointer-type-def type-id='type-id-1106' size-in-bits='64' id='type-id-1678'/>
+      <pointer-type-def type-id='type-id-255' size-in-bits='64' id='type-id-3234'/>
+      <pointer-type-def type-id='type-id-1107' size-in-bits='64' id='type-id-654'/>
+      <pointer-type-def type-id='type-id-1108' size-in-bits='64' id='type-id-1679'/>
+      <pointer-type-def type-id='type-id-1109' size-in-bits='64' id='type-id-3235'/>
+      <pointer-type-def type-id='type-id-1835' size-in-bits='64' id='type-id-3236'/>
+      <pointer-type-def type-id='type-id-3236' size-in-bits='64' id='type-id-3237'/>
+      <pointer-type-def type-id='type-id-1111' size-in-bits='64' id='type-id-1834'/>
+      <pointer-type-def type-id='type-id-1112' size-in-bits='64' id='type-id-2417'/>
+      <pointer-type-def type-id='type-id-2003' size-in-bits='64' id='type-id-1686'/>
+      <pointer-type-def type-id='type-id-2004' size-in-bits='64' id='type-id-1214'/>
+      <pointer-type-def type-id='type-id-1113' size-in-bits='64' id='type-id-2229'/>
+      <function-decl name='arch_bpf_jit_check_func' mangled-name='arch_bpf_jit_check_func' filepath='arch/arm64/net/bpf_jit_comp.c' line='954' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='arch_bpf_jit_check_func'>
+        <parameter type-id='type-id-2635' name='prog' filepath='arch/arm64/net/bpf_jit_comp.c' line='954' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-2606'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-1685'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2613'>
+        <parameter type-id='type-id-2611'/>
+        <return type-id='type-id-1230'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2615'>
+        <parameter type-id='type-id-365'/>
+        <return type-id='type-id-365'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2617'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-2'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2618'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-874'/>
+        <return type-id='type-id-2'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2619'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-874'/>
+        <parameter type-id='type-id-3017'/>
+        <parameter type-id='type-id-3010'/>
+        <return type-id='type-id-2'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2640'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-2734'/>
+        <return type-id='type-id-4'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2641'>
+        <parameter type-id='type-id-1393'/>
+        <parameter type-id='type-id-379'/>
+        <return type-id='type-id-4'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2643'>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-4'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2686'>
+        <parameter type-id='type-id-379'/>
+        <return type-id='type-id-2183'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2733'>
+        <parameter type-id='type-id-1595'/>
+        <return type-id='type-id-1596'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2735'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-2671'/>
+        <return type-id='type-id-23'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2736'>
+        <parameter type-id='type-id-1347'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-23'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2737'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-23'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2738'>
+        <parameter type-id='type-id-1282'/>
+        <parameter type-id='type-id-1347'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-23'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2743'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-2742'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2745'>
+        <parameter type-id='type-id-1127'/>
+        <return type-id='type-id-2744'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2747'>
+        <parameter type-id='type-id-2746'/>
+        <return type-id='type-id-2746'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2748'>
+        <parameter type-id='type-id-2746'/>
+        <parameter type-id='type-id-511'/>
+        <return type-id='type-id-2746'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2750'>
+        <parameter type-id='type-id-1556'/>
+        <return type-id='type-id-1553'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2773'>
+        <parameter type-id='type-id-2179'/>
+        <return type-id='type-id-2023'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2774'>
+        <parameter type-id='type-id-2179'/>
+        <parameter type-id='type-id-4'/>
+        <return type-id='type-id-2023'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2775'>
+        <parameter type-id='type-id-2179'/>
+        <parameter type-id='type-id-2023'/>
+        <return type-id='type-id-2023'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2776'>
+        <parameter type-id='type-id-2023'/>
+        <return type-id='type-id-2023'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2786'>
+        <parameter type-id='type-id-28'/>
+        <return type-id='type-id-1127'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2787'>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2788'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-2778'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2789'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-1996'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2790'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2791'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-45'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2792'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2793'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2794'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-2607'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2795'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-2778'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2796'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-3064'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2797'>
+        <parameter type-id='type-id-1279'/>
+        <parameter type-id='type-id-512'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2798'>
+        <parameter type-id='type-id-1279'/>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-2134'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2799'>
+        <parameter type-id='type-id-1279'/>
+        <parameter type-id='type-id-3235'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2800'>
+        <parameter type-id='type-id-2611'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2801'>
+        <parameter type-id='type-id-1230'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2802'>
+        <parameter type-id='type-id-1230'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2803'>
+        <parameter type-id='type-id-1230'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2804'>
+        <parameter type-id='type-id-1819'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2805'>
+        <parameter type-id='type-id-1819'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2806'>
+        <parameter type-id='type-id-1819'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2807'>
+        <parameter type-id='type-id-1228'/>
+        <parameter type-id='type-id-2627'/>
+        <parameter type-id='type-id-2611'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2808'>
+        <parameter type-id='type-id-2614'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2809'>
+        <parameter type-id='type-id-365'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2810'>
+        <parameter type-id='type-id-365'/>
+        <parameter type-id='type-id-2345'/>
+        <parameter type-id='type-id-1546'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2811'>
+        <parameter type-id='type-id-365'/>
+        <parameter type-id='type-id-2345'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2812'>
+        <parameter type-id='type-id-2616'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2813'>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-2677'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2814'>
+        <parameter type-id='type-id-2631'/>
+        <parameter type-id='type-id-2639'/>
+        <parameter type-id='type-id-2639'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2815'>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-2677'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2816'>
+        <parameter type-id='type-id-2646'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2817'>
+        <parameter type-id='type-id-2646'/>
+        <parameter type-id='type-id-3049'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2818'>
+        <parameter type-id='type-id-2646'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-2711'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2819'>
+        <parameter type-id='type-id-2179'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-1387'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2820'>
+        <parameter type-id='type-id-2179'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-2777'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2821'>
+        <parameter type-id='type-id-2179'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2822'>
+        <parameter type-id='type-id-2179'/>
+        <parameter type-id='type-id-240'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2823'>
+        <parameter type-id='type-id-2179'/>
+        <parameter type-id='type-id-2772'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2824'>
+        <parameter type-id='type-id-2694'/>
+        <parameter type-id='type-id-2779'/>
+        <parameter type-id='type-id-924'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2825'>
+        <parameter type-id='type-id-2696'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2826'>
+        <parameter type-id='type-id-2707'/>
+        <parameter type-id='type-id-3015'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2827'>
+        <parameter type-id='type-id-2707'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2828'>
+        <parameter type-id='type-id-2719'/>
+        <parameter type-id='type-id-256'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-1603'>
+        <parameter type-id='type-id-1594'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-3056'/>
+        <parameter type-id='type-id-85'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2829'>
+        <parameter type-id='type-id-1583'/>
+        <parameter type-id='type-id-1594'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2830'>
+        <parameter type-id='type-id-1596'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2831'>
+        <parameter type-id='type-id-23'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2832'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2833'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-2780'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2834'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-23'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2835'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-3016'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2836'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2837'>
+        <parameter type-id='type-id-240'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2838'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-2011'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2839'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-3012'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2840'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-918'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2159'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2841'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-920'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2842'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-2081'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2843'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-2053'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2844'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2845'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-1207'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2846'>
+        <parameter type-id='type-id-2740'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-40'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2847'>
+        <parameter type-id='type-id-2742'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2848'>
+        <parameter type-id='type-id-2749'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-1955'>
+        <parameter type-id='type-id-1804'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2849'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-1279'/>
+        <parameter type-id='type-id-877'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2850'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-1279'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-921'/>
+        <parameter type-id='type-id-528'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2851'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-1279'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2852'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-2740'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2853'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2578'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2854'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-379'/>
+        <parameter type-id='type-id-2609'/>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2855'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-192'/>
+        <parameter type-id='type-id-2771'/>
+        <parameter type-id='type-id-528'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2856'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-512'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2857'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-2576'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2858'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2859'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2860'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2861'>
+        <parameter type-id='type-id-2578'/>
+        <parameter type-id='type-id-2578'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2862'>
+        <parameter type-id='type-id-2578'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2863'>
+        <parameter type-id='type-id-2578'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-877'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2864'>
+        <parameter type-id='type-id-1127'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2865'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-23'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2866'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-4'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2867'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-329'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2868'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2869'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-329'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2870'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-329'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2871'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-329'/>
+        <parameter type-id='type-id-269'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2872'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-2770'/>
+        <parameter type-id='type-id-40'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2873'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-83'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2874'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2875'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-3013'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2876'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-1299'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2877'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-3047'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2878'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-3066'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2879'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-3235'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2880'>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2881'>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2882'>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2883'>
+        <parameter type-id='type-id-1395'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2884'>
+        <parameter type-id='type-id-1395'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-329'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2885'>
+        <parameter type-id='type-id-1395'/>
+        <parameter type-id='type-id-1395'/>
+        <parameter type-id='type-id-4'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2886'>
+        <parameter type-id='type-id-3009'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2887'>
+        <parameter type-id='type-id-3009'/>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2888'>
+        <parameter type-id='type-id-1430'/>
+        <parameter type-id='type-id-666'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2889'>
+        <parameter type-id='type-id-1354'/>
+        <parameter type-id='type-id-2684'/>
+        <parameter type-id='type-id-2682'/>
+        <parameter type-id='type-id-1354'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2890'>
+        <parameter type-id='type-id-1393'/>
+        <parameter type-id='type-id-379'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2892'>
+        <parameter type-id='type-id-1393'/>
+        <parameter type-id='type-id-379'/>
+        <parameter type-id='type-id-3012'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2894'>
+        <parameter type-id='type-id-260'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2895'>
+        <parameter type-id='type-id-3023'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-878'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2896'>
+        <parameter type-id='type-id-3023'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-878'/>
+        <parameter type-id='type-id-688'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2897'>
+        <parameter type-id='type-id-1643'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2898'>
+        <parameter type-id='type-id-1643'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1930'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-528'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2899'>
+        <parameter type-id='type-id-1643'/>
+        <parameter type-id='type-id-1646'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2900'>
+        <parameter type-id='type-id-1643'/>
+        <parameter type-id='type-id-1930'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-3064'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2901'>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2902'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2903'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2657'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2904'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2660'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2905'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2719'/>
+        <parameter type-id='type-id-688'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2906'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2726'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-2727'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2907'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2726'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-2727'/>
+        <parameter type-id='type-id-1565'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2908'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1884'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2909'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1804'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2910'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2751'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2911'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2752'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2912'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2753'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2913'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2755'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2914'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2755'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2915'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2756'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2916'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2757'/>
+        <parameter type-id='type-id-3121'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2917'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2758'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2918'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2759'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2919'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2760'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2920'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2761'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2921'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2762'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2922'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2764'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2923'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2765'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2924'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2765'/>
+        <parameter type-id='type-id-1565'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2925'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2768'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2926'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2769'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2927'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2783'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2928'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2784'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2929'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2930'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2781'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2931'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2782'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2932'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2933'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2934'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-3034'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2935'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2936'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2937'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-688'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-924'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2938'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2939'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-40'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2940'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-3121'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2941'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-3237'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2942'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3024'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2943'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3025'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2944'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2945'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2946'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2947'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3030'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2948'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3031'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2949'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2950'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3035'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2951'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2952'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-924'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2953'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2954'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2955'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2956'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-2753'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2957'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1565'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2958'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1565'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-3121'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2959'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1565'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2960'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2961'>
+        <parameter type-id='type-id-3033'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2962'>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2963'>
+        <parameter type-id='type-id-512'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2964'>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-485'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2965'>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2966'>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-3235'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2967'>
+        <parameter type-id='type-id-87'/>
+        <parameter type-id='type-id-2121'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2968'>
+        <parameter type-id='type-id-3051'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2969'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-365'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2970'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-23'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2971'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-1395'/>
+        <parameter type-id='type-id-1430'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2972'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-1430'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2973'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2974'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-3058'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2975'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-2696'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2976'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-2696'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2977'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-666'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2978'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1941'/>
+        <parameter type-id='type-id-3062'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2979'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1643'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2980'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-312'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2981'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-3033'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2982'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-3033'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2983'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2984'>
+        <parameter type-id='type-id-28'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2986'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2987'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-666'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2988'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2707'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2989'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-3044'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2990'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-3014'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2991'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-3014'/>
+        <parameter type-id='type-id-3043'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2992'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-485'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2993'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-3045'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2985'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-2494'/>
+        <parameter type-id='type-id-3043'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2994'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2995'>
+        <parameter type-id='type-id-3059'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-3053'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2996'>
+        <parameter type-id='type-id-431'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2997'>
+        <parameter type-id='type-id-1930'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2998'>
+        <parameter type-id='type-id-1930'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-3060'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2999'>
+        <parameter type-id='type-id-1930'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-2610'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3000'>
+        <parameter type-id='type-id-1282'/>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-2780'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3001'>
+        <parameter type-id='type-id-1282'/>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3002'>
+        <parameter type-id='type-id-1282'/>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-23'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3003'>
+        <parameter type-id='type-id-1282'/>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-666'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3004'>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3005'>
+        <parameter type-id='type-id-1207'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3006'>
+        <parameter type-id='type-id-1207'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-2705'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-2421'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3007'>
+        <parameter type-id='type-id-1207'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3018'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-763'/>
+        <return type-id='type-id-192'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3019'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-192'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3020'>
+        <parameter type-id='type-id-3050'/>
+        <return type-id='type-id-192'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3021'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-3054'/>
+        <return type-id='type-id-192'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3026'>
+        <parameter type-id='type-id-2655'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-3025'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3027'>
+        <parameter type-id='type-id-2696'/>
+        <return type-id='type-id-1643'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3029'>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-3028'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3032'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-3064'/>
+        <return type-id='type-id-1683'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3036'>
+        <parameter type-id='type-id-1207'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-512'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3042'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-1299'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3048'>
+        <parameter type-id='type-id-1127'/>
+        <return type-id='type-id-3047'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3057'>
+        <parameter type-id='type-id-1685'/>
+        <return type-id='type-id-1766'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3061'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-1958'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3069'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-879'/>
+        <return type-id='type-id-880'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3070'>
+        <parameter type-id='type-id-3009'/>
+        <parameter type-id='type-id-879'/>
+        <return type-id='type-id-880'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3071'>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3072'>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3073'>
+        <parameter type-id='type-id-2179'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3074'>
+        <parameter type-id='type-id-2179'/>
+        <parameter type-id='type-id-4'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3075'>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3076'>
+        <parameter type-id='type-id-2578'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3077'>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-2135'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3078'>
+        <parameter type-id='type-id-87'/>
+        <parameter type-id='type-id-2121'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3079'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-2159'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-2081'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3080'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-99'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-2159'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-2081'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3081'>
+        <parameter type-id='type-id-2576'/>
+        <return type-id='type-id-2576'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3082'>
+        <return type-id='type-id-682'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3083'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-763'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3084'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1666'/>
+        <return type-id='type-id-1666'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3085'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1666'/>
+        <return type-id='type-id-1666'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3086'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-1750'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-1925'>
+        <parameter type-id='type-id-3058'/>
+        <return type-id='type-id-1928'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3087'>
+        <parameter type-id='type-id-365'/>
+        <parameter type-id='type-id-2345'/>
+        <return type-id='type-id-1546'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3088'>
+        <parameter type-id='type-id-1279'/>
+        <parameter type-id='type-id-386'/>
+        <return type-id='type-id-386'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3089'>
+        <parameter type-id='type-id-2696'/>
+        <return type-id='type-id-84'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3090'>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-2696'/>
+        <return type-id='type-id-84'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3091'>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-84'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3092'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3093'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-85'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3094'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-85'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3095'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-379'/>
+        <parameter type-id='type-id-2609'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3096'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-85'/>
+        <parameter type-id='type-id-87'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3097'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-85'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3098'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3099'>
+        <parameter type-id='type-id-3009'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-763'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3100'>
+        <parameter type-id='type-id-3011'/>
+        <parameter type-id='type-id-3008'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3101'>
+        <parameter type-id='type-id-379'/>
+        <parameter type-id='type-id-2608'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3102'>
+        <parameter type-id='type-id-379'/>
+        <parameter type-id='type-id-2608'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3103'>
+        <parameter type-id='type-id-1372'/>
+        <parameter type-id='type-id-3022'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3104'>
+        <parameter type-id='type-id-1372'/>
+        <parameter type-id='type-id-3022'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3105'>
+        <parameter type-id='type-id-87'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-85'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3106'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-763'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3107'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-763'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3108'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-688'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3109'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1770'/>
+        <return type-id='type-id-688'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3110'>
+        <parameter type-id='type-id-1685'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3111'>
+        <parameter type-id='type-id-1230'/>
+        <parameter type-id='type-id-2612'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3112'>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3113'>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3114'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3115'>
+        <parameter type-id='type-id-365'/>
+        <parameter type-id='type-id-2345'/>
+        <return type-id='type-id-40'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3116'>
+        <parameter type-id='type-id-379'/>
+        <parameter type-id='type-id-2608'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-329'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3117'>
+        <parameter type-id='type-id-379'/>
+        <parameter type-id='type-id-2609'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-329'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3118'>
+        <parameter type-id='type-id-3133'/>
+        <return type-id='type-id-2419'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3119'>
+        <parameter type-id='type-id-3133'/>
+        <parameter type-id='type-id-2428'/>
+        <return type-id='type-id-2419'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3120'>
+        <parameter type-id='type-id-2746'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-1565'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3123'>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3124'>
+        <parameter type-id='type-id-2655'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3125'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-2629'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3126'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-16'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3127'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-16'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3128'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-16'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3129'>
+        <parameter type-id='type-id-2578'/>
+        <return type-id='type-id-16'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3130'>
+        <parameter type-id='type-id-3055'/>
+        <parameter type-id='type-id-3054'/>
+        <return type-id='type-id-16'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3131'>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-16'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3132'>
+        <parameter type-id='type-id-3037'/>
+        <return type-id='type-id-1282'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2369'>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3134'>
+        <parameter type-id='type-id-1685'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3135'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-3046'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3136'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3137'>
+        <parameter type-id='type-id-1685'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3138'>
+        <parameter type-id='type-id-1230'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3139'>
+        <parameter type-id='type-id-1230'/>
+        <parameter type-id='type-id-83'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3140'>
+        <parameter type-id='type-id-1230'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-88'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3141'>
+        <parameter type-id='type-id-91'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3142'>
+        <parameter type-id='type-id-365'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3143'>
+        <parameter type-id='type-id-365'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3144'>
+        <parameter type-id='type-id-2616'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3145'>
+        <parameter type-id='type-id-2025'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3146'>
+        <parameter type-id='type-id-2655'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3147'>
+        <parameter type-id='type-id-2707'/>
+        <parameter type-id='type-id-3037'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3148'>
+        <parameter type-id='type-id-1583'/>
+        <parameter type-id='type-id-1594'/>
+        <parameter type-id='type-id-3017'/>
+        <parameter type-id='type-id-3010'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3149'>
+        <parameter type-id='type-id-23'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3150'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-1127'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3151'>
+        <parameter type-id='type-id-240'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3152'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-3017'/>
+        <parameter type-id='type-id-3010'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3153'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-918'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2159'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3154'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-918'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2159'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3155'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3156'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-2159'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3157'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-2159'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3158'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-738'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3159'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3160'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-2159'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3161'>
+        <parameter type-id='type-id-2742'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3162'>
+        <parameter type-id='type-id-2746'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3163'>
+        <parameter type-id='type-id-2746'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3164'>
+        <parameter type-id='type-id-2746'/>
+        <parameter type-id='type-id-1646'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3165'>
+        <parameter type-id='type-id-2746'/>
+        <parameter type-id='type-id-1646'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3166'>
+        <parameter type-id='type-id-83'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3167'>
+        <parameter type-id='type-id-2578'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3168'>
+        <parameter type-id='type-id-2578'/>
+        <parameter type-id='type-id-2578'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3169'>
+        <parameter type-id='type-id-2578'/>
+        <parameter type-id='type-id-528'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3170'>
+        <parameter type-id='type-id-2023'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3171'>
+        <parameter type-id='type-id-2779'/>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-878'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3172'>
+        <parameter type-id='type-id-2785'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3173'>
+        <parameter type-id='type-id-2785'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3174'>
+        <parameter type-id='type-id-1127'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3175'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2366'>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3176'>
+        <parameter type-id='type-id-3009'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3177'>
+        <parameter type-id='type-id-3011'/>
+        <parameter type-id='type-id-192'/>
+        <parameter type-id='type-id-192'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3178'>
+        <parameter type-id='type-id-379'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3179'>
+        <parameter type-id='type-id-379'/>
+        <parameter type-id='type-id-3017'/>
+        <parameter type-id='type-id-3010'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3180'>
+        <parameter type-id='type-id-2324'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3181'>
+        <parameter type-id='type-id-260'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3182'>
+        <parameter type-id='type-id-260'/>
+        <parameter type-id='type-id-4'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3183'>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3184'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2751'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3185'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2754'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3186'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2762'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3187'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2763'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3188'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2764'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3189'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2766'/>
+        <parameter type-id='type-id-1508'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3190'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2767'/>
+        <parameter type-id='type-id-1508'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3191'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-2769'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3192'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3193'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-877'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3194'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3025'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3195'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3052'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3196'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3197'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-3121'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3198'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3122'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3199'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3200'>
+        <parameter type-id='type-id-512'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3201'>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-2610'/>
+        <parameter type-id='type-id-2610'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3202'>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3203'>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-2157'>
+        <parameter type-id='type-id-2145'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3204'>
+        <parameter type-id='type-id-87'/>
+        <parameter type-id='type-id-2121'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3205'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-83'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3206'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3207'>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3208'>
+        <parameter type-id='type-id-28'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3209'>
+        <parameter type-id='type-id-431'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3210'>
+        <parameter type-id='type-id-1930'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3211'>
+        <parameter type-id='type-id-1930'/>
+        <parameter type-id='type-id-3063'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3212'>
+        <parameter type-id='type-id-3065'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3213'>
+        <parameter type-id='type-id-2576'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3214'>
+        <parameter type-id='type-id-2438'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3215'>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3216'>
+        <parameter type-id='type-id-3133'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3217'>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3218'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3219'>
+        <parameter type-id='type-id-3234'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3220'>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3221'>
+        <parameter type-id='type-id-1230'/>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3222'>
+        <parameter type-id='type-id-1230'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3223'>
+        <parameter type-id='type-id-2179'/>
+        <parameter type-id='type-id-2650'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3224'>
+        <parameter type-id='type-id-240'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3225'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-2741'/>
+        <parameter type-id='type-id-485'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3226'>
+        <parameter type-id='type-id-379'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3227'>
+        <parameter type-id='type-id-1643'/>
+        <parameter type-id='type-id-1936'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3228'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3229'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-85'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3230'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-85'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3231'>
+        <parameter type-id='type-id-1646'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3232'>
+        <parameter type-id='type-id-1930'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3233'>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <union-decl name='__anonymous_union__38' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/linux/fs.h' line='624' column='1' id='type-id-1301'>
+        <data-member access='private'>
+          <var-decl name='i_nlink' type-id='type-id-2729' visibility='default' filepath='include/linux/fs.h' line='625' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='__i_nlink' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='626' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__42' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='115' column='1' id='type-id-1289'>
+        <data-member access='private'>
+          <var-decl name='d_alias' type-id='type-id-520' visibility='default' filepath='include/linux/dcache.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='d_in_lookup_hash' type-id='type-id-1284' visibility='default' filepath='include/linux/dcache.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='d_rcu' type-id='type-id-385' visibility='default' filepath='include/linux/dcache.h' line='118' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__13' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/cred.h' line='154' column='1' id='type-id-1615'>
+        <data-member access='private'>
+          <var-decl name='non_rcu' type-id='type-id-17' visibility='default' filepath='include/linux/cred.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/cred.h' line='156' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__41' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='106' column='1' id='type-id-1288'>
+        <data-member access='private'>
+          <var-decl name='d_lru' type-id='type-id-20' visibility='default' filepath='include/linux/dcache.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='d_wait' type-id='type-id-881' visibility='default' filepath='include/linux/dcache.h' line='108' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__12' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='158' column='1' id='type-id-1625'>
+        <data-member access='private'>
+          <var-decl name='graveyard_link' type-id='type-id-20' visibility='default' filepath='include/linux/key.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='serial_node' type-id='type-id-422' visibility='default' filepath='include/linux/key.h' line='160' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__31' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='82' column='1' id='type-id-2376'>
+        <data-member access='private'>
+          <var-decl name='q_node' type-id='type-id-20' visibility='default' filepath='include/linux/iocontext.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='__rcu_icq_cache' type-id='type-id-538' visibility='default' filepath='include/linux/iocontext.h' line='84' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/fs.h' line='898' column='1' id='type-id-1273'>
+        <data-member access='private'>
+          <var-decl name='fu_llist' type-id='type-id-281' visibility='default' filepath='include/linux/fs.h' line='899' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='fu_rcuhead' type-id='type-id-385' visibility='default' filepath='include/linux/fs.h' line='900' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__39' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/fs.h' line='1064' column='1' id='type-id-2581'>
+        <data-member access='private'>
+          <var-decl name='nfs_fl' type-id='type-id-2594' visibility='default' filepath='include/linux/fs.h' line='1065' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='nfs4_fl' type-id='type-id-2596' visibility='default' filepath='include/linux/fs.h' line='1066' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='afs' type-id='type-id-2598' visibility='default' filepath='include/linux/fs.h' line='1070' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__44' is-anonymous='yes' visibility='default' filepath='include/linux/filter.h' line='502' column='1' id='type-id-1222'>
+        <data-member access='private'>
+          <var-decl name='insns' type-id='type-id-1170' visibility='default' filepath='include/linux/filter.h' line='503' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='insnsi' type-id='type-id-954' visibility='default' filepath='include/linux/filter.h' line='504' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__24' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='79' column='1' id='type-id-2086'>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='98' column='1' id='type-id-3238'>
+            <member-type access='public'>
+              <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='115' column='1' id='type-id-3239'>
+                <data-member access='private'>
+                  <var-decl name='s_mem' type-id='type-id-15' visibility='default' filepath='include/linux/mm_types.h' line='116' column='1'/>
+                </data-member>
+                <data-member access='private'>
+                  <var-decl name='counters' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='117' column='1'/>
+                </data-member>
+                <data-member access='private'>
+                  <var-decl name='' type-id='type-id-2137' visibility='default' filepath='include/linux/mm_types.h' line='118' column='1'/>
+                </data-member>
+              </union-decl>
+            </member-type>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='' type-id='type-id-3240' visibility='default' filepath='include/linux/mm_types.h' line='99' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='slab_cache' type-id='type-id-538' visibility='default' filepath='include/linux/mm_types.h' line='112' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='freelist' type-id='type-id-15' visibility='default' filepath='include/linux/mm_types.h' line='114' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='125' column='1' id='type-id-3241'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='compound_head' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='126' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='compound_dtor' type-id='type-id-216' visibility='default' filepath='include/linux/mm_types.h' line='129' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='72'>
+              <var-decl name='compound_order' type-id='type-id-216' visibility='default' filepath='include/linux/mm_types.h' line='130' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='96'>
+              <var-decl name='compound_mapcount' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='131' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__2' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='133' column='1' id='type-id-3242'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_compound_pad_1' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='134' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='_compound_pad_2' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='135' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='deferred_list' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='136' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__3' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='138' column='1' id='type-id-3243'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_pt_pad_1' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='139' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='pmd_huge_pte' type-id='type-id-2138' visibility='default' filepath='include/linux/mm_types.h' line='140' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_pt_pad_2' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='141' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='' type-id='type-id-2139' visibility='default' filepath='include/linux/mm_types.h' line='142' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='256'>
+              <var-decl name='ptl' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='149' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__4' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='152' column='1' id='type-id-3244'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='pgmap' type-id='type-id-2739' visibility='default' filepath='include/linux/mm_types.h' line='154' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='hmm_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='155' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_zd_pad_1' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='156' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-2087' visibility='default' filepath='include/linux/mm_types.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/mm_types.h' line='160' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__35' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='303' column='1' id='type-id-1477'>
+        <data-member access='private'>
+          <var-decl name='shared' type-id='type-id-2418' visibility='default' filepath='include/linux/mm_types.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='anon_name' type-id='type-id-4' visibility='default' filepath='include/linux/mm_types.h' line='308' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__14' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='666' column='1' id='type-id-1762'>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-1765' visibility='default' filepath='include/linux/skbuff.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rbnode' type-id='type-id-422' visibility='default' filepath='include/linux/skbuff.h' line='681' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/skbuff.h' line='682' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__23' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='1985' column='1' id='type-id-1691'>
+        <data-member access='private'>
+          <var-decl name='ml_priv' type-id='type-id-15' visibility='default' filepath='include/linux/netdevice.h' line='1986' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='lstats' type-id='type-id-3039' visibility='default' filepath='include/linux/netdevice.h' line='1987' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='tstats' type-id='type-id-3040' visibility='default' filepath='include/linux/netdevice.h' line='1988' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='dstats' type-id='type-id-3038' visibility='default' filepath='include/linux/netdevice.h' line='1989' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='vstats' type-id='type-id-3041' visibility='default' filepath='include/linux/netdevice.h' line='1990' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__43' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/bpf.h' line='298' column='1' id='type-id-1232'>
+        <data-member access='private'>
+          <var-decl name='work' type-id='type-id-255' visibility='default' filepath='include/linux/bpf.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/bpf.h' line='300' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__27' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='99' column='1' id='type-id-3240'>
+        <data-member access='private'>
+          <var-decl name='slab_list' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-2136' visibility='default' filepath='include/linux/mm_types.h' line='101' column='1'/>
+        </data-member>
+      </union-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/seq_file.c' language='LANG_C89'>
+      <function-decl name='seq_read' mangled-name='seq_read' filepath='fs/seq_file.c' line='153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='seq_read'>
+        <parameter type-id='type-id-83' name='file' filepath='fs/seq_file.c' line='153' column='1'/>
+        <parameter type-id='type-id-2' name='buf' filepath='fs/seq_file.c' line='153' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='fs/seq_file.c' line='153' column='1'/>
+        <parameter type-id='type-id-85' name='ppos' filepath='fs/seq_file.c' line='153' column='1'/>
+        <return type-id='type-id-86'/>
+      </function-decl>
+      <function-decl name='seq_lseek' mangled-name='seq_lseek' filepath='fs/seq_file.c' line='310' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='seq_lseek'>
+        <parameter type-id='type-id-83' name='file' filepath='fs/seq_file.c' line='310' column='1'/>
+        <parameter type-id='type-id-763' name='offset' filepath='fs/seq_file.c' line='310' column='1'/>
+        <parameter type-id='type-id-17' name='whence' filepath='fs/seq_file.c' line='310' column='1'/>
+        <return type-id='type-id-763'/>
+      </function-decl>
+      <function-decl name='seq_printf' mangled-name='seq_printf' filepath='fs/seq_file.c' line='401' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='seq_printf'>
+        <parameter type-id='type-id-88' name='m' filepath='fs/seq_file.c' line='401' column='1'/>
+        <parameter type-id='type-id-4' name='f' filepath='fs/seq_file.c' line='401' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='single_open' mangled-name='single_open' filepath='fs/seq_file.c' line='554' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='single_open'>
+        <parameter type-id='type-id-83' name='file' filepath='fs/seq_file.c' line='554' column='1'/>
+        <parameter type-id='type-id-311' name='show' filepath='fs/seq_file.c' line='554' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='fs/seq_file.c' line='555' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='single_release' mangled-name='single_release' filepath='fs/seq_file.c' line='593' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='single_release'>
+        <parameter type-id='type-id-1127' name='inode' filepath='fs/seq_file.c' line='593' column='1'/>
+        <parameter type-id='type-id-83' name='file' filepath='fs/seq_file.c' line='593' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='seq_putc' mangled-name='seq_putc' filepath='fs/seq_file.c' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='seq_putc'>
+        <parameter type-id='type-id-88' name='m' filepath='fs/seq_file.c' line='645' column='1'/>
+        <parameter type-id='type-id-1' name='c' filepath='fs/seq_file.c' line='645' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='seq_puts' mangled-name='seq_puts' filepath='fs/seq_file.c' line='654' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='seq_puts'>
+        <parameter type-id='type-id-88' name='m' filepath='fs/seq_file.c' line='654' column='1'/>
+        <parameter type-id='type-id-4' name='s' filepath='fs/seq_file.c' line='654' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/slab_common.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-538' size-in-bits='infinite' id='type-id-3245'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3246' size-in-bits='64' id='type-id-3247'>
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <class-decl name='kmem_cache_cpu' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/slub_def.h' line='41' column='1' id='type-id-3248'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='freelist' type-id='type-id-528' visibility='default' filepath='include/linux/slub_def.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tid' type-id='type-id-16' visibility='default' filepath='include/linux/slub_def.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='page' type-id='type-id-512' visibility='default' filepath='include/linux/slub_def.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='partial' type-id='type-id-512' visibility='default' filepath='include/linux/slub_def.h' line='46' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='79' column='1' id='type-id-3249'>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='98' column='1' id='type-id-3250'>
+            <member-type access='public'>
+              <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='115' column='1' id='type-id-3251'>
+                <data-member access='private'>
+                  <var-decl name='s_mem' type-id='type-id-15' visibility='default' filepath='include/linux/mm_types.h' line='116' column='1'/>
+                </data-member>
+                <data-member access='private'>
+                  <var-decl name='counters' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='117' column='1'/>
+                </data-member>
+                <data-member access='private'>
+                  <var-decl name='' type-id='type-id-2137' visibility='default' filepath='include/linux/mm_types.h' line='118' column='1'/>
+                </data-member>
+              </union-decl>
+            </member-type>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='' type-id='type-id-3252' visibility='default' filepath='include/linux/mm_types.h' line='99' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='slab_cache' type-id='type-id-538' visibility='default' filepath='include/linux/mm_types.h' line='112' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='freelist' type-id='type-id-15' visibility='default' filepath='include/linux/mm_types.h' line='114' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__1' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='138' column='1' id='type-id-3253'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_pt_pad_1' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='139' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='pmd_huge_pte' type-id='type-id-2138' visibility='default' filepath='include/linux/mm_types.h' line='140' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_pt_pad_2' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='141' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='' type-id='type-id-3254' visibility='default' filepath='include/linux/mm_types.h' line='142' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='256'>
+              <var-decl name='ptl' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='149' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__2' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='152' column='1' id='type-id-3255'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='pgmap' type-id='type-id-2739' visibility='default' filepath='include/linux/mm_types.h' line='154' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='hmm_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='155' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_zd_pad_1' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='156' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-2087' visibility='default' filepath='include/linux/mm_types.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/mm_types.h' line='160' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='99' column='1' id='type-id-3252'>
+        <data-member access='private'>
+          <var-decl name='slab_list' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-2136' visibility='default' filepath='include/linux/mm_types.h' line='101' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='142' column='1' id='type-id-3254'>
+        <data-member access='private'>
+          <var-decl name='pt_mm' type-id='type-id-882' visibility='default' filepath='include/linux/mm_types.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='pt_frag_refcount' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='144' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='slab_flags_t' type-id='type-id-5' filepath='include/linux/types.h' line='159' column='1' id='type-id-3256'/>
+      <class-decl name='kmem_cache_order_objects' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/slub_def.h' line='75' column='1' id='type-id-3257'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='x' type-id='type-id-5' visibility='default' filepath='include/linux/slub_def.h' line='76' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='memcg_cache_params' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/slab.h' line='632' column='1' id='type-id-3258'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='root_cache' type-id='type-id-538' visibility='default' filepath='include/linux/slab.h' line='633' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='' type-id='type-id-3259' visibility='default' filepath='include/linux/slab.h' line='634' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__3' size-in-bits='640' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='634' column='1' id='type-id-3259'>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='641' column='1' id='type-id-3260'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='memcg' type-id='type-id-447' visibility='default' filepath='include/linux/slab.h' line='642' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='children_node' type-id='type-id-20' visibility='default' filepath='include/linux/slab.h' line='643' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='kmem_caches_node' type-id='type-id-20' visibility='default' filepath='include/linux/slab.h' line='644' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='320'>
+              <var-decl name='deact_fn' type-id='type-id-3261' visibility='default' filepath='include/linux/slab.h' line='646' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='384'>
+              <var-decl name='' type-id='type-id-3262' visibility='default' filepath='include/linux/slab.h' line='647' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-3263' visibility='default' filepath='include/linux/slab.h' line='635' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='635' column='1' id='type-id-3263'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='memcg_caches' type-id='type-id-3264' visibility='default' filepath='include/linux/slab.h' line='636' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='__root_caches_node' type-id='type-id-20' visibility='default' filepath='include/linux/slab.h' line='637' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='children' type-id='type-id-20' visibility='default' filepath='include/linux/slab.h' line='638' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dying' type-id='type-id-33' visibility='default' filepath='include/linux/slab.h' line='639' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='memcg_cache_array' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/slab.h' line='594' column='1' id='type-id-3265'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/slab.h' line='595' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='entries' type-id='type-id-3245' visibility='default' filepath='include/linux/slab.h' line='596' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__4' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='647' column='1' id='type-id-3262'>
+        <data-member access='private'>
+          <var-decl name='deact_rcu_head' type-id='type-id-385' visibility='default' filepath='include/linux/slab.h' line='648' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='deact_work' type-id='type-id-255' visibility='default' filepath='include/linux/slab.h' line='649' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='kmem_cache_node' size-in-bits='512' is-struct='yes' visibility='default' filepath='mm/slab.h' line='454' column='1' id='type-id-3266'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list_lock' type-id='type-id-247' visibility='default' filepath='mm/slab.h' line='455' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nr_partial' type-id='type-id-16' visibility='default' filepath='mm/slab.h' line='473' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='partial' type-id='type-id-20' visibility='default' filepath='mm/slab.h' line='474' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='nr_slabs' type-id='type-id-115' visibility='default' filepath='mm/slab.h' line='476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='total_objects' type-id='type-id-115' visibility='default' filepath='mm/slab.h' line='477' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='full' type-id='type-id-20' visibility='default' filepath='mm/slab.h' line='478' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-3248' size-in-bits='64' id='type-id-3267'/>
+      <pointer-type-def type-id='type-id-3266' size-in-bits='64' id='type-id-3246'/>
+      <pointer-type-def type-id='type-id-3265' size-in-bits='64' id='type-id-3264'/>
+      <pointer-type-def type-id='type-id-3268' size-in-bits='64' id='type-id-3261'/>
+      <function-decl name='kmem_cache_create' mangled-name='kmem_cache_create' filepath='mm/slab_common.c' line='518' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_create'>
+        <parameter type-id='type-id-4' name='name' filepath='mm/slab_common.c' line='518' column='1'/>
+        <parameter type-id='type-id-5' name='size' filepath='mm/slab_common.c' line='518' column='1'/>
+        <parameter type-id='type-id-5' name='align' filepath='mm/slab_common.c' line='518' column='1'/>
+        <parameter type-id='type-id-3256' name='flags' filepath='mm/slab_common.c' line='519' column='1'/>
+        <parameter type-id='type-id-517' name='ctor' filepath='mm/slab_common.c' line='519' column='1'/>
+        <return type-id='type-id-538'/>
+      </function-decl>
+      <function-decl name='kmem_cache_destroy' mangled-name='kmem_cache_destroy' filepath='mm/slab_common.c' line='874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_destroy'>
+        <parameter type-id='type-id-538' name='s' filepath='mm/slab_common.c' line='874' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='kmalloc_order_trace' mangled-name='kmalloc_order_trace' filepath='mm/slab_common.c' line='1213' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmalloc_order_trace'>
+        <parameter type-id='type-id-84' name='size' filepath='mm/slab_common.c' line='1213' column='1'/>
+        <parameter type-id='type-id-485' name='flags' filepath='mm/slab_common.c' line='1213' column='1'/>
+        <parameter type-id='type-id-5' name='order' filepath='mm/slab_common.c' line='1213' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='kzfree' mangled-name='kzfree' filepath='mm/slab_common.c' line='1555' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kzfree'>
+        <parameter type-id='type-id-15' name='p' filepath='mm/slab_common.c' line='1555' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3268'>
+        <parameter type-id='type-id-538'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/debugfs/inode.c' language='LANG_C89'>
+      <function-decl name='debugfs_create_file' mangled-name='debugfs_create_file' filepath='fs/debugfs/inode.c' line='399' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='debugfs_create_file'>
+        <parameter type-id='type-id-4' name='name' filepath='fs/debugfs/inode.c' line='399' column='1'/>
+        <parameter type-id='type-id-329' name='mode' filepath='fs/debugfs/inode.c' line='399' column='1'/>
+        <parameter type-id='type-id-23' name='parent' filepath='fs/debugfs/inode.c' line='400' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='fs/debugfs/inode.c' line='400' column='1'/>
+        <parameter type-id='type-id-268' name='fops' filepath='fs/debugfs/inode.c' line='401' column='1'/>
+        <return type-id='type-id-23'/>
+      </function-decl>
+      <function-decl name='debugfs_create_dir' mangled-name='debugfs_create_dir' filepath='fs/debugfs/inode.c' line='508' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='debugfs_create_dir'>
+        <parameter type-id='type-id-4' name='name' filepath='fs/debugfs/inode.c' line='508' column='1'/>
+        <parameter type-id='type-id-23' name='parent' filepath='fs/debugfs/inode.c' line='508' column='1'/>
+        <return type-id='type-id-23'/>
+      </function-decl>
+      <function-decl name='debugfs_remove' mangled-name='debugfs_remove' filepath='fs/debugfs/inode.c' line='679' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='debugfs_remove'>
+        <parameter type-id='type-id-23' name='dentry' filepath='fs/debugfs/inode.c' line='679' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='debugfs_remove_recursive' mangled-name='debugfs_remove_recursive' filepath='fs/debugfs/inode.c' line='709' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='debugfs_remove_recursive'>
+        <parameter type-id='type-id-23' name='dentry' filepath='fs/debugfs/inode.c' line='709' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/power/main.c' language='LANG_C89'>
+      <class-decl name='notifier_block' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/notifier.h' line='54' column='1' id='type-id-3269'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='notifier_call' type-id='type-id-3270' visibility='default' filepath='include/linux/notifier.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='next' type-id='type-id-3271' visibility='default' filepath='include/linux/notifier.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='priority' type-id='type-id-17' visibility='default' filepath='include/linux/notifier.h' line='57' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='notifier_fn_t' type-id='type-id-3272' filepath='include/linux/notifier.h' line='51' column='1' id='type-id-3270'/>
+      <pointer-type-def type-id='type-id-3273' size-in-bits='64' id='type-id-3272'/>
+      <pointer-type-def type-id='type-id-3269' size-in-bits='64' id='type-id-3271'/>
+      <function-decl name='register_pm_notifier' mangled-name='register_pm_notifier' filepath='kernel/power/main.c' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_pm_notifier'>
+        <parameter type-id='type-id-3271' name='nb' filepath='kernel/power/main.c' line='58' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='unregister_pm_notifier' mangled-name='unregister_pm_notifier' filepath='kernel/power/main.c' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_pm_notifier'>
+        <parameter type-id='type-id-3271' name='nb' filepath='kernel/power/main.c' line='64' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3273'>
+        <parameter type-id='type-id-3271'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/core.c' language='LANG_C89'>
+      <class-decl name='klist' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/klist.h' line='20' column='1' id='type-id-3274'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='k_lock' type-id='type-id-247' visibility='default' filepath='include/linux/klist.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='k_list' type-id='type-id-20' visibility='default' filepath='include/linux/klist.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='get' type-id='type-id-3275' visibility='default' filepath='include/linux/klist.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='put' type-id='type-id-3275' visibility='default' filepath='include/linux/klist.h' line='24' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='driver_private' size-in-bits='1216' is-struct='yes' visibility='default' filepath='drivers/base/base.h' line='47' column='1' id='type-id-3276'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='drivers/base/base.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='klist_devices' type-id='type-id-3274' visibility='default' filepath='drivers/base/base.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='knode_bus' type-id='type-id-2024' visibility='default' filepath='drivers/base/base.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='mkobj' type-id='type-id-3022' visibility='default' filepath='drivers/base/base.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='driver' type-id='type-id-2011' visibility='default' filepath='drivers/base/base.h' line='52' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='subsys_private' size-in-bits='3264' is-struct='yes' visibility='default' filepath='drivers/base/base.h' line='29' column='1' id='type-id-3277'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='subsys' type-id='type-id-1396' visibility='default' filepath='drivers/base/base.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='devices_kset' type-id='type-id-1393' visibility='default' filepath='drivers/base/base.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='interfaces' type-id='type-id-20' visibility='default' filepath='drivers/base/base.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='drivers/base/base.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='drivers_kset' type-id='type-id-1393' visibility='default' filepath='drivers/base/base.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='klist_devices' type-id='type-id-3274' visibility='default' filepath='drivers/base/base.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='klist_drivers' type-id='type-id-3274' visibility='default' filepath='drivers/base/base.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='bus_notifier' type-id='type-id-3278' visibility='default' filepath='drivers/base/base.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='drivers_autoprobe' type-id='type-id-5' visibility='default' filepath='drivers/base/base.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='bus' type-id='type-id-2010' visibility='default' filepath='drivers/base/base.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='glue_dirs' type-id='type-id-1396' visibility='default' filepath='drivers/base/base.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='class' type-id='type-id-2025' visibility='default' filepath='drivers/base/base.h' line='43' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pm_qos_constraints' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/pm_qos.h' line='85' column='1' id='type-id-3279'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-3280' visibility='default' filepath='include/linux/pm_qos.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='target_value' type-id='type-id-738' visibility='default' filepath='include/linux/pm_qos.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='default_value' type-id='type-id-738' visibility='default' filepath='include/linux/pm_qos.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='no_constraint_value' type-id='type-id-738' visibility='default' filepath='include/linux/pm_qos.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='type' type-id='type-id-3281' visibility='default' filepath='include/linux/pm_qos.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='notifiers' type-id='type-id-3282' visibility='default' filepath='include/linux/pm_qos.h' line='91' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='pm_qos_type' filepath='include/linux/pm_qos.h' line='73' column='1' id='type-id-3281'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='PM_QOS_UNITIALIZED' value='0'/>
+        <enumerator name='PM_QOS_MAX' value='1'/>
+        <enumerator name='PM_QOS_MIN' value='2'/>
+        <enumerator name='PM_QOS_SUM' value='3'/>
+      </enum-decl>
+      <class-decl name='pm_qos_flags' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/pm_qos.h' line='94' column='1' id='type-id-3283'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/pm_qos.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='effective_flags' type-id='type-id-738' visibility='default' filepath='include/linux/pm_qos.h' line='96' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dev_pm_qos_request' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/pm_qos.h' line='64' column='1' id='type-id-3284'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-3285' visibility='default' filepath='include/linux/pm_qos.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='data' type-id='type-id-3286' visibility='default' filepath='include/linux/pm_qos.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/pm_qos.h' line='70' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='dev_pm_qos_req_type' filepath='include/linux/pm_qos.h' line='58' column='1' id='type-id-3285'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DEV_PM_QOS_RESUME_LATENCY' value='1'/>
+        <enumerator name='DEV_PM_QOS_LATENCY_TOLERANCE' value='2'/>
+        <enumerator name='DEV_PM_QOS_FLAGS' value='3'/>
+      </enum-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='include/linux/pm_qos.h' line='66' column='1' id='type-id-3286'>
+        <data-member access='private'>
+          <var-decl name='pnode' type-id='type-id-1504' visibility='default' filepath='include/linux/pm_qos.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='flr' type-id='type-id-3287' visibility='default' filepath='include/linux/pm_qos.h' line='68' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='pm_qos_flags_request' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/pm_qos.h' line='53' column='1' id='type-id-3287'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/linux/pm_qos.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-738' visibility='default' filepath='include/linux/pm_qos.h' line='55' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-3278' size-in-bits='64' id='type-id-3282'/>
+      <qualified-type-def type-id='type-id-3288' const='yes' id='type-id-3289'/>
+      <pointer-type-def type-id='type-id-3289' size-in-bits='64' id='type-id-3290'/>
+      <pointer-type-def type-id='type-id-3284' size-in-bits='64' id='type-id-3291'/>
+      <pointer-type-def type-id='type-id-3276' size-in-bits='64' id='type-id-3292'/>
+      <pointer-type-def type-id='type-id-3293' size-in-bits='64' id='type-id-3294'/>
+      <pointer-type-def type-id='type-id-2024' size-in-bits='64' id='type-id-3295'/>
+      <pointer-type-def type-id='type-id-3277' size-in-bits='64' id='type-id-3296'/>
+      <pointer-type-def type-id='type-id-3297' size-in-bits='64' id='type-id-3275'/>
+      <function-decl name='device_initialize' mangled-name='device_initialize' filepath='drivers/base/core.c' line='1735' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_initialize'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/core.c' line='1735' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='get_device' mangled-name='get_device' filepath='drivers/base/core.c' line='2342' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_device'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/core.c' line='2342' column='1'/>
+        <return type-id='type-id-240'/>
+      </function-decl>
+      <function-decl name='dev_driver_string' mangled-name='dev_driver_string' filepath='drivers/base/core.c' line='987' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_driver_string'>
+        <parameter type-id='type-id-2650' name='dev' filepath='drivers/base/core.c' line='987' column='1'/>
+        <return type-id='type-id-4'/>
+      </function-decl>
+      <function-decl name='_dev_info' mangled-name='_dev_info' filepath='drivers/base/core.c' line='3425' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_dev_info'>
+        <parameter type-id='type-id-2650' name='dev' filepath='drivers/base/core.c' line='3425' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='drivers/base/core.c' line='3425' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='put_device' mangled-name='put_device' filepath='drivers/base/core.c' line='2352' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='put_device'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/core.c' line='2352' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='device_create_file' mangled-name='device_create_file' filepath='drivers/base/core.c' line='1622' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_create_file'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/core.c' line='1622' column='1'/>
+        <parameter type-id='type-id-3290' name='attr' filepath='drivers/base/core.c' line='1623' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='device_remove_file' mangled-name='device_remove_file' filepath='drivers/base/core.c' line='1646' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_remove_file'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/core.c' line='1646' column='1'/>
+        <parameter type-id='type-id-3290' name='attr' filepath='drivers/base/core.c' line='1647' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='dev_set_name' mangled-name='dev_set_name' filepath='drivers/base/core.c' line='2037' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_set_name'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/core.c' line='2037' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='drivers/base/core.c' line='2037' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='device_add' mangled-name='device_add' filepath='drivers/base/core.c' line='2131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_add'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/core.c' line='2131' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='device_register' mangled-name='device_register' filepath='drivers/base/core.c' line='2327' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_register'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/core.c' line='2327' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='device_del' mangled-name='device_del' filepath='drivers/base/core.c' line='2391' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_del'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/core.c' line='2391' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='device_unregister' mangled-name='device_unregister' filepath='drivers/base/core.c' line='2467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_unregister'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/core.c' line='2467' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='device_for_each_child' mangled-name='device_for_each_child' filepath='drivers/base/core.c' line='2558' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_for_each_child'>
+        <parameter type-id='type-id-240' name='parent' filepath='drivers/base/core.c' line='2558' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='drivers/base/core.c' line='2558' column='1'/>
+        <parameter type-id='type-id-3294' name='fn' filepath='drivers/base/core.c' line='2559' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='device_create' mangled-name='device_create' filepath='drivers/base/core.c' line='2949' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_create'>
+        <parameter type-id='type-id-2025' name='class' filepath='drivers/base/core.c' line='2949' column='1'/>
+        <parameter type-id='type-id-240' name='parent' filepath='drivers/base/core.c' line='2949' column='1'/>
+        <parameter type-id='type-id-269' name='devt' filepath='drivers/base/core.c' line='2950' column='1'/>
+        <parameter type-id='type-id-15' name='drvdata' filepath='drivers/base/core.c' line='2950' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='drivers/base/core.c' line='2950' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-240'/>
+      </function-decl>
+      <function-decl name='device_destroy' mangled-name='device_destroy' filepath='drivers/base/core.c' line='3021' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_destroy'>
+        <parameter type-id='type-id-2025' name='class' filepath='drivers/base/core.c' line='3021' column='1'/>
+        <parameter type-id='type-id-269' name='devt' filepath='drivers/base/core.c' line='3021' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='dev_printk' mangled-name='dev_printk' filepath='drivers/base/core.c' line='3385' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_printk'>
+        <parameter type-id='type-id-4' name='level' filepath='drivers/base/core.c' line='3385' column='1'/>
+        <parameter type-id='type-id-2650' name='dev' filepath='drivers/base/core.c' line='3385' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='drivers/base/core.c' line='3386' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_dev_err' mangled-name='_dev_err' filepath='drivers/base/core.c' line='3422' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_dev_err'>
+        <parameter type-id='type-id-2650' name='dev' filepath='drivers/base/core.c' line='3422' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='drivers/base/core.c' line='3422' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_dev_warn' mangled-name='_dev_warn' filepath='drivers/base/core.c' line='3423' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_dev_warn'>
+        <parameter type-id='type-id-2650' name='dev' filepath='drivers/base/core.c' line='3423' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='drivers/base/core.c' line='3423' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='_dev_notice' mangled-name='_dev_notice' filepath='drivers/base/core.c' line='3424' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_dev_notice'>
+        <parameter type-id='type-id-2650' name='dev' filepath='drivers/base/core.c' line='3424' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='drivers/base/core.c' line='3424' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3293'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3297'>
+        <parameter type-id='type-id-3295'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/softirq.c' language='LANG_C89'>
+      <class-decl name='tasklet_struct' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/interrupt.h' line='542' column='1' id='type-id-3298'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-3299' visibility='default' filepath='include/linux/interrupt.h' line='544' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='state' type-id='type-id-16' visibility='default' filepath='include/linux/interrupt.h' line='545' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='count' type-id='type-id-26' visibility='default' filepath='include/linux/interrupt.h' line='546' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='func' type-id='type-id-3300' visibility='default' filepath='include/linux/interrupt.h' line='547' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='data' type-id='type-id-16' visibility='default' filepath='include/linux/interrupt.h' line='548' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-3298' size-in-bits='64' id='type-id-3299'/>
+      <pointer-type-def type-id='type-id-3301' size-in-bits='64' id='type-id-3300'/>
+      <function-decl name='__local_bh_enable_ip' mangled-name='__local_bh_enable_ip' filepath='kernel/softirq.c' line='166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__local_bh_enable_ip'>
+        <parameter type-id='type-id-16' name='ip' filepath='kernel/softirq.c' line='166' column='1'/>
+        <parameter type-id='type-id-5' name='cnt' filepath='kernel/softirq.c' line='166' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__tasklet_schedule' mangled-name='__tasklet_schedule' filepath='kernel/softirq.c' line='486' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__tasklet_schedule'>
+        <parameter type-id='type-id-3299' name='t' filepath='kernel/softirq.c' line='486' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__tasklet_hi_schedule' mangled-name='__tasklet_hi_schedule' filepath='kernel/softirq.c' line='493' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__tasklet_hi_schedule'>
+        <parameter type-id='type-id-3299' name='t' filepath='kernel/softirq.c' line='493' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='tasklet_init' mangled-name='tasklet_init' filepath='kernel/softirq.c' line='548' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tasklet_init'>
+        <parameter type-id='type-id-3299' name='t' filepath='kernel/softirq.c' line='548' column='1'/>
+        <parameter type-id='type-id-3300' name='func' filepath='kernel/softirq.c' line='549' column='1'/>
+        <parameter type-id='type-id-16' name='data' filepath='kernel/softirq.c' line='549' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='tasklet_kill' mangled-name='tasklet_kill' filepath='kernel/softirq.c' line='559' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tasklet_kill'>
+        <parameter type-id='type-id-3299' name='t' filepath='kernel/softirq.c' line='559' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3301'>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/resource.c' language='LANG_C89'>
+      <class-decl name='module' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3302'/>
+      <pointer-type-def type-id='type-id-3302' size-in-bits='64' id='type-id-3303'/>
+      <function-decl name='__devm_request_region' mangled-name='__devm_request_region' filepath='kernel/resource.c' line='1401' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__devm_request_region'>
+        <parameter type-id='type-id-240' name='dev' filepath='kernel/resource.c' line='1401' column='1'/>
+        <parameter type-id='type-id-2155' name='parent' filepath='kernel/resource.c' line='1402' column='1'/>
+        <parameter type-id='type-id-2154' name='start' filepath='kernel/resource.c' line='1402' column='1'/>
+        <parameter type-id='type-id-2154' name='n' filepath='kernel/resource.c' line='1403' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='kernel/resource.c' line='1403' column='1'/>
+        <return type-id='type-id-2155'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/sched/wait.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-1454' size-in-bits='64' id='type-id-3304'/>
+      <function-decl name='__init_waitqueue_head' mangled-name='__init_waitqueue_head' filepath='kernel/sched/wait.c' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__init_waitqueue_head'>
+        <parameter type-id='type-id-3304' name='wq_head' filepath='kernel/sched/wait.c' line='8' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='kernel/sched/wait.c' line='8' column='1'/>
+        <parameter type-id='type-id-1696' name='key' filepath='kernel/sched/wait.c' line='8' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='add_wait_queue' mangled-name='add_wait_queue' filepath='kernel/sched/wait.c' line='17' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='add_wait_queue'>
+        <parameter type-id='type-id-3304' name='wq_head' filepath='kernel/sched/wait.c' line='17' column='1'/>
+        <parameter type-id='type-id-3305' name='wq_entry' filepath='kernel/sched/wait.c' line='17' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='remove_wait_queue' mangled-name='remove_wait_queue' filepath='kernel/sched/wait.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='remove_wait_queue'>
+        <parameter type-id='type-id-3304' name='wq_head' filepath='kernel/sched/wait.c' line='39' column='1'/>
+        <parameter type-id='type-id-3305' name='wq_entry' filepath='kernel/sched/wait.c' line='39' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__wake_up' mangled-name='__wake_up' filepath='kernel/sched/wait.c' line='142' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__wake_up'>
+        <parameter type-id='type-id-3304' name='wq_head' filepath='kernel/sched/wait.c' line='142' column='1'/>
+        <parameter type-id='type-id-5' name='mode' filepath='kernel/sched/wait.c' line='142' column='1'/>
+        <parameter type-id='type-id-17' name='nr_exclusive' filepath='kernel/sched/wait.c' line='143' column='1'/>
+        <parameter type-id='type-id-15' name='key' filepath='kernel/sched/wait.c' line='143' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='prepare_to_wait' mangled-name='prepare_to_wait' filepath='kernel/sched/wait.c' line='225' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='prepare_to_wait'>
+        <parameter type-id='type-id-3304' name='wq_head' filepath='kernel/sched/wait.c' line='225' column='1'/>
+        <parameter type-id='type-id-3305' name='wq_entry' filepath='kernel/sched/wait.c' line='225' column='1'/>
+        <parameter type-id='type-id-17' name='state' filepath='kernel/sched/wait.c' line='225' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='init_wait_entry' mangled-name='init_wait_entry' filepath='kernel/sched/wait.c' line='252' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='init_wait_entry'>
+        <parameter type-id='type-id-3305' name='wq_entry' filepath='kernel/sched/wait.c' line='252' column='1'/>
+        <parameter type-id='type-id-17' name='flags' filepath='kernel/sched/wait.c' line='252' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='autoremove_wake_function' mangled-name='autoremove_wake_function' filepath='kernel/sched/wait.c' line='373' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='autoremove_wake_function'>
+        <parameter type-id='type-id-3305' name='wq_entry' filepath='kernel/sched/wait.c' line='373' column='1'/>
+        <parameter type-id='type-id-5' name='mode' filepath='kernel/sched/wait.c' line='373' column='1'/>
+        <parameter type-id='type-id-17' name='sync' filepath='kernel/sched/wait.c' line='373' column='1'/>
+        <parameter type-id='type-id-15' name='key' filepath='kernel/sched/wait.c' line='373' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='prepare_to_wait_event' mangled-name='prepare_to_wait_event' filepath='kernel/sched/wait.c' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='prepare_to_wait_event'>
+        <parameter type-id='type-id-3304' name='wq_head' filepath='kernel/sched/wait.c' line='261' column='1'/>
+        <parameter type-id='type-id-3305' name='wq_entry' filepath='kernel/sched/wait.c' line='261' column='1'/>
+        <parameter type-id='type-id-17' name='state' filepath='kernel/sched/wait.c' line='261' column='1'/>
+        <return type-id='type-id-192'/>
+      </function-decl>
+      <function-decl name='finish_wait' mangled-name='finish_wait' filepath='kernel/sched/wait.c' line='347' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='finish_wait'>
+        <parameter type-id='type-id-3304' name='wq_head' filepath='kernel/sched/wait.c' line='347' column='1'/>
+        <parameter type-id='type-id-3305' name='wq_entry' filepath='kernel/sched/wait.c' line='347' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='wait_woken' mangled-name='wait_woken' filepath='kernel/sched/wait.c' line='409' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='wait_woken'>
+        <parameter type-id='type-id-3305' name='wq_entry' filepath='kernel/sched/wait.c' line='409' column='1'/>
+        <parameter type-id='type-id-5' name='mode' filepath='kernel/sched/wait.c' line='409' column='1'/>
+        <parameter type-id='type-id-192' name='timeout' filepath='kernel/sched/wait.c' line='409' column='1'/>
+        <return type-id='type-id-192'/>
+      </function-decl>
+      <function-decl name='woken_wake_function' mangled-name='woken_wake_function' filepath='kernel/sched/wait.c' line='434' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='woken_wake_function'>
+        <parameter type-id='type-id-3305' name='wq_entry' filepath='kernel/sched/wait.c' line='434' column='1'/>
+        <parameter type-id='type-id-5' name='mode' filepath='kernel/sched/wait.c' line='434' column='1'/>
+        <parameter type-id='type-id-17' name='sync' filepath='kernel/sched/wait.c' line='434' column='1'/>
+        <parameter type-id='type-id-15' name='key' filepath='kernel/sched/wait.c' line='434' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/time/time.c' language='LANG_C89'>
+      <function-decl name='jiffies_to_msecs' mangled-name='jiffies_to_msecs' filepath='kernel/time/time.c' line='311' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='jiffies_to_msecs'>
+        <parameter type-id='type-id-2153' name='j' filepath='kernel/time/time.c' line='311' column='1'/>
+        <return type-id='type-id-5'/>
+      </function-decl>
+      <function-decl name='__msecs_to_jiffies' mangled-name='__msecs_to_jiffies' filepath='kernel/time/time.c' line='589' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__msecs_to_jiffies'>
+        <parameter type-id='type-id-2729' name='m' filepath='kernel/time/time.c' line='589' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+      <function-decl name='nsecs_to_jiffies' mangled-name='nsecs_to_jiffies' filepath='kernel/time/time.c' line='829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nsecs_to_jiffies'>
+        <parameter type-id='type-id-40' name='n' filepath='kernel/time/time.c' line='829' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/printk/printk.c' language='LANG_C89'>
+      <function-decl name='printk' mangled-name='printk' filepath='kernel/printk/printk.c' line='2006' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='printk'>
+        <parameter type-id='type-id-4' name='fmt' filepath='kernel/printk/printk.c' line='2006' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/capability.c' language='LANG_C89'>
+      <function-decl name='capable' mangled-name='capable' filepath='kernel/capability.c' line='429' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='capable'>
+        <parameter type-id='type-id-17' name='cap' filepath='kernel/capability.c' line='429' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/sched/core.c' language='LANG_C89'>
+
+
+
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='520' id='type-id-3306'>
+        <subrange length='65' type-id='type-id-9' id='type-id-3307'/>
+
+      </array-type-def>
+      <class-decl name='cpu_stop_done' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3308'/>
+      <class-decl name='cpuidle_device_kobj' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3309'/>
+      <class-decl name='cpuidle_driver_kobj' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3310'/>
+      <class-decl name='cpuidle_state_kobj' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3311'/>
+      <class-decl name='net_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3312'/>
+      <array-type-def dimensions='1' type-id='type-id-3313' size-in-bits='7680' id='type-id-3314'>
+        <subrange length='10' type-id='type-id-9' id='type-id-1189'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3315' size-in-bits='640' id='type-id-3316'>
+        <subrange length='10' type-id='type-id-9' id='type-id-1189'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3317' size-in-bits='3200' id='type-id-3318'>
+        <subrange length='10' type-id='type-id-9' id='type-id-1189'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3319' size-in-bits='13056' id='type-id-3320'>
+        <subrange length='102' type-id='type-id-9' id='type-id-3321'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='12800' id='type-id-3322'>
+        <subrange length='100' type-id='type-id-9' id='type-id-3323'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='320' id='type-id-3324'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <class-decl name='rq' size-in-bits='24064' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='809' column='1' id='type-id-3325'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='kernel/sched/sched.h' line='811' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='nr_running' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='817' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cpu_load' type-id='type-id-3324' visibility='default' filepath='kernel/sched/sched.h' line='824' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='last_load_update_tick' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='827' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='last_blocked_load_update_tick' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='828' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='has_blocked_load' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='829' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='nohz_tick_stopped' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='831' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='nohz_flags' type-id='type-id-26' visibility='default' filepath='kernel/sched/sched.h' line='832' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='load' type-id='type-id-1541' visibility='default' filepath='kernel/sched/sched.h' line='836' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='nr_load_updates' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='837' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='nr_switches' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='838' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='cfs' type-id='type-id-991' visibility='default' filepath='kernel/sched/sched.h' line='840' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='rt' type-id='type-id-1080' visibility='default' filepath='kernel/sched/sched.h' line='841' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17920'>
+          <var-decl name='dl' type-id='type-id-3326' visibility='default' filepath='kernel/sched/sched.h' line='842' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18752'>
+          <var-decl name='leaf_cfs_rq_list' type-id='type-id-20' visibility='default' filepath='kernel/sched/sched.h' line='846' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18880'>
+          <var-decl name='tmp_alone_branch' type-id='type-id-877' visibility='default' filepath='kernel/sched/sched.h' line='847' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18944'>
+          <var-decl name='nr_uninterruptible' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='856' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19008'>
+          <var-decl name='curr' type-id='type-id-431' visibility='default' filepath='kernel/sched/sched.h' line='858' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19072'>
+          <var-decl name='idle' type-id='type-id-431' visibility='default' filepath='kernel/sched/sched.h' line='859' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19136'>
+          <var-decl name='stop' type-id='type-id-431' visibility='default' filepath='kernel/sched/sched.h' line='860' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19200'>
+          <var-decl name='next_balance' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='861' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19264'>
+          <var-decl name='prev_mm' type-id='type-id-882' visibility='default' filepath='kernel/sched/sched.h' line='862' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19328'>
+          <var-decl name='clock_update_flags' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='864' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19392'>
+          <var-decl name='clock' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='865' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19456'>
+          <var-decl name='clock_task' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='867' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19520'>
+          <var-decl name='clock_pelt' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='868' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19584'>
+          <var-decl name='lost_idle_time' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='869' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19648'>
+          <var-decl name='nr_iowait' type-id='type-id-26' visibility='default' filepath='kernel/sched/sched.h' line='871' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19712'>
+          <var-decl name='rd' type-id='type-id-3327' visibility='default' filepath='kernel/sched/sched.h' line='874' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19776'>
+          <var-decl name='sd' type-id='type-id-3328' visibility='default' filepath='kernel/sched/sched.h' line='875' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19840'>
+          <var-decl name='cpu_capacity' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='877' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19904'>
+          <var-decl name='cpu_capacity_orig' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='878' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19968'>
+          <var-decl name='balance_callback' type-id='type-id-91' visibility='default' filepath='kernel/sched/sched.h' line='880' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20032'>
+          <var-decl name='idle_balance' type-id='type-id-216' visibility='default' filepath='kernel/sched/sched.h' line='882' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20096'>
+          <var-decl name='misfit_task_load' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='884' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20160'>
+          <var-decl name='active_balance' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='887' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20192'>
+          <var-decl name='push_cpu' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='888' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20224'>
+          <var-decl name='active_balance_work' type-id='type-id-3329' visibility='default' filepath='kernel/sched/sched.h' line='889' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20544'>
+          <var-decl name='cpu' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='892' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20576'>
+          <var-decl name='online' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='893' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20608'>
+          <var-decl name='cfs_tasks' type-id='type-id-20' visibility='default' filepath='kernel/sched/sched.h' line='895' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20992'>
+          <var-decl name='avg_rt' type-id='type-id-1545' visibility='default' filepath='kernel/sched/sched.h' line='897' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='21504'>
+          <var-decl name='avg_dl' type-id='type-id-1545' visibility='default' filepath='kernel/sched/sched.h' line='898' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22016'>
+          <var-decl name='idle_stamp' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='902' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22080'>
+          <var-decl name='avg_idle' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='903' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22144'>
+          <var-decl name='max_idle_balance_cost' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='906' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22208'>
+          <var-decl name='prev_steal_time' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='913' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22272'>
+          <var-decl name='calc_load_update' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='920' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22336'>
+          <var-decl name='calc_load_active' type-id='type-id-192' visibility='default' filepath='kernel/sched/sched.h' line='921' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22400'>
+          <var-decl name='hrtick_csd_pending' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='925' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22528'>
+          <var-decl name='hrtick_csd' type-id='type-id-3330' visibility='default' filepath='kernel/sched/sched.h' line='926' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22784'>
+          <var-decl name='hrtick_timer' type-id='type-id-681' visibility='default' filepath='kernel/sched/sched.h' line='928' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23296'>
+          <var-decl name='rq_sched_info' type-id='type-id-1503' visibility='default' filepath='kernel/sched/sched.h' line='933' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23552'>
+          <var-decl name='rq_cpu_time' type-id='type-id-98' visibility='default' filepath='kernel/sched/sched.h' line='934' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23616'>
+          <var-decl name='yld_count' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='938' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23648'>
+          <var-decl name='sched_count' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='941' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23680'>
+          <var-decl name='sched_goidle' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='942' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23712'>
+          <var-decl name='ttwu_count' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='945' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23744'>
+          <var-decl name='ttwu_local' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='946' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23808'>
+          <var-decl name='wake_list' type-id='type-id-278' visibility='default' filepath='kernel/sched/sched.h' line='950' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23872'>
+          <var-decl name='idle_state' type-id='type-id-3331' visibility='default' filepath='kernel/sched/sched.h' line='955' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23936'>
+          <var-decl name='idle_state_idx' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='956' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/sched/sched.h' line='519' column='1' id='type-id-3332'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='kernel/sched/sched.h' line='520' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='nr' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='521' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='load_avg' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='522' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='util_avg' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='523' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='runnable_sum' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='524' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rt_prio_array' size-in-bits='12928' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='232' column='1' id='type-id-3333'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bitmap' type-id='type-id-219' visibility='default' filepath='kernel/sched/sched.h' line='233' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='queue' type-id='type-id-3322' visibility='default' filepath='kernel/sched/sched.h' line='234' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/sched/sched.h' line='589' column='1' id='type-id-3334'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='curr' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='590' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='next' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='592' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='plist_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/plist.h' line='81' column='1' id='type-id-3280'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node_list' type-id='type-id-20' visibility='default' filepath='include/linux/plist.h' line='82' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rt_bandwidth' size-in-bits='768' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='237' column='1' id='type-id-3335'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rt_runtime_lock' type-id='type-id-36' visibility='default' filepath='kernel/sched/sched.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rt_period' type-id='type-id-682' visibility='default' filepath='kernel/sched/sched.h' line='240' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rt_runtime' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='241' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rt_period_timer' type-id='type-id-681' visibility='default' filepath='kernel/sched/sched.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='rt_period_active' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='243' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfs_bandwidth' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='335' column='1' id='type-id-3336'/>
+      <class-decl name='dl_rq' size-in-bits='832' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='625' column='1' id='type-id-3326'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='root' type-id='type-id-1521' visibility='default' filepath='kernel/sched/sched.h' line='627' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dl_nr_running' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='629' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='earliest_dl' type-id='type-id-3337' visibility='default' filepath='kernel/sched/sched.h' line='641' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dl_nr_migratory' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='643' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='overloaded' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='644' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='pushable_dl_tasks_root' type-id='type-id-1521' visibility='default' filepath='kernel/sched/sched.h' line='651' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='running_bw' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='660' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='this_bw' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='671' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='extra_bw' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='bw_ratio' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='678' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/sched/sched.h' line='638' column='1' id='type-id-3337'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='curr' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='639' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='next' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='640' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__3' size-in-bits='6848' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='353' column='1' id='type-id-3338'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mmap' type-id='type-id-1207' visibility='default' filepath='include/linux/mm_types.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mm_rb' type-id='type-id-416' visibility='default' filepath='include/linux/mm_types.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='vmacache_seqnum' type-id='type-id-40' visibility='default' filepath='include/linux/mm_types.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='get_unmapped_area' type-id='type-id-1482' visibility='default' filepath='include/linux/mm_types.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mmap_base' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mmap_legacy_base' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='task_size' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='highest_vm_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pgd' type-id='type-id-1483' visibility='default' filepath='include/linux/mm_types.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mm_users' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='mm_count' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='pgtables_bytes' type-id='type-id-115' visibility='default' filepath='include/linux/mm_types.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='map_count' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='page_table_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mmap_sem' type-id='type-id-246' visibility='default' filepath='include/linux/mm_types.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='mmlist' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='hiwater_rss' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='hiwater_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='total_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='locked_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='pinned_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='data_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='exec_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='stack_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='def_flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='arg_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='421' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='start_code' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='end_code' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='start_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='end_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='start_brk' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='brk' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='start_stack' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='arg_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='arg_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='env_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='env_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='saved_auxv' type-id='type-id-1200' visibility='default' filepath='include/linux/mm_types.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='rss_stat' type-id='type-id-1484' visibility='default' filepath='include/linux/mm_types.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='binfmt' type-id='type-id-1485' visibility='default' filepath='include/linux/mm_types.h' line='434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='context' type-id='type-id-1486' visibility='default' filepath='include/linux/mm_types.h' line='437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='core_state' type-id='type-id-1487' visibility='default' filepath='include/linux/mm_types.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='membarrier_state' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6176'>
+          <var-decl name='ioctx_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='ioctx_table' type-id='type-id-1488' visibility='default' filepath='include/linux/mm_types.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='owner' type-id='type-id-431' visibility='default' filepath='include/linux/mm_types.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='user_ns' type-id='type-id-915' visibility='default' filepath='include/linux/mm_types.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='exe_file' type-id='type-id-83' visibility='default' filepath='include/linux/mm_types.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='tlb_flush_pending' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='491' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='uprobes_state' type-id='type-id-1489' visibility='default' filepath='include/linux/mm_types.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='async_put_work' type-id='type-id-255' visibility='default' filepath='include/linux/mm_types.h' line='500' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='linux_binprm' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/binfmts.h' line='17' column='1' id='type-id-3339'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buf' type-id='type-id-962' visibility='default' filepath='include/linux/binfmts.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='vma' type-id='type-id-1207' visibility='default' filepath='include/linux/binfmts.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='vma_pages' type-id='type-id-16' visibility='default' filepath='include/linux/binfmts.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='mm' type-id='type-id-882' visibility='default' filepath='include/linux/binfmts.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='p' type-id='type-id-16' visibility='default' filepath='include/linux/binfmts.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='called_set_creds' type-id='type-id-5' visibility='default' filepath='include/linux/binfmts.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='cap_elevated' type-id='type-id-5' visibility='default' filepath='include/linux/binfmts.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='secureexec' type-id='type-id-5' visibility='default' filepath='include/linux/binfmts.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='recursion_depth' type-id='type-id-5' visibility='default' filepath='include/linux/binfmts.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='file' type-id='type-id-83' visibility='default' filepath='include/linux/binfmts.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='cred' type-id='type-id-3340' visibility='default' filepath='include/linux/binfmts.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='unsafe' type-id='type-id-17' visibility='default' filepath='include/linux/binfmts.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='per_clear' type-id='type-id-5' visibility='default' filepath='include/linux/binfmts.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='argc' type-id='type-id-17' visibility='default' filepath='include/linux/binfmts.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1568'>
+          <var-decl name='envc' type-id='type-id-17' visibility='default' filepath='include/linux/binfmts.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='filename' type-id='type-id-4' visibility='default' filepath='include/linux/binfmts.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='interp' type-id='type-id-4' visibility='default' filepath='include/linux/binfmts.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='interp_flags' type-id='type-id-5' visibility='default' filepath='include/linux/binfmts.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1760'>
+          <var-decl name='interp_data' type-id='type-id-5' visibility='default' filepath='include/linux/binfmts.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='loader' type-id='type-id-16' visibility='default' filepath='include/linux/binfmts.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='exec' type-id='type-id-16' visibility='default' filepath='include/linux/binfmts.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='rlim_stack' type-id='type-id-1164' visibility='default' filepath='include/linux/binfmts.h' line='65' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='coredump_params' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/binfmts.h' line='80' column='1' id='type-id-3341'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='siginfo' type-id='type-id-3342' visibility='default' filepath='include/linux/binfmts.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='regs' type-id='type-id-736' visibility='default' filepath='include/linux/binfmts.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='file' type-id='type-id-83' visibility='default' filepath='include/linux/binfmts.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='limit' type-id='type-id-16' visibility='default' filepath='include/linux/binfmts.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mm_flags' type-id='type-id-16' visibility='default' filepath='include/linux/binfmts.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='written' type-id='type-id-763' visibility='default' filepath='include/linux/binfmts.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='pos' type-id='type-id-763' visibility='default' filepath='include/linux/binfmts.h' line='87' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='root_domain' size-in-bits='14720' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='731' column='1' id='type-id-3343'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refcount' type-id='type-id-26' visibility='default' filepath='kernel/sched/sched.h' line='732' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='rto_count' type-id='type-id-26' visibility='default' filepath='kernel/sched/sched.h' line='733' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='kernel/sched/sched.h' line='734' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='span' type-id='type-id-38' visibility='default' filepath='kernel/sched/sched.h' line='735' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='online' type-id='type-id-38' visibility='default' filepath='kernel/sched/sched.h' line='736' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='overload' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='743' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='overutilized' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='746' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dlo_mask' type-id='type-id-38' visibility='default' filepath='kernel/sched/sched.h' line='752' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='dlo_count' type-id='type-id-26' visibility='default' filepath='kernel/sched/sched.h' line='753' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dl_bw' type-id='type-id-3344' visibility='default' filepath='kernel/sched/sched.h' line='754' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='cpudl' type-id='type-id-3345' visibility='default' filepath='kernel/sched/sched.h' line='755' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='rto_push_work' type-id='type-id-690' visibility='default' filepath='kernel/sched/sched.h' line='761' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='rto_lock' type-id='type-id-36' visibility='default' filepath='kernel/sched/sched.h' line='762' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='rto_loop' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='764' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='rto_cpu' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='765' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='rto_loop_next' type-id='type-id-26' visibility='default' filepath='kernel/sched/sched.h' line='767' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='rto_loop_start' type-id='type-id-26' visibility='default' filepath='kernel/sched/sched.h' line='768' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='rto_mask' type-id='type-id-38' visibility='default' filepath='kernel/sched/sched.h' line='774' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='cpupri' type-id='type-id-3346' visibility='default' filepath='kernel/sched/sched.h' line='775' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14464'>
+          <var-decl name='max_cpu_capacity' type-id='type-id-3347' visibility='default' filepath='kernel/sched/sched.h' line='778' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14656'>
+          <var-decl name='pd' type-id='type-id-3348' visibility='default' filepath='kernel/sched/sched.h' line='784' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dl_bw' size-in-bits='192' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='283' column='1' id='type-id-3344'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='kernel/sched/sched.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bw' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='total_bw' type-id='type-id-40' visibility='default' filepath='kernel/sched/sched.h' line='286' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpudl' size-in-bits='192' is-struct='yes' visibility='default' filepath='kernel/sched/cpudeadline.h' line='11' column='1' id='type-id-3345'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='kernel/sched/cpudeadline.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='size' type-id='type-id-17' visibility='default' filepath='kernel/sched/cpudeadline.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='free_cpus' type-id='type-id-38' visibility='default' filepath='kernel/sched/cpudeadline.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='elements' type-id='type-id-3349' visibility='default' filepath='kernel/sched/cpudeadline.h' line='15' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpudl_item' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/sched/cpudeadline.h' line='5' column='1' id='type-id-3350'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dl' type-id='type-id-40' visibility='default' filepath='kernel/sched/cpudeadline.h' line='6' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cpu' type-id='type-id-17' visibility='default' filepath='kernel/sched/cpudeadline.h' line='7' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='idx' type-id='type-id-17' visibility='default' filepath='kernel/sched/cpudeadline.h' line='8' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpupri' size-in-bits='13120' is-struct='yes' visibility='default' filepath='kernel/sched/cpupri.h' line='15' column='1' id='type-id-3346'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pri_to_cpu' type-id='type-id-3320' visibility='default' filepath='kernel/sched/cpupri.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13056'>
+          <var-decl name='cpu_to_pri' type-id='type-id-666' visibility='default' filepath='kernel/sched/cpupri.h' line='17' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpupri_vec' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/sched/cpupri.h' line='10' column='1' id='type-id-3319'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-26' visibility='default' filepath='kernel/sched/cpupri.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mask' type-id='type-id-38' visibility='default' filepath='kernel/sched/cpupri.h' line='12' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='max_cpu_capacity' size-in-bits='192' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='713' column='1' id='type-id-3347'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='kernel/sched/sched.h' line='714' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='val' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='715' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cpu' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='716' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='perf_domain' size-in-bits='256' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='707' column='1' id='type-id-3351'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='em_pd' type-id='type-id-3352' visibility='default' filepath='kernel/sched/sched.h' line='708' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='next' type-id='type-id-3348' visibility='default' filepath='kernel/sched/sched.h' line='709' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='kernel/sched/sched.h' line='710' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='em_perf_domain' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/energy_model.h' line='37' column='1' id='type-id-3353'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='table' type-id='type-id-3354' visibility='default' filepath='include/linux/energy_model.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='nr_cap_states' type-id='type-id-17' visibility='default' filepath='include/linux/energy_model.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cpus' type-id='type-id-280' visibility='default' filepath='include/linux/energy_model.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='em_cap_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/energy_model.h' line='20' column='1' id='type-id-3355'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='frequency' type-id='type-id-16' visibility='default' filepath='include/linux/energy_model.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='power' type-id='type-id-16' visibility='default' filepath='include/linux/energy_model.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cost' type-id='type-id-16' visibility='default' filepath='include/linux/energy_model.h' line='23' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sched_domain' size-in-bits='2496' is-struct='yes' visibility='default' filepath='include/linux/sched/topology.h' line='77' column='1' id='type-id-3356'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='parent' type-id='type-id-3328' visibility='default' filepath='include/linux/sched/topology.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='child' type-id='type-id-3328' visibility='default' filepath='include/linux/sched/topology.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='groups' type-id='type-id-3357' visibility='default' filepath='include/linux/sched/topology.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='min_interval' type-id='type-id-16' visibility='default' filepath='include/linux/sched/topology.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='max_interval' type-id='type-id-16' visibility='default' filepath='include/linux/sched/topology.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='busy_factor' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='imbalance_pct' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='cache_nice_tries' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='busy_idx' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='idle_idx' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='newidle_idx' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='wake_idx' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='forkexec_idx' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='smt_gain' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='nohz_idle' type-id='type-id-17' visibility='default' filepath='include/linux/sched/topology.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/sched/topology.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='level' type-id='type-id-17' visibility='default' filepath='include/linux/sched/topology.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='last_balance' type-id='type-id-16' visibility='default' filepath='include/linux/sched/topology.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='balance_interval' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='nr_balance_failed' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='max_newidle_lb_cost' type-id='type-id-40' visibility='default' filepath='include/linux/sched/topology.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='next_decay_max_lb_cost' type-id='type-id-16' visibility='default' filepath='include/linux/sched/topology.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='avg_scan_cost' type-id='type-id-40' visibility='default' filepath='include/linux/sched/topology.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='lb_count' type-id='type-id-1191' visibility='default' filepath='include/linux/sched/topology.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='lb_failed' type-id='type-id-1191' visibility='default' filepath='include/linux/sched/topology.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='lb_balanced' type-id='type-id-1191' visibility='default' filepath='include/linux/sched/topology.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='lb_imbalance' type-id='type-id-1191' visibility='default' filepath='include/linux/sched/topology.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='lb_gained' type-id='type-id-1191' visibility='default' filepath='include/linux/sched/topology.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='lb_hot_gained' type-id='type-id-1191' visibility='default' filepath='include/linux/sched/topology.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='lb_nobusyg' type-id='type-id-1191' visibility='default' filepath='include/linux/sched/topology.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1696'>
+          <var-decl name='lb_nobusyq' type-id='type-id-1191' visibility='default' filepath='include/linux/sched/topology.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='alb_count' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1824'>
+          <var-decl name='alb_failed' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='alb_pushed' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1888'>
+          <var-decl name='sbe_count' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='sbe_balanced' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1952'>
+          <var-decl name='sbe_pushed' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='sbf_count' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2016'>
+          <var-decl name='sbf_balanced' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='sbf_pushed' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2080'>
+          <var-decl name='ttwu_wake_remote' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='ttwu_move_affine' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2144'>
+          <var-decl name='ttwu_move_balance' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/linux/sched/topology.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='' type-id='type-id-3358' visibility='default' filepath='include/linux/sched/topology.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='shared' type-id='type-id-3359' visibility='default' filepath='include/linux/sched/topology.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='span_weight' type-id='type-id-5' visibility='default' filepath='include/linux/sched/topology.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='span' type-id='type-id-280' visibility='default' filepath='include/linux/sched/topology.h' line='157' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sched_group' size-in-bits='256' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1358' column='1' id='type-id-3360'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-3357' visibility='default' filepath='kernel/sched/sched.h' line='1359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ref' type-id='type-id-26' visibility='default' filepath='kernel/sched/sched.h' line='1360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='group_weight' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='1362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='sgc' type-id='type-id-3361' visibility='default' filepath='kernel/sched/sched.h' line='1363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='asym_prefer_cpu' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='1364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='cpumask' type-id='type-id-280' visibility='default' filepath='kernel/sched/sched.h' line='1373' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sched_group_capacity' size-in-bits='384' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1339' column='1' id='type-id-3362'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ref' type-id='type-id-26' visibility='default' filepath='kernel/sched/sched.h' line='1340' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='capacity' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='1345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='min_capacity' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='1346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='max_capacity' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='1347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='next_update' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='1348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='imbalance' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='1349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='kernel/sched/sched.h' line='1352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='cpumask' type-id='type-id-280' visibility='default' filepath='kernel/sched/sched.h' line='1355' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/sched/topology.h' line='143' column='1' id='type-id-3358'>
+        <data-member access='private'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/sched/topology.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/sched/topology.h' line='145' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='sched_domain_shared' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/linux/sched/topology.h' line='71' column='1' id='type-id-3363'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ref' type-id='type-id-26' visibility='default' filepath='include/linux/sched/topology.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='nr_busy_cpus' type-id='type-id-26' visibility='default' filepath='include/linux/sched/topology.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='has_idle_cores' type-id='type-id-17' visibility='default' filepath='include/linux/sched/topology.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpu_stop_work' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/stop_machine.h' line='24' column='1' id='type-id-3329'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/stop_machine.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fn' type-id='type-id-3364' visibility='default' filepath='include/linux/stop_machine.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='arg' type-id='type-id-15' visibility='default' filepath='include/linux/stop_machine.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='done' type-id='type-id-3365' visibility='default' filepath='include/linux/stop_machine.h' line='28' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='cpu_stop_fn_t' type-id='type-id-3366' filepath='include/linux/stop_machine.h' line='20' column='1' id='type-id-3364'/>
+      <typedef-decl name='call_single_data_t' type-id='type-id-505' filepath='include/linux/smp.h' line='26' column='1' id='type-id-3330'/>
+      <class-decl name='cpuidle_state' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/cpuidle.h' line='42' column='1' id='type-id-3313'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-43' visibility='default' filepath='include/linux/cpuidle.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='desc' type-id='type-id-373' visibility='default' filepath='include/linux/cpuidle.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/cpuidle.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='exit_latency' type-id='type-id-5' visibility='default' filepath='include/linux/cpuidle.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='power_usage' type-id='type-id-17' visibility='default' filepath='include/linux/cpuidle.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='target_residency' type-id='type-id-5' visibility='default' filepath='include/linux/cpuidle.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='disabled' type-id='type-id-33' visibility='default' filepath='include/linux/cpuidle.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='enter' type-id='type-id-3367' visibility='default' filepath='include/linux/cpuidle.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='enter_dead' type-id='type-id-3368' visibility='default' filepath='include/linux/cpuidle.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='enter_s2idle' type-id='type-id-3369' visibility='default' filepath='include/linux/cpuidle.h' line='63' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpuidle_device' size-in-bits='4224' is-struct='yes' visibility='default' filepath='include/linux/cpuidle.h' line='80' column='1' id='type-id-3370'>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='registered' type-id='type-id-5' visibility='default' filepath='include/linux/cpuidle.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='enabled' type-id='type-id-5' visibility='default' filepath='include/linux/cpuidle.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='use_deepest_state' type-id='type-id-5' visibility='default' filepath='include/linux/cpuidle.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='poll_time_limit' type-id='type-id-5' visibility='default' filepath='include/linux/cpuidle.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='cpu' type-id='type-id-5' visibility='default' filepath='include/linux/cpuidle.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='last_residency' type-id='type-id-17' visibility='default' filepath='include/linux/cpuidle.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='states_usage' type-id='type-id-3318' visibility='default' filepath='include/linux/cpuidle.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='kobjs' type-id='type-id-3316' visibility='default' filepath='include/linux/cpuidle.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='kobj_driver' type-id='type-id-3371' visibility='default' filepath='include/linux/cpuidle.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='kobj_dev' type-id='type-id-3372' visibility='default' filepath='include/linux/cpuidle.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='device_list' type-id='type-id-20' visibility='default' filepath='include/linux/cpuidle.h' line='92' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpuidle_state_usage' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/cpuidle.h' line='32' column='1' id='type-id-3317'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='disable' type-id='type-id-98' visibility='default' filepath='include/linux/cpuidle.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='usage' type-id='type-id-98' visibility='default' filepath='include/linux/cpuidle.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='time' type-id='type-id-98' visibility='default' filepath='include/linux/cpuidle.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='s2idle_usage' type-id='type-id-98' visibility='default' filepath='include/linux/cpuidle.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='s2idle_time' type-id='type-id-98' visibility='default' filepath='include/linux/cpuidle.h' line='38' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpuidle_driver' size-in-bits='8000' is-struct='yes' visibility='default' filepath='include/linux/cpuidle.h' line='117' column='1' id='type-id-3373'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/cpuidle.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/cpuidle.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='refcnt' type-id='type-id-17' visibility='default' filepath='include/linux/cpuidle.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='bctimer' type-id='type-id-5' visibility='default' filepath='include/linux/cpuidle.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='states' type-id='type-id-3314' visibility='default' filepath='include/linux/cpuidle.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7872'>
+          <var-decl name='state_count' type-id='type-id-17' visibility='default' filepath='include/linux/cpuidle.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7904'>
+          <var-decl name='safe_state_index' type-id='type-id-17' visibility='default' filepath='include/linux/cpuidle.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7936'>
+          <var-decl name='cpumask' type-id='type-id-3374' visibility='default' filepath='include/linux/cpuidle.h' line='130' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rq_flags' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1082' column='1' id='type-id-3375'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='kernel/sched/sched.h' line='1083' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cookie' type-id='type-id-3376' visibility='default' filepath='kernel/sched/sched.h' line='1084' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='clock_update_flags' type-id='type-id-5' visibility='default' filepath='kernel/sched/sched.h' line='1091' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pin_cookie' is-struct='yes' visibility='default' filepath='include/linux/lockdep.h' line='451' column='1' id='type-id-3376'/>
+      <class-decl name='new_utsname' size-in-bits='3120' is-struct='yes' visibility='default' filepath='include/uapi/linux/utsname.h' line='25' column='1' id='type-id-3377'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sysname' type-id='type-id-3306' visibility='default' filepath='include/uapi/linux/utsname.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='520'>
+          <var-decl name='nodename' type-id='type-id-3306' visibility='default' filepath='include/uapi/linux/utsname.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1040'>
+          <var-decl name='release' type-id='type-id-3306' visibility='default' filepath='include/uapi/linux/utsname.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1560'>
+          <var-decl name='version' type-id='type-id-3306' visibility='default' filepath='include/uapi/linux/utsname.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2080'>
+          <var-decl name='machine' type-id='type-id-3306' visibility='default' filepath='include/uapi/linux/utsname.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2600'>
+          <var-decl name='domainname' type-id='type-id-3306' visibility='default' filepath='include/uapi/linux/utsname.h' line='31' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='82' column='1' id='type-id-3378'>
+        <data-member access='private'>
+          <var-decl name='q_node' type-id='type-id-20' visibility='default' filepath='include/linux/iocontext.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='__rcu_icq_cache' type-id='type-id-538' visibility='default' filepath='include/linux/iocontext.h' line='84' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='wait_queue_entry_t' type-id='type-id-3379' filepath='include/linux/wait.h' line='14' column='1' id='type-id-3380'/>
+      <class-decl name='wait_queue_entry' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/wait.h' line='27' column='1' id='type-id-3379'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/wait.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/wait.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='func' type-id='type-id-3381' visibility='default' filepath='include/linux/wait.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='entry' type-id='type-id-20' visibility='default' filepath='include/linux/wait.h' line='31' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='wait_queue_func_t' type-id='type-id-3382' filepath='include/linux/wait.h' line='16' column='1' id='type-id-3381'/>
+      <class-decl name='sched_param' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/sched/types.h' line='7' column='1' id='type-id-3383'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sched_priority' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/sched/types.h' line='8' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-1544' size-in-bits='64' id='type-id-3384'/>
+      <qualified-type-def type-id='type-id-178' const='yes' id='type-id-3385'/>
+      <pointer-type-def type-id='type-id-3385' size-in-bits='64' id='type-id-3386'/>
+      <qualified-type-def type-id='type-id-3383' const='yes' id='type-id-3387'/>
+      <pointer-type-def type-id='type-id-3387' size-in-bits='64' id='type-id-3388'/>
+      <qualified-type-def type-id='type-id-2378' const='yes' id='type-id-3389'/>
+      <pointer-type-def type-id='type-id-3389' size-in-bits='64' id='type-id-3342'/>
+      <pointer-type-def type-id='type-id-3341' size-in-bits='64' id='type-id-3390'/>
+      <pointer-type-def type-id='type-id-3308' size-in-bits='64' id='type-id-3365'/>
+      <pointer-type-def type-id='type-id-3350' size-in-bits='64' id='type-id-3349'/>
+      <pointer-type-def type-id='type-id-3370' size-in-bits='64' id='type-id-3391'/>
+      <pointer-type-def type-id='type-id-3309' size-in-bits='64' id='type-id-3372'/>
+      <pointer-type-def type-id='type-id-3373' size-in-bits='64' id='type-id-3392'/>
+      <pointer-type-def type-id='type-id-3310' size-in-bits='64' id='type-id-3371'/>
+      <pointer-type-def type-id='type-id-3313' size-in-bits='64' id='type-id-3331'/>
+      <pointer-type-def type-id='type-id-3311' size-in-bits='64' id='type-id-3315'/>
+      <pointer-type-def type-id='type-id-178' size-in-bits='64' id='type-id-3374'/>
+      <pointer-type-def type-id='type-id-3355' size-in-bits='64' id='type-id-3354'/>
+      <pointer-type-def type-id='type-id-3353' size-in-bits='64' id='type-id-3352'/>
+      <pointer-type-def type-id='type-id-3393' size-in-bits='64' id='type-id-3394'/>
+      <pointer-type-def type-id='type-id-3395' size-in-bits='64' id='type-id-3367'/>
+      <pointer-type-def type-id='type-id-3396' size-in-bits='64' id='type-id-3368'/>
+      <pointer-type-def type-id='type-id-3397' size-in-bits='64' id='type-id-3398'/>
+      <pointer-type-def type-id='type-id-3399' size-in-bits='64' id='type-id-3400'/>
+      <pointer-type-def type-id='type-id-3401' size-in-bits='64' id='type-id-3402'/>
+      <pointer-type-def type-id='type-id-3403' size-in-bits='64' id='type-id-3382'/>
+      <pointer-type-def type-id='type-id-3339' size-in-bits='64' id='type-id-3404'/>
+      <pointer-type-def type-id='type-id-3312' size-in-bits='64' id='type-id-3405'/>
+      <pointer-type-def type-id='type-id-3351' size-in-bits='64' id='type-id-3348'/>
+      <pointer-type-def type-id='type-id-3343' size-in-bits='64' id='type-id-3327'/>
+      <pointer-type-def type-id='type-id-3325' size-in-bits='64' id='type-id-3406'/>
+      <pointer-type-def type-id='type-id-3375' size-in-bits='64' id='type-id-3407'/>
+      <pointer-type-def type-id='type-id-1549' size-in-bits='64' id='type-id-3408'/>
+      <pointer-type-def type-id='type-id-3356' size-in-bits='64' id='type-id-3328'/>
+      <pointer-type-def type-id='type-id-3363' size-in-bits='64' id='type-id-3359'/>
+      <pointer-type-def type-id='type-id-1543' size-in-bits='64' id='type-id-3409'/>
+      <pointer-type-def type-id='type-id-3360' size-in-bits='64' id='type-id-3357'/>
+      <pointer-type-def type-id='type-id-3362' size-in-bits='64' id='type-id-3361'/>
+      <pointer-type-def type-id='type-id-1548' size-in-bits='64' id='type-id-3410'/>
+      <pointer-type-def type-id='type-id-3411' size-in-bits='64' id='type-id-3412'/>
+      <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-3413'/>
+      <pointer-type-def type-id='type-id-3414' size-in-bits='64' id='type-id-3415'/>
+      <pointer-type-def type-id='type-id-3416' size-in-bits='64' id='type-id-3417'/>
+      <pointer-type-def type-id='type-id-3418' size-in-bits='64' id='type-id-3369'/>
+      <pointer-type-def type-id='type-id-3419' size-in-bits='64' id='type-id-3420'/>
+      <pointer-type-def type-id='type-id-3421' size-in-bits='64' id='type-id-3422'/>
+      <pointer-type-def type-id='type-id-3423' size-in-bits='64' id='type-id-3424'/>
+      <pointer-type-def type-id='type-id-3425' size-in-bits='64' id='type-id-3426'/>
+      <pointer-type-def type-id='type-id-3427' size-in-bits='64' id='type-id-3428'/>
+      <pointer-type-def type-id='type-id-3379' size-in-bits='64' id='type-id-3305'/>
+      <pointer-type-def type-id='type-id-3380' size-in-bits='64' id='type-id-3429'/>
+      <function-decl name='preempt_count_add' mangled-name='preempt_count_add' filepath='kernel/sched/core.c' line='3244' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='preempt_count_add'>
+        <parameter type-id='type-id-17' name='val' filepath='kernel/sched/core.c' line='3244' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='preempt_count_sub' mangled-name='preempt_count_sub' filepath='kernel/sched/core.c' line='3276' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='preempt_count_sub'>
+        <parameter type-id='type-id-17' name='val' filepath='kernel/sched/core.c' line='3276' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='preempt_schedule' mangled-name='preempt_schedule' filepath='kernel/sched/core.c' line='3678' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='preempt_schedule'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='wake_up_process' mangled-name='wake_up_process' filepath='kernel/sched/core.c' line='2143' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='wake_up_process'>
+        <parameter type-id='type-id-431' name='p' filepath='kernel/sched/core.c' line='2143' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='schedule' mangled-name='schedule' filepath='kernel/sched/core.c' line='3574' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='schedule'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='preempt_schedule_notrace' mangled-name='preempt_schedule_notrace' filepath='kernel/sched/core.c' line='3706' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='preempt_schedule_notrace'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='default_wake_function' mangled-name='default_wake_function' filepath='kernel/sched/core.c' line='3772' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='default_wake_function'>
+        <parameter type-id='type-id-3429' name='curr' filepath='kernel/sched/core.c' line='3772' column='1'/>
+        <parameter type-id='type-id-5' name='mode' filepath='kernel/sched/core.c' line='3772' column='1'/>
+        <parameter type-id='type-id-17' name='wake_flags' filepath='kernel/sched/core.c' line='3772' column='1'/>
+        <parameter type-id='type-id-15' name='key' filepath='kernel/sched/core.c' line='3773' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sched_setscheduler' mangled-name='sched_setscheduler' filepath='kernel/sched/core.c' line='4450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sched_setscheduler'>
+        <parameter type-id='type-id-431' name='p' filepath='kernel/sched/core.c' line='4450' column='1'/>
+        <parameter type-id='type-id-17' name='policy' filepath='kernel/sched/core.c' line='4450' column='1'/>
+        <parameter type-id='type-id-3388' name='param' filepath='kernel/sched/core.c' line='4451' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3393'>
+        <parameter type-id='type-id-3390'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3395'>
+        <parameter type-id='type-id-3391'/>
+        <parameter type-id='type-id-3392'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3396'>
+        <parameter type-id='type-id-3391'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3397'>
+        <parameter type-id='type-id-83'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3399'>
+        <parameter type-id='type-id-3404'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3401'>
+        <parameter type-id='type-id-431'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3403'>
+        <parameter type-id='type-id-3305'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3411'>
+        <parameter type-id='type-id-3406'/>
+        <parameter type-id='type-id-431'/>
+        <parameter type-id='type-id-3407'/>
+        <return type-id='type-id-431'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3414'>
+        <parameter type-id='type-id-3406'/>
+        <parameter type-id='type-id-431'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3416'>
+        <parameter type-id='type-id-3406'/>
+        <parameter type-id='type-id-431'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3418'>
+        <parameter type-id='type-id-3391'/>
+        <parameter type-id='type-id-3392'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3419'>
+        <parameter type-id='type-id-3406'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3421'>
+        <parameter type-id='type-id-3406'/>
+        <parameter type-id='type-id-431'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3423'>
+        <parameter type-id='type-id-3406'/>
+        <parameter type-id='type-id-431'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3425'>
+        <parameter type-id='type-id-431'/>
+        <parameter type-id='type-id-3386'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3427'>
+        <parameter type-id='type-id-431'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/file.c' language='LANG_C89'>
+      <function-decl name='get_unused_fd_flags' mangled-name='get_unused_fd_flags' filepath='fs/file.c' line='543' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_unused_fd_flags'>
+        <parameter type-id='type-id-5' name='flags' filepath='fs/file.c' line='543' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='put_unused_fd' mangled-name='put_unused_fd' filepath='fs/file.c' line='557' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='put_unused_fd'>
+        <parameter type-id='type-id-5' name='fd' filepath='fs/file.c' line='557' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='fd_install' mangled-name='fd_install' filepath='fs/file.c' line='611' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fd_install'>
+        <parameter type-id='type-id-5' name='fd' filepath='fs/file.c' line='611' column='1'/>
+        <parameter type-id='type-id-83' name='file' filepath='fs/file.c' line='611' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/time/hrtimer.c' language='LANG_C89'>
+      <enum-decl name='hrtimer_mode' filepath='include/linux/hrtimer.h' line='39' column='1' id='type-id-3430'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='HRTIMER_MODE_ABS' value='0'/>
+        <enumerator name='HRTIMER_MODE_REL' value='1'/>
+        <enumerator name='HRTIMER_MODE_PINNED' value='2'/>
+        <enumerator name='HRTIMER_MODE_SOFT' value='4'/>
+        <enumerator name='HRTIMER_MODE_ABS_PINNED' value='2'/>
+        <enumerator name='HRTIMER_MODE_REL_PINNED' value='3'/>
+        <enumerator name='HRTIMER_MODE_ABS_SOFT' value='4'/>
+        <enumerator name='HRTIMER_MODE_REL_SOFT' value='5'/>
+        <enumerator name='HRTIMER_MODE_ABS_PINNED_SOFT' value='6'/>
+        <enumerator name='HRTIMER_MODE_REL_PINNED_SOFT' value='7'/>
+      </enum-decl>
+      <qualified-type-def type-id='type-id-681' const='yes' id='type-id-3431'/>
+      <pointer-type-def type-id='type-id-3431' size-in-bits='64' id='type-id-3432'/>
+      <qualified-type-def type-id='type-id-3430' const='yes' id='type-id-3433'/>
+      <function-decl name='hrtimer_forward' mangled-name='hrtimer_forward' filepath='kernel/time/hrtimer.c' line='907' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hrtimer_forward'>
+        <parameter type-id='type-id-1556' name='timer' filepath='kernel/time/hrtimer.c' line='907' column='1'/>
+        <parameter type-id='type-id-682' name='now' filepath='kernel/time/hrtimer.c' line='907' column='1'/>
+        <parameter type-id='type-id-682' name='interval' filepath='kernel/time/hrtimer.c' line='907' column='1'/>
+        <return type-id='type-id-40'/>
+      </function-decl>
+      <function-decl name='hrtimer_start_range_ns' mangled-name='hrtimer_start_range_ns' filepath='kernel/time/hrtimer.c' line='1101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hrtimer_start_range_ns'>
+        <parameter type-id='type-id-1556' name='timer' filepath='kernel/time/hrtimer.c' line='1101' column='1'/>
+        <parameter type-id='type-id-682' name='tim' filepath='kernel/time/hrtimer.c' line='1101' column='1'/>
+        <parameter type-id='type-id-40' name='delta_ns' filepath='kernel/time/hrtimer.c' line='1102' column='1'/>
+        <parameter type-id='type-id-3433' name='mode' filepath='kernel/time/hrtimer.c' line='1102' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='hrtimer_active' mangled-name='hrtimer_active' filepath='kernel/time/hrtimer.c' line='1320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hrtimer_active'>
+        <parameter type-id='type-id-3432' name='timer' filepath='kernel/time/hrtimer.c' line='1320' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='hrtimer_cancel' mangled-name='hrtimer_cancel' filepath='kernel/time/hrtimer.c' line='1167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hrtimer_cancel'>
+        <parameter type-id='type-id-1556' name='timer' filepath='kernel/time/hrtimer.c' line='1167' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='hrtimer_init' mangled-name='hrtimer_init' filepath='kernel/time/hrtimer.c' line='1305' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hrtimer_init'>
+        <parameter type-id='type-id-1556' name='timer' filepath='kernel/time/hrtimer.c' line='1305' column='1'/>
+        <parameter type-id='type-id-1555' name='clock_id' filepath='kernel/time/hrtimer.c' line='1305' column='1'/>
+        <parameter type-id='type-id-3430' name='mode' filepath='kernel/time/hrtimer.c' line='1306' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/shmem.c' language='LANG_C89'>
+      <union-decl name='__anonymous_union__2' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='79' column='1' id='type-id-3434'>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-2087' visibility='default' filepath='include/linux/mm_types.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/mm_types.h' line='160' column='1'/>
+        </data-member>
+      </union-decl>
+      <function-decl name='shmem_file_setup' mangled-name='shmem_file_setup' filepath='mm/shmem.c' line='4009' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='shmem_file_setup'>
+        <parameter type-id='type-id-4' name='name' filepath='mm/shmem.c' line='4009' column='1'/>
+        <parameter type-id='type-id-763' name='size' filepath='mm/shmem.c' line='4009' column='1'/>
+        <parameter type-id='type-id-16' name='flags' filepath='mm/shmem.c' line='4009' column='1'/>
+        <return type-id='type-id-83'/>
+      </function-decl>
+      <function-decl name='shmem_read_mapping_page_gfp' mangled-name='shmem_read_mapping_page_gfp' filepath='mm/shmem.c' line='4077' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='shmem_read_mapping_page_gfp'>
+        <parameter type-id='type-id-1279' name='mapping' filepath='mm/shmem.c' line='4077' column='1'/>
+        <parameter type-id='type-id-16' name='index' filepath='mm/shmem.c' line='4078' column='1'/>
+        <parameter type-id='type-id-485' name='gfp' filepath='mm/shmem.c' line='4078' column='1'/>
+        <return type-id='type-id-512'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/workqueue.c' language='LANG_C89'>
+
+
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='192' id='type-id-3435'>
+        <subrange length='24' type-id='type-id-9' id='type-id-3436'/>
+
+      </array-type-def>
+      <class-decl name='pipe_inode_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3437'/>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='480' id='type-id-3438'>
+        <subrange length='15' type-id='type-id-9' id='type-id-3439'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3440' size-in-bits='infinite' id='type-id-3441'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='wq_flusher' size-in-bits='448' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='225' column='1' id='type-id-3442'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='kernel/workqueue.c' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flush_color' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='done' type-id='type-id-1606' visibility='default' filepath='kernel/workqueue.c' line='228' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='worker' size-in-bits='1152' is-struct='yes' visibility='default' filepath='kernel/workqueue_internal.h' line='24' column='1' id='type-id-3443'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-3444' visibility='default' filepath='kernel/workqueue_internal.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='current_work' type-id='type-id-3234' visibility='default' filepath='kernel/workqueue_internal.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='current_func' type-id='type-id-1588' visibility='default' filepath='kernel/workqueue_internal.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='current_pwq' type-id='type-id-3440' visibility='default' filepath='kernel/workqueue_internal.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='scheduled' type-id='type-id-20' visibility='default' filepath='kernel/workqueue_internal.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='task' type-id='type-id-431' visibility='default' filepath='kernel/workqueue_internal.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pool' type-id='type-id-3445' visibility='default' filepath='kernel/workqueue_internal.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='kernel/workqueue_internal.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='last_active' type-id='type-id-16' visibility='default' filepath='kernel/workqueue_internal.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='kernel/workqueue_internal.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='kernel/workqueue_internal.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='desc' type-id='type-id-3435' visibility='default' filepath='kernel/workqueue_internal.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='rescue_wq' type-id='type-id-654' visibility='default' filepath='kernel/workqueue_internal.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='last_func' type-id='type-id-1588' visibility='default' filepath='kernel/workqueue_internal.h' line='58' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='kernel/workqueue_internal.h' line='26' column='1' id='type-id-3444'>
+        <data-member access='private'>
+          <var-decl name='entry' type-id='type-id-20' visibility='default' filepath='kernel/workqueue_internal.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='hentry' type-id='type-id-520' visibility='default' filepath='kernel/workqueue_internal.h' line='28' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='pool_workqueue' size-in-bits='2048' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='198' column='1' id='type-id-3446'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pool' type-id='type-id-3445' visibility='default' filepath='kernel/workqueue.c' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wq' type-id='type-id-654' visibility='default' filepath='kernel/workqueue.c' line='200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='work_color' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='flush_color' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='refcnt' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='nr_in_flight' type-id='type-id-3438' visibility='default' filepath='kernel/workqueue.c' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='nr_active' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='max_active' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='delayed_works' type-id='type-id-20' visibility='default' filepath='kernel/workqueue.c' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='pwqs_node' type-id='type-id-20' visibility='default' filepath='kernel/workqueue.c' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='mayday_node' type-id='type-id-20' visibility='default' filepath='kernel/workqueue.c' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='unbound_release_work' type-id='type-id-255' visibility='default' filepath='kernel/workqueue.c' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='kernel/workqueue.c' line='219' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='worker_pool' size-in-bits='6656' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='146' column='1' id='type-id-3447'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='kernel/workqueue.c' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='cpu' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='node' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='kernel/workqueue.c' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='watchdog_ts' type-id='type-id-16' visibility='default' filepath='kernel/workqueue.c' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='worklist' type-id='type-id-20' visibility='default' filepath='kernel/workqueue.c' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='nr_workers' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='nr_idle' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='idle_list' type-id='type-id-20' visibility='default' filepath='kernel/workqueue.c' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='idle_timer' type-id='type-id-417' visibility='default' filepath='kernel/workqueue.c' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='mayday_timer' type-id='type-id-417' visibility='default' filepath='kernel/workqueue.c' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='busy_hash' type-id='type-id-187' visibility='default' filepath='kernel/workqueue.c' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='manager' type-id='type-id-3448' visibility='default' filepath='kernel/workqueue.c' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='workers' type-id='type-id-20' visibility='default' filepath='kernel/workqueue.c' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='detach_completion' type-id='type-id-1392' visibility='default' filepath='kernel/workqueue.c' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='worker_ida' type-id='type-id-3449' visibility='default' filepath='kernel/workqueue.c' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5696'>
+          <var-decl name='attrs' type-id='type-id-3450' visibility='default' filepath='kernel/workqueue.c' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='hash_node' type-id='type-id-520' visibility='default' filepath='kernel/workqueue.c' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='refcnt' type-id='type-id-17' visibility='default' filepath='kernel/workqueue.c' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='nr_running' type-id='type-id-26' visibility='default' filepath='kernel/workqueue.c' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='kernel/workqueue.c' line='189' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ida' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/idr.h' line='230' column='1' id='type-id-3449'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ida_rt' type-id='type-id-415' visibility='default' filepath='include/linux/idr.h' line='231' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='workqueue_attrs' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/workqueue.h' line='137' column='1' id='type-id-3451'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nice' type-id='type-id-17' visibility='default' filepath='include/linux/workqueue.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cpumask' type-id='type-id-38' visibility='default' filepath='include/linux/workqueue.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='no_numa' type-id='type-id-33' visibility='default' filepath='include/linux/workqueue.h' line='155' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='wq_device' size-in-bits='6272' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='5183' column='1' id='type-id-3452'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='wq' type-id='type-id-654' visibility='default' filepath='kernel/workqueue.c' line='5184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='kernel/workqueue.c' line='5185' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-411' size-in-bits='64' id='type-id-3453'/>
+      <pointer-type-def type-id='type-id-3437' size-in-bits='64' id='type-id-3454'/>
+      <pointer-type-def type-id='type-id-3446' size-in-bits='64' id='type-id-3440'/>
+      <pointer-type-def type-id='type-id-3443' size-in-bits='64' id='type-id-3448'/>
+      <pointer-type-def type-id='type-id-3447' size-in-bits='64' id='type-id-3445'/>
+      <pointer-type-def type-id='type-id-3451' size-in-bits='64' id='type-id-3450'/>
+      <pointer-type-def type-id='type-id-3452' size-in-bits='64' id='type-id-3455'/>
+      <pointer-type-def type-id='type-id-3442' size-in-bits='64' id='type-id-3456'/>
+      <function-decl name='__alloc_workqueue_key' mangled-name='__alloc_workqueue_key' filepath='kernel/workqueue.c' line='4079' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__alloc_workqueue_key'>
+        <parameter type-id='type-id-4' name='fmt' filepath='kernel/workqueue.c' line='4079' column='1'/>
+        <parameter type-id='type-id-5' name='flags' filepath='kernel/workqueue.c' line='4080' column='1'/>
+        <parameter type-id='type-id-17' name='max_active' filepath='kernel/workqueue.c' line='4081' column='1'/>
+        <parameter type-id='type-id-1696' name='key' filepath='kernel/workqueue.c' line='4082' column='1'/>
+        <parameter type-id='type-id-4' name='lock_name' filepath='kernel/workqueue.c' line='4083' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-654'/>
+      </function-decl>
+      <function-decl name='queue_work_on' mangled-name='queue_work_on' filepath='kernel/workqueue.c' line='1497' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='queue_work_on'>
+        <parameter type-id='type-id-17' name='cpu' filepath='kernel/workqueue.c' line='1497' column='1'/>
+        <parameter type-id='type-id-654' name='wq' filepath='kernel/workqueue.c' line='1497' column='1'/>
+        <parameter type-id='type-id-3234' name='work' filepath='kernel/workqueue.c' line='1498' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='delayed_work_timer_fn' mangled-name='delayed_work_timer_fn' filepath='kernel/workqueue.c' line='1515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='delayed_work_timer_fn'>
+        <parameter type-id='type-id-3065' name='t' filepath='kernel/workqueue.c' line='1515' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='queue_delayed_work_on' mangled-name='queue_delayed_work_on' filepath='kernel/workqueue.c' line='1567' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='queue_delayed_work_on'>
+        <parameter type-id='type-id-17' name='cpu' filepath='kernel/workqueue.c' line='1567' column='1'/>
+        <parameter type-id='type-id-654' name='wq' filepath='kernel/workqueue.c' line='1567' column='1'/>
+        <parameter type-id='type-id-3453' name='dwork' filepath='kernel/workqueue.c' line='1568' column='1'/>
+        <parameter type-id='type-id-16' name='delay' filepath='kernel/workqueue.c' line='1568' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='flush_workqueue' mangled-name='flush_workqueue' filepath='kernel/workqueue.c' line='2672' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='flush_workqueue'>
+        <parameter type-id='type-id-654' name='wq' filepath='kernel/workqueue.c' line='2672' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='flush_work' mangled-name='flush_work' filepath='kernel/workqueue.c' line='2968' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='flush_work'>
+        <parameter type-id='type-id-3234' name='work' filepath='kernel/workqueue.c' line='2968' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='cancel_work_sync' mangled-name='cancel_work_sync' filepath='kernel/workqueue.c' line='3070' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cancel_work_sync'>
+        <parameter type-id='type-id-3234' name='work' filepath='kernel/workqueue.c' line='3070' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='cancel_delayed_work' mangled-name='cancel_delayed_work' filepath='kernel/workqueue.c' line='3151' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cancel_delayed_work'>
+        <parameter type-id='type-id-3453' name='dwork' filepath='kernel/workqueue.c' line='3151' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='cancel_delayed_work_sync' mangled-name='cancel_delayed_work_sync' filepath='kernel/workqueue.c' line='3166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cancel_delayed_work_sync'>
+        <parameter type-id='type-id-3453' name='dwork' filepath='kernel/workqueue.c' line='3166' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='destroy_workqueue' mangled-name='destroy_workqueue' filepath='kernel/workqueue.c' line='4181' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='destroy_workqueue'>
+        <parameter type-id='type-id-654' name='wq' filepath='kernel/workqueue.c' line='4181' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/kobject_uevent.c' language='LANG_C89'>
+      <enum-decl name='kobject_action' filepath='include/linux/kobject.h' line='53' column='1' id='type-id-3457'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='KOBJ_ADD' value='0'/>
+        <enumerator name='KOBJ_REMOVE' value='1'/>
+        <enumerator name='KOBJ_CHANGE' value='2'/>
+        <enumerator name='KOBJ_MOVE' value='3'/>
+        <enumerator name='KOBJ_ONLINE' value='4'/>
+        <enumerator name='KOBJ_OFFLINE' value='5'/>
+        <enumerator name='KOBJ_BIND' value='6'/>
+        <enumerator name='KOBJ_UNBIND' value='7'/>
+        <enumerator name='KOBJ_MAX' value='8'/>
+      </enum-decl>
+      <function-decl name='kobject_uevent_env' mangled-name='kobject_uevent_env' filepath='lib/kobject_uevent.c' line='454' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kobject_uevent_env'>
+        <parameter type-id='type-id-379' name='kobj' filepath='lib/kobject_uevent.c' line='454' column='1'/>
+        <parameter type-id='type-id-3457' name='action' filepath='lib/kobject_uevent.c' line='454' column='1'/>
+        <parameter type-id='type-id-3458' name='envp_ext' filepath='lib/kobject_uevent.c' line='455' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='add_uevent_var' mangled-name='add_uevent_var' filepath='lib/kobject_uevent.c' line='651' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='add_uevent_var'>
+        <parameter type-id='type-id-3012' name='env' filepath='lib/kobject_uevent.c' line='651' column='1'/>
+        <parameter type-id='type-id-4' name='format' filepath='lib/kobject_uevent.c' line='651' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='kobject_uevent' mangled-name='kobject_uevent' filepath='lib/kobject_uevent.c' line='637' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kobject_uevent'>
+        <parameter type-id='type-id-379' name='kobj' filepath='lib/kobject_uevent.c' line='637' column='1'/>
+        <parameter type-id='type-id-3457' name='action' filepath='lib/kobject_uevent.c' line='637' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/kthread.c' language='LANG_C89'>
+      <class-decl name='vm_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3459'/>
+      <pointer-type-def type-id='type-id-3460' size-in-bits='64' id='type-id-3366'/>
+      <pointer-type-def type-id='type-id-3459' size-in-bits='64' id='type-id-3461'/>
+      <function-decl name='kthread_should_stop' mangled-name='kthread_should_stop' filepath='kernel/kthread.c' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_should_stop'>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='kthread_create_on_node' mangled-name='kthread_create_on_node' filepath='kernel/kthread.c' line='371' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_create_on_node'>
+        <parameter type-id='type-id-3366' name='threadfn' filepath='kernel/kthread.c' line='371' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='kernel/kthread.c' line='372' column='1'/>
+        <parameter type-id='type-id-17' name='node' filepath='kernel/kthread.c' line='372' column='1'/>
+        <parameter type-id='type-id-4' name='namefmt' filepath='kernel/kthread.c' line='373' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-431'/>
+      </function-decl>
+      <function-decl name='kthread_stop' mangled-name='kthread_stop' filepath='kernel/kthread.c' line='539' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_stop'>
+        <parameter type-id='type-id-431' name='k' filepath='kernel/kthread.c' line='539' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='kthread_create_worker' mangled-name='kthread_create_worker' filepath='kernel/kthread.c' line='718' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_create_worker'>
+        <parameter type-id='type-id-5' name='flags' filepath='kernel/kthread.c' line='718' column='1'/>
+        <parameter type-id='type-id-4' name='namefmt' filepath='kernel/kthread.c' line='718' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-2320'/>
+      </function-decl>
+      <function-decl name='kthread_queue_work' mangled-name='kthread_queue_work' filepath='kernel/kthread.c' line='810' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_queue_work'>
+        <parameter type-id='type-id-2320' name='worker' filepath='kernel/kthread.c' line='810' column='1'/>
+        <parameter type-id='type-id-2324' name='work' filepath='kernel/kthread.c' line='811' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='kthread_destroy_worker' mangled-name='kthread_destroy_worker' filepath='kernel/kthread.c' line='1169' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_destroy_worker'>
+        <parameter type-id='type-id-2320' name='worker' filepath='kernel/kthread.c' line='1169' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3460'>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/cred.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-1613' size-in-bits='64' id='type-id-3340'/>
+      <function-decl name='__put_cred' mangled-name='__put_cred' filepath='kernel/cred.c' line='135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__put_cred'>
+        <parameter type-id='type-id-3340' name='cred' filepath='kernel/cred.c' line='135' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/kmod.c' language='LANG_C89'>
+      <function-decl name='__request_module' mangled-name='__request_module' filepath='kernel/kmod.c' line='125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__request_module'>
+        <parameter type-id='type-id-33' name='wait' filepath='kernel/kmod.c' line='125' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='kernel/kmod.c' line='125' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/sched/completion.c' language='LANG_C89'>
+      <function-decl name='complete' mangled-name='complete' filepath='kernel/sched/completion.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='complete'>
+        <parameter type-id='type-id-1392' name='x' filepath='kernel/sched/completion.c' line='28' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='complete_all' mangled-name='complete_all' filepath='kernel/sched/completion.c' line='57' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='complete_all'>
+        <parameter type-id='type-id-1392' name='x' filepath='kernel/sched/completion.c' line='57' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='wait_for_completion' mangled-name='wait_for_completion' filepath='kernel/sched/completion.c' line='134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='wait_for_completion'>
+        <parameter type-id='type-id-1392' name='x' filepath='kernel/sched/completion.c' line='134' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='wait_for_completion_killable' mangled-name='wait_for_completion_killable' filepath='kernel/sched/completion.c' line='239' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='wait_for_completion_killable'>
+        <parameter type-id='type-id-1392' name='x' filepath='kernel/sched/completion.c' line='239' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='completion_done' mangled-name='completion_done' filepath='kernel/sched/completion.c' line='313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='completion_done'>
+        <parameter type-id='type-id-1392' name='x' filepath='kernel/sched/completion.c' line='313' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/locking/mutex.c' language='LANG_C89'>
+      <class-decl name='io_context' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3462'/>
+      <class-decl name='mm_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3463'/>
+      <class-decl name='nsproxy' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3464'/>
+      <class-decl name='page' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3465'/>
+      <class-decl name='user_namespace' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3466'/>
+      <class-decl name='ww_mutex' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/ww_mutex.h' line='51' column='1' id='type-id-3467'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-245' visibility='default' filepath='include/linux/ww_mutex.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ctx' type-id='type-id-3468' visibility='default' filepath='include/linux/ww_mutex.h' line='53' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ww_acquire_ctx' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/ww_mutex.h' line='31' column='1' id='type-id-3469'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='task' type-id='type-id-431' visibility='default' filepath='include/linux/ww_mutex.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='stamp' type-id='type-id-16' visibility='default' filepath='include/linux/ww_mutex.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='acquired' type-id='type-id-5' visibility='default' filepath='include/linux/ww_mutex.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='wounded' type-id='type-id-312' visibility='default' filepath='include/linux/ww_mutex.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='176'>
+          <var-decl name='is_wait_die' type-id='type-id-312' visibility='default' filepath='include/linux/ww_mutex.h' line='36' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='include/linux/restart_block.h' line='27' column='1' id='type-id-3470'>
+        <data-member access='private'>
+          <var-decl name='futex' type-id='type-id-234' visibility='default' filepath='include/linux/restart_block.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='nanosleep' type-id='type-id-3471' visibility='default' filepath='include/linux/restart_block.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='poll' type-id='type-id-1564' visibility='default' filepath='include/linux/restart_block.h' line='54' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/restart_block.h' line='38' column='1' id='type-id-3471'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='clockid' type-id='type-id-1555' visibility='default' filepath='include/linux/restart_block.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='type' type-id='type-id-1566' visibility='default' filepath='include/linux/restart_block.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='' type-id='type-id-3472' visibility='default' filepath='include/linux/restart_block.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='expires' type-id='type-id-40' visibility='default' filepath='include/linux/restart_block.h' line='45' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/restart_block.h' line='41' column='1' id='type-id-3472'>
+        <data-member access='private'>
+          <var-decl name='rmtp' type-id='type-id-1568' visibility='default' filepath='include/linux/restart_block.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='compat_rmtp' type-id='type-id-1569' visibility='default' filepath='include/linux/restart_block.h' line='43' column='1'/>
+        </data-member>
+      </union-decl>
+      <pointer-type-def type-id='type-id-3462' size-in-bits='64' id='type-id-3473'/>
+      <pointer-type-def type-id='type-id-3463' size-in-bits='64' id='type-id-3474'/>
+      <pointer-type-def type-id='type-id-245' size-in-bits='64' id='type-id-3475'/>
+      <pointer-type-def type-id='type-id-3464' size-in-bits='64' id='type-id-3476'/>
+      <pointer-type-def type-id='type-id-3465' size-in-bits='64' id='type-id-3477'/>
+      <pointer-type-def type-id='type-id-3466' size-in-bits='64' id='type-id-3478'/>
+      <pointer-type-def type-id='type-id-3469' size-in-bits='64' id='type-id-3468'/>
+      <pointer-type-def type-id='type-id-3467' size-in-bits='64' id='type-id-3479'/>
+      <function-decl name='__mutex_init' mangled-name='__mutex_init' filepath='kernel/locking/mutex.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__mutex_init'>
+        <parameter type-id='type-id-3475' name='lock' filepath='kernel/locking/mutex.c' line='39' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='kernel/locking/mutex.c' line='39' column='1'/>
+        <parameter type-id='type-id-1696' name='key' filepath='kernel/locking/mutex.c' line='39' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='mutex_lock' mangled-name='mutex_lock' filepath='kernel/locking/mutex.c' line='252' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_lock'>
+        <parameter type-id='type-id-3475' name='lock' filepath='kernel/locking/mutex.c' line='252' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='mutex_unlock' mangled-name='mutex_unlock' filepath='kernel/locking/mutex.c' line='707' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_unlock'>
+        <parameter type-id='type-id-3475' name='lock' filepath='kernel/locking/mutex.c' line='707' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='ww_mutex_unlock' mangled-name='ww_mutex_unlock' filepath='kernel/locking/mutex.c' line='728' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ww_mutex_unlock'>
+        <parameter type-id='type-id-3479' name='lock' filepath='kernel/locking/mutex.c' line='728' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='mutex_lock_interruptible' mangled-name='mutex_lock_interruptible' filepath='kernel/locking/mutex.c' line='1275' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_lock_interruptible'>
+        <parameter type-id='type-id-3475' name='lock' filepath='kernel/locking/mutex.c' line='1275' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='mutex_trylock' mangled-name='mutex_trylock' filepath='kernel/locking/mutex.c' line='1379' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_trylock'>
+        <parameter type-id='type-id-3475' name='lock' filepath='kernel/locking/mutex.c' line='1379' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='ww_mutex_lock' mangled-name='ww_mutex_lock' filepath='kernel/locking/mutex.c' line='1392' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ww_mutex_lock'>
+        <parameter type-id='type-id-3479' name='lock' filepath='kernel/locking/mutex.c' line='1392' column='1'/>
+        <parameter type-id='type-id-3468' name='ctx' filepath='kernel/locking/mutex.c' line='1392' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='ww_mutex_lock_interruptible' mangled-name='ww_mutex_lock_interruptible' filepath='kernel/locking/mutex.c' line='1407' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ww_mutex_lock_interruptible'>
+        <parameter type-id='type-id-3479' name='lock' filepath='kernel/locking/mutex.c' line='1407' column='1'/>
+        <parameter type-id='type-id-3468' name='ctx' filepath='kernel/locking/mutex.c' line='1407' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/locking/rwsem.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-246' size-in-bits='64' id='type-id-3480'/>
+      <function-decl name='up_read' mangled-name='up_read' filepath='kernel/locking/rwsem.c' line='117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='up_read'>
+        <parameter type-id='type-id-3480' name='sem' filepath='kernel/locking/rwsem.c' line='117' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/irq/manage.c' language='LANG_C89'>
+      <typedef-decl name='irq_handler_t' type-id='type-id-3481' filepath='include/linux/interrupt.h' line='92' column='1' id='type-id-3482'/>
+      <typedef-decl name='irqreturn_t' type-id='type-id-3483' filepath='include/linux/irqreturn.h' line='17' column='1' id='type-id-3484'/>
+      <enum-decl name='irqreturn' filepath='include/linux/irqreturn.h' line='11' column='1' id='type-id-3483'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='IRQ_NONE' value='0'/>
+        <enumerator name='IRQ_HANDLED' value='1'/>
+        <enumerator name='IRQ_WAKE_THREAD' value='2'/>
+      </enum-decl>
+      <pointer-type-def type-id='type-id-3485' size-in-bits='64' id='type-id-3481'/>
+      <function-decl name='synchronize_hardirq' mangled-name='synchronize_hardirq' filepath='kernel/irq/manage.c' line='98' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_hardirq'>
+        <parameter type-id='type-id-5' name='irq' filepath='kernel/irq/manage.c' line='98' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='synchronize_irq' mangled-name='synchronize_irq' filepath='kernel/irq/manage.c' line='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_irq'>
+        <parameter type-id='type-id-5' name='irq' filepath='kernel/irq/manage.c' line='126' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='irq_set_affinity_hint' mangled-name='irq_set_affinity_hint' filepath='kernel/irq/manage.c' line='308' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_affinity_hint'>
+        <parameter type-id='type-id-5' name='irq' filepath='kernel/irq/manage.c' line='308' column='1'/>
+        <parameter type-id='type-id-3386' name='m' filepath='kernel/irq/manage.c' line='308' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='disable_irq' mangled-name='disable_irq' filepath='kernel/irq/manage.c' line='551' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='disable_irq'>
+        <parameter type-id='type-id-5' name='irq' filepath='kernel/irq/manage.c' line='551' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='irq_set_irq_wake' mangled-name='irq_set_irq_wake' filepath='kernel/irq/manage.c' line='666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_irq_wake'>
+        <parameter type-id='type-id-5' name='irq' filepath='kernel/irq/manage.c' line='666' column='1'/>
+        <parameter type-id='type-id-5' name='on' filepath='kernel/irq/manage.c' line='666' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='free_irq' mangled-name='free_irq' filepath='kernel/irq/manage.c' line='1775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_irq'>
+        <parameter type-id='type-id-5' name='irq' filepath='kernel/irq/manage.c' line='1775' column='1'/>
+        <parameter type-id='type-id-15' name='dev_id' filepath='kernel/irq/manage.c' line='1775' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='request_threaded_irq' mangled-name='request_threaded_irq' filepath='kernel/irq/manage.c' line='1842' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='request_threaded_irq'>
+        <parameter type-id='type-id-5' name='irq' filepath='kernel/irq/manage.c' line='1842' column='1'/>
+        <parameter type-id='type-id-3482' name='handler' filepath='kernel/irq/manage.c' line='1842' column='1'/>
+        <parameter type-id='type-id-3482' name='thread_fn' filepath='kernel/irq/manage.c' line='1843' column='1'/>
+        <parameter type-id='type-id-16' name='irqflags' filepath='kernel/irq/manage.c' line='1843' column='1'/>
+        <parameter type-id='type-id-4' name='devname' filepath='kernel/irq/manage.c' line='1844' column='1'/>
+        <parameter type-id='type-id-15' name='dev_id' filepath='kernel/irq/manage.c' line='1844' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3485'>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-3484'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/irq/devres.c' language='LANG_C89'>
+      <function-decl name='devm_request_threaded_irq' mangled-name='devm_request_threaded_irq' filepath='kernel/irq/devres.c' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_request_threaded_irq'>
+        <parameter type-id='type-id-240' name='dev' filepath='kernel/irq/devres.c' line='51' column='1'/>
+        <parameter type-id='type-id-5' name='irq' filepath='kernel/irq/devres.c' line='51' column='1'/>
+        <parameter type-id='type-id-3482' name='handler' filepath='kernel/irq/devres.c' line='52' column='1'/>
+        <parameter type-id='type-id-3482' name='thread_fn' filepath='kernel/irq/devres.c' line='52' column='1'/>
+        <parameter type-id='type-id-16' name='irqflags' filepath='kernel/irq/devres.c' line='53' column='1'/>
+        <parameter type-id='type-id-4' name='devname' filepath='kernel/irq/devres.c' line='53' column='1'/>
+        <parameter type-id='type-id-15' name='dev_id' filepath='kernel/irq/devres.c' line='54' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/irq/irqdomain.c' language='LANG_C89'>
+      <function-decl name='irq_dispose_mapping' mangled-name='irq_dispose_mapping' filepath='kernel/irq/irqdomain.c' line='848' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_dispose_mapping'>
+        <parameter type-id='type-id-5' name='virq' filepath='kernel/irq/irqdomain.c' line='848' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/of/device.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='32' id='type-id-3486'>
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <enum-decl name='iommu_cap' filepath='include/linux/iommu.h' line='99' column='1' id='type-id-3487'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='IOMMU_CAP_CACHE_COHERENCY' value='0'/>
+        <enumerator name='IOMMU_CAP_INTR_REMAP' value='1'/>
+        <enumerator name='IOMMU_CAP_NOEXEC' value='2'/>
+      </enum-decl>
+      <class-decl name='iommu_domain' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/iommu.h' line='89' column='1' id='type-id-3488'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-5' visibility='default' filepath='include/linux/iommu.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ops' type-id='type-id-2045' visibility='default' filepath='include/linux/iommu.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='pgsize_bitmap' type-id='type-id-16' visibility='default' filepath='include/linux/iommu.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='handler' type-id='type-id-3489' visibility='default' filepath='include/linux/iommu.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='handler_token' type-id='type-id-15' visibility='default' filepath='include/linux/iommu.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='geometry' type-id='type-id-3490' visibility='default' filepath='include/linux/iommu.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='iova_cookie' type-id='type-id-15' visibility='default' filepath='include/linux/iommu.h' line='96' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='iommu_fault_handler_t' type-id='type-id-3491' filepath='include/linux/iommu.h' line='56' column='1' id='type-id-3489'/>
+      <class-decl name='iommu_domain_geometry' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/iommu.h' line='59' column='1' id='type-id-3490'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='aperture_start' type-id='type-id-2081' visibility='default' filepath='include/linux/iommu.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='aperture_end' type-id='type-id-2081' visibility='default' filepath='include/linux/iommu.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='force_aperture' type-id='type-id-33' visibility='default' filepath='include/linux/iommu.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='iommu_attr' filepath='include/linux/iommu.h' line='119' column='1' id='type-id-3492'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DOMAIN_ATTR_GEOMETRY' value='0'/>
+        <enumerator name='DOMAIN_ATTR_PAGING' value='1'/>
+        <enumerator name='DOMAIN_ATTR_WINDOWS' value='2'/>
+        <enumerator name='DOMAIN_ATTR_FSL_PAMU_STASH' value='3'/>
+        <enumerator name='DOMAIN_ATTR_FSL_PAMU_ENABLE' value='4'/>
+        <enumerator name='DOMAIN_ATTR_FSL_PAMUV1' value='5'/>
+        <enumerator name='DOMAIN_ATTR_NESTING' value='6'/>
+        <enumerator name='DOMAIN_ATTR_MAX' value='7'/>
+      </enum-decl>
+      <class-decl name='iommu_resv_region' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/iommu.h' line='150' column='1' id='type-id-3493'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/iommu.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='start' type-id='type-id-99' visibility='default' filepath='include/linux/iommu.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='length' type-id='type-id-84' visibility='default' filepath='include/linux/iommu.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='prot' type-id='type-id-17' visibility='default' filepath='include/linux/iommu.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='type' type-id='type-id-3494' visibility='default' filepath='include/linux/iommu.h' line='155' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='iommu_resv_type' filepath='include/linux/iommu.h' line='131' column='1' id='type-id-3494'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='IOMMU_RESV_DIRECT' value='0'/>
+        <enumerator name='IOMMU_RESV_RESERVED' value='1'/>
+        <enumerator name='IOMMU_RESV_MSI' value='2'/>
+        <enumerator name='IOMMU_RESV_SW_MSI' value='3'/>
+      </enum-decl>
+      <pointer-type-def type-id='type-id-3495' size-in-bits='64' id='type-id-3496'/>
+      <pointer-type-def type-id='type-id-3497' size-in-bits='64' id='type-id-3498'/>
+      <pointer-type-def type-id='type-id-3499' size-in-bits='64' id='type-id-3491'/>
+      <pointer-type-def type-id='type-id-3500' size-in-bits='64' id='type-id-3501'/>
+      <pointer-type-def type-id='type-id-3502' size-in-bits='64' id='type-id-3503'/>
+      <pointer-type-def type-id='type-id-3504' size-in-bits='64' id='type-id-3505'/>
+      <pointer-type-def type-id='type-id-3506' size-in-bits='64' id='type-id-3507'/>
+      <pointer-type-def type-id='type-id-3488' size-in-bits='64' id='type-id-3508'/>
+      <pointer-type-def type-id='type-id-3509' size-in-bits='64' id='type-id-3510'/>
+      <pointer-type-def type-id='type-id-3511' size-in-bits='64' id='type-id-3512'/>
+      <pointer-type-def type-id='type-id-3493' size-in-bits='64' id='type-id-3513'/>
+      <pointer-type-def type-id='type-id-3514' size-in-bits='64' id='type-id-3515'/>
+      <pointer-type-def type-id='type-id-3516' size-in-bits='64' id='type-id-3517'/>
+      <pointer-type-def type-id='type-id-3518' size-in-bits='64' id='type-id-3519'/>
+      <pointer-type-def type-id='type-id-3520' size-in-bits='64' id='type-id-3521'/>
+      <pointer-type-def type-id='type-id-3522' size-in-bits='64' id='type-id-3523'/>
+      <pointer-type-def type-id='type-id-3524' size-in-bits='64' id='type-id-3525'/>
+      <pointer-type-def type-id='type-id-3526' size-in-bits='64' id='type-id-3527'/>
+      <pointer-type-def type-id='type-id-3528' size-in-bits='64' id='type-id-3529'/>
+      <pointer-type-def type-id='type-id-3530' size-in-bits='64' id='type-id-3531'/>
+      <pointer-type-def type-id='type-id-3532' size-in-bits='64' id='type-id-3533'/>
+      <pointer-type-def type-id='type-id-3534' size-in-bits='64' id='type-id-3535'/>
+      <pointer-type-def type-id='type-id-3536' size-in-bits='64' id='type-id-3537'/>
+      <function-decl name='of_match_device' mangled-name='of_match_device' filepath='drivers/of/device.c' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_match_device'>
+        <parameter type-id='type-id-2049' name='matches' filepath='drivers/of/device.c' line='26' column='1'/>
+        <parameter type-id='type-id-2650' name='dev' filepath='drivers/of/device.c' line='27' column='1'/>
+        <return type-id='type-id-2049'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3495'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-3515'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3497'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-240'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3499'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3500'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-3492'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3502'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3504'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-99'/>
+        <parameter type-id='type-id-40'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3506'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-99'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3509'>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-3508'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3511'>
+        <parameter type-id='type-id-240'/>
+        <return type-id='type-id-2027'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3516'>
+        <parameter type-id='type-id-3487'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3518'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-240'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3520'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-2081'/>
+        <return type-id='type-id-99'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3522'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-84'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3524'>
+        <parameter type-id='type-id-3508'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3526'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-3513'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3528'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-877'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3530'>
+        <parameter type-id='type-id-3508'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3532'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-240'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3534'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3536'>
+        <parameter type-id='type-id-3508'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/dma/coherent.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='72' id='type-id-3538'>
+        <subrange length='9' type-id='type-id-9' id='type-id-951'/>
+
+      </array-type-def>
+      <typedef-decl name='kernel_ulong_t' type-id='type-id-16' filepath='include/linux/mod_devicetable.h' line='14' column='1' id='type-id-3539'/>
+      <class-decl name='device_node' size-in-bits='1408' is-struct='yes' visibility='default' filepath='include/linux/of.h' line='51' column='1' id='type-id-3540'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/of.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='type' type-id='type-id-4' visibility='default' filepath='include/linux/of.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='phandle' type-id='type-id-3541' visibility='default' filepath='include/linux/of.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='full_name' type-id='type-id-4' visibility='default' filepath='include/linux/of.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='fwnode' type-id='type-id-2161' visibility='default' filepath='include/linux/of.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='properties' type-id='type-id-3542' visibility='default' filepath='include/linux/of.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='deadprops' type-id='type-id-3542' visibility='default' filepath='include/linux/of.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='parent' type-id='type-id-3543' visibility='default' filepath='include/linux/of.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='child' type-id='type-id-3543' visibility='default' filepath='include/linux/of.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='sibling' type-id='type-id-3543' visibility='default' filepath='include/linux/of.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/of.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='_flags' type-id='type-id-16' visibility='default' filepath='include/linux/of.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/of.h' line='67' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='phandle' type-id='type-id-7' filepath='include/linux/of.h' line='28' column='1' id='type-id-3541'/>
+      <class-decl name='property' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/of.h' line='31' column='1' id='type-id-3544'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/linux/of.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='length' type-id='type-id-17' visibility='default' filepath='include/linux/of.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='value' type-id='type-id-15' visibility='default' filepath='include/linux/of.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='next' type-id='type-id-3542' visibility='default' filepath='include/linux/of.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='attr' type-id='type-id-2037' visibility='default' filepath='include/linux/of.h' line='43' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-3540' size-in-bits='64' id='type-id-3543'/>
+      <pointer-type-def type-id='type-id-3544' size-in-bits='64' id='type-id-3542'/>
+      <function-decl name='dma_alloc_from_dev_coherent' mangled-name='dma_alloc_from_dev_coherent' filepath='kernel/dma/coherent.c' line='207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_alloc_from_dev_coherent'>
+        <parameter type-id='type-id-240' name='dev' filepath='kernel/dma/coherent.c' line='207' column='1'/>
+        <parameter type-id='type-id-86' name='size' filepath='kernel/dma/coherent.c' line='207' column='1'/>
+        <parameter type-id='type-id-2741' name='dma_handle' filepath='kernel/dma/coherent.c' line='208' column='1'/>
+        <parameter type-id='type-id-528' name='ret' filepath='kernel/dma/coherent.c' line='208' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='dma_release_from_dev_coherent' mangled-name='dma_release_from_dev_coherent' filepath='kernel/dma/coherent.c' line='265' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_release_from_dev_coherent'>
+        <parameter type-id='type-id-240' name='dev' filepath='kernel/dma/coherent.c' line='265' column='1'/>
+        <parameter type-id='type-id-17' name='order' filepath='kernel/dma/coherent.c' line='265' column='1'/>
+        <parameter type-id='type-id-15' name='vaddr' filepath='kernel/dma/coherent.c' line='265' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/dma/swiotlb.c' language='LANG_C89'>
+      <function-decl name='swiotlb_max_segment' mangled-name='swiotlb_max_segment' filepath='kernel/dma/swiotlb.c' line='137' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='swiotlb_max_segment'>
+        <return type-id='type-id-5'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/freezer.c' language='LANG_C89'>
+      <function-decl name='freezing_slow_path' mangled-name='freezing_slow_path' filepath='kernel/freezer.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='freezing_slow_path'>
+        <parameter type-id='type-id-431' name='p' filepath='kernel/freezer.c' line='42' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='__refrigerator' mangled-name='__refrigerator' filepath='kernel/freezer.c' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__refrigerator'>
+        <parameter type-id='type-id-33' name='check_kthr_stop' filepath='kernel/freezer.c' line='61' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/proc/generic.c' language='LANG_C89'>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='fs/proc/internal.h' line='48' column='1' id='type-id-3545'>
+        <data-member access='private'>
+          <var-decl name='seq_ops' type-id='type-id-1446' visibility='default' filepath='fs/proc/internal.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='single_show' type-id='type-id-311' visibility='default' filepath='fs/proc/internal.h' line='50' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='proc_write_t' type-id='type-id-3546' filepath='include/linux/proc_fs.h' line='17' column='1' id='type-id-3547'/>
+      <typedef-decl name='nlink_t' type-id='type-id-7' filepath='include/linux/types.h' line='20' column='1' id='type-id-3548'/>
+      <pointer-type-def type-id='type-id-3549' size-in-bits='64' id='type-id-3546'/>
+      <function-decl name='proc_mkdir_data' mangled-name='proc_mkdir_data' filepath='fs/proc/generic.c' line='461' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proc_mkdir_data'>
+        <parameter type-id='type-id-4' name='name' filepath='fs/proc/generic.c' line='461' column='1'/>
+        <parameter type-id='type-id-329' name='mode' filepath='fs/proc/generic.c' line='461' column='1'/>
+        <parameter type-id='type-id-262' name='parent' filepath='fs/proc/generic.c' line='462' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='fs/proc/generic.c' line='462' column='1'/>
+        <return type-id='type-id-262'/>
+      </function-decl>
+      <function-decl name='remove_proc_entry' mangled-name='remove_proc_entry' filepath='fs/proc/generic.c' line='654' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='remove_proc_entry'>
+        <parameter type-id='type-id-4' name='name' filepath='fs/proc/generic.c' line='654' column='1'/>
+        <parameter type-id='type-id-262' name='parent' filepath='fs/proc/generic.c' line='654' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='PDE_DATA' mangled-name='PDE_DATA' filepath='fs/proc/generic.c' line='749' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PDE_DATA'>
+        <parameter type-id='type-id-2671' name='inode' filepath='fs/proc/generic.c' line='749' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3549'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/time/timer.c' language='LANG_C89'>
+      <function-decl name='round_jiffies' mangled-name='round_jiffies' filepath='kernel/time/timer.c' line='380' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='round_jiffies'>
+        <parameter type-id='type-id-16' name='j' filepath='kernel/time/timer.c' line='380' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+      <function-decl name='init_timer_key' mangled-name='init_timer_key' filepath='kernel/time/timer.c' line='802' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='init_timer_key'>
+        <parameter type-id='type-id-3065' name='timer' filepath='kernel/time/timer.c' line='802' column='1'/>
+        <parameter type-id='type-id-2005' name='func' filepath='kernel/time/timer.c' line='803' column='1'/>
+        <parameter type-id='type-id-5' name='flags' filepath='kernel/time/timer.c' line='803' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='kernel/time/timer.c' line='804' column='1'/>
+        <parameter type-id='type-id-1696' name='key' filepath='kernel/time/timer.c' line='804' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='mod_timer' mangled-name='mod_timer' filepath='kernel/time/timer.c' line='1100' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mod_timer'>
+        <parameter type-id='type-id-3065' name='timer' filepath='kernel/time/timer.c' line='1100' column='1'/>
+        <parameter type-id='type-id-16' name='expires' filepath='kernel/time/timer.c' line='1100' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='add_timer' mangled-name='add_timer' filepath='kernel/time/timer.c' line='1135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='add_timer'>
+        <parameter type-id='type-id-3065' name='timer' filepath='kernel/time/timer.c' line='1135' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='del_timer' mangled-name='del_timer' filepath='kernel/time/timer.c' line='1192' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='del_timer'>
+        <parameter type-id='type-id-3065' name='timer' filepath='kernel/time/timer.c' line='1192' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='del_timer_sync' mangled-name='del_timer_sync' filepath='kernel/time/timer.c' line='1273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='del_timer_sync'>
+        <parameter type-id='type-id-3065' name='timer' filepath='kernel/time/timer.c' line='1273' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='schedule_timeout' mangled-name='schedule_timeout' filepath='kernel/time/timer.c' line='1767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='schedule_timeout'>
+        <parameter type-id='type-id-192' name='timeout' filepath='kernel/time/timer.c' line='1767' column='1'/>
+        <return type-id='type-id-192'/>
+      </function-decl>
+      <function-decl name='msleep' mangled-name='msleep' filepath='kernel/time/timer.c' line='1953' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='msleep'>
+        <parameter type-id='type-id-5' name='msecs' filepath='kernel/time/timer.c' line='1953' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='usleep_range' mangled-name='usleep_range' filepath='kernel/time/timer.c' line='1989' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usleep_range'>
+        <parameter type-id='type-id-16' name='min' filepath='kernel/time/timer.c' line='1989' column='1'/>
+        <parameter type-id='type-id-16' name='max' filepath='kernel/time/timer.c' line='1989' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/time/timekeeping.c' language='LANG_C89'>
+      <enum-decl name='tk_offsets' filepath='include/linux/timekeeping.h' line='60' column='1' id='type-id-3550'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='TK_OFFS_REAL' value='0'/>
+        <enumerator name='TK_OFFS_BOOT' value='1'/>
+        <enumerator name='TK_OFFS_TAI' value='2'/>
+        <enumerator name='TK_OFFS_MAX' value='3'/>
+      </enum-decl>
+      <function-decl name='ktime_get' mangled-name='ktime_get' filepath='kernel/time/timekeeping.c' line='746' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ktime_get'>
+        <return type-id='type-id-682'/>
+      </function-decl>
+      <function-decl name='ktime_get_with_offset' mangled-name='ktime_get_with_offset' filepath='kernel/time/timekeeping.c' line='789' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ktime_get_with_offset'>
+        <parameter type-id='type-id-3550' name='offs' filepath='kernel/time/timekeeping.c' line='789' column='1'/>
+        <return type-id='type-id-682'/>
+      </function-decl>
+      <function-decl name='ktime_get_ts64' mangled-name='ktime_get_ts64' filepath='kernel/time/timekeeping.c' line='879' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ktime_get_ts64'>
+        <parameter type-id='type-id-3066' name='ts' filepath='kernel/time/timekeeping.c' line='879' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='ktime_get_real_seconds' mangled-name='ktime_get_real_seconds' filepath='kernel/time/timekeeping.c' line='931' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ktime_get_real_seconds'>
+        <return type-id='type-id-1339'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/bus.c' language='LANG_C89'>
+      <function-decl name='bus_register' mangled-name='bus_register' filepath='drivers/base/bus.c' line='851' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bus_register'>
+        <parameter type-id='type-id-2010' name='bus' filepath='drivers/base/bus.c' line='851' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='bus_unregister' mangled-name='bus_unregister' filepath='drivers/base/bus.c' line='936' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bus_unregister'>
+        <parameter type-id='type-id-2010' name='bus' filepath='drivers/base/bus.c' line='936' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/platform.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='160' id='type-id-3551'>
+        <subrange length='20' type-id='type-id-9' id='type-id-1182'/>
+
+      </array-type-def>
+      <class-decl name='mfd_cell' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3552'/>
+      <class-decl name='platform_device' size-in-bits='6656' is-struct='yes' visibility='default' filepath='include/linux/platform_device.h' line='23' column='1' id='type-id-3553'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/platform_device.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/platform_device.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='id_auto' type-id='type-id-33' visibility='default' filepath='include/linux/platform_device.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/platform_device.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='num_resources' type-id='type-id-7' visibility='default' filepath='include/linux/platform_device.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='resource' type-id='type-id-2155' visibility='default' filepath='include/linux/platform_device.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='id_entry' type-id='type-id-3554' visibility='default' filepath='include/linux/platform_device.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='driver_override' type-id='type-id-2' visibility='default' filepath='include/linux/platform_device.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='mfd_cell' type-id='type-id-3555' visibility='default' filepath='include/linux/platform_device.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='archdata' type-id='type-id-3556' visibility='default' filepath='include/linux/platform_device.h' line='38' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='platform_device_id' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/mod_devicetable.h' line='546' column='1' id='type-id-3557'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-3551' visibility='default' filepath='include/linux/mod_devicetable.h' line='547' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='driver_data' type-id='type-id-3539' visibility='default' filepath='include/linux/mod_devicetable.h' line='548' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pdev_archdata' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/device.h' line='29' column='1' id='type-id-3556'/>
+      <class-decl name='platform_device_info' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/platform_device.h' line='62' column='1' id='type-id-3558'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='parent' type-id='type-id-240' visibility='default' filepath='include/linux/platform_device.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fwnode' type-id='type-id-2023' visibility='default' filepath='include/linux/platform_device.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/platform_device.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/platform_device.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='res' type-id='type-id-3559' visibility='default' filepath='include/linux/platform_device.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='num_res' type-id='type-id-5' visibility='default' filepath='include/linux/platform_device.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/platform_device.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='size_data' type-id='type-id-84' visibility='default' filepath='include/linux/platform_device.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dma_mask' type-id='type-id-40' visibility='default' filepath='include/linux/platform_device.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='properties' type-id='type-id-3560' visibility='default' filepath='include/linux/platform_device.h' line='76' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='property_entry' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/property.h' line='185' column='1' id='type-id-3561'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/property.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='length' type-id='type-id-84' visibility='default' filepath='include/linux/property.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='is_array' type-id='type-id-33' visibility='default' filepath='include/linux/property.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='type' type-id='type-id-3562' visibility='default' filepath='include/linux/property.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='' type-id='type-id-3563' visibility='default' filepath='include/linux/property.h' line='190' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='dev_prop_type' filepath='include/linux/property.h' line='21' column='1' id='type-id-3562'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DEV_PROP_U8' value='0'/>
+        <enumerator name='DEV_PROP_U16' value='1'/>
+        <enumerator name='DEV_PROP_U32' value='2'/>
+        <enumerator name='DEV_PROP_U64' value='3'/>
+        <enumerator name='DEV_PROP_STRING' value='4'/>
+        <enumerator name='DEV_PROP_MAX' value='5'/>
+      </enum-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/property.h' line='190' column='1' id='type-id-3563'>
+        <data-member access='private'>
+          <var-decl name='pointer' type-id='type-id-3564' visibility='default' filepath='include/linux/property.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='value' type-id='type-id-3565' visibility='default' filepath='include/linux/property.h' line='204' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/property.h' line='191' column='1' id='type-id-3564'>
+        <data-member access='private'>
+          <var-decl name='u8_data' type-id='type-id-658' visibility='default' filepath='include/linux/property.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='u16_data' type-id='type-id-3566' visibility='default' filepath='include/linux/property.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='u32_data' type-id='type-id-2726' visibility='default' filepath='include/linux/property.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='u64_data' type-id='type-id-3567' visibility='default' filepath='include/linux/property.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='str' type-id='type-id-92' visibility='default' filepath='include/linux/property.h' line='196' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/property.h' line='198' column='1' id='type-id-3565'>
+        <data-member access='private'>
+          <var-decl name='u8_data' type-id='type-id-214' visibility='default' filepath='include/linux/property.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='u16_data' type-id='type-id-688' visibility='default' filepath='include/linux/property.h' line='200' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='u32_data' type-id='type-id-7' visibility='default' filepath='include/linux/property.h' line='201' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='u64_data' type-id='type-id-40' visibility='default' filepath='include/linux/property.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='str' type-id='type-id-4' visibility='default' filepath='include/linux/property.h' line='203' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='platform_driver' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/linux/platform_device.h' line='180' column='1' id='type-id-3568'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='probe' type-id='type-id-3569' visibility='default' filepath='include/linux/platform_device.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='remove' type-id='type-id-3569' visibility='default' filepath='include/linux/platform_device.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='shutdown' type-id='type-id-3570' visibility='default' filepath='include/linux/platform_device.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='suspend' type-id='type-id-3571' visibility='default' filepath='include/linux/platform_device.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='resume' type-id='type-id-3569' visibility='default' filepath='include/linux/platform_device.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='driver' type-id='type-id-2047' visibility='default' filepath='include/linux/platform_device.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='id_table' type-id='type-id-3554' visibility='default' filepath='include/linux/platform_device.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='prevent_deferred_probe' type-id='type-id-33' visibility='default' filepath='include/linux/platform_device.h' line='188' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-3557' const='yes' id='type-id-3572'/>
+      <pointer-type-def type-id='type-id-3572' size-in-bits='64' id='type-id-3554'/>
+      <qualified-type-def type-id='type-id-3558' const='yes' id='type-id-3573'/>
+      <pointer-type-def type-id='type-id-3573' size-in-bits='64' id='type-id-3574'/>
+      <qualified-type-def type-id='type-id-2144' const='yes' id='type-id-3575'/>
+      <pointer-type-def type-id='type-id-3575' size-in-bits='64' id='type-id-3559'/>
+      <pointer-type-def type-id='type-id-2441' size-in-bits='64' id='type-id-3566'/>
+      <qualified-type-def type-id='type-id-40' const='yes' id='type-id-3576'/>
+      <pointer-type-def type-id='type-id-3576' size-in-bits='64' id='type-id-3567'/>
+      <pointer-type-def type-id='type-id-3577' size-in-bits='64' id='type-id-3569'/>
+      <pointer-type-def type-id='type-id-3578' size-in-bits='64' id='type-id-3571'/>
+      <pointer-type-def type-id='type-id-3552' size-in-bits='64' id='type-id-3555'/>
+      <pointer-type-def type-id='type-id-3553' size-in-bits='64' id='type-id-3579'/>
+      <pointer-type-def type-id='type-id-3568' size-in-bits='64' id='type-id-3580'/>
+      <pointer-type-def type-id='type-id-3561' size-in-bits='64' id='type-id-3560'/>
+      <pointer-type-def type-id='type-id-3581' size-in-bits='64' id='type-id-3570'/>
+      <function-decl name='platform_get_resource' mangled-name='platform_get_resource' filepath='drivers/base/platform.c' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='platform_get_resource'>
+        <parameter type-id='type-id-3579' name='dev' filepath='drivers/base/platform.c' line='67' column='1'/>
+        <parameter type-id='type-id-5' name='type' filepath='drivers/base/platform.c' line='68' column='1'/>
+        <parameter type-id='type-id-5' name='num' filepath='drivers/base/platform.c' line='68' column='1'/>
+        <return type-id='type-id-2155'/>
+      </function-decl>
+      <function-decl name='platform_get_irq' mangled-name='platform_get_irq' filepath='drivers/base/platform.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='platform_get_irq'>
+        <parameter type-id='type-id-3579' name='dev' filepath='drivers/base/platform.c' line='87' column='1'/>
+        <parameter type-id='type-id-5' name='num' filepath='drivers/base/platform.c' line='87' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='platform_device_unregister' mangled-name='platform_device_unregister' filepath='drivers/base/platform.c' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='platform_device_unregister'>
+        <parameter type-id='type-id-3579' name='pdev' filepath='drivers/base/platform.c' line='489' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='platform_device_put' mangled-name='platform_device_put' filepath='drivers/base/platform.c' line='236' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='platform_device_put'>
+        <parameter type-id='type-id-3579' name='pdev' filepath='drivers/base/platform.c' line='236' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='platform_device_alloc' mangled-name='platform_device_alloc' filepath='drivers/base/platform.c' line='264' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='platform_device_alloc'>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/base/platform.c' line='264' column='1'/>
+        <parameter type-id='type-id-17' name='id' filepath='drivers/base/platform.c' line='264' column='1'/>
+        <return type-id='type-id-3579'/>
+      </function-decl>
+      <function-decl name='platform_device_add_data' mangled-name='platform_device_add_data' filepath='drivers/base/platform.c' line='320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='platform_device_add_data'>
+        <parameter type-id='type-id-3579' name='pdev' filepath='drivers/base/platform.c' line='320' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='drivers/base/platform.c' line='320' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='drivers/base/platform.c' line='321' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='platform_device_add' mangled-name='platform_device_add' filepath='drivers/base/platform.c' line='360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='platform_device_add'>
+        <parameter type-id='type-id-3579' name='pdev' filepath='drivers/base/platform.c' line='360' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='platform_device_del' mangled-name='platform_device_del' filepath='drivers/base/platform.c' line='447' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='platform_device_del'>
+        <parameter type-id='type-id-3579' name='pdev' filepath='drivers/base/platform.c' line='447' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='platform_device_register_full' mangled-name='platform_device_register_full' filepath='drivers/base/platform.c' line='504' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='platform_device_register_full'>
+        <parameter type-id='type-id-3574' name='pdevinfo' filepath='drivers/base/platform.c' line='505' column='1'/>
+        <return type-id='type-id-3579'/>
+      </function-decl>
+      <function-decl name='__platform_driver_register' mangled-name='__platform_driver_register' filepath='drivers/base/platform.c' line='628' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__platform_driver_register'>
+        <parameter type-id='type-id-3580' name='drv' filepath='drivers/base/platform.c' line='628' column='1'/>
+        <parameter type-id='type-id-260' name='owner' filepath='drivers/base/platform.c' line='629' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='platform_driver_unregister' mangled-name='platform_driver_unregister' filepath='drivers/base/platform.c' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='platform_driver_unregister'>
+        <parameter type-id='type-id-3580' name='drv' filepath='drivers/base/platform.c' line='645' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3577'>
+        <parameter type-id='type-id-3579' name='pdev'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3578'>
+        <parameter type-id='type-id-3579'/>
+        <parameter type-id='type-id-2053'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3581'>
+        <parameter type-id='type-id-3579' name='pdev'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/module.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-2037' size-in-bits='infinite' id='type-id-3582'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3583' size-in-bits='infinite' id='type-id-3584'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='module_sect_attr' size-in-bits='576' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1453' column='1' id='type-id-3583'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mattr' type-id='type-id-2430' visibility='default' filepath='kernel/module.c' line='1454' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='kernel/module.c' line='1455' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='address' type-id='type-id-16' visibility='default' filepath='kernel/module.c' line='1456' column='1'/>
+        </data-member>
+      </class-decl>
+      <function-decl name='module_put' mangled-name='module_put' filepath='kernel/module.c' line='1129' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='module_put'>
+        <parameter type-id='type-id-260' name='module' filepath='kernel/module.c' line='1129' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__module_get' mangled-name='__module_get' filepath='kernel/module.c' line='1099' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__module_get'>
+        <parameter type-id='type-id-260' name='module' filepath='kernel/module.c' line='1099' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='try_module_get' mangled-name='try_module_get' filepath='kernel/module.c' line='1110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='try_module_get'>
+        <parameter type-id='type-id-260' name='module' filepath='kernel/module.c' line='1110' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/cfi.c' language='LANG_C89'>
+      <function-decl name='__cfi_slowpath' mangled-name='__cfi_slowpath' filepath='kernel/cfi.c' line='285' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cfi_slowpath'>
+        <parameter type-id='type-id-2438' name='id' filepath='kernel/cfi.c' line='285' column='1'/>
+        <parameter type-id='type-id-15' name='ptr' filepath='kernel/cfi.c' line='285' column='1'/>
+        <parameter type-id='type-id-15' name='diag' filepath='kernel/cfi.c' line='285' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/trace/trace_output.c' language='LANG_C89'>
+      <class-decl name='trace_print_flags' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/tracepoint-defs.h' line='14' column='1' id='type-id-3585'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mask' type-id='type-id-16' visibility='default' filepath='include/linux/tracepoint-defs.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/tracepoint-defs.h' line='16' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-3585' const='yes' id='type-id-3586'/>
+      <pointer-type-def type-id='type-id-3586' size-in-bits='64' id='type-id-3587'/>
+      <function-decl name='trace_print_symbols_seq' mangled-name='trace_print_symbols_seq' filepath='kernel/trace/trace_output.c' line='103' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='trace_print_symbols_seq'>
+        <parameter type-id='type-id-68' name='p' filepath='kernel/trace/trace_output.c' line='103' column='1'/>
+        <parameter type-id='type-id-16' name='val' filepath='kernel/trace/trace_output.c' line='103' column='1'/>
+        <parameter type-id='type-id-3587' name='symbol_array' filepath='kernel/trace/trace_output.c' line='104' column='1'/>
+        <return type-id='type-id-4'/>
+      </function-decl>
+      <function-decl name='trace_raw_output_prep' mangled-name='trace_raw_output_prep' filepath='kernel/trace/trace_output.c' line='277' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='trace_raw_output_prep'>
+        <parameter type-id='type-id-82' name='iter' filepath='kernel/trace/trace_output.c' line='277' column='1'/>
+        <parameter type-id='type-id-831' name='trace_event' filepath='kernel/trace/trace_output.c' line='278' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/open.c' language='LANG_C89'>
+      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/fsnotify_backend.h' line='283' column='1' id='type-id-3588'>
+        <data-member access='private'>
+          <var-decl name='obj' type-id='type-id-3589' visibility='default' filepath='include/linux/fsnotify_backend.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='destroy_next' type-id='type-id-1306' visibility='default' filepath='include/linux/fsnotify_backend.h' line='287' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='fsnotify_connp_t' type-id='type-id-1306' filepath='include/linux/fsnotify_backend.h' line='272' column='1' id='type-id-3590'/>
+      <pointer-type-def type-id='type-id-3590' size-in-bits='64' id='type-id-3589'/>
+      <function-decl name='nonseekable_open' mangled-name='nonseekable_open' filepath='fs/open.c' line='1242' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nonseekable_open'>
+        <parameter type-id='type-id-1127' name='inode' filepath='fs/open.c' line='1242' column='1'/>
+        <parameter type-id='type-id-83' name='filp' filepath='fs/open.c' line='1242' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/trace/trace_seq.c' language='LANG_C89'>
+      <function-decl name='trace_seq_printf' mangled-name='trace_seq_printf' filepath='kernel/trace/trace_seq.c' line='84' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='trace_seq_printf'>
+        <parameter type-id='type-id-68' name='s' filepath='kernel/trace/trace_seq.c' line='84' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='kernel/trace/trace_seq.c' line='84' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/trace/trace_events.c' language='LANG_C89'>
+      <function-decl name='trace_define_field' mangled-name='trace_define_field' filepath='kernel/trace/trace_events.c' line='139' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='trace_define_field'>
+        <parameter type-id='type-id-21' name='call' filepath='kernel/trace/trace_events.c' line='139' column='1'/>
+        <parameter type-id='type-id-4' name='type' filepath='kernel/trace/trace_events.c' line='139' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='kernel/trace/trace_events.c' line='140' column='1'/>
+        <parameter type-id='type-id-17' name='offset' filepath='kernel/trace/trace_events.c' line='140' column='1'/>
+        <parameter type-id='type-id-17' name='size' filepath='kernel/trace/trace_events.c' line='140' column='1'/>
+        <parameter type-id='type-id-17' name='is_signed' filepath='kernel/trace/trace_events.c' line='140' column='1'/>
+        <parameter type-id='type-id-17' name='filter_type' filepath='kernel/trace/trace_events.c' line='141' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='trace_event_raw_init' mangled-name='trace_event_raw_init' filepath='kernel/trace/trace_events.c' line='225' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='trace_event_raw_init'>
+        <parameter type-id='type-id-21' name='call' filepath='kernel/trace/trace_events.c' line='225' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='trace_event_ignore_this_pid' mangled-name='trace_event_ignore_this_pid' filepath='kernel/trace/trace_events.c' line='237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='trace_event_ignore_this_pid'>
+        <parameter type-id='type-id-14' name='trace_file' filepath='kernel/trace/trace_events.c' line='237' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='trace_event_buffer_reserve' mangled-name='trace_event_buffer_reserve' filepath='kernel/trace/trace_events.c' line='253' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='trace_event_buffer_reserve'>
+        <parameter type-id='type-id-66' name='fbuffer' filepath='kernel/trace/trace_events.c' line='253' column='1'/>
+        <parameter type-id='type-id-14' name='trace_file' filepath='kernel/trace/trace_events.c' line='254' column='1'/>
+        <parameter type-id='type-id-16' name='len' filepath='kernel/trace/trace_events.c' line='255' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='trace_event_reg' mangled-name='trace_event_reg' filepath='kernel/trace/trace_events.c' line='287' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='trace_event_reg'>
+        <parameter type-id='type-id-21' name='call' filepath='kernel/trace/trace_events.c' line='287' column='1'/>
+        <parameter type-id='type-id-753' name='type' filepath='kernel/trace/trace_events.c' line='288' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='kernel/trace/trace_events.c' line='288' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/trace/trace_event_perf.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-736' size-in-bits='64' id='type-id-3591'/>
+      <function-decl name='perf_trace_buf_alloc' mangled-name='perf_trace_buf_alloc' filepath='kernel/trace/trace_event_perf.c' line='389' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='perf_trace_buf_alloc'>
+        <parameter type-id='type-id-17' name='size' filepath='kernel/trace/trace_event_perf.c' line='389' column='1'/>
+        <parameter type-id='type-id-3591' name='regs' filepath='kernel/trace/trace_event_perf.c' line='389' column='1'/>
+        <parameter type-id='type-id-666' name='rctxp' filepath='kernel/trace/trace_event_perf.c' line='389' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/trace/trace_events_trigger.c' language='LANG_C89'>
+      <enum-decl name='event_trigger_type' filepath='include/linux/trace_events.h' line='421' column='1' id='type-id-3592'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='ETT_NONE' value='0'/>
+        <enumerator name='ETT_TRACE_ONOFF' value='1'/>
+        <enumerator name='ETT_SNAPSHOT' value='2'/>
+        <enumerator name='ETT_STACKTRACE' value='4'/>
+        <enumerator name='ETT_EVENT_ENABLE' value='8'/>
+        <enumerator name='ETT_EVENT_HIST' value='16'/>
+        <enumerator name='ETT_HIST_ENABLE' value='32'/>
+      </enum-decl>
+      <function-decl name='event_triggers_call' mangled-name='event_triggers_call' filepath='kernel/trace/trace_events_trigger.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='event_triggers_call'>
+        <parameter type-id='type-id-14' name='file' filepath='kernel/trace/trace_events_trigger.c' line='55' column='1'/>
+        <parameter type-id='type-id-15' name='rec' filepath='kernel/trace/trace_events_trigger.c' line='55' column='1'/>
+        <parameter type-id='type-id-13' name='event' filepath='kernel/trace/trace_events_trigger.c' line='56' column='1'/>
+        <return type-id='type-id-3592'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/trace/bpf_trace.c' language='LANG_C89'>
+      <function-decl name='bpf_trace_run2' mangled-name='bpf_trace_run2' filepath='kernel/trace/bpf_trace.c' line='1201' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_trace_run2'>
+        <parameter type-id='type-id-1228' name='prog' filepath='kernel/trace/bpf_trace.c' line='1201' column='1'/>
+        <parameter type-id='type-id-40' name='arg0' filepath='kernel/trace/bpf_trace.c' line='1201' column='1'/>
+        <parameter type-id='type-id-40' name='arg1' filepath='kernel/trace/bpf_trace.c' line='1201' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='bpf_trace_run8' mangled-name='bpf_trace_run8' filepath='kernel/trace/bpf_trace.c' line='1207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_trace_run8'>
+        <parameter type-id='type-id-1228' name='prog' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
+        <parameter type-id='type-id-40' name='arg0' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
+        <parameter type-id='type-id-40' name='arg1' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
+        <parameter type-id='type-id-40' name='arg2' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
+        <parameter type-id='type-id-40' name='arg3' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
+        <parameter type-id='type-id-40' name='arg4' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
+        <parameter type-id='type-id-40' name='arg5' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
+        <parameter type-id='type-id-40' name='arg6' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
+        <parameter type-id='type-id-40' name='arg7' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='bpf_trace_run10' mangled-name='bpf_trace_run10' filepath='kernel/trace/bpf_trace.c' line='1209' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_trace_run10'>
+        <parameter type-id='type-id-1228' name='prog' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <parameter type-id='type-id-40' name='arg0' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <parameter type-id='type-id-40' name='arg1' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <parameter type-id='type-id-40' name='arg2' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <parameter type-id='type-id-40' name='arg3' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <parameter type-id='type-id-40' name='arg4' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <parameter type-id='type-id-40' name='arg5' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <parameter type-id='type-id-40' name='arg6' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <parameter type-id='type-id-40' name='arg7' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <parameter type-id='type-id-40' name='arg8' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <parameter type-id='type-id-40' name='arg9' filepath='kernel/trace/bpf_trace.c' line='1209' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='kernel/bpf/syscall.c' language='LANG_C89'>
+      <function-decl name='bpf_prog_put' mangled-name='bpf_prog_put' filepath='kernel/bpf/syscall.c' line='1136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_prog_put'>
+        <parameter type-id='type-id-1228' name='prog' filepath='kernel/bpf/syscall.c' line='1136' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='bpf_prog_add' mangled-name='bpf_prog_add' filepath='kernel/bpf/syscall.c' line='1204' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_prog_add'>
+        <parameter type-id='type-id-1228' name='prog' filepath='kernel/bpf/syscall.c' line='1204' column='1'/>
+        <parameter type-id='type-id-17' name='i' filepath='kernel/bpf/syscall.c' line='1204' column='1'/>
+        <return type-id='type-id-1228'/>
+      </function-decl>
+      <function-decl name='bpf_prog_sub' mangled-name='bpf_prog_sub' filepath='kernel/bpf/syscall.c' line='1214' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_prog_sub'>
+        <parameter type-id='type-id-1228' name='prog' filepath='kernel/bpf/syscall.c' line='1214' column='1'/>
+        <parameter type-id='type-id-17' name='i' filepath='kernel/bpf/syscall.c' line='1214' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/xdp.c' language='LANG_C89'>
+      <enum-decl name='xdp_mem_type' filepath='include/net/xdp.h' line='36' column='1' id='type-id-3593'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='MEM_TYPE_PAGE_SHARED' value='0'/>
+        <enumerator name='MEM_TYPE_PAGE_ORDER0' value='1'/>
+        <enumerator name='MEM_TYPE_PAGE_POOL' value='2'/>
+        <enumerator name='MEM_TYPE_ZERO_COPY' value='3'/>
+        <enumerator name='MEM_TYPE_MAX' value='4'/>
+      </enum-decl>
+      <function-decl name='xdp_rxq_info_unreg' mangled-name='xdp_rxq_info_unreg' filepath='net/core/xdp.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_rxq_info_unreg'>
+        <parameter type-id='type-id-3594' name='xdp_rxq' filepath='net/core/xdp.c' line='114' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='xdp_rxq_info_reg' mangled-name='xdp_rxq_info_reg' filepath='net/core/xdp.c' line='139' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_rxq_info_reg'>
+        <parameter type-id='type-id-3594' name='xdp_rxq' filepath='net/core/xdp.c' line='139' column='1'/>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/xdp.c' line='140' column='1'/>
+        <parameter type-id='type-id-7' name='queue_index' filepath='net/core/xdp.c' line='140' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='xdp_rxq_info_reg_mem_model' mangled-name='xdp_rxq_info_reg_mem_model' filepath='net/core/xdp.c' line='241' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_rxq_info_reg_mem_model'>
+        <parameter type-id='type-id-3594' name='xdp_rxq' filepath='net/core/xdp.c' line='241' column='1'/>
+        <parameter type-id='type-id-3593' name='type' filepath='net/core/xdp.c' line='242' column='1'/>
+        <parameter type-id='type-id-15' name='allocator' filepath='net/core/xdp.c' line='242' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='xdp_return_frame' mangled-name='xdp_return_frame' filepath='net/core/xdp.c' line='353' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_return_frame'>
+        <parameter type-id='type-id-3236' name='xdpf' filepath='net/core/xdp.c' line='353' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='xdp_return_frame_rx_napi' mangled-name='xdp_return_frame_rx_napi' filepath='net/core/xdp.c' line='359' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_return_frame_rx_napi'>
+        <parameter type-id='type-id-3236' name='xdpf' filepath='net/core/xdp.c' line='359' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/rtnetlink.c' language='LANG_C89'>
+      <typedef-decl name='rtnl_doit_func' type-id='type-id-3595' filepath='include/net/rtnetlink.h' line='8' column='1' id='type-id-3596'/>
+      <typedef-decl name='rtnl_dumpit_func' type-id='type-id-1810' filepath='include/net/rtnetlink.h' line='10' column='1' id='type-id-3597'/>
+      <pointer-type-def type-id='type-id-3598' size-in-bits='64' id='type-id-3595'/>
+      <pointer-type-def type-id='type-id-2186' size-in-bits='64' id='type-id-3599'/>
+      <function-decl name='rtnl_lock' mangled-name='rtnl_lock' filepath='net/core/rtnetlink.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtnl_lock'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='rtnl_unlock' mangled-name='rtnl_unlock' filepath='net/core/rtnetlink.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtnl_unlock'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='rtnl_is_locked' mangled-name='rtnl_is_locked' filepath='net/core/rtnetlink.c' line='127' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtnl_is_locked'>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='rtnl_register_module' mangled-name='rtnl_register_module' filepath='net/core/rtnetlink.c' line='240' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtnl_register_module'>
+        <parameter type-id='type-id-260' name='owner' filepath='net/core/rtnetlink.c' line='240' column='1'/>
+        <parameter type-id='type-id-17' name='protocol' filepath='net/core/rtnetlink.c' line='241' column='1'/>
+        <parameter type-id='type-id-17' name='msgtype' filepath='net/core/rtnetlink.c' line='241' column='1'/>
+        <parameter type-id='type-id-3596' name='doit' filepath='net/core/rtnetlink.c' line='242' column='1'/>
+        <parameter type-id='type-id-3597' name='dumpit' filepath='net/core/rtnetlink.c' line='242' column='1'/>
+        <parameter type-id='type-id-5' name='flags' filepath='net/core/rtnetlink.c' line='243' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='rtnl_unregister' mangled-name='rtnl_unregister' filepath='net/core/rtnetlink.c' line='286' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtnl_unregister'>
+        <parameter type-id='type-id-17' name='protocol' filepath='net/core/rtnetlink.c' line='286' column='1'/>
+        <parameter type-id='type-id-17' name='msgtype' filepath='net/core/rtnetlink.c' line='286' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='rtnl_unregister_all' mangled-name='rtnl_unregister_all' filepath='net/core/rtnetlink.c' line='318' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtnl_unregister_all'>
+        <parameter type-id='type-id-17' name='protocol' filepath='net/core/rtnetlink.c' line='318' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='rtnl_link_register' mangled-name='rtnl_link_register' filepath='net/core/rtnetlink.c' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtnl_link_register'>
+        <parameter type-id='type-id-3599' name='ops' filepath='net/core/rtnetlink.c' line='395' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='rtnl_link_unregister' mangled-name='rtnl_link_unregister' filepath='net/core/rtnetlink.c' line='477' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtnl_link_unregister'>
+        <parameter type-id='type-id-3599' name='ops' filepath='net/core/rtnetlink.c' line='477' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3598'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-3035'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/filemap.c' language='LANG_C89'>
+      <function-decl name='unlock_page' mangled-name='unlock_page' filepath='mm/filemap.c' line='1239' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unlock_page'>
+        <parameter type-id='type-id-512' name='page' filepath='mm/filemap.c' line='1239' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/page-writeback.c' language='LANG_C89'>
+      <function-decl name='set_page_dirty' mangled-name='set_page_dirty' filepath='mm/page-writeback.c' line='2546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_page_dirty'>
+        <parameter type-id='type-id-512' name='page' filepath='mm/page-writeback.c' line='2546' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/swap.c' language='LANG_C89'>
+      <function-decl name='__put_page' mangled-name='__put_page' filepath='mm/swap.c' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__put_page'>
+        <parameter type-id='type-id-512' name='page' filepath='mm/swap.c' line='99' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='mark_page_accessed' mangled-name='mark_page_accessed' filepath='mm/swap.c' line='372' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mark_page_accessed'>
+        <parameter type-id='type-id-512' name='page' filepath='mm/swap.c' line='372' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/page_alloc.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-888' size-in-bits='192' id='type-id-3600'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <class-decl name='sysinfo' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='8' column='1' id='type-id-3601'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='uptime' type-id='type-id-105' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='9' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='loads' type-id='type-id-3600' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='totalram' type-id='type-id-888' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='freeram' type-id='type-id-888' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='sharedram' type-id='type-id-888' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='13' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='bufferram' type-id='type-id-888' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='totalswap' type-id='type-id-888' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='freeswap' type-id='type-id-888' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='procs' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='656'>
+          <var-decl name='pad' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='totalhigh' type-id='type-id-888' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='freehigh' type-id='type-id-888' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='mem_unit' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='_f' type-id='type-id-440' visibility='default' filepath='include/uapi/linux/sysinfo.h' line='22' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-1528' size-in-bits='64' id='type-id-3602'/>
+      <pointer-type-def type-id='type-id-3601' size-in-bits='64' id='type-id-3603'/>
+      <function-decl name='__free_pages' mangled-name='__free_pages' filepath='mm/page_alloc.c' line='4541' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__free_pages'>
+        <parameter type-id='type-id-512' name='page' filepath='mm/page_alloc.c' line='4541' column='1'/>
+        <parameter type-id='type-id-5' name='order' filepath='mm/page_alloc.c' line='4541' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__alloc_pages_nodemask' mangled-name='__alloc_pages_nodemask' filepath='mm/page_alloc.c' line='4451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__alloc_pages_nodemask'>
+        <parameter type-id='type-id-485' name='gfp_mask' filepath='mm/page_alloc.c' line='4451' column='1'/>
+        <parameter type-id='type-id-5' name='order' filepath='mm/page_alloc.c' line='4451' column='1'/>
+        <parameter type-id='type-id-17' name='preferred_nid' filepath='mm/page_alloc.c' line='4451' column='1'/>
+        <parameter type-id='type-id-3602' name='nodemask' filepath='mm/page_alloc.c' line='4452' column='1'/>
+        <return type-id='type-id-512'/>
+      </function-decl>
+      <function-decl name='alloc_pages_exact' mangled-name='alloc_pages_exact' filepath='mm/page_alloc.c' line='4694' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='alloc_pages_exact'>
+        <parameter type-id='type-id-84' name='size' filepath='mm/page_alloc.c' line='4694' column='1'/>
+        <parameter type-id='type-id-485' name='gfp_mask' filepath='mm/page_alloc.c' line='4694' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='free_pages_exact' mangled-name='free_pages_exact' filepath='mm/page_alloc.c' line='4730' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_pages_exact'>
+        <parameter type-id='type-id-15' name='virt' filepath='mm/page_alloc.c' line='4730' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='mm/page_alloc.c' line='4730' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='si_mem_available' mangled-name='si_mem_available' filepath='mm/page_alloc.c' line='4801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='si_mem_available'>
+        <return type-id='type-id-192'/>
+      </function-decl>
+      <function-decl name='si_meminfo' mangled-name='si_meminfo' filepath='mm/page_alloc.c' line='4847' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='si_meminfo'>
+        <parameter type-id='type-id-3603' name='val' filepath='mm/page_alloc.c' line='4847' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/vmscan.c' language='LANG_C89'>
+      <function-decl name='register_shrinker' mangled-name='register_shrinker' filepath='mm/vmscan.c' line='418' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_shrinker'>
+        <parameter type-id='type-id-3055' name='shrinker' filepath='mm/vmscan.c' line='418' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='unregister_shrinker' mangled-name='unregister_shrinker' filepath='mm/vmscan.c' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_shrinker'>
+        <parameter type-id='type-id-3055' name='shrinker' filepath='mm/vmscan.c' line='432' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/util.c' language='LANG_C89'>
+      <function-decl name='kmemdup' mangled-name='kmemdup' filepath='mm/util.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmemdup'>
+        <parameter type-id='type-id-15' name='src' filepath='mm/util.c' line='114' column='1'/>
+        <parameter type-id='type-id-84' name='len' filepath='mm/util.c' line='114' column='1'/>
+        <parameter type-id='type-id-485' name='gfp' filepath='mm/util.c' line='114' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='memdup_user' mangled-name='memdup_user' filepath='mm/util.c' line='156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='memdup_user'>
+        <parameter type-id='type-id-15' name='src' filepath='mm/util.c' line='156' column='1'/>
+        <parameter type-id='type-id-84' name='len' filepath='mm/util.c' line='156' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='kvfree' mangled-name='kvfree' filepath='mm/util.c' line='447' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kvfree'>
+        <parameter type-id='type-id-15' name='addr' filepath='mm/util.c' line='447' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='kvmalloc_node' mangled-name='kvmalloc_node' filepath='mm/util.c' line='397' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kvmalloc_node'>
+        <parameter type-id='type-id-84' name='size' filepath='mm/util.c' line='397' column='1'/>
+        <parameter type-id='type-id-485' name='flags' filepath='mm/util.c' line='397' column='1'/>
+        <parameter type-id='type-id-17' name='node' filepath='mm/util.c' line='397' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/memory.c' language='LANG_C89'>
+      <typedef-decl name='pfn_t' type-id='type-id-3604' filepath='include/linux/pfn.h' line='15' column='1' id='type-id-3605'/>
+      <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-3605' visibility='default' filepath='include/linux/pfn.h' line='13' column='1' id='type-id-3604'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='val' type-id='type-id-40' visibility='default' filepath='include/linux/pfn.h' line='14' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-763' const='yes' id='type-id-3606'/>
+      <function-decl name='vm_insert_pfn' mangled-name='vm_insert_pfn' filepath='mm/memory.c' line='1863' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_insert_pfn'>
+        <parameter type-id='type-id-1207' name='vma' filepath='mm/memory.c' line='1863' column='1'/>
+        <parameter type-id='type-id-16' name='addr' filepath='mm/memory.c' line='1863' column='1'/>
+        <parameter type-id='type-id-16' name='pfn' filepath='mm/memory.c' line='1864' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='vm_insert_mixed' mangled-name='vm_insert_mixed' filepath='mm/memory.c' line='1967' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_insert_mixed'>
+        <parameter type-id='type-id-1207' name='vma' filepath='mm/memory.c' line='1967' column='1'/>
+        <parameter type-id='type-id-16' name='addr' filepath='mm/memory.c' line='1967' column='1'/>
+        <parameter type-id='type-id-3605' name='pfn' filepath='mm/memory.c' line='1968' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='unmap_mapping_range' mangled-name='unmap_mapping_range' filepath='mm/memory.c' line='2902' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unmap_mapping_range'>
+        <parameter type-id='type-id-1279' name='mapping' filepath='mm/memory.c' line='2902' column='1'/>
+        <parameter type-id='type-id-3606' name='holebegin' filepath='mm/memory.c' line='2903' column='1'/>
+        <parameter type-id='type-id-3606' name='holelen' filepath='mm/memory.c' line='2903' column='1'/>
+        <parameter type-id='type-id-17' name='even_cows' filepath='mm/memory.c' line='2903' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/block_dev.c' language='LANG_C89'>
+      <function-decl name='revalidate_disk' mangled-name='revalidate_disk' filepath='fs/block_dev.c' line='1375' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='revalidate_disk'>
+        <parameter type-id='type-id-360' name='disk' filepath='fs/block_dev.c' line='1375' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='check_disk_change' mangled-name='check_disk_change' filepath='fs/block_dev.c' line='1404' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='check_disk_change'>
+        <parameter type-id='type-id-875' name='bdev' filepath='fs/block_dev.c' line='1404' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/slub.c' language='LANG_C89'>
+      <function-decl name='kmem_cache_alloc' mangled-name='kmem_cache_alloc' filepath='mm/slub.c' line='2752' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_alloc'>
+        <parameter type-id='type-id-538' name='s' filepath='mm/slub.c' line='2752' column='1'/>
+        <parameter type-id='type-id-485' name='gfpflags' filepath='mm/slub.c' line='2752' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='kmem_cache_alloc_trace' mangled-name='kmem_cache_alloc_trace' filepath='mm/slub.c' line='2764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_alloc_trace'>
+        <parameter type-id='type-id-538' name='s' filepath='mm/slub.c' line='2764' column='1'/>
+        <parameter type-id='type-id-485' name='gfpflags' filepath='mm/slub.c' line='2764' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='mm/slub.c' line='2764' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='kmem_cache_free' mangled-name='kmem_cache_free' filepath='mm/slub.c' line='2999' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_free'>
+        <parameter type-id='type-id-538' name='s' filepath='mm/slub.c' line='2999' column='1'/>
+        <parameter type-id='type-id-15' name='x' filepath='mm/slub.c' line='2999' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__kmalloc' mangled-name='__kmalloc' filepath='mm/slub.c' line='3772' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__kmalloc'>
+        <parameter type-id='type-id-84' name='size' filepath='mm/slub.c' line='3772' column='1'/>
+        <parameter type-id='type-id-485' name='flags' filepath='mm/slub.c' line='3772' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='kfree' mangled-name='kfree' filepath='mm/slub.c' line='3928' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kfree'>
+        <parameter type-id='type-id-15' name='x' filepath='mm/slub.c' line='3928' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='mm/usercopy.c' language='LANG_C89'>
+      <function-decl name='__check_object_size' mangled-name='__check_object_size' filepath='mm/usercopy.c' line='260' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__check_object_size'>
+        <parameter type-id='type-id-15' name='ptr' filepath='mm/usercopy.c' line='260' column='1'/>
+        <parameter type-id='type-id-16' name='n' filepath='mm/usercopy.c' line='260' column='1'/>
+        <parameter type-id='type-id-33' name='to_user' filepath='mm/usercopy.c' line='260' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/read_write.c' language='LANG_C89'>
+      <function-decl name='generic_file_llseek' mangled-name='generic_file_llseek' filepath='fs/read_write.c' line='144' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='generic_file_llseek'>
+        <parameter type-id='type-id-83' name='file' filepath='fs/read_write.c' line='144' column='1'/>
+        <parameter type-id='type-id-763' name='offset' filepath='fs/read_write.c' line='144' column='1'/>
+        <parameter type-id='type-id-17' name='whence' filepath='fs/read_write.c' line='144' column='1'/>
+        <return type-id='type-id-763'/>
+      </function-decl>
+      <function-decl name='noop_llseek' mangled-name='noop_llseek' filepath='fs/read_write.c' line='224' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='noop_llseek'>
+        <parameter type-id='type-id-83' name='file' filepath='fs/read_write.c' line='224' column='1'/>
+        <parameter type-id='type-id-763' name='offset' filepath='fs/read_write.c' line='224' column='1'/>
+        <parameter type-id='type-id-17' name='whence' filepath='fs/read_write.c' line='224' column='1'/>
+        <return type-id='type-id-763'/>
+      </function-decl>
+      <function-decl name='no_llseek' mangled-name='no_llseek' filepath='fs/read_write.c' line='230' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='no_llseek'>
+        <parameter type-id='type-id-83' name='file' filepath='fs/read_write.c' line='230' column='1'/>
+        <parameter type-id='type-id-763' name='offset' filepath='fs/read_write.c' line='230' column='1'/>
+        <parameter type-id='type-id-17' name='whence' filepath='fs/read_write.c' line='230' column='1'/>
+        <return type-id='type-id-763'/>
+      </function-decl>
+      <function-decl name='default_llseek' mangled-name='default_llseek' filepath='fs/read_write.c' line='236' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='default_llseek'>
+        <parameter type-id='type-id-83' name='file' filepath='fs/read_write.c' line='236' column='1'/>
+        <parameter type-id='type-id-763' name='offset' filepath='fs/read_write.c' line='236' column='1'/>
+        <parameter type-id='type-id-17' name='whence' filepath='fs/read_write.c' line='236' column='1'/>
+        <return type-id='type-id-763'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/file_table.c' language='LANG_C89'>
+      <function-decl name='fput' mangled-name='fput' filepath='fs/file_table.c' line='329' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fput'>
+        <parameter type-id='type-id-83' name='file' filepath='fs/file_table.c' line='329' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/char_dev.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-269' size-in-bits='64' id='type-id-3607'/>
+      <function-decl name='alloc_chrdev_region' mangled-name='alloc_chrdev_region' filepath='fs/char_dev.c' line='245' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='alloc_chrdev_region'>
+        <parameter type-id='type-id-3607' name='dev' filepath='fs/char_dev.c' line='245' column='1'/>
+        <parameter type-id='type-id-5' name='baseminor' filepath='fs/char_dev.c' line='245' column='1'/>
+        <parameter type-id='type-id-5' name='count' filepath='fs/char_dev.c' line='245' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='fs/char_dev.c' line='246' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__register_chrdev' mangled-name='__register_chrdev' filepath='fs/char_dev.c' line='277' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__register_chrdev'>
+        <parameter type-id='type-id-5' name='major' filepath='fs/char_dev.c' line='277' column='1'/>
+        <parameter type-id='type-id-5' name='baseminor' filepath='fs/char_dev.c' line='277' column='1'/>
+        <parameter type-id='type-id-5' name='count' filepath='fs/char_dev.c' line='278' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='fs/char_dev.c' line='278' column='1'/>
+        <parameter type-id='type-id-268' name='fops' filepath='fs/char_dev.c' line='279' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='cdev_alloc' mangled-name='cdev_alloc' filepath='fs/char_dev.c' line='639' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cdev_alloc'>
+        <return type-id='type-id-774'/>
+      </function-decl>
+      <function-decl name='cdev_add' mangled-name='cdev_add' filepath='fs/char_dev.c' line='488' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cdev_add'>
+        <parameter type-id='type-id-774' name='p' filepath='fs/char_dev.c' line='488' column='1'/>
+        <parameter type-id='type-id-269' name='dev' filepath='fs/char_dev.c' line='488' column='1'/>
+        <parameter type-id='type-id-5' name='count' filepath='fs/char_dev.c' line='488' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='unregister_chrdev_region' mangled-name='unregister_chrdev_region' filepath='fs/char_dev.c' line='320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_chrdev_region'>
+        <parameter type-id='type-id-269' name='from' filepath='fs/char_dev.c' line='320' column='1'/>
+        <parameter type-id='type-id-5' name='count' filepath='fs/char_dev.c' line='320' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__unregister_chrdev' mangled-name='__unregister_chrdev' filepath='fs/char_dev.c' line='344' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__unregister_chrdev'>
+        <parameter type-id='type-id-5' name='major' filepath='fs/char_dev.c' line='344' column='1'/>
+        <parameter type-id='type-id-5' name='baseminor' filepath='fs/char_dev.c' line='344' column='1'/>
+        <parameter type-id='type-id-5' name='count' filepath='fs/char_dev.c' line='345' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='fs/char_dev.c' line='345' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='cdev_del' mangled-name='cdev_del' filepath='fs/char_dev.c' line='600' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cdev_del'>
+        <parameter type-id='type-id-774' name='p' filepath='fs/char_dev.c' line='600' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='cdev_device_add' mangled-name='cdev_device_add' filepath='fs/char_dev.c' line='543' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cdev_device_add'>
+        <parameter type-id='type-id-774' name='cdev' filepath='fs/char_dev.c' line='543' column='1'/>
+        <parameter type-id='type-id-240' name='dev' filepath='fs/char_dev.c' line='543' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='cdev_device_del' mangled-name='cdev_device_del' filepath='fs/char_dev.c' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cdev_device_del'>
+        <parameter type-id='type-id-774' name='cdev' filepath='fs/char_dev.c' line='577' column='1'/>
+        <parameter type-id='type-id-240' name='dev' filepath='fs/char_dev.c' line='577' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='cdev_init' mangled-name='cdev_init' filepath='fs/char_dev.c' line='657' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cdev_init'>
+        <parameter type-id='type-id-774' name='cdev' filepath='fs/char_dev.c' line='657' column='1'/>
+        <parameter type-id='type-id-268' name='fops' filepath='fs/char_dev.c' line='657' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/exec.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-83' size-in-bits='4096' id='type-id-3608'>
+        <subrange length='64' type-id='type-id-9' id='type-id-188'/>
+
+      </array-type-def>
+      <class-decl name='fdtable' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/fdtable.h' line='26' column='1' id='type-id-3609'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='max_fds' type-id='type-id-5' visibility='default' filepath='include/linux/fdtable.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fd' type-id='type-id-3610' visibility='default' filepath='include/linux/fdtable.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='close_on_exec' type-id='type-id-45' visibility='default' filepath='include/linux/fdtable.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='open_fds' type-id='type-id-45' visibility='default' filepath='include/linux/fdtable.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='full_fds_bits' type-id='type-id-45' visibility='default' filepath='include/linux/fdtable.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/fdtable.h' line='32' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-3609' size-in-bits='64' id='type-id-3611'/>
+      <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-3610'/>
+      <function-decl name='__get_task_comm' mangled-name='__get_task_comm' filepath='fs/exec.c' line='1224' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__get_task_comm'>
+        <parameter type-id='type-id-2' name='buf' filepath='fs/exec.c' line='1224' column='1'/>
+        <parameter type-id='type-id-84' name='buf_size' filepath='fs/exec.c' line='1224' column='1'/>
+        <parameter type-id='type-id-431' name='tsk' filepath='fs/exec.c' line='1224' column='1'/>
+        <return type-id='type-id-2'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/pipe.c' language='LANG_C89'>
+      <function-decl name='pipe_lock' mangled-name='pipe_lock' filepath='fs/pipe.c' line='65' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pipe_lock'>
+        <parameter type-id='type-id-87' name='pipe' filepath='fs/pipe.c' line='65' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='pipe_unlock' mangled-name='pipe_unlock' filepath='fs/pipe.c' line='74' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pipe_unlock'>
+        <parameter type-id='type-id-87' name='pipe' filepath='fs/pipe.c' line='74' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/fcntl.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-254' size-in-bits='64' id='type-id-3612'/>
+      <function-decl name='fasync_helper' mangled-name='fasync_helper' filepath='fs/fcntl.c' line='978' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fasync_helper'>
+        <parameter type-id='type-id-17' name='fd' filepath='fs/fcntl.c' line='978' column='1'/>
+        <parameter type-id='type-id-83' name='filp' filepath='fs/fcntl.c' line='978' column='1'/>
+        <parameter type-id='type-id-17' name='on' filepath='fs/fcntl.c' line='978' column='1'/>
+        <parameter type-id='type-id-3612' name='fapp' filepath='fs/fcntl.c' line='978' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='kill_fasync' mangled-name='kill_fasync' filepath='fs/fcntl.c' line='1014' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kill_fasync'>
+        <parameter type-id='type-id-3612' name='fp' filepath='fs/fcntl.c' line='1014' column='1'/>
+        <parameter type-id='type-id-17' name='sig' filepath='fs/fcntl.c' line='1014' column='1'/>
+        <parameter type-id='type-id-17' name='band' filepath='fs/fcntl.c' line='1014' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/libfs.c' language='LANG_C89'>
+      <class-decl name='iomap' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3613'/>
+      <class-decl name='iov_iter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3614'/>
+      <class-decl name='fid' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/linux/exportfs.h' line='113' column='1' id='type-id-3615'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-3616' visibility='default' filepath='include/linux/exportfs.h' line='114' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__2' size-in-bits='160' is-anonymous='yes' visibility='default' filepath='include/linux/exportfs.h' line='114' column='1' id='type-id-3616'>
+        <data-member access='private'>
+          <var-decl name='i32' type-id='type-id-3617' visibility='default' filepath='include/linux/exportfs.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='udf' type-id='type-id-3618' visibility='default' filepath='include/linux/exportfs.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='raw' type-id='type-id-934' visibility='default' filepath='include/linux/exportfs.h' line='129' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/exportfs.h' line='115' column='1' id='type-id-3617'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ino' type-id='type-id-7' visibility='default' filepath='include/linux/exportfs.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='gen' type-id='type-id-7' visibility='default' filepath='include/linux/exportfs.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='parent_ino' type-id='type-id-7' visibility='default' filepath='include/linux/exportfs.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='parent_gen' type-id='type-id-7' visibility='default' filepath='include/linux/exportfs.h' line='119' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__1' size-in-bits='160' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/exportfs.h' line='121' column='1' id='type-id-3618'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='block' type-id='type-id-7' visibility='default' filepath='include/linux/exportfs.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='partref' type-id='type-id-688' visibility='default' filepath='include/linux/exportfs.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='parent_partref' type-id='type-id-688' visibility='default' filepath='include/linux/exportfs.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='generation' type-id='type-id-7' visibility='default' filepath='include/linux/exportfs.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='parent_block' type-id='type-id-7' visibility='default' filepath='include/linux/exportfs.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='parent_generation' type-id='type-id-7' visibility='default' filepath='include/linux/exportfs.h' line='127' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__2' size-in-bits='6848' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='353' column='1' id='type-id-3619'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mmap' type-id='type-id-1207' visibility='default' filepath='include/linux/mm_types.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mm_rb' type-id='type-id-416' visibility='default' filepath='include/linux/mm_types.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='vmacache_seqnum' type-id='type-id-40' visibility='default' filepath='include/linux/mm_types.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='get_unmapped_area' type-id='type-id-1482' visibility='default' filepath='include/linux/mm_types.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mmap_base' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mmap_legacy_base' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='task_size' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='highest_vm_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pgd' type-id='type-id-1483' visibility='default' filepath='include/linux/mm_types.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mm_users' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='mm_count' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='pgtables_bytes' type-id='type-id-115' visibility='default' filepath='include/linux/mm_types.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='map_count' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='page_table_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mmap_sem' type-id='type-id-246' visibility='default' filepath='include/linux/mm_types.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='mmlist' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='hiwater_rss' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='hiwater_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='total_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='locked_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='pinned_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='data_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='exec_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='stack_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='def_flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='arg_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='421' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='start_code' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='end_code' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='start_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='end_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='start_brk' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='brk' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='start_stack' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='arg_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='arg_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='env_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='env_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='saved_auxv' type-id='type-id-1200' visibility='default' filepath='include/linux/mm_types.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='rss_stat' type-id='type-id-1484' visibility='default' filepath='include/linux/mm_types.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='binfmt' type-id='type-id-1485' visibility='default' filepath='include/linux/mm_types.h' line='434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='context' type-id='type-id-1486' visibility='default' filepath='include/linux/mm_types.h' line='437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='core_state' type-id='type-id-1487' visibility='default' filepath='include/linux/mm_types.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='membarrier_state' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6176'>
+          <var-decl name='ioctx_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='ioctx_table' type-id='type-id-1488' visibility='default' filepath='include/linux/mm_types.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='owner' type-id='type-id-431' visibility='default' filepath='include/linux/mm_types.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='user_ns' type-id='type-id-915' visibility='default' filepath='include/linux/mm_types.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='exe_file' type-id='type-id-83' visibility='default' filepath='include/linux/mm_types.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='tlb_flush_pending' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='491' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='uprobes_state' type-id='type-id-1489' visibility='default' filepath='include/linux/mm_types.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='async_put_work' type-id='type-id-255' visibility='default' filepath='include/linux/mm_types.h' line='500' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__6' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='79' column='1' id='type-id-3620'>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='98' column='1' id='type-id-3621'>
+
+              <member-type access='public'>
+                <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='115' column='1' id='type-id-3622'>
+                  <data-member access='private'>
+                    <var-decl name='s_mem' type-id='type-id-15' visibility='default' filepath='include/linux/mm_types.h' line='116' column='1'/>
+                  </data-member>
+                  <data-member access='private'>
+                    <var-decl name='counters' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='117' column='1'/>
+                  </data-member>
+                  <data-member access='private'>
+                    <var-decl name='' type-id='type-id-2137' visibility='default' filepath='include/linux/mm_types.h' line='118' column='1'/>
+                  </data-member>
+                </union-decl>
+              </member-type>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='' type-id='type-id-3623' visibility='default' filepath='include/linux/mm_types.h' line='99' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='slab_cache' type-id='type-id-538' visibility='default' filepath='include/linux/mm_types.h' line='112' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='freelist' type-id='type-id-15' visibility='default' filepath='include/linux/mm_types.h' line='114' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='__anonymous_struct__1' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='138' column='1' id='type-id-3624'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_pt_pad_1' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='139' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='pmd_huge_pte' type-id='type-id-2138' visibility='default' filepath='include/linux/mm_types.h' line='140' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_pt_pad_2' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='141' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='192'>
+              <var-decl name='' type-id='type-id-3625' visibility='default' filepath='include/linux/mm_types.h' line='142' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='256'>
+              <var-decl name='ptl' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='149' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-3626' visibility='default' filepath='include/linux/mm_types.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/mm_types.h' line='160' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__3' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='80' column='1' id='type-id-3626'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lru' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mapping' type-id='type-id-1279' visibility='default' filepath='include/linux/mm_types.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='index' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='private' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='96' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__7' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='99' column='1' id='type-id-3623'>
+        <data-member access='private'>
+          <var-decl name='slab_list' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-3627' visibility='default' filepath='include/linux/mm_types.h' line='101' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__4' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='101' column='1' id='type-id-3627'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-512' visibility='default' filepath='include/linux/mm_types.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pages' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='pobjects' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types.h' line='105' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='142' column='1' id='type-id-3625'>
+        <data-member access='private'>
+          <var-decl name='pt_mm' type-id='type-id-882' visibility='default' filepath='include/linux/mm_types.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='pt_frag_refcount' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='144' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__10' size-in-bits='1472' is-anonymous='yes' visibility='default' filepath='include/linux/elevator.h' line='141' column='1' id='type-id-3628'>
+        <data-member access='private'>
+          <var-decl name='sq' type-id='type-id-542' visibility='default' filepath='include/linux/elevator.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='mq' type-id='type-id-600' visibility='default' filepath='include/linux/elevator.h' line='143' column='1'/>
+        </data-member>
+      </union-decl>
+      <pointer-type-def type-id='type-id-511' size-in-bits='64' id='type-id-3629'/>
+      <pointer-type-def type-id='type-id-3630' size-in-bits='64' id='type-id-3631'/>
+      <pointer-type-def type-id='type-id-3632' size-in-bits='64' id='type-id-3633'/>
+      <pointer-type-def type-id='type-id-3615' size-in-bits='64' id='type-id-3634'/>
+      <pointer-type-def type-id='type-id-3635' size-in-bits='64' id='type-id-3636'/>
+      <pointer-type-def type-id='type-id-3637' size-in-bits='64' id='type-id-3638'/>
+      <pointer-type-def type-id='type-id-3639' size-in-bits='64' id='type-id-3640'/>
+      <pointer-type-def type-id='type-id-3641' size-in-bits='64' id='type-id-3642'/>
+      <pointer-type-def type-id='type-id-3643' size-in-bits='64' id='type-id-3644'/>
+      <pointer-type-def type-id='type-id-3645' size-in-bits='64' id='type-id-3646'/>
+      <pointer-type-def type-id='type-id-3647' size-in-bits='64' id='type-id-3648'/>
+      <pointer-type-def type-id='type-id-3613' size-in-bits='64' id='type-id-3649'/>
+      <pointer-type-def type-id='type-id-3614' size-in-bits='64' id='type-id-3650'/>
+      <function-decl name='simple_attr_open' mangled-name='simple_attr_open' filepath='fs/libfs.c' line='799' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='simple_attr_open'>
+        <parameter type-id='type-id-1127' name='inode' filepath='fs/libfs.c' line='799' column='1'/>
+        <parameter type-id='type-id-83' name='file' filepath='fs/libfs.c' line='799' column='1'/>
+        <parameter type-id='type-id-3648' name='get' filepath='fs/libfs.c' line='800' column='1'/>
+        <parameter type-id='type-id-3646' name='set' filepath='fs/libfs.c' line='800' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='fs/libfs.c' line='801' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='simple_read_from_buffer' mangled-name='simple_read_from_buffer' filepath='fs/libfs.c' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='simple_read_from_buffer'>
+        <parameter type-id='type-id-15' name='to' filepath='fs/libfs.c' line='626' column='1'/>
+        <parameter type-id='type-id-84' name='count' filepath='fs/libfs.c' line='626' column='1'/>
+        <parameter type-id='type-id-85' name='ppos' filepath='fs/libfs.c' line='626' column='1'/>
+        <parameter type-id='type-id-15' name='from' filepath='fs/libfs.c' line='627' column='1'/>
+        <parameter type-id='type-id-84' name='available' filepath='fs/libfs.c' line='627' column='1'/>
+        <return type-id='type-id-86'/>
+      </function-decl>
+      <function-decl name='simple_attr_release' mangled-name='simple_attr_release' filepath='fs/libfs.c' line='821' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='simple_attr_release'>
+        <parameter type-id='type-id-1127' name='inode' filepath='fs/libfs.c' line='821' column='1'/>
+        <parameter type-id='type-id-83' name='file' filepath='fs/libfs.c' line='821' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='simple_attr_read' mangled-name='simple_attr_read' filepath='fs/libfs.c' line='829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='simple_attr_read'>
+        <parameter type-id='type-id-83' name='file' filepath='fs/libfs.c' line='829' column='1'/>
+        <parameter type-id='type-id-2' name='buf' filepath='fs/libfs.c' line='829' column='1'/>
+        <parameter type-id='type-id-84' name='len' filepath='fs/libfs.c' line='830' column='1'/>
+        <parameter type-id='type-id-85' name='ppos' filepath='fs/libfs.c' line='830' column='1'/>
+        <return type-id='type-id-86'/>
+      </function-decl>
+      <function-decl name='simple_attr_write' mangled-name='simple_attr_write' filepath='fs/libfs.c' line='865' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='simple_attr_write'>
+        <parameter type-id='type-id-83' name='file' filepath='fs/libfs.c' line='865' column='1'/>
+        <parameter type-id='type-id-4' name='buf' filepath='fs/libfs.c' line='865' column='1'/>
+        <parameter type-id='type-id-84' name='len' filepath='fs/libfs.c' line='866' column='1'/>
+        <parameter type-id='type-id-85' name='ppos' filepath='fs/libfs.c' line='866' column='1'/>
+        <return type-id='type-id-86'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3630'>
+        <parameter type-id='type-id-23'/>
+        <return type-id='type-id-23'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3632'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-3634'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-23'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3635'>
+        <parameter type-id='type-id-23'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-23'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3637'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-3629'/>
+        <parameter type-id='type-id-666'/>
+        <parameter type-id='type-id-1127'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3639'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-3649'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2780'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3641'>
+        <parameter type-id='type-id-1127'/>
+        <parameter type-id='type-id-763'/>
+        <parameter type-id='type-id-40'/>
+        <parameter type-id='type-id-3649'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-1565'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3643'>
+        <parameter type-id='type-id-28'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-1565'/>
+        <parameter type-id='type-id-1508'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3645'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3647'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-1508'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/splice.c' language='LANG_C89'>
+      <class-decl name='splice_desc' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/splice.h' line='29' column='1' id='type-id-3651'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='total_len' type-id='type-id-84' visibility='default' filepath='include/linux/splice.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='len' type-id='type-id-5' visibility='default' filepath='include/linux/splice.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/splice.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='u' type-id='type-id-3652' visibility='default' filepath='include/linux/splice.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='pos' type-id='type-id-763' visibility='default' filepath='include/linux/splice.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='opos' type-id='type-id-85' visibility='default' filepath='include/linux/splice.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='num_spliced' type-id='type-id-84' visibility='default' filepath='include/linux/splice.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='need_wakeup' type-id='type-id-33' visibility='default' filepath='include/linux/splice.h' line='44' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/splice.h' line='36' column='1' id='type-id-3652'>
+        <data-member access='private'>
+          <var-decl name='userptr' type-id='type-id-15' visibility='default' filepath='include/linux/splice.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='file' type-id='type-id-83' visibility='default' filepath='include/linux/splice.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/splice.h' line='39' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='splice_actor' type-id='type-id-3653' filepath='include/linux/splice.h' line='65' column='1' id='type-id-3654'/>
+      <pointer-type-def type-id='type-id-3654' size-in-bits='64' id='type-id-3655'/>
+      <pointer-type-def type-id='type-id-3651' size-in-bits='64' id='type-id-3656'/>
+      <function-decl name='__splice_from_pipe' mangled-name='__splice_from_pipe' filepath='fs/splice.c' line='617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__splice_from_pipe'>
+        <parameter type-id='type-id-87' name='pipe' filepath='fs/splice.c' line='617' column='1'/>
+        <parameter type-id='type-id-3656' name='sd' filepath='fs/splice.c' line='617' column='1'/>
+        <parameter type-id='type-id-3655' name='actor' filepath='fs/splice.c' line='618' column='1'/>
+        <return type-id='type-id-86'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3653'>
+        <parameter type-id='type-id-87'/>
+        <parameter type-id='type-id-2121'/>
+        <parameter type-id='type-id-3656'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/proc/proc_net.c' language='LANG_C89'>
+      <function-decl name='proc_create_net_single' mangled-name='proc_create_net_single' filepath='fs/proc/proc_net.c' line='193' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proc_create_net_single'>
+        <parameter type-id='type-id-4' name='name' filepath='fs/proc/proc_net.c' line='193' column='1'/>
+        <parameter type-id='type-id-329' name='mode' filepath='fs/proc/proc_net.c' line='193' column='1'/>
+        <parameter type-id='type-id-262' name='parent' filepath='fs/proc/proc_net.c' line='194' column='1'/>
+        <parameter type-id='type-id-311' name='show' filepath='fs/proc/proc_net.c' line='195' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='fs/proc/proc_net.c' line='195' column='1'/>
+        <return type-id='type-id-262'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/sysfs/file.c' language='LANG_C89'>
+      <qualified-type-def type-id='type-id-2037' const='yes' id='type-id-3657'/>
+      <pointer-type-def type-id='type-id-3657' size-in-bits='64' id='type-id-3658'/>
+      <function-decl name='sysfs_create_bin_file' mangled-name='sysfs_create_bin_file' filepath='fs/sysfs/file.c' line='534' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sysfs_create_bin_file'>
+        <parameter type-id='type-id-379' name='kobj' filepath='fs/sysfs/file.c' line='534' column='1'/>
+        <parameter type-id='type-id-3658' name='attr' filepath='fs/sysfs/file.c' line='535' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sysfs_remove_bin_file' mangled-name='sysfs_remove_bin_file' filepath='fs/sysfs/file.c' line='553' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sysfs_remove_bin_file'>
+        <parameter type-id='type-id-379' name='kobj' filepath='fs/sysfs/file.c' line='553' column='1'/>
+        <parameter type-id='type-id-3658' name='attr' filepath='fs/sysfs/file.c' line='554' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='fs/debugfs/file.c' language='LANG_C89'>
+      <function-decl name='debugfs_create_x32' mangled-name='debugfs_create_x32' filepath='fs/debugfs/file.c' line='674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='debugfs_create_x32'>
+        <parameter type-id='type-id-4' name='name' filepath='fs/debugfs/file.c' line='674' column='1'/>
+        <parameter type-id='type-id-329' name='mode' filepath='fs/debugfs/file.c' line='674' column='1'/>
+        <parameter type-id='type-id-23' name='parent' filepath='fs/debugfs/file.c' line='675' column='1'/>
+        <parameter type-id='type-id-1565' name='value' filepath='fs/debugfs/file.c' line='675' column='1'/>
+        <return type-id='type-id-23'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='security/security.c' language='LANG_C89'>
+      <class-decl name='socket' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3659'/>
+      <pointer-type-def type-id='type-id-3659' size-in-bits='64' id='type-id-3660'/>
+      <function-decl name='security_sock_graft' mangled-name='security_sock_graft' filepath='security/security.c' line='1500' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='security_sock_graft'>
+        <parameter type-id='type-id-1646' name='sk' filepath='security/security.c' line='1500' column='1'/>
+        <parameter type-id='type-id-3660' name='parent' filepath='security/security.c' line='1500' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/netlink/af_netlink.c' language='LANG_C89'>
+      <union-decl name='__anonymous_union__' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='666' column='1' id='type-id-3661'>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-1765' visibility='default' filepath='include/linux/skbuff.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rbnode' type-id='type-id-422' visibility='default' filepath='include/linux/skbuff.h' line='681' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/skbuff.h' line='682' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='397' column='1' id='type-id-3662'>
+        <data-member access='private'>
+          <var-decl name='sk_wq' type-id='type-id-3663' visibility='default' filepath='include/net/sock.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='sk_wq_raw' type-id='type-id-3663' visibility='default' filepath='include/net/sock.h' line='399' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='netlink_dump_control' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/netlink.h' line='194' column='1' id='type-id-3664'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start' type-id='type-id-1811' visibility='default' filepath='include/linux/netlink.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dump' type-id='type-id-1810' visibility='default' filepath='include/linux/netlink.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='done' type-id='type-id-1811' visibility='default' filepath='include/linux/netlink.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/netlink.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='module' type-id='type-id-260' visibility='default' filepath='include/linux/netlink.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='min_dump_alloc' type-id='type-id-688' visibility='default' filepath='include/linux/netlink.h' line='200' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-3664' size-in-bits='64' id='type-id-3665'/>
+      <function-decl name='netlink_capable' mangled-name='netlink_capable' filepath='net/netlink/af_netlink.c' line='901' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netlink_capable'>
+        <parameter type-id='type-id-2719' name='skb' filepath='net/netlink/af_netlink.c' line='901' column='1'/>
+        <parameter type-id='type-id-17' name='cap' filepath='net/netlink/af_netlink.c' line='901' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='__nlmsg_put' mangled-name='__nlmsg_put' filepath='net/netlink/af_netlink.c' line='2156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__nlmsg_put'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/netlink/af_netlink.c' line='2156' column='1'/>
+        <parameter type-id='type-id-7' name='portid' filepath='net/netlink/af_netlink.c' line='2156' column='1'/>
+        <parameter type-id='type-id-7' name='seq' filepath='net/netlink/af_netlink.c' line='2156' column='1'/>
+        <parameter type-id='type-id-17' name='type' filepath='net/netlink/af_netlink.c' line='2156' column='1'/>
+        <parameter type-id='type-id-17' name='len' filepath='net/netlink/af_netlink.c' line='2156' column='1'/>
+        <parameter type-id='type-id-17' name='flags' filepath='net/netlink/af_netlink.c' line='2156' column='1'/>
+        <return type-id='type-id-3035'/>
+      </function-decl>
+      <function-decl name='__netlink_dump_start' mangled-name='__netlink_dump_start' filepath='net/netlink/af_netlink.c' line='2278' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__netlink_dump_start'>
+        <parameter type-id='type-id-3666' name='ssk' filepath='net/netlink/af_netlink.c' line='2278' column='1'/>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/netlink/af_netlink.c' line='2278' column='1'/>
+        <parameter type-id='type-id-1809' name='nlh' filepath='net/netlink/af_netlink.c' line='2279' column='1'/>
+        <parameter type-id='type-id-3665' name='control' filepath='net/netlink/af_netlink.c' line='2280' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='crypto/algapi.c' language='LANG_C89'>
+      <class-decl name='skcipher_givcrypt_request' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3667'/>
+      <class-decl name='crypto_alg' size-in-bits='4096' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='461' column='1' id='type-id-3668'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cra_list' type-id='type-id-20' visibility='default' filepath='include/linux/crypto.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cra_users' type-id='type-id-20' visibility='default' filepath='include/linux/crypto.h' line='463' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='cra_flags' type-id='type-id-7' visibility='default' filepath='include/linux/crypto.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='cra_blocksize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='466' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='cra_ctxsize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='467' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='cra_alignmask' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='468' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='cra_priority' type-id='type-id-17' visibility='default' filepath='include/linux/crypto.h' line='470' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='cra_refcnt' type-id='type-id-421' visibility='default' filepath='include/linux/crypto.h' line='471' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='cra_name' type-id='type-id-962' visibility='default' filepath='include/linux/crypto.h' line='473' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='cra_driver_name' type-id='type-id-962' visibility='default' filepath='include/linux/crypto.h' line='474' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='cra_type' type-id='type-id-3669' visibility='default' filepath='include/linux/crypto.h' line='476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='cra_u' type-id='type-id-3670' visibility='default' filepath='include/linux/crypto.h' line='483' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='cra_init' type-id='type-id-3671' visibility='default' filepath='include/linux/crypto.h' line='485' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='cra_exit' type-id='type-id-3672' visibility='default' filepath='include/linux/crypto.h' line='486' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='cra_destroy' type-id='type-id-3673' visibility='default' filepath='include/linux/crypto.h' line='487' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='cra_module' type-id='type-id-260' visibility='default' filepath='include/linux/crypto.h' line='489' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='crypto_type' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/crypto/algapi.h' line='34' column='1' id='type-id-3674'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ctxsize' type-id='type-id-3675' visibility='default' filepath='include/crypto/algapi.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='extsize' type-id='type-id-3676' visibility='default' filepath='include/crypto/algapi.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='init' type-id='type-id-3677' visibility='default' filepath='include/crypto/algapi.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='init_tfm' type-id='type-id-3671' visibility='default' filepath='include/crypto/algapi.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='show' type-id='type-id-3678' visibility='default' filepath='include/crypto/algapi.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='report' type-id='type-id-3679' visibility='default' filepath='include/crypto/algapi.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='free' type-id='type-id-3680' visibility='default' filepath='include/crypto/algapi.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='type' type-id='type-id-5' visibility='default' filepath='include/crypto/algapi.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='maskclear' type-id='type-id-5' visibility='default' filepath='include/crypto/algapi.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='maskset' type-id='type-id-5' visibility='default' filepath='include/crypto/algapi.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='tfmsize' type-id='type-id-5' visibility='default' filepath='include/crypto/algapi.h' line='46' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='crypto_tfm' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='593' column='1' id='type-id-3681'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='crt_flags' type-id='type-id-7' visibility='default' filepath='include/linux/crypto.h' line='595' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='crt_u' type-id='type-id-3682' visibility='default' filepath='include/linux/crypto.h' line='602' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='exit' type-id='type-id-3672' visibility='default' filepath='include/linux/crypto.h' line='604' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='__crt_alg' type-id='type-id-3683' visibility='default' filepath='include/linux/crypto.h' line='606' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='__crt_ctx' type-id='type-id-1211' visibility='default' filepath='include/linux/crypto.h' line='608' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='320' is-anonymous='yes' visibility='default' filepath='include/linux/crypto.h' line='597' column='1' id='type-id-3682'>
+        <data-member access='private'>
+          <var-decl name='ablkcipher' type-id='type-id-3684' visibility='default' filepath='include/linux/crypto.h' line='598' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='blkcipher' type-id='type-id-3685' visibility='default' filepath='include/linux/crypto.h' line='599' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='cipher' type-id='type-id-3686' visibility='default' filepath='include/linux/crypto.h' line='600' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='compress' type-id='type-id-3687' visibility='default' filepath='include/linux/crypto.h' line='601' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='ablkcipher_tfm' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='550' column='1' id='type-id-3684'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='setkey' type-id='type-id-3688' visibility='default' filepath='include/linux/crypto.h' line='551' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='encrypt' type-id='type-id-3689' visibility='default' filepath='include/linux/crypto.h' line='553' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='decrypt' type-id='type-id-3689' visibility='default' filepath='include/linux/crypto.h' line='554' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='base' type-id='type-id-3690' visibility='default' filepath='include/linux/crypto.h' line='556' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ivsize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='558' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='reqsize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='559' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='crypto_ablkcipher' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='611' column='1' id='type-id-3691'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-3681' visibility='default' filepath='include/linux/crypto.h' line='612' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ablkcipher_request' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='180' column='1' id='type-id-3692'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-3693' visibility='default' filepath='include/linux/crypto.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='nbytes' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='info' type-id='type-id-15' visibility='default' filepath='include/linux/crypto.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='src' type-id='type-id-918' visibility='default' filepath='include/linux/crypto.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='dst' type-id='type-id-918' visibility='default' filepath='include/linux/crypto.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='__ctx' type-id='type-id-1211' visibility='default' filepath='include/linux/crypto.h' line='190' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='crypto_async_request' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='171' column='1' id='type-id-3693'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/crypto.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='complete' type-id='type-id-3694' visibility='default' filepath='include/linux/crypto.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/crypto.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='tfm' type-id='type-id-3695' visibility='default' filepath='include/linux/crypto.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/linux/crypto.h' line='177' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='crypto_completion_t' type-id='type-id-3696' filepath='include/linux/crypto.h' line='162' column='1' id='type-id-3694'/>
+      <class-decl name='blkcipher_tfm' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='562' column='1' id='type-id-3685'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='iv' type-id='type-id-15' visibility='default' filepath='include/linux/crypto.h' line='563' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='setkey' type-id='type-id-3697' visibility='default' filepath='include/linux/crypto.h' line='564' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='encrypt' type-id='type-id-3698' visibility='default' filepath='include/linux/crypto.h' line='566' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='decrypt' type-id='type-id-3698' visibility='default' filepath='include/linux/crypto.h' line='568' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkcipher_desc' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='193' column='1' id='type-id-3699'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tfm' type-id='type-id-3700' visibility='default' filepath='include/linux/crypto.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='info' type-id='type-id-15' visibility='default' filepath='include/linux/crypto.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/linux/crypto.h' line='196' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='crypto_blkcipher' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='615' column='1' id='type-id-3701'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-3681' visibility='default' filepath='include/linux/crypto.h' line='616' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cipher_tfm' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='572' column='1' id='type-id-3686'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cit_setkey' type-id='type-id-3697' visibility='default' filepath='include/linux/crypto.h' line='573' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cit_encrypt_one' type-id='type-id-3702' visibility='default' filepath='include/linux/crypto.h' line='575' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cit_decrypt_one' type-id='type-id-3702' visibility='default' filepath='include/linux/crypto.h' line='576' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='compress_tfm' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='579' column='1' id='type-id-3687'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cot_compress' type-id='type-id-3703' visibility='default' filepath='include/linux/crypto.h' line='580' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cot_decompress' type-id='type-id-3703' visibility='default' filepath='include/linux/crypto.h' line='583' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='crypto_instance' size-in-bits='5120' is-struct='yes' visibility='default' filepath='include/crypto/algapi.h' line='49' column='1' id='type-id-3704'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='alg' type-id='type-id-3668' visibility='default' filepath='include/crypto/algapi.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='tmpl' type-id='type-id-3705' visibility='default' filepath='include/crypto/algapi.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='list' type-id='type-id-520' visibility='default' filepath='include/crypto/algapi.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='__ctx' type-id='type-id-1211' visibility='default' filepath='include/crypto/algapi.h' line='55' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='crypto_template' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/crypto/algapi.h' line='58' column='1' id='type-id-3706'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/crypto/algapi.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='instances' type-id='type-id-186' visibility='default' filepath='include/crypto/algapi.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='module' type-id='type-id-260' visibility='default' filepath='include/crypto/algapi.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='alloc' type-id='type-id-3707' visibility='default' filepath='include/crypto/algapi.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='free' type-id='type-id-3680' visibility='default' filepath='include/crypto/algapi.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='create' type-id='type-id-3708' visibility='default' filepath='include/crypto/algapi.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='name' type-id='type-id-962' visibility='default' filepath='include/crypto/algapi.h' line='67' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rtattr' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='174' column='1' id='type-id-3709'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rta_len' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='rta_type' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/rtnetlink.h' line='176' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/linux/crypto.h' line='478' column='1' id='type-id-3670'>
+        <data-member access='private'>
+          <var-decl name='ablkcipher' type-id='type-id-3710' visibility='default' filepath='include/linux/crypto.h' line='479' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='blkcipher' type-id='type-id-3711' visibility='default' filepath='include/linux/crypto.h' line='480' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='cipher' type-id='type-id-3712' visibility='default' filepath='include/linux/crypto.h' line='481' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='compress' type-id='type-id-3713' visibility='default' filepath='include/linux/crypto.h' line='482' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='ablkcipher_alg' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='265' column='1' id='type-id-3710'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='setkey' type-id='type-id-3688' visibility='default' filepath='include/linux/crypto.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='encrypt' type-id='type-id-3689' visibility='default' filepath='include/linux/crypto.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='decrypt' type-id='type-id-3689' visibility='default' filepath='include/linux/crypto.h' line='269' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='givencrypt' type-id='type-id-3714' visibility='default' filepath='include/linux/crypto.h' line='270' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='givdecrypt' type-id='type-id-3714' visibility='default' filepath='include/linux/crypto.h' line='271' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='geniv' type-id='type-id-4' visibility='default' filepath='include/linux/crypto.h' line='273' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='min_keysize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='275' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='max_keysize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ivsize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='277' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkcipher_alg' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='292' column='1' id='type-id-3711'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='setkey' type-id='type-id-3697' visibility='default' filepath='include/linux/crypto.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='encrypt' type-id='type-id-3698' visibility='default' filepath='include/linux/crypto.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='decrypt' type-id='type-id-3698' visibility='default' filepath='include/linux/crypto.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='geniv' type-id='type-id-4' visibility='default' filepath='include/linux/crypto.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='min_keysize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='max_keysize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ivsize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='306' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cipher_alg' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='356' column='1' id='type-id-3712'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cia_min_keysize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='cia_max_keysize' type-id='type-id-5' visibility='default' filepath='include/linux/crypto.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cia_setkey' type-id='type-id-3697' visibility='default' filepath='include/linux/crypto.h' line='359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cia_encrypt' type-id='type-id-3702' visibility='default' filepath='include/linux/crypto.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='cia_decrypt' type-id='type-id-3702' visibility='default' filepath='include/linux/crypto.h' line='362' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='compress_alg' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/crypto.h' line='365' column='1' id='type-id-3713'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='coa_compress' type-id='type-id-3703' visibility='default' filepath='include/linux/crypto.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='coa_decompress' type-id='type-id-3703' visibility='default' filepath='include/linux/crypto.h' line='368' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='crypto_queue' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/crypto/algapi.h' line='78' column='1' id='type-id-3715'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/crypto/algapi.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='backlog' type-id='type-id-877' visibility='default' filepath='include/crypto/algapi.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='qlen' type-id='type-id-5' visibility='default' filepath='include/crypto/algapi.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='max_qlen' type-id='type-id-5' visibility='default' filepath='include/crypto/algapi.h' line='83' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-3692' size-in-bits='64' id='type-id-3716'/>
+      <pointer-type-def type-id='type-id-3699' size-in-bits='64' id='type-id-3717'/>
+      <qualified-type-def type-id='type-id-3674' const='yes' id='type-id-3718'/>
+      <pointer-type-def type-id='type-id-3718' size-in-bits='64' id='type-id-3669'/>
+      <pointer-type-def type-id='type-id-3691' size-in-bits='64' id='type-id-3690'/>
+      <pointer-type-def type-id='type-id-3668' size-in-bits='64' id='type-id-3683'/>
+      <pointer-type-def type-id='type-id-3693' size-in-bits='64' id='type-id-3719'/>
+      <pointer-type-def type-id='type-id-3701' size-in-bits='64' id='type-id-3700'/>
+      <pointer-type-def type-id='type-id-3704' size-in-bits='64' id='type-id-3720'/>
+      <pointer-type-def type-id='type-id-3721' size-in-bits='64' id='type-id-3707'/>
+      <pointer-type-def type-id='type-id-3715' size-in-bits='64' id='type-id-3722'/>
+      <pointer-type-def type-id='type-id-3706' size-in-bits='64' id='type-id-3705'/>
+      <pointer-type-def type-id='type-id-3681' size-in-bits='64' id='type-id-3695'/>
+      <pointer-type-def type-id='type-id-3723' size-in-bits='64' id='type-id-3689'/>
+      <pointer-type-def type-id='type-id-3724' size-in-bits='64' id='type-id-3698'/>
+      <pointer-type-def type-id='type-id-3725' size-in-bits='64' id='type-id-3688'/>
+      <pointer-type-def type-id='type-id-3726' size-in-bits='64' id='type-id-3708'/>
+      <pointer-type-def type-id='type-id-3727' size-in-bits='64' id='type-id-3671'/>
+      <pointer-type-def type-id='type-id-3728' size-in-bits='64' id='type-id-3697'/>
+      <pointer-type-def type-id='type-id-3729' size-in-bits='64' id='type-id-3703'/>
+      <pointer-type-def type-id='type-id-3730' size-in-bits='64' id='type-id-3677'/>
+      <pointer-type-def type-id='type-id-3731' size-in-bits='64' id='type-id-3679'/>
+      <pointer-type-def type-id='type-id-3732' size-in-bits='64' id='type-id-3714'/>
+      <pointer-type-def type-id='type-id-3709' size-in-bits='64' id='type-id-3733'/>
+      <pointer-type-def type-id='type-id-3733' size-in-bits='64' id='type-id-3734'/>
+      <pointer-type-def type-id='type-id-3667' size-in-bits='64' id='type-id-3735'/>
+      <pointer-type-def type-id='type-id-3736' size-in-bits='64' id='type-id-3676'/>
+      <pointer-type-def type-id='type-id-3737' size-in-bits='64' id='type-id-3675'/>
+      <pointer-type-def type-id='type-id-3738' size-in-bits='64' id='type-id-3673'/>
+      <pointer-type-def type-id='type-id-3739' size-in-bits='64' id='type-id-3696'/>
+      <pointer-type-def type-id='type-id-3740' size-in-bits='64' id='type-id-3680'/>
+      <pointer-type-def type-id='type-id-3741' size-in-bits='64' id='type-id-3672'/>
+      <pointer-type-def type-id='type-id-3742' size-in-bits='64' id='type-id-3702'/>
+      <pointer-type-def type-id='type-id-3743' size-in-bits='64' id='type-id-3678'/>
+      <function-decl name='crypto_register_alg' mangled-name='crypto_register_alg' filepath='crypto/algapi.c' line='375' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_register_alg'>
+        <parameter type-id='type-id-3683' name='alg' filepath='crypto/algapi.c' line='375' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='crypto_unregister_alg' mangled-name='crypto_unregister_alg' filepath='crypto/algapi.c' line='410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_unregister_alg'>
+        <parameter type-id='type-id-3683' name='alg' filepath='crypto/algapi.c' line='410' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='crypto_init_queue' mangled-name='crypto_init_queue' filepath='crypto/algapi.c' line='894' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_init_queue'>
+        <parameter type-id='type-id-3722' name='queue' filepath='crypto/algapi.c' line='894' column='1'/>
+        <parameter type-id='type-id-5' name='max_qlen' filepath='crypto/algapi.c' line='894' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='crypto_enqueue_request' mangled-name='crypto_enqueue_request' filepath='crypto/algapi.c' line='903' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_enqueue_request'>
+        <parameter type-id='type-id-3722' name='queue' filepath='crypto/algapi.c' line='903' column='1'/>
+        <parameter type-id='type-id-3719' name='request' filepath='crypto/algapi.c' line='904' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='crypto_dequeue_request' mangled-name='crypto_dequeue_request' filepath='crypto/algapi.c' line='926' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_dequeue_request'>
+        <parameter type-id='type-id-3722' name='queue' filepath='crypto/algapi.c' line='926' column='1'/>
+        <return type-id='type-id-3719'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3721'>
+        <parameter type-id='type-id-3734'/>
+        <return type-id='type-id-3720'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3723'>
+        <parameter type-id='type-id-3716'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3724'>
+        <parameter type-id='type-id-3717'/>
+        <parameter type-id='type-id-918'/>
+        <parameter type-id='type-id-918'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3725'>
+        <parameter type-id='type-id-3690'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3726'>
+        <parameter type-id='type-id-3705'/>
+        <parameter type-id='type-id-3734'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3727'>
+        <parameter type-id='type-id-3695'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3728'>
+        <parameter type-id='type-id-3695'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3729'>
+        <parameter type-id='type-id-3695'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-482'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3730'>
+        <parameter type-id='type-id-3695'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3731'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-3683'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3732'>
+        <parameter type-id='type-id-3735'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3736'>
+        <parameter type-id='type-id-3683'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3737'>
+        <parameter type-id='type-id-3683'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3738'>
+        <parameter type-id='type-id-3683'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3739'>
+        <parameter type-id='type-id-3719'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3740'>
+        <parameter type-id='type-id-3720'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3741'>
+        <parameter type-id='type-id-3695'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3742'>
+        <parameter type-id='type-id-3695'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-658'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3743'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-3683'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='block/blk-mq.c' language='LANG_C89'>
+      <function-decl name='blk_mq_alloc_tag_set' mangled-name='blk_mq_alloc_tag_set' filepath='block/blk-mq.c' line='2774' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_alloc_tag_set'>
+        <parameter type-id='type-id-3744' name='set' filepath='block/blk-mq.c' line='2774' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='blk_mq_run_hw_queues' mangled-name='blk_mq_run_hw_queues' filepath='block/blk-mq.c' line='1421' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_run_hw_queues'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-mq.c' line='1421' column='1'/>
+        <parameter type-id='type-id-33' name='async' filepath='block/blk-mq.c' line='1421' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_mq_quiesce_queue' mangled-name='blk_mq_quiesce_queue' filepath='block/blk-mq.c' line='226' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_quiesce_queue'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-mq.c' line='226' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_mq_unquiesce_queue' mangled-name='blk_mq_unquiesce_queue' filepath='block/blk-mq.c' line='252' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_unquiesce_queue'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-mq.c' line='252' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__blk_mq_end_request' mangled-name='__blk_mq_end_request' filepath='block/blk-mq.c' line='520' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__blk_mq_end_request'>
+        <parameter type-id='type-id-463' name='rq' filepath='block/blk-mq.c' line='520' column='1'/>
+        <parameter type-id='type-id-361' name='error' filepath='block/blk-mq.c' line='520' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_mq_end_request' mangled-name='blk_mq_end_request' filepath='block/blk-mq.c' line='542' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_end_request'>
+        <parameter type-id='type-id-463' name='rq' filepath='block/blk-mq.c' line='542' column='1'/>
+        <parameter type-id='type-id-361' name='error' filepath='block/blk-mq.c' line='542' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_mq_complete_request' mangled-name='blk_mq_complete_request' filepath='block/blk-mq.c' line='616' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_complete_request'>
+        <parameter type-id='type-id-463' name='rq' filepath='block/blk-mq.c' line='616' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_mq_start_request' mangled-name='blk_mq_start_request' filepath='block/blk-mq.c' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_start_request'>
+        <parameter type-id='type-id-463' name='rq' filepath='block/blk-mq.c' line='630' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_mq_requeue_request' mangled-name='blk_mq_requeue_request' filepath='block/blk-mq.c' line='680' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_requeue_request'>
+        <parameter type-id='type-id-463' name='rq' filepath='block/blk-mq.c' line='680' column='1'/>
+        <parameter type-id='type-id-33' name='kick_requeue_list' filepath='block/blk-mq.c' line='680' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_mq_stop_hw_queue' mangled-name='blk_mq_stop_hw_queue' filepath='block/blk-mq.c' line='1464' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_stop_hw_queue'>
+        <parameter type-id='type-id-3745' name='hctx' filepath='block/blk-mq.c' line='1464' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_mq_start_stopped_hw_queues' mangled-name='blk_mq_start_stopped_hw_queues' filepath='block/blk-mq.c' line='1519' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_start_stopped_hw_queues'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-mq.c' line='1519' column='1'/>
+        <parameter type-id='type-id-33' name='async' filepath='block/blk-mq.c' line='1519' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_mq_init_queue' mangled-name='blk_mq_init_queue' filepath='block/blk-mq.c' line='2487' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_init_queue'>
+        <parameter type-id='type-id-3744' name='set' filepath='block/blk-mq.c' line='2487' column='1'/>
+        <return type-id='type-id-378'/>
+      </function-decl>
+      <function-decl name='blk_mq_free_tag_set' mangled-name='blk_mq_free_tag_set' filepath='block/blk-mq.c' line='2848' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_free_tag_set'>
+        <parameter type-id='type-id-3744' name='set' filepath='block/blk-mq.c' line='2848' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='block/blk-core.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-3746' size-in-bits='256' id='type-id-3747'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='256' id='type-id-3748'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3749' size-in-bits='192' id='type-id-3750'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3751' size-in-bits='2304' id='type-id-3752'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3753' size-in-bits='infinite' id='type-id-3754'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='448' id='type-id-3755'>
+        <subrange length='7' type-id='type-id-9' id='type-id-125'/>
+
+      </array-type-def>
+      <class-decl name='__anonymous_struct__' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='block/blk-mq.h' line='14' column='1' id='type-id-3756'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='block/blk-mq.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rq_list' type-id='type-id-20' visibility='default' filepath='block/blk-mq.h' line='16' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' is-anonymous='yes' visibility='default' filepath='include/linux/blk_types.h' line='191' column='1' id='type-id-3757'/>
+      <class-decl name='rq_qos_ops' size-in-bits='512' is-struct='yes' visibility='default' filepath='block/blk-rq-qos.h' line='27' column='1' id='type-id-3758'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='throttle' type-id='type-id-3759' visibility='default' filepath='block/blk-rq-qos.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='track' type-id='type-id-3760' visibility='default' filepath='block/blk-rq-qos.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='issue' type-id='type-id-3761' visibility='default' filepath='block/blk-rq-qos.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='requeue' type-id='type-id-3761' visibility='default' filepath='block/blk-rq-qos.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='done' type-id='type-id-3761' visibility='default' filepath='block/blk-rq-qos.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='done_bio' type-id='type-id-3762' visibility='default' filepath='block/blk-rq-qos.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='cleanup' type-id='type-id-3762' visibility='default' filepath='block/blk-rq-qos.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='exit' type-id='type-id-3763' visibility='default' filepath='block/blk-rq-qos.h' line='35' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='rq_qos_id' filepath='block/blk-rq-qos.h' line='10' column='1' id='type-id-3764'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='RQ_QOS_WBT' value='0'/>
+        <enumerator name='RQ_QOS_CGROUP' value='1'/>
+      </enum-decl>
+      <typedef-decl name='queue_rq_fn' type-id='type-id-3765' filepath='include/linux/blk-mq.h' line='100' column='1' id='type-id-3766'/>
+      <class-decl name='blk_mq_hw_ctx' size-in-bits='4608' is-struct='yes' visibility='default' filepath='include/linux/blk-mq.h' line='15' column='1' id='type-id-3767'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-3768' visibility='default' filepath='include/linux/blk-mq.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='run_work' type-id='type-id-411' visibility='default' filepath='include/linux/blk-mq.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='cpumask' type-id='type-id-38' visibility='default' filepath='include/linux/blk-mq.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='next_cpu' type-id='type-id-17' visibility='default' filepath='include/linux/blk-mq.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='next_cpu_batch' type-id='type-id-17' visibility='default' filepath='include/linux/blk-mq.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/blk-mq.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='sched_data' type-id='type-id-15' visibility='default' filepath='include/linux/blk-mq.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='queue' type-id='type-id-378' visibility='default' filepath='include/linux/blk-mq.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='fq' type-id='type-id-3769' visibility='default' filepath='include/linux/blk-mq.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='driver_data' type-id='type-id-15' visibility='default' filepath='include/linux/blk-mq.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='ctx_map' type-id='type-id-3770' visibility='default' filepath='include/linux/blk-mq.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='dispatch_from' type-id='type-id-483' visibility='default' filepath='include/linux/blk-mq.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='dispatch_busy' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1952'>
+          <var-decl name='nr_ctx' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='ctxs' type-id='type-id-3771' visibility='default' filepath='include/linux/blk-mq.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='dispatch_wait_lock' type-id='type-id-247' visibility='default' filepath='include/linux/blk-mq.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='dispatch_wait' type-id='type-id-3380' visibility='default' filepath='include/linux/blk-mq.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='wait_index' type-id='type-id-26' visibility='default' filepath='include/linux/blk-mq.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='tags' type-id='type-id-3772' visibility='default' filepath='include/linux/blk-mq.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='sched_tags' type-id='type-id-3772' visibility='default' filepath='include/linux/blk-mq.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='queued' type-id='type-id-16' visibility='default' filepath='include/linux/blk-mq.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='run' type-id='type-id-16' visibility='default' filepath='include/linux/blk-mq.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='dispatched' type-id='type-id-3755' visibility='default' filepath='include/linux/blk-mq.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='numa_node' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3232'>
+          <var-decl name='queue_num' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='nr_active' type-id='type-id-26' visibility='default' filepath='include/linux/blk-mq.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3296'>
+          <var-decl name='nr_expired' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='cpuhp_dead' type-id='type-id-520' visibility='default' filepath='include/linux/blk-mq.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/blk-mq.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='poll_considered' type-id='type-id-16' visibility='default' filepath='include/linux/blk-mq.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='poll_invoked' type-id='type-id-16' visibility='default' filepath='include/linux/blk-mq.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='poll_success' type-id='type-id-16' visibility='default' filepath='include/linux/blk-mq.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='debugfs_dir' type-id='type-id-23' visibility='default' filepath='include/linux/blk-mq.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='sched_debugfs_dir' type-id='type-id-23' visibility='default' filepath='include/linux/blk-mq.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='srcu' type-id='type-id-3754' visibility='default' filepath='include/linux/blk-mq.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__1' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/blk-mq.h' line='16' column='1' id='type-id-3768'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/blk-mq.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dispatch' type-id='type-id-20' visibility='default' filepath='include/linux/blk-mq.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='state' type-id='type-id-16' visibility='default' filepath='include/linux/blk-mq.h' line='19' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blk_flush_queue' size-in-bits='704' is-struct='yes' visibility='default' filepath='block/blk.h' line='22' column='1' id='type-id-3773'>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='flush_queue_delayed' type-id='type-id-5' visibility='default' filepath='block/blk.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='flush_pending_idx' type-id='type-id-5' visibility='default' filepath='block/blk.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='flush_running_idx' type-id='type-id-5' visibility='default' filepath='block/blk.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='rq_status' type-id='type-id-361' visibility='default' filepath='block/blk.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flush_pending_since' type-id='type-id-16' visibility='default' filepath='block/blk.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flush_queue' type-id='type-id-3748' visibility='default' filepath='block/blk.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='flush_data_in_flight' type-id='type-id-20' visibility='default' filepath='block/blk.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='flush_rq' type-id='type-id-463' visibility='default' filepath='block/blk.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='orig_rq' type-id='type-id-463' visibility='default' filepath='block/blk.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='mq_flush_lock' type-id='type-id-247' visibility='default' filepath='block/blk.h' line='37' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sbitmap' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/sbitmap.h' line='49' column='1' id='type-id-3770'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='depth' type-id='type-id-5' visibility='default' filepath='include/linux/sbitmap.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='shift' type-id='type-id-5' visibility='default' filepath='include/linux/sbitmap.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='map_nr' type-id='type-id-5' visibility='default' filepath='include/linux/sbitmap.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='map' type-id='type-id-3774' visibility='default' filepath='include/linux/sbitmap.h' line='68' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sbitmap_word' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/sbitmap.h' line='31' column='1' id='type-id-3775'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='word' type-id='type-id-16' visibility='default' filepath='include/linux/sbitmap.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='depth' type-id='type-id-16' visibility='default' filepath='include/linux/sbitmap.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blk_mq_tags' size-in-bits='1280' is-struct='yes' visibility='default' filepath='block/blk-mq-tag.h' line='10' column='1' id='type-id-3776'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nr_tags' type-id='type-id-5' visibility='default' filepath='block/blk-mq-tag.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='nr_reserved_tags' type-id='type-id-5' visibility='default' filepath='block/blk-mq-tag.h' line='12' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='active_queues' type-id='type-id-26' visibility='default' filepath='block/blk-mq-tag.h' line='14' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bitmap_tags' type-id='type-id-3777' visibility='default' filepath='block/blk-mq-tag.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='breserved_tags' type-id='type-id-3777' visibility='default' filepath='block/blk-mq-tag.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='rqs' type-id='type-id-643' visibility='default' filepath='block/blk-mq-tag.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='static_rqs' type-id='type-id-643' visibility='default' filepath='block/blk-mq-tag.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='page_list' type-id='type-id-20' visibility='default' filepath='block/blk-mq-tag.h' line='21' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sbitmap_queue' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/sbitmap.h' line='98' column='1' id='type-id-3777'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sb' type-id='type-id-3770' visibility='default' filepath='include/linux/sbitmap.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='alloc_hint' type-id='type-id-482' visibility='default' filepath='include/linux/sbitmap.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='wake_batch' type-id='type-id-5' visibility='default' filepath='include/linux/sbitmap.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='wake_index' type-id='type-id-26' visibility='default' filepath='include/linux/sbitmap.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ws' type-id='type-id-3778' visibility='default' filepath='include/linux/sbitmap.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='round_robin' type-id='type-id-33' visibility='default' filepath='include/linux/sbitmap.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='min_shallow_depth' type-id='type-id-5' visibility='default' filepath='include/linux/sbitmap.h' line='137' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sbq_wait_state' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/sbitmap.h' line='77' column='1' id='type-id-3779'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='wait_cnt' type-id='type-id-26' visibility='default' filepath='include/linux/sbitmap.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wait' type-id='type-id-225' visibility='default' filepath='include/linux/sbitmap.h' line='86' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='srcu_struct' size-in-bits='4800' is-struct='yes' visibility='default' filepath='include/linux/srcutree.h' line='76' column='1' id='type-id-3753'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-3752' visibility='default' filepath='include/linux/srcutree.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='level' type-id='type-id-3750' visibility='default' filepath='include/linux/srcutree.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='srcu_cb_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/srcutree.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/srcutree.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='srcu_gp_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/srcutree.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='srcu_idx' type-id='type-id-5' visibility='default' filepath='include/linux/srcutree.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='srcu_gp_seq' type-id='type-id-16' visibility='default' filepath='include/linux/srcutree.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='srcu_gp_seq_needed' type-id='type-id-16' visibility='default' filepath='include/linux/srcutree.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='srcu_gp_seq_needed_exp' type-id='type-id-16' visibility='default' filepath='include/linux/srcutree.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='srcu_last_gp_end' type-id='type-id-16' visibility='default' filepath='include/linux/srcutree.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='sda' type-id='type-id-3780' visibility='default' filepath='include/linux/srcutree.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='srcu_barrier_seq' type-id='type-id-16' visibility='default' filepath='include/linux/srcutree.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='srcu_barrier_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/srcutree.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='srcu_barrier_completion' type-id='type-id-1606' visibility='default' filepath='include/linux/srcutree.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='srcu_barrier_cpu_cnt' type-id='type-id-26' visibility='default' filepath='include/linux/srcutree.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='work' type-id='type-id-411' visibility='default' filepath='include/linux/srcutree.h' line='96' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='srcu_node' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/srcutree.h' line='60' column='1' id='type-id-3751'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/srcutree.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='srcu_have_cbs' type-id='type-id-222' visibility='default' filepath='include/linux/srcutree.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='srcu_data_have_cbs' type-id='type-id-222' visibility='default' filepath='include/linux/srcutree.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='srcu_gp_seq_needed_exp' type-id='type-id-16' visibility='default' filepath='include/linux/srcutree.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='srcu_parent' type-id='type-id-3749' visibility='default' filepath='include/linux/srcutree.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='grplo' type-id='type-id-17' visibility='default' filepath='include/linux/srcutree.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='grphi' type-id='type-id-17' visibility='default' filepath='include/linux/srcutree.h' line='70' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='srcu_data' size-in-bits='2560' is-struct='yes' visibility='default' filepath='include/linux/srcutree.h' line='37' column='1' id='type-id-3781'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='srcu_lock_count' type-id='type-id-219' visibility='default' filepath='include/linux/srcutree.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='srcu_unlock_count' type-id='type-id-219' visibility='default' filepath='include/linux/srcutree.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/srcutree.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='srcu_cblist' type-id='type-id-3782' visibility='default' filepath='include/linux/srcutree.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='srcu_gp_seq_needed' type-id='type-id-16' visibility='default' filepath='include/linux/srcutree.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='srcu_gp_seq_needed_exp' type-id='type-id-16' visibility='default' filepath='include/linux/srcutree.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='srcu_cblist_invoking' type-id='type-id-33' visibility='default' filepath='include/linux/srcutree.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='work' type-id='type-id-411' visibility='default' filepath='include/linux/srcutree.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='srcu_barrier_head' type-id='type-id-385' visibility='default' filepath='include/linux/srcutree.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='mynode' type-id='type-id-3749' visibility='default' filepath='include/linux/srcutree.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='grpmask' type-id='type-id-16' visibility='default' filepath='include/linux/srcutree.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='cpu' type-id='type-id-17' visibility='default' filepath='include/linux/srcutree.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='sp' type-id='type-id-3783' visibility='default' filepath='include/linux/srcutree.h' line='54' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rcu_segcblist' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/rcu_segcblist.h' line='77' column='1' id='type-id-3782'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-91' visibility='default' filepath='include/linux/rcu_segcblist.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tails' type-id='type-id-3747' visibility='default' filepath='include/linux/rcu_segcblist.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='gp_seq' type-id='type-id-222' visibility='default' filepath='include/linux/rcu_segcblist.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='len' type-id='type-id-192' visibility='default' filepath='include/linux/rcu_segcblist.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='len_lazy' type-id='type-id-192' visibility='default' filepath='include/linux/rcu_segcblist.h' line='82' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blk_mq_queue_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-mq.h' line='95' column='1' id='type-id-3784'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rq' type-id='type-id-463' visibility='default' filepath='include/linux/blk-mq.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='last' type-id='type-id-33' visibility='default' filepath='include/linux/blk-mq.h' line='97' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='get_budget_fn' type-id='type-id-3785' filepath='include/linux/blk-mq.h' line='102' column='1' id='type-id-3786'/>
+      <typedef-decl name='put_budget_fn' type-id='type-id-3787' filepath='include/linux/blk-mq.h' line='103' column='1' id='type-id-3788'/>
+      <typedef-decl name='timeout_fn' type-id='type-id-3789' filepath='include/linux/blk-mq.h' line='104' column='1' id='type-id-3790'/>
+      <typedef-decl name='poll_fn' type-id='type-id-3791' filepath='include/linux/blk-mq.h' line='115' column='1' id='type-id-3792'/>
+      <typedef-decl name='init_hctx_fn' type-id='type-id-3793' filepath='include/linux/blk-mq.h' line='105' column='1' id='type-id-3794'/>
+      <typedef-decl name='exit_hctx_fn' type-id='type-id-3795' filepath='include/linux/blk-mq.h' line='106' column='1' id='type-id-3796'/>
+      <typedef-decl name='init_request_fn' type-id='type-id-3797' filepath='include/linux/blk-mq.h' line='107' column='1' id='type-id-3798'/>
+      <class-decl name='blk_mq_tag_set' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/linux/blk-mq.h' line='77' column='1' id='type-id-3799'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mq_map' type-id='type-id-482' visibility='default' filepath='include/linux/blk-mq.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ops' type-id='type-id-481' visibility='default' filepath='include/linux/blk-mq.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='nr_hw_queues' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='queue_depth' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='reserved_tags' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='cmd_size' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='numa_node' type-id='type-id-17' visibility='default' filepath='include/linux/blk-mq.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='timeout' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/blk-mq.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='driver_data' type-id='type-id-15' visibility='default' filepath='include/linux/blk-mq.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='tags' type-id='type-id-3800' visibility='default' filepath='include/linux/blk-mq.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='tag_list_lock' type-id='type-id-245' visibility='default' filepath='include/linux/blk-mq.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='tag_list' type-id='type-id-20' visibility='default' filepath='include/linux/blk-mq.h' line='92' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='exit_request_fn' type-id='type-id-3801' filepath='include/linux/blk-mq.h' line='109' column='1' id='type-id-3802'/>
+      <typedef-decl name='cleanup_rq_fn' type-id='type-id-590' filepath='include/linux/blk-mq.h' line='117' column='1' id='type-id-3803'/>
+      <typedef-decl name='map_queues_fn' type-id='type-id-3804' filepath='include/linux/blk-mq.h' line='116' column='1' id='type-id-3805'/>
+      <typedef-decl name='blk_mq_req_flags_t' type-id='type-id-511' filepath='include/linux/blk_types.h' line='266' column='1' id='type-id-3806'/>
+      <pointer-type-def type-id='type-id-3773' size-in-bits='64' id='type-id-3769'/>
+      <pointer-type-def type-id='type-id-483' size-in-bits='64' id='type-id-3771'/>
+      <pointer-type-def type-id='type-id-3767' size-in-bits='64' id='type-id-3745'/>
+      <pointer-type-def type-id='type-id-3745' size-in-bits='64' id='type-id-3807'/>
+      <pointer-type-def type-id='type-id-3799' size-in-bits='64' id='type-id-3744'/>
+      <pointer-type-def type-id='type-id-3776' size-in-bits='64' id='type-id-3772'/>
+      <pointer-type-def type-id='type-id-3772' size-in-bits='64' id='type-id-3800'/>
+      <pointer-type-def type-id='type-id-133' size-in-bits='64' id='type-id-3808'/>
+      <pointer-type-def type-id='type-id-91' size-in-bits='64' id='type-id-3746'/>
+      <pointer-type-def type-id='type-id-3803' size-in-bits='64' id='type-id-3809'/>
+      <qualified-type-def type-id='type-id-3784' const='yes' id='type-id-3810'/>
+      <pointer-type-def type-id='type-id-3810' size-in-bits='64' id='type-id-3811'/>
+      <qualified-type-def type-id='type-id-499' const='yes' id='type-id-3812'/>
+      <pointer-type-def type-id='type-id-3812' size-in-bits='64' id='type-id-3813'/>
+      <pointer-type-def type-id='type-id-3796' size-in-bits='64' id='type-id-3814'/>
+      <pointer-type-def type-id='type-id-3802' size-in-bits='64' id='type-id-3815'/>
+      <pointer-type-def type-id='type-id-3786' size-in-bits='64' id='type-id-3816'/>
+      <pointer-type-def type-id='type-id-3794' size-in-bits='64' id='type-id-3817'/>
+      <pointer-type-def type-id='type-id-3798' size-in-bits='64' id='type-id-3818'/>
+      <pointer-type-def type-id='type-id-3819' size-in-bits='64' id='type-id-3820'/>
+      <pointer-type-def type-id='type-id-3805' size-in-bits='64' id='type-id-3821'/>
+      <pointer-type-def type-id='type-id-3792' size-in-bits='64' id='type-id-3822'/>
+      <pointer-type-def type-id='type-id-3788' size-in-bits='64' id='type-id-3823'/>
+      <pointer-type-def type-id='type-id-3766' size-in-bits='64' id='type-id-3824'/>
+      <pointer-type-def type-id='type-id-3758' size-in-bits='64' id='type-id-3825'/>
+      <pointer-type-def type-id='type-id-3775' size-in-bits='64' id='type-id-3774'/>
+      <pointer-type-def type-id='type-id-3779' size-in-bits='64' id='type-id-3778'/>
+      <pointer-type-def type-id='type-id-3781' size-in-bits='64' id='type-id-3780'/>
+      <pointer-type-def type-id='type-id-3751' size-in-bits='64' id='type-id-3749'/>
+      <pointer-type-def type-id='type-id-3753' size-in-bits='64' id='type-id-3783'/>
+      <pointer-type-def type-id='type-id-3790' size-in-bits='64' id='type-id-3826'/>
+      <pointer-type-def type-id='type-id-3827' size-in-bits='64' id='type-id-3828'/>
+      <pointer-type-def type-id='type-id-3829' size-in-bits='64' id='type-id-3763'/>
+      <pointer-type-def type-id='type-id-3830' size-in-bits='64' id='type-id-3762'/>
+      <pointer-type-def type-id='type-id-3831' size-in-bits='64' id='type-id-3759'/>
+      <pointer-type-def type-id='type-id-3832' size-in-bits='64' id='type-id-3761'/>
+      <pointer-type-def type-id='type-id-3833' size-in-bits='64' id='type-id-3760'/>
+      <pointer-type-def type-id='type-id-3834' size-in-bits='64' id='type-id-3835'/>
+      <function-decl name='blk_queue_flag_set' mangled-name='blk_queue_flag_set' filepath='block/blk-core.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_flag_set'>
+        <parameter type-id='type-id-5' name='flag' filepath='block/blk-core.c' line='81' column='1'/>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-core.c' line='81' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_flag_clear' mangled-name='blk_queue_flag_clear' filepath='block/blk-core.c' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_flag_clear'>
+        <parameter type-id='type-id-5' name='flag' filepath='block/blk-core.c' line='96' column='1'/>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-core.c' line='96' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_status_to_errno' mangled-name='blk_status_to_errno' filepath='block/blk-core.c' line='244' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_status_to_errno'>
+        <parameter type-id='type-id-361' name='status' filepath='block/blk-core.c' line='244' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='blk_put_queue' mangled-name='blk_put_queue' filepath='block/blk-core.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_put_queue'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-core.c' line='540' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_cleanup_queue' mangled-name='blk_cleanup_queue' filepath='block/blk-core.c' line='757' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_cleanup_queue'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-core.c' line='757' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_get_queue' mangled-name='blk_get_queue' filepath='block/blk-core.c' line='1207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_get_queue'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-core.c' line='1207' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='blk_get_request' mangled-name='blk_get_request' filepath='block/blk-core.c' line='1624' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_get_request'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-core.c' line='1624' column='1'/>
+        <parameter type-id='type-id-5' name='op' filepath='block/blk-core.c' line='1624' column='1'/>
+        <parameter type-id='type-id-3806' name='flags' filepath='block/blk-core.c' line='1625' column='1'/>
+        <return type-id='type-id-463'/>
+      </function-decl>
+      <function-decl name='blk_put_request' mangled-name='blk_put_request' filepath='block/blk-core.c' line='1792' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_put_request'>
+        <parameter type-id='type-id-463' name='req' filepath='block/blk-core.c' line='1792' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_update_request' mangled-name='blk_update_request' filepath='block/blk-core.c' line='3110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_update_request'>
+        <parameter type-id='type-id-463' name='req' filepath='block/blk-core.c' line='3110' column='1'/>
+        <parameter type-id='type-id-361' name='error' filepath='block/blk-core.c' line='3110' column='1'/>
+        <parameter type-id='type-id-5' name='nr_bytes' filepath='block/blk-core.c' line='3111' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3789'>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-634'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3791'>
+        <parameter type-id='type-id-3745'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3793'>
+        <parameter type-id='type-id-3745'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3804'>
+        <parameter type-id='type-id-3744'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3797'>
+        <parameter type-id='type-id-3744'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3819'>
+        <parameter type-id='type-id-3813'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3765'>
+        <parameter type-id='type-id-3745'/>
+        <parameter type-id='type-id-3811'/>
+        <return type-id='type-id-361'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3785'>
+        <parameter type-id='type-id-3745'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3787'>
+        <parameter type-id='type-id-3745'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3795'>
+        <parameter type-id='type-id-3745'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3801'>
+        <parameter type-id='type-id-3744'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3827'>
+        <parameter type-id='type-id-490'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3829'>
+        <parameter type-id='type-id-467'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3830'>
+        <parameter type-id='type-id-467'/>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3831'>
+        <parameter type-id='type-id-467'/>
+        <parameter type-id='type-id-358'/>
+        <parameter type-id='type-id-486'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3832'>
+        <parameter type-id='type-id-467'/>
+        <parameter type-id='type-id-463'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3833'>
+        <parameter type-id='type-id-467'/>
+        <parameter type-id='type-id-463'/>
+        <parameter type-id='type-id-358'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3834'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-463'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='block/blk-settings.c' language='LANG_C89'>
+      <class-decl name='cgroup_subsys_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3836'/>
+      <union-decl name='__anonymous_union__' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/blkdev.h' line='178' column='1' id='type-id-3837'>
+        <data-member access='private'>
+          <var-decl name='hash' type-id='type-id-520' visibility='default' filepath='include/linux/blkdev.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ipi_list' type-id='type-id-20' visibility='default' filepath='include/linux/blkdev.h' line='180' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__3' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/backing-dev-defs.h' line='160' column='1' id='type-id-3838'>
+        <data-member access='private'>
+          <var-decl name='release_work' type-id='type-id-255' visibility='default' filepath='include/linux/backing-dev-defs.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/backing-dev-defs.h' line='162' column='1'/>
+        </data-member>
+      </union-decl>
+      <pointer-type-def type-id='type-id-3836' size-in-bits='64' id='type-id-3839'/>
+      <function-decl name='blk_queue_rq_timeout' mangled-name='blk_queue_rq_timeout' filepath='block/blk-settings.c' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_rq_timeout'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='63' column='1'/>
+        <parameter type-id='type-id-5' name='timeout' filepath='block/blk-settings.c' line='63' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_bounce_limit' mangled-name='blk_queue_bounce_limit' filepath='block/blk-settings.c' line='190' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_bounce_limit'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='190' column='1'/>
+        <parameter type-id='type-id-40' name='max_addr' filepath='block/blk-settings.c' line='190' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_max_hw_sectors' mangled-name='blk_queue_max_hw_sectors' filepath='block/blk-settings.c' line='237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_max_hw_sectors'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='237' column='1'/>
+        <parameter type-id='type-id-5' name='max_hw_sectors' filepath='block/blk-settings.c' line='237' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_max_discard_sectors' mangled-name='blk_queue_max_discard_sectors' filepath='block/blk-settings.c' line='281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_max_discard_sectors'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='281' column='1'/>
+        <parameter type-id='type-id-5' name='max_discard_sectors' filepath='block/blk-settings.c' line='282' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_max_segments' mangled-name='blk_queue_max_segments' filepath='block/blk-settings.c' line='323' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_max_segments'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='323' column='1'/>
+        <parameter type-id='type-id-312' name='max_segments' filepath='block/blk-settings.c' line='323' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_max_segment_size' mangled-name='blk_queue_max_segment_size' filepath='block/blk-settings.c' line='360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_max_segment_size'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='360' column='1'/>
+        <parameter type-id='type-id-5' name='max_size' filepath='block/blk-settings.c' line='360' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_logical_block_size' mangled-name='blk_queue_logical_block_size' filepath='block/blk-settings.c' line='382' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_logical_block_size'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='382' column='1'/>
+        <parameter type-id='type-id-312' name='size' filepath='block/blk-settings.c' line='382' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_physical_block_size' mangled-name='blk_queue_physical_block_size' filepath='block/blk-settings.c' line='404' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_physical_block_size'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='404' column='1'/>
+        <parameter type-id='type-id-5' name='size' filepath='block/blk-settings.c' line='404' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_alignment_offset' mangled-name='blk_queue_alignment_offset' filepath='block/blk-settings.c' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_alignment_offset'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='427' column='1'/>
+        <parameter type-id='type-id-5' name='offset' filepath='block/blk-settings.c' line='427' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_io_min' mangled-name='blk_queue_io_min' filepath='block/blk-settings.c' line='472' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_io_min'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='472' column='1'/>
+        <parameter type-id='type-id-5' name='min' filepath='block/blk-settings.c' line='472' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_io_opt' mangled-name='blk_queue_io_opt' filepath='block/blk-settings.c' line='510' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_io_opt'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='510' column='1'/>
+        <parameter type-id='type-id-5' name='opt' filepath='block/blk-settings.c' line='510' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='blk_queue_write_cache' mangled-name='blk_queue_write_cache' filepath='block/blk-settings.c' line='890' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_queue_write_cache'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-settings.c' line='890' column='1'/>
+        <parameter type-id='type-id-33' name='wc' filepath='block/blk-settings.c' line='890' column='1'/>
+        <parameter type-id='type-id-33' name='fua' filepath='block/blk-settings.c' line='890' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='block/blk-map.c' language='LANG_C89'>
+      <function-decl name='blk_rq_map_kern' mangled-name='blk_rq_map_kern' filepath='block/blk-map.c' line='215' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_rq_map_kern'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-map.c' line='215' column='1'/>
+        <parameter type-id='type-id-463' name='rq' filepath='block/blk-map.c' line='215' column='1'/>
+        <parameter type-id='type-id-15' name='kbuf' filepath='block/blk-map.c' line='215' column='1'/>
+        <parameter type-id='type-id-5' name='len' filepath='block/blk-map.c' line='216' column='1'/>
+        <parameter type-id='type-id-485' name='gfp_mask' filepath='block/blk-map.c' line='216' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='block/blk-exec.c' language='LANG_C89'>
+      <function-decl name='blk_execute_rq' mangled-name='blk_execute_rq' filepath='block/blk-exec.c' line='94' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_execute_rq'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-exec.c' line='94' column='1'/>
+        <parameter type-id='type-id-360' name='bd_disk' filepath='block/blk-exec.c' line='94' column='1'/>
+        <parameter type-id='type-id-463' name='rq' filepath='block/blk-exec.c' line='95' column='1'/>
+        <parameter type-id='type-id-17' name='at_head' filepath='block/blk-exec.c' line='95' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='block/blk-merge.c' language='LANG_C89'>
+      <function-decl name='blk_rq_map_sg' mangled-name='blk_rq_map_sg' filepath='block/blk-merge.c' line='437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_rq_map_sg'>
+        <parameter type-id='type-id-378' name='q' filepath='block/blk-merge.c' line='437' column='1'/>
+        <parameter type-id='type-id-463' name='rq' filepath='block/blk-merge.c' line='437' column='1'/>
+        <parameter type-id='type-id-918' name='sglist' filepath='block/blk-merge.c' line='438' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='block/genhd.c' language='LANG_C89'>
+      <function-decl name='__alloc_disk_node' mangled-name='__alloc_disk_node' filepath='block/genhd.c' line='1435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__alloc_disk_node'>
+        <parameter type-id='type-id-17' name='minors' filepath='block/genhd.c' line='1435' column='1'/>
+        <parameter type-id='type-id-17' name='node_id' filepath='block/genhd.c' line='1435' column='1'/>
+        <return type-id='type-id-360'/>
+      </function-decl>
+      <function-decl name='register_blkdev' mangled-name='register_blkdev' filepath='block/genhd.c' line='340' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_blkdev'>
+        <parameter type-id='type-id-5' name='major' filepath='block/genhd.c' line='340' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='block/genhd.c' line='340' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='unregister_blkdev' mangled-name='unregister_blkdev' filepath='block/genhd.c' line='404' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_blkdev'>
+        <parameter type-id='type-id-5' name='major' filepath='block/genhd.c' line='404' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='block/genhd.c' line='404' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='device_add_disk' mangled-name='device_add_disk' filepath='block/genhd.c' line='727' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_add_disk'>
+        <parameter type-id='type-id-240' name='parent' filepath='block/genhd.c' line='727' column='1'/>
+        <parameter type-id='type-id-360' name='disk' filepath='block/genhd.c' line='727' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='del_gendisk' mangled-name='del_gendisk' filepath='block/genhd.c' line='739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='del_gendisk'>
+        <parameter type-id='type-id-360' name='disk' filepath='block/genhd.c' line='739' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='put_disk' mangled-name='put_disk' filepath='block/genhd.c' line='1509' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='put_disk'>
+        <parameter type-id='type-id-360' name='disk' filepath='block/genhd.c' line='1509' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='set_disk_ro' mangled-name='set_disk_ro' filepath='block/genhd.c' line='1548' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='set_disk_ro'>
+        <parameter type-id='type-id-360' name='disk' filepath='block/genhd.c' line='1548' column='1'/>
+        <parameter type-id='type-id-17' name='flag' filepath='block/genhd.c' line='1548' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='block/blk-mq-virtio.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-3840' size-in-bits='infinite' id='type-id-3841'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='irq_affinity' size-in-bits='64' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3842'/>
+      <array-type-def dimensions='1' type-id='type-id-3843' size-in-bits='infinite' id='type-id-3844'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='virtio_device' size-in-bits='6784' is-struct='yes' visibility='default' filepath='include/linux/virtio.h' line='125' column='1' id='type-id-3845'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='index' type-id='type-id-17' visibility='default' filepath='include/linux/virtio.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='failed' type-id='type-id-33' visibility='default' filepath='include/linux/virtio.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='config_enabled' type-id='type-id-33' visibility='default' filepath='include/linux/virtio.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='config_change_pending' type-id='type-id-33' visibility='default' filepath='include/linux/virtio.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='config_lock' type-id='type-id-247' visibility='default' filepath='include/linux/virtio.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/virtio.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='id' type-id='type-id-3846' visibility='default' filepath='include/linux/virtio.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='config' type-id='type-id-3847' visibility='default' filepath='include/linux/virtio.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='vringh_config' type-id='type-id-3848' visibility='default' filepath='include/linux/virtio.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='vqs' type-id='type-id-20' visibility='default' filepath='include/linux/virtio.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='features' type-id='type-id-40' visibility='default' filepath='include/linux/virtio.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6720'>
+          <var-decl name='priv' type-id='type-id-15' visibility='default' filepath='include/linux/virtio.h' line='137' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='virtio_device_id' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/mod_devicetable.h' line='408' column='1' id='type-id-3846'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='device' type-id='type-id-511' visibility='default' filepath='include/linux/mod_devicetable.h' line='409' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='vendor' type-id='type-id-511' visibility='default' filepath='include/linux/mod_devicetable.h' line='410' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='virtio_config_ops' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/virtio_config.h' line='65' column='1' id='type-id-3849'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='get' type-id='type-id-3850' visibility='default' filepath='include/linux/virtio_config.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='set' type-id='type-id-3850' visibility='default' filepath='include/linux/virtio_config.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='generation' type-id='type-id-3851' visibility='default' filepath='include/linux/virtio_config.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='get_status' type-id='type-id-3852' visibility='default' filepath='include/linux/virtio_config.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='set_status' type-id='type-id-3853' visibility='default' filepath='include/linux/virtio_config.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='reset' type-id='type-id-3854' visibility='default' filepath='include/linux/virtio_config.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='find_vqs' type-id='type-id-3855' visibility='default' filepath='include/linux/virtio_config.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='del_vqs' type-id='type-id-3854' visibility='default' filepath='include/linux/virtio_config.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='get_features' type-id='type-id-3856' visibility='default' filepath='include/linux/virtio_config.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='finalize_features' type-id='type-id-3857' visibility='default' filepath='include/linux/virtio_config.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='bus_name' type-id='type-id-3858' visibility='default' filepath='include/linux/virtio_config.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='set_vq_affinity' type-id='type-id-3859' visibility='default' filepath='include/linux/virtio_config.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='get_vq_affinity' type-id='type-id-3860' visibility='default' filepath='include/linux/virtio_config.h' line='84' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='virtqueue' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/virtio.h' line='28' column='1' id='type-id-3861'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/virtio.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='callback' type-id='type-id-3862' visibility='default' filepath='include/linux/virtio.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/virtio.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='vdev' type-id='type-id-3863' visibility='default' filepath='include/linux/virtio.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='index' type-id='type-id-5' visibility='default' filepath='include/linux/virtio.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='num_free' type-id='type-id-5' visibility='default' filepath='include/linux/virtio.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='priv' type-id='type-id-15' visibility='default' filepath='include/linux/virtio.h' line='35' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='vq_callback_t' type-id='type-id-3864' filepath='include/linux/virtio_config.h' line='64' column='1' id='type-id-3865'/>
+      <class-decl name='vringh_config_ops' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/vringh.h' line='72' column='1' id='type-id-3866'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='find_vrhs' type-id='type-id-3867' visibility='default' filepath='include/linux/vringh.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='del_vrhs' type-id='type-id-3854' visibility='default' filepath='include/linux/vringh.h' line='75' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vringh' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/vringh.h' line='33' column='1' id='type-id-3868'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='little_endian' type-id='type-id-33' visibility='default' filepath='include/linux/vringh.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='event_indices' type-id='type-id-33' visibility='default' filepath='include/linux/vringh.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='weak_barriers' type-id='type-id-33' visibility='default' filepath='include/linux/vringh.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='last_avail_idx' type-id='type-id-688' visibility='default' filepath='include/linux/vringh.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='last_used_idx' type-id='type-id-688' visibility='default' filepath='include/linux/vringh.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='completed' type-id='type-id-7' visibility='default' filepath='include/linux/vringh.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='vring' type-id='type-id-3869' visibility='default' filepath='include/linux/vringh.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='notify' type-id='type-id-3870' visibility='default' filepath='include/linux/vringh.h' line='56' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vring' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='97' column='1' id='type-id-3869'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='num' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='desc' type-id='type-id-3871' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='avail' type-id='type-id-3872' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='used' type-id='type-id-3873' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='104' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vring_desc' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='66' column='1' id='type-id-3874'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='addr' type-id='type-id-3875' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='len' type-id='type-id-3876' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='flags' type-id='type-id-3840' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='next' type-id='type-id-3840' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__virtio64' type-id='type-id-100' filepath='include/uapi/linux/virtio_types.h' line='44' column='1' id='type-id-3875'/>
+      <typedef-decl name='__virtio32' type-id='type-id-511' filepath='include/uapi/linux/virtio_types.h' line='43' column='1' id='type-id-3876'/>
+      <typedef-decl name='__virtio16' type-id='type-id-108' filepath='include/uapi/linux/virtio_types.h' line='42' column='1' id='type-id-3840'/>
+      <class-decl name='vring_avail' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='77' column='1' id='type-id-3877'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-3840' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='idx' type-id='type-id-3840' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ring' type-id='type-id-3841' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='80' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vring_used' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='91' column='1' id='type-id-3878'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-3840' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='idx' type-id='type-id-3840' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ring' type-id='type-id-3844' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='94' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vring_used_elem' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='84' column='1' id='type-id-3843'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='id' type-id='type-id-3876' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='len' type-id='type-id-3876' visibility='default' filepath='include/uapi/linux/virtio_ring.h' line='88' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='vrh_callback_t' type-id='type-id-3879' filepath='include/linux/vringh.h' line='71' column='1' id='type-id-3880'/>
+      <qualified-type-def type-id='type-id-33' const='yes' id='type-id-3881'/>
+      <pointer-type-def type-id='type-id-3881' size-in-bits='64' id='type-id-3882'/>
+      <pointer-type-def type-id='type-id-3883' size-in-bits='64' id='type-id-3858'/>
+      <qualified-type-def type-id='type-id-4' const='yes' id='type-id-3884'/>
+      <pointer-type-def type-id='type-id-3884' size-in-bits='64' id='type-id-92'/>
+      <pointer-type-def type-id='type-id-3885' size-in-bits='64' id='type-id-3860'/>
+      <qualified-type-def type-id='type-id-3849' const='yes' id='type-id-3886'/>
+      <pointer-type-def type-id='type-id-3886' size-in-bits='64' id='type-id-3847'/>
+      <qualified-type-def type-id='type-id-3866' const='yes' id='type-id-3887'/>
+      <pointer-type-def type-id='type-id-3887' size-in-bits='64' id='type-id-3848'/>
+      <pointer-type-def type-id='type-id-3888' size-in-bits='64' id='type-id-3857'/>
+      <pointer-type-def type-id='type-id-3889' size-in-bits='64' id='type-id-3855'/>
+      <pointer-type-def type-id='type-id-3890' size-in-bits='64' id='type-id-3867'/>
+      <pointer-type-def type-id='type-id-3891' size-in-bits='64' id='type-id-3859'/>
+      <pointer-type-def type-id='type-id-3842' size-in-bits='64' id='type-id-3892'/>
+      <pointer-type-def type-id='type-id-3893' size-in-bits='64' id='type-id-3851'/>
+      <pointer-type-def type-id='type-id-3894' size-in-bits='64' id='type-id-3856'/>
+      <pointer-type-def type-id='type-id-3895' size-in-bits='64' id='type-id-3852'/>
+      <pointer-type-def type-id='type-id-3845' size-in-bits='64' id='type-id-3863'/>
+      <pointer-type-def type-id='type-id-3861' size-in-bits='64' id='type-id-3896'/>
+      <pointer-type-def type-id='type-id-3896' size-in-bits='64' id='type-id-3897'/>
+      <pointer-type-def type-id='type-id-3898' size-in-bits='64' id='type-id-3854'/>
+      <pointer-type-def type-id='type-id-3899' size-in-bits='64' id='type-id-3853'/>
+      <pointer-type-def type-id='type-id-3900' size-in-bits='64' id='type-id-3850'/>
+      <pointer-type-def type-id='type-id-3864' size-in-bits='64' id='type-id-3862'/>
+      <pointer-type-def type-id='type-id-3901' size-in-bits='64' id='type-id-3870'/>
+      <pointer-type-def type-id='type-id-3865' size-in-bits='64' id='type-id-3902'/>
+      <pointer-type-def type-id='type-id-3902' size-in-bits='64' id='type-id-3903'/>
+      <pointer-type-def type-id='type-id-3880' size-in-bits='64' id='type-id-3904'/>
+      <pointer-type-def type-id='type-id-3904' size-in-bits='64' id='type-id-3905'/>
+      <pointer-type-def type-id='type-id-3877' size-in-bits='64' id='type-id-3872'/>
+      <pointer-type-def type-id='type-id-3874' size-in-bits='64' id='type-id-3871'/>
+      <pointer-type-def type-id='type-id-3878' size-in-bits='64' id='type-id-3873'/>
+      <pointer-type-def type-id='type-id-3868' size-in-bits='64' id='type-id-3906'/>
+      <pointer-type-def type-id='type-id-3906' size-in-bits='64' id='type-id-3907'/>
+      <function-decl name='blk_mq_virtio_map_queues' mangled-name='blk_mq_virtio_map_queues' filepath='block/blk-mq-virtio.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_virtio_map_queues'>
+        <parameter type-id='type-id-3744' name='set' filepath='block/blk-mq-virtio.c' line='32' column='1'/>
+        <parameter type-id='type-id-3863' name='vdev' filepath='block/blk-mq-virtio.c' line='33' column='1'/>
+        <parameter type-id='type-id-17' name='first_vec' filepath='block/blk-mq-virtio.c' line='33' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3883'>
+        <parameter type-id='type-id-3863'/>
+        <return type-id='type-id-4'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3885'>
+        <parameter type-id='type-id-3863'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-3386'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3888'>
+        <parameter type-id='type-id-3863'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3889'>
+        <parameter type-id='type-id-3863'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-3897'/>
+        <parameter type-id='type-id-3903'/>
+        <parameter type-id='type-id-92'/>
+        <parameter type-id='type-id-3882'/>
+        <parameter type-id='type-id-3892'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3890'>
+        <parameter type-id='type-id-3863'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-3907'/>
+        <parameter type-id='type-id-3905'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3891'>
+        <parameter type-id='type-id-3896'/>
+        <parameter type-id='type-id-3386'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3893'>
+        <parameter type-id='type-id-3863'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3894'>
+        <parameter type-id='type-id-3863'/>
+        <return type-id='type-id-40'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3895'>
+        <parameter type-id='type-id-3863'/>
+        <return type-id='type-id-214'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3898'>
+        <parameter type-id='type-id-3863'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3899'>
+        <parameter type-id='type-id-3863'/>
+        <parameter type-id='type-id-214'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3900'>
+        <parameter type-id='type-id-3863'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3879'>
+        <parameter type-id='type-id-3863'/>
+        <parameter type-id='type-id-3906'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3864'>
+        <parameter type-id='type-id-3896'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3901'>
+        <parameter type-id='type-id-3906'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='arch/arm64/lib/atomic_ll_sc.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-113' size-in-bits='64' id='type-id-3908'/>
+      <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-3909'/>
+      <function-decl name='__ll_sc_atomic_add' mangled-name='__ll_sc_atomic_add' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc_atomic_add'>
+        <parameter type-id='type-id-17' name='i' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='113' column='1'/>
+        <parameter type-id='type-id-3909' name='v' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='113' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__ll_sc_atomic_add_return' mangled-name='__ll_sc_atomic_add_return' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc_atomic_add_return'>
+        <parameter type-id='type-id-17' name='i' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='113' column='1'/>
+        <parameter type-id='type-id-3909' name='v' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='113' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__ll_sc_atomic_sub' mangled-name='__ll_sc_atomic_sub' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc_atomic_sub'>
+        <parameter type-id='type-id-17' name='i' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='114' column='1'/>
+        <parameter type-id='type-id-3909' name='v' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='114' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__ll_sc_atomic_sub_return' mangled-name='__ll_sc_atomic_sub_return' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc_atomic_sub_return'>
+        <parameter type-id='type-id-17' name='i' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='114' column='1'/>
+        <parameter type-id='type-id-3909' name='v' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='114' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__ll_sc_atomic64_add' mangled-name='__ll_sc_atomic64_add' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc_atomic64_add'>
+        <parameter type-id='type-id-192' name='i' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='207' column='1'/>
+        <parameter type-id='type-id-3908' name='v' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='207' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__ll_sc_atomic64_add_return_relaxed' mangled-name='__ll_sc_atomic64_add_return_relaxed' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc_atomic64_add_return_relaxed'>
+        <parameter type-id='type-id-192' name='i' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='207' column='1'/>
+        <parameter type-id='type-id-3908' name='v' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='207' column='1'/>
+        <return type-id='type-id-192'/>
+      </function-decl>
+      <function-decl name='__ll_sc_atomic64_andnot' mangled-name='__ll_sc_atomic64_andnot' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='219' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc_atomic64_andnot'>
+        <parameter type-id='type-id-192' name='i' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='219' column='1'/>
+        <parameter type-id='type-id-3908' name='v' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='219' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__ll_sc_atomic64_or' mangled-name='__ll_sc_atomic64_or' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='220' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc_atomic64_or'>
+        <parameter type-id='type-id-192' name='i' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='220' column='1'/>
+        <parameter type-id='type-id-3908' name='v' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='220' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__ll_sc_atomic64_fetch_or' mangled-name='__ll_sc_atomic64_fetch_or' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='220' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc_atomic64_fetch_or'>
+        <parameter type-id='type-id-192' name='i' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='220' column='1'/>
+        <parameter type-id='type-id-3908' name='v' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='220' column='1'/>
+        <return type-id='type-id-192'/>
+      </function-decl>
+      <function-decl name='__ll_sc___cmpxchg_case_mb_4' mangled-name='__ll_sc___cmpxchg_case_mb_4' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='291' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc___cmpxchg_case_mb_4'>
+        <parameter type-id='type-id-104' name='ptr' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='291' column='1'/>
+        <parameter type-id='type-id-16' name='old' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='291' column='1'/>
+        <parameter type-id='type-id-16' name='new' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='291' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+      <function-decl name='__ll_sc___cmpxchg_case_mb_8' mangled-name='__ll_sc___cmpxchg_case_mb_8' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='292' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ll_sc___cmpxchg_case_mb_8'>
+        <parameter type-id='type-id-104' name='ptr' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='292' column='1'/>
+        <parameter type-id='type-id-16' name='old' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='292' column='1'/>
+        <parameter type-id='type-id-16' name='new' filepath='arch/arm64/include/asm/atomic_ll_sc.h' line='292' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/random32.c' language='LANG_C89'>
+      <function-decl name='prandom_u32' mangled-name='prandom_u32' filepath='lib/random32.c' line='79' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='prandom_u32'>
+        <return type-id='type-id-7'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/iov_iter.c' language='LANG_C89'>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/uio.h' line='35' column='1' id='type-id-3910'>
+        <data-member access='private'>
+          <var-decl name='iov' type-id='type-id-2115' visibility='default' filepath='include/linux/uio.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='kvec' type-id='type-id-2116' visibility='default' filepath='include/linux/uio.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='bvec' type-id='type-id-3911' visibility='default' filepath='include/linux/uio.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='pipe' type-id='type-id-87' visibility='default' filepath='include/linux/uio.h' line='39' column='1'/>
+        </data-member>
+      </union-decl>
+      <qualified-type-def type-id='type-id-131' const='yes' id='type-id-3912'/>
+      <pointer-type-def type-id='type-id-3912' size-in-bits='64' id='type-id-3911'/>
+      <function-decl name='_copy_to_iter' mangled-name='_copy_to_iter' filepath='lib/iov_iter.c' line='558' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_copy_to_iter'>
+        <parameter type-id='type-id-15' name='addr' filepath='lib/iov_iter.c' line='558' column='1'/>
+        <parameter type-id='type-id-84' name='bytes' filepath='lib/iov_iter.c' line='558' column='1'/>
+        <parameter type-id='type-id-3008' name='i' filepath='lib/iov_iter.c' line='558' column='1'/>
+        <return type-id='type-id-84'/>
+      </function-decl>
+      <function-decl name='_copy_from_iter_full' mangled-name='_copy_from_iter_full' filepath='lib/iov_iter.c' line='712' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_copy_from_iter_full'>
+        <parameter type-id='type-id-15' name='addr' filepath='lib/iov_iter.c' line='712' column='1'/>
+        <parameter type-id='type-id-84' name='bytes' filepath='lib/iov_iter.c' line='712' column='1'/>
+        <parameter type-id='type-id-3008' name='i' filepath='lib/iov_iter.c' line='712' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/refcount.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-421' size-in-bits='64' id='type-id-3913'/>
+      <function-decl name='refcount_inc_not_zero_checked' mangled-name='refcount_inc_not_zero_checked' filepath='lib/refcount.c' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='refcount_inc_not_zero_checked'>
+        <parameter type-id='type-id-3913' name='r' filepath='lib/refcount.c' line='118' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='refcount_inc_checked' mangled-name='refcount_inc_checked' filepath='lib/refcount.c' line='151' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='refcount_inc_checked'>
+        <parameter type-id='type-id-3913' name='r' filepath='lib/refcount.c' line='151' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='refcount_dec_and_test_checked' mangled-name='refcount_dec_and_test_checked' filepath='lib/refcount.c' line='210' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='refcount_dec_and_test_checked'>
+        <parameter type-id='type-id-3913' name='r' filepath='lib/refcount.c' line='210' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/string_helpers.c' language='LANG_C89'>
+      <enum-decl name='string_size_units' filepath='include/linux/string_helpers.h' line='12' column='1' id='type-id-3914'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='STRING_UNITS_10' value='0'/>
+        <enumerator name='STRING_UNITS_2' value='1'/>
+      </enum-decl>
+      <qualified-type-def type-id='type-id-3914' const='yes' id='type-id-3915'/>
+      <function-decl name='string_get_size' mangled-name='string_get_size' filepath='lib/string_helpers.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='string_get_size'>
+        <parameter type-id='type-id-40' name='size' filepath='lib/string_helpers.c' line='33' column='1'/>
+        <parameter type-id='type-id-40' name='blk_size' filepath='lib/string_helpers.c' line='33' column='1'/>
+        <parameter type-id='type-id-3915' name='units' filepath='lib/string_helpers.c' line='33' column='1'/>
+        <parameter type-id='type-id-2' name='buf' filepath='lib/string_helpers.c' line='34' column='1'/>
+        <parameter type-id='type-id-17' name='len' filepath='lib/string_helpers.c' line='34' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/kstrtox.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-98' size-in-bits='64' id='type-id-3916'/>
+      <function-decl name='kstrtoull' mangled-name='kstrtoull' filepath='lib/kstrtox.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstrtoull'>
+        <parameter type-id='type-id-4' name='s' filepath='lib/kstrtox.c' line='121' column='1'/>
+        <parameter type-id='type-id-5' name='base' filepath='lib/kstrtox.c' line='121' column='1'/>
+        <parameter type-id='type-id-3916' name='res' filepath='lib/kstrtox.c' line='121' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/pci_iomap.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-2609' size-in-bits='704' id='type-id-3917'>
+        <subrange length='11' type-id='type-id-9' id='type-id-183'/>
+
+      </array-type-def>
+      <class-decl name='hotplug_slot' size-in-bits='384' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3918'/>
+      <class-decl name='msi_controller' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3919'/>
+      <class-decl name='pci_vpd' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3920'/>
+      <array-type-def dimensions='1' type-id='type-id-2155' size-in-bits='256' id='type-id-3921'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-2144' size-in-bits='5632' id='type-id-3922'>
+        <subrange length='11' type-id='type-id-9' id='type-id-183'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='512' id='type-id-3923'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <class-decl name='pci_dev' size-in-bits='15744' is-struct='yes' visibility='default' filepath='include/linux/pci.h' line='286' column='1' id='type-id-3924'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bus_list' type-id='type-id-20' visibility='default' filepath='include/linux/pci.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bus' type-id='type-id-3925' visibility='default' filepath='include/linux/pci.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='subordinate' type-id='type-id-3925' visibility='default' filepath='include/linux/pci.h' line='289' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='sysdata' type-id='type-id-15' visibility='default' filepath='include/linux/pci.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='procent' type-id='type-id-262' visibility='default' filepath='include/linux/pci.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='slot' type-id='type-id-3926' visibility='default' filepath='include/linux/pci.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='devfn' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='vendor' type-id='type-id-312' visibility='default' filepath='include/linux/pci.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='496'>
+          <var-decl name='device' type-id='type-id-312' visibility='default' filepath='include/linux/pci.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='subsystem_vendor' type-id='type-id-312' visibility='default' filepath='include/linux/pci.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='528'>
+          <var-decl name='subsystem_device' type-id='type-id-312' visibility='default' filepath='include/linux/pci.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='class' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='revision' type-id='type-id-214' visibility='default' filepath='include/linux/pci.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='584'>
+          <var-decl name='hdr_type' type-id='type-id-214' visibility='default' filepath='include/linux/pci.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='592'>
+          <var-decl name='pcie_cap' type-id='type-id-214' visibility='default' filepath='include/linux/pci.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='600'>
+          <var-decl name='msi_cap' type-id='type-id-214' visibility='default' filepath='include/linux/pci.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='msix_cap' type-id='type-id-214' visibility='default' filepath='include/linux/pci.h' line='309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='pcie_mpss' type-id='type-id-214' visibility='default' filepath='include/linux/pci.h' line='310' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='624'>
+          <var-decl name='rom_base_reg' type-id='type-id-214' visibility='default' filepath='include/linux/pci.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='632'>
+          <var-decl name='pin' type-id='type-id-214' visibility='default' filepath='include/linux/pci.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='pcie_flags_reg' type-id='type-id-688' visibility='default' filepath='include/linux/pci.h' line='313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='dma_alias_mask' type-id='type-id-45' visibility='default' filepath='include/linux/pci.h' line='314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='driver' type-id='type-id-3927' visibility='default' filepath='include/linux/pci.h' line='316' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='dma_mask' type-id='type-id-40' visibility='default' filepath='include/linux/pci.h' line='317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='dma_parms' type-id='type-id-2160' visibility='default' filepath='include/linux/pci.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='current_state' type-id='type-id-3928' visibility='default' filepath='include/linux/pci.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='pm_cap' type-id='type-id-214' visibility='default' filepath='include/linux/pci.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19'>
+          <var-decl name='pme_support' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18'>
+          <var-decl name='pme_poll' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17'>
+          <var-decl name='d1_support' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='332' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='d2_support' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15'>
+          <var-decl name='no_d1d2' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14'>
+          <var-decl name='no_d3cold' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13'>
+          <var-decl name='bridge_d3' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12'>
+          <var-decl name='d3cold_allowed' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11'>
+          <var-decl name='mmio_always_on' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10'>
+          <var-decl name='wakeup_prepared' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='340' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9'>
+          <var-decl name='runtime_d3cold' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='ignore_hotplug' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='hotplug_user_indicators' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='clear_retrain_link' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='d3_delay' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='d3cold_delay' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='eetlp_prefix_path' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='error_state' type-id='type-id-3929' visibility='default' filepath='include/linux/pci.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/pci.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7424'>
+          <var-decl name='cfg_size' type-id='type-id-17' visibility='default' filepath='include/linux/pci.h' line='364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7456'>
+          <var-decl name='irq' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='resource' type-id='type-id-3922' visibility='default' filepath='include/linux/pci.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13120'>
+          <var-decl name='match_driver' type-id='type-id-33' visibility='default' filepath='include/linux/pci.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23'>
+          <var-decl name='transparent' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22'>
+          <var-decl name='multifunction' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='376' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='21'>
+          <var-decl name='is_busmaster' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='378' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20'>
+          <var-decl name='no_msi' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19'>
+          <var-decl name='no_64bit_msi' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18'>
+          <var-decl name='block_cfg_access' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17'>
+          <var-decl name='broken_parity_status' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15'>
+          <var-decl name='irq_reroute_variant' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='383' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14'>
+          <var-decl name='msi_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='384' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13'>
+          <var-decl name='msix_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='385' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12'>
+          <var-decl name='ari_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11'>
+          <var-decl name='ats_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10'>
+          <var-decl name='pasid_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='388' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9'>
+          <var-decl name='pri_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='is_managed' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='needs_freset' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='state_saved' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='is_physfn' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='393' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='is_virtfn' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='reset_fn' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='395' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2'>
+          <var-decl name='is_hotplug_bridge' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1'>
+          <var-decl name='shpc_managed' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='397' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13120'>
+          <var-decl name='is_thunderbolt' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='__aer_firmware_first_valid' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='__aer_firmware_first' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='400' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='broken_intx_masking' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='io_window_1k' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='irq_managed' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26'>
+          <var-decl name='has_secondary_link' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='25'>
+          <var-decl name='non_compliant_bars' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='is_probed' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13168'>
+          <var-decl name='dev_flags' type-id='type-id-3930' visibility='default' filepath='include/linux/pci.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13184'>
+          <var-decl name='enable_cnt' type-id='type-id-26' visibility='default' filepath='include/linux/pci.h' line='408' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13216'>
+          <var-decl name='saved_config_space' type-id='type-id-3923' visibility='default' filepath='include/linux/pci.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13760'>
+          <var-decl name='saved_cap_space' type-id='type-id-186' visibility='default' filepath='include/linux/pci.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13824'>
+          <var-decl name='rom_attr' type-id='type-id-2609' visibility='default' filepath='include/linux/pci.h' line='412' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13888'>
+          <var-decl name='rom_attr_enabled' type-id='type-id-17' visibility='default' filepath='include/linux/pci.h' line='413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13952'>
+          <var-decl name='res_attr' type-id='type-id-3917' visibility='default' filepath='include/linux/pci.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14656'>
+          <var-decl name='res_attr_wc' type-id='type-id-3917' visibility='default' filepath='include/linux/pci.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15360'>
+          <var-decl name='msi_irq_groups' type-id='type-id-665' visibility='default' filepath='include/linux/pci.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15424'>
+          <var-decl name='vpd' type-id='type-id-3931' visibility='default' filepath='include/linux/pci.h' line='428' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15488'>
+          <var-decl name='rom' type-id='type-id-99' visibility='default' filepath='include/linux/pci.h' line='444' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15552'>
+          <var-decl name='romlen' type-id='type-id-84' visibility='default' filepath='include/linux/pci.h' line='445' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15616'>
+          <var-decl name='driver_override' type-id='type-id-2' visibility='default' filepath='include/linux/pci.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15680'>
+          <var-decl name='priv_flags' type-id='type-id-16' visibility='default' filepath='include/linux/pci.h' line='448' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pci_bus' size-in-bits='8768' is-struct='yes' visibility='default' filepath='include/linux/pci.h' line='545' column='1' id='type-id-3932'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/linux/pci.h' line='546' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='parent' type-id='type-id-3925' visibility='default' filepath='include/linux/pci.h' line='547' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='children' type-id='type-id-20' visibility='default' filepath='include/linux/pci.h' line='548' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='devices' type-id='type-id-20' visibility='default' filepath='include/linux/pci.h' line='549' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='self' type-id='type-id-3933' visibility='default' filepath='include/linux/pci.h' line='550' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='slots' type-id='type-id-20' visibility='default' filepath='include/linux/pci.h' line='551' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='resource' type-id='type-id-3921' visibility='default' filepath='include/linux/pci.h' line='553' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='resources' type-id='type-id-20' visibility='default' filepath='include/linux/pci.h' line='554' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='busn_res' type-id='type-id-2144' visibility='default' filepath='include/linux/pci.h' line='555' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='ops' type-id='type-id-3934' visibility='default' filepath='include/linux/pci.h' line='557' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='msi' type-id='type-id-3935' visibility='default' filepath='include/linux/pci.h' line='558' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='sysdata' type-id='type-id-15' visibility='default' filepath='include/linux/pci.h' line='559' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='procdir' type-id='type-id-262' visibility='default' filepath='include/linux/pci.h' line='560' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='number' type-id='type-id-216' visibility='default' filepath='include/linux/pci.h' line='562' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1800'>
+          <var-decl name='primary' type-id='type-id-216' visibility='default' filepath='include/linux/pci.h' line='563' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1808'>
+          <var-decl name='max_bus_speed' type-id='type-id-216' visibility='default' filepath='include/linux/pci.h' line='564' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1816'>
+          <var-decl name='cur_bus_speed' type-id='type-id-216' visibility='default' filepath='include/linux/pci.h' line='565' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1824'>
+          <var-decl name='domain_nr' type-id='type-id-17' visibility='default' filepath='include/linux/pci.h' line='567' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='name' type-id='type-id-970' visibility='default' filepath='include/linux/pci.h' line='570' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='bridge_ctl' type-id='type-id-312' visibility='default' filepath='include/linux/pci.h' line='572' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2256'>
+          <var-decl name='bus_flags' type-id='type-id-3936' visibility='default' filepath='include/linux/pci.h' line='573' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='bridge' type-id='type-id-240' visibility='default' filepath='include/linux/pci.h' line='574' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/pci.h' line='575' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8576'>
+          <var-decl name='legacy_io' type-id='type-id-2609' visibility='default' filepath='include/linux/pci.h' line='576' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8640'>
+          <var-decl name='legacy_mem' type-id='type-id-2609' visibility='default' filepath='include/linux/pci.h' line='577' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='is_added' type-id='type-id-5' visibility='default' filepath='include/linux/pci.h' line='578' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pci_ops' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/pci.h' line='669' column='1' id='type-id-3937'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='add_bus' type-id='type-id-3938' visibility='default' filepath='include/linux/pci.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='remove_bus' type-id='type-id-3939' visibility='default' filepath='include/linux/pci.h' line='671' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='map_bus' type-id='type-id-3940' visibility='default' filepath='include/linux/pci.h' line='672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='read' type-id='type-id-3941' visibility='default' filepath='include/linux/pci.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='write' type-id='type-id-3942' visibility='default' filepath='include/linux/pci.h' line='674' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pci_bus_flags_t' type-id='type-id-312' filepath='include/linux/pci.h' line='215' column='1' id='type-id-3936'/>
+      <class-decl name='pci_slot' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/pci.h' line='56' column='1' id='type-id-3943'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bus' type-id='type-id-3925' visibility='default' filepath='include/linux/pci.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/pci.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='hotplug' type-id='type-id-3944' visibility='default' filepath='include/linux/pci.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='number' type-id='type-id-216' visibility='default' filepath='include/linux/pci.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/pci.h' line='61' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pci_driver' size-in-bits='2176' is-struct='yes' visibility='default' filepath='include/linux/pci.h' line='754' column='1' id='type-id-3945'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/linux/pci.h' line='755' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/pci.h' line='756' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='id_table' type-id='type-id-3946' visibility='default' filepath='include/linux/pci.h' line='757' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='probe' type-id='type-id-3947' visibility='default' filepath='include/linux/pci.h' line='758' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='remove' type-id='type-id-3948' visibility='default' filepath='include/linux/pci.h' line='759' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='suspend' type-id='type-id-3949' visibility='default' filepath='include/linux/pci.h' line='760' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='suspend_late' type-id='type-id-3949' visibility='default' filepath='include/linux/pci.h' line='761' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='resume_early' type-id='type-id-3950' visibility='default' filepath='include/linux/pci.h' line='762' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='resume' type-id='type-id-3950' visibility='default' filepath='include/linux/pci.h' line='763' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='shutdown' type-id='type-id-3948' visibility='default' filepath='include/linux/pci.h' line='764' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='sriov_configure' type-id='type-id-3951' visibility='default' filepath='include/linux/pci.h' line='765' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='err_handler' type-id='type-id-3952' visibility='default' filepath='include/linux/pci.h' line='766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='groups' type-id='type-id-665' visibility='default' filepath='include/linux/pci.h' line='767' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='driver' type-id='type-id-2047' visibility='default' filepath='include/linux/pci.h' line='768' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='dynids' type-id='type-id-3953' visibility='default' filepath='include/linux/pci.h' line='769' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pci_device_id' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/mod_devicetable.h' line='19' column='1' id='type-id-3954'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='vendor' type-id='type-id-511' visibility='default' filepath='include/linux/mod_devicetable.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='device' type-id='type-id-511' visibility='default' filepath='include/linux/mod_devicetable.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='subvendor' type-id='type-id-511' visibility='default' filepath='include/linux/mod_devicetable.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='subdevice' type-id='type-id-511' visibility='default' filepath='include/linux/mod_devicetable.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='class' type-id='type-id-511' visibility='default' filepath='include/linux/mod_devicetable.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='class_mask' type-id='type-id-511' visibility='default' filepath='include/linux/mod_devicetable.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='driver_data' type-id='type-id-3539' visibility='default' filepath='include/linux/mod_devicetable.h' line='23' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pci_error_handlers' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/pci.h' line='733' column='1' id='type-id-3955'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='error_detected' type-id='type-id-3956' visibility='default' filepath='include/linux/pci.h' line='735' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mmio_enabled' type-id='type-id-3957' visibility='default' filepath='include/linux/pci.h' line='739' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='slot_reset' type-id='type-id-3957' visibility='default' filepath='include/linux/pci.h' line='742' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='reset_prepare' type-id='type-id-3948' visibility='default' filepath='include/linux/pci.h' line='745' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='reset_done' type-id='type-id-3948' visibility='default' filepath='include/linux/pci.h' line='746' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='resume' type-id='type-id-3948' visibility='default' filepath='include/linux/pci.h' line='749' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pci_ers_result_t' type-id='type-id-5' filepath='include/linux/pci.h' line='710' column='1' id='type-id-3958'/>
+      <enum-decl name='pci_channel_state' filepath='include/linux/pci.h' line='160' column='1' id='type-id-3959'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='pci_channel_io_normal' value='1'/>
+        <enumerator name='pci_channel_io_frozen' value='2'/>
+        <enumerator name='pci_channel_io_perm_failure' value='3'/>
+      </enum-decl>
+      <class-decl name='pci_dynids' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/pci.h' line='697' column='1' id='type-id-3953'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/pci.h' line='698' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/pci.h' line='699' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='pci_power_t' type-id='type-id-17' filepath='include/linux/pci.h' line='130' column='1' id='type-id-3928'/>
+      <typedef-decl name='pci_channel_state_t' type-id='type-id-5' filepath='include/linux/pci.h' line='158' column='1' id='type-id-3929'/>
+      <typedef-decl name='pci_dev_flags_t' type-id='type-id-312' filepath='include/linux/pci.h' line='184' column='1' id='type-id-3930'/>
+      <qualified-type-def type-id='type-id-3954' const='yes' id='type-id-3960'/>
+      <pointer-type-def type-id='type-id-3960' size-in-bits='64' id='type-id-3946'/>
+      <qualified-type-def type-id='type-id-3955' const='yes' id='type-id-3961'/>
+      <pointer-type-def type-id='type-id-3961' size-in-bits='64' id='type-id-3952'/>
+      <pointer-type-def type-id='type-id-3918' size-in-bits='64' id='type-id-3944'/>
+      <pointer-type-def type-id='type-id-3962' size-in-bits='64' id='type-id-3938'/>
+      <pointer-type-def type-id='type-id-3963' size-in-bits='64' id='type-id-3942'/>
+      <pointer-type-def type-id='type-id-3964' size-in-bits='64' id='type-id-3941'/>
+      <pointer-type-def type-id='type-id-3965' size-in-bits='64' id='type-id-3950'/>
+      <pointer-type-def type-id='type-id-3966' size-in-bits='64' id='type-id-3947'/>
+      <pointer-type-def type-id='type-id-3967' size-in-bits='64' id='type-id-3951'/>
+      <pointer-type-def type-id='type-id-3968' size-in-bits='64' id='type-id-3949'/>
+      <pointer-type-def type-id='type-id-3919' size-in-bits='64' id='type-id-3935'/>
+      <pointer-type-def type-id='type-id-3932' size-in-bits='64' id='type-id-3925'/>
+      <pointer-type-def type-id='type-id-3924' size-in-bits='64' id='type-id-3933'/>
+      <pointer-type-def type-id='type-id-3945' size-in-bits='64' id='type-id-3927'/>
+      <pointer-type-def type-id='type-id-3937' size-in-bits='64' id='type-id-3934'/>
+      <pointer-type-def type-id='type-id-3943' size-in-bits='64' id='type-id-3926'/>
+      <pointer-type-def type-id='type-id-3920' size-in-bits='64' id='type-id-3931'/>
+      <pointer-type-def type-id='type-id-3969' size-in-bits='64' id='type-id-3957'/>
+      <pointer-type-def type-id='type-id-3970' size-in-bits='64' id='type-id-3956'/>
+      <pointer-type-def type-id='type-id-3971' size-in-bits='64' id='type-id-3939'/>
+      <pointer-type-def type-id='type-id-3972' size-in-bits='64' id='type-id-3948'/>
+      <pointer-type-def type-id='type-id-3973' size-in-bits='64' id='type-id-3940'/>
+      <function-decl name='pci_iomap_range' mangled-name='pci_iomap_range' filepath='lib/pci_iomap.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_iomap_range'>
+        <parameter type-id='type-id-3933' name='dev' filepath='lib/pci_iomap.c' line='28' column='1'/>
+        <parameter type-id='type-id-17' name='bar' filepath='lib/pci_iomap.c' line='29' column='1'/>
+        <parameter type-id='type-id-16' name='offset' filepath='lib/pci_iomap.c' line='30' column='1'/>
+        <parameter type-id='type-id-16' name='maxlen' filepath='lib/pci_iomap.c' line='31' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3962'>
+        <parameter type-id='type-id-3925'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3963'>
+        <parameter type-id='type-id-3925'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3964'>
+        <parameter type-id='type-id-3925'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-1565'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3965'>
+        <parameter type-id='type-id-3933'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3966'>
+        <parameter type-id='type-id-3933'/>
+        <parameter type-id='type-id-3946'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3967'>
+        <parameter type-id='type-id-3933'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3968'>
+        <parameter type-id='type-id-3933'/>
+        <parameter type-id='type-id-2053'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3969'>
+        <parameter type-id='type-id-3933'/>
+        <return type-id='type-id-3958'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3970'>
+        <parameter type-id='type-id-3933'/>
+        <parameter type-id='type-id-3959'/>
+        <return type-id='type-id-3958'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3971'>
+        <parameter type-id='type-id-3925'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3972'>
+        <parameter type-id='type-id-3933'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3973'>
+        <parameter type-id='type-id-3925'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/devres.c' language='LANG_C89'>
+      <function-decl name='devm_ioremap' mangled-name='devm_ioremap' filepath='lib/devres.c' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_ioremap'>
+        <parameter type-id='type-id-240' name='dev' filepath='lib/devres.c' line='64' column='1'/>
+        <parameter type-id='type-id-2154' name='offset' filepath='lib/devres.c' line='64' column='1'/>
+        <parameter type-id='type-id-2154' name='size' filepath='lib/devres.c' line='65' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='devm_ioremap_resource' mangled-name='devm_ioremap_resource' filepath='lib/devres.c' line='134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_ioremap_resource'>
+        <parameter type-id='type-id-240' name='dev' filepath='lib/devres.c' line='134' column='1'/>
+        <parameter type-id='type-id-2155' name='res' filepath='lib/devres.c' line='134' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/pci/pci.c' language='LANG_C89'>
+      <class-decl name='hotplug_slot_ops' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/pci_hotplug.h' line='48' column='1' id='type-id-3974'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/pci_hotplug.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mod_name' type-id='type-id-4' visibility='default' filepath='include/linux/pci_hotplug.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='enable_slot' type-id='type-id-3975' visibility='default' filepath='include/linux/pci_hotplug.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='disable_slot' type-id='type-id-3975' visibility='default' filepath='include/linux/pci_hotplug.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='set_attention_status' type-id='type-id-3976' visibility='default' filepath='include/linux/pci_hotplug.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='hardware_test' type-id='type-id-3977' visibility='default' filepath='include/linux/pci_hotplug.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='get_power_status' type-id='type-id-3978' visibility='default' filepath='include/linux/pci_hotplug.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_attention_status' type-id='type-id-3978' visibility='default' filepath='include/linux/pci_hotplug.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='get_latch_status' type-id='type-id-3978' visibility='default' filepath='include/linux/pci_hotplug.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='get_adapter_status' type-id='type-id-3978' visibility='default' filepath='include/linux/pci_hotplug.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='reset_slot' type-id='type-id-3979' visibility='default' filepath='include/linux/pci_hotplug.h' line='59' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hotplug_slot_info' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/pci_hotplug.h' line='71' column='1' id='type-id-3980'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='power_status' type-id='type-id-214' visibility='default' filepath='include/linux/pci_hotplug.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='attention_status' type-id='type-id-214' visibility='default' filepath='include/linux/pci_hotplug.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='latch_status' type-id='type-id-214' visibility='default' filepath='include/linux/pci_hotplug.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='adapter_status' type-id='type-id-214' visibility='default' filepath='include/linux/pci_hotplug.h' line='75' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-3980' size-in-bits='64' id='type-id-3981'/>
+      <pointer-type-def type-id='type-id-3974' size-in-bits='64' id='type-id-3982'/>
+      <pointer-type-def type-id='type-id-3983' size-in-bits='64' id='type-id-3975'/>
+      <pointer-type-def type-id='type-id-3984' size-in-bits='64' id='type-id-3979'/>
+      <pointer-type-def type-id='type-id-3985' size-in-bits='64' id='type-id-3977'/>
+      <pointer-type-def type-id='type-id-3986' size-in-bits='64' id='type-id-3976'/>
+      <pointer-type-def type-id='type-id-3987' size-in-bits='64' id='type-id-3978'/>
+      <function-decl name='pci_disable_device' mangled-name='pci_disable_device' filepath='drivers/pci/pci.c' line='1852' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_disable_device'>
+        <parameter type-id='type-id-3933' name='dev' filepath='drivers/pci/pci.c' line='1852' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='pci_find_next_capability' mangled-name='pci_find_next_capability' filepath='drivers/pci/pci.c' line='393' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_find_next_capability'>
+        <parameter type-id='type-id-3933' name='dev' filepath='drivers/pci/pci.c' line='393' column='1'/>
+        <parameter type-id='type-id-214' name='pos' filepath='drivers/pci/pci.c' line='393' column='1'/>
+        <parameter type-id='type-id-17' name='cap' filepath='drivers/pci/pci.c' line='393' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pci_find_capability' mangled-name='pci_find_capability' filepath='drivers/pci/pci.c' line='439' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_find_capability'>
+        <parameter type-id='type-id-3933' name='dev' filepath='drivers/pci/pci.c' line='439' column='1'/>
+        <parameter type-id='type-id-17' name='cap' filepath='drivers/pci/pci.c' line='439' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pci_find_ext_capability' mangled-name='pci_find_ext_capability' filepath='drivers/pci/pci.c' line='545' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_find_ext_capability'>
+        <parameter type-id='type-id-3933' name='dev' filepath='drivers/pci/pci.c' line='545' column='1'/>
+        <parameter type-id='type-id-17' name='cap' filepath='drivers/pci/pci.c' line='545' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pci_enable_device' mangled-name='pci_enable_device' filepath='drivers/pci/pci.c' line='1660' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_enable_device'>
+        <parameter type-id='type-id-3933' name='dev' filepath='drivers/pci/pci.c' line='1660' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pci_release_selected_regions' mangled-name='pci_release_selected_regions' filepath='drivers/pci/pci.c' line='3679' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_release_selected_regions'>
+        <parameter type-id='type-id-3933' name='pdev' filepath='drivers/pci/pci.c' line='3679' column='1'/>
+        <parameter type-id='type-id-17' name='bars' filepath='drivers/pci/pci.c' line='3679' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='pci_request_selected_regions' mangled-name='pci_request_selected_regions' filepath='drivers/pci/pci.c' line='3715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_selected_regions'>
+        <parameter type-id='type-id-3933' name='pdev' filepath='drivers/pci/pci.c' line='3715' column='1'/>
+        <parameter type-id='type-id-17' name='bars' filepath='drivers/pci/pci.c' line='3715' column='1'/>
+        <parameter type-id='type-id-4' name='res_name' filepath='drivers/pci/pci.c' line='3716' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pci_set_master' mangled-name='pci_set_master' filepath='drivers/pci/pci.c' line='4077' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_set_master'>
+        <parameter type-id='type-id-3933' name='dev' filepath='drivers/pci/pci.c' line='4077' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-3983'>
+        <parameter type-id='type-id-3944'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3984'>
+        <parameter type-id='type-id-3944'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3985'>
+        <parameter type-id='type-id-3944'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3986'>
+        <parameter type-id='type-id-3944'/>
+        <parameter type-id='type-id-214'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-3987'>
+        <parameter type-id='type-id-3944'/>
+        <parameter type-id='type-id-3121'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/hweight.c' language='LANG_C89'>
+      <function-decl name='__sw_hweight64' mangled-name='__sw_hweight64' filepath='lib/hweight.c' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__sw_hweight64'>
+        <parameter type-id='type-id-100' name='w' filepath='lib/hweight.c' line='50' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/nlattr.c' language='LANG_C89'>
+      <union-decl name='__anonymous_union__' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='666' column='1' id='type-id-3988'>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-3989' visibility='default' filepath='include/linux/skbuff.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rbnode' type-id='type-id-422' visibility='default' filepath='include/linux/skbuff.h' line='681' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/skbuff.h' line='682' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='667' column='1' id='type-id-3989'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-1766' visibility='default' filepath='include/linux/skbuff.h' line='669' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prev' type-id='type-id-1766' visibility='default' filepath='include/linux/skbuff.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='' type-id='type-id-3990' visibility='default' filepath='include/linux/skbuff.h' line='672' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='672' column='1' id='type-id-3990'>
+        <data-member access='private'>
+          <var-decl name='dev' type-id='type-id-3405' visibility='default' filepath='include/linux/skbuff.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='dev_scratch' type-id='type-id-16' visibility='default' filepath='include/linux/skbuff.h' line='678' column='1'/>
+        </data-member>
+      </union-decl>
+      <function-decl name='nla_parse' mangled-name='nla_parse' filepath='lib/nlattr.c' line='240' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nla_parse'>
+        <parameter type-id='type-id-3034' name='tb' filepath='lib/nlattr.c' line='240' column='1'/>
+        <parameter type-id='type-id-17' name='maxtype' filepath='lib/nlattr.c' line='240' column='1'/>
+        <parameter type-id='type-id-1806' name='head' filepath='lib/nlattr.c' line='240' column='1'/>
+        <parameter type-id='type-id-17' name='len' filepath='lib/nlattr.c' line='241' column='1'/>
+        <parameter type-id='type-id-2187' name='policy' filepath='lib/nlattr.c' line='241' column='1'/>
+        <parameter type-id='type-id-1824' name='extack' filepath='lib/nlattr.c' line='242' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='nla_memcpy' mangled-name='nla_memcpy' filepath='lib/nlattr.c' line='363' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nla_memcpy'>
+        <parameter type-id='type-id-15' name='dest' filepath='lib/nlattr.c' line='363' column='1'/>
+        <parameter type-id='type-id-1806' name='src' filepath='lib/nlattr.c' line='363' column='1'/>
+        <parameter type-id='type-id-17' name='count' filepath='lib/nlattr.c' line='363' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='nla_put' mangled-name='nla_put' filepath='lib/nlattr.c' line='622' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nla_put'>
+        <parameter type-id='type-id-1766' name='skb' filepath='lib/nlattr.c' line='622' column='1'/>
+        <parameter type-id='type-id-17' name='attrtype' filepath='lib/nlattr.c' line='622' column='1'/>
+        <parameter type-id='type-id-17' name='attrlen' filepath='lib/nlattr.c' line='622' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='lib/nlattr.c' line='622' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/pci/msi.c' language='LANG_C89'>
+      <qualified-type-def type-id='type-id-3842' const='yes' id='type-id-3991'/>
+      <pointer-type-def type-id='type-id-3991' size-in-bits='64' id='type-id-3992'/>
+      <function-decl name='pci_alloc_irq_vectors_affinity' mangled-name='pci_alloc_irq_vectors_affinity' filepath='drivers/pci/msi.c' line='1153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_alloc_irq_vectors_affinity'>
+        <parameter type-id='type-id-3933' name='dev' filepath='drivers/pci/msi.c' line='1153' column='1'/>
+        <parameter type-id='type-id-5' name='min_vecs' filepath='drivers/pci/msi.c' line='1153' column='1'/>
+        <parameter type-id='type-id-5' name='max_vecs' filepath='drivers/pci/msi.c' line='1154' column='1'/>
+        <parameter type-id='type-id-5' name='flags' filepath='drivers/pci/msi.c' line='1154' column='1'/>
+        <parameter type-id='type-id-3992' name='affd' filepath='drivers/pci/msi.c' line='1155' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pci_free_irq_vectors' mangled-name='pci_free_irq_vectors' filepath='drivers/pci/msi.c' line='1203' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_free_irq_vectors'>
+        <parameter type-id='type-id-3933' name='dev' filepath='drivers/pci/msi.c' line='1203' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='pci_irq_vector' mangled-name='pci_irq_vector' filepath='drivers/pci/msi.c' line='1215' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_irq_vector'>
+        <parameter type-id='type-id-3933' name='dev' filepath='drivers/pci/msi.c' line='1215' column='1'/>
+        <parameter type-id='type-id-5' name='nr' filepath='drivers/pci/msi.c' line='1215' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pci_irq_get_affinity' mangled-name='pci_irq_get_affinity' filepath='drivers/pci/msi.c' line='1249' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_irq_get_affinity'>
+        <parameter type-id='type-id-3933' name='dev' filepath='drivers/pci/msi.c' line='1249' column='1'/>
+        <parameter type-id='type-id-17' name='nr' filepath='drivers/pci/msi.c' line='1249' column='1'/>
+        <return type-id='type-id-3386'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/property.c' language='LANG_C89'>
+      <function-decl name='dev_fwnode' mangled-name='dev_fwnode' filepath='drivers/base/property.c' line='251' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_fwnode'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/property.c' line='251' column='1'/>
+        <return type-id='type-id-2023'/>
+      </function-decl>
+      <function-decl name='device_property_present' mangled-name='device_property_present' filepath='drivers/base/property.c' line='310' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_property_present'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/property.c' line='310' column='1'/>
+        <parameter type-id='type-id-4' name='propname' filepath='drivers/base/property.c' line='310' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='device_property_read_u32_array' mangled-name='device_property_read_u32_array' filepath='drivers/base/property.c' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_property_read_u32_array'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/property.c' line='403' column='1'/>
+        <parameter type-id='type-id-4' name='propname' filepath='drivers/base/property.c' line='403' column='1'/>
+        <parameter type-id='type-id-1565' name='val' filepath='drivers/base/property.c' line='404' column='1'/>
+        <parameter type-id='type-id-84' name='nval' filepath='drivers/base/property.c' line='404' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/of/base.c' language='LANG_C89'>
+      <qualified-type-def type-id='type-id-3540' const='yes' id='type-id-3993'/>
+      <pointer-type-def type-id='type-id-3993' size-in-bits='64' id='type-id-3994'/>
+      <function-decl name='of_find_property' mangled-name='of_find_property' filepath='drivers/of/base.c' line='264' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_find_property'>
+        <parameter type-id='type-id-3994' name='np' filepath='drivers/of/base.c' line='264' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/of/base.c' line='265' column='1'/>
+        <parameter type-id='type-id-666' name='lenp' filepath='drivers/of/base.c' line='266' column='1'/>
+        <return type-id='type-id-3542'/>
+      </function-decl>
+      <function-decl name='of_get_property' mangled-name='of_get_property' filepath='drivers/of/base.c' line='334' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_get_property'>
+        <parameter type-id='type-id-3994' name='np' filepath='drivers/of/base.c' line='334' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/of/base.c' line='334' column='1'/>
+        <parameter type-id='type-id-666' name='lenp' filepath='drivers/of/base.c' line='335' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='of_device_is_compatible' mangled-name='of_device_is_compatible' filepath='drivers/of/base.c' line='541' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_device_is_compatible'>
+        <parameter type-id='type-id-3994' name='device' filepath='drivers/of/base.c' line='541' column='1'/>
+        <parameter type-id='type-id-4' name='compat' filepath='drivers/of/base.c' line='542' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='of_device_is_big_endian' mangled-name='of_device_is_big_endian' filepath='drivers/of/base.c' line='658' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_device_is_big_endian'>
+        <parameter type-id='type-id-3994' name='device' filepath='drivers/of/base.c' line='658' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='of_get_next_child' mangled-name='of_get_next_child' filepath='drivers/of/base.c' line='746' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_get_next_child'>
+        <parameter type-id='type-id-3994' name='node' filepath='drivers/of/base.c' line='746' column='1'/>
+        <parameter type-id='type-id-3543' name='prev' filepath='drivers/of/base.c' line='747' column='1'/>
+        <return type-id='type-id-3543'/>
+      </function-decl>
+      <function-decl name='of_get_child_by_name' mangled-name='of_get_child_by_name' filepath='drivers/of/base.c' line='826' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_get_child_by_name'>
+        <parameter type-id='type-id-3994' name='node' filepath='drivers/of/base.c' line='826' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/of/base.c' line='827' column='1'/>
+        <return type-id='type-id-3543'/>
+      </function-decl>
+      <function-decl name='of_parse_phandle' mangled-name='of_parse_phandle' filepath='drivers/of/base.c' line='1408' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_parse_phandle'>
+        <parameter type-id='type-id-3994' name='np' filepath='drivers/of/base.c' line='1408' column='1'/>
+        <parameter type-id='type-id-4' name='phandle_name' filepath='drivers/of/base.c' line='1409' column='1'/>
+        <parameter type-id='type-id-17' name='index' filepath='drivers/of/base.c' line='1409' column='1'/>
+        <return type-id='type-id-3543'/>
+      </function-decl>
+      <function-decl name='of_alias_get_id' mangled-name='of_alias_get_id' filepath='drivers/of/base.c' line='1977' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_alias_get_id'>
+        <parameter type-id='type-id-3543' name='np' filepath='drivers/of/base.c' line='1977' column='1'/>
+        <parameter type-id='type-id-4' name='stem' filepath='drivers/of/base.c' line='1977' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/regulator/core.c' language='LANG_C89'>
+      <class-decl name='regmap' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-3995'/>
+      <array-type-def dimensions='1' type-id='type-id-3996' size-in-bits='256' id='type-id-3997'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3998' size-in-bits='320' id='type-id-3999'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <class-decl name='regulator' size-in-bits='1024' is-struct='yes' visibility='default' filepath='drivers/regulator/internal.h' line='39' column='1' id='type-id-4000'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='drivers/regulator/internal.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='drivers/regulator/internal.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='always_on' type-id='type-id-5' visibility='default' filepath='drivers/regulator/internal.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='bypass' type-id='type-id-5' visibility='default' filepath='drivers/regulator/internal.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='uA_load' type-id='type-id-17' visibility='default' filepath='drivers/regulator/internal.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='voltage' type-id='type-id-3999' visibility='default' filepath='drivers/regulator/internal.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='supply_name' type-id='type-id-4' visibility='default' filepath='drivers/regulator/internal.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='dev_attr' type-id='type-id-3288' visibility='default' filepath='drivers/regulator/internal.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='rdev' type-id='type-id-3996' visibility='default' filepath='drivers/regulator/internal.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='debugfs' type-id='type-id-23' visibility='default' filepath='drivers/regulator/internal.h' line='49' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='regulator_voltage' size-in-bits='64' is-struct='yes' visibility='default' filepath='drivers/regulator/internal.h' line='23' column='1' id='type-id-3998'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='min_uV' type-id='type-id-17' visibility='default' filepath='drivers/regulator/internal.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='max_uV' type-id='type-id-17' visibility='default' filepath='drivers/regulator/internal.h' line='25' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='device_attribute' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/device.h' line='580' column='1' id='type-id-3288'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='attr' type-id='type-id-619' visibility='default' filepath='include/linux/device.h' line='581' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='show' type-id='type-id-4001' visibility='default' filepath='include/linux/device.h' line='582' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='store' type-id='type-id-4002' visibility='default' filepath='include/linux/device.h' line='584' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='regulator_dev' size-in-bits='9152' is-struct='yes' visibility='default' filepath='include/linux/regulator/driver.h' line='438' column='1' id='type-id-4003'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='desc' type-id='type-id-4004' visibility='default' filepath='include/linux/regulator/driver.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='exclusive' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='440' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='use_count' type-id='type-id-7' visibility='default' filepath='include/linux/regulator/driver.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='open_count' type-id='type-id-7' visibility='default' filepath='include/linux/regulator/driver.h' line='442' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='bypass_count' type-id='type-id-7' visibility='default' filepath='include/linux/regulator/driver.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/regulator/driver.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='consumer_list' type-id='type-id-20' visibility='default' filepath='include/linux/regulator/driver.h' line='449' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='coupling_desc' type-id='type-id-4005' visibility='default' filepath='include/linux/regulator/driver.h' line='451' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='notifier' type-id='type-id-3278' visibility='default' filepath='include/linux/regulator/driver.h' line='453' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/regulator/driver.h' line='454' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='mutex_owner' type-id='type-id-431' visibility='default' filepath='include/linux/regulator/driver.h' line='455' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='ref_cnt' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='456' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/regulator/driver.h' line='457' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/regulator/driver.h' line='458' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7808'>
+          <var-decl name='constraints' type-id='type-id-4006' visibility='default' filepath='include/linux/regulator/driver.h' line='459' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7872'>
+          <var-decl name='supply' type-id='type-id-4007' visibility='default' filepath='include/linux/regulator/driver.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7936'>
+          <var-decl name='supply_name' type-id='type-id-4' visibility='default' filepath='include/linux/regulator/driver.h' line='461' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8000'>
+          <var-decl name='regmap' type-id='type-id-4008' visibility='default' filepath='include/linux/regulator/driver.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8064'>
+          <var-decl name='disable_work' type-id='type-id-411' visibility='default' filepath='include/linux/regulator/driver.h' line='464' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8768'>
+          <var-decl name='deferred_disables' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8832'>
+          <var-decl name='reg_data' type-id='type-id-15' visibility='default' filepath='include/linux/regulator/driver.h' line='467' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8896'>
+          <var-decl name='debugfs' type-id='type-id-23' visibility='default' filepath='include/linux/regulator/driver.h' line='469' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8960'>
+          <var-decl name='ena_pin' type-id='type-id-4009' visibility='default' filepath='include/linux/regulator/driver.h' line='471' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='ena_gpio_state' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='is_switch' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='474' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9088'>
+          <var-decl name='last_off_jiffy' type-id='type-id-16' visibility='default' filepath='include/linux/regulator/driver.h' line='477' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='regulator_desc' size-in-bits='1984' is-struct='yes' visibility='default' filepath='include/linux/regulator/driver.h' line='317' column='1' id='type-id-4010'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/regulator/driver.h' line='318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='supply_name' type-id='type-id-4' visibility='default' filepath='include/linux/regulator/driver.h' line='319' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='of_match' type-id='type-id-4' visibility='default' filepath='include/linux/regulator/driver.h' line='320' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='regulators_node' type-id='type-id-4' visibility='default' filepath='include/linux/regulator/driver.h' line='321' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='of_parse_cb' type-id='type-id-4011' visibility='default' filepath='include/linux/regulator/driver.h' line='322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='continuous_voltage_range' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='n_voltages' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ops' type-id='type-id-4012' visibility='default' filepath='include/linux/regulator/driver.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='irq' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='type' type-id='type-id-4013' visibility='default' filepath='include/linux/regulator/driver.h' line='330' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/regulator/driver.h' line='331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='min_uV' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='uV_step' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='linear_min_sel' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='fixed_uV' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='ramp_delay' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='min_dropout_uV' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='linear_ranges' type-id='type-id-4014' visibility='default' filepath='include/linux/regulator/driver.h' line='340' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='n_linear_ranges' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='volt_table' type-id='type-id-4015' visibility='default' filepath='include/linux/regulator/driver.h' line='343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='vsel_reg' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='vsel_mask' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='csel_reg' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='csel_mask' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='apply_reg' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='apply_bit' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='enable_reg' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1248'>
+          <var-decl name='enable_mask' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='enable_val' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='disable_val' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='enable_is_inverted' type-id='type-id-33' visibility='default' filepath='include/linux/regulator/driver.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='bypass_reg' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='bypass_mask' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1440'>
+          <var-decl name='bypass_val_on' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='bypass_val_off' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='active_discharge_on' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='active_discharge_off' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1568'>
+          <var-decl name='active_discharge_mask' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='active_discharge_reg' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1632'>
+          <var-decl name='soft_start_reg' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='soft_start_mask' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1696'>
+          <var-decl name='soft_start_val_on' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='pull_down_reg' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1760'>
+          <var-decl name='pull_down_mask' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='pull_down_val_on' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1824'>
+          <var-decl name='enable_time' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='off_on_delay' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='of_map_mode' type-id='type-id-4016' visibility='default' filepath='include/linux/regulator/driver.h' line='375' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='regulator_config' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/regulator/driver.h' line='400' column='1' id='type-id-4017'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/regulator/driver.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='init_data' type-id='type-id-4018' visibility='default' filepath='include/linux/regulator/driver.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='driver_data' type-id='type-id-15' visibility='default' filepath='include/linux/regulator/driver.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='of_node' type-id='type-id-3543' visibility='default' filepath='include/linux/regulator/driver.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='regmap' type-id='type-id-4008' visibility='default' filepath='include/linux/regulator/driver.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ena_gpio_initialized' type-id='type-id-33' visibility='default' filepath='include/linux/regulator/driver.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='ena_gpio' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='408' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ena_gpiod' type-id='type-id-4019' visibility='default' filepath='include/linux/regulator/driver.h' line='409' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='ena_gpio_invert' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='ena_gpio_flags' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='411' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='regulator_init_data' size-in-bits='1600' is-struct='yes' visibility='default' filepath='include/linux/regulator/machine.h' line='235' column='1' id='type-id-4020'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='supply_regulator' type-id='type-id-4' visibility='default' filepath='include/linux/regulator/machine.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='constraints' type-id='type-id-4021' visibility='default' filepath='include/linux/regulator/machine.h' line='238' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='num_consumer_supplies' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='240' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='consumer_supplies' type-id='type-id-4022' visibility='default' filepath='include/linux/regulator/machine.h' line='241' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='regulator_init' type-id='type-id-3366' visibility='default' filepath='include/linux/regulator/machine.h' line='244' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='driver_data' type-id='type-id-15' visibility='default' filepath='include/linux/regulator/machine.h' line='245' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='regulation_constraints' size-in-bits='1280' is-struct='yes' visibility='default' filepath='include/linux/regulator/machine.h' line='141' column='1' id='type-id-4021'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/regulator/machine.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='min_uV' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='max_uV' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='uV_offset' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='min_uA' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='max_uA' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='ilim_uA' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='system_load' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='max_spread' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='valid_modes_mask' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='valid_ops_mask' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='input_uV' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='state_disk' type-id='type-id-4023' visibility='default' filepath='include/linux/regulator/machine.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='state_mem' type-id='type-id-4023' visibility='default' filepath='include/linux/regulator/machine.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='state_standby' type-id='type-id-4023' visibility='default' filepath='include/linux/regulator/machine.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='initial_state' type-id='type-id-4024' visibility='default' filepath='include/linux/regulator/machine.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='initial_mode' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='ramp_delay' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='settling_time' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='settling_time_up' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='settling_time_down' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='enable_time' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='active_discharge' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='always_on' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='boot_on' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='apply_uV' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='ramp_disable' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='soft_start' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26'>
+          <var-decl name='pull_down' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='25'>
+          <var-decl name='over_current_protection' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='194' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='regulator_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/regulator/machine.h' line='80' column='1' id='type-id-4023'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='uV' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='min_uV' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='max_uV' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='mode' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/machine.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='enabled' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/machine.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='changeable' type-id='type-id-33' visibility='default' filepath='include/linux/regulator/machine.h' line='86' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='suspend_state_t' type-id='type-id-17' filepath='include/linux/suspend.h' line='34' column='1' id='type-id-4024'/>
+      <class-decl name='regulator_consumer_supply' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/regulator/machine.h' line='206' column='1' id='type-id-4025'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev_name' type-id='type-id-4' visibility='default' filepath='include/linux/regulator/machine.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='supply' type-id='type-id-4' visibility='default' filepath='include/linux/regulator/machine.h' line='208' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='regulator_ops' size-in-bits='2112' is-struct='yes' visibility='default' filepath='include/linux/regulator/driver.h' line='148' column='1' id='type-id-4026'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list_voltage' type-id='type-id-4027' visibility='default' filepath='include/linux/regulator/driver.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='set_voltage' type-id='type-id-4028' visibility='default' filepath='include/linux/regulator/driver.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='map_voltage' type-id='type-id-4029' visibility='default' filepath='include/linux/regulator/driver.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='set_voltage_sel' type-id='type-id-4027' visibility='default' filepath='include/linux/regulator/driver.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='get_voltage' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='get_voltage_sel' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='set_current_limit' type-id='type-id-4029' visibility='default' filepath='include/linux/regulator/driver.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_current_limit' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='set_input_current_limit' type-id='type-id-4031' visibility='default' filepath='include/linux/regulator/driver.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='set_over_current_protection' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='set_active_discharge' type-id='type-id-4032' visibility='default' filepath='include/linux/regulator/driver.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='enable' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='disable' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='is_enabled' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='set_mode' type-id='type-id-4027' visibility='default' filepath='include/linux/regulator/driver.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='get_mode' type-id='type-id-4033' visibility='default' filepath='include/linux/regulator/driver.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='get_error_flags' type-id='type-id-4034' visibility='default' filepath='include/linux/regulator/driver.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='enable_time' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='set_ramp_delay' type-id='type-id-4031' visibility='default' filepath='include/linux/regulator/driver.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='set_voltage_time' type-id='type-id-4029' visibility='default' filepath='include/linux/regulator/driver.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='set_voltage_time_sel' type-id='type-id-4035' visibility='default' filepath='include/linux/regulator/driver.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='set_soft_start' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='get_status' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='get_optimum_mode' type-id='type-id-4036' visibility='default' filepath='include/linux/regulator/driver.h' line='201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='set_load' type-id='type-id-4031' visibility='default' filepath='include/linux/regulator/driver.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='set_bypass' type-id='type-id-4032' visibility='default' filepath='include/linux/regulator/driver.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='get_bypass' type-id='type-id-4037' visibility='default' filepath='include/linux/regulator/driver.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='set_suspend_voltage' type-id='type-id-4031' visibility='default' filepath='include/linux/regulator/driver.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='set_suspend_enable' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='set_suspend_disable' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='set_suspend_mode' type-id='type-id-4027' visibility='default' filepath='include/linux/regulator/driver.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='resume' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='223' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='set_pull_down' type-id='type-id-4030' visibility='default' filepath='include/linux/regulator/driver.h' line='225' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='regulator_type' filepath='include/linux/regulator/driver.h' line='231' column='1' id='type-id-4013'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='REGULATOR_VOLTAGE' value='0'/>
+        <enumerator name='REGULATOR_CURRENT' value='1'/>
+      </enum-decl>
+      <class-decl name='regulator_linear_range' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/regulator/driver.h' line='57' column='1' id='type-id-4038'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='min_uV' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='min_sel' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='max_sel' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='uV_step' type-id='type-id-5' visibility='default' filepath='include/linux/regulator/driver.h' line='61' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='coupling_desc' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/regulator/driver.h' line='422' column='1' id='type-id-4005'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='coupled_rdevs' type-id='type-id-3997' visibility='default' filepath='include/linux/regulator/driver.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='n_resolved' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='n_coupled' type-id='type-id-17' visibility='default' filepath='include/linux/regulator/driver.h' line='425' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blocking_notifier_head' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/notifier.h' line='65' column='1' id='type-id-3278'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rwsem' type-id='type-id-246' visibility='default' filepath='include/linux/notifier.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='head' type-id='type-id-3271' visibility='default' filepath='include/linux/notifier.h' line='67' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='regulator_enable_gpio' size-in-bits='320' is-struct='yes' visibility='default' filepath='drivers/regulator/core.c' line='78' column='1' id='type-id-4039'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='drivers/regulator/core.c' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='gpiod' type-id='type-id-4019' visibility='default' filepath='drivers/regulator/core.c' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='enable_count' type-id='type-id-7' visibility='default' filepath='drivers/regulator/core.c' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='request_count' type-id='type-id-7' visibility='default' filepath='drivers/regulator/core.c' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='ena_gpio_invert' type-id='type-id-5' visibility='default' filepath='drivers/regulator/core.c' line='83' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-4010' const='yes' id='type-id-4040'/>
+      <pointer-type-def type-id='type-id-4040' size-in-bits='64' id='type-id-4004'/>
+      <qualified-type-def type-id='type-id-4020' const='yes' id='type-id-4041'/>
+      <pointer-type-def type-id='type-id-4041' size-in-bits='64' id='type-id-4018'/>
+      <qualified-type-def type-id='type-id-4038' const='yes' id='type-id-4042'/>
+      <pointer-type-def type-id='type-id-4042' size-in-bits='64' id='type-id-4014'/>
+      <qualified-type-def type-id='type-id-4026' const='yes' id='type-id-4043'/>
+      <pointer-type-def type-id='type-id-4043' size-in-bits='64' id='type-id-4012'/>
+      <pointer-type-def type-id='type-id-2729' size-in-bits='64' id='type-id-4015'/>
+      <pointer-type-def type-id='type-id-3288' size-in-bits='64' id='type-id-4044'/>
+      <pointer-type-def type-id='type-id-4045' size-in-bits='64' id='type-id-4011'/>
+      <pointer-type-def type-id='type-id-4046' size-in-bits='64' id='type-id-4030'/>
+      <pointer-type-def type-id='type-id-4047' size-in-bits='64' id='type-id-4037'/>
+      <pointer-type-def type-id='type-id-4048' size-in-bits='64' id='type-id-4031'/>
+      <pointer-type-def type-id='type-id-4049' size-in-bits='64' id='type-id-4029'/>
+      <pointer-type-def type-id='type-id-4050' size-in-bits='64' id='type-id-4028'/>
+      <pointer-type-def type-id='type-id-4051' size-in-bits='64' id='type-id-4032'/>
+      <pointer-type-def type-id='type-id-4052' size-in-bits='64' id='type-id-4027'/>
+      <pointer-type-def type-id='type-id-4053' size-in-bits='64' id='type-id-4034'/>
+      <pointer-type-def type-id='type-id-4054' size-in-bits='64' id='type-id-4035'/>
+      <pointer-type-def type-id='type-id-3995' size-in-bits='64' id='type-id-4008'/>
+      <pointer-type-def type-id='type-id-4021' size-in-bits='64' id='type-id-4006'/>
+      <pointer-type-def type-id='type-id-4000' size-in-bits='64' id='type-id-4007'/>
+      <pointer-type-def type-id='type-id-4017' size-in-bits='64' id='type-id-4055'/>
+      <pointer-type-def type-id='type-id-4025' size-in-bits='64' id='type-id-4022'/>
+      <pointer-type-def type-id='type-id-4003' size-in-bits='64' id='type-id-3996'/>
+      <pointer-type-def type-id='type-id-4039' size-in-bits='64' id='type-id-4009'/>
+      <pointer-type-def type-id='type-id-4056' size-in-bits='64' id='type-id-4001'/>
+      <pointer-type-def type-id='type-id-4057' size-in-bits='64' id='type-id-4002'/>
+      <pointer-type-def type-id='type-id-4058' size-in-bits='64' id='type-id-4033'/>
+      <pointer-type-def type-id='type-id-4059' size-in-bits='64' id='type-id-4036'/>
+      <pointer-type-def type-id='type-id-4060' size-in-bits='64' id='type-id-4016'/>
+      <function-decl name='regulator_enable' mangled-name='regulator_enable' filepath='drivers/regulator/core.c' line='2271' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_enable'>
+        <parameter type-id='type-id-4007' name='regulator' filepath='drivers/regulator/core.c' line='2271' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='regulator_disable' mangled-name='regulator_disable' filepath='drivers/regulator/core.c' line='2385' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_disable'>
+        <parameter type-id='type-id-4007' name='regulator' filepath='drivers/regulator/core.c' line='2385' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='regulator_count_voltages' mangled-name='regulator_count_voltages' filepath='drivers/regulator/core.c' line='2611' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_count_voltages'>
+        <parameter type-id='type-id-4007' name='regulator' filepath='drivers/regulator/core.c' line='2611' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='regulator_list_voltage' mangled-name='regulator_list_voltage' filepath='drivers/regulator/core.c' line='2635' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_list_voltage'>
+        <parameter type-id='type-id-4007' name='regulator' filepath='drivers/regulator/core.c' line='2635' column='1'/>
+        <parameter type-id='type-id-5' name='selector' filepath='drivers/regulator/core.c' line='2635' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='regulator_is_supported_voltage' mangled-name='regulator_is_supported_voltage' filepath='drivers/regulator/core.c' line='2736' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_is_supported_voltage'>
+        <parameter type-id='type-id-4007' name='regulator' filepath='drivers/regulator/core.c' line='2736' column='1'/>
+        <parameter type-id='type-id-17' name='min_uV' filepath='drivers/regulator/core.c' line='2737' column='1'/>
+        <parameter type-id='type-id-17' name='max_uV' filepath='drivers/regulator/core.c' line='2737' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='regulator_get_voltage' mangled-name='regulator_get_voltage' filepath='drivers/regulator/core.c' line='3417' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get_voltage'>
+        <parameter type-id='type-id-4007' name='regulator' filepath='drivers/regulator/core.c' line='3417' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='regulator_set_voltage' mangled-name='regulator_set_voltage' filepath='drivers/regulator/core.c' line='3137' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_set_voltage'>
+        <parameter type-id='type-id-4007' name='regulator' filepath='drivers/regulator/core.c' line='3137' column='1'/>
+        <parameter type-id='type-id-17' name='min_uV' filepath='drivers/regulator/core.c' line='3137' column='1'/>
+        <parameter type-id='type-id-17' name='max_uV' filepath='drivers/regulator/core.c' line='3137' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='regulator_get_current_limit' mangled-name='regulator_get_current_limit' filepath='drivers/regulator/core.c' line='3500' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get_current_limit'>
+        <parameter type-id='type-id-4007' name='regulator' filepath='drivers/regulator/core.c' line='3500' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-4045'>
+        <parameter type-id='type-id-3543'/>
+        <parameter type-id='type-id-4004'/>
+        <parameter type-id='type-id-4055'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4046'>
+        <parameter type-id='type-id-3996'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4047'>
+        <parameter type-id='type-id-3996'/>
+        <parameter type-id='type-id-2610'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4048'>
+        <parameter type-id='type-id-3996'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4049'>
+        <parameter type-id='type-id-3996'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4050'>
+        <parameter type-id='type-id-3996'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-482'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4051'>
+        <parameter type-id='type-id-3996'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4052'>
+        <parameter type-id='type-id-3996'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4053'>
+        <parameter type-id='type-id-3996'/>
+        <parameter type-id='type-id-482'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4054'>
+        <parameter type-id='type-id-3996'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4056'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-4044'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4057'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-4044'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4058'>
+        <parameter type-id='type-id-3996'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4059'>
+        <parameter type-id='type-id-3996'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4060'>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpio/devres.c' language='LANG_C89'>
+      <class-decl name='irq_affinity_notify' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4061'/>
+      <class-decl name='irqaction' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4062'/>
+      <class-decl name='msi_desc' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4063'/>
+      <class-decl name='msi_msg' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4064'/>
+      <class-decl name='pinctrl' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4065'/>
+      <class-decl name='pinctrl_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4066'/>
+      <enum-decl name='irqchip_irq_state' id='type-id-4067'>
+        <underlying-type type-id='type-id-4068'/>
+      </enum-decl>
+      <array-type-def dimensions='1' type-id='type-id-4069' size-in-bits='infinite' id='type-id-4070'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-4071' size-in-bits='infinite' id='type-id-4072'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1341' size-in-bits='512' id='type-id-4073'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' id='type-id-4068'/>
+      <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='infinite' id='type-id-4074'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='gpio_desc' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/gpio/gpiolib.h' line='205' column='1' id='type-id-4075'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='gdev' type-id='type-id-4076' visibility='default' filepath='drivers/gpio/gpiolib.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='drivers/gpio/gpiolib.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='label' type-id='type-id-4' visibility='default' filepath='drivers/gpio/gpiolib.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='drivers/gpio/gpiolib.h' line='223' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='gpio_device' size-in-bits='7808' is-struct='yes' visibility='default' filepath='drivers/gpio/gpiolib.h' line='51' column='1' id='type-id-4077'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='drivers/gpio/gpiolib.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='drivers/gpio/gpiolib.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='chrdev' type-id='type-id-266' visibility='default' filepath='drivers/gpio/gpiolib.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7104'>
+          <var-decl name='mockdev' type-id='type-id-240' visibility='default' filepath='drivers/gpio/gpiolib.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7168'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='drivers/gpio/gpiolib.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7232'>
+          <var-decl name='chip' type-id='type-id-4078' visibility='default' filepath='drivers/gpio/gpiolib.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7296'>
+          <var-decl name='descs' type-id='type-id-4019' visibility='default' filepath='drivers/gpio/gpiolib.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7360'>
+          <var-decl name='base' type-id='type-id-17' visibility='default' filepath='drivers/gpio/gpiolib.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7392'>
+          <var-decl name='ngpio' type-id='type-id-688' visibility='default' filepath='drivers/gpio/gpiolib.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7424'>
+          <var-decl name='label' type-id='type-id-4' visibility='default' filepath='drivers/gpio/gpiolib.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='drivers/gpio/gpiolib.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7552'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='drivers/gpio/gpiolib.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7680'>
+          <var-decl name='pin_ranges' type-id='type-id-20' visibility='default' filepath='drivers/gpio/gpiolib.h' line='72' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='irq_domain' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/linux/irqdomain.h' line='157' column='1' id='type-id-4079'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='link' type-id='type-id-20' visibility='default' filepath='include/linux/irqdomain.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/irqdomain.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ops' type-id='type-id-4080' visibility='default' filepath='include/linux/irqdomain.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='host_data' type-id='type-id-15' visibility='default' filepath='include/linux/irqdomain.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/irqdomain.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='mapcount' type-id='type-id-5' visibility='default' filepath='include/linux/irqdomain.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='fwnode' type-id='type-id-2023' visibility='default' filepath='include/linux/irqdomain.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='bus_token' type-id='type-id-4081' visibility='default' filepath='include/linux/irqdomain.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='gc' type-id='type-id-4082' visibility='default' filepath='include/linux/irqdomain.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='parent' type-id='type-id-4083' visibility='default' filepath='include/linux/irqdomain.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='hwirq_max' type-id='type-id-4084' visibility='default' filepath='include/linux/irqdomain.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='revmap_direct_max_irq' type-id='type-id-5' visibility='default' filepath='include/linux/irqdomain.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='revmap_size' type-id='type-id-5' visibility='default' filepath='include/linux/irqdomain.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='revmap_tree' type-id='type-id-415' visibility='default' filepath='include/linux/irqdomain.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='revmap_tree_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/irqdomain.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='linear_revmap' type-id='type-id-4074' visibility='default' filepath='include/linux/irqdomain.h' line='182' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='irq_domain_ops' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/irqdomain.h' line='100' column='1' id='type-id-4085'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='match' type-id='type-id-4086' visibility='default' filepath='include/linux/irqdomain.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='select' type-id='type-id-4087' visibility='default' filepath='include/linux/irqdomain.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='map' type-id='type-id-4088' visibility='default' filepath='include/linux/irqdomain.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='unmap' type-id='type-id-4089' visibility='default' filepath='include/linux/irqdomain.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='xlate' type-id='type-id-4090' visibility='default' filepath='include/linux/irqdomain.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='alloc' type-id='type-id-4091' visibility='default' filepath='include/linux/irqdomain.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='free' type-id='type-id-4092' visibility='default' filepath='include/linux/irqdomain.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='activate' type-id='type-id-4093' visibility='default' filepath='include/linux/irqdomain.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='deactivate' type-id='type-id-4094' visibility='default' filepath='include/linux/irqdomain.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='translate' type-id='type-id-4095' visibility='default' filepath='include/linux/irqdomain.h' line='118' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='irq_domain_bus_token' filepath='include/linux/irqdomain.h' line='75' column='1' id='type-id-4081'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DOMAIN_BUS_ANY' value='0'/>
+        <enumerator name='DOMAIN_BUS_WIRED' value='1'/>
+        <enumerator name='DOMAIN_BUS_PCI_MSI' value='2'/>
+        <enumerator name='DOMAIN_BUS_PLATFORM_MSI' value='3'/>
+        <enumerator name='DOMAIN_BUS_NEXUS' value='4'/>
+        <enumerator name='DOMAIN_BUS_IPI' value='5'/>
+        <enumerator name='DOMAIN_BUS_FSL_MC_MSI' value='6'/>
+      </enum-decl>
+      <class-decl name='irq_fwspec' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/irqdomain.h' line='62' column='1' id='type-id-4096'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fwnode' type-id='type-id-2023' visibility='default' filepath='include/linux/irqdomain.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='param_count' type-id='type-id-17' visibility='default' filepath='include/linux/irqdomain.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='param' type-id='type-id-3923' visibility='default' filepath='include/linux/irqdomain.h' line='65' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='irq_hw_number_t' type-id='type-id-16' filepath='include/linux/types.h' line='174' column='1' id='type-id-4084'/>
+      <class-decl name='irq_data' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='172' column='1' id='type-id-4097'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mask' type-id='type-id-7' visibility='default' filepath='include/linux/irq.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='irq' type-id='type-id-5' visibility='default' filepath='include/linux/irq.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='hwirq' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='common' type-id='type-id-4098' visibility='default' filepath='include/linux/irq.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='chip' type-id='type-id-4099' visibility='default' filepath='include/linux/irq.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='domain' type-id='type-id-4083' visibility='default' filepath='include/linux/irq.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='parent_data' type-id='type-id-4100' visibility='default' filepath='include/linux/irq.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='chip_data' type-id='type-id-15' visibility='default' filepath='include/linux/irq.h' line='182' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='irq_common_data' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='142' column='1' id='type-id-4101'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='state_use_accessors' type-id='type-id-5' visibility='default' filepath='include/linux/irq.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='handler_data' type-id='type-id-15' visibility='default' filepath='include/linux/irq.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='msi_desc' type-id='type-id-4102' visibility='default' filepath='include/linux/irq.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='affinity' type-id='type-id-38' visibility='default' filepath='include/linux/irq.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='effective_affinity' type-id='type-id-38' visibility='default' filepath='include/linux/irq.h' line='151' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='irq_chip' size-in-bits='2176' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='446' column='1' id='type-id-4103'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='parent_device' type-id='type-id-240' visibility='default' filepath='include/linux/irq.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/irq.h' line='448' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='irq_startup' type-id='type-id-4104' visibility='default' filepath='include/linux/irq.h' line='449' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='irq_shutdown' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='450' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='irq_enable' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='451' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='irq_disable' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='452' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='irq_ack' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='454' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='irq_mask' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='455' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='irq_mask_ack' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='456' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='irq_unmask' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='457' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='irq_eoi' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='458' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='irq_set_affinity' type-id='type-id-4106' visibility='default' filepath='include/linux/irq.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='irq_retrigger' type-id='type-id-4107' visibility='default' filepath='include/linux/irq.h' line='461' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='irq_set_type' type-id='type-id-4108' visibility='default' filepath='include/linux/irq.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='irq_set_wake' type-id='type-id-4108' visibility='default' filepath='include/linux/irq.h' line='463' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='irq_bus_lock' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='irq_bus_sync_unlock' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='466' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='irq_cpu_online' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='468' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='irq_cpu_offline' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='469' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='irq_suspend' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='471' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='irq_resume' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='irq_pm_shutdown' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='473' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='irq_calc_mask' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='475' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='irq_print_chip' type-id='type-id-4109' visibility='default' filepath='include/linux/irq.h' line='477' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='irq_request_resources' type-id='type-id-4107' visibility='default' filepath='include/linux/irq.h' line='478' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='irq_release_resources' type-id='type-id-4105' visibility='default' filepath='include/linux/irq.h' line='479' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='irq_compose_msi_msg' type-id='type-id-4110' visibility='default' filepath='include/linux/irq.h' line='481' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='irq_write_msi_msg' type-id='type-id-4110' visibility='default' filepath='include/linux/irq.h' line='482' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='irq_get_irqchip_state' type-id='type-id-4111' visibility='default' filepath='include/linux/irq.h' line='484' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='irq_set_irqchip_state' type-id='type-id-4112' visibility='default' filepath='include/linux/irq.h' line='485' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='irq_set_vcpu_affinity' type-id='type-id-4113' visibility='default' filepath='include/linux/irq.h' line='487' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='ipi_send_single' type-id='type-id-4114' visibility='default' filepath='include/linux/irq.h' line='489' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='ipi_send_mask' type-id='type-id-4115' visibility='default' filepath='include/linux/irq.h' line='490' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='492' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='irq_domain_chip_generic' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='1024' column='1' id='type-id-4116'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='irqs_per_chip' type-id='type-id-5' visibility='default' filepath='include/linux/irq.h' line='1025' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='num_chips' type-id='type-id-5' visibility='default' filepath='include/linux/irq.h' line='1026' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='irq_flags_to_clear' type-id='type-id-5' visibility='default' filepath='include/linux/irq.h' line='1027' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='irq_flags_to_set' type-id='type-id-5' visibility='default' filepath='include/linux/irq.h' line='1028' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='gc_flags' type-id='type-id-4117' visibility='default' filepath='include/linux/irq.h' line='1029' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='gc' type-id='type-id-4070' visibility='default' filepath='include/linux/irq.h' line='1030' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='irq_gc_flags' filepath='include/linux/irq.h' line='1007' column='1' id='type-id-4117'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='IRQ_GC_INIT_MASK_CACHE' value='1'/>
+        <enumerator name='IRQ_GC_INIT_NESTED_LOCK' value='2'/>
+        <enumerator name='IRQ_GC_MASK_CACHE_PER_TYPE' value='4'/>
+        <enumerator name='IRQ_GC_NO_MASK' value='8'/>
+        <enumerator name='IRQ_GC_BE_IO' value='16'/>
+      </enum-decl>
+      <class-decl name='irq_chip_generic' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='974' column='1' id='type-id-4118'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='include/linux/irq.h' line='975' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='reg_base' type-id='type-id-15' visibility='default' filepath='include/linux/irq.h' line='976' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='reg_readl' type-id='type-id-1269' visibility='default' filepath='include/linux/irq.h' line='977' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='reg_writel' type-id='type-id-4119' visibility='default' filepath='include/linux/irq.h' line='978' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='suspend' type-id='type-id-4120' visibility='default' filepath='include/linux/irq.h' line='979' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='resume' type-id='type-id-4120' visibility='default' filepath='include/linux/irq.h' line='980' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='irq_base' type-id='type-id-5' visibility='default' filepath='include/linux/irq.h' line='981' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='irq_cnt' type-id='type-id-5' visibility='default' filepath='include/linux/irq.h' line='982' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='mask_cache' type-id='type-id-7' visibility='default' filepath='include/linux/irq.h' line='983' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='type_cache' type-id='type-id-7' visibility='default' filepath='include/linux/irq.h' line='984' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='polarity_cache' type-id='type-id-7' visibility='default' filepath='include/linux/irq.h' line='985' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='wake_enabled' type-id='type-id-7' visibility='default' filepath='include/linux/irq.h' line='986' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='wake_active' type-id='type-id-7' visibility='default' filepath='include/linux/irq.h' line='987' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='num_ct' type-id='type-id-5' visibility='default' filepath='include/linux/irq.h' line='988' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/irq.h' line='989' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='installed' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='990' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='unused' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='991' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='domain' type-id='type-id-4083' visibility='default' filepath='include/linux/irq.h' line='992' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/irq.h' line='993' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='chip_types' type-id='type-id-4072' visibility='default' filepath='include/linux/irq.h' line='994' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='irq_chip_type' size-in-bits='2816' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='932' column='1' id='type-id-4071'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chip' type-id='type-id-4103' visibility='default' filepath='include/linux/irq.h' line='933' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='regs' type-id='type-id-4121' visibility='default' filepath='include/linux/irq.h' line='934' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='handler' type-id='type-id-4122' visibility='default' filepath='include/linux/irq.h' line='935' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='type' type-id='type-id-7' visibility='default' filepath='include/linux/irq.h' line='936' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2720'>
+          <var-decl name='mask_cache_priv' type-id='type-id-7' visibility='default' filepath='include/linux/irq.h' line='937' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='mask_cache' type-id='type-id-1565' visibility='default' filepath='include/linux/irq.h' line='938' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='irq_chip_regs' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='909' column='1' id='type-id-4121'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='enable' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='910' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='disable' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='911' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mask' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='912' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ack' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='913' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='eoi' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='914' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='type' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='915' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='polarity' type-id='type-id-16' visibility='default' filepath='include/linux/irq.h' line='916' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='irq_desc' size-in-bits='3584' is-struct='yes' visibility='default' filepath='include/linux/irqdesc.h' line='55' column='1' id='type-id-4123'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='irq_common_data' type-id='type-id-4101' visibility='default' filepath='include/linux/irqdesc.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='irq_data' type-id='type-id-4097' visibility='default' filepath='include/linux/irqdesc.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='kstat_irqs' type-id='type-id-482' visibility='default' filepath='include/linux/irqdesc.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='handle_irq' type-id='type-id-4122' visibility='default' filepath='include/linux/irqdesc.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='action' type-id='type-id-4124' visibility='default' filepath='include/linux/irqdesc.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='status_use_accessors' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='core_internal_state__do_not_mess_with_it' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='depth' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='wake_depth' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='tot_count' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='irq_count' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='last_unhandled' type-id='type-id-16' visibility='default' filepath='include/linux/irqdesc.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='irqs_unhandled' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1248'>
+          <var-decl name='threads_handled' type-id='type-id-26' visibility='default' filepath='include/linux/irqdesc.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='threads_handled_last' type-id='type-id-17' visibility='default' filepath='include/linux/irqdesc.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='lock' type-id='type-id-36' visibility='default' filepath='include/linux/irqdesc.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='percpu_enabled' type-id='type-id-3374' visibility='default' filepath='include/linux/irqdesc.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='percpu_affinity' type-id='type-id-3386' visibility='default' filepath='include/linux/irqdesc.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='affinity_hint' type-id='type-id-3386' visibility='default' filepath='include/linux/irqdesc.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='affinity_notify' type-id='type-id-4125' visibility='default' filepath='include/linux/irqdesc.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='threads_oneshot' type-id='type-id-16' visibility='default' filepath='include/linux/irqdesc.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='threads_active' type-id='type-id-26' visibility='default' filepath='include/linux/irqdesc.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='wait_for_threads' type-id='type-id-225' visibility='default' filepath='include/linux/irqdesc.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='nr_actions' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1952'>
+          <var-decl name='no_suspend_depth' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='cond_suspend_depth' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2016'>
+          <var-decl name='force_resume_depth' type-id='type-id-5' visibility='default' filepath='include/linux/irqdesc.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='dir' type-id='type-id-262' visibility='default' filepath='include/linux/irqdesc.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/irqdesc.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/irqdesc.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='request_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/irqdesc.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='parent_irq' type-id='type-id-17' visibility='default' filepath='include/linux/irqdesc.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/irqdesc.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/irqdesc.h' line='107' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='irq_flow_handler_t' type-id='type-id-4126' filepath='include/linux/irqhandler.h' line='12' column='1' id='type-id-4122'/>
+      <class-decl name='gpio_chip' size-in-bits='2496' is-struct='yes' visibility='default' filepath='include/linux/gpio/driver.h' line='232' column='1' id='type-id-4127'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='label' type-id='type-id-4' visibility='default' filepath='include/linux/gpio/driver.h' line='233' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='gpiodev' type-id='type-id-4076' visibility='default' filepath='include/linux/gpio/driver.h' line='234' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='parent' type-id='type-id-240' visibility='default' filepath='include/linux/gpio/driver.h' line='235' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/gpio/driver.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='request' type-id='type-id-4128' visibility='default' filepath='include/linux/gpio/driver.h' line='238' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='free' type-id='type-id-4129' visibility='default' filepath='include/linux/gpio/driver.h' line='240' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='get_direction' type-id='type-id-4128' visibility='default' filepath='include/linux/gpio/driver.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='direction_input' type-id='type-id-4128' visibility='default' filepath='include/linux/gpio/driver.h' line='244' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='direction_output' type-id='type-id-4130' visibility='default' filepath='include/linux/gpio/driver.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='get' type-id='type-id-4128' visibility='default' filepath='include/linux/gpio/driver.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='get_multiple' type-id='type-id-4131' visibility='default' filepath='include/linux/gpio/driver.h' line='250' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='set' type-id='type-id-4132' visibility='default' filepath='include/linux/gpio/driver.h' line='253' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='set_multiple' type-id='type-id-4133' visibility='default' filepath='include/linux/gpio/driver.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='set_config' type-id='type-id-4134' visibility='default' filepath='include/linux/gpio/driver.h' line='258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='to_irq' type-id='type-id-4128' visibility='default' filepath='include/linux/gpio/driver.h' line='261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='dbg_show' type-id='type-id-4135' visibility='default' filepath='include/linux/gpio/driver.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='base' type-id='type-id-17' visibility='default' filepath='include/linux/gpio/driver.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='ngpio' type-id='type-id-688' visibility='default' filepath='include/linux/gpio/driver.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='names' type-id='type-id-92' visibility='default' filepath='include/linux/gpio/driver.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='can_sleep' type-id='type-id-33' visibility='default' filepath='include/linux/gpio/driver.h' line='269' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='irq' type-id='type-id-4136' visibility='default' filepath='include/linux/gpio/driver.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='need_valid_mask' type-id='type-id-33' visibility='default' filepath='include/linux/gpio/driver.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='valid_mask' type-id='type-id-45' visibility='default' filepath='include/linux/gpio/driver.h' line='314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='of_node' type-id='type-id-3543' visibility='default' filepath='include/linux/gpio/driver.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='of_gpio_n_cells' type-id='type-id-5' visibility='default' filepath='include/linux/gpio/driver.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='of_xlate' type-id='type-id-4137' visibility='default' filepath='include/linux/gpio/driver.h' line='342' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='gpio_irq_chip' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/gpio/driver.h' line='27' column='1' id='type-id-4136'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chip' type-id='type-id-4099' visibility='default' filepath='include/linux/gpio/driver.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='domain' type-id='type-id-4083' visibility='default' filepath='include/linux/gpio/driver.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='domain_ops' type-id='type-id-4080' visibility='default' filepath='include/linux/gpio/driver.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='handler' type-id='type-id-4122' visibility='default' filepath='include/linux/gpio/driver.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='default_type' type-id='type-id-5' visibility='default' filepath='include/linux/gpio/driver.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='lock_key' type-id='type-id-1696' visibility='default' filepath='include/linux/gpio/driver.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='request_key' type-id='type-id-1696' visibility='default' filepath='include/linux/gpio/driver.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='parent_handler' type-id='type-id-4122' visibility='default' filepath='include/linux/gpio/driver.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='parent_handler_data' type-id='type-id-15' visibility='default' filepath='include/linux/gpio/driver.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='num_parents' type-id='type-id-5' visibility='default' filepath='include/linux/gpio/driver.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='parent_irq' type-id='type-id-5' visibility='default' filepath='include/linux/gpio/driver.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='parents' type-id='type-id-482' visibility='default' filepath='include/linux/gpio/driver.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='map' type-id='type-id-482' visibility='default' filepath='include/linux/gpio/driver.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='threaded' type-id='type-id-33' visibility='default' filepath='include/linux/gpio/driver.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='776'>
+          <var-decl name='need_valid_mask' type-id='type-id-33' visibility='default' filepath='include/linux/gpio/driver.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='valid_mask' type-id='type-id-45' visibility='default' filepath='include/linux/gpio/driver.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='first' type-id='type-id-5' visibility='default' filepath='include/linux/gpio/driver.h' line='147' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='of_phandle_args' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/of.h' line='76' column='1' id='type-id-3514'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='np' type-id='type-id-3543' visibility='default' filepath='include/linux/of.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='args_count' type-id='type-id-17' visibility='default' filepath='include/linux/of.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='args' type-id='type-id-4073' visibility='default' filepath='include/linux/of.h' line='79' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='gpiod_flags' filepath='include/linux/gpio/consumer.h' line='38' column='1' id='type-id-4138'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='GPIOD_ASIS' value='0'/>
+        <enumerator name='GPIOD_IN' value='1'/>
+        <enumerator name='GPIOD_OUT_LOW' value='3'/>
+        <enumerator name='GPIOD_OUT_HIGH' value='7'/>
+        <enumerator name='GPIOD_OUT_LOW_OPEN_DRAIN' value='11'/>
+        <enumerator name='GPIOD_OUT_HIGH_OPEN_DRAIN' value='15'/>
+      </enum-decl>
+      <qualified-type-def type-id='type-id-4085' const='yes' id='type-id-4139'/>
+      <pointer-type-def type-id='type-id-4139' size-in-bits='64' id='type-id-4080'/>
+      <qualified-type-def type-id='type-id-3514' const='yes' id='type-id-4140'/>
+      <pointer-type-def type-id='type-id-4140' size-in-bits='64' id='type-id-4141'/>
+      <pointer-type-def type-id='type-id-4127' size-in-bits='64' id='type-id-4078'/>
+      <pointer-type-def type-id='type-id-4075' size-in-bits='64' id='type-id-4019'/>
+      <pointer-type-def type-id='type-id-4077' size-in-bits='64' id='type-id-4076'/>
+      <pointer-type-def type-id='type-id-4142' size-in-bits='64' id='type-id-4137'/>
+      <pointer-type-def type-id='type-id-4143' size-in-bits='64' id='type-id-4128'/>
+      <pointer-type-def type-id='type-id-4144' size-in-bits='64' id='type-id-4130'/>
+      <pointer-type-def type-id='type-id-4145' size-in-bits='64' id='type-id-4134'/>
+      <pointer-type-def type-id='type-id-4146' size-in-bits='64' id='type-id-4131'/>
+      <pointer-type-def type-id='type-id-4147' size-in-bits='64' id='type-id-4107'/>
+      <pointer-type-def type-id='type-id-4148' size-in-bits='64' id='type-id-4106'/>
+      <pointer-type-def type-id='type-id-4149' size-in-bits='64' id='type-id-4111'/>
+      <pointer-type-def type-id='type-id-4150' size-in-bits='64' id='type-id-4112'/>
+      <pointer-type-def type-id='type-id-4151' size-in-bits='64' id='type-id-4108'/>
+      <pointer-type-def type-id='type-id-4152' size-in-bits='64' id='type-id-4113'/>
+      <pointer-type-def type-id='type-id-4153' size-in-bits='64' id='type-id-4090'/>
+      <pointer-type-def type-id='type-id-4154' size-in-bits='64' id='type-id-4086'/>
+      <pointer-type-def type-id='type-id-4155' size-in-bits='64' id='type-id-4093'/>
+      <pointer-type-def type-id='type-id-4156' size-in-bits='64' id='type-id-4087'/>
+      <pointer-type-def type-id='type-id-4157' size-in-bits='64' id='type-id-4095'/>
+      <pointer-type-def type-id='type-id-4158' size-in-bits='64' id='type-id-4088'/>
+      <pointer-type-def type-id='type-id-4159' size-in-bits='64' id='type-id-4091'/>
+      <pointer-type-def type-id='type-id-4061' size-in-bits='64' id='type-id-4125'/>
+      <pointer-type-def type-id='type-id-4103' size-in-bits='64' id='type-id-4099'/>
+      <pointer-type-def type-id='type-id-4118' size-in-bits='64' id='type-id-4069'/>
+      <pointer-type-def type-id='type-id-4101' size-in-bits='64' id='type-id-4098'/>
+      <pointer-type-def type-id='type-id-4097' size-in-bits='64' id='type-id-4100'/>
+      <pointer-type-def type-id='type-id-4123' size-in-bits='64' id='type-id-4160'/>
+      <pointer-type-def type-id='type-id-4079' size-in-bits='64' id='type-id-4083'/>
+      <pointer-type-def type-id='type-id-4116' size-in-bits='64' id='type-id-4082'/>
+      <pointer-type-def type-id='type-id-4096' size-in-bits='64' id='type-id-4161'/>
+      <pointer-type-def type-id='type-id-4062' size-in-bits='64' id='type-id-4124'/>
+      <pointer-type-def type-id='type-id-4063' size-in-bits='64' id='type-id-4102'/>
+      <pointer-type-def type-id='type-id-4064' size-in-bits='64' id='type-id-4162'/>
+      <pointer-type-def type-id='type-id-4065' size-in-bits='64' id='type-id-4163'/>
+      <pointer-type-def type-id='type-id-4066' size-in-bits='64' id='type-id-4164'/>
+      <pointer-type-def type-id='type-id-4165' size-in-bits='64' id='type-id-4104'/>
+      <pointer-type-def type-id='type-id-4166' size-in-bits='64' id='type-id-4129'/>
+      <pointer-type-def type-id='type-id-4167' size-in-bits='64' id='type-id-4132'/>
+      <pointer-type-def type-id='type-id-4168' size-in-bits='64' id='type-id-4133'/>
+      <pointer-type-def type-id='type-id-4169' size-in-bits='64' id='type-id-4120'/>
+      <pointer-type-def type-id='type-id-4170' size-in-bits='64' id='type-id-4105'/>
+      <pointer-type-def type-id='type-id-4171' size-in-bits='64' id='type-id-4115'/>
+      <pointer-type-def type-id='type-id-4172' size-in-bits='64' id='type-id-4110'/>
+      <pointer-type-def type-id='type-id-4173' size-in-bits='64' id='type-id-4109'/>
+      <pointer-type-def type-id='type-id-4174' size-in-bits='64' id='type-id-4114'/>
+      <pointer-type-def type-id='type-id-4175' size-in-bits='64' id='type-id-4126'/>
+      <pointer-type-def type-id='type-id-4176' size-in-bits='64' id='type-id-4094'/>
+      <pointer-type-def type-id='type-id-4177' size-in-bits='64' id='type-id-4089'/>
+      <pointer-type-def type-id='type-id-4178' size-in-bits='64' id='type-id-4092'/>
+      <pointer-type-def type-id='type-id-4179' size-in-bits='64' id='type-id-4135'/>
+      <pointer-type-def type-id='type-id-4180' size-in-bits='64' id='type-id-4119'/>
+      <function-decl name='devm_gpiod_get_index' mangled-name='devm_gpiod_get_index' filepath='drivers/gpio/devres.c' line='101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_gpiod_get_index'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/gpio/devres.c' line='101' column='1'/>
+        <parameter type-id='type-id-4' name='con_id' filepath='drivers/gpio/devres.c' line='102' column='1'/>
+        <parameter type-id='type-id-5' name='idx' filepath='drivers/gpio/devres.c' line='103' column='1'/>
+        <parameter type-id='type-id-4138' name='flags' filepath='drivers/gpio/devres.c' line='104' column='1'/>
+        <return type-id='type-id-4019'/>
+      </function-decl>
+      <function-decl name='devm_gpio_request_one' mangled-name='devm_gpio_request_one' filepath='drivers/gpio/devres.c' line='408' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_gpio_request_one'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/gpio/devres.c' line='408' column='1'/>
+        <parameter type-id='type-id-5' name='gpio' filepath='drivers/gpio/devres.c' line='408' column='1'/>
+        <parameter type-id='type-id-16' name='flags' filepath='drivers/gpio/devres.c' line='409' column='1'/>
+        <parameter type-id='type-id-4' name='label' filepath='drivers/gpio/devres.c' line='409' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-4142'>
+        <parameter type-id='type-id-4078'/>
+        <parameter type-id='type-id-4141'/>
+        <parameter type-id='type-id-1565'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4143'>
+        <parameter type-id='type-id-4078'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4144'>
+        <parameter type-id='type-id-4078'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4145'>
+        <parameter type-id='type-id-4078'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4146'>
+        <parameter type-id='type-id-4078'/>
+        <parameter type-id='type-id-45'/>
+        <parameter type-id='type-id-45'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4147'>
+        <parameter type-id='type-id-4100'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4148'>
+        <parameter type-id='type-id-4100'/>
+        <parameter type-id='type-id-3386'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4149'>
+        <parameter type-id='type-id-4100'/>
+        <parameter type-id='type-id-4067'/>
+        <parameter type-id='type-id-2610'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4150'>
+        <parameter type-id='type-id-4100'/>
+        <parameter type-id='type-id-4067'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4151'>
+        <parameter type-id='type-id-4100'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4152'>
+        <parameter type-id='type-id-4100'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4153'>
+        <parameter type-id='type-id-4083'/>
+        <parameter type-id='type-id-3543'/>
+        <parameter type-id='type-id-2726'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-45'/>
+        <parameter type-id='type-id-482'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4154'>
+        <parameter type-id='type-id-4083'/>
+        <parameter type-id='type-id-3543'/>
+        <parameter type-id='type-id-4081'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4155'>
+        <parameter type-id='type-id-4083'/>
+        <parameter type-id='type-id-4100'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4156'>
+        <parameter type-id='type-id-4083'/>
+        <parameter type-id='type-id-4161'/>
+        <parameter type-id='type-id-4081'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4157'>
+        <parameter type-id='type-id-4083'/>
+        <parameter type-id='type-id-4161'/>
+        <parameter type-id='type-id-45'/>
+        <parameter type-id='type-id-482'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4158'>
+        <parameter type-id='type-id-4083'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-4084'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4159'>
+        <parameter type-id='type-id-4083'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4165'>
+        <parameter type-id='type-id-4100'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4166'>
+        <parameter type-id='type-id-4078'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4167'>
+        <parameter type-id='type-id-4078'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4168'>
+        <parameter type-id='type-id-4078'/>
+        <parameter type-id='type-id-45'/>
+        <parameter type-id='type-id-45'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4169'>
+        <parameter type-id='type-id-4069'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4170'>
+        <parameter type-id='type-id-4100'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4171'>
+        <parameter type-id='type-id-4100'/>
+        <parameter type-id='type-id-3386'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4172'>
+        <parameter type-id='type-id-4100'/>
+        <parameter type-id='type-id-4162'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4173'>
+        <parameter type-id='type-id-4100'/>
+        <parameter type-id='type-id-88'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4174'>
+        <parameter type-id='type-id-4100'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4175'>
+        <parameter type-id='type-id-4160'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4176'>
+        <parameter type-id='type-id-4083'/>
+        <parameter type-id='type-id-4100'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4177'>
+        <parameter type-id='type-id-4083'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4178'>
+        <parameter type-id='type-id-4083'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4179'>
+        <parameter type-id='type-id-88'/>
+        <parameter type-id='type-id-4078'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4180'>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpio/gpiolib.c' language='LANG_C89'>
+      <qualified-type-def type-id='type-id-4075' const='yes' id='type-id-4181'/>
+      <pointer-type-def type-id='type-id-4181' size-in-bits='64' id='type-id-4182'/>
+      <function-decl name='gpio_to_desc' mangled-name='gpio_to_desc' filepath='drivers/gpio/gpiolib.c' line='105' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gpio_to_desc'>
+        <parameter type-id='type-id-5' name='gpio' filepath='drivers/gpio/gpiolib.c' line='105' column='1'/>
+        <return type-id='type-id-4019'/>
+      </function-decl>
+      <function-decl name='gpiod_set_debounce' mangled-name='gpiod_set_debounce' filepath='drivers/gpio/gpiolib.c' line='2717' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gpiod_set_debounce'>
+        <parameter type-id='type-id-4019' name='desc' filepath='drivers/gpio/gpiolib.c' line='2717' column='1'/>
+        <parameter type-id='type-id-5' name='debounce' filepath='drivers/gpio/gpiolib.c' line='2717' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='gpiod_is_active_low' mangled-name='gpiod_is_active_low' filepath='drivers/gpio/gpiolib.c' line='2786' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gpiod_is_active_low'>
+        <parameter type-id='type-id-4182' name='desc' filepath='drivers/gpio/gpiolib.c' line='2786' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='gpiod_get_raw_value' mangled-name='gpiod_get_raw_value' filepath='drivers/gpio/gpiolib.c' line='2922' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gpiod_get_raw_value'>
+        <parameter type-id='type-id-4182' name='desc' filepath='drivers/gpio/gpiolib.c' line='2922' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='gpiod_get_value' mangled-name='gpiod_get_value' filepath='drivers/gpio/gpiolib.c' line='2941' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gpiod_get_value'>
+        <parameter type-id='type-id-4182' name='desc' filepath='drivers/gpio/gpiolib.c' line='2941' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='gpiod_cansleep' mangled-name='gpiod_cansleep' filepath='drivers/gpio/gpiolib.c' line='3263' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gpiod_cansleep'>
+        <parameter type-id='type-id-4182' name='desc' filepath='drivers/gpio/gpiolib.c' line='3263' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='gpiod_to_irq' mangled-name='gpiod_to_irq' filepath='drivers/gpio/gpiolib.c' line='3298' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gpiod_to_irq'>
+        <parameter type-id='type-id-4182' name='desc' filepath='drivers/gpio/gpiolib.c' line='3298' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='gpiod_get_raw_value_cansleep' mangled-name='gpiod_get_raw_value_cansleep' filepath='drivers/gpio/gpiolib.c' line='3446' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gpiod_get_raw_value_cansleep'>
+        <parameter type-id='type-id-4182' name='desc' filepath='drivers/gpio/gpiolib.c' line='3446' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='gpiod_get_value_cansleep' mangled-name='gpiod_get_value_cansleep' filepath='drivers/gpio/gpiolib.c' line='3463' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='gpiod_get_value_cansleep'>
+        <parameter type-id='type-id-4182' name='desc' filepath='drivers/gpio/gpiolib.c' line='3463' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/pci/access.c' language='LANG_C89'>
+      <qualified-type-def type-id='type-id-3924' const='yes' id='type-id-4183'/>
+      <pointer-type-def type-id='type-id-4183' size-in-bits='64' id='type-id-4184'/>
+      <function-decl name='pci_read_config_dword' mangled-name='pci_read_config_dword' filepath='drivers/pci/access.c' line='556' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_read_config_dword'>
+        <parameter type-id='type-id-4184' name='dev' filepath='drivers/pci/access.c' line='556' column='1'/>
+        <parameter type-id='type-id-17' name='where' filepath='drivers/pci/access.c' line='556' column='1'/>
+        <parameter type-id='type-id-1565' name='val' filepath='drivers/pci/access.c' line='557' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pci_read_config_byte' mangled-name='pci_read_config_byte' filepath='drivers/pci/access.c' line='536' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_read_config_byte'>
+        <parameter type-id='type-id-4184' name='dev' filepath='drivers/pci/access.c' line='536' column='1'/>
+        <parameter type-id='type-id-17' name='where' filepath='drivers/pci/access.c' line='536' column='1'/>
+        <parameter type-id='type-id-3121' name='val' filepath='drivers/pci/access.c' line='536' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/pci/pci-driver.c' language='LANG_C89'>
+      <function-decl name='__pci_register_driver' mangled-name='__pci_register_driver' filepath='drivers/pci/pci-driver.c' line='1395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__pci_register_driver'>
+        <parameter type-id='type-id-3927' name='drv' filepath='drivers/pci/pci-driver.c' line='1395' column='1'/>
+        <parameter type-id='type-id-260' name='owner' filepath='drivers/pci/pci-driver.c' line='1395' column='1'/>
+        <parameter type-id='type-id-4' name='mod_name' filepath='drivers/pci/pci-driver.c' line='1396' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pci_unregister_driver' mangled-name='pci_unregister_driver' filepath='drivers/pci/pci-driver.c' line='1423' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_unregister_driver'>
+        <parameter type-id='type-id-3927' name='drv' filepath='drivers/pci/pci-driver.c' line='1423' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/video/fbdev/core/fbmem.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-4185' size-in-bits='infinite' id='type-id-4186'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='apertures_struct' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/fb.h' line='522' column='1' id='type-id-4187'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-5' visibility='default' filepath='include/linux/fb.h' line='523' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ranges' type-id='type-id-4186' visibility='default' filepath='include/linux/fb.h' line='527' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='aperture' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/fb.h' line='524' column='1' id='type-id-4185'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-2154' visibility='default' filepath='include/linux/fb.h' line='525' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='size' type-id='type-id-2154' visibility='default' filepath='include/linux/fb.h' line='526' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-4187' size-in-bits='64' id='type-id-4188'/>
+      <function-decl name='remove_conflicting_framebuffers' mangled-name='remove_conflicting_framebuffers' filepath='drivers/video/fbdev/core/fbmem.c' line='1803' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='remove_conflicting_framebuffers'>
+        <parameter type-id='type-id-4188' name='a' filepath='drivers/video/fbdev/core/fbmem.c' line='1803' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/video/fbdev/core/fbmem.c' line='1804' column='1'/>
+        <parameter type-id='type-id-33' name='primary' filepath='drivers/video/fbdev/core/fbmem.c' line='1804' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/clk/clk-devres.c' language='LANG_C89'>
+      <class-decl name='clk' size-in-bits='512' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4189'/>
+      <class-decl name='fwnode_handle' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4190'/>
+      <pointer-type-def type-id='type-id-4189' size-in-bits='64' id='type-id-4191'/>
+      <pointer-type-def type-id='type-id-4190' size-in-bits='64' id='type-id-4192'/>
+      <function-decl name='devm_clk_get' mangled-name='devm_clk_get' filepath='drivers/clk/clk-devres.c' line='17' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_clk_get'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/clk/clk-devres.c' line='17' column='1'/>
+        <parameter type-id='type-id-4' name='id' filepath='drivers/clk/clk-devres.c' line='17' column='1'/>
+        <return type-id='type-id-4191'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/clk/clk.c' language='LANG_C89'>
+      <class-decl name='clk_core' size-in-bits='1984' is-struct='yes' visibility='default' filepath='drivers/clk/clk.c' line='45' column='1' id='type-id-4193'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='drivers/clk/clk.c' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ops' type-id='type-id-4194' visibility='default' filepath='drivers/clk/clk.c' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hw' type-id='type-id-4195' visibility='default' filepath='drivers/clk/clk.c' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='drivers/clk/clk.c' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='drivers/clk/clk.c' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='parent' type-id='type-id-4196' visibility='default' filepath='drivers/clk/clk.c' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='parent_names' type-id='type-id-1387' visibility='default' filepath='drivers/clk/clk.c' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='parents' type-id='type-id-4197' visibility='default' filepath='drivers/clk/clk.c' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='num_parents' type-id='type-id-214' visibility='default' filepath='drivers/clk/clk.c' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='520'>
+          <var-decl name='new_parent_index' type-id='type-id-214' visibility='default' filepath='drivers/clk/clk.c' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='rate' type-id='type-id-16' visibility='default' filepath='drivers/clk/clk.c' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='req_rate' type-id='type-id-16' visibility='default' filepath='drivers/clk/clk.c' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='new_rate' type-id='type-id-16' visibility='default' filepath='drivers/clk/clk.c' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='new_parent' type-id='type-id-4196' visibility='default' filepath='drivers/clk/clk.c' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='new_child' type-id='type-id-4196' visibility='default' filepath='drivers/clk/clk.c' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='drivers/clk/clk.c' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='orphan' type-id='type-id-33' visibility='default' filepath='drivers/clk/clk.c' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='enable_count' type-id='type-id-5' visibility='default' filepath='drivers/clk/clk.c' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='prepare_count' type-id='type-id-5' visibility='default' filepath='drivers/clk/clk.c' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='protect_count' type-id='type-id-5' visibility='default' filepath='drivers/clk/clk.c' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='min_rate' type-id='type-id-16' visibility='default' filepath='drivers/clk/clk.c' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='max_rate' type-id='type-id-16' visibility='default' filepath='drivers/clk/clk.c' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='accuracy' type-id='type-id-16' visibility='default' filepath='drivers/clk/clk.c' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='phase' type-id='type-id-17' visibility='default' filepath='drivers/clk/clk.c' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='duty' type-id='type-id-4198' visibility='default' filepath='drivers/clk/clk.c' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='children' type-id='type-id-186' visibility='default' filepath='drivers/clk/clk.c' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='child_node' type-id='type-id-520' visibility='default' filepath='drivers/clk/clk.c' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='clks' type-id='type-id-186' visibility='default' filepath='drivers/clk/clk.c' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='notifier_count' type-id='type-id-5' visibility='default' filepath='drivers/clk/clk.c' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='dentry' type-id='type-id-23' visibility='default' filepath='drivers/clk/clk.c' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='debug_node' type-id='type-id-520' visibility='default' filepath='drivers/clk/clk.c' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='ref' type-id='type-id-239' visibility='default' filepath='drivers/clk/clk.c' line='79' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='clk_ops' size-in-bits='1408' is-struct='yes' visibility='default' filepath='include/linux/clk-provider.h' line='217' column='1' id='type-id-4199'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prepare' type-id='type-id-4200' visibility='default' filepath='include/linux/clk-provider.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='unprepare' type-id='type-id-4201' visibility='default' filepath='include/linux/clk-provider.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='is_prepared' type-id='type-id-4200' visibility='default' filepath='include/linux/clk-provider.h' line='220' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='unprepare_unused' type-id='type-id-4201' visibility='default' filepath='include/linux/clk-provider.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='enable' type-id='type-id-4200' visibility='default' filepath='include/linux/clk-provider.h' line='222' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='disable' type-id='type-id-4201' visibility='default' filepath='include/linux/clk-provider.h' line='223' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='is_enabled' type-id='type-id-4200' visibility='default' filepath='include/linux/clk-provider.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='disable_unused' type-id='type-id-4201' visibility='default' filepath='include/linux/clk-provider.h' line='225' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='recalc_rate' type-id='type-id-4202' visibility='default' filepath='include/linux/clk-provider.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='round_rate' type-id='type-id-4203' visibility='default' filepath='include/linux/clk-provider.h' line='228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='determine_rate' type-id='type-id-4204' visibility='default' filepath='include/linux/clk-provider.h' line='230' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='set_parent' type-id='type-id-4205' visibility='default' filepath='include/linux/clk-provider.h' line='232' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='get_parent' type-id='type-id-4206' visibility='default' filepath='include/linux/clk-provider.h' line='233' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='set_rate' type-id='type-id-4207' visibility='default' filepath='include/linux/clk-provider.h' line='234' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='set_rate_and_parent' type-id='type-id-4208' visibility='default' filepath='include/linux/clk-provider.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='recalc_accuracy' type-id='type-id-4202' visibility='default' filepath='include/linux/clk-provider.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='get_phase' type-id='type-id-4200' visibility='default' filepath='include/linux/clk-provider.h' line='241' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='set_phase' type-id='type-id-4209' visibility='default' filepath='include/linux/clk-provider.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='get_duty_cycle' type-id='type-id-4210' visibility='default' filepath='include/linux/clk-provider.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='set_duty_cycle' type-id='type-id-4210' visibility='default' filepath='include/linux/clk-provider.h' line='245' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='init' type-id='type-id-4201' visibility='default' filepath='include/linux/clk-provider.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='debug_init' type-id='type-id-4211' visibility='default' filepath='include/linux/clk-provider.h' line='248' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='clk_hw' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/clk-provider.h' line='284' column='1' id='type-id-4212'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='core' type-id='type-id-4196' visibility='default' filepath='include/linux/clk-provider.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='clk' type-id='type-id-4191' visibility='default' filepath='include/linux/clk-provider.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='init' type-id='type-id-4213' visibility='default' filepath='include/linux/clk-provider.h' line='287' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='clk_init_data' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/clk-provider.h' line='261' column='1' id='type-id-4214'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/clk-provider.h' line='262' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ops' type-id='type-id-4194' visibility='default' filepath='include/linux/clk-provider.h' line='263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='parent_names' type-id='type-id-92' visibility='default' filepath='include/linux/clk-provider.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='num_parents' type-id='type-id-214' visibility='default' filepath='include/linux/clk-provider.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/clk-provider.h' line='266' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='clk_rate_request' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/clk-provider.h' line='63' column='1' id='type-id-4215'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rate' type-id='type-id-16' visibility='default' filepath='include/linux/clk-provider.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='min_rate' type-id='type-id-16' visibility='default' filepath='include/linux/clk-provider.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='max_rate' type-id='type-id-16' visibility='default' filepath='include/linux/clk-provider.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='best_parent_rate' type-id='type-id-16' visibility='default' filepath='include/linux/clk-provider.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='best_parent_hw' type-id='type-id-4195' visibility='default' filepath='include/linux/clk-provider.h' line='68' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='clk_duty' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/clk-provider.h' line='77' column='1' id='type-id-4198'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='num' type-id='type-id-5' visibility='default' filepath='include/linux/clk-provider.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='den' type-id='type-id-5' visibility='default' filepath='include/linux/clk-provider.h' line='79' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-4193' size-in-bits='64' id='type-id-4196'/>
+      <pointer-type-def type-id='type-id-4196' size-in-bits='64' id='type-id-4197'/>
+      <pointer-type-def type-id='type-id-4198' size-in-bits='64' id='type-id-4216'/>
+      <pointer-type-def type-id='type-id-4212' size-in-bits='64' id='type-id-4195'/>
+      <pointer-type-def type-id='type-id-4215' size-in-bits='64' id='type-id-4217'/>
+      <qualified-type-def type-id='type-id-4214' const='yes' id='type-id-4218'/>
+      <pointer-type-def type-id='type-id-4218' size-in-bits='64' id='type-id-4213'/>
+      <qualified-type-def type-id='type-id-4199' const='yes' id='type-id-4219'/>
+      <pointer-type-def type-id='type-id-4219' size-in-bits='64' id='type-id-4194'/>
+      <pointer-type-def type-id='type-id-4220' size-in-bits='64' id='type-id-4200'/>
+      <pointer-type-def type-id='type-id-4221' size-in-bits='64' id='type-id-4210'/>
+      <pointer-type-def type-id='type-id-4222' size-in-bits='64' id='type-id-4204'/>
+      <pointer-type-def type-id='type-id-4223' size-in-bits='64' id='type-id-4209'/>
+      <pointer-type-def type-id='type-id-4224' size-in-bits='64' id='type-id-4205'/>
+      <pointer-type-def type-id='type-id-4225' size-in-bits='64' id='type-id-4207'/>
+      <pointer-type-def type-id='type-id-4226' size-in-bits='64' id='type-id-4208'/>
+      <pointer-type-def type-id='type-id-4227' size-in-bits='64' id='type-id-4203'/>
+      <pointer-type-def type-id='type-id-4228' size-in-bits='64' id='type-id-4206'/>
+      <pointer-type-def type-id='type-id-4229' size-in-bits='64' id='type-id-4202'/>
+      <pointer-type-def type-id='type-id-4230' size-in-bits='64' id='type-id-4201'/>
+      <pointer-type-def type-id='type-id-4231' size-in-bits='64' id='type-id-4211'/>
+      <function-decl name='clk_unprepare' mangled-name='clk_unprepare' filepath='drivers/clk/clk.c' line='731' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_unprepare'>
+        <parameter type-id='type-id-4191' name='clk' filepath='drivers/clk/clk.c' line='731' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='clk_prepare' mangled-name='clk_prepare' filepath='drivers/clk/clk.c' line='812' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_prepare'>
+        <parameter type-id='type-id-4191' name='clk' filepath='drivers/clk/clk.c' line='812' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='clk_disable' mangled-name='clk_disable' filepath='drivers/clk/clk.c' line='869' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_disable'>
+        <parameter type-id='type-id-4191' name='clk' filepath='drivers/clk/clk.c' line='869' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='clk_enable' mangled-name='clk_enable' filepath='drivers/clk/clk.c' line='939' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_enable'>
+        <parameter type-id='type-id-4191' name='clk' filepath='drivers/clk/clk.c' line='939' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='clk_get_rate' mangled-name='clk_get_rate' filepath='drivers/clk/clk.c' line='1407' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_get_rate'>
+        <parameter type-id='type-id-4191' name='clk' filepath='drivers/clk/clk.c' line='1407' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-4220'>
+        <parameter type-id='type-id-4195'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4221'>
+        <parameter type-id='type-id-4195'/>
+        <parameter type-id='type-id-4216'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4222'>
+        <parameter type-id='type-id-4195'/>
+        <parameter type-id='type-id-4217'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4223'>
+        <parameter type-id='type-id-4195'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4224'>
+        <parameter type-id='type-id-4195'/>
+        <parameter type-id='type-id-214'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4225'>
+        <parameter type-id='type-id-4195'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4226'>
+        <parameter type-id='type-id-4195'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-214'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4227'>
+        <parameter type-id='type-id-4195'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-45'/>
+        <return type-id='type-id-192'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4228'>
+        <parameter type-id='type-id-4195'/>
+        <return type-id='type-id-214'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4229'>
+        <parameter type-id='type-id-4195'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-16'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4230'>
+        <parameter type-id='type-id-4195'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4231'>
+        <parameter type-id='type-id-4195'/>
+        <parameter type-id='type-id-23'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/regulator/devres.c' language='LANG_C89'>
+      <function-decl name='devm_regulator_get_optional' mangled-name='devm_regulator_get_optional' filepath='drivers/regulator/devres.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_regulator_get_optional'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/regulator/devres.c' line='87' column='1'/>
+        <parameter type-id='type-id-4' name='id' filepath='drivers/regulator/devres.c' line='88' column='1'/>
+        <return type-id='type-id-4007'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/reset/core.c' language='LANG_C89'>
+      <class-decl name='reset_control' size-in-bits='384' is-struct='yes' visibility='default' filepath='drivers/reset/core.c' line='43' column='1' id='type-id-4232'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcdev' type-id='type-id-4233' visibility='default' filepath='drivers/reset/core.c' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='drivers/reset/core.c' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='id' type-id='type-id-5' visibility='default' filepath='drivers/reset/core.c' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='refcnt' type-id='type-id-239' visibility='default' filepath='drivers/reset/core.c' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='shared' type-id='type-id-33' visibility='default' filepath='drivers/reset/core.c' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='264'>
+          <var-decl name='array' type-id='type-id-33' visibility='default' filepath='drivers/reset/core.c' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='deassert_count' type-id='type-id-26' visibility='default' filepath='drivers/reset/core.c' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='triggered_count' type-id='type-id-26' visibility='default' filepath='drivers/reset/core.c' line='51' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='reset_controller_dev' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/reset-controller.h' line='68' column='1' id='type-id-4234'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ops' type-id='type-id-4235' visibility='default' filepath='include/linux/reset-controller.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/reset-controller.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/reset-controller.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='reset_control_head' type-id='type-id-20' visibility='default' filepath='include/linux/reset-controller.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/reset-controller.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='of_node' type-id='type-id-3543' visibility='default' filepath='include/linux/reset-controller.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='of_reset_n_cells' type-id='type-id-17' visibility='default' filepath='include/linux/reset-controller.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='of_xlate' type-id='type-id-4236' visibility='default' filepath='include/linux/reset-controller.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='nr_resets' type-id='type-id-5' visibility='default' filepath='include/linux/reset-controller.h' line='78' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='reset_control_ops' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/reset-controller.h' line='18' column='1' id='type-id-4237'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='reset' type-id='type-id-4238' visibility='default' filepath='include/linux/reset-controller.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='assert' type-id='type-id-4238' visibility='default' filepath='include/linux/reset-controller.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='deassert' type-id='type-id-4238' visibility='default' filepath='include/linux/reset-controller.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='status' type-id='type-id-4238' visibility='default' filepath='include/linux/reset-controller.h' line='22' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-4237' const='yes' id='type-id-4239'/>
+      <pointer-type-def type-id='type-id-4239' size-in-bits='64' id='type-id-4235'/>
+      <pointer-type-def type-id='type-id-4240' size-in-bits='64' id='type-id-4236'/>
+      <pointer-type-def type-id='type-id-4241' size-in-bits='64' id='type-id-4238'/>
+      <pointer-type-def type-id='type-id-4232' size-in-bits='64' id='type-id-4242'/>
+      <pointer-type-def type-id='type-id-4234' size-in-bits='64' id='type-id-4233'/>
+      <function-decl name='reset_control_assert' mangled-name='reset_control_assert' filepath='drivers/reset/core.c' line='302' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reset_control_assert'>
+        <parameter type-id='type-id-4242' name='rstc' filepath='drivers/reset/core.c' line='302' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='reset_control_deassert' mangled-name='reset_control_deassert' filepath='drivers/reset/core.c' line='355' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reset_control_deassert'>
+        <parameter type-id='type-id-4242' name='rstc' filepath='drivers/reset/core.c' line='355' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__devm_reset_control_get' mangled-name='__devm_reset_control_get' filepath='drivers/reset/core.c' line='638' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__devm_reset_control_get'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/reset/core.c' line='638' column='1'/>
+        <parameter type-id='type-id-4' name='id' filepath='drivers/reset/core.c' line='639' column='1'/>
+        <parameter type-id='type-id-17' name='index' filepath='drivers/reset/core.c' line='639' column='1'/>
+        <parameter type-id='type-id-33' name='shared' filepath='drivers/reset/core.c' line='639' column='1'/>
+        <parameter type-id='type-id-33' name='optional' filepath='drivers/reset/core.c' line='640' column='1'/>
+        <return type-id='type-id-4242'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-4240'>
+        <parameter type-id='type-id-4233'/>
+        <parameter type-id='type-id-4141'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4241'>
+        <parameter type-id='type-id-4233'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/tty/hvc/hvc_console.c' language='LANG_C89'>
+      <class-decl name='hv_ops' size-in-bits='576' is-struct='yes' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='54' column='1' id='type-id-4243'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='get_chars' type-id='type-id-4244' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='put_chars' type-id='type-id-4245' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flush' type-id='type-id-4246' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='notifier_add' type-id='type-id-4247' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='notifier_del' type-id='type-id-4248' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='notifier_hangup' type-id='type-id-4248' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='tiocmget' type-id='type-id-4249' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='tiocmset' type-id='type-id-4250' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dtr_rts' type-id='type-id-4248' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='69' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hvc_struct' size-in-bits='3776' is-struct='yes' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='35' column='1' id='type-id-4251'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='port' type-id='type-id-272' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2848'>
+          <var-decl name='index' type-id='type-id-17' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='do_wakeup' type-id='type-id-17' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='outbuf' type-id='type-id-2' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='outbuf_size' type-id='type-id-17' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3040'>
+          <var-decl name='n_outbuf' type-id='type-id-17' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='vtermno' type-id='type-id-1341' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='ops' type-id='type-id-4252' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='irq_requested' type-id='type-id-17' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3232'>
+          <var-decl name='data' type-id='type-id-17' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='ws' type-id='type-id-252' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='tty_resize' type-id='type-id-255' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='next' type-id='type-id-20' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='50' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-4243' const='yes' id='type-id-4253'/>
+      <pointer-type-def type-id='type-id-4253' size-in-bits='64' id='type-id-4252'/>
+      <pointer-type-def type-id='type-id-4251' size-in-bits='64' id='type-id-4254'/>
+      <pointer-type-def type-id='type-id-4255' size-in-bits='64' id='type-id-4249'/>
+      <pointer-type-def type-id='type-id-4256' size-in-bits='64' id='type-id-4247'/>
+      <pointer-type-def type-id='type-id-4257' size-in-bits='64' id='type-id-4250'/>
+      <pointer-type-def type-id='type-id-4258' size-in-bits='64' id='type-id-4244'/>
+      <pointer-type-def type-id='type-id-4259' size-in-bits='64' id='type-id-4245'/>
+      <pointer-type-def type-id='type-id-4260' size-in-bits='64' id='type-id-4246'/>
+      <pointer-type-def type-id='type-id-4261' size-in-bits='64' id='type-id-4248'/>
+      <function-decl name='hvc_instantiate' mangled-name='hvc_instantiate' filepath='drivers/tty/hvc/hvc_console.c' line='285' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hvc_instantiate'>
+        <parameter type-id='type-id-1341' name='vtermno' filepath='drivers/tty/hvc/hvc_console.c' line='285' column='1'/>
+        <parameter type-id='type-id-17' name='index' filepath='drivers/tty/hvc/hvc_console.c' line='285' column='1'/>
+        <parameter type-id='type-id-4252' name='ops' filepath='drivers/tty/hvc/hvc_console.c' line='285' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='hvc_kick' mangled-name='hvc_kick' filepath='drivers/tty/hvc/hvc_console.c' line='317' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hvc_kick'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='hvc_poll' mangled-name='hvc_poll' filepath='drivers/tty/hvc/hvc_console.c' line='773' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hvc_poll'>
+        <parameter type-id='type-id-4254' name='hp' filepath='drivers/tty/hvc/hvc_console.c' line='773' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__hvc_resize' mangled-name='__hvc_resize' filepath='drivers/tty/hvc/hvc_console.c' line='789' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__hvc_resize'>
+        <parameter type-id='type-id-4254' name='hp' filepath='drivers/tty/hvc/hvc_console.c' line='789' column='1'/>
+        <parameter type-id='type-id-252' name='ws' filepath='drivers/tty/hvc/hvc_console.c' line='789' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='hvc_alloc' mangled-name='hvc_alloc' filepath='drivers/tty/hvc/hvc_console.c' line='922' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hvc_alloc'>
+        <parameter type-id='type-id-1341' name='vtermno' filepath='drivers/tty/hvc/hvc_console.c' line='922' column='1'/>
+        <parameter type-id='type-id-17' name='data' filepath='drivers/tty/hvc/hvc_console.c' line='922' column='1'/>
+        <parameter type-id='type-id-4252' name='ops' filepath='drivers/tty/hvc/hvc_console.c' line='923' column='1'/>
+        <parameter type-id='type-id-17' name='outbuf_size' filepath='drivers/tty/hvc/hvc_console.c' line='924' column='1'/>
+        <return type-id='type-id-4254'/>
+      </function-decl>
+      <function-decl name='hvc_remove' mangled-name='hvc_remove' filepath='drivers/tty/hvc/hvc_console.c' line='981' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hvc_remove'>
+        <parameter type-id='type-id-4254' name='hp' filepath='drivers/tty/hvc/hvc_console.c' line='981' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-4255'>
+        <parameter type-id='type-id-4254'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4256'>
+        <parameter type-id='type-id-4254'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4257'>
+        <parameter type-id='type-id-4254'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4258'>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4259'>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4260'>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4261'>
+        <parameter type-id='type-id-4254'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/tty/serial/8250/8250_core.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-511' size-in-bits='160' id='type-id-4262'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='8' id='type-id-4263'>
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-4264' size-in-bits='infinite' id='type-id-4265'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-2081' size-in-bits='infinite' id='type-id-4266'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-216' size-in-bits='16' id='type-id-4267'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <class-decl name='uart_8250_port' size-in-bits='5120' is-struct='yes' visibility='default' filepath='include/linux/serial_8250.h' line='96' column='1' id='type-id-4268'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='port' type-id='type-id-4269' visibility='default' filepath='include/linux/serial_8250.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='timer' type-id='type-id-417' visibility='default' filepath='include/linux/serial_8250.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/serial_8250.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='capabilities' type-id='type-id-7' visibility='default' filepath='include/linux/serial_8250.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3808'>
+          <var-decl name='bugs' type-id='type-id-312' visibility='default' filepath='include/linux/serial_8250.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3824'>
+          <var-decl name='fifo_bug' type-id='type-id-33' visibility='default' filepath='include/linux/serial_8250.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='tx_loadsz' type-id='type-id-5' visibility='default' filepath='include/linux/serial_8250.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3872'>
+          <var-decl name='acr' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3880'>
+          <var-decl name='fcr' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3888'>
+          <var-decl name='ier' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3896'>
+          <var-decl name='lcr' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3904'>
+          <var-decl name='mcr' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3912'>
+          <var-decl name='mcr_mask' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3920'>
+          <var-decl name='mcr_force' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3928'>
+          <var-decl name='cur_iotype' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3936'>
+          <var-decl name='rpm_tx_active' type-id='type-id-5' visibility='default' filepath='include/linux/serial_8250.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='canary' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3976'>
+          <var-decl name='probe' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3984'>
+          <var-decl name='lsr_saved_flags' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3992'>
+          <var-decl name='msr_saved_flags' type-id='type-id-216' visibility='default' filepath='include/linux/serial_8250.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='dma' type-id='type-id-4270' visibility='default' filepath='include/linux/serial_8250.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='ops' type-id='type-id-4271' visibility='default' filepath='include/linux/serial_8250.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='dl_read' type-id='type-id-4272' visibility='default' filepath='include/linux/serial_8250.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='dl_write' type-id='type-id-4273' visibility='default' filepath='include/linux/serial_8250.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='em485' type-id='type-id-4274' visibility='default' filepath='include/linux/serial_8250.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='overrun_backoff' type-id='type-id-411' visibility='default' filepath='include/linux/serial_8250.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='overrun_backoff_time_ms' type-id='type-id-7' visibility='default' filepath='include/linux/serial_8250.h' line='140' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='uart_port' size-in-bits='3328' is-struct='yes' visibility='default' filepath='include/linux/serial_core.h' line='117' column='1' id='type-id-4269'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/serial_core.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='iobase' type-id='type-id-16' visibility='default' filepath='include/linux/serial_core.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='membase' type-id='type-id-256' visibility='default' filepath='include/linux/serial_core.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='serial_in' type-id='type-id-4275' visibility='default' filepath='include/linux/serial_core.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='serial_out' type-id='type-id-4276' visibility='default' filepath='include/linux/serial_core.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='set_termios' type-id='type-id-4277' visibility='default' filepath='include/linux/serial_core.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='set_ldisc' type-id='type-id-4278' visibility='default' filepath='include/linux/serial_core.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_mctrl' type-id='type-id-4279' visibility='default' filepath='include/linux/serial_core.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='set_mctrl' type-id='type-id-4280' visibility='default' filepath='include/linux/serial_core.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='get_divisor' type-id='type-id-4281' visibility='default' filepath='include/linux/serial_core.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='set_divisor' type-id='type-id-4282' visibility='default' filepath='include/linux/serial_core.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='startup' type-id='type-id-4283' visibility='default' filepath='include/linux/serial_core.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='shutdown' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='throttle' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='unthrottle' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='handle_irq' type-id='type-id-4283' visibility='default' filepath='include/linux/serial_core.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='pm' type-id='type-id-4285' visibility='default' filepath='include/linux/serial_core.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='handle_break' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='rs485_config' type-id='type-id-4286' visibility='default' filepath='include/linux/serial_core.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='irq' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='irqflags' type-id='type-id-16' visibility='default' filepath='include/linux/serial_core.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='uartclk' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='fifosize' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='x_char' type-id='type-id-216' visibility='default' filepath='include/linux/serial_core.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1416'>
+          <var-decl name='regshift' type-id='type-id-216' visibility='default' filepath='include/linux/serial_core.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1424'>
+          <var-decl name='iotype' type-id='type-id-216' visibility='default' filepath='include/linux/serial_core.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1432'>
+          <var-decl name='quirks' type-id='type-id-216' visibility='default' filepath='include/linux/serial_core.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1440'>
+          <var-decl name='read_status_mask' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='ignore_status_mask' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='state' type-id='type-id-4287' visibility='default' filepath='include/linux/serial_core.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='icount' type-id='type-id-4288' visibility='default' filepath='include/linux/serial_core.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='cons' type-id='type-id-4289' visibility='default' filepath='include/linux/serial_core.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='sysrq' type-id='type-id-16' visibility='default' filepath='include/linux/serial_core.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='sysrq_ch' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2144'>
+          <var-decl name='flags' type-id='type-id-4290' visibility='default' filepath='include/linux/serial_core.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='status' type-id='type-id-4291' visibility='default' filepath='include/linux/serial_core.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2208'>
+          <var-decl name='hw_stopped' type-id='type-id-17' visibility='default' filepath='include/linux/serial_core.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='mctrl' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2272'>
+          <var-decl name='timeout' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='type' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='ops' type-id='type-id-4292' visibility='default' filepath='include/linux/serial_core.h' line='250' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='custom_divisor' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2464'>
+          <var-decl name='line' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='252' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='minor' type-id='type-id-5' visibility='default' filepath='include/linux/serial_core.h' line='253' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='mapbase' type-id='type-id-2154' visibility='default' filepath='include/linux/serial_core.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='mapsize' type-id='type-id-2154' visibility='default' filepath='include/linux/serial_core.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/serial_core.h' line='256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='hub6' type-id='type-id-216' visibility='default' filepath='include/linux/serial_core.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2760'>
+          <var-decl name='suspended' type-id='type-id-216' visibility='default' filepath='include/linux/serial_core.h' line='258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2768'>
+          <var-decl name='unused' type-id='type-id-4267' visibility='default' filepath='include/linux/serial_core.h' line='259' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/serial_core.h' line='260' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='attr_group' type-id='type-id-4293' visibility='default' filepath='include/linux/serial_core.h' line='261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='tty_groups' type-id='type-id-665' visibility='default' filepath='include/linux/serial_core.h' line='262' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='rs485' type-id='type-id-4294' visibility='default' filepath='include/linux/serial_core.h' line='263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='private_data' type-id='type-id-15' visibility='default' filepath='include/linux/serial_core.h' line='264' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='serial_rs485' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/linux/serial.h' line='117' column='1' id='type-id-4294'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/serial.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='delay_rts_before_send' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/serial.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='delay_rts_after_send' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/serial.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='padding' type-id='type-id-4262' visibility='default' filepath='include/uapi/linux/serial.h' line='131' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='uart_state' size-in-bits='3328' is-struct='yes' visibility='default' filepath='include/linux/serial_core.h' line='292' column='1' id='type-id-4295'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='port' type-id='type-id-272' visibility='default' filepath='include/linux/serial_core.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='pm_state' type-id='type-id-4296' visibility='default' filepath='include/linux/serial_core.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='xmit' type-id='type-id-4297' visibility='default' filepath='include/linux/serial_core.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='refcount' type-id='type-id-26' visibility='default' filepath='include/linux/serial_core.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='remove_wait' type-id='type-id-225' visibility='default' filepath='include/linux/serial_core.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='uart_port' type-id='type-id-4298' visibility='default' filepath='include/linux/serial_core.h' line='300' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='158' column='1' id='type-id-4299'>
+        <data-member access='private'>
+          <var-decl name='graveyard_link' type-id='type-id-20' visibility='default' filepath='include/linux/key.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='serial_node' type-id='type-id-422' visibility='default' filepath='include/linux/key.h' line='160' column='1'/>
+        </data-member>
+      </union-decl>
+      <enum-decl name='uart_pm_state' filepath='include/linux/serial_core.h' line='283' column='1' id='type-id-4296'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='UART_PM_STATE_ON' value='0'/>
+        <enumerator name='UART_PM_STATE_OFF' value='3'/>
+        <enumerator name='UART_PM_STATE_UNDEFINED' value='4'/>
+      </enum-decl>
+      <class-decl name='circ_buf' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/circ_buf.h' line='9' column='1' id='type-id-4297'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buf' type-id='type-id-2' visibility='default' filepath='include/linux/circ_buf.h' line='10' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='head' type-id='type-id-17' visibility='default' filepath='include/linux/circ_buf.h' line='11' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='tail' type-id='type-id-17' visibility='default' filepath='include/linux/circ_buf.h' line='12' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='uart_icount' size-in-bits='352' is-struct='yes' visibility='default' filepath='include/linux/serial_core.h' line='100' column='1' id='type-id-4288'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cts' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='dsr' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rng' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='dcd' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rx' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='tx' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='frame' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='overrun' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='parity' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='brk' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='buf_overrun' type-id='type-id-511' visibility='default' filepath='include/linux/serial_core.h' line='111' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='console' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/console.h' line='145' column='1' id='type-id-4300'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-43' visibility='default' filepath='include/linux/console.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='write' type-id='type-id-4301' visibility='default' filepath='include/linux/console.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='read' type-id='type-id-4302' visibility='default' filepath='include/linux/console.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='device' type-id='type-id-4303' visibility='default' filepath='include/linux/console.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='unblank' type-id='type-id-1390' visibility='default' filepath='include/linux/console.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='setup' type-id='type-id-4304' visibility='default' filepath='include/linux/console.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='match' type-id='type-id-4305' visibility='default' filepath='include/linux/console.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='flags' type-id='type-id-261' visibility='default' filepath='include/linux/console.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='528'>
+          <var-decl name='index' type-id='type-id-261' visibility='default' filepath='include/linux/console.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='cflag' type-id='type-id-17' visibility='default' filepath='include/linux/console.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/console.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='next' type-id='type-id-4289' visibility='default' filepath='include/linux/console.h' line='157' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='upf_t' type-id='type-id-5' filepath='include/linux/serial_core.h' line='114' column='1' id='type-id-4290'/>
+      <typedef-decl name='upstat_t' type-id='type-id-5' filepath='include/linux/serial_core.h' line='115' column='1' id='type-id-4291'/>
+      <class-decl name='uart_ops' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/linux/serial_core.h' line='49' column='1' id='type-id-4306'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tx_empty' type-id='type-id-4279' visibility='default' filepath='include/linux/serial_core.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='set_mctrl' type-id='type-id-4280' visibility='default' filepath='include/linux/serial_core.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='get_mctrl' type-id='type-id-4279' visibility='default' filepath='include/linux/serial_core.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='stop_tx' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='start_tx' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='throttle' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='unthrottle' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='send_xchar' type-id='type-id-4307' visibility='default' filepath='include/linux/serial_core.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='stop_rx' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='enable_ms' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='break_ctl' type-id='type-id-4308' visibility='default' filepath='include/linux/serial_core.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='startup' type-id='type-id-4283' visibility='default' filepath='include/linux/serial_core.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='shutdown' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='flush_buffer' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='set_termios' type-id='type-id-4277' visibility='default' filepath='include/linux/serial_core.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='set_ldisc' type-id='type-id-4278' visibility='default' filepath='include/linux/serial_core.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='pm' type-id='type-id-4285' visibility='default' filepath='include/linux/serial_core.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='type' type-id='type-id-4309' visibility='default' filepath='include/linux/serial_core.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='release_port' type-id='type-id-4284' visibility='default' filepath='include/linux/serial_core.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='request_port' type-id='type-id-4283' visibility='default' filepath='include/linux/serial_core.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='config_port' type-id='type-id-4308' visibility='default' filepath='include/linux/serial_core.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='verify_port' type-id='type-id-4310' visibility='default' filepath='include/linux/serial_core.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='ioctl' type-id='type-id-4311' visibility='default' filepath='include/linux/serial_core.h' line='88' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='serial_struct' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/uapi/linux/serial.h' line='19' column='1' id='type-id-4312'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/serial.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='line' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/serial.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='port' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/serial.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='irq' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/serial.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/serial.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='xmit_fifo_size' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/serial.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='custom_divisor' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/serial.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='baud_base' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/serial.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='close_delay' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/serial.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='io_type' type-id='type-id-1' visibility='default' filepath='include/uapi/linux/serial.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='280'>
+          <var-decl name='reserved_char' type-id='type-id-4263' visibility='default' filepath='include/uapi/linux/serial.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='hub6' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/serial.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='closing_wait' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/serial.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='336'>
+          <var-decl name='closing_wait2' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/serial.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='iomem_base' type-id='type-id-256' visibility='default' filepath='include/uapi/linux/serial.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='iomem_reg_shift' type-id='type-id-312' visibility='default' filepath='include/uapi/linux/serial.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='port_high' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/serial.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='iomap_base' type-id='type-id-16' visibility='default' filepath='include/uapi/linux/serial.h' line='37' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='uart_8250_dma' size-in-bits='1920' is-struct='yes' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='14' column='1' id='type-id-4313'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tx_dma' type-id='type-id-4272' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rx_dma' type-id='type-id-4272' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fn' type-id='type-id-4314' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rx_param' type-id='type-id-15' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='tx_param' type-id='type-id-15' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='rxconf' type-id='type-id-4315' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='txconf' type-id='type-id-4315' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='rxchan' type-id='type-id-4316' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='txchan' type-id='type-id-4316' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='rx_dma_addr' type-id='type-id-99' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='tx_dma_addr' type-id='type-id-99' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='rx_addr' type-id='type-id-2081' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='tx_addr' type-id='type-id-2081' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='rx_cookie' type-id='type-id-4317' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1632'>
+          <var-decl name='tx_cookie' type-id='type-id-4317' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='rx_buf' type-id='type-id-15' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='rx_size' type-id='type-id-84' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='tx_size' type-id='type-id-84' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='tx_running' type-id='type-id-216' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1864'>
+          <var-decl name='tx_err' type-id='type-id-216' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1872'>
+          <var-decl name='rx_running' type-id='type-id-216' visibility='default' filepath='drivers/tty/serial/8250/8250.h' line='48' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_chan' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='265' column='1' id='type-id-4318'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='device' type-id='type-id-4319' visibility='default' filepath='include/linux/dmaengine.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cookie' type-id='type-id-4317' visibility='default' filepath='include/linux/dmaengine.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='completed_cookie' type-id='type-id-4317' visibility='default' filepath='include/linux/dmaengine.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='chan_id' type-id='type-id-17' visibility='default' filepath='include/linux/dmaengine.h' line='271' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dev' type-id='type-id-4320' visibility='default' filepath='include/linux/dmaengine.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='device_node' type-id='type-id-20' visibility='default' filepath='include/linux/dmaengine.h' line='274' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='local' type-id='type-id-4321' visibility='default' filepath='include/linux/dmaengine.h' line='275' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='client_count' type-id='type-id-17' visibility='default' filepath='include/linux/dmaengine.h' line='276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='table_count' type-id='type-id-17' visibility='default' filepath='include/linux/dmaengine.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='router' type-id='type-id-4322' visibility='default' filepath='include/linux/dmaengine.h' line='280' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='route_data' type-id='type-id-15' visibility='default' filepath='include/linux/dmaengine.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/dmaengine.h' line='283' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_device' size-in-bits='2368' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='734' column='1' id='type-id-4323'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chancnt' type-id='type-id-5' visibility='default' filepath='include/linux/dmaengine.h' line='736' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='privatecnt' type-id='type-id-5' visibility='default' filepath='include/linux/dmaengine.h' line='737' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='channels' type-id='type-id-20' visibility='default' filepath='include/linux/dmaengine.h' line='738' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='global_node' type-id='type-id-20' visibility='default' filepath='include/linux/dmaengine.h' line='739' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='filter' type-id='type-id-4324' visibility='default' filepath='include/linux/dmaengine.h' line='740' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='cap_mask' type-id='type-id-4325' visibility='default' filepath='include/linux/dmaengine.h' line='741' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='max_xor' type-id='type-id-312' visibility='default' filepath='include/linux/dmaengine.h' line='742' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='592'>
+          <var-decl name='max_pq' type-id='type-id-312' visibility='default' filepath='include/linux/dmaengine.h' line='743' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='copy_align' type-id='type-id-4326' visibility='default' filepath='include/linux/dmaengine.h' line='744' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='xor_align' type-id='type-id-4326' visibility='default' filepath='include/linux/dmaengine.h' line='745' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='pq_align' type-id='type-id-4326' visibility='default' filepath='include/linux/dmaengine.h' line='746' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='fill_align' type-id='type-id-4326' visibility='default' filepath='include/linux/dmaengine.h' line='747' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='dev_id' type-id='type-id-17' visibility='default' filepath='include/linux/dmaengine.h' line='750' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/dmaengine.h' line='751' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='src_addr_widths' type-id='type-id-7' visibility='default' filepath='include/linux/dmaengine.h' line='753' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='dst_addr_widths' type-id='type-id-7' visibility='default' filepath='include/linux/dmaengine.h' line='754' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='directions' type-id='type-id-7' visibility='default' filepath='include/linux/dmaengine.h' line='755' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='max_burst' type-id='type-id-7' visibility='default' filepath='include/linux/dmaengine.h' line='756' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='descriptor_reuse' type-id='type-id-33' visibility='default' filepath='include/linux/dmaengine.h' line='757' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='residue_granularity' type-id='type-id-4327' visibility='default' filepath='include/linux/dmaengine.h' line='758' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='device_alloc_chan_resources' type-id='type-id-4328' visibility='default' filepath='include/linux/dmaengine.h' line='760' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='device_free_chan_resources' type-id='type-id-4329' visibility='default' filepath='include/linux/dmaengine.h' line='761' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='device_prep_dma_memcpy' type-id='type-id-4330' visibility='default' filepath='include/linux/dmaengine.h' line='763' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='device_prep_dma_xor' type-id='type-id-4331' visibility='default' filepath='include/linux/dmaengine.h' line='766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='device_prep_dma_xor_val' type-id='type-id-4332' visibility='default' filepath='include/linux/dmaengine.h' line='769' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='device_prep_dma_pq' type-id='type-id-4333' visibility='default' filepath='include/linux/dmaengine.h' line='772' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='device_prep_dma_pq_val' type-id='type-id-4334' visibility='default' filepath='include/linux/dmaengine.h' line='776' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='device_prep_dma_memset' type-id='type-id-4335' visibility='default' filepath='include/linux/dmaengine.h' line='780' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='device_prep_dma_memset_sg' type-id='type-id-4336' visibility='default' filepath='include/linux/dmaengine.h' line='783' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='device_prep_dma_interrupt' type-id='type-id-4337' visibility='default' filepath='include/linux/dmaengine.h' line='786' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='device_prep_slave_sg' type-id='type-id-4338' visibility='default' filepath='include/linux/dmaengine.h' line='789' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='device_prep_dma_cyclic' type-id='type-id-4339' visibility='default' filepath='include/linux/dmaengine.h' line='793' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='device_prep_interleaved_dma' type-id='type-id-4340' visibility='default' filepath='include/linux/dmaengine.h' line='797' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='device_prep_dma_imm_data' type-id='type-id-4341' visibility='default' filepath='include/linux/dmaengine.h' line='800' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='device_config' type-id='type-id-4342' visibility='default' filepath='include/linux/dmaengine.h' line='804' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='device_pause' type-id='type-id-4328' visibility='default' filepath='include/linux/dmaengine.h' line='806' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='device_resume' type-id='type-id-4328' visibility='default' filepath='include/linux/dmaengine.h' line='807' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='device_terminate_all' type-id='type-id-4328' visibility='default' filepath='include/linux/dmaengine.h' line='808' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='device_synchronize' type-id='type-id-4329' visibility='default' filepath='include/linux/dmaengine.h' line='809' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='device_tx_status' type-id='type-id-4343' visibility='default' filepath='include/linux/dmaengine.h' line='811' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='device_issue_pending' type-id='type-id-4329' visibility='default' filepath='include/linux/dmaengine.h' line='814' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_filter' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='667' column='1' id='type-id-4324'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fn' type-id='type-id-4314' visibility='default' filepath='include/linux/dmaengine.h' line='668' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mapcnt' type-id='type-id-17' visibility='default' filepath='include/linux/dmaengine.h' line='669' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='map' type-id='type-id-4344' visibility='default' filepath='include/linux/dmaengine.h' line='670' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='dma_filter_fn' type-id='type-id-4345' filepath='include/linux/dmaengine.h' line='456' column='1' id='type-id-4314'/>
+      <class-decl name='dma_slave_map' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='654' column='1' id='type-id-4346'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='devname' type-id='type-id-4' visibility='default' filepath='include/linux/dmaengine.h' line='655' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='slave' type-id='type-id-4' visibility='default' filepath='include/linux/dmaengine.h' line='656' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='param' type-id='type-id-15' visibility='default' filepath='include/linux/dmaengine.h' line='657' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='dma_cap_mask_t' type-id='type-id-4347' filepath='include/linux/dmaengine.h' line='226' column='1' id='type-id-4325'/>
+      <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-4325' visibility='default' filepath='include/linux/dmaengine.h' line='226' column='1' id='type-id-4347'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bits' type-id='type-id-491' visibility='default' filepath='include/linux/dmaengine.h' line='226' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='dmaengine_alignment' filepath='include/linux/dmaengine.h' line='637' column='1' id='type-id-4326'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DMAENGINE_ALIGN_1_BYTE' value='0'/>
+        <enumerator name='DMAENGINE_ALIGN_2_BYTES' value='1'/>
+        <enumerator name='DMAENGINE_ALIGN_4_BYTES' value='2'/>
+        <enumerator name='DMAENGINE_ALIGN_8_BYTES' value='3'/>
+        <enumerator name='DMAENGINE_ALIGN_16_BYTES' value='4'/>
+        <enumerator name='DMAENGINE_ALIGN_32_BYTES' value='5'/>
+        <enumerator name='DMAENGINE_ALIGN_64_BYTES' value='6'/>
+      </enum-decl>
+      <enum-decl name='dma_residue_granularity' filepath='include/linux/dmaengine.h' line='401' column='1' id='type-id-4327'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DMA_RESIDUE_GRANULARITY_DESCRIPTOR' value='0'/>
+        <enumerator name='DMA_RESIDUE_GRANULARITY_SEGMENT' value='1'/>
+        <enumerator name='DMA_RESIDUE_GRANULARITY_BURST' value='2'/>
+      </enum-decl>
+      <class-decl name='dma_async_tx_descriptor' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='508' column='1' id='type-id-4348'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cookie' type-id='type-id-4317' visibility='default' filepath='include/linux/dmaengine.h' line='509' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='flags' type-id='type-id-4349' visibility='default' filepath='include/linux/dmaengine.h' line='510' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='phys' type-id='type-id-2081' visibility='default' filepath='include/linux/dmaengine.h' line='511' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='chan' type-id='type-id-4316' visibility='default' filepath='include/linux/dmaengine.h' line='512' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tx_submit' type-id='type-id-4350' visibility='default' filepath='include/linux/dmaengine.h' line='513' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='desc_free' type-id='type-id-4351' visibility='default' filepath='include/linux/dmaengine.h' line='514' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='callback' type-id='type-id-4352' visibility='default' filepath='include/linux/dmaengine.h' line='515' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='callback_result' type-id='type-id-4353' visibility='default' filepath='include/linux/dmaengine.h' line='516' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='callback_param' type-id='type-id-15' visibility='default' filepath='include/linux/dmaengine.h' line='517' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='unmap' type-id='type-id-4354' visibility='default' filepath='include/linux/dmaengine.h' line='518' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='dma_cookie_t' type-id='type-id-738' filepath='include/linux/dmaengine.h' line='34' column='1' id='type-id-4317'/>
+      <enum-decl name='dma_ctrl_flags' filepath='include/linux/dmaengine.h' line='192' column='1' id='type-id-4349'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DMA_PREP_INTERRUPT' value='1'/>
+        <enumerator name='DMA_CTRL_ACK' value='2'/>
+        <enumerator name='DMA_PREP_PQ_DISABLE_P' value='4'/>
+        <enumerator name='DMA_PREP_PQ_DISABLE_Q' value='8'/>
+        <enumerator name='DMA_PREP_CONTINUE' value='16'/>
+        <enumerator name='DMA_PREP_FENCE' value='32'/>
+        <enumerator name='DMA_CTRL_REUSE' value='64'/>
+        <enumerator name='DMA_PREP_CMD' value='128'/>
+      </enum-decl>
+      <typedef-decl name='dma_async_tx_callback' type-id='type-id-517' filepath='include/linux/dmaengine.h' line='458' column='1' id='type-id-4352'/>
+      <typedef-decl name='dma_async_tx_callback_result' type-id='type-id-4355' filepath='include/linux/dmaengine.h' line='472' column='1' id='type-id-4353'/>
+      <class-decl name='dmaengine_result' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='467' column='1' id='type-id-4356'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='result' type-id='type-id-4357' visibility='default' filepath='include/linux/dmaengine.h' line='468' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='residue' type-id='type-id-7' visibility='default' filepath='include/linux/dmaengine.h' line='469' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='dmaengine_tx_result' filepath='include/linux/dmaengine.h' line='460' column='1' id='type-id-4357'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DMA_TRANS_NOERROR' value='0'/>
+        <enumerator name='DMA_TRANS_READ_FAILED' value='1'/>
+        <enumerator name='DMA_TRANS_WRITE_FAILED' value='2'/>
+        <enumerator name='DMA_TRANS_ABORTED' value='3'/>
+      </enum-decl>
+      <class-decl name='dmaengine_unmap_data' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='475' column='1' id='type-id-4358'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='map_cnt' type-id='type-id-214' visibility='default' filepath='include/linux/dmaengine.h' line='479' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='to_cnt' type-id='type-id-214' visibility='default' filepath='include/linux/dmaengine.h' line='481' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='from_cnt' type-id='type-id-214' visibility='default' filepath='include/linux/dmaengine.h' line='482' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='bidi_cnt' type-id='type-id-214' visibility='default' filepath='include/linux/dmaengine.h' line='483' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/dmaengine.h' line='484' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='kref' type-id='type-id-239' visibility='default' filepath='include/linux/dmaengine.h' line='485' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='len' type-id='type-id-84' visibility='default' filepath='include/linux/dmaengine.h' line='486' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='addr' type-id='type-id-4266' visibility='default' filepath='include/linux/dmaengine.h' line='487' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='sum_check_flags' filepath='include/linux/dmaengine.h' line='216' column='1' id='type-id-4359'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='SUM_CHECK_P_RESULT' value='1'/>
+        <enumerator name='SUM_CHECK_Q_RESULT' value='2'/>
+      </enum-decl>
+      <enum-decl name='dma_transfer_direction' filepath='include/linux/dmaengine.h' line='87' column='1' id='type-id-4360'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DMA_MEM_TO_MEM' value='0'/>
+        <enumerator name='DMA_MEM_TO_DEV' value='1'/>
+        <enumerator name='DMA_DEV_TO_MEM' value='2'/>
+        <enumerator name='DMA_DEV_TO_DEV' value='3'/>
+        <enumerator name='DMA_TRANS_NONE' value='4'/>
+      </enum-decl>
+      <class-decl name='dma_interleaved_template' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='158' column='1' id='type-id-4361'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='src_start' type-id='type-id-2081' visibility='default' filepath='include/linux/dmaengine.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dst_start' type-id='type-id-2081' visibility='default' filepath='include/linux/dmaengine.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dir' type-id='type-id-4360' visibility='default' filepath='include/linux/dmaengine.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='src_inc' type-id='type-id-33' visibility='default' filepath='include/linux/dmaengine.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='168'>
+          <var-decl name='dst_inc' type-id='type-id-33' visibility='default' filepath='include/linux/dmaengine.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='176'>
+          <var-decl name='src_sgl' type-id='type-id-33' visibility='default' filepath='include/linux/dmaengine.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='184'>
+          <var-decl name='dst_sgl' type-id='type-id-33' visibility='default' filepath='include/linux/dmaengine.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='numf' type-id='type-id-84' visibility='default' filepath='include/linux/dmaengine.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='frame_size' type-id='type-id-84' visibility='default' filepath='include/linux/dmaengine.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='sgl' type-id='type-id-4265' visibility='default' filepath='include/linux/dmaengine.h' line='168' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='data_chunk' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='133' column='1' id='type-id-4264'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='size' type-id='type-id-84' visibility='default' filepath='include/linux/dmaengine.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='icg' type-id='type-id-84' visibility='default' filepath='include/linux/dmaengine.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dst_icg' type-id='type-id-84' visibility='default' filepath='include/linux/dmaengine.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='src_icg' type-id='type-id-84' visibility='default' filepath='include/linux/dmaengine.h' line='137' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_slave_config' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='367' column='1' id='type-id-4315'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='direction' type-id='type-id-4360' visibility='default' filepath='include/linux/dmaengine.h' line='368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='src_addr' type-id='type-id-99' visibility='default' filepath='include/linux/dmaengine.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dst_addr' type-id='type-id-99' visibility='default' filepath='include/linux/dmaengine.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='src_addr_width' type-id='type-id-4362' visibility='default' filepath='include/linux/dmaengine.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='dst_addr_width' type-id='type-id-4362' visibility='default' filepath='include/linux/dmaengine.h' line='372' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='src_maxburst' type-id='type-id-7' visibility='default' filepath='include/linux/dmaengine.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='dst_maxburst' type-id='type-id-7' visibility='default' filepath='include/linux/dmaengine.h' line='374' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='src_port_window_size' type-id='type-id-7' visibility='default' filepath='include/linux/dmaengine.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='dst_port_window_size' type-id='type-id-7' visibility='default' filepath='include/linux/dmaengine.h' line='376' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='device_fc' type-id='type-id-33' visibility='default' filepath='include/linux/dmaengine.h' line='377' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='slave_id' type-id='type-id-5' visibility='default' filepath='include/linux/dmaengine.h' line='378' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='dma_slave_buswidth' filepath='include/linux/dmaengine.h' line='304' column='1' id='type-id-4362'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DMA_SLAVE_BUSWIDTH_UNDEFINED' value='0'/>
+        <enumerator name='DMA_SLAVE_BUSWIDTH_1_BYTE' value='1'/>
+        <enumerator name='DMA_SLAVE_BUSWIDTH_2_BYTES' value='2'/>
+        <enumerator name='DMA_SLAVE_BUSWIDTH_3_BYTES' value='3'/>
+        <enumerator name='DMA_SLAVE_BUSWIDTH_4_BYTES' value='4'/>
+        <enumerator name='DMA_SLAVE_BUSWIDTH_8_BYTES' value='8'/>
+        <enumerator name='DMA_SLAVE_BUSWIDTH_16_BYTES' value='16'/>
+        <enumerator name='DMA_SLAVE_BUSWIDTH_32_BYTES' value='32'/>
+        <enumerator name='DMA_SLAVE_BUSWIDTH_64_BYTES' value='64'/>
+      </enum-decl>
+      <enum-decl name='dma_status' filepath='include/linux/dmaengine.h' line='49' column='1' id='type-id-4363'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DMA_COMPLETE' value='0'/>
+        <enumerator name='DMA_IN_PROGRESS' value='1'/>
+        <enumerator name='DMA_PAUSED' value='2'/>
+        <enumerator name='DMA_ERROR' value='3'/>
+      </enum-decl>
+      <class-decl name='dma_tx_state' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='627' column='1' id='type-id-4364'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='last' type-id='type-id-4317' visibility='default' filepath='include/linux/dmaengine.h' line='628' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='used' type-id='type-id-4317' visibility='default' filepath='include/linux/dmaengine.h' line='629' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='residue' type-id='type-id-7' visibility='default' filepath='include/linux/dmaengine.h' line='630' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_chan_dev' size-in-bits='6400' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='293' column='1' id='type-id-4365'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chan' type-id='type-id-4316' visibility='default' filepath='include/linux/dmaengine.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='device' type-id='type-id-388' visibility='default' filepath='include/linux/dmaengine.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='dev_id' type-id='type-id-17' visibility='default' filepath='include/linux/dmaengine.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='idr_ref' type-id='type-id-3909' visibility='default' filepath='include/linux/dmaengine.h' line='297' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_chan_percpu' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='234' column='1' id='type-id-4366'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='memcpy_count' type-id='type-id-16' visibility='default' filepath='include/linux/dmaengine.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bytes_transferred' type-id='type-id-16' visibility='default' filepath='include/linux/dmaengine.h' line='237' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_router' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/dmaengine.h' line='245' column='1' id='type-id-4367'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/dmaengine.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='route_free' type-id='type-id-4368' visibility='default' filepath='include/linux/dmaengine.h' line='247' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='uart_8250_ops' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/serial_8250.h' line='77' column='1' id='type-id-4369'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='setup_irq' type-id='type-id-4272' visibility='default' filepath='include/linux/serial_8250.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='release_irq' type-id='type-id-4370' visibility='default' filepath='include/linux/serial_8250.h' line='79' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='uart_8250_em485' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/linux/serial_8250.h' line='82' column='1' id='type-id-4371'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start_tx_timer' type-id='type-id-681' visibility='default' filepath='include/linux/serial_8250.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='stop_tx_timer' type-id='type-id-681' visibility='default' filepath='include/linux/serial_8250.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='active_timer' type-id='type-id-1556' visibility='default' filepath='include/linux/serial_8250.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='port' type-id='type-id-4372' visibility='default' filepath='include/linux/serial_8250.h' line='86' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-2033' size-in-bits='64' id='type-id-4293'/>
+      <pointer-type-def type-id='type-id-4300' size-in-bits='64' id='type-id-4289'/>
+      <pointer-type-def type-id='type-id-4373' size-in-bits='64' id='type-id-4309'/>
+      <qualified-type-def type-id='type-id-4346' const='yes' id='type-id-4374'/>
+      <pointer-type-def type-id='type-id-4374' size-in-bits='64' id='type-id-4344'/>
+      <qualified-type-def type-id='type-id-4356' const='yes' id='type-id-4375'/>
+      <pointer-type-def type-id='type-id-4375' size-in-bits='64' id='type-id-4376'/>
+      <qualified-type-def type-id='type-id-4369' const='yes' id='type-id-4377'/>
+      <pointer-type-def type-id='type-id-4377' size-in-bits='64' id='type-id-4271'/>
+      <qualified-type-def type-id='type-id-4306' const='yes' id='type-id-4378'/>
+      <pointer-type-def type-id='type-id-4378' size-in-bits='64' id='type-id-4292'/>
+      <pointer-type-def type-id='type-id-4348' size-in-bits='64' id='type-id-4379'/>
+      <pointer-type-def type-id='type-id-4380' size-in-bits='64' id='type-id-4334'/>
+      <pointer-type-def type-id='type-id-4381' size-in-bits='64' id='type-id-4333'/>
+      <pointer-type-def type-id='type-id-4382' size-in-bits='64' id='type-id-4332'/>
+      <pointer-type-def type-id='type-id-4383' size-in-bits='64' id='type-id-4340'/>
+      <pointer-type-def type-id='type-id-4384' size-in-bits='64' id='type-id-4338'/>
+      <pointer-type-def type-id='type-id-4385' size-in-bits='64' id='type-id-4336'/>
+      <pointer-type-def type-id='type-id-4386' size-in-bits='64' id='type-id-4331'/>
+      <pointer-type-def type-id='type-id-4387' size-in-bits='64' id='type-id-4335'/>
+      <pointer-type-def type-id='type-id-4388' size-in-bits='64' id='type-id-4330'/>
+      <pointer-type-def type-id='type-id-4389' size-in-bits='64' id='type-id-4339'/>
+      <pointer-type-def type-id='type-id-4390' size-in-bits='64' id='type-id-4341'/>
+      <pointer-type-def type-id='type-id-4391' size-in-bits='64' id='type-id-4337'/>
+      <pointer-type-def type-id='type-id-4318' size-in-bits='64' id='type-id-4316'/>
+      <pointer-type-def type-id='type-id-4365' size-in-bits='64' id='type-id-4320'/>
+      <pointer-type-def type-id='type-id-4366' size-in-bits='64' id='type-id-4321'/>
+      <pointer-type-def type-id='type-id-4323' size-in-bits='64' id='type-id-4319'/>
+      <pointer-type-def type-id='type-id-4361' size-in-bits='64' id='type-id-4392'/>
+      <pointer-type-def type-id='type-id-4367' size-in-bits='64' id='type-id-4322'/>
+      <pointer-type-def type-id='type-id-4315' size-in-bits='64' id='type-id-4393'/>
+      <pointer-type-def type-id='type-id-4364' size-in-bits='64' id='type-id-4394'/>
+      <pointer-type-def type-id='type-id-4358' size-in-bits='64' id='type-id-4354'/>
+      <pointer-type-def type-id='type-id-4395' size-in-bits='64' id='type-id-4343'/>
+      <pointer-type-def type-id='type-id-4396' size-in-bits='64' id='type-id-4304'/>
+      <pointer-type-def type-id='type-id-4397' size-in-bits='64' id='type-id-4305'/>
+      <pointer-type-def type-id='type-id-4398' size-in-bits='64' id='type-id-4302'/>
+      <pointer-type-def type-id='type-id-4399' size-in-bits='64' id='type-id-4351'/>
+      <pointer-type-def type-id='type-id-4400' size-in-bits='64' id='type-id-4328'/>
+      <pointer-type-def type-id='type-id-4401' size-in-bits='64' id='type-id-4342'/>
+      <pointer-type-def type-id='type-id-4402' size-in-bits='64' id='type-id-4272'/>
+      <pointer-type-def type-id='type-id-4403' size-in-bits='64' id='type-id-4283'/>
+      <pointer-type-def type-id='type-id-4404' size-in-bits='64' id='type-id-4286'/>
+      <pointer-type-def type-id='type-id-4405' size-in-bits='64' id='type-id-4310'/>
+      <pointer-type-def type-id='type-id-4406' size-in-bits='64' id='type-id-4311'/>
+      <pointer-type-def type-id='type-id-4294' size-in-bits='64' id='type-id-4407'/>
+      <pointer-type-def type-id='type-id-4312' size-in-bits='64' id='type-id-4408'/>
+      <pointer-type-def type-id='type-id-4359' size-in-bits='64' id='type-id-4409'/>
+      <pointer-type-def type-id='type-id-4410' size-in-bits='64' id='type-id-4303'/>
+      <pointer-type-def type-id='type-id-4411' size-in-bits='64' id='type-id-4345'/>
+      <pointer-type-def type-id='type-id-4412' size-in-bits='64' id='type-id-4350'/>
+      <pointer-type-def type-id='type-id-4313' size-in-bits='64' id='type-id-4270'/>
+      <pointer-type-def type-id='type-id-4371' size-in-bits='64' id='type-id-4274'/>
+      <pointer-type-def type-id='type-id-4268' size-in-bits='64' id='type-id-4372'/>
+      <pointer-type-def type-id='type-id-4269' size-in-bits='64' id='type-id-4298'/>
+      <pointer-type-def type-id='type-id-4295' size-in-bits='64' id='type-id-4287'/>
+      <pointer-type-def type-id='type-id-4413' size-in-bits='64' id='type-id-4279'/>
+      <pointer-type-def type-id='type-id-4414' size-in-bits='64' id='type-id-4275'/>
+      <pointer-type-def type-id='type-id-4415' size-in-bits='64' id='type-id-4281'/>
+      <pointer-type-def type-id='type-id-4416' size-in-bits='64' id='type-id-4301'/>
+      <pointer-type-def type-id='type-id-4417' size-in-bits='64' id='type-id-4368'/>
+      <pointer-type-def type-id='type-id-4418' size-in-bits='64' id='type-id-4329'/>
+      <pointer-type-def type-id='type-id-4419' size-in-bits='64' id='type-id-4370'/>
+      <pointer-type-def type-id='type-id-4420' size-in-bits='64' id='type-id-4273'/>
+      <pointer-type-def type-id='type-id-4421' size-in-bits='64' id='type-id-4284'/>
+      <pointer-type-def type-id='type-id-4422' size-in-bits='64' id='type-id-4307'/>
+      <pointer-type-def type-id='type-id-4423' size-in-bits='64' id='type-id-4308'/>
+      <pointer-type-def type-id='type-id-4424' size-in-bits='64' id='type-id-4276'/>
+      <pointer-type-def type-id='type-id-4425' size-in-bits='64' id='type-id-4278'/>
+      <pointer-type-def type-id='type-id-4426' size-in-bits='64' id='type-id-4277'/>
+      <pointer-type-def type-id='type-id-4427' size-in-bits='64' id='type-id-4280'/>
+      <pointer-type-def type-id='type-id-4428' size-in-bits='64' id='type-id-4285'/>
+      <pointer-type-def type-id='type-id-4429' size-in-bits='64' id='type-id-4282'/>
+      <pointer-type-def type-id='type-id-4430' size-in-bits='64' id='type-id-4355'/>
+      <function-decl name='serial8250_get_port' mangled-name='serial8250_get_port' filepath='drivers/tty/serial/8250/8250_core.c' line='415' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='serial8250_get_port'>
+        <parameter type-id='type-id-17' name='line' filepath='drivers/tty/serial/8250/8250_core.c' line='415' column='1'/>
+        <return type-id='type-id-4372'/>
+      </function-decl>
+      <function-decl name='serial8250_suspend_port' mangled-name='serial8250_suspend_port' filepath='drivers/tty/serial/8250/8250_core.c' line='752' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='serial8250_suspend_port'>
+        <parameter type-id='type-id-17' name='line' filepath='drivers/tty/serial/8250/8250_core.c' line='752' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='serial8250_resume_port' mangled-name='serial8250_resume_port' filepath='drivers/tty/serial/8250/8250_core.c' line='775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='serial8250_resume_port'>
+        <parameter type-id='type-id-17' name='line' filepath='drivers/tty/serial/8250/8250_core.c' line='775' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='serial8250_register_8250_port' mangled-name='serial8250_register_8250_port' filepath='drivers/tty/serial/8250/8250_core.c' line='977' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='serial8250_register_8250_port'>
+        <parameter type-id='type-id-4372' name='up' filepath='drivers/tty/serial/8250/8250_core.c' line='977' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='serial8250_unregister_port' mangled-name='serial8250_unregister_port' filepath='drivers/tty/serial/8250/8250_core.c' line='1102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='serial8250_unregister_port'>
+        <parameter type-id='type-id-17' name='line' filepath='drivers/tty/serial/8250/8250_core.c' line='1102' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-4373'>
+        <parameter type-id='type-id-4298'/>
+        <return type-id='type-id-4'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4380'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-2741'/>
+        <parameter type-id='type-id-2741'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-878'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-4409'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4381'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-2741'/>
+        <parameter type-id='type-id-2741'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-878'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4382'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-2741'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-4409'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4383'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-4392'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4384'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-918'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-4360'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4385'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-918'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4386'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-2741'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4387'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4388'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4389'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-4360'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4390'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-2081'/>
+        <parameter type-id='type-id-40'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4391'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-4379'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4395'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-4317'/>
+        <parameter type-id='type-id-4394'/>
+        <return type-id='type-id-4363'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4396'>
+        <parameter type-id='type-id-4289'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4397'>
+        <parameter type-id='type-id-4289'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4398'>
+        <parameter type-id='type-id-4289'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4399'>
+        <parameter type-id='type-id-4379'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4400'>
+        <parameter type-id='type-id-4316'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4401'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-4393'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4402'>
+        <parameter type-id='type-id-4372'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4403'>
+        <parameter type-id='type-id-4298'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4404'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-4407'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4405'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-4408'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4406'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4410'>
+        <parameter type-id='type-id-4289'/>
+        <parameter type-id='type-id-666'/>
+        <return type-id='type-id-241'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4411'>
+        <parameter type-id='type-id-4316'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4412'>
+        <parameter type-id='type-id-4379'/>
+        <return type-id='type-id-4317'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4413'>
+        <parameter type-id='type-id-4298'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4414'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4415'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-482'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4416'>
+        <parameter type-id='type-id-4289'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4417'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4418'>
+        <parameter type-id='type-id-4316'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4419'>
+        <parameter type-id='type-id-4372'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4420'>
+        <parameter type-id='type-id-4372'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4421'>
+        <parameter type-id='type-id-4298'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4422'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-1'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4423'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4424'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4425'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-821'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4426'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-821'/>
+        <parameter type-id='type-id-821'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4427'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4428'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4429'>
+        <parameter type-id='type-id-4298'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4430'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-4376'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/tty/serial/8250/8250_fsl.c' language='LANG_C89'>
+      <function-decl name='fsl8250_handle_irq' mangled-name='fsl8250_handle_irq' filepath='drivers/tty/serial/8250/8250_fsl.c' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fsl8250_handle_irq'>
+        <parameter type-id='type-id-4298' name='port' filepath='drivers/tty/serial/8250/8250_fsl.c' line='23' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/char/random.c' language='LANG_C89'>
+      <function-decl name='get_random_bytes' mangled-name='get_random_bytes' filepath='drivers/char/random.c' line='1646' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_random_bytes'>
+        <parameter type-id='type-id-15' name='buf' filepath='drivers/char/random.c' line='1646' column='1'/>
+        <parameter type-id='type-id-17' name='nbytes' filepath='drivers/char/random.c' line='1646' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/char/misc.c' language='LANG_C89'>
+      <class-decl name='miscdevice' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/miscdevice.h' line='65' column='1' id='type-id-4431'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='minor' type-id='type-id-17' visibility='default' filepath='include/linux/miscdevice.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/miscdevice.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fops' type-id='type-id-268' visibility='default' filepath='include/linux/miscdevice.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/miscdevice.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='parent' type-id='type-id-240' visibility='default' filepath='include/linux/miscdevice.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='this_device' type-id='type-id-240' visibility='default' filepath='include/linux/miscdevice.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='groups' type-id='type-id-665' visibility='default' filepath='include/linux/miscdevice.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='nodename' type-id='type-id-4' visibility='default' filepath='include/linux/miscdevice.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mode' type-id='type-id-329' visibility='default' filepath='include/linux/miscdevice.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-4431' size-in-bits='64' id='type-id-4432'/>
+      <function-decl name='misc_register' mangled-name='misc_register' filepath='drivers/char/misc.c' line='173' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='misc_register'>
+        <parameter type-id='type-id-4432' name='misc' filepath='drivers/char/misc.c' line='173' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='misc_deregister' mangled-name='misc_deregister' filepath='drivers/char/misc.c' line='238' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='misc_deregister'>
+        <parameter type-id='type-id-4432' name='misc' filepath='drivers/char/misc.c' line='238' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/char/hw_random/core.c' language='LANG_C89'>
+      <class-decl name='hwrng' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/hw_random.h' line='38' column='1' id='type-id-4433'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/hw_random.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='init' type-id='type-id-4434' visibility='default' filepath='include/linux/hw_random.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cleanup' type-id='type-id-4435' visibility='default' filepath='include/linux/hw_random.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='data_present' type-id='type-id-4436' visibility='default' filepath='include/linux/hw_random.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='data_read' type-id='type-id-4437' visibility='default' filepath='include/linux/hw_random.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='read' type-id='type-id-4438' visibility='default' filepath='include/linux/hw_random.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='priv' type-id='type-id-16' visibility='default' filepath='include/linux/hw_random.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='quality' type-id='type-id-312' visibility='default' filepath='include/linux/hw_random.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/hw_random.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='ref' type-id='type-id-239' visibility='default' filepath='include/linux/hw_random.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='cleanup_done' type-id='type-id-1606' visibility='default' filepath='include/linux/hw_random.h' line='51' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-4433' size-in-bits='64' id='type-id-4439'/>
+      <pointer-type-def type-id='type-id-4440' size-in-bits='64' id='type-id-4434'/>
+      <pointer-type-def type-id='type-id-4441' size-in-bits='64' id='type-id-4436'/>
+      <pointer-type-def type-id='type-id-4442' size-in-bits='64' id='type-id-4437'/>
+      <pointer-type-def type-id='type-id-4443' size-in-bits='64' id='type-id-4438'/>
+      <pointer-type-def type-id='type-id-4444' size-in-bits='64' id='type-id-4435'/>
+      <function-decl name='hwrng_register' mangled-name='hwrng_register' filepath='drivers/char/hw_random/core.c' line='457' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hwrng_register'>
+        <parameter type-id='type-id-4439' name='rng' filepath='drivers/char/hw_random/core.c' line='457' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='hwrng_unregister' mangled-name='hwrng_unregister' filepath='drivers/char/hw_random/core.c' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hwrng_unregister'>
+        <parameter type-id='type-id-4439' name='rng' filepath='drivers/char/hw_random/core.c' line='517' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-4440'>
+        <parameter type-id='type-id-4439' name='rng'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4441'>
+        <parameter type-id='type-id-4439'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4442'>
+        <parameter type-id='type-id-4439'/>
+        <parameter type-id='type-id-1565'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4443'>
+        <parameter type-id='type-id-4439'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4444'>
+        <parameter type-id='type-id-4439'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_modes.c' language='LANG_C89'>
+      <function-decl name='drm_mode_probed_add' mangled-name='drm_mode_probed_add' filepath='drivers/gpu/drm/drm_modes.c' line='110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_mode_probed_add'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_modes.c' line='110' column='1'/>
+        <parameter type-id='type-id-4446' name='mode' filepath='drivers/gpu/drm/drm_modes.c' line='111' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_cvt_mode' mangled-name='drm_cvt_mode' filepath='drivers/gpu/drm/drm_modes.c' line='143' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_cvt_mode'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_modes.c' line='143' column='1'/>
+        <parameter type-id='type-id-17' name='hdisplay' filepath='drivers/gpu/drm/drm_modes.c' line='143' column='1'/>
+        <parameter type-id='type-id-17' name='vdisplay' filepath='drivers/gpu/drm/drm_modes.c' line='144' column='1'/>
+        <parameter type-id='type-id-17' name='vrefresh' filepath='drivers/gpu/drm/drm_modes.c' line='144' column='1'/>
+        <parameter type-id='type-id-33' name='reduced' filepath='drivers/gpu/drm/drm_modes.c' line='145' column='1'/>
+        <parameter type-id='type-id-33' name='interlaced' filepath='drivers/gpu/drm/drm_modes.c' line='145' column='1'/>
+        <parameter type-id='type-id-33' name='margins' filepath='drivers/gpu/drm/drm_modes.c' line='145' column='1'/>
+        <return type-id='type-id-4446'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_probe_helper.c' language='LANG_C89'>
+
+
+      <array-type-def dimensions='1' type-id='type-id-108' size-in-bits='32' id='type-id-4448'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-511' size-in-bits='128' id='type-id-4449'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-100' size-in-bits='256' id='type-id-4450'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='112' id='type-id-4451'>
+        <subrange length='14' type-id='type-id-9' id='type-id-117'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-893' size-in-bits='32' id='type-id-4452'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-33' size-in-bits='16' id='type-id-4453'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='480' id='type-id-4454'>
+        <subrange length='60' type-id='type-id-9' id='type-id-4455'/>
+
+      </array-type-def>
+      <class-decl name='agp_bridge_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4456'/>
+      <class-decl name='dma_buf' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4457'/>
+      <class-decl name='dma_buf_attachment' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4458'/>
+      <class-decl name='drm_atomic_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4459'/>
+      <class-decl name='drm_crtc_commit' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4460'/>
+      <class-decl name='drm_device_dma' size-in-bits='7744' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4461'/>
+      <class-decl name='drm_gem_object' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4462'/>
+      <class-decl name='drm_local_map' size-in-bits='320' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4463'/>
+      <class-decl name='drm_master' size-in-bits='1792' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4464'/>
+      <class-decl name='drm_sg_mem' size-in-bits='320' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4465'/>
+      <class-decl name='drm_vma_offset_manager' size-in-bits='1920' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4466'/>
+      <class-decl name='drm_writeback_job' size-in-bits='512' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4467'/>
+      <class-decl name='reservation_object' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-4468'/>
+      <array-type-def dimensions='1' type-id='type-id-4469' size-in-bits='256' id='type-id-4470'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-4471' size-in-bits='1536' id='type-id-4472'>
+        <subrange length='24' type-id='type-id-9' id='type-id-3436'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='544' id='type-id-4473'>
+        <subrange length='17' type-id='type-id-9' id='type-id-4474'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1341' size-in-bits='320' id='type-id-4475'>
+        <subrange length='10' type-id='type-id-9' id='type-id-1189'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1341' size-in-bits='96' id='type-id-4476'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-2438' size-in-bits='1536' id='type-id-4477'>
+        <subrange length='24' type-id='type-id-9' id='type-id-3436'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-4478' size-in-bits='1024' id='type-id-4479'>
+        <subrange length='128' type-id='type-id-9' id='type-id-963'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='128' id='type-id-4480'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <class-decl name='drm_connector' size-in-bits='8448' is-struct='yes' visibility='default' filepath='include/drm/drm_connector.h' line='781' column='1' id='type-id-4481'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_connector.h' line='783' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='kdev' type-id='type-id-240' visibility='default' filepath='include/drm/drm_connector.h' line='785' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='attr' type-id='type-id-4044' visibility='default' filepath='include/drm/drm_connector.h' line='787' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/drm/drm_connector.h' line='797' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='base' type-id='type-id-4482' visibility='default' filepath='include/drm/drm_connector.h' line='800' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/drm/drm_connector.h' line='803' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/drm/drm_connector.h' line='810' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='index' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='818' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='connector_type' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='824' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='connector_type_id' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='826' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='interlace_allowed' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='832' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1000'>
+          <var-decl name='doublescan_allowed' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='838' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1008'>
+          <var-decl name='stereo_allowed' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='844' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1016'>
+          <var-decl name='ycbcr_420_allowed' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='852' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='registered' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='858' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='modes' type-id='type-id-20' visibility='default' filepath='include/drm/drm_connector.h' line='865' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='status' type-id='type-id-4483' visibility='default' filepath='include/drm/drm_connector.h' line='872' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='probed_modes' type-id='type-id-20' visibility='default' filepath='include/drm/drm_connector.h' line='880' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='display_info' type-id='type-id-4484' visibility='default' filepath='include/drm/drm_connector.h' line='891' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='funcs' type-id='type-id-4485' visibility='default' filepath='include/drm/drm_connector.h' line='894' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='edid_blob_ptr' type-id='type-id-4486' visibility='default' filepath='include/drm/drm_connector.h' line='901' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='properties' type-id='type-id-4487' visibility='default' filepath='include/drm/drm_connector.h' line='904' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='scaling_mode_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_connector.h' line='910' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5952'>
+          <var-decl name='content_protection_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_connector.h' line='916' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='path_blob_ptr' type-id='type-id-4486' visibility='default' filepath='include/drm/drm_connector.h' line='924' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='polled' type-id='type-id-4478' visibility='default' filepath='include/drm/drm_connector.h' line='951' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6112'>
+          <var-decl name='dpms' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='959' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='helper_private' type-id='type-id-4488' visibility='default' filepath='include/drm/drm_connector.h' line='962' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='cmdline_mode' type-id='type-id-4489' visibility='default' filepath='include/drm/drm_connector.h' line='965' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6432'>
+          <var-decl name='force' type-id='type-id-4490' visibility='default' filepath='include/drm/drm_connector.h' line='967' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='override_edid' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='969' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6496'>
+          <var-decl name='encoder_ids' type-id='type-id-4476' visibility='default' filepath='include/drm/drm_connector.h' line='976' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='encoder' type-id='type-id-4491' visibility='default' filepath='include/drm/drm_connector.h' line='984' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='eld' type-id='type-id-4479' visibility='default' filepath='include/drm/drm_connector.h' line='988' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7680'>
+          <var-decl name='latency_present' type-id='type-id-4453' visibility='default' filepath='include/drm/drm_connector.h' line='990' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7712'>
+          <var-decl name='video_latency' type-id='type-id-465' visibility='default' filepath='include/drm/drm_connector.h' line='995' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7776'>
+          <var-decl name='audio_latency' type-id='type-id-465' visibility='default' filepath='include/drm/drm_connector.h' line='1000' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7840'>
+          <var-decl name='null_edid_counter' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='1005' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7872'>
+          <var-decl name='bad_edid_counter' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='1008' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7904'>
+          <var-decl name='edid_corrupt' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='1015' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7936'>
+          <var-decl name='debugfs_entry' type-id='type-id-23' visibility='default' filepath='include/drm/drm_connector.h' line='1018' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8000'>
+          <var-decl name='state' type-id='type-id-4492' visibility='default' filepath='include/drm/drm_connector.h' line='1034' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8064'>
+          <var-decl name='tile_blob_ptr' type-id='type-id-4486' visibility='default' filepath='include/drm/drm_connector.h' line='1051' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8128'>
+          <var-decl name='has_tile' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='1054' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8192'>
+          <var-decl name='tile_group' type-id='type-id-4493' visibility='default' filepath='include/drm/drm_connector.h' line='1056' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8256'>
+          <var-decl name='tile_is_single_monitor' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='1058' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8264'>
+          <var-decl name='num_h_tile' type-id='type-id-4478' visibility='default' filepath='include/drm/drm_connector.h' line='1062' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8272'>
+          <var-decl name='num_v_tile' type-id='type-id-4478' visibility='default' filepath='include/drm/drm_connector.h' line='1062' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8280'>
+          <var-decl name='tile_h_loc' type-id='type-id-4478' visibility='default' filepath='include/drm/drm_connector.h' line='1065' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8288'>
+          <var-decl name='tile_v_loc' type-id='type-id-4478' visibility='default' filepath='include/drm/drm_connector.h' line='1065' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8304'>
+          <var-decl name='tile_h_size' type-id='type-id-4494' visibility='default' filepath='include/drm/drm_connector.h' line='1068' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8320'>
+          <var-decl name='tile_v_size' type-id='type-id-4494' visibility='default' filepath='include/drm/drm_connector.h' line='1068' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8384'>
+          <var-decl name='free_node' type-id='type-id-281' visibility='default' filepath='include/drm/drm_connector.h' line='1077' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_device' size-in-bits='13312' is-struct='yes' visibility='default' filepath='include/drm/drm_device.h' line='31' column='1' id='type-id-4495'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='legacy_dev_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_device.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='if_version' type-id='type-id-17' visibility='default' filepath='include/drm/drm_device.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='ref' type-id='type-id-239' visibility='default' filepath='include/drm/drm_device.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/drm/drm_device.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='driver' type-id='type-id-4496' visibility='default' filepath='include/drm/drm_device.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dev_private' type-id='type-id-15' visibility='default' filepath='include/drm/drm_device.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='primary' type-id='type-id-4497' visibility='default' filepath='include/drm/drm_device.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='render' type-id='type-id-4497' visibility='default' filepath='include/drm/drm_device.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='registered' type-id='type-id-33' visibility='default' filepath='include/drm/drm_device.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='master' type-id='type-id-4498' visibility='default' filepath='include/drm/drm_device.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='unplugged' type-id='type-id-33' visibility='default' filepath='include/drm/drm_device.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='anon_inode' type-id='type-id-1127' visibility='default' filepath='include/drm/drm_device.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='unique' type-id='type-id-2' visibility='default' filepath='include/drm/drm_device.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='struct_mutex' type-id='type-id-245' visibility='default' filepath='include/drm/drm_device.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='master_mutex' type-id='type-id-245' visibility='default' filepath='include/drm/drm_device.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='open_count' type-id='type-id-17' visibility='default' filepath='include/drm/drm_device.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='buf_lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_device.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='buf_use' type-id='type-id-17' visibility='default' filepath='include/drm/drm_device.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1440'>
+          <var-decl name='buf_alloc' type-id='type-id-26' visibility='default' filepath='include/drm/drm_device.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='filelist_mutex' type-id='type-id-245' visibility='default' filepath='include/drm/drm_device.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='filelist' type-id='type-id-20' visibility='default' filepath='include/drm/drm_device.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='filelist_internal' type-id='type-id-20' visibility='default' filepath='include/drm/drm_device.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='clientlist_mutex' type-id='type-id-245' visibility='default' filepath='include/drm/drm_device.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='clientlist' type-id='type-id-20' visibility='default' filepath='include/drm/drm_device.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='maplist' type-id='type-id-20' visibility='default' filepath='include/drm/drm_device.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='map_hash' type-id='type-id-4499' visibility='default' filepath='include/drm/drm_device.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='ctxlist' type-id='type-id-20' visibility='default' filepath='include/drm/drm_device.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='ctxlist_mutex' type-id='type-id-245' visibility='default' filepath='include/drm/drm_device.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='ctx_idr' type-id='type-id-1432' visibility='default' filepath='include/drm/drm_device.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='vmalist' type-id='type-id-20' visibility='default' filepath='include/drm/drm_device.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='dma' type-id='type-id-4500' visibility='default' filepath='include/drm/drm_device.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='context_flag' type-id='type-id-1495' visibility='default' filepath='include/drm/drm_device.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='last_context' type-id='type-id-17' visibility='default' filepath='include/drm/drm_device.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3488'>
+          <var-decl name='irq_enabled' type-id='type-id-33' visibility='default' filepath='include/drm/drm_device.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='irq' type-id='type-id-17' visibility='default' filepath='include/drm/drm_device.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3552'>
+          <var-decl name='vblank_disable_immediate' type-id='type-id-33' visibility='default' filepath='include/drm/drm_device.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='vblank' type-id='type-id-4501' visibility='default' filepath='include/drm/drm_device.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='vblank_time_lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_device.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3680'>
+          <var-decl name='vbl_lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_device.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='max_vblank_count' type-id='type-id-7' visibility='default' filepath='include/drm/drm_device.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='vblank_event_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_device.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3904'>
+          <var-decl name='event_lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_device.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='agp' type-id='type-id-4502' visibility='default' filepath='include/drm/drm_device.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='pdev' type-id='type-id-3933' visibility='default' filepath='include/drm/drm_device.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='sg' type-id='type-id-4503' visibility='default' filepath='include/drm/drm_device.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='num_crtcs' type-id='type-id-5' visibility='default' filepath='include/drm/drm_device.h' line='203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='sigdata' type-id='type-id-4504' visibility='default' filepath='include/drm/drm_device.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='agp_buffer_map' type-id='type-id-4505' visibility='default' filepath='include/drm/drm_device.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='agp_buffer_token' type-id='type-id-5' visibility='default' filepath='include/drm/drm_device.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='mode_config' type-id='type-id-4506' visibility='default' filepath='include/drm/drm_device.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12672'>
+          <var-decl name='object_name_lock' type-id='type-id-245' visibility='default' filepath='include/drm/drm_device.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12928'>
+          <var-decl name='object_name_idr' type-id='type-id-1432' visibility='default' filepath='include/drm/drm_device.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13120'>
+          <var-decl name='vma_offset_manager' type-id='type-id-4507' visibility='default' filepath='include/drm/drm_device.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13184'>
+          <var-decl name='switch_power_state' type-id='type-id-17' visibility='default' filepath='include/drm/drm_device.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13248'>
+          <var-decl name='fb_helper' type-id='type-id-4508' visibility='default' filepath='include/drm/drm_device.h' line='229' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_driver' size-in-bits='3776' is-struct='yes' visibility='default' filepath='include/drm/drm_drv.h' line='70' column='1' id='type-id-4509'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='load' type-id='type-id-4510' visibility='default' filepath='include/drm/drm_drv.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='open' type-id='type-id-4511' visibility='default' filepath='include/drm/drm_drv.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='postclose' type-id='type-id-4512' visibility='default' filepath='include/drm/drm_drv.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='lastclose' type-id='type-id-4513' visibility='default' filepath='include/drm/drm_drv.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='unload' type-id='type-id-4513' visibility='default' filepath='include/drm/drm_drv.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='release' type-id='type-id-4513' visibility='default' filepath='include/drm/drm_drv.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='get_vblank_counter' type-id='type-id-4514' visibility='default' filepath='include/drm/drm_drv.h' line='200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='enable_vblank' type-id='type-id-4515' visibility='default' filepath='include/drm/drm_drv.h' line='216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='disable_vblank' type-id='type-id-4516' visibility='default' filepath='include/drm/drm_drv.h' line='227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='get_scanout_position' type-id='type-id-4517' visibility='default' filepath='include/drm/drm_drv.h' line='279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='get_vblank_timestamp' type-id='type-id-4518' visibility='default' filepath='include/drm/drm_drv.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='irq_handler' type-id='type-id-3481' visibility='default' filepath='include/drm/drm_drv.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='irq_preinstall' type-id='type-id-4513' visibility='default' filepath='include/drm/drm_drv.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='irq_postinstall' type-id='type-id-4519' visibility='default' filepath='include/drm/drm_drv.h' line='357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='irq_uninstall' type-id='type-id-4513' visibility='default' filepath='include/drm/drm_drv.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='master_create' type-id='type-id-4520' visibility='default' filepath='include/drm/drm_drv.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='master_destroy' type-id='type-id-4521' visibility='default' filepath='include/drm/drm_drv.h' line='380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='master_set' type-id='type-id-4522' visibility='default' filepath='include/drm/drm_drv.h' line='387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='master_drop' type-id='type-id-4512' visibility='default' filepath='include/drm/drm_drv.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='debugfs_init' type-id='type-id-4523' visibility='default' filepath='include/drm/drm_drv.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='gem_free_object' type-id='type-id-4524' visibility='default' filepath='include/drm/drm_drv.h' line='409' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='gem_free_object_unlocked' type-id='type-id-4524' visibility='default' filepath='include/drm/drm_drv.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='gem_open_object' type-id='type-id-4525' visibility='default' filepath='include/drm/drm_drv.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='gem_close_object' type-id='type-id-4526' visibility='default' filepath='include/drm/drm_drv.h' line='431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='gem_print_info' type-id='type-id-4527' visibility='default' filepath='include/drm/drm_drv.h' line='444' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='gem_create_object' type-id='type-id-4528' visibility='default' filepath='include/drm/drm_drv.h' line='453' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='prime_handle_to_fd' type-id='type-id-4529' visibility='default' filepath='include/drm/drm_drv.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='prime_fd_to_handle' type-id='type-id-4530' visibility='default' filepath='include/drm/drm_drv.h' line='469' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='gem_prime_export' type-id='type-id-4531' visibility='default' filepath='include/drm/drm_drv.h' line='476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='gem_prime_import' type-id='type-id-4532' visibility='default' filepath='include/drm/drm_drv.h' line='483' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='gem_prime_pin' type-id='type-id-4533' visibility='default' filepath='include/drm/drm_drv.h' line='485' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='gem_prime_unpin' type-id='type-id-4524' visibility='default' filepath='include/drm/drm_drv.h' line='486' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='gem_prime_res_obj' type-id='type-id-4534' visibility='default' filepath='include/drm/drm_drv.h' line='487' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='gem_prime_get_sg_table' type-id='type-id-4535' visibility='default' filepath='include/drm/drm_drv.h' line='489' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='gem_prime_import_sg_table' type-id='type-id-4536' visibility='default' filepath='include/drm/drm_drv.h' line='490' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='gem_prime_vmap' type-id='type-id-4537' visibility='default' filepath='include/drm/drm_drv.h' line='494' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='gem_prime_vunmap' type-id='type-id-4538' visibility='default' filepath='include/drm/drm_drv.h' line='495' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='gem_prime_mmap' type-id='type-id-4539' visibility='default' filepath='include/drm/drm_drv.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='dumb_create' type-id='type-id-4540' visibility='default' filepath='include/drm/drm_drv.h' line='520' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='dumb_map_offset' type-id='type-id-4541' visibility='default' filepath='include/drm/drm_drv.h' line='536' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='dumb_destroy' type-id='type-id-4542' visibility='default' filepath='include/drm/drm_drv.h' line='552' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='gem_vm_ops' type-id='type-id-1464' visibility='default' filepath='include/drm/drm_drv.h' line='559' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='major' type-id='type-id-17' visibility='default' filepath='include/drm/drm_drv.h' line='562' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2720'>
+          <var-decl name='minor' type-id='type-id-17' visibility='default' filepath='include/drm/drm_drv.h' line='564' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='patchlevel' type-id='type-id-17' visibility='default' filepath='include/drm/drm_drv.h' line='566' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/drm/drm_drv.h' line='568' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='desc' type-id='type-id-2' visibility='default' filepath='include/drm/drm_drv.h' line='570' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='date' type-id='type-id-2' visibility='default' filepath='include/drm/drm_drv.h' line='572' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='driver_features' type-id='type-id-7' visibility='default' filepath='include/drm/drm_drv.h' line='575' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='ioctls' type-id='type-id-4543' visibility='default' filepath='include/drm/drm_drv.h' line='585' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='num_ioctls' type-id='type-id-17' visibility='default' filepath='include/drm/drm_drv.h' line='587' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='fops' type-id='type-id-268' visibility='default' filepath='include/drm/drm_drv.h' line='596' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='legacy_dev_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_drv.h' line='602' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='firstopen' type-id='type-id-4519' visibility='default' filepath='include/drm/drm_drv.h' line='603' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='preclose' type-id='type-id-4512' visibility='default' filepath='include/drm/drm_drv.h' line='604' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='dma_ioctl' type-id='type-id-4544' visibility='default' filepath='include/drm/drm_drv.h' line='605' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='dma_quiescent' type-id='type-id-4519' visibility='default' filepath='include/drm/drm_drv.h' line='606' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='context_dtor' type-id='type-id-4545' visibility='default' filepath='include/drm/drm_drv.h' line='607' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='dev_priv_size' type-id='type-id-17' visibility='default' filepath='include/drm/drm_drv.h' line='608' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_file' size-in-bits='2816' is-struct='yes' visibility='default' filepath='include/drm/drm_file.h' line='157' column='1' id='type-id-4546'>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='authenticated' type-id='type-id-5' visibility='default' filepath='include/drm/drm_file.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='stereo_allowed' type-id='type-id-5' visibility='default' filepath='include/drm/drm_file.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='universal_planes' type-id='type-id-5' visibility='default' filepath='include/drm/drm_file.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='atomic' type-id='type-id-5' visibility='default' filepath='include/drm/drm_file.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='aspect_ratio_allowed' type-id='type-id-5' visibility='default' filepath='include/drm/drm_file.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26'>
+          <var-decl name='writeback_connectors' type-id='type-id-5' visibility='default' filepath='include/drm/drm_file.h' line='200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='25'>
+          <var-decl name='is_master' type-id='type-id-5' visibility='default' filepath='include/drm/drm_file.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='master' type-id='type-id-4498' visibility='default' filepath='include/drm/drm_file.h' line='223' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='pid' type-id='type-id-251' visibility='default' filepath='include/drm/drm_file.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='magic' type-id='type-id-4547' visibility='default' filepath='include/drm/drm_file.h' line='229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='lhead' type-id='type-id-20' visibility='default' filepath='include/drm/drm_file.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='minor' type-id='type-id-4497' visibility='default' filepath='include/drm/drm_file.h' line='240' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='object_idr' type-id='type-id-1432' visibility='default' filepath='include/drm/drm_file.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='table_lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_file.h' line='251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='syncobj_idr' type-id='type-id-1432' visibility='default' filepath='include/drm/drm_file.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='syncobj_table_lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_file.h' line='256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='filp' type-id='type-id-83' visibility='default' filepath='include/drm/drm_file.h' line='259' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='driver_priv' type-id='type-id-15' visibility='default' filepath='include/drm/drm_file.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='fbs' type-id='type-id-20' visibility='default' filepath='include/drm/drm_file.h' line='278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='fbs_lock' type-id='type-id-245' visibility='default' filepath='include/drm/drm_file.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='blobs' type-id='type-id-20' visibility='default' filepath='include/drm/drm_file.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='event_wait' type-id='type-id-225' visibility='default' filepath='include/drm/drm_file.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='pending_event_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_file.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='event_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_file.h' line='315' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='event_space' type-id='type-id-17' visibility='default' filepath='include/drm/drm_file.h' line='324' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='event_read_lock' type-id='type-id-245' visibility='default' filepath='include/drm/drm_file.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='prime' type-id='type-id-4548' visibility='default' filepath='include/drm/drm_file.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='lock_count' type-id='type-id-16' visibility='default' filepath='include/drm/drm_file.h' line='337' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='drm_magic_t' type-id='type-id-5' filepath='include/uapi/drm/drm.h' line='85' column='1' id='type-id-4547'/>
+      <class-decl name='drm_minor' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/drm/drm_file.h' line='68' column='1' id='type-id-4549'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='index' type-id='type-id-17' visibility='default' filepath='include/drm/drm_file.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='type' type-id='type-id-17' visibility='default' filepath='include/drm/drm_file.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='kdev' type-id='type-id-240' visibility='default' filepath='include/drm/drm_file.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_file.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='debugfs_root' type-id='type-id-23' visibility='default' filepath='include/drm/drm_file.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='debugfs_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_file.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='debugfs_lock' type-id='type-id-245' visibility='default' filepath='include/drm/drm_file.h' line='78' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_prime_file_private' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/drm/drm_prime.h' line='46' column='1' id='type-id-4548'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-245' visibility='default' filepath='include/drm/drm_prime.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dmabufs' type-id='type-id-416' visibility='default' filepath='include/drm/drm_prime.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='handles' type-id='type-id-416' visibility='default' filepath='include/drm/drm_prime.h' line='50' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_display_mode' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/drm/drm_modes.h' line='208' column='1' id='type-id-4550'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/drm/drm_modes.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='base' type-id='type-id-4482' visibility='default' filepath='include/drm/drm_modes.h' line='228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='name' type-id='type-id-373' visibility='default' filepath='include/drm/drm_modes.h' line='235' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='status' type-id='type-id-4551' visibility='default' filepath='include/drm/drm_modes.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='type' type-id='type-id-5' visibility='default' filepath='include/drm/drm_modes.h' line='271' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='clock' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='hdisplay' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='hsync_start' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='280' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='hsync_end' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='htotal' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='282' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='hskew' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='vdisplay' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='vsync_start' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='vsync_end' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='vtotal' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='vscan' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/drm/drm_modes.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='width_mm' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='height_mm' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='339' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='crtc_clock' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='crtc_hdisplay' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='crtc_hblank_start' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1248'>
+          <var-decl name='crtc_hblank_end' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='crtc_hsync_start' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='crtc_hsync_end' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='crtc_htotal' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='crtc_hskew' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='crtc_vdisplay' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1440'>
+          <var-decl name='crtc_vblank_start' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='crtc_vblank_end' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='crtc_vsync_start' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='crtc_vsync_end' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1568'>
+          <var-decl name='crtc_vtotal' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='private' type-id='type-id-666' visibility='default' filepath='include/drm/drm_modes.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='private_flags' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1696'>
+          <var-decl name='vrefresh' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='hsync' type-id='type-id-17' visibility='default' filepath='include/drm/drm_modes.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1760'>
+          <var-decl name='picture_aspect_ratio' type-id='type-id-4552' visibility='default' filepath='include/drm/drm_modes.h' line='413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='export_head' type-id='type-id-20' visibility='default' filepath='include/drm/drm_modes.h' line='426' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_mode_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/drm/drm_mode_object.h' line='55' column='1' id='type-id-4482'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='id' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_mode_object.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='type' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_mode_object.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='properties' type-id='type-id-4553' visibility='default' filepath='include/drm/drm_mode_object.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='refcount' type-id='type-id-239' visibility='default' filepath='include/drm/drm_mode_object.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='free_cb' type-id='type-id-4554' visibility='default' filepath='include/drm/drm_mode_object.h' line='60' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_object_properties' size-in-bits='3136' is-struct='yes' visibility='default' filepath='include/drm/drm_mode_object.h' line='67' column='1' id='type-id-4487'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-17' visibility='default' filepath='include/drm/drm_mode_object.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='properties' type-id='type-id-4472' visibility='default' filepath='include/drm/drm_mode_object.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='values' type-id='type-id-4477' visibility='default' filepath='include/drm/drm_mode_object.h' line='102' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_property' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/drm/drm_property.h' line='71' column='1' id='type-id-4555'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/drm/drm_property.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='base' type-id='type-id-4482' visibility='default' filepath='include/drm/drm_property.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='flags' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_property.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='name' type-id='type-id-373' visibility='default' filepath='include/drm/drm_property.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='num_values' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_property.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='values' type-id='type-id-4556' visibility='default' filepath='include/drm/drm_property.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_property.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='enum_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_property.h' line='187' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='drm_mode_status' filepath='include/drm/drm_modes.h' line='91' column='1' id='type-id-4551'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='MODE_OK' value='0'/>
+        <enumerator name='MODE_HSYNC' value='1'/>
+        <enumerator name='MODE_VSYNC' value='2'/>
+        <enumerator name='MODE_H_ILLEGAL' value='3'/>
+        <enumerator name='MODE_V_ILLEGAL' value='4'/>
+        <enumerator name='MODE_BAD_WIDTH' value='5'/>
+        <enumerator name='MODE_NOMODE' value='6'/>
+        <enumerator name='MODE_NO_INTERLACE' value='7'/>
+        <enumerator name='MODE_NO_DBLESCAN' value='8'/>
+        <enumerator name='MODE_NO_VSCAN' value='9'/>
+        <enumerator name='MODE_MEM' value='10'/>
+        <enumerator name='MODE_VIRTUAL_X' value='11'/>
+        <enumerator name='MODE_VIRTUAL_Y' value='12'/>
+        <enumerator name='MODE_MEM_VIRT' value='13'/>
+        <enumerator name='MODE_NOCLOCK' value='14'/>
+        <enumerator name='MODE_CLOCK_HIGH' value='15'/>
+        <enumerator name='MODE_CLOCK_LOW' value='16'/>
+        <enumerator name='MODE_CLOCK_RANGE' value='17'/>
+        <enumerator name='MODE_BAD_HVALUE' value='18'/>
+        <enumerator name='MODE_BAD_VVALUE' value='19'/>
+        <enumerator name='MODE_BAD_VSCAN' value='20'/>
+        <enumerator name='MODE_HSYNC_NARROW' value='21'/>
+        <enumerator name='MODE_HSYNC_WIDE' value='22'/>
+        <enumerator name='MODE_HBLANK_NARROW' value='23'/>
+        <enumerator name='MODE_HBLANK_WIDE' value='24'/>
+        <enumerator name='MODE_VSYNC_NARROW' value='25'/>
+        <enumerator name='MODE_VSYNC_WIDE' value='26'/>
+        <enumerator name='MODE_VBLANK_NARROW' value='27'/>
+        <enumerator name='MODE_VBLANK_WIDE' value='28'/>
+        <enumerator name='MODE_PANEL' value='29'/>
+        <enumerator name='MODE_INTERLACE_WIDTH' value='30'/>
+        <enumerator name='MODE_ONE_WIDTH' value='31'/>
+        <enumerator name='MODE_ONE_HEIGHT' value='32'/>
+        <enumerator name='MODE_ONE_SIZE' value='33'/>
+        <enumerator name='MODE_NO_REDUCED' value='34'/>
+        <enumerator name='MODE_NO_STEREO' value='35'/>
+        <enumerator name='MODE_NO_420' value='36'/>
+        <enumerator name='MODE_STALE' value='-3'/>
+        <enumerator name='MODE_BAD' value='-2'/>
+        <enumerator name='MODE_ERROR' value='-1'/>
+      </enum-decl>
+      <enum-decl name='hdmi_picture_aspect' filepath='include/linux/hdmi.h' line='78' column='1' id='type-id-4552'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='HDMI_PICTURE_ASPECT_NONE' value='0'/>
+        <enumerator name='HDMI_PICTURE_ASPECT_4_3' value='1'/>
+        <enumerator name='HDMI_PICTURE_ASPECT_16_9' value='2'/>
+        <enumerator name='HDMI_PICTURE_ASPECT_64_27' value='3'/>
+        <enumerator name='HDMI_PICTURE_ASPECT_256_135' value='4'/>
+        <enumerator name='HDMI_PICTURE_ASPECT_RESERVED' value='5'/>
+      </enum-decl>
+      <class-decl name='drm_printer' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/drm/drm_print.h' line='69' column='1' id='type-id-4557'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='printfn' type-id='type-id-4558' visibility='default' filepath='include/drm/drm_print.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='puts' type-id='type-id-4559' visibility='default' filepath='include/drm/drm_print.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='arg' type-id='type-id-15' visibility='default' filepath='include/drm/drm_print.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='prefix' type-id='type-id-4' visibility='default' filepath='include/drm/drm_print.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='va_format' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/printk.h' line='86' column='1' id='type-id-4560'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fmt' type-id='type-id-4' visibility='default' filepath='include/linux/printk.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='va' type-id='type-id-4561' visibility='default' filepath='include/linux/printk.h' line='88' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='va_list' type-id='type-id-4562' filepath='prebuilts-master/clang/host/linux-x86/clang-r370808/lib64/clang/10.0.1/include/stdarg.h' line='14' column='1' id='type-id-4563'/>
+      <typedef-decl name='__builtin_va_list' type-id='type-id-4564' filepath='drivers/gpu/drm/drm_probe_helper.c' line='66' column='1' id='type-id-4562'/>
+      <class-decl name='__va_list' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/gpu/drm/drm_probe_helper.c' line='66' column='1' id='type-id-4564'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='__stack' type-id='type-id-15' visibility='default' filepath='drivers/gpu/drm/drm_probe_helper.c' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='__gr_top' type-id='type-id-15' visibility='default' filepath='drivers/gpu/drm/drm_probe_helper.c' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='__vr_top' type-id='type-id-15' visibility='default' filepath='drivers/gpu/drm/drm_probe_helper.c' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='__gr_offs' type-id='type-id-17' visibility='default' filepath='drivers/gpu/drm/drm_probe_helper.c' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='__vr_offs' type-id='type-id-17' visibility='default' filepath='drivers/gpu/drm/drm_probe_helper.c' line='66' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='6848' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='353' column='1' id='type-id-4565'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mmap' type-id='type-id-1207' visibility='default' filepath='include/linux/mm_types.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mm_rb' type-id='type-id-416' visibility='default' filepath='include/linux/mm_types.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='vmacache_seqnum' type-id='type-id-40' visibility='default' filepath='include/linux/mm_types.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='get_unmapped_area' type-id='type-id-1482' visibility='default' filepath='include/linux/mm_types.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mmap_base' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mmap_legacy_base' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='task_size' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='highest_vm_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pgd' type-id='type-id-1483' visibility='default' filepath='include/linux/mm_types.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mm_users' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='mm_count' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='pgtables_bytes' type-id='type-id-115' visibility='default' filepath='include/linux/mm_types.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='map_count' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='page_table_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mmap_sem' type-id='type-id-246' visibility='default' filepath='include/linux/mm_types.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='mmlist' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='hiwater_rss' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='hiwater_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='total_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='locked_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='pinned_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='data_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='exec_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='stack_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='def_flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='arg_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='421' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='start_code' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='end_code' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='start_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='end_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='start_brk' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='brk' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='start_stack' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='arg_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='arg_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='env_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='env_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='saved_auxv' type-id='type-id-1200' visibility='default' filepath='include/linux/mm_types.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='rss_stat' type-id='type-id-1484' visibility='default' filepath='include/linux/mm_types.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='binfmt' type-id='type-id-1485' visibility='default' filepath='include/linux/mm_types.h' line='434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='context' type-id='type-id-1486' visibility='default' filepath='include/linux/mm_types.h' line='437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='core_state' type-id='type-id-1487' visibility='default' filepath='include/linux/mm_types.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='membarrier_state' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6176'>
+          <var-decl name='ioctx_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='ioctx_table' type-id='type-id-1488' visibility='default' filepath='include/linux/mm_types.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='owner' type-id='type-id-431' visibility='default' filepath='include/linux/mm_types.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='user_ns' type-id='type-id-3478' visibility='default' filepath='include/linux/mm_types.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='exe_file' type-id='type-id-83' visibility='default' filepath='include/linux/mm_types.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='tlb_flush_pending' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='491' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='uprobes_state' type-id='type-id-1489' visibility='default' filepath='include/linux/mm_types.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='async_put_work' type-id='type-id-255' visibility='default' filepath='include/linux/mm_types.h' line='500' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_mode_create_dumb' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='703' column='1' id='type-id-4566'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='height' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='704' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='width' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='705' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bpp' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='706' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='flags' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='707' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='handle' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='709' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='pitch' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='710' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='size' type-id='type-id-100' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='711' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_ioctl_desc' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/drm/drm_ioctl.h' line='141' column='1' id='type-id-4567'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-5' visibility='default' filepath='include/drm/drm_ioctl.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='flags' type-id='type-id-4568' visibility='default' filepath='include/drm/drm_ioctl.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='func' type-id='type-id-4569' visibility='default' filepath='include/drm/drm_ioctl.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/drm/drm_ioctl.h' line='145' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='drm_ioctl_flags' filepath='include/drm/drm_ioctl.h' line='79' column='1' id='type-id-4568'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DRM_AUTH' value='1'/>
+        <enumerator name='DRM_MASTER' value='2'/>
+        <enumerator name='DRM_ROOT_ONLY' value='4'/>
+        <enumerator name='DRM_UNLOCKED' value='16'/>
+        <enumerator name='DRM_RENDER_ALLOW' value='32'/>
+      </enum-decl>
+      <typedef-decl name='drm_ioctl_t' type-id='type-id-4570' filepath='include/drm/drm_ioctl.h' line='54' column='1' id='type-id-4571'/>
+      <class-decl name='drm_open_hash' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/drm/drm_hashtab.h' line='47' column='1' id='type-id-4499'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='table' type-id='type-id-746' visibility='default' filepath='include/drm/drm_hashtab.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='order' type-id='type-id-214' visibility='default' filepath='include/drm/drm_hashtab.h' line='49' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_vblank_crtc' size-in-bits='3008' is-struct='yes' visibility='default' filepath='include/drm/drm_vblank.h' line='90' column='1' id='type-id-4572'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_vblank.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='queue' type-id='type-id-225' visibility='default' filepath='include/drm/drm_vblank.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='disable_timer' type-id='type-id-417' visibility='default' filepath='include/drm/drm_vblank.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='seqlock' type-id='type-id-1917' visibility='default' filepath='include/drm/drm_vblank.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='count' type-id='type-id-40' visibility='default' filepath='include/drm/drm_vblank.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='time' type-id='type-id-682' visibility='default' filepath='include/drm/drm_vblank.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='refcount' type-id='type-id-26' visibility='default' filepath='include/drm/drm_vblank.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='last' type-id='type-id-7' visibility='default' filepath='include/drm/drm_vblank.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='max_vblank_count' type-id='type-id-7' visibility='default' filepath='include/drm/drm_vblank.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='inmodeset' type-id='type-id-5' visibility='default' filepath='include/drm/drm_vblank.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='pipe' type-id='type-id-5' visibility='default' filepath='include/drm/drm_vblank.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='framedur_ns' type-id='type-id-17' visibility='default' filepath='include/drm/drm_vblank.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='linedur_ns' type-id='type-id-17' visibility='default' filepath='include/drm/drm_vblank.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='hwmode' type-id='type-id-4550' visibility='default' filepath='include/drm/drm_vblank.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='enabled' type-id='type-id-33' visibility='default' filepath='include/drm/drm_vblank.h' line='195' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_agp_head' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/drm/drm_agpsupport.h' line='16' column='1' id='type-id-4573'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='agp_info' type-id='type-id-4574' visibility='default' filepath='include/drm/drm_agpsupport.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='memory' type-id='type-id-20' visibility='default' filepath='include/drm/drm_agpsupport.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mode' type-id='type-id-16' visibility='default' filepath='include/drm/drm_agpsupport.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='bridge' type-id='type-id-4575' visibility='default' filepath='include/drm/drm_agpsupport.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='enabled' type-id='type-id-17' visibility='default' filepath='include/drm/drm_agpsupport.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='acquired' type-id='type-id-17' visibility='default' filepath='include/drm/drm_agpsupport.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='base' type-id='type-id-16' visibility='default' filepath='include/drm/drm_agpsupport.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='agp_mtrr' type-id='type-id-17' visibility='default' filepath='include/drm/drm_agpsupport.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='cant_use_aperture' type-id='type-id-17' visibility='default' filepath='include/drm/drm_agpsupport.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='page_mask' type-id='type-id-16' visibility='default' filepath='include/drm/drm_agpsupport.h' line='26' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='agp_kern_info' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/agp_backend.h' line='45' column='1' id='type-id-4574'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='version' type-id='type-id-4576' visibility='default' filepath='include/linux/agp_backend.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='device' type-id='type-id-3933' visibility='default' filepath='include/linux/agp_backend.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='chipset' type-id='type-id-4577' visibility='default' filepath='include/linux/agp_backend.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mode' type-id='type-id-16' visibility='default' filepath='include/linux/agp_backend.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='aper_base' type-id='type-id-16' visibility='default' filepath='include/linux/agp_backend.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='aper_size' type-id='type-id-84' visibility='default' filepath='include/linux/agp_backend.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='max_memory' type-id='type-id-17' visibility='default' filepath='include/linux/agp_backend.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='current_memory' type-id='type-id-17' visibility='default' filepath='include/linux/agp_backend.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='cant_use_aperture' type-id='type-id-33' visibility='default' filepath='include/linux/agp_backend.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='page_mask' type-id='type-id-16' visibility='default' filepath='include/linux/agp_backend.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='vm_ops' type-id='type-id-1464' visibility='default' filepath='include/linux/agp_backend.h' line='56' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='agp_version' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/agp_backend.h' line='40' column='1' id='type-id-4576'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='major' type-id='type-id-688' visibility='default' filepath='include/linux/agp_backend.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='minor' type-id='type-id-688' visibility='default' filepath='include/linux/agp_backend.h' line='42' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='chipset_type' filepath='include/linux/agp_backend.h' line='35' column='1' id='type-id-4577'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NOT_SUPPORTED' value='0'/>
+        <enumerator name='SUPPORTED' value='1'/>
+      </enum-decl>
+      <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_device.h' line='205' column='1' id='type-id-4504'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='context' type-id='type-id-17' visibility='default' filepath='include/drm/drm_device.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='lock' type-id='type-id-4578' visibility='default' filepath='include/drm/drm_device.h' line='207' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_hw_lock' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/uapi/drm/drm.h' line='129' column='1' id='type-id-4579'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-4580' visibility='default' filepath='include/uapi/drm/drm.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='padding' type-id='type-id-4454' visibility='default' filepath='include/uapi/drm/drm.h' line='131' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_mode_config' size-in-bits='8192' is-struct='yes' visibility='default' filepath='include/drm/drm_mode_config.h' line='352' column='1' id='type-id-4506'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/drm/drm_mode_config.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='connection_mutex' type-id='type-id-4581' visibility='default' filepath='include/drm/drm_mode_config.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='acquire_ctx' type-id='type-id-4582' visibility='default' filepath='include/drm/drm_mode_config.h' line='383' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='idr_mutex' type-id='type-id-245' visibility='default' filepath='include/drm/drm_mode_config.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='crtc_idr' type-id='type-id-1432' visibility='default' filepath='include/drm/drm_mode_config.h' line='399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='tile_idr' type-id='type-id-1432' visibility='default' filepath='include/drm/drm_mode_config.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='fb_lock' type-id='type-id-245' visibility='default' filepath='include/drm/drm_mode_config.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='num_fb' type-id='type-id-17' visibility='default' filepath='include/drm/drm_mode_config.h' line='412' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='fb_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_mode_config.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='connector_list_lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_mode_config.h' line='420' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1888'>
+          <var-decl name='num_connector' type-id='type-id-17' visibility='default' filepath='include/drm/drm_mode_config.h' line='425' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='connector_ida' type-id='type-id-3449' visibility='default' filepath='include/drm/drm_mode_config.h' line='429' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='connector_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_mode_config.h' line='437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='connector_free_list' type-id='type-id-278' visibility='default' filepath='include/drm/drm_mode_config.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='connector_free_work' type-id='type-id-255' visibility='default' filepath='include/drm/drm_mode_config.h' line='451' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='num_encoder' type-id='type-id-17' visibility='default' filepath='include/drm/drm_mode_config.h' line='459' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='encoder_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_mode_config.h' line='467' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='num_total_plane' type-id='type-id-17' visibility='default' filepath='include/drm/drm_mode_config.h' line='476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='plane_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_mode_config.h' line='483' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='num_crtc' type-id='type-id-17' visibility='default' filepath='include/drm/drm_mode_config.h' line='491' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='crtc_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_mode_config.h' line='498' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='property_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_mode_config.h' line='507' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='min_width' type-id='type-id-17' visibility='default' filepath='include/drm/drm_mode_config.h' line='509' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3232'>
+          <var-decl name='min_height' type-id='type-id-17' visibility='default' filepath='include/drm/drm_mode_config.h' line='509' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='max_width' type-id='type-id-17' visibility='default' filepath='include/drm/drm_mode_config.h' line='510' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3296'>
+          <var-decl name='max_height' type-id='type-id-17' visibility='default' filepath='include/drm/drm_mode_config.h' line='510' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='funcs' type-id='type-id-4583' visibility='default' filepath='include/drm/drm_mode_config.h' line='511' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='fb_base' type-id='type-id-2154' visibility='default' filepath='include/drm/drm_mode_config.h' line='512' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='poll_enabled' type-id='type-id-33' visibility='default' filepath='include/drm/drm_mode_config.h' line='515' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3464'>
+          <var-decl name='poll_running' type-id='type-id-33' visibility='default' filepath='include/drm/drm_mode_config.h' line='516' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3472'>
+          <var-decl name='delayed_event' type-id='type-id-33' visibility='default' filepath='include/drm/drm_mode_config.h' line='517' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='output_poll_work' type-id='type-id-411' visibility='default' filepath='include/drm/drm_mode_config.h' line='518' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='blob_lock' type-id='type-id-245' visibility='default' filepath='include/drm/drm_mode_config.h' line='526' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='property_blob_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_mode_config.h' line='534' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='edid_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='542' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='dpms_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='547' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='path_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='552' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='tile_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='558' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='link_status_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='563' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='plane_type_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='568' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='prop_src_x' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='573' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='prop_src_y' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='578' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='prop_src_w' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='583' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='prop_src_h' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='588' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5248'>
+          <var-decl name='prop_crtc_x' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='593' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='prop_crtc_y' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='598' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='prop_crtc_w' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='603' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='prop_crtc_h' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='608' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='prop_fb_id' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='613' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='prop_in_fence_fd' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='618' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5632'>
+          <var-decl name='prop_out_fence_ptr' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='624' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5696'>
+          <var-decl name='prop_crtc_id' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='629' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='prop_active' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='635' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='prop_mode_id' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='641' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='dvi_i_subconnector_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='647' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5952'>
+          <var-decl name='dvi_i_select_subconnector_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='652' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='tv_subconnector_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='658' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='tv_select_subconnector_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='663' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='tv_mode_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='668' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='tv_left_margin_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='tv_right_margin_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='678' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='tv_top_margin_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='683' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='tv_bottom_margin_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='688' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='tv_brightness_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='693' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='tv_contrast_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='698' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='tv_flicker_reduction_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='703' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='tv_overscan_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='708' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6720'>
+          <var-decl name='tv_saturation_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='713' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6784'>
+          <var-decl name='tv_hue_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='717' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6848'>
+          <var-decl name='scaling_mode_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='723' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6912'>
+          <var-decl name='aspect_ratio_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='728' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6976'>
+          <var-decl name='content_type_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='733' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7040'>
+          <var-decl name='degamma_lut_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='738' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7104'>
+          <var-decl name='degamma_lut_size_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='743' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7168'>
+          <var-decl name='ctm_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='749' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7232'>
+          <var-decl name='gamma_lut_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='755' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7296'>
+          <var-decl name='gamma_lut_size_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='760' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7360'>
+          <var-decl name='suggested_x_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7424'>
+          <var-decl name='suggested_y_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='771' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='non_desktop_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='778' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7552'>
+          <var-decl name='panel_orientation_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='785' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7616'>
+          <var-decl name='writeback_fb_id_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='792' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7680'>
+          <var-decl name='writeback_pixel_formats_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='800' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7744'>
+          <var-decl name='writeback_out_fence_ptr_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='808' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7808'>
+          <var-decl name='preferred_depth' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_mode_config.h' line='811' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7840'>
+          <var-decl name='prefer_shadow' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_mode_config.h' line='811' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7872'>
+          <var-decl name='async_page_flip' type-id='type-id-33' visibility='default' filepath='include/drm/drm_mode_config.h' line='817' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7880'>
+          <var-decl name='allow_fb_modifiers' type-id='type-id-33' visibility='default' filepath='include/drm/drm_mode_config.h' line='824' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7888'>
+          <var-decl name='normalize_zpos' type-id='type-id-33' visibility='default' filepath='include/drm/drm_mode_config.h' line='832' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7936'>
+          <var-decl name='modifiers_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_mode_config.h' line='838' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8000'>
+          <var-decl name='cursor_width' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_mode_config.h' line='841' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8032'>
+          <var-decl name='cursor_height' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_mode_config.h' line='841' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8064'>
+          <var-decl name='suspend_state' type-id='type-id-4584' visibility='default' filepath='include/drm/drm_mode_config.h' line='850' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8128'>
+          <var-decl name='helper_private' type-id='type-id-4585' visibility='default' filepath='include/drm/drm_mode_config.h' line='852' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_modeset_lock' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/drm/drm_modeset_lock.h' line='76' column='1' id='type-id-4581'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mutex' type-id='type-id-3467' visibility='default' filepath='include/drm/drm_modeset_lock.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/drm/drm_modeset_lock.h' line='86' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_modeset_acquire_ctx' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/drm/drm_modeset_lock.h' line='43' column='1' id='type-id-4586'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ww_ctx' type-id='type-id-3469' visibility='default' filepath='include/drm/drm_modeset_lock.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='contended' type-id='type-id-4587' visibility='default' filepath='include/drm/drm_modeset_lock.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='locked' type-id='type-id-20' visibility='default' filepath='include/drm/drm_modeset_lock.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='trylock_only' type-id='type-id-33' visibility='default' filepath='include/drm/drm_modeset_lock.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='392'>
+          <var-decl name='interruptible' type-id='type-id-33' visibility='default' filepath='include/drm/drm_modeset_lock.h' line='65' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_mode_config_funcs' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/drm/drm_mode_config.h' line='47' column='1' id='type-id-4588'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fb_create' type-id='type-id-4589' visibility='default' filepath='include/drm/drm_mode_config.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='get_format_info' type-id='type-id-4590' visibility='default' filepath='include/drm/drm_mode_config.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='output_poll_changed' type-id='type-id-4513' visibility='default' filepath='include/drm/drm_mode_config.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mode_valid' type-id='type-id-4591' visibility='default' filepath='include/drm/drm_mode_config.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='atomic_check' type-id='type-id-4592' visibility='default' filepath='include/drm/drm_mode_config.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='atomic_commit' type-id='type-id-4593' visibility='default' filepath='include/drm/drm_mode_config.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='atomic_state_alloc' type-id='type-id-4594' visibility='default' filepath='include/drm/drm_mode_config.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='atomic_state_clear' type-id='type-id-4595' visibility='default' filepath='include/drm/drm_mode_config.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='atomic_state_free' type-id='type-id-4595' visibility='default' filepath='include/drm/drm_mode_config.h' line='327' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_framebuffer' size-in-bits='1600' is-struct='yes' visibility='default' filepath='include/drm/drm_framebuffer.h' line='109' column='1' id='type-id-4596'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_framebuffer.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/drm/drm_framebuffer.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='base' type-id='type-id-4482' visibility='default' filepath='include/drm/drm_framebuffer.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='comm' type-id='type-id-43' visibility='default' filepath='include/drm/drm_framebuffer.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='format' type-id='type-id-4597' visibility='default' filepath='include/drm/drm_framebuffer.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='funcs' type-id='type-id-4598' visibility='default' filepath='include/drm/drm_framebuffer.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='pitches' type-id='type-id-4480' visibility='default' filepath='include/drm/drm_framebuffer.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='offsets' type-id='type-id-4480' visibility='default' filepath='include/drm/drm_framebuffer.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='modifier' type-id='type-id-2438' visibility='default' filepath='include/drm/drm_framebuffer.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='width' type-id='type-id-5' visibility='default' filepath='include/drm/drm_framebuffer.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='height' type-id='type-id-5' visibility='default' filepath='include/drm/drm_framebuffer.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/drm/drm_framebuffer.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='hot_x' type-id='type-id-17' visibility='default' filepath='include/drm/drm_framebuffer.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='hot_y' type-id='type-id-17' visibility='default' filepath='include/drm/drm_framebuffer.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='filp_head' type-id='type-id-20' visibility='default' filepath='include/drm/drm_framebuffer.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='obj' type-id='type-id-4470' visibility='default' filepath='include/drm/drm_framebuffer.h' line='205' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_format_info' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/drm/drm_fourcc.h' line='66' column='1' id='type-id-4599'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='format' type-id='type-id-7' visibility='default' filepath='include/drm/drm_fourcc.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='depth' type-id='type-id-214' visibility='default' filepath='include/drm/drm_fourcc.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='num_planes' type-id='type-id-214' visibility='default' filepath='include/drm/drm_fourcc.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='cpp' type-id='type-id-1183' visibility='default' filepath='include/drm/drm_fourcc.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='72'>
+          <var-decl name='hsub' type-id='type-id-214' visibility='default' filepath='include/drm/drm_fourcc.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='vsub' type-id='type-id-214' visibility='default' filepath='include/drm/drm_fourcc.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='88'>
+          <var-decl name='has_alpha' type-id='type-id-33' visibility='default' filepath='include/drm/drm_fourcc.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='is_yuv' type-id='type-id-33' visibility='default' filepath='include/drm/drm_fourcc.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_framebuffer_funcs' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/drm/drm_framebuffer.h' line='37' column='1' id='type-id-4600'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='destroy' type-id='type-id-4601' visibility='default' filepath='include/drm/drm_framebuffer.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='create_handle' type-id='type-id-4602' visibility='default' filepath='include/drm/drm_framebuffer.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dirty' type-id='type-id-4603' visibility='default' filepath='include/drm/drm_framebuffer.h' line='89' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_clip_rect' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/drm/drm.h' line='96' column='1' id='type-id-4604'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='x1' type-id='type-id-312' visibility='default' filepath='include/uapi/drm/drm.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='y1' type-id='type-id-312' visibility='default' filepath='include/uapi/drm/drm.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='x2' type-id='type-id-312' visibility='default' filepath='include/uapi/drm/drm.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='y2' type-id='type-id-312' visibility='default' filepath='include/uapi/drm/drm.h' line='100' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_mode_fb_cmd2' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='479' column='1' id='type-id-4605'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fb_id' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='480' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='width' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='481' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='height' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='482' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='pixel_format' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='483' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='484' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='handles' type-id='type-id-4449' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='510' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='pitches' type-id='type-id-4449' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='511' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='offsets' type-id='type-id-4449' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='512' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='modifier' type-id='type-id-4450' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='513' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_mode_config_helper_funcs' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='1213' column='1' id='type-id-4606'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='atomic_commit_tail' type-id='type-id-4595' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='1249' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_fb_helper' size-in-bits='2624' is-struct='yes' visibility='default' filepath='include/drm/drm_fb_helper.h' line='157' column='1' id='type-id-4607'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='client' type-id='type-id-4608' visibility='default' filepath='include/drm/drm_fb_helper.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='buffer' type-id='type-id-4609' visibility='default' filepath='include/drm/drm_fb_helper.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='fb' type-id='type-id-4610' visibility='default' filepath='include/drm/drm_fb_helper.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_fb_helper.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='crtc_count' type-id='type-id-17' visibility='default' filepath='include/drm/drm_fb_helper.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='crtc_info' type-id='type-id-4611' visibility='default' filepath='include/drm/drm_fb_helper.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='connector_count' type-id='type-id-17' visibility='default' filepath='include/drm/drm_fb_helper.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='connector_info_alloc_count' type-id='type-id-17' visibility='default' filepath='include/drm/drm_fb_helper.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='sw_rotations' type-id='type-id-17' visibility='default' filepath='include/drm/drm_fb_helper.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='connector_info' type-id='type-id-4612' visibility='default' filepath='include/drm/drm_fb_helper.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='funcs' type-id='type-id-4613' visibility='default' filepath='include/drm/drm_fb_helper.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='fbdev' type-id='type-id-4614' visibility='default' filepath='include/drm/drm_fb_helper.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='pseudo_palette' type-id='type-id-4473' visibility='default' filepath='include/drm/drm_fb_helper.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1568'>
+          <var-decl name='dirty_clip' type-id='type-id-4604' visibility='default' filepath='include/drm/drm_fb_helper.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1632'>
+          <var-decl name='dirty_lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_fb_helper.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='dirty_work' type-id='type-id-255' visibility='default' filepath='include/drm/drm_fb_helper.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='resume_work' type-id='type-id-255' visibility='default' filepath='include/drm/drm_fb_helper.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='lock' type-id='type-id-245' visibility='default' filepath='include/drm/drm_fb_helper.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='kernel_fb_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_fb_helper.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='delayed_hotplug' type-id='type-id-33' visibility='default' filepath='include/drm/drm_fb_helper.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2568'>
+          <var-decl name='deferred_setup' type-id='type-id-33' visibility='default' filepath='include/drm/drm_fb_helper.h' line='238' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2592'>
+          <var-decl name='preferred_bpp' type-id='type-id-17' visibility='default' filepath='include/drm/drm_fb_helper.h' line='249' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_client_dev' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/drm/drm_client.h' line='60' column='1' id='type-id-4608'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_client.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/drm/drm_client.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_client.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='funcs' type-id='type-id-4615' visibility='default' filepath='include/drm/drm_client.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='file' type-id='type-id-4616' visibility='default' filepath='include/drm/drm_client.h' line='87' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_client_funcs' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/drm/drm_client.h' line='19' column='1' id='type-id-4617'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/drm/drm_client.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='unregister' type-id='type-id-4618' visibility='default' filepath='include/drm/drm_client.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='restore' type-id='type-id-4619' visibility='default' filepath='include/drm/drm_client.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='hotplug' type-id='type-id-4619' visibility='default' filepath='include/drm/drm_client.h' line='54' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_client_buffer' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/drm/drm_client.h' line='102' column='1' id='type-id-4620'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='client' type-id='type-id-4621' visibility='default' filepath='include/drm/drm_client.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='handle' type-id='type-id-7' visibility='default' filepath='include/drm/drm_client.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='pitch' type-id='type-id-7' visibility='default' filepath='include/drm/drm_client.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='gem' type-id='type-id-4469' visibility='default' filepath='include/drm/drm_client.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='vaddr' type-id='type-id-15' visibility='default' filepath='include/drm/drm_client.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='fb' type-id='type-id-4610' visibility='default' filepath='include/drm/drm_client.h' line='131' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_fb_helper_crtc' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/drm/drm_fb_helper.h' line='49' column='1' id='type-id-4622'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mode_set' type-id='type-id-4623' visibility='default' filepath='include/drm/drm_fb_helper.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='desired_mode' type-id='type-id-4446' visibility='default' filepath='include/drm/drm_fb_helper.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='x' type-id='type-id-17' visibility='default' filepath='include/drm/drm_fb_helper.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='y' type-id='type-id-17' visibility='default' filepath='include/drm/drm_fb_helper.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='rotation' type-id='type-id-17' visibility='default' filepath='include/drm/drm_fb_helper.h' line='53' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_mode_set' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/drm/drm_crtc.h' line='1059' column='1' id='type-id-4623'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fb' type-id='type-id-4610' visibility='default' filepath='include/drm/drm_crtc.h' line='1060' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='crtc' type-id='type-id-4624' visibility='default' filepath='include/drm/drm_crtc.h' line='1061' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mode' type-id='type-id-4446' visibility='default' filepath='include/drm/drm_crtc.h' line='1062' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='x' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_crtc.h' line='1064' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='y' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_crtc.h' line='1065' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='connectors' type-id='type-id-4625' visibility='default' filepath='include/drm/drm_crtc.h' line='1067' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='num_connectors' type-id='type-id-84' visibility='default' filepath='include/drm/drm_crtc.h' line='1068' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_crtc' size-in-bits='9856' is-struct='yes' visibility='default' filepath='include/drm/drm_crtc.h' line='816' column='1' id='type-id-4626'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_crtc.h' line='818' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='port' type-id='type-id-3543' visibility='default' filepath='include/drm/drm_crtc.h' line='820' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/drm/drm_crtc.h' line='828' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/drm/drm_crtc.h' line='831' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mutex' type-id='type-id-4581' visibility='default' filepath='include/drm/drm_crtc.h' line='843' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='base' type-id='type-id-4482' visibility='default' filepath='include/drm/drm_crtc.h' line='846' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='primary' type-id='type-id-4627' visibility='default' filepath='include/drm/drm_crtc.h' line='855' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='cursor' type-id='type-id-4627' visibility='default' filepath='include/drm/drm_crtc.h' line='864' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='index' type-id='type-id-5' visibility='default' filepath='include/drm/drm_crtc.h' line='870' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='cursor_x' type-id='type-id-17' visibility='default' filepath='include/drm/drm_crtc.h' line='879' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='cursor_y' type-id='type-id-17' visibility='default' filepath='include/drm/drm_crtc.h' line='887' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1248'>
+          <var-decl name='enabled' type-id='type-id-33' visibility='default' filepath='include/drm/drm_crtc.h' line='897' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='mode' type-id='type-id-4550' visibility='default' filepath='include/drm/drm_crtc.h' line='907' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='hwmode' type-id='type-id-4550' visibility='default' filepath='include/drm/drm_crtc.h' line='922' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='x' type-id='type-id-17' visibility='default' filepath='include/drm/drm_crtc.h' line='931' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5152'>
+          <var-decl name='y' type-id='type-id-17' visibility='default' filepath='include/drm/drm_crtc.h' line='939' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='funcs' type-id='type-id-4628' visibility='default' filepath='include/drm/drm_crtc.h' line='942' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5248'>
+          <var-decl name='gamma_size' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_crtc.h' line='948' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='gamma_store' type-id='type-id-4629' visibility='default' filepath='include/drm/drm_crtc.h' line='954' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='helper_private' type-id='type-id-4630' visibility='default' filepath='include/drm/drm_crtc.h' line='957' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='properties' type-id='type-id-4487' visibility='default' filepath='include/drm/drm_crtc.h' line='960' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8576'>
+          <var-decl name='state' type-id='type-id-4631' visibility='default' filepath='include/drm/drm_crtc.h' line='975' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8640'>
+          <var-decl name='commit_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_crtc.h' line='992' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8768'>
+          <var-decl name='commit_lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_crtc.h' line='999' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8832'>
+          <var-decl name='debugfs_entry' type-id='type-id-23' visibility='default' filepath='include/drm/drm_crtc.h' line='1007' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8896'>
+          <var-decl name='crc' type-id='type-id-4632' visibility='default' filepath='include/drm/drm_crtc.h' line='1015' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9472'>
+          <var-decl name='fence_context' type-id='type-id-5' visibility='default' filepath='include/drm/drm_crtc.h' line='1022' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9504'>
+          <var-decl name='fence_lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_crtc.h' line='1029' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9536'>
+          <var-decl name='fence_seqno' type-id='type-id-16' visibility='default' filepath='include/drm/drm_crtc.h' line='1036' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9600'>
+          <var-decl name='timeline_name' type-id='type-id-373' visibility='default' filepath='include/drm/drm_crtc.h' line='1043' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_plane' size-in-bits='5184' is-struct='yes' visibility='default' filepath='include/drm/drm_plane.h' line='535' column='1' id='type-id-4633'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_plane.h' line='537' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/drm/drm_plane.h' line='546' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/drm/drm_plane.h' line='549' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mutex' type-id='type-id-4581' visibility='default' filepath='include/drm/drm_plane.h' line='560' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='base' type-id='type-id-4482' visibility='default' filepath='include/drm/drm_plane.h' line='563' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='possible_crtcs' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_plane.h' line='569' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='format_types' type-id='type-id-4634' visibility='default' filepath='include/drm/drm_plane.h' line='571' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='format_count' type-id='type-id-5' visibility='default' filepath='include/drm/drm_plane.h' line='573' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='format_default' type-id='type-id-33' visibility='default' filepath='include/drm/drm_plane.h' line='578' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='modifiers' type-id='type-id-4556' visibility='default' filepath='include/drm/drm_plane.h' line='581' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='modifier_count' type-id='type-id-5' visibility='default' filepath='include/drm/drm_plane.h' line='583' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='crtc' type-id='type-id-4624' visibility='default' filepath='include/drm/drm_plane.h' line='592' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='fb' type-id='type-id-4610' visibility='default' filepath='include/drm/drm_plane.h' line='601' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='old_fb' type-id='type-id-4610' visibility='default' filepath='include/drm/drm_plane.h' line='609' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='funcs' type-id='type-id-4635' visibility='default' filepath='include/drm/drm_plane.h' line='612' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='properties' type-id='type-id-4487' visibility='default' filepath='include/drm/drm_plane.h' line='615' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='type' type-id='type-id-4636' visibility='default' filepath='include/drm/drm_plane.h' line='618' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4704'>
+          <var-decl name='index' type-id='type-id-5' visibility='default' filepath='include/drm/drm_plane.h' line='624' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='helper_private' type-id='type-id-4637' visibility='default' filepath='include/drm/drm_plane.h' line='627' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='state' type-id='type-id-4638' visibility='default' filepath='include/drm/drm_plane.h' line='642' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='alpha_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_plane.h' line='649' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='zpos_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_plane.h' line='655' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='rotation_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_plane.h' line='661' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='color_encoding_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_plane.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='color_range_property' type-id='type-id-4471' visibility='default' filepath='include/drm/drm_plane.h' line='678' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_plane_funcs' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/drm/drm_plane.h' line='216' column='1' id='type-id-4639'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='update_plane' type-id='type-id-4640' visibility='default' filepath='include/drm/drm_plane.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='disable_plane' type-id='type-id-4641' visibility='default' filepath='include/drm/drm_plane.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='destroy' type-id='type-id-4642' visibility='default' filepath='include/drm/drm_plane.h' line='276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='reset' type-id='type-id-4642' visibility='default' filepath='include/drm/drm_plane.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='set_property' type-id='type-id-4643' visibility='default' filepath='include/drm/drm_plane.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='atomic_duplicate_state' type-id='type-id-4644' visibility='default' filepath='include/drm/drm_plane.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='atomic_destroy_state' type-id='type-id-4645' visibility='default' filepath='include/drm/drm_plane.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='atomic_set_property' type-id='type-id-4646' visibility='default' filepath='include/drm/drm_plane.h' line='393' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='atomic_get_property' type-id='type-id-4647' visibility='default' filepath='include/drm/drm_plane.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='late_register' type-id='type-id-4648' visibility='default' filepath='include/drm/drm_plane.h' line='433' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='early_unregister' type-id='type-id-4642' visibility='default' filepath='include/drm/drm_plane.h' line='444' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='atomic_print_state' type-id='type-id-4649' visibility='default' filepath='include/drm/drm_plane.h' line='455' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='format_mod_supported' type-id='type-id-4650' visibility='default' filepath='include/drm/drm_plane.h' line='474' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_plane_state' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/drm/drm_plane.h' line='44' column='1' id='type-id-4651'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='plane' type-id='type-id-4627' visibility='default' filepath='include/drm/drm_plane.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='crtc' type-id='type-id-4624' visibility='default' filepath='include/drm/drm_plane.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fb' type-id='type-id-4610' visibility='default' filepath='include/drm/drm_plane.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='fence' type-id='type-id-4652' visibility='default' filepath='include/drm/drm_plane.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='crtc_x' type-id='type-id-1629' visibility='default' filepath='include/drm/drm_plane.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='crtc_y' type-id='type-id-1629' visibility='default' filepath='include/drm/drm_plane.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='crtc_w' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_plane.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='crtc_h' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_plane.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='src_x' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_plane.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='src_y' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_plane.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='src_h' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_plane.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='src_w' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_plane.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='alpha' type-id='type-id-688' visibility='default' filepath='include/drm/drm_plane.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='rotation' type-id='type-id-5' visibility='default' filepath='include/drm/drm_plane.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='zpos' type-id='type-id-5' visibility='default' filepath='include/drm/drm_plane.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='normalized_zpos' type-id='type-id-5' visibility='default' filepath='include/drm/drm_plane.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='color_encoding' type-id='type-id-4653' visibility='default' filepath='include/drm/drm_plane.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='color_range' type-id='type-id-4654' visibility='default' filepath='include/drm/drm_plane.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='src' type-id='type-id-4655' visibility='default' filepath='include/drm/drm_plane.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='dst' type-id='type-id-4655' visibility='default' filepath='include/drm/drm_plane.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='visible' type-id='type-id-33' visibility='default' filepath='include/drm/drm_plane.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='commit' type-id='type-id-4656' visibility='default' filepath='include/drm/drm_plane.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='state' type-id='type-id-4584' visibility='default' filepath='include/drm/drm_plane.h' line='186' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_fence' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/dma-fence.h' line='73' column='1' id='type-id-4657'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refcount' type-id='type-id-239' visibility='default' filepath='include/linux/dma-fence.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ops' type-id='type-id-4658' visibility='default' filepath='include/linux/dma-fence.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/dma-fence.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='cb_list' type-id='type-id-20' visibility='default' filepath='include/linux/dma-fence.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='lock' type-id='type-id-486' visibility='default' filepath='include/linux/dma-fence.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='context' type-id='type-id-40' visibility='default' filepath='include/linux/dma-fence.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='seqno' type-id='type-id-5' visibility='default' filepath='include/linux/dma-fence.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/dma-fence.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='timestamp' type-id='type-id-682' visibility='default' filepath='include/linux/dma-fence.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='error' type-id='type-id-17' visibility='default' filepath='include/linux/dma-fence.h' line='83' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_fence_ops' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/dma-fence.h' line='113' column='1' id='type-id-4659'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='get_driver_name' type-id='type-id-4660' visibility='default' filepath='include/linux/dma-fence.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='get_timeline_name' type-id='type-id-4660' visibility='default' filepath='include/linux/dma-fence.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='enable_signaling' type-id='type-id-4661' visibility='default' filepath='include/linux/dma-fence.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='signaled' type-id='type-id-4661' visibility='default' filepath='include/linux/dma-fence.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='wait' type-id='type-id-4662' visibility='default' filepath='include/linux/dma-fence.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='release' type-id='type-id-4663' visibility='default' filepath='include/linux/dma-fence.h' line='222' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='fence_value_str' type-id='type-id-4664' visibility='default' filepath='include/linux/dma-fence.h' line='232' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='timeline_value_str' type-id='type-id-4664' visibility='default' filepath='include/linux/dma-fence.h' line='242' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='drm_color_encoding' filepath='include/drm/drm_color_mgmt.h' line='53' column='1' id='type-id-4653'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DRM_COLOR_YCBCR_BT601' value='0'/>
+        <enumerator name='DRM_COLOR_YCBCR_BT709' value='1'/>
+        <enumerator name='DRM_COLOR_YCBCR_BT2020' value='2'/>
+        <enumerator name='DRM_COLOR_ENCODING_MAX' value='3'/>
+      </enum-decl>
+      <enum-decl name='drm_color_range' filepath='include/drm/drm_color_mgmt.h' line='60' column='1' id='type-id-4654'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DRM_COLOR_YCBCR_LIMITED_RANGE' value='0'/>
+        <enumerator name='DRM_COLOR_YCBCR_FULL_RANGE' value='1'/>
+        <enumerator name='DRM_COLOR_RANGE_MAX' value='2'/>
+      </enum-decl>
+      <class-decl name='drm_rect' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/drm/drm_rect.h' line='41' column='1' id='type-id-4655'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='x1' type-id='type-id-17' visibility='default' filepath='include/drm/drm_rect.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='y1' type-id='type-id-17' visibility='default' filepath='include/drm/drm_rect.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='x2' type-id='type-id-17' visibility='default' filepath='include/drm/drm_rect.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='y2' type-id='type-id-17' visibility='default' filepath='include/drm/drm_rect.h' line='42' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='drm_plane_type' filepath='include/drm/drm_plane.h' line='496' column='1' id='type-id-4636'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DRM_PLANE_TYPE_OVERLAY' value='0'/>
+        <enumerator name='DRM_PLANE_TYPE_PRIMARY' value='1'/>
+        <enumerator name='DRM_PLANE_TYPE_CURSOR' value='2'/>
+      </enum-decl>
+      <class-decl name='drm_plane_helper_funcs' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='1011' column='1' id='type-id-4665'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prepare_fb' type-id='type-id-4666' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='1043' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cleanup_fb' type-id='type-id-4645' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='1054' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='atomic_check' type-id='type-id-4666' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='1093' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='atomic_update' type-id='type-id-4645' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='1111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='atomic_disable' type-id='type-id-4645' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='1135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='atomic_async_check' type-id='type-id-4666' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='1154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='atomic_async_update' type-id='type-id-4645' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='1193' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_crtc_funcs' size-in-bits='1344' is-struct='yes' visibility='default' filepath='include/drm/drm_crtc.h' line='368' column='1' id='type-id-4667'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='reset' type-id='type-id-4668' visibility='default' filepath='include/drm/drm_crtc.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cursor_set' type-id='type-id-4669' visibility='default' filepath='include/drm/drm_crtc.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cursor_set2' type-id='type-id-4670' visibility='default' filepath='include/drm/drm_crtc.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='cursor_move' type-id='type-id-4671' visibility='default' filepath='include/drm/drm_crtc.h' line='444' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='gamma_set' type-id='type-id-4672' visibility='default' filepath='include/drm/drm_crtc.h' line='459' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='destroy' type-id='type-id-4668' visibility='default' filepath='include/drm/drm_crtc.h' line='470' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='set_config' type-id='type-id-4673' visibility='default' filepath='include/drm/drm_crtc.h' line='486' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='page_flip' type-id='type-id-4674' visibility='default' filepath='include/drm/drm_crtc.h' line='542' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='page_flip_target' type-id='type-id-4675' visibility='default' filepath='include/drm/drm_crtc.h' line='561' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='set_property' type-id='type-id-4676' visibility='default' filepath='include/drm/drm_crtc.h' line='581' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='atomic_duplicate_state' type-id='type-id-4677' visibility='default' filepath='include/drm/drm_crtc.h' line='615' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='atomic_destroy_state' type-id='type-id-4678' visibility='default' filepath='include/drm/drm_crtc.h' line='625' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='atomic_set_property' type-id='type-id-4679' visibility='default' filepath='include/drm/drm_crtc.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='atomic_get_property' type-id='type-id-4680' visibility='default' filepath='include/drm/drm_crtc.h' line='692' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='late_register' type-id='type-id-4681' visibility='default' filepath='include/drm/drm_crtc.h' line='710' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='early_unregister' type-id='type-id-4668' visibility='default' filepath='include/drm/drm_crtc.h' line='721' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='set_crc_source' type-id='type-id-4682' visibility='default' filepath='include/drm/drm_crtc.h' line='747' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='atomic_print_state' type-id='type-id-4683' visibility='default' filepath='include/drm/drm_crtc.h' line='759' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='get_vblank_counter' type-id='type-id-4684' visibility='default' filepath='include/drm/drm_crtc.h' line='786' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='enable_vblank' type-id='type-id-4681' visibility='default' filepath='include/drm/drm_crtc.h' line='799' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='disable_vblank' type-id='type-id-4668' visibility='default' filepath='include/drm/drm_crtc.h' line='807' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_pending_vblank_event' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/drm/drm_vblank.h' line='41' column='1' id='type-id-4685'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-4686' visibility='default' filepath='include/drm/drm_vblank.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='pipe' type-id='type-id-5' visibility='default' filepath='include/drm/drm_vblank.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='sequence' type-id='type-id-40' visibility='default' filepath='include/drm/drm_vblank.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='event' type-id='type-id-4687' visibility='default' filepath='include/drm/drm_vblank.h' line='77' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_pending_event' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/drm/drm_file.h' line='88' column='1' id='type-id-4686'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='completion' type-id='type-id-1392' visibility='default' filepath='include/drm/drm_file.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='completion_release' type-id='type-id-4688' visibility='default' filepath='include/drm/drm_file.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='event' type-id='type-id-4689' visibility='default' filepath='include/drm/drm_file.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='fence' type-id='type-id-4652' visibility='default' filepath='include/drm/drm_file.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='file_priv' type-id='type-id-4616' visibility='default' filepath='include/drm/drm_file.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='link' type-id='type-id-20' visibility='default' filepath='include/drm/drm_file.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='pending_link' type-id='type-id-20' visibility='default' filepath='include/drm/drm_file.h' line='149' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_event' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/drm/drm.h' line='935' column='1' id='type-id-4690'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm.h' line='936' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='length' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm.h' line='937' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_event_vblank' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/drm/drm.h' line='944' column='1' id='type-id-4691'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-4690' visibility='default' filepath='include/uapi/drm/drm.h' line='945' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='user_data' type-id='type-id-100' visibility='default' filepath='include/uapi/drm/drm.h' line='946' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tv_sec' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm.h' line='947' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='tv_usec' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm.h' line='948' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sequence' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm.h' line='949' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='crtc_id' type-id='type-id-511' visibility='default' filepath='include/uapi/drm/drm.h' line='950' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_event_crtc_sequence' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/drm/drm.h' line='956' column='1' id='type-id-4692'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-4690' visibility='default' filepath='include/uapi/drm/drm.h' line='957' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='user_data' type-id='type-id-100' visibility='default' filepath='include/uapi/drm/drm.h' line='958' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='time_ns' type-id='type-id-898' visibility='default' filepath='include/uapi/drm/drm.h' line='959' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sequence' type-id='type-id-100' visibility='default' filepath='include/uapi/drm/drm.h' line='960' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_crtc_state' size-in-bits='4544' is-struct='yes' visibility='default' filepath='include/drm/drm_crtc.h' line='98' column='1' id='type-id-4693'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='crtc' type-id='type-id-4624' visibility='default' filepath='include/drm/drm_crtc.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='enable' type-id='type-id-33' visibility='default' filepath='include/drm/drm_crtc.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='72'>
+          <var-decl name='active' type-id='type-id-33' visibility='default' filepath='include/drm/drm_crtc.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='planes_changed' type-id='type-id-33' visibility='default' filepath='include/drm/drm_crtc.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='mode_changed' type-id='type-id-33' visibility='default' filepath='include/drm/drm_crtc.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='active_changed' type-id='type-id-33' visibility='default' filepath='include/drm/drm_crtc.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='connectors_changed' type-id='type-id-33' visibility='default' filepath='include/drm/drm_crtc.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='zpos_changed' type-id='type-id-33' visibility='default' filepath='include/drm/drm_crtc.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2'>
+          <var-decl name='color_mgmt_changed' type-id='type-id-33' visibility='default' filepath='include/drm/drm_crtc.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1'>
+          <var-decl name='no_vblank' type-id='type-id-33' visibility='default' filepath='include/drm/drm_crtc.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='plane_mask' type-id='type-id-7' visibility='default' filepath='include/drm/drm_crtc.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='connector_mask' type-id='type-id-7' visibility='default' filepath='include/drm/drm_crtc.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='encoder_mask' type-id='type-id-7' visibility='default' filepath='include/drm/drm_crtc.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='adjusted_mode' type-id='type-id-4550' visibility='default' filepath='include/drm/drm_crtc.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='mode' type-id='type-id-4550' visibility='default' filepath='include/drm/drm_crtc.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='mode_blob' type-id='type-id-4486' visibility='default' filepath='include/drm/drm_crtc.h' line='249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='degamma_lut' type-id='type-id-4486' visibility='default' filepath='include/drm/drm_crtc.h' line='258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='ctm' type-id='type-id-4486' visibility='default' filepath='include/drm/drm_crtc.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='gamma_lut' type-id='type-id-4486' visibility='default' filepath='include/drm/drm_crtc.h' line='275' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='target_vblank' type-id='type-id-7' visibility='default' filepath='include/drm/drm_crtc.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4320'>
+          <var-decl name='pageflip_flags' type-id='type-id-7' visibility='default' filepath='include/drm/drm_crtc.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='event' type-id='type-id-4694' visibility='default' filepath='include/drm/drm_crtc.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='commit' type-id='type-id-4656' visibility='default' filepath='include/drm/drm_crtc.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='state' type-id='type-id-4584' visibility='default' filepath='include/drm/drm_crtc.h' line='353' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_property_blob' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/drm/drm_property.h' line='206' column='1' id='type-id-4695'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='base' type-id='type-id-4482' visibility='default' filepath='include/drm/drm_property.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_property.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='head_global' type-id='type-id-20' visibility='default' filepath='include/drm/drm_property.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='head_file' type-id='type-id-20' visibility='default' filepath='include/drm/drm_property.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='length' type-id='type-id-84' visibility='default' filepath='include/drm/drm_property.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/drm/drm_property.h' line='212' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='uint16_t' type-id='type-id-688' filepath='include/linux/types.h' line='108' column='1' id='type-id-4494'/>
+      <class-decl name='drm_crtc_helper_funcs' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='59' column='1' id='type-id-4696'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dpms' type-id='type-id-4697' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prepare' type-id='type-id-4668' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='commit' type-id='type-id-4668' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mode_valid' type-id='type-id-4698' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mode_fixup' type-id='type-id-4699' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mode_set' type-id='type-id-4700' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='mode_set_nofb' type-id='type-id-4668' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='mode_set_base' type-id='type-id-4701' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='mode_set_base_atomic' type-id='type-id-4702' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='disable' type-id='type-id-4668' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='atomic_check' type-id='type-id-4703' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='atomic_begin' type-id='type-id-4678' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='374' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='atomic_flush' type-id='type-id-4678' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='atomic_enable' type-id='type-id-4678' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='atomic_disable' type-id='type-id-4678' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='445' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='mode_set_atomic' filepath='include/drm/drm_fb_helper.h' line='40' column='1' id='type-id-4704'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='LEAVE_ATOMIC_MODE_SET' value='0'/>
+        <enumerator name='ENTER_ATOMIC_MODE_SET' value='1'/>
+      </enum-decl>
+      <class-decl name='drm_crtc_crc' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='53' column='1' id='type-id-4632'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='source' type-id='type-id-4' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='opened' type-id='type-id-33' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='136'>
+          <var-decl name='overflow' type-id='type-id-33' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='entries' type-id='type-id-4705' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='head' type-id='type-id-17' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='tail' type-id='type-id-17' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='values_cnt' type-id='type-id-84' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='wq' type-id='type-id-225' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='60' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_crtc_crc_entry' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='33' column='1' id='type-id-4706'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='has_frame_counter' type-id='type-id-33' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='frame' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='crcs' type-id='type-id-4475' visibility='default' filepath='include/drm/drm_debugfs_crc.h' line='36' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_fb_helper_connector' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/drm/drm_fb_helper.h' line='131' column='1' id='type-id-4707'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='connector' type-id='type-id-4445' visibility='default' filepath='include/drm/drm_fb_helper.h' line='132' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_fb_helper_funcs' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/drm/drm_fb_helper.h' line='89' column='1' id='type-id-4708'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fb_probe' type-id='type-id-4709' visibility='default' filepath='include/drm/drm_fb_helper.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='initial_config' type-id='type-id-4710' visibility='default' filepath='include/drm/drm_fb_helper.h' line='124' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_fb_helper_surface_size' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/drm/drm_fb_helper.h' line='75' column='1' id='type-id-4711'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='fb_width' type-id='type-id-7' visibility='default' filepath='include/drm/drm_fb_helper.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='fb_height' type-id='type-id-7' visibility='default' filepath='include/drm/drm_fb_helper.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='surface_width' type-id='type-id-7' visibility='default' filepath='include/drm/drm_fb_helper.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='surface_height' type-id='type-id-7' visibility='default' filepath='include/drm/drm_fb_helper.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='surface_bpp' type-id='type-id-7' visibility='default' filepath='include/drm/drm_fb_helper.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='surface_depth' type-id='type-id-7' visibility='default' filepath='include/drm/drm_fb_helper.h' line='81' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_fb_offset' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/drm/drm_fb_helper.h' line='45' column='1' id='type-id-4712'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='x' type-id='type-id-17' visibility='default' filepath='include/drm/drm_fb_helper.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='y' type-id='type-id-17' visibility='default' filepath='include/drm/drm_fb_helper.h' line='46' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_info' size-in-bits='6912' is-struct='yes' visibility='default' filepath='include/linux/fb.h' line='464' column='1' id='type-id-4713'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='count' type-id='type-id-26' visibility='default' filepath='include/linux/fb.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='node' type-id='type-id-17' visibility='default' filepath='include/linux/fb.h' line='466' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/fb.h' line='467' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='fbcon_rotate_hint' type-id='type-id-17' visibility='default' filepath='include/linux/fb.h' line='472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lock' type-id='type-id-245' visibility='default' filepath='include/linux/fb.h' line='473' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='mm_lock' type-id='type-id-245' visibility='default' filepath='include/linux/fb.h' line='474' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='var' type-id='type-id-4714' visibility='default' filepath='include/linux/fb.h' line='475' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='fix' type-id='type-id-4715' visibility='default' filepath='include/linux/fb.h' line='476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='monspecs' type-id='type-id-4716' visibility='default' filepath='include/linux/fb.h' line='477' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='queue' type-id='type-id-255' visibility='default' filepath='include/linux/fb.h' line='478' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='pixmap' type-id='type-id-4717' visibility='default' filepath='include/linux/fb.h' line='479' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='sprite' type-id='type-id-4717' visibility='default' filepath='include/linux/fb.h' line='480' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='cmap' type-id='type-id-4718' visibility='default' filepath='include/linux/fb.h' line='481' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='modelist' type-id='type-id-20' visibility='default' filepath='include/linux/fb.h' line='482' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='mode' type-id='type-id-4719' visibility='default' filepath='include/linux/fb.h' line='483' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='deferred_work' type-id='type-id-411' visibility='default' filepath='include/linux/fb.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='fbdefio' type-id='type-id-4720' visibility='default' filepath='include/linux/fb.h' line='497' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='fbops' type-id='type-id-4721' visibility='default' filepath='include/linux/fb.h' line='500' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='device' type-id='type-id-240' visibility='default' filepath='include/linux/fb.h' line='501' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/fb.h' line='502' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='class_flag' type-id='type-id-17' visibility='default' filepath='include/linux/fb.h' line='503' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='' type-id='type-id-4722' visibility='default' filepath='include/linux/fb.h' line='507' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='screen_size' type-id='type-id-16' visibility='default' filepath='include/linux/fb.h' line='511' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='pseudo_palette' type-id='type-id-15' visibility='default' filepath='include/linux/fb.h' line='512' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='state' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='515' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='fbcon_par' type-id='type-id-15' visibility='default' filepath='include/linux/fb.h' line='516' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6720'>
+          <var-decl name='par' type-id='type-id-15' visibility='default' filepath='include/linux/fb.h' line='518' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6784'>
+          <var-decl name='apertures' type-id='type-id-4188' visibility='default' filepath='include/linux/fb.h' line='528' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6848'>
+          <var-decl name='skip_vt_switch' type-id='type-id-33' visibility='default' filepath='include/linux/fb.h' line='530' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_var_screeninfo' size-in-bits='1280' is-struct='yes' visibility='default' filepath='include/uapi/linux/fb.h' line='241' column='1' id='type-id-4714'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='xres' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='yres' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='xres_virtual' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='244' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='yres_virtual' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='245' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='xoffset' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='yoffset' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='bits_per_pixel' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='grayscale' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='250' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='red' type-id='type-id-4723' visibility='default' filepath='include/uapi/linux/fb.h' line='252' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='green' type-id='type-id-4723' visibility='default' filepath='include/uapi/linux/fb.h' line='253' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='blue' type-id='type-id-4723' visibility='default' filepath='include/uapi/linux/fb.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='transp' type-id='type-id-4723' visibility='default' filepath='include/uapi/linux/fb.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='nonstd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='activate' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='259' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='height' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='width' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='262' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='accel_flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='pixclock' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='left_margin' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='right_margin' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='269' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='upper_margin' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='270' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='lower_margin' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='271' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='hsync_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='vsync_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='273' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='sync' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='274' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='vmode' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='275' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='rotate' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='colorspace' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='reserved' type-id='type-id-4449' visibility='default' filepath='include/uapi/linux/fb.h' line='278' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_bitfield' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/fb.h' line='188' column='1' id='type-id-4723'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='offset' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='length' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='msb_right' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='191' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_fix_screeninfo' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/uapi/linux/fb.h' line='157' column='1' id='type-id-4715'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='id' type-id='type-id-43' visibility='default' filepath='include/uapi/linux/fb.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='smem_start' type-id='type-id-16' visibility='default' filepath='include/uapi/linux/fb.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='smem_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='type' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='type_aux' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='visual' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='xpanstep' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fb.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='336'>
+          <var-decl name='ypanstep' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fb.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='ywrapstep' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fb.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='line_length' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='mmio_start' type-id='type-id-16' visibility='default' filepath='include/uapi/linux/fb.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='mmio_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='accel' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='capabilities' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fb.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='592'>
+          <var-decl name='reserved' type-id='type-id-4448' visibility='default' filepath='include/uapi/linux/fb.h' line='175' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_monspecs' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/linux/fb.h' line='63' column='1' id='type-id-4716'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chroma' type-id='type-id-4724' visibility='default' filepath='include/linux/fb.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='modedb' type-id='type-id-4719' visibility='default' filepath='include/linux/fb.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='manufacturer' type-id='type-id-4452' visibility='default' filepath='include/linux/fb.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='monitor' type-id='type-id-4451' visibility='default' filepath='include/linux/fb.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='464'>
+          <var-decl name='serial_no' type-id='type-id-4451' visibility='default' filepath='include/linux/fb.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='ascii' type-id='type-id-4451' visibility='default' filepath='include/linux/fb.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='modedb_len' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='model' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='serial' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='year' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='week' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='hfmin' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='hfmax' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='dclkmin' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='dclkmax' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='input' type-id='type-id-108' visibility='default' filepath='include/linux/fb.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1008'>
+          <var-decl name='dpms' type-id='type-id-108' visibility='default' filepath='include/linux/fb.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='signal' type-id='type-id-108' visibility='default' filepath='include/linux/fb.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1040'>
+          <var-decl name='vfmin' type-id='type-id-108' visibility='default' filepath='include/linux/fb.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='vfmax' type-id='type-id-108' visibility='default' filepath='include/linux/fb.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1072'>
+          <var-decl name='gamma' type-id='type-id-108' visibility='default' filepath='include/linux/fb.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15'>
+          <var-decl name='gtf' type-id='type-id-108' visibility='default' filepath='include/linux/fb.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1104'>
+          <var-decl name='misc' type-id='type-id-108' visibility='default' filepath='include/linux/fb.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='version' type-id='type-id-893' visibility='default' filepath='include/linux/fb.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1128'>
+          <var-decl name='revision' type-id='type-id-893' visibility='default' filepath='include/linux/fb.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1136'>
+          <var-decl name='max_x' type-id='type-id-893' visibility='default' filepath='include/linux/fb.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1144'>
+          <var-decl name='max_y' type-id='type-id-893' visibility='default' filepath='include/linux/fb.h' line='90' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_chroma' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/fb.h' line='52' column='1' id='type-id-4724'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='redx' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='greenx' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bluex' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='whitex' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='redy' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='greeny' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='bluey' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='whitey' type-id='type-id-511' visibility='default' filepath='include/linux/fb.h' line='60' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_videomode' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/fb.h' line='786' column='1' id='type-id-4725'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/fb.h' line='787' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='refresh' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='788' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='xres' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='789' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='yres' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='790' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='pixclock' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='791' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='left_margin' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='792' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='right_margin' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='793' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='upper_margin' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='794' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='lower_margin' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='795' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='hsync_len' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='796' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='vsync_len' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='797' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='sync' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='798' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='vmode' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='799' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='flag' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='800' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_pixmap' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/fb.h' line='213' column='1' id='type-id-4717'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='addr' type-id='type-id-3121' visibility='default' filepath='include/linux/fb.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='size' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='215' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='offset' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='buf_align' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='scan_align' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='access_align' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='220' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='blit_x' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='blit_y' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='222' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='writeio' type-id='type-id-4726' visibility='default' filepath='include/linux/fb.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='readio' type-id='type-id-4726' visibility='default' filepath='include/linux/fb.h' line='227' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_cmap' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/uapi/linux/fb.h' line='281' column='1' id='type-id-4718'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='282' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='red' type-id='type-id-4727' visibility='default' filepath='include/uapi/linux/fb.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='green' type-id='type-id-4727' visibility='default' filepath='include/uapi/linux/fb.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='blue' type-id='type-id-4727' visibility='default' filepath='include/uapi/linux/fb.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='transp' type-id='type-id-4727' visibility='default' filepath='include/uapi/linux/fb.h' line='287' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_deferred_io' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/fb.h' line='231' column='1' id='type-id-4728'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='delay' type-id='type-id-16' visibility='default' filepath='include/linux/fb.h' line='233' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='lock' type-id='type-id-245' visibility='default' filepath='include/linux/fb.h' line='234' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='pagelist' type-id='type-id-20' visibility='default' filepath='include/linux/fb.h' line='235' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='first_io' type-id='type-id-4729' visibility='default' filepath='include/linux/fb.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='deferred_io' type-id='type-id-4730' visibility='default' filepath='include/linux/fb.h' line='238' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_ops' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/linux/fb.h' line='256' column='1' id='type-id-4731'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/fb.h' line='258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fb_open' type-id='type-id-4732' visibility='default' filepath='include/linux/fb.h' line='259' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fb_release' type-id='type-id-4732' visibility='default' filepath='include/linux/fb.h' line='260' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='fb_read' type-id='type-id-4733' visibility='default' filepath='include/linux/fb.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='fb_write' type-id='type-id-4734' visibility='default' filepath='include/linux/fb.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='fb_check_var' type-id='type-id-4735' visibility='default' filepath='include/linux/fb.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='fb_set_par' type-id='type-id-4736' visibility='default' filepath='include/linux/fb.h' line='275' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='fb_setcolreg' type-id='type-id-4737' visibility='default' filepath='include/linux/fb.h' line='278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='fb_setcmap' type-id='type-id-4738' visibility='default' filepath='include/linux/fb.h' line='282' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='fb_blank' type-id='type-id-4739' visibility='default' filepath='include/linux/fb.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='fb_pan_display' type-id='type-id-4735' visibility='default' filepath='include/linux/fb.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='fb_fillrect' type-id='type-id-4740' visibility='default' filepath='include/linux/fb.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='fb_copyarea' type-id='type-id-4741' visibility='default' filepath='include/linux/fb.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='fb_imageblit' type-id='type-id-4742' visibility='default' filepath='include/linux/fb.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='fb_cursor' type-id='type-id-4743' visibility='default' filepath='include/linux/fb.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='fb_sync' type-id='type-id-4736' visibility='default' filepath='include/linux/fb.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='fb_ioctl' type-id='type-id-4744' visibility='default' filepath='include/linux/fb.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='fb_compat_ioctl' type-id='type-id-4744' visibility='default' filepath='include/linux/fb.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='fb_mmap' type-id='type-id-4745' visibility='default' filepath='include/linux/fb.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='fb_get_caps' type-id='type-id-4746' visibility='default' filepath='include/linux/fb.h' line='315' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='fb_destroy' type-id='type-id-4729' visibility='default' filepath='include/linux/fb.h' line='319' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='fb_debug_enter' type-id='type-id-4736' visibility='default' filepath='include/linux/fb.h' line='322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='fb_debug_leave' type-id='type-id-4736' visibility='default' filepath='include/linux/fb.h' line='323' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_fillrect' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/fb.h' line='350' column='1' id='type-id-4747'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dx' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='dy' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='width' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='height' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='color' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='rop' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='356' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_copyarea' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/fb.h' line='341' column='1' id='type-id-4748'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dx' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='dy' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='width' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='344' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='height' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='sx' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='sy' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='347' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_image' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/uapi/linux/fb.h' line='359' column='1' id='type-id-4749'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dx' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='dy' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='width' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='height' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='fg_color' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='bg_color' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fb.h' line='365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='depth' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/fb.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='data' type-id='type-id-4' visibility='default' filepath='include/uapi/linux/fb.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='cmap' type-id='type-id-4718' visibility='default' filepath='include/uapi/linux/fb.h' line='368' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_cursor' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/uapi/linux/fb.h' line='387' column='1' id='type-id-4750'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='set' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fb.h' line='388' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='enable' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fb.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='rop' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fb.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mask' type-id='type-id-4' visibility='default' filepath='include/uapi/linux/fb.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hot' type-id='type-id-4751' visibility='default' filepath='include/uapi/linux/fb.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='image' type-id='type-id-4749' visibility='default' filepath='include/uapi/linux/fb.h' line='393' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fbcurpos' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/fb.h' line='383' column='1' id='type-id-4751'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='x' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fb.h' line='384' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='y' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fb.h' line='384' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fb_blit_caps' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/fb.h' line='172' column='1' id='type-id-4752'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='x' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='y' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='len' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/linux/fb.h' line='176' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/fb.h' line='507' column='1' id='type-id-4722'>
+        <data-member access='private'>
+          <var-decl name='screen_base' type-id='type-id-2' visibility='default' filepath='include/linux/fb.h' line='508' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='screen_buffer' type-id='type-id-2' visibility='default' filepath='include/linux/fb.h' line='509' column='1'/>
+        </data-member>
+      </union-decl>
+      <enum-decl name='drm_connector_status' filepath='include/drm/drm_connector.h' line='57' column='1' id='type-id-4483'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='connector_status_connected' value='1'/>
+        <enumerator name='connector_status_disconnected' value='2'/>
+        <enumerator name='connector_status_unknown' value='3'/>
+      </enum-decl>
+      <class-decl name='drm_display_info' size-in-bits='1216' is-struct='yes' visibility='default' filepath='include/drm/drm_connector.h' line='219' column='1' id='type-id-4484'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-373' visibility='default' filepath='include/drm/drm_connector.h' line='223' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='width_mm' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='height_mm' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='232' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='pixel_clock' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='bpc' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='subpixel_order' type-id='type-id-4753' visibility='default' filepath='include/drm/drm_connector.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='panel_orientation' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='262' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='color_formats' type-id='type-id-7' visibility='default' filepath='include/drm/drm_connector.h' line='270' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='bus_formats' type-id='type-id-2726' visibility='default' filepath='include/drm/drm_connector.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='num_bus_formats' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='bus_flags' type-id='type-id-7' visibility='default' filepath='include/drm/drm_connector.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='max_tmds_clock' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='dvi_dual' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='680'>
+          <var-decl name='has_hdmi_infoframe' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='688'>
+          <var-decl name='edid_hdmi_dc_modes' type-id='type-id-214' visibility='default' filepath='include/drm/drm_connector.h' line='324' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='696'>
+          <var-decl name='cea_rev' type-id='type-id-214' visibility='default' filepath='include/drm/drm_connector.h' line='329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='hdmi' type-id='type-id-4754' visibility='default' filepath='include/drm/drm_connector.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='non_desktop' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='339' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='subpixel_order' filepath='include/drm/drm_connector.h' line='84' column='1' id='type-id-4753'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='SubPixelUnknown' value='0'/>
+        <enumerator name='SubPixelHorizontalRGB' value='1'/>
+        <enumerator name='SubPixelHorizontalBGR' value='2'/>
+        <enumerator name='SubPixelVerticalRGB' value='3'/>
+        <enumerator name='SubPixelVerticalBGR' value='4'/>
+        <enumerator name='SubPixelNone' value='5'/>
+      </enum-decl>
+      <class-decl name='drm_hdmi_info' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/drm/drm_connector.h' line='136' column='1' id='type-id-4754'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='scdc' type-id='type-id-4755' visibility='default' filepath='include/drm/drm_connector.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='y420_vdb_modes' type-id='type-id-219' visibility='default' filepath='include/drm/drm_connector.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='y420_cmdb_modes' type-id='type-id-219' visibility='default' filepath='include/drm/drm_connector.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='y420_cmdb_map' type-id='type-id-40' visibility='default' filepath='include/drm/drm_connector.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='y420_dc_modes' type-id='type-id-214' visibility='default' filepath='include/drm/drm_connector.h' line='160' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_scdc' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/drm/drm_connector.h' line='114' column='1' id='type-id-4755'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='supported' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='read_request' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='scrambling' type-id='type-id-4756' visibility='default' filepath='include/drm/drm_connector.h' line='126' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_scrambling' size-in-bits='16' is-struct='yes' visibility='default' filepath='include/drm/drm_connector.h' line='97' column='1' id='type-id-4756'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='supported' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='low_rates' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='105' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_connector_funcs' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/drm/drm_connector.h' line='472' column='1' id='type-id-4757'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dpms' type-id='type-id-4758' visibility='default' filepath='include/drm/drm_connector.h' line='489' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='reset' type-id='type-id-4759' visibility='default' filepath='include/drm/drm_connector.h' line='501' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='detect' type-id='type-id-4760' visibility='default' filepath='include/drm/drm_connector.h' line='529' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='force' type-id='type-id-4759' visibility='default' filepath='include/drm/drm_connector.h' line='546' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='fill_modes' type-id='type-id-4761' visibility='default' filepath='include/drm/drm_connector.h' line='571' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='set_property' type-id='type-id-4762' visibility='default' filepath='include/drm/drm_connector.h' line='587' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='late_register' type-id='type-id-4763' visibility='default' filepath='include/drm/drm_connector.h' line='606' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='early_unregister' type-id='type-id-4759' visibility='default' filepath='include/drm/drm_connector.h' line='619' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='destroy' type-id='type-id-4759' visibility='default' filepath='include/drm/drm_connector.h' line='629' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='atomic_duplicate_state' type-id='type-id-4764' visibility='default' filepath='include/drm/drm_connector.h' line='662' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='atomic_destroy_state' type-id='type-id-4765' visibility='default' filepath='include/drm/drm_connector.h' line='672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='atomic_set_property' type-id='type-id-4766' visibility='default' filepath='include/drm/drm_connector.h' line='717' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='atomic_get_property' type-id='type-id-4767' visibility='default' filepath='include/drm/drm_connector.h' line='740' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='atomic_print_state' type-id='type-id-4768' visibility='default' filepath='include/drm/drm_connector.h' line='754' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_connector_state' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/drm/drm_connector.h' line='382' column='1' id='type-id-4769'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='connector' type-id='type-id-4445' visibility='default' filepath='include/drm/drm_connector.h' line='384' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='crtc' type-id='type-id-4624' visibility='default' filepath='include/drm/drm_connector.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='best_encoder' type-id='type-id-4491' visibility='default' filepath='include/drm/drm_connector.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='link_status' type-id='type-id-4770' visibility='default' filepath='include/drm/drm_connector.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='state' type-id='type-id-4584' visibility='default' filepath='include/drm/drm_connector.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='commit' type-id='type-id-4656' visibility='default' filepath='include/drm/drm_connector.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='tv' type-id='type-id-4771' visibility='default' filepath='include/drm/drm_connector.h' line='420' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='picture_aspect_ratio' type-id='type-id-4552' visibility='default' filepath='include/drm/drm_connector.h' line='429' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='content_type' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='scaling_mode' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='content_protection' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='449' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='writeback_job' type-id='type-id-4772' visibility='default' filepath='include/drm/drm_connector.h' line='462' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_encoder' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/drm/drm_encoder.h' line='98' column='1' id='type-id-4773'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_encoder.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/drm/drm_encoder.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='base' type-id='type-id-4482' visibility='default' filepath='include/drm/drm_encoder.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/drm/drm_encoder.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='encoder_type' type-id='type-id-17' visibility='default' filepath='include/drm/drm_encoder.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='index' type-id='type-id-5' visibility='default' filepath='include/drm/drm_encoder.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='possible_crtcs' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_encoder.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='possible_clones' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_encoder.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='crtc' type-id='type-id-4624' visibility='default' filepath='include/drm/drm_encoder.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='bridge' type-id='type-id-4774' visibility='default' filepath='include/drm/drm_encoder.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='funcs' type-id='type-id-4775' visibility='default' filepath='include/drm/drm_encoder.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='helper_private' type-id='type-id-4776' visibility='default' filepath='include/drm/drm_encoder.h' line='176' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_bridge' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/drm/drm_bridge.h' line='274' column='1' id='type-id-4777'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_bridge.h' line='276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='encoder' type-id='type-id-4491' visibility='default' filepath='include/drm/drm_bridge.h' line='278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='next' type-id='type-id-4774' visibility='default' filepath='include/drm/drm_bridge.h' line='280' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='of_node' type-id='type-id-3543' visibility='default' filepath='include/drm/drm_bridge.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_bridge.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='timings' type-id='type-id-4778' visibility='default' filepath='include/drm/drm_bridge.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='funcs' type-id='type-id-4779' visibility='default' filepath='include/drm/drm_bridge.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='driver_private' type-id='type-id-15' visibility='default' filepath='include/drm/drm_bridge.h' line='296' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_bridge_timings' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/drm/drm_bridge.h' line='245' column='1' id='type-id-4780'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sampling_edge' type-id='type-id-7' visibility='default' filepath='include/drm/drm_bridge.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='setup_time_ps' type-id='type-id-7' visibility='default' filepath='include/drm/drm_bridge.h' line='261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='hold_time_ps' type-id='type-id-7' visibility='default' filepath='include/drm/drm_bridge.h' line='268' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_bridge_funcs' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/drm/drm_bridge.h' line='38' column='1' id='type-id-4781'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='attach' type-id='type-id-4782' visibility='default' filepath='include/drm/drm_bridge.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='detach' type-id='type-id-4783' visibility='default' filepath='include/drm/drm_bridge.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mode_valid' type-id='type-id-4784' visibility='default' filepath='include/drm/drm_bridge.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mode_fixup' type-id='type-id-4785' visibility='default' filepath='include/drm/drm_bridge.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='disable' type-id='type-id-4783' visibility='default' filepath='include/drm/drm_bridge.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='post_disable' type-id='type-id-4783' visibility='default' filepath='include/drm/drm_bridge.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='mode_set' type-id='type-id-4786' visibility='default' filepath='include/drm/drm_bridge.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='pre_enable' type-id='type-id-4783' visibility='default' filepath='include/drm/drm_bridge.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='enable' type-id='type-id-4783' visibility='default' filepath='include/drm/drm_bridge.h' line='239' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_encoder_funcs' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/drm/drm_encoder.h' line='39' column='1' id='type-id-4787'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='reset' type-id='type-id-4788' visibility='default' filepath='include/drm/drm_encoder.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='destroy' type-id='type-id-4788' visibility='default' filepath='include/drm/drm_encoder.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='late_register' type-id='type-id-4789' visibility='default' filepath='include/drm/drm_encoder.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='early_unregister' type-id='type-id-4788' visibility='default' filepath='include/drm/drm_encoder.h' line='82' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_encoder_helper_funcs' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='466' column='1' id='type-id-4790'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dpms' type-id='type-id-4791' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='483' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mode_valid' type-id='type-id-4792' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='516' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mode_fixup' type-id='type-id-4793' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='559' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='prepare' type-id='type-id-4788' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='576' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='commit' type-id='type-id-4788' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='591' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mode_set' type-id='type-id-4794' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='615' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='atomic_mode_set' type-id='type-id-4795' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='638' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_crtc' type-id='type-id-4796' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='656' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='detect' type-id='type-id-4797' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='disable' type-id='type-id-4788' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='704' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='enable' type-id='type-id-4788' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='722' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='atomic_check' type-id='type-id-4798' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='760' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='drm_link_status' filepath='include/drm/drm_connector.h' line='174' column='1' id='type-id-4770'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DRM_LINK_STATUS_GOOD' value='0'/>
+        <enumerator name='DRM_LINK_STATUS_BAD' value='1'/>
+      </enum-decl>
+      <class-decl name='drm_tv_connector_state' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/drm/drm_connector.h' line='362' column='1' id='type-id-4771'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='subconnector' type-id='type-id-4799' visibility='default' filepath='include/drm/drm_connector.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='margins' type-id='type-id-4800' visibility='default' filepath='include/drm/drm_connector.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='mode' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='brightness' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='contrast' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='372' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='flicker_reduction' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='overscan' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='374' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='saturation' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='hue' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='376' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='drm_mode_subconnector' filepath='include/uapi/drm/drm_mode.h' line='325' column='1' id='type-id-4799'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DRM_MODE_SUBCONNECTOR_Automatic' value='0'/>
+        <enumerator name='DRM_MODE_SUBCONNECTOR_Unknown' value='0'/>
+        <enumerator name='DRM_MODE_SUBCONNECTOR_DVID' value='3'/>
+        <enumerator name='DRM_MODE_SUBCONNECTOR_DVIA' value='4'/>
+        <enumerator name='DRM_MODE_SUBCONNECTOR_Composite' value='5'/>
+        <enumerator name='DRM_MODE_SUBCONNECTOR_SVIDEO' value='6'/>
+        <enumerator name='DRM_MODE_SUBCONNECTOR_Component' value='8'/>
+        <enumerator name='DRM_MODE_SUBCONNECTOR_SCART' value='9'/>
+      </enum-decl>
+      <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_connector.h' line='364' column='1' id='type-id-4800'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='left' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='right' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='top' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='bottom' type-id='type-id-5' visibility='default' filepath='include/drm/drm_connector.h' line='368' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='uint8_t' type-id='type-id-214' filepath='include/linux/types.h' line='107' column='1' id='type-id-4478'/>
+      <class-decl name='drm_connector_helper_funcs' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='782' column='1' id='type-id-4801'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='get_modes' type-id='type-id-4763' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='819' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='detect_ctx' type-id='type-id-4802' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='845' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mode_valid' type-id='type-id-4803' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='883' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='best_encoder' type-id='type-id-4804' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='914' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='atomic_best_encoder' type-id='type-id-4805' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='941' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='atomic_check' type-id='type-id-4806' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='975' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='atomic_commit' type-id='type-id-4765' visibility='default' filepath='include/drm/drm_modeset_helper_vtables.h' line='990' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_cmdline_mode' size-in-bits='224' is-struct='yes' visibility='default' filepath='include/drm/drm_connector.h' line='759' column='1' id='type-id-4489'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='specified' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='760' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='refresh_specified' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='761' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bpp_specified' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='762' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='xres' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='763' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='yres' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='763' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='bpp' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='764' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='refresh' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='765' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='rb' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='168'>
+          <var-decl name='interlace' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='767' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='176'>
+          <var-decl name='cvt' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='768' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='184'>
+          <var-decl name='margins' type-id='type-id-33' visibility='default' filepath='include/drm/drm_connector.h' line='769' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='force' type-id='type-id-4490' visibility='default' filepath='include/drm/drm_connector.h' line='770' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='drm_connector_force' filepath='include/drm/drm_connector.h' line='44' column='1' id='type-id-4490'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DRM_FORCE_UNSPECIFIED' value='0'/>
+        <enumerator name='DRM_FORCE_OFF' value='1'/>
+        <enumerator name='DRM_FORCE_ON' value='2'/>
+        <enumerator name='DRM_FORCE_ON_DIGITAL' value='3'/>
+      </enum-decl>
+      <class-decl name='drm_tile_group' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/drm/drm_connector.h' line='1215' column='1' id='type-id-4807'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refcount' type-id='type-id-239' visibility='default' filepath='include/drm/drm_connector.h' line='1216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_connector.h' line='1217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/drm/drm_connector.h' line='1218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='group_data' type-id='type-id-1184' visibility='default' filepath='include/drm/drm_connector.h' line='1219' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-108' size-in-bits='64' id='type-id-4727'/>
+      <pointer-type-def type-id='type-id-4456' size-in-bits='64' id='type-id-4575'/>
+      <pointer-type-def type-id='type-id-4808' size-in-bits='64' id='type-id-4660'/>
+      <qualified-type-def type-id='type-id-4659' const='yes' id='type-id-4809'/>
+      <pointer-type-def type-id='type-id-4809' size-in-bits='64' id='type-id-4658'/>
+      <qualified-type-def type-id='type-id-4781' const='yes' id='type-id-4810'/>
+      <pointer-type-def type-id='type-id-4810' size-in-bits='64' id='type-id-4779'/>
+      <qualified-type-def type-id='type-id-4780' const='yes' id='type-id-4811'/>
+      <pointer-type-def type-id='type-id-4811' size-in-bits='64' id='type-id-4778'/>
+      <qualified-type-def type-id='type-id-4617' const='yes' id='type-id-4812'/>
+      <pointer-type-def type-id='type-id-4812' size-in-bits='64' id='type-id-4615'/>
+      <qualified-type-def type-id='type-id-4757' const='yes' id='type-id-4813'/>
+      <pointer-type-def type-id='type-id-4813' size-in-bits='64' id='type-id-4485'/>
+      <qualified-type-def type-id='type-id-4801' const='yes' id='type-id-4814'/>
+      <pointer-type-def type-id='type-id-4814' size-in-bits='64' id='type-id-4488'/>
+      <qualified-type-def type-id='type-id-4769' const='yes' id='type-id-4815'/>
+      <pointer-type-def type-id='type-id-4815' size-in-bits='64' id='type-id-4816'/>
+      <qualified-type-def type-id='type-id-4667' const='yes' id='type-id-4817'/>
+      <pointer-type-def type-id='type-id-4817' size-in-bits='64' id='type-id-4628'/>
+      <qualified-type-def type-id='type-id-4696' const='yes' id='type-id-4818'/>
+      <pointer-type-def type-id='type-id-4818' size-in-bits='64' id='type-id-4630'/>
+      <qualified-type-def type-id='type-id-4693' const='yes' id='type-id-4819'/>
+      <pointer-type-def type-id='type-id-4819' size-in-bits='64' id='type-id-4820'/>
+      <qualified-type-def type-id='type-id-4550' const='yes' id='type-id-4821'/>
+      <pointer-type-def type-id='type-id-4821' size-in-bits='64' id='type-id-4822'/>
+      <qualified-type-def type-id='type-id-4787' const='yes' id='type-id-4823'/>
+      <pointer-type-def type-id='type-id-4823' size-in-bits='64' id='type-id-4775'/>
+      <qualified-type-def type-id='type-id-4790' const='yes' id='type-id-4824'/>
+      <pointer-type-def type-id='type-id-4824' size-in-bits='64' id='type-id-4776'/>
+      <qualified-type-def type-id='type-id-4708' const='yes' id='type-id-4825'/>
+      <pointer-type-def type-id='type-id-4825' size-in-bits='64' id='type-id-4613'/>
+      <qualified-type-def type-id='type-id-4599' const='yes' id='type-id-4826'/>
+      <pointer-type-def type-id='type-id-4826' size-in-bits='64' id='type-id-4597'/>
+      <pointer-type-def type-id='type-id-4827' size-in-bits='64' id='type-id-4590'/>
+      <qualified-type-def type-id='type-id-4600' const='yes' id='type-id-4828'/>
+      <pointer-type-def type-id='type-id-4828' size-in-bits='64' id='type-id-4598'/>
+      <qualified-type-def type-id='type-id-4462' const='yes' id='type-id-4829'/>
+      <pointer-type-def type-id='type-id-4829' size-in-bits='64' id='type-id-4830'/>
+      <qualified-type-def type-id='type-id-4567' const='yes' id='type-id-4831'/>
+      <pointer-type-def type-id='type-id-4831' size-in-bits='64' id='type-id-4543'/>
+      <qualified-type-def type-id='type-id-4588' const='yes' id='type-id-4832'/>
+      <pointer-type-def type-id='type-id-4832' size-in-bits='64' id='type-id-4583'/>
+      <qualified-type-def type-id='type-id-4606' const='yes' id='type-id-4833'/>
+      <pointer-type-def type-id='type-id-4833' size-in-bits='64' id='type-id-4585'/>
+      <qualified-type-def type-id='type-id-4605' const='yes' id='type-id-4834'/>
+      <pointer-type-def type-id='type-id-4834' size-in-bits='64' id='type-id-4835'/>
+      <qualified-type-def type-id='type-id-4639' const='yes' id='type-id-4836'/>
+      <pointer-type-def type-id='type-id-4836' size-in-bits='64' id='type-id-4635'/>
+      <qualified-type-def type-id='type-id-4665' const='yes' id='type-id-4837'/>
+      <pointer-type-def type-id='type-id-4837' size-in-bits='64' id='type-id-4637'/>
+      <qualified-type-def type-id='type-id-4651' const='yes' id='type-id-4838'/>
+      <pointer-type-def type-id='type-id-4838' size-in-bits='64' id='type-id-4839'/>
+      <qualified-type-def type-id='type-id-4748' const='yes' id='type-id-4840'/>
+      <pointer-type-def type-id='type-id-4840' size-in-bits='64' id='type-id-4841'/>
+      <qualified-type-def type-id='type-id-4747' const='yes' id='type-id-4842'/>
+      <pointer-type-def type-id='type-id-4842' size-in-bits='64' id='type-id-4843'/>
+      <qualified-type-def type-id='type-id-4749' const='yes' id='type-id-4844'/>
+      <pointer-type-def type-id='type-id-4844' size-in-bits='64' id='type-id-4845'/>
+      <pointer-type-def type-id='type-id-4457' size-in-bits='64' id='type-id-4846'/>
+      <pointer-type-def type-id='type-id-4847' size-in-bits='64' id='type-id-4531'/>
+      <pointer-type-def type-id='type-id-4458' size-in-bits='64' id='type-id-4848'/>
+      <pointer-type-def type-id='type-id-4657' size-in-bits='64' id='type-id-4652'/>
+      <pointer-type-def type-id='type-id-4573' size-in-bits='64' id='type-id-4502'/>
+      <pointer-type-def type-id='type-id-4459' size-in-bits='64' id='type-id-4584'/>
+      <pointer-type-def type-id='type-id-4849' size-in-bits='64' id='type-id-4594'/>
+      <pointer-type-def type-id='type-id-4777' size-in-bits='64' id='type-id-4774'/>
+      <pointer-type-def type-id='type-id-4620' size-in-bits='64' id='type-id-4609'/>
+      <pointer-type-def type-id='type-id-4608' size-in-bits='64' id='type-id-4621'/>
+      <pointer-type-def type-id='type-id-4604' size-in-bits='64' id='type-id-4850'/>
+      <pointer-type-def type-id='type-id-4481' size-in-bits='64' id='type-id-4445'/>
+      <pointer-type-def type-id='type-id-4445' size-in-bits='64' id='type-id-4625'/>
+      <pointer-type-def type-id='type-id-4769' size-in-bits='64' id='type-id-4492'/>
+      <pointer-type-def type-id='type-id-4851' size-in-bits='64' id='type-id-4764'/>
+      <pointer-type-def type-id='type-id-4626' size-in-bits='64' id='type-id-4624'/>
+      <pointer-type-def type-id='type-id-4852' size-in-bits='64' id='type-id-4796'/>
+      <pointer-type-def type-id='type-id-4460' size-in-bits='64' id='type-id-4656'/>
+      <pointer-type-def type-id='type-id-4706' size-in-bits='64' id='type-id-4705'/>
+      <pointer-type-def type-id='type-id-4693' size-in-bits='64' id='type-id-4631'/>
+      <pointer-type-def type-id='type-id-4853' size-in-bits='64' id='type-id-4677'/>
+      <pointer-type-def type-id='type-id-4495' size-in-bits='64' id='type-id-4447'/>
+      <pointer-type-def type-id='type-id-4461' size-in-bits='64' id='type-id-4500'/>
+      <pointer-type-def type-id='type-id-4550' size-in-bits='64' id='type-id-4446'/>
+      <pointer-type-def type-id='type-id-4446' size-in-bits='64' id='type-id-4854'/>
+      <pointer-type-def type-id='type-id-4509' size-in-bits='64' id='type-id-4496'/>
+      <pointer-type-def type-id='type-id-4773' size-in-bits='64' id='type-id-4491'/>
+      <pointer-type-def type-id='type-id-4855' size-in-bits='64' id='type-id-4804'/>
+      <pointer-type-def type-id='type-id-4856' size-in-bits='64' id='type-id-4805'/>
+      <pointer-type-def type-id='type-id-4690' size-in-bits='64' id='type-id-4689'/>
+      <pointer-type-def type-id='type-id-4607' size-in-bits='64' id='type-id-4508'/>
+      <pointer-type-def type-id='type-id-4707' size-in-bits='64' id='type-id-4857'/>
+      <pointer-type-def type-id='type-id-4857' size-in-bits='64' id='type-id-4612'/>
+      <pointer-type-def type-id='type-id-4622' size-in-bits='64' id='type-id-4611'/>
+      <pointer-type-def type-id='type-id-4611' size-in-bits='64' id='type-id-4858'/>
+      <pointer-type-def type-id='type-id-4711' size-in-bits='64' id='type-id-4859'/>
+      <pointer-type-def type-id='type-id-4712' size-in-bits='64' id='type-id-4860'/>
+      <pointer-type-def type-id='type-id-4546' size-in-bits='64' id='type-id-4616'/>
+      <pointer-type-def type-id='type-id-4596' size-in-bits='64' id='type-id-4610'/>
+      <pointer-type-def type-id='type-id-4861' size-in-bits='64' id='type-id-4589'/>
+      <pointer-type-def type-id='type-id-4462' size-in-bits='64' id='type-id-4469'/>
+      <pointer-type-def type-id='type-id-4862' size-in-bits='64' id='type-id-4532'/>
+      <pointer-type-def type-id='type-id-4863' size-in-bits='64' id='type-id-4536'/>
+      <pointer-type-def type-id='type-id-4864' size-in-bits='64' id='type-id-4528'/>
+      <pointer-type-def type-id='type-id-4579' size-in-bits='64' id='type-id-4578'/>
+      <pointer-type-def type-id='type-id-4571' size-in-bits='64' id='type-id-4569'/>
+      <pointer-type-def type-id='type-id-4463' size-in-bits='64' id='type-id-4505'/>
+      <pointer-type-def type-id='type-id-4464' size-in-bits='64' id='type-id-4498'/>
+      <pointer-type-def type-id='type-id-4549' size-in-bits='64' id='type-id-4497'/>
+      <pointer-type-def type-id='type-id-4566' size-in-bits='64' id='type-id-4865'/>
+      <pointer-type-def type-id='type-id-4623' size-in-bits='64' id='type-id-4866'/>
+      <pointer-type-def type-id='type-id-4586' size-in-bits='64' id='type-id-4582'/>
+      <pointer-type-def type-id='type-id-4581' size-in-bits='64' id='type-id-4587'/>
+      <pointer-type-def type-id='type-id-4487' size-in-bits='64' id='type-id-4553'/>
+      <pointer-type-def type-id='type-id-4685' size-in-bits='64' id='type-id-4694'/>
+      <pointer-type-def type-id='type-id-4633' size-in-bits='64' id='type-id-4627'/>
+      <pointer-type-def type-id='type-id-4651' size-in-bits='64' id='type-id-4638'/>
+      <pointer-type-def type-id='type-id-4867' size-in-bits='64' id='type-id-4644'/>
+      <pointer-type-def type-id='type-id-4557' size-in-bits='64' id='type-id-4868'/>
+      <pointer-type-def type-id='type-id-4555' size-in-bits='64' id='type-id-4471'/>
+      <pointer-type-def type-id='type-id-4695' size-in-bits='64' id='type-id-4486'/>
+      <pointer-type-def type-id='type-id-4465' size-in-bits='64' id='type-id-4503'/>
+      <pointer-type-def type-id='type-id-4807' size-in-bits='64' id='type-id-4493'/>
+      <pointer-type-def type-id='type-id-4572' size-in-bits='64' id='type-id-4501'/>
+      <pointer-type-def type-id='type-id-4466' size-in-bits='64' id='type-id-4507'/>
+      <pointer-type-def type-id='type-id-4467' size-in-bits='64' id='type-id-4772'/>
+      <pointer-type-def type-id='type-id-4869' size-in-bits='64' id='type-id-4760'/>
+      <pointer-type-def type-id='type-id-4870' size-in-bits='64' id='type-id-4797'/>
+      <pointer-type-def type-id='type-id-4871' size-in-bits='64' id='type-id-4784'/>
+      <pointer-type-def type-id='type-id-4872' size-in-bits='64' id='type-id-4803'/>
+      <pointer-type-def type-id='type-id-4873' size-in-bits='64' id='type-id-4698'/>
+      <pointer-type-def type-id='type-id-4874' size-in-bits='64' id='type-id-4591'/>
+      <pointer-type-def type-id='type-id-4875' size-in-bits='64' id='type-id-4792'/>
+      <pointer-type-def type-id='type-id-4752' size-in-bits='64' id='type-id-4876'/>
+      <pointer-type-def type-id='type-id-4718' size-in-bits='64' id='type-id-4877'/>
+      <pointer-type-def type-id='type-id-4750' size-in-bits='64' id='type-id-4878'/>
+      <pointer-type-def type-id='type-id-4728' size-in-bits='64' id='type-id-4720'/>
+      <pointer-type-def type-id='type-id-4713' size-in-bits='64' id='type-id-4614'/>
+      <pointer-type-def type-id='type-id-4731' size-in-bits='64' id='type-id-4721'/>
+      <pointer-type-def type-id='type-id-4714' size-in-bits='64' id='type-id-4879'/>
+      <pointer-type-def type-id='type-id-4725' size-in-bits='64' id='type-id-4719'/>
+      <pointer-type-def type-id='type-id-4880' size-in-bits='64' id='type-id-4782'/>
+      <pointer-type-def type-id='type-id-4881' size-in-bits='64' id='type-id-4619'/>
+      <pointer-type-def type-id='type-id-4882' size-in-bits='64' id='type-id-4763'/>
+      <pointer-type-def type-id='type-id-4883' size-in-bits='64' id='type-id-4767'/>
+      <pointer-type-def type-id='type-id-4884' size-in-bits='64' id='type-id-4806'/>
+      <pointer-type-def type-id='type-id-4885' size-in-bits='64' id='type-id-4766'/>
+      <pointer-type-def type-id='type-id-4886' size-in-bits='64' id='type-id-4802'/>
+      <pointer-type-def type-id='type-id-4887' size-in-bits='64' id='type-id-4762'/>
+      <pointer-type-def type-id='type-id-4888' size-in-bits='64' id='type-id-4758'/>
+      <pointer-type-def type-id='type-id-4889' size-in-bits='64' id='type-id-4761'/>
+      <pointer-type-def type-id='type-id-4890' size-in-bits='64' id='type-id-4681'/>
+      <pointer-type-def type-id='type-id-4891' size-in-bits='64' id='type-id-4682'/>
+      <pointer-type-def type-id='type-id-4892' size-in-bits='64' id='type-id-4680'/>
+      <pointer-type-def type-id='type-id-4893' size-in-bits='64' id='type-id-4703'/>
+      <pointer-type-def type-id='type-id-4894' size-in-bits='64' id='type-id-4679'/>
+      <pointer-type-def type-id='type-id-4895' size-in-bits='64' id='type-id-4700'/>
+      <pointer-type-def type-id='type-id-4896' size-in-bits='64' id='type-id-4669'/>
+      <pointer-type-def type-id='type-id-4897' size-in-bits='64' id='type-id-4670'/>
+      <pointer-type-def type-id='type-id-4898' size-in-bits='64' id='type-id-4674'/>
+      <pointer-type-def type-id='type-id-4899' size-in-bits='64' id='type-id-4675'/>
+      <pointer-type-def type-id='type-id-4900' size-in-bits='64' id='type-id-4702'/>
+      <pointer-type-def type-id='type-id-4901' size-in-bits='64' id='type-id-4676'/>
+      <pointer-type-def type-id='type-id-4902' size-in-bits='64' id='type-id-4671'/>
+      <pointer-type-def type-id='type-id-4903' size-in-bits='64' id='type-id-4701'/>
+      <pointer-type-def type-id='type-id-4904' size-in-bits='64' id='type-id-4672'/>
+      <pointer-type-def type-id='type-id-4905' size-in-bits='64' id='type-id-4519'/>
+      <pointer-type-def type-id='type-id-4906' size-in-bits='64' id='type-id-4592'/>
+      <pointer-type-def type-id='type-id-4907' size-in-bits='64' id='type-id-4593'/>
+      <pointer-type-def type-id='type-id-4908' size-in-bits='64' id='type-id-4511'/>
+      <pointer-type-def type-id='type-id-4909' size-in-bits='64' id='type-id-4530'/>
+      <pointer-type-def type-id='type-id-4910' size-in-bits='64' id='type-id-4522'/>
+      <pointer-type-def type-id='type-id-4911' size-in-bits='64' id='type-id-4529'/>
+      <pointer-type-def type-id='type-id-4912' size-in-bits='64' id='type-id-4520'/>
+      <pointer-type-def type-id='type-id-4913' size-in-bits='64' id='type-id-4545'/>
+      <pointer-type-def type-id='type-id-4914' size-in-bits='64' id='type-id-4515'/>
+      <pointer-type-def type-id='type-id-4915' size-in-bits='64' id='type-id-4510'/>
+      <pointer-type-def type-id='type-id-4570' size-in-bits='64' id='type-id-4544'/>
+      <pointer-type-def type-id='type-id-4916' size-in-bits='64' id='type-id-4789'/>
+      <pointer-type-def type-id='type-id-4917' size-in-bits='64' id='type-id-4798'/>
+      <pointer-type-def type-id='type-id-4918' size-in-bits='64' id='type-id-4709'/>
+      <pointer-type-def type-id='type-id-4919' size-in-bits='64' id='type-id-4540'/>
+      <pointer-type-def type-id='type-id-4920' size-in-bits='64' id='type-id-4542'/>
+      <pointer-type-def type-id='type-id-4921' size-in-bits='64' id='type-id-4541'/>
+      <pointer-type-def type-id='type-id-4922' size-in-bits='64' id='type-id-4602'/>
+      <pointer-type-def type-id='type-id-4923' size-in-bits='64' id='type-id-4603'/>
+      <pointer-type-def type-id='type-id-4924' size-in-bits='64' id='type-id-4533'/>
+      <pointer-type-def type-id='type-id-4925' size-in-bits='64' id='type-id-4525'/>
+      <pointer-type-def type-id='type-id-4926' size-in-bits='64' id='type-id-4539'/>
+      <pointer-type-def type-id='type-id-4927' size-in-bits='64' id='type-id-4523'/>
+      <pointer-type-def type-id='type-id-4928' size-in-bits='64' id='type-id-4673'/>
+      <pointer-type-def type-id='type-id-4929' size-in-bits='64' id='type-id-4648'/>
+      <pointer-type-def type-id='type-id-4930' size-in-bits='64' id='type-id-4647'/>
+      <pointer-type-def type-id='type-id-4931' size-in-bits='64' id='type-id-4640'/>
+      <pointer-type-def type-id='type-id-4932' size-in-bits='64' id='type-id-4641'/>
+      <pointer-type-def type-id='type-id-4933' size-in-bits='64' id='type-id-4666'/>
+      <pointer-type-def type-id='type-id-4934' size-in-bits='64' id='type-id-4646'/>
+      <pointer-type-def type-id='type-id-4935' size-in-bits='64' id='type-id-4643'/>
+      <pointer-type-def type-id='type-id-4936' size-in-bits='64' id='type-id-4738'/>
+      <pointer-type-def type-id='type-id-4937' size-in-bits='64' id='type-id-4736'/>
+      <pointer-type-def type-id='type-id-4938' size-in-bits='64' id='type-id-4743'/>
+      <pointer-type-def type-id='type-id-4939' size-in-bits='64' id='type-id-4732'/>
+      <pointer-type-def type-id='type-id-4940' size-in-bits='64' id='type-id-4744'/>
+      <pointer-type-def type-id='type-id-4941' size-in-bits='64' id='type-id-4745'/>
+      <pointer-type-def type-id='type-id-4942' size-in-bits='64' id='type-id-4735'/>
+      <pointer-type-def type-id='type-id-4943' size-in-bits='64' id='type-id-4739'/>
+      <pointer-type-def type-id='type-id-4944' size-in-bits='64' id='type-id-4737'/>
+      <pointer-type-def type-id='type-id-239' size-in-bits='64' id='type-id-4945'/>
+      <pointer-type-def type-id='type-id-682' size-in-bits='64' id='type-id-4946'/>
+      <pointer-type-def type-id='type-id-4947' size-in-bits='64' id='type-id-4662'/>
+      <pointer-type-def type-id='type-id-4468' size-in-bits='64' id='type-id-4948'/>
+      <pointer-type-def type-id='type-id-4949' size-in-bits='64' id='type-id-4534'/>
+      <pointer-type-def type-id='type-id-4950' size-in-bits='64' id='type-id-4535'/>
+      <pointer-type-def type-id='type-id-4951' size-in-bits='64' id='type-id-4661'/>
+      <pointer-type-def type-id='type-id-4952' size-in-bits='64' id='type-id-4785'/>
+      <pointer-type-def type-id='type-id-4953' size-in-bits='64' id='type-id-4699'/>
+      <pointer-type-def type-id='type-id-4954' size-in-bits='64' id='type-id-4518'/>
+      <pointer-type-def type-id='type-id-4955' size-in-bits='64' id='type-id-4517'/>
+      <pointer-type-def type-id='type-id-4956' size-in-bits='64' id='type-id-4793'/>
+      <pointer-type-def type-id='type-id-4957' size-in-bits='64' id='type-id-4710'/>
+      <pointer-type-def type-id='type-id-4958' size-in-bits='64' id='type-id-4650'/>
+      <pointer-type-def type-id='type-id-4959' size-in-bits='64' id='type-id-4733'/>
+      <pointer-type-def type-id='type-id-4960' size-in-bits='64' id='type-id-4734'/>
+      <pointer-type-def type-id='type-id-4961' size-in-bits='64' id='type-id-4684'/>
+      <pointer-type-def type-id='type-id-4962' size-in-bits='64' id='type-id-4514'/>
+      <pointer-type-def type-id='type-id-688' size-in-bits='64' id='type-id-4963'/>
+      <pointer-type-def type-id='type-id-4494' size-in-bits='64' id='type-id-4629'/>
+      <pointer-type-def type-id='type-id-1341' size-in-bits='64' id='type-id-4634'/>
+      <pointer-type-def type-id='type-id-2438' size-in-bits='64' id='type-id-4556'/>
+      <pointer-type-def type-id='type-id-4560' size-in-bits='64' id='type-id-4964'/>
+      <pointer-type-def type-id='type-id-4563' size-in-bits='64' id='type-id-4561'/>
+      <pointer-type-def type-id='type-id-4965' size-in-bits='64' id='type-id-4688'/>
+      <pointer-type-def type-id='type-id-4966' size-in-bits='64' id='type-id-4663'/>
+      <pointer-type-def type-id='type-id-4967' size-in-bits='64' id='type-id-4664'/>
+      <pointer-type-def type-id='type-id-4968' size-in-bits='64' id='type-id-4595'/>
+      <pointer-type-def type-id='type-id-4969' size-in-bits='64' id='type-id-4783'/>
+      <pointer-type-def type-id='type-id-4970' size-in-bits='64' id='type-id-4786'/>
+      <pointer-type-def type-id='type-id-4971' size-in-bits='64' id='type-id-4618'/>
+      <pointer-type-def type-id='type-id-4972' size-in-bits='64' id='type-id-4759'/>
+      <pointer-type-def type-id='type-id-4973' size-in-bits='64' id='type-id-4765'/>
+      <pointer-type-def type-id='type-id-4974' size-in-bits='64' id='type-id-4668'/>
+      <pointer-type-def type-id='type-id-4975' size-in-bits='64' id='type-id-4678'/>
+      <pointer-type-def type-id='type-id-4976' size-in-bits='64' id='type-id-4697'/>
+      <pointer-type-def type-id='type-id-4977' size-in-bits='64' id='type-id-4513'/>
+      <pointer-type-def type-id='type-id-4978' size-in-bits='64' id='type-id-4512'/>
+      <pointer-type-def type-id='type-id-4979' size-in-bits='64' id='type-id-4521'/>
+      <pointer-type-def type-id='type-id-4980' size-in-bits='64' id='type-id-4516'/>
+      <pointer-type-def type-id='type-id-4981' size-in-bits='64' id='type-id-4788'/>
+      <pointer-type-def type-id='type-id-4982' size-in-bits='64' id='type-id-4795'/>
+      <pointer-type-def type-id='type-id-4983' size-in-bits='64' id='type-id-4794'/>
+      <pointer-type-def type-id='type-id-4984' size-in-bits='64' id='type-id-4791'/>
+      <pointer-type-def type-id='type-id-4985' size-in-bits='64' id='type-id-4601'/>
+      <pointer-type-def type-id='type-id-4986' size-in-bits='64' id='type-id-4524'/>
+      <pointer-type-def type-id='type-id-4987' size-in-bits='64' id='type-id-4526'/>
+      <pointer-type-def type-id='type-id-4988' size-in-bits='64' id='type-id-4538'/>
+      <pointer-type-def type-id='type-id-4989' size-in-bits='64' id='type-id-4642'/>
+      <pointer-type-def type-id='type-id-4990' size-in-bits='64' id='type-id-4645'/>
+      <pointer-type-def type-id='type-id-4991' size-in-bits='64' id='type-id-4559'/>
+      <pointer-type-def type-id='type-id-4992' size-in-bits='64' id='type-id-4768'/>
+      <pointer-type-def type-id='type-id-4993' size-in-bits='64' id='type-id-4683'/>
+      <pointer-type-def type-id='type-id-4994' size-in-bits='64' id='type-id-4649'/>
+      <pointer-type-def type-id='type-id-4995' size-in-bits='64' id='type-id-4527'/>
+      <pointer-type-def type-id='type-id-4996' size-in-bits='64' id='type-id-4558'/>
+      <pointer-type-def type-id='type-id-4997' size-in-bits='64' id='type-id-4729'/>
+      <pointer-type-def type-id='type-id-4998' size-in-bits='64' id='type-id-4741'/>
+      <pointer-type-def type-id='type-id-4999' size-in-bits='64' id='type-id-4740'/>
+      <pointer-type-def type-id='type-id-5000' size-in-bits='64' id='type-id-4742'/>
+      <pointer-type-def type-id='type-id-5001' size-in-bits='64' id='type-id-4746'/>
+      <pointer-type-def type-id='type-id-5002' size-in-bits='64' id='type-id-4730'/>
+      <pointer-type-def type-id='type-id-5003' size-in-bits='64' id='type-id-4726'/>
+      <pointer-type-def type-id='type-id-5004' size-in-bits='64' id='type-id-4554'/>
+      <pointer-type-def type-id='type-id-5005' size-in-bits='64' id='type-id-4537'/>
+      <qualified-type-def type-id='type-id-5' volatile='yes' id='type-id-4580'/>
+      <function-decl name='drm_helper_probe_single_connector_modes' mangled-name='drm_helper_probe_single_connector_modes' filepath='drivers/gpu/drm/drm_probe_helper.c' line='387' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_helper_probe_single_connector_modes'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_probe_helper.c' line='387' column='1'/>
+        <parameter type-id='type-id-1341' name='maxX' filepath='drivers/gpu/drm/drm_probe_helper.c' line='388' column='1'/>
+        <parameter type-id='type-id-1341' name='maxY' filepath='drivers/gpu/drm/drm_probe_helper.c' line='388' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_kms_helper_hotplug_event' mangled-name='drm_kms_helper_hotplug_event' filepath='drivers/gpu/drm/drm_probe_helper.c' line='564' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_kms_helper_hotplug_event'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_probe_helper.c' line='564' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_helper_hpd_irq_event' mangled-name='drm_helper_hpd_irq_event' filepath='drivers/gpu/drm/drm_probe_helper.c' line='772' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_helper_hpd_irq_event'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_probe_helper.c' line='772' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-4808'>
+        <parameter type-id='type-id-4652'/>
+        <return type-id='type-id-4'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4827'>
+        <parameter type-id='type-id-4835'/>
+        <return type-id='type-id-4597'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4847'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4469'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-4846'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4849'>
+        <parameter type-id='type-id-4447'/>
+        <return type-id='type-id-4584'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4851'>
+        <parameter type-id='type-id-4445'/>
+        <return type-id='type-id-4492'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4852'>
+        <parameter type-id='type-id-4491'/>
+        <return type-id='type-id-4624'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4853'>
+        <parameter type-id='type-id-4624'/>
+        <return type-id='type-id-4631'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4855'>
+        <parameter type-id='type-id-4445'/>
+        <return type-id='type-id-4491'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4856'>
+        <parameter type-id='type-id-4445'/>
+        <parameter type-id='type-id-4492'/>
+        <return type-id='type-id-4491'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4861'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-4835'/>
+        <return type-id='type-id-4610'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4862'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4846'/>
+        <return type-id='type-id-4469'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4863'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4848'/>
+        <parameter type-id='type-id-920'/>
+        <return type-id='type-id-4469'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4864'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-4469'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4867'>
+        <parameter type-id='type-id-4627'/>
+        <return type-id='type-id-4638'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4869'>
+        <parameter type-id='type-id-4445'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-4483'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4870'>
+        <parameter type-id='type-id-4491'/>
+        <parameter type-id='type-id-4445'/>
+        <return type-id='type-id-4483'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4871'>
+        <parameter type-id='type-id-4774'/>
+        <parameter type-id='type-id-4822'/>
+        <return type-id='type-id-4551'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4872'>
+        <parameter type-id='type-id-4445'/>
+        <parameter type-id='type-id-4446'/>
+        <return type-id='type-id-4551'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4873'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4822'/>
+        <return type-id='type-id-4551'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4874'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4822'/>
+        <return type-id='type-id-4551'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4875'>
+        <parameter type-id='type-id-4491'/>
+        <parameter type-id='type-id-4822'/>
+        <return type-id='type-id-4551'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4880'>
+        <parameter type-id='type-id-4774'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4881'>
+        <parameter type-id='type-id-4621'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4882'>
+        <parameter type-id='type-id-4445'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4883'>
+        <parameter type-id='type-id-4445'/>
+        <parameter type-id='type-id-4816'/>
+        <parameter type-id='type-id-4471'/>
+        <parameter type-id='type-id-4556'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4884'>
+        <parameter type-id='type-id-4445'/>
+        <parameter type-id='type-id-4492'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4885'>
+        <parameter type-id='type-id-4445'/>
+        <parameter type-id='type-id-4492'/>
+        <parameter type-id='type-id-4471'/>
+        <parameter type-id='type-id-2438'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4886'>
+        <parameter type-id='type-id-4445'/>
+        <parameter type-id='type-id-4582'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4887'>
+        <parameter type-id='type-id-4445'/>
+        <parameter type-id='type-id-4471'/>
+        <parameter type-id='type-id-2438'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4888'>
+        <parameter type-id='type-id-4445'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4889'>
+        <parameter type-id='type-id-4445' name='connector'/>
+        <parameter type-id='type-id-1341' name='maxX'/>
+        <parameter type-id='type-id-1341' name='maxY'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4890'>
+        <parameter type-id='type-id-4624'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4891'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-3056'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4892'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4820'/>
+        <parameter type-id='type-id-4471'/>
+        <parameter type-id='type-id-4556'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4893'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4631'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4894'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4631'/>
+        <parameter type-id='type-id-4471'/>
+        <parameter type-id='type-id-2438'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4895'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4446'/>
+        <parameter type-id='type-id-4446'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-4610'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4896'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-1341'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4897'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-1629'/>
+        <parameter type-id='type-id-1629'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4898'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4610'/>
+        <parameter type-id='type-id-4694'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-4582'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4899'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4610'/>
+        <parameter type-id='type-id-4694'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-4582'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4900'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4610'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-4704'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4901'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4471'/>
+        <parameter type-id='type-id-2438'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4902'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4903'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-4610'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4904'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4963'/>
+        <parameter type-id='type-id-4963'/>
+        <parameter type-id='type-id-4963'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-4582'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4905'>
+        <parameter type-id='type-id-4447'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4906'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4584'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4907'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4584'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4908'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4616'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4909'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-4634'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4910'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4911'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4912'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4498'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4913'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4914'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4915'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4570'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-4616'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4916'>
+        <parameter type-id='type-id-4491'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4917'>
+        <parameter type-id='type-id-4491'/>
+        <parameter type-id='type-id-4631'/>
+        <parameter type-id='type-id-4492'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4918'>
+        <parameter type-id='type-id-4508'/>
+        <parameter type-id='type-id-4859'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4919'>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4865'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4920'>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-1341'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4921'>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-4556'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4922'>
+        <parameter type-id='type-id-4610'/>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-482'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4923'>
+        <parameter type-id='type-id-4610'/>
+        <parameter type-id='type-id-4616'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-4850'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4924'>
+        <parameter type-id='type-id-4469'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4925'>
+        <parameter type-id='type-id-4469'/>
+        <parameter type-id='type-id-4616'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4926'>
+        <parameter type-id='type-id-4469'/>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4927'>
+        <parameter type-id='type-id-4497'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4928'>
+        <parameter type-id='type-id-4866'/>
+        <parameter type-id='type-id-4582'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4929'>
+        <parameter type-id='type-id-4627'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4930'>
+        <parameter type-id='type-id-4627'/>
+        <parameter type-id='type-id-4839'/>
+        <parameter type-id='type-id-4471'/>
+        <parameter type-id='type-id-4556'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4931'>
+        <parameter type-id='type-id-4627'/>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4610'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-4582'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4932'>
+        <parameter type-id='type-id-4627'/>
+        <parameter type-id='type-id-4582'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4933'>
+        <parameter type-id='type-id-4627'/>
+        <parameter type-id='type-id-4638'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4934'>
+        <parameter type-id='type-id-4627'/>
+        <parameter type-id='type-id-4638'/>
+        <parameter type-id='type-id-4471'/>
+        <parameter type-id='type-id-2438'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4935'>
+        <parameter type-id='type-id-4627'/>
+        <parameter type-id='type-id-4471'/>
+        <parameter type-id='type-id-2438'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4936'>
+        <parameter type-id='type-id-4877'/>
+        <parameter type-id='type-id-4614'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4937'>
+        <parameter type-id='type-id-4614'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4938'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-4878'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4939'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4940'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4941'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4942'>
+        <parameter type-id='type-id-4879'/>
+        <parameter type-id='type-id-4614'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4943'>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-4614'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4944'>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-4614'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4947'>
+        <parameter type-id='type-id-4652'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-192'/>
+        <return type-id='type-id-192'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4949'>
+        <parameter type-id='type-id-4469'/>
+        <return type-id='type-id-4948'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4950'>
+        <parameter type-id='type-id-4469'/>
+        <return type-id='type-id-920'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4951'>
+        <parameter type-id='type-id-4652'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4952'>
+        <parameter type-id='type-id-4774'/>
+        <parameter type-id='type-id-4822'/>
+        <parameter type-id='type-id-4446'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4953'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4822'/>
+        <parameter type-id='type-id-4446'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4954'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-666'/>
+        <parameter type-id='type-id-4946'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4955'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-666'/>
+        <parameter type-id='type-id-666'/>
+        <parameter type-id='type-id-4946'/>
+        <parameter type-id='type-id-4946'/>
+        <parameter type-id='type-id-4822'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4956'>
+        <parameter type-id='type-id-4491'/>
+        <parameter type-id='type-id-4822'/>
+        <parameter type-id='type-id-4446'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4957'>
+        <parameter type-id='type-id-4508'/>
+        <parameter type-id='type-id-4858'/>
+        <parameter type-id='type-id-4854'/>
+        <parameter type-id='type-id-4860'/>
+        <parameter type-id='type-id-2610'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4958'>
+        <parameter type-id='type-id-4627'/>
+        <parameter type-id='type-id-1341'/>
+        <parameter type-id='type-id-2438'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4959'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-85'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4960'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-85'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4961'>
+        <parameter type-id='type-id-4624'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4962'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4965'>
+        <parameter type-id='type-id-1392'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4966'>
+        <parameter type-id='type-id-4652'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4967'>
+        <parameter type-id='type-id-4652'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4968'>
+        <parameter type-id='type-id-4584'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4969'>
+        <parameter type-id='type-id-4774'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4970'>
+        <parameter type-id='type-id-4774'/>
+        <parameter type-id='type-id-4446'/>
+        <parameter type-id='type-id-4446'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4971'>
+        <parameter type-id='type-id-4621'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4972'>
+        <parameter type-id='type-id-4445'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4973'>
+        <parameter type-id='type-id-4445'/>
+        <parameter type-id='type-id-4492'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4974'>
+        <parameter type-id='type-id-4624'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4975'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-4631'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4976'>
+        <parameter type-id='type-id-4624'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4977'>
+        <parameter type-id='type-id-4447'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4978'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4616'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4979'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-4498'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4980'>
+        <parameter type-id='type-id-4447'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4981'>
+        <parameter type-id='type-id-4491'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4982'>
+        <parameter type-id='type-id-4491'/>
+        <parameter type-id='type-id-4631'/>
+        <parameter type-id='type-id-4492'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4983'>
+        <parameter type-id='type-id-4491'/>
+        <parameter type-id='type-id-4446'/>
+        <parameter type-id='type-id-4446'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4984'>
+        <parameter type-id='type-id-4491'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4985'>
+        <parameter type-id='type-id-4610'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4986'>
+        <parameter type-id='type-id-4469'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4987'>
+        <parameter type-id='type-id-4469'/>
+        <parameter type-id='type-id-4616'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4988'>
+        <parameter type-id='type-id-4469'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4989'>
+        <parameter type-id='type-id-4627'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4990'>
+        <parameter type-id='type-id-4627'/>
+        <parameter type-id='type-id-4638'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4991'>
+        <parameter type-id='type-id-4868'/>
+        <parameter type-id='type-id-4'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4992'>
+        <parameter type-id='type-id-4868'/>
+        <parameter type-id='type-id-4816'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4993'>
+        <parameter type-id='type-id-4868'/>
+        <parameter type-id='type-id-4820'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4994'>
+        <parameter type-id='type-id-4868'/>
+        <parameter type-id='type-id-4839'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4995'>
+        <parameter type-id='type-id-4868'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-4830'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4996'>
+        <parameter type-id='type-id-4868'/>
+        <parameter type-id='type-id-4964'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4997'>
+        <parameter type-id='type-id-4614'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4998'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-4841'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-4999'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-4843'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5000'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-4845'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5001'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-4876'/>
+        <parameter type-id='type-id-4879'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5002'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-877'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5003'>
+        <parameter type-id='type-id-4614'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5004'>
+        <parameter type-id='type-id-4945'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5005'>
+        <parameter type-id='type-id-4469'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <union-decl name='__anonymous_union__3' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/drm/drm_vblank.h' line='57' column='1' id='type-id-4687'>
+        <data-member access='private'>
+          <var-decl name='base' type-id='type-id-4690' visibility='default' filepath='include/drm/drm_vblank.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='vbl' type-id='type-id-4691' visibility='default' filepath='include/drm/drm_vblank.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='seq' type-id='type-id-4692' visibility='default' filepath='include/drm/drm_vblank.h' line='76' column='1'/>
+        </data-member>
+      </union-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_connector.c' language='LANG_C89'>
+      <qualified-type-def type-id='type-id-5006' const='yes' id='type-id-5007'/>
+      <pointer-type-def type-id='type-id-5007' size-in-bits='64' id='type-id-5008'/>
+      <function-decl name='drm_connector_init' mangled-name='drm_connector_init' filepath='drivers/gpu/drm/drm_connector.c' line='189' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_connector_init'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_connector.c' line='189' column='1'/>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_connector.c' line='190' column='1'/>
+        <parameter type-id='type-id-4485' name='funcs' filepath='drivers/gpu/drm/drm_connector.c' line='191' column='1'/>
+        <parameter type-id='type-id-17' name='connector_type' filepath='drivers/gpu/drm/drm_connector.c' line='192' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_connector_attach_edid_property' mangled-name='drm_connector_attach_edid_property' filepath='drivers/gpu/drm/drm_connector.c' line='300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_connector_attach_edid_property'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_connector.c' line='300' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_connector_attach_encoder' mangled-name='drm_connector_attach_encoder' filepath='drivers/gpu/drm/drm_connector.c' line='322' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_connector_attach_encoder'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_connector.c' line='322' column='1'/>
+        <parameter type-id='type-id-4491' name='encoder' filepath='drivers/gpu/drm/drm_connector.c' line='323' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_connector_cleanup' mangled-name='drm_connector_cleanup' filepath='drivers/gpu/drm/drm_connector.c' line='387' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_connector_cleanup'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_connector.c' line='387' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_connector_unregister' mangled-name='drm_connector_unregister' filepath='drivers/gpu/drm/drm_connector.c' line='491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_connector_unregister'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_connector.c' line='491' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_connector_register' mangled-name='drm_connector_register' filepath='drivers/gpu/drm/drm_connector.c' line='444' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_connector_register'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_connector.c' line='444' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_connector_update_edid_property' mangled-name='drm_connector_update_edid_property' filepath='drivers/gpu/drm/drm_connector.c' line='1527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_connector_update_edid_property'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_connector.c' line='1527' column='1'/>
+        <parameter type-id='type-id-5008' name='edid' filepath='drivers/gpu/drm/drm_connector.c' line='1528' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_atomic_helper.c' language='LANG_C89'>
+      <class-decl name='drm_atomic_state' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/drm/drm_atomic.h' line='282' column='1' id='type-id-5009'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ref' type-id='type-id-239' visibility='default' filepath='include/drm/drm_atomic.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_atomic.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='allow_modeset' type-id='type-id-33' visibility='default' filepath='include/drm/drm_atomic.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='legacy_cursor_update' type-id='type-id-33' visibility='default' filepath='include/drm/drm_atomic.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='async_update' type-id='type-id-33' visibility='default' filepath='include/drm/drm_atomic.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='planes' type-id='type-id-5010' visibility='default' filepath='include/drm/drm_atomic.h' line='289' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='crtcs' type-id='type-id-5011' visibility='default' filepath='include/drm/drm_atomic.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='num_connector' type-id='type-id-17' visibility='default' filepath='include/drm/drm_atomic.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='connectors' type-id='type-id-5012' visibility='default' filepath='include/drm/drm_atomic.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='num_private_objs' type-id='type-id-17' visibility='default' filepath='include/drm/drm_atomic.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='private_objs' type-id='type-id-5013' visibility='default' filepath='include/drm/drm_atomic.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='acquire_ctx' type-id='type-id-4582' visibility='default' filepath='include/drm/drm_atomic.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='fake_commit' type-id='type-id-5014' visibility='default' filepath='include/drm/drm_atomic.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='commit_work' type-id='type-id-255' visibility='default' filepath='include/drm/drm_atomic.h' line='316' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__drm_planes_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/drm/drm_atomic.h' line='148' column='1' id='type-id-5015'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ptr' type-id='type-id-4627' visibility='default' filepath='include/drm/drm_atomic.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='state' type-id='type-id-4638' visibility='default' filepath='include/drm/drm_atomic.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='old_state' type-id='type-id-4638' visibility='default' filepath='include/drm/drm_atomic.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='new_state' type-id='type-id-4638' visibility='default' filepath='include/drm/drm_atomic.h' line='150' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_crtc_commit' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/drm/drm_atomic.h' line='69' column='1' id='type-id-5016'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='crtc' type-id='type-id-4624' visibility='default' filepath='include/drm/drm_atomic.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ref' type-id='type-id-239' visibility='default' filepath='include/drm/drm_atomic.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flip_done' type-id='type-id-1606' visibility='default' filepath='include/drm/drm_atomic.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='hw_done' type-id='type-id-1606' visibility='default' filepath='include/drm/drm_atomic.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='cleanup_done' type-id='type-id-1606' visibility='default' filepath='include/drm/drm_atomic.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='commit_entry' type-id='type-id-20' visibility='default' filepath='include/drm/drm_atomic.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='event' type-id='type-id-4694' visibility='default' filepath='include/drm/drm_atomic.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='abort_completion' type-id='type-id-33' visibility='default' filepath='include/drm/drm_atomic.h' line='145' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__drm_crtcs_state' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/drm/drm_atomic.h' line='153' column='1' id='type-id-5017'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ptr' type-id='type-id-4624' visibility='default' filepath='include/drm/drm_atomic.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='state' type-id='type-id-4631' visibility='default' filepath='include/drm/drm_atomic.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='old_state' type-id='type-id-4631' visibility='default' filepath='include/drm/drm_atomic.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='new_state' type-id='type-id-4631' visibility='default' filepath='include/drm/drm_atomic.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='commit' type-id='type-id-5014' visibility='default' filepath='include/drm/drm_atomic.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='out_fence_ptr' type-id='type-id-2283' visibility='default' filepath='include/drm/drm_atomic.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='last_vblank_count' type-id='type-id-40' visibility='default' filepath='include/drm/drm_atomic.h' line='168' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__drm_connnectors_state' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/drm/drm_atomic.h' line='171' column='1' id='type-id-5018'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ptr' type-id='type-id-4445' visibility='default' filepath='include/drm/drm_atomic.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='state' type-id='type-id-4492' visibility='default' filepath='include/drm/drm_atomic.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='old_state' type-id='type-id-4492' visibility='default' filepath='include/drm/drm_atomic.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='new_state' type-id='type-id-4492' visibility='default' filepath='include/drm/drm_atomic.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='out_fence_ptr' type-id='type-id-2283' visibility='default' filepath='include/drm/drm_atomic.h' line='181' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__drm_private_objs_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/drm/drm_atomic.h' line='258' column='1' id='type-id-5019'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ptr' type-id='type-id-5020' visibility='default' filepath='include/drm/drm_atomic.h' line='259' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='state' type-id='type-id-5021' visibility='default' filepath='include/drm/drm_atomic.h' line='260' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='old_state' type-id='type-id-5021' visibility='default' filepath='include/drm/drm_atomic.h' line='260' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='new_state' type-id='type-id-5021' visibility='default' filepath='include/drm/drm_atomic.h' line='260' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_private_obj' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/drm/drm_atomic.h' line='231' column='1' id='type-id-5022'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='state' type-id='type-id-5021' visibility='default' filepath='include/drm/drm_atomic.h' line='235' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='funcs' type-id='type-id-5023' visibility='default' filepath='include/drm/drm_atomic.h' line='243' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_private_state' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/drm/drm_atomic.h' line='254' column='1' id='type-id-5024'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='state' type-id='type-id-5025' visibility='default' filepath='include/drm/drm_atomic.h' line='255' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_private_state_funcs' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/drm/drm_atomic.h' line='197' column='1' id='type-id-5026'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='atomic_duplicate_state' type-id='type-id-5027' visibility='default' filepath='include/drm/drm_atomic.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='atomic_destroy_state' type-id='type-id-5028' visibility='default' filepath='include/drm/drm_atomic.h' line='216' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-5018' size-in-bits='64' id='type-id-5012'/>
+      <pointer-type-def type-id='type-id-5017' size-in-bits='64' id='type-id-5011'/>
+      <pointer-type-def type-id='type-id-5015' size-in-bits='64' id='type-id-5010'/>
+      <pointer-type-def type-id='type-id-5019' size-in-bits='64' id='type-id-5013'/>
+      <qualified-type-def type-id='type-id-5026' const='yes' id='type-id-5029'/>
+      <pointer-type-def type-id='type-id-5029' size-in-bits='64' id='type-id-5023'/>
+      <pointer-type-def type-id='type-id-5009' size-in-bits='64' id='type-id-5025'/>
+      <pointer-type-def type-id='type-id-5016' size-in-bits='64' id='type-id-5014'/>
+      <pointer-type-def type-id='type-id-5022' size-in-bits='64' id='type-id-5020'/>
+      <pointer-type-def type-id='type-id-5024' size-in-bits='64' id='type-id-5021'/>
+      <pointer-type-def type-id='type-id-5030' size-in-bits='64' id='type-id-5027'/>
+      <pointer-type-def type-id='type-id-5031' size-in-bits='64' id='type-id-5028'/>
+      <function-decl name='drm_atomic_helper_check' mangled-name='drm_atomic_helper_check' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='887' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_check'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='887' column='1'/>
+        <parameter type-id='type-id-5025' name='state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='888' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_commit_modeset_disables' mangled-name='drm_atomic_helper_commit_modeset_disables' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_commit_modeset_disables'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1165' column='1'/>
+        <parameter type-id='type-id-5025' name='old_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1166' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_commit_modeset_enables' mangled-name='drm_atomic_helper_commit_modeset_enables' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1211' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_commit_modeset_enables'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1211' column='1'/>
+        <parameter type-id='type-id-5025' name='old_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1212' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_wait_for_vblanks' mangled-name='drm_atomic_helper_wait_for_vblanks' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1349' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_wait_for_vblanks'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1349' column='1'/>
+        <parameter type-id='type-id-5025' name='old_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1350' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_commit_planes' mangled-name='drm_atomic_helper_commit_planes' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2310' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_commit_planes'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2310' column='1'/>
+        <parameter type-id='type-id-5025' name='old_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2311' column='1'/>
+        <parameter type-id='type-id-1341' name='flags' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2312' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_commit_hw_done' mangled-name='drm_atomic_helper_commit_hw_done' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2143' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_commit_hw_done'>
+        <parameter type-id='type-id-5025' name='old_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2143' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_cleanup_planes' mangled-name='drm_atomic_helper_cleanup_planes' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2516' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_cleanup_planes'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2516' column='1'/>
+        <parameter type-id='type-id-5025' name='old_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2517' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_commit' mangled-name='drm_atomic_helper_commit' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1662' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_commit'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1662' column='1'/>
+        <parameter type-id='type-id-5025' name='state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1663' column='1'/>
+        <parameter type-id='type-id-33' name='nonblock' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='1664' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_update_plane' mangled-name='drm_atomic_helper_update_plane' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2710' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_update_plane'>
+        <parameter type-id='type-id-4627' name='plane' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2710' column='1'/>
+        <parameter type-id='type-id-4624' name='crtc' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2711' column='1'/>
+        <parameter type-id='type-id-4610' name='fb' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2712' column='1'/>
+        <parameter type-id='type-id-17' name='crtc_x' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2713' column='1'/>
+        <parameter type-id='type-id-17' name='crtc_y' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2713' column='1'/>
+        <parameter type-id='type-id-5' name='crtc_w' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2714' column='1'/>
+        <parameter type-id='type-id-5' name='crtc_h' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2714' column='1'/>
+        <parameter type-id='type-id-1341' name='src_x' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2715' column='1'/>
+        <parameter type-id='type-id-1341' name='src_y' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2715' column='1'/>
+        <parameter type-id='type-id-1341' name='src_w' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2716' column='1'/>
+        <parameter type-id='type-id-1341' name='src_h' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2716' column='1'/>
+        <parameter type-id='type-id-4582' name='ctx' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2717' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_disable_plane' mangled-name='drm_atomic_helper_disable_plane' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_disable_plane'>
+        <parameter type-id='type-id-4627' name='plane' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2767' column='1'/>
+        <parameter type-id='type-id-4582' name='ctx' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2768' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_set_config' mangled-name='drm_atomic_helper_set_config' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2904' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_set_config'>
+        <parameter type-id='type-id-4866' name='set' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2904' column='1'/>
+        <parameter type-id='type-id-4582' name='ctx' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='2905' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_shutdown' mangled-name='drm_atomic_helper_shutdown' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3109' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_shutdown'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3109' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_page_flip' mangled-name='drm_atomic_helper_page_flip' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3343' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_page_flip'>
+        <parameter type-id='type-id-4624' name='crtc' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3343' column='1'/>
+        <parameter type-id='type-id-4610' name='fb' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3344' column='1'/>
+        <parameter type-id='type-id-4694' name='event' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3345' column='1'/>
+        <parameter type-id='type-id-1341' name='flags' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3346' column='1'/>
+        <parameter type-id='type-id-4582' name='ctx' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3347' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_crtc_reset' mangled-name='drm_atomic_helper_crtc_reset' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_crtc_reset'>
+        <parameter type-id='type-id-4624' name='crtc' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3467' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_crtc_duplicate_state' mangled-name='drm_atomic_helper_crtc_duplicate_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3521' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_crtc_duplicate_state'>
+        <parameter type-id='type-id-4624' name='crtc' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3521' column='1'/>
+        <return type-id='type-id-4631'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_crtc_destroy_state' mangled-name='drm_atomic_helper_crtc_destroy_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3580' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_crtc_destroy_state'>
+        <parameter type-id='type-id-4624' name='crtc' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3580' column='1'/>
+        <parameter type-id='type-id-4631' name='state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3581' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_plane_reset' mangled-name='drm_atomic_helper_plane_reset' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3595' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_plane_reset'>
+        <parameter type-id='type-id-4627' name='plane' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3595' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_plane_duplicate_state' mangled-name='drm_atomic_helper_plane_duplicate_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3643' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_plane_duplicate_state'>
+        <parameter type-id='type-id-4627' name='plane' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3643' column='1'/>
+        <return type-id='type-id-4638'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_plane_destroy_state' mangled-name='drm_atomic_helper_plane_destroy_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3687' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_plane_destroy_state'>
+        <parameter type-id='type-id-4627' name='plane' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3687' column='1'/>
+        <parameter type-id='type-id-4638' name='state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3688' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_connector_reset' mangled-name='drm_atomic_helper_connector_reset' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3726' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_connector_reset'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3726' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_connector_duplicate_state' mangled-name='drm_atomic_helper_connector_duplicate_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3769' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_connector_duplicate_state'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3769' column='1'/>
+        <return type-id='type-id-4492'/>
+      </function-decl>
+      <function-decl name='drm_atomic_helper_connector_destroy_state' mangled-name='drm_atomic_helper_connector_destroy_state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3898' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_atomic_helper_connector_destroy_state'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3898' column='1'/>
+        <parameter type-id='type-id-4492' name='state' filepath='drivers/gpu/drm/drm_atomic_helper.c' line='3899' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5030'>
+        <parameter type-id='type-id-5020'/>
+        <return type-id='type-id-5021'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5031'>
+        <parameter type-id='type-id-5020'/>
+        <parameter type-id='type-id-5021'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_modeset_helper.c' language='LANG_C89'>
+      <function-decl name='drm_helper_mode_fill_fb_struct' mangled-name='drm_helper_mode_fill_fb_struct' filepath='drivers/gpu/drm/drm_modeset_helper.c' line='77' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_helper_mode_fill_fb_struct'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_modeset_helper.c' line='77' column='1'/>
+        <parameter type-id='type-id-4610' name='fb' filepath='drivers/gpu/drm/drm_modeset_helper.c' line='78' column='1'/>
+        <parameter type-id='type-id-4835' name='mode_cmd' filepath='drivers/gpu/drm/drm_modeset_helper.c' line='79' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_gem_framebuffer_helper.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-4652' size-in-bits='infinite' id='type-id-5032'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='drm_gem_object' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/drm/drm_gem.h' line='49' column='1' id='type-id-5033'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refcount' type-id='type-id-239' visibility='default' filepath='include/drm/drm_gem.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='handle_count' type-id='type-id-5' visibility='default' filepath='include/drm/drm_gem.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev' type-id='type-id-4447' visibility='default' filepath='include/drm/drm_gem.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='filp' type-id='type-id-83' visibility='default' filepath='include/drm/drm_gem.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='vma_node' type-id='type-id-5034' visibility='default' filepath='include/drm/drm_gem.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='size' type-id='type-id-84' visibility='default' filepath='include/drm/drm_gem.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='name' type-id='type-id-17' visibility='default' filepath='include/drm/drm_gem.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='dma_buf' type-id='type-id-5035' visibility='default' filepath='include/drm/drm_gem.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='import_attach' type-id='type-id-5036' visibility='default' filepath='include/drm/drm_gem.h' line='148' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_vma_offset_node' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/drm/drm_vma_manager.h' line='40' column='1' id='type-id-5034'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='vm_lock' type-id='type-id-885' visibility='default' filepath='include/drm/drm_vma_manager.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='vm_node' type-id='type-id-5037' visibility='default' filepath='include/drm/drm_vma_manager.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='vm_files' type-id='type-id-416' visibility='default' filepath='include/drm/drm_vma_manager.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='readonly' type-id='type-id-33' visibility='default' filepath='include/drm/drm_vma_manager.h' line='44' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_mm_node' size-in-bits='1280' is-struct='yes' visibility='default' filepath='include/drm/drm_mm.h' line='155' column='1' id='type-id-5037'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='color' type-id='type-id-16' visibility='default' filepath='include/drm/drm_mm.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='start' type-id='type-id-40' visibility='default' filepath='include/drm/drm_mm.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='size' type-id='type-id-40' visibility='default' filepath='include/drm/drm_mm.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mm' type-id='type-id-5038' visibility='default' filepath='include/drm/drm_mm.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='node_list' type-id='type-id-20' visibility='default' filepath='include/drm/drm_mm.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='hole_stack' type-id='type-id-20' visibility='default' filepath='include/drm/drm_mm.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='rb' type-id='type-id-422' visibility='default' filepath='include/drm/drm_mm.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='rb_hole_size' type-id='type-id-422' visibility='default' filepath='include/drm/drm_mm.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='rb_hole_addr' type-id='type-id-422' visibility='default' filepath='include/drm/drm_mm.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='__subtree_last' type-id='type-id-40' visibility='default' filepath='include/drm/drm_mm.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='hole_size' type-id='type-id-40' visibility='default' filepath='include/drm/drm_mm.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='allocated' type-id='type-id-33' visibility='default' filepath='include/drm/drm_mm.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='scanned_block' type-id='type-id-33' visibility='default' filepath='include/drm/drm_mm.h' line='172' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_mm' size-in-bits='1856' is-struct='yes' visibility='default' filepath='include/drm/drm_mm.h' line='186' column='1' id='type-id-5039'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='color_adjust' type-id='type-id-5040' visibility='default' filepath='include/drm/drm_mm.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='hole_stack' type-id='type-id-20' visibility='default' filepath='include/drm/drm_mm.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='head_node' type-id='type-id-5037' visibility='default' filepath='include/drm/drm_mm.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='interval_tree' type-id='type-id-1521' visibility='default' filepath='include/drm/drm_mm.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='holes_size' type-id='type-id-1521' visibility='default' filepath='include/drm/drm_mm.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='holes_addr' type-id='type-id-416' visibility='default' filepath='include/drm/drm_mm.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='scan_active' type-id='type-id-16' visibility='default' filepath='include/drm/drm_mm.h' line='211' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_buf' size-in-bits='1984' is-struct='yes' visibility='default' filepath='include/linux/dma-buf.h' line='282' column='1' id='type-id-5041'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='size' type-id='type-id-84' visibility='default' filepath='include/linux/dma-buf.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='file' type-id='type-id-83' visibility='default' filepath='include/linux/dma-buf.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='attachments' type-id='type-id-20' visibility='default' filepath='include/linux/dma-buf.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ops' type-id='type-id-5042' visibility='default' filepath='include/linux/dma-buf.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='lock' type-id='type-id-245' visibility='default' filepath='include/linux/dma-buf.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='vmapping_counter' type-id='type-id-5' visibility='default' filepath='include/linux/dma-buf.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='vmap_ptr' type-id='type-id-15' visibility='default' filepath='include/linux/dma-buf.h' line='289' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='exp_name' type-id='type-id-4' visibility='default' filepath='include/linux/dma-buf.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/dma-buf.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/dma-buf.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='list_node' type-id='type-id-20' visibility='default' filepath='include/linux/dma-buf.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='priv' type-id='type-id-15' visibility='default' filepath='include/linux/dma-buf.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='resv' type-id='type-id-5043' visibility='default' filepath='include/linux/dma-buf.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='poll' type-id='type-id-225' visibility='default' filepath='include/linux/dma-buf.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='cb_excl' type-id='type-id-5044' visibility='default' filepath='include/linux/dma-buf.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='cb_shared' type-id='type-id-5044' visibility='default' filepath='include/linux/dma-buf.h' line='305' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_buf_ops' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/dma-buf.h' line='53' column='1' id='type-id-5045'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='attach' type-id='type-id-5046' visibility='default' filepath='include/linux/dma-buf.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='detach' type-id='type-id-5047' visibility='default' filepath='include/linux/dma-buf.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='map_dma_buf' type-id='type-id-5048' visibility='default' filepath='include/linux/dma-buf.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='unmap_dma_buf' type-id='type-id-5049' visibility='default' filepath='include/linux/dma-buf.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='release' type-id='type-id-5050' visibility='default' filepath='include/linux/dma-buf.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='begin_cpu_access' type-id='type-id-5051' visibility='default' filepath='include/linux/dma-buf.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='end_cpu_access' type-id='type-id-5051' visibility='default' filepath='include/linux/dma-buf.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='map' type-id='type-id-5052' visibility='default' filepath='include/linux/dma-buf.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='unmap' type-id='type-id-5053' visibility='default' filepath='include/linux/dma-buf.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mmap' type-id='type-id-5054' visibility='default' filepath='include/linux/dma-buf.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='vmap' type-id='type-id-5055' visibility='default' filepath='include/linux/dma-buf.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='vunmap' type-id='type-id-5056' visibility='default' filepath='include/linux/dma-buf.h' line='249' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_buf_attachment' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/dma-buf.h' line='324' column='1' id='type-id-5057'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dmabuf' type-id='type-id-5035' visibility='default' filepath='include/linux/dma-buf.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/dma-buf.h' line='326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/linux/dma-buf.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='priv' type-id='type-id-15' visibility='default' filepath='include/linux/dma-buf.h' line='328' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='reservation_object' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/reservation.h' line='73' column='1' id='type-id-5058'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-3467' visibility='default' filepath='include/linux/reservation.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='seq' type-id='type-id-387' visibility='default' filepath='include/linux/reservation.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='fence_excl' type-id='type-id-4652' visibility='default' filepath='include/linux/reservation.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='fence' type-id='type-id-5059' visibility='default' filepath='include/linux/reservation.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='staged' type-id='type-id-5059' visibility='default' filepath='include/linux/reservation.h' line='79' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='reservation_object_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/reservation.h' line='59' column='1' id='type-id-5060'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/reservation.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='shared_count' type-id='type-id-7' visibility='default' filepath='include/linux/reservation.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='shared_max' type-id='type-id-7' visibility='default' filepath='include/linux/reservation.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='shared' type-id='type-id-5032' visibility='default' filepath='include/linux/reservation.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_buf_poll_cb_t' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/dma-buf.h' line='300' column='1' id='type-id-5044'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cb' type-id='type-id-5061' visibility='default' filepath='include/linux/dma-buf.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='poll' type-id='type-id-881' visibility='default' filepath='include/linux/dma-buf.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='active' type-id='type-id-880' visibility='default' filepath='include/linux/dma-buf.h' line='304' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dma_fence_cb' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/dma-fence.h' line='104' column='1' id='type-id-5061'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/linux/dma-fence.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='func' type-id='type-id-5062' visibility='default' filepath='include/linux/dma-fence.h' line='106' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='dma_fence_func_t' type-id='type-id-5063' filepath='include/linux/dma-fence.h' line='93' column='1' id='type-id-5062'/>
+      <qualified-type-def type-id='type-id-5045' const='yes' id='type-id-5064'/>
+      <pointer-type-def type-id='type-id-5064' size-in-bits='64' id='type-id-5042'/>
+      <qualified-type-def type-id='type-id-5037' const='yes' id='type-id-5065'/>
+      <pointer-type-def type-id='type-id-5065' size-in-bits='64' id='type-id-5066'/>
+      <pointer-type-def type-id='type-id-5041' size-in-bits='64' id='type-id-5035'/>
+      <pointer-type-def type-id='type-id-5057' size-in-bits='64' id='type-id-5036'/>
+      <pointer-type-def type-id='type-id-5061' size-in-bits='64' id='type-id-5067'/>
+      <pointer-type-def type-id='type-id-5033' size-in-bits='64' id='type-id-5068'/>
+      <pointer-type-def type-id='type-id-5039' size-in-bits='64' id='type-id-5038'/>
+      <pointer-type-def type-id='type-id-5069' size-in-bits='64' id='type-id-5046'/>
+      <pointer-type-def type-id='type-id-5070' size-in-bits='64' id='type-id-5051'/>
+      <pointer-type-def type-id='type-id-5071' size-in-bits='64' id='type-id-5054'/>
+      <pointer-type-def type-id='type-id-5058' size-in-bits='64' id='type-id-5043'/>
+      <pointer-type-def type-id='type-id-5060' size-in-bits='64' id='type-id-5059'/>
+      <pointer-type-def type-id='type-id-5072' size-in-bits='64' id='type-id-5048'/>
+      <pointer-type-def type-id='type-id-5073' size-in-bits='64' id='type-id-5040'/>
+      <pointer-type-def type-id='type-id-5074' size-in-bits='64' id='type-id-5050'/>
+      <pointer-type-def type-id='type-id-5075' size-in-bits='64' id='type-id-5047'/>
+      <pointer-type-def type-id='type-id-5076' size-in-bits='64' id='type-id-5053'/>
+      <pointer-type-def type-id='type-id-5077' size-in-bits='64' id='type-id-5056'/>
+      <pointer-type-def type-id='type-id-5078' size-in-bits='64' id='type-id-5049'/>
+      <pointer-type-def type-id='type-id-5079' size-in-bits='64' id='type-id-5063'/>
+      <pointer-type-def type-id='type-id-5080' size-in-bits='64' id='type-id-5055'/>
+      <pointer-type-def type-id='type-id-5081' size-in-bits='64' id='type-id-5052'/>
+      <function-decl name='drm_gem_fb_destroy' mangled-name='drm_gem_fb_destroy' filepath='drivers/gpu/drm/drm_gem_framebuffer_helper.c' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_fb_destroy'>
+        <parameter type-id='type-id-4610' name='fb' filepath='drivers/gpu/drm/drm_gem_framebuffer_helper.c' line='97' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_gem_fb_create_handle' mangled-name='drm_gem_fb_create_handle' filepath='drivers/gpu/drm/drm_gem_framebuffer_helper.c' line='122' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_fb_create_handle'>
+        <parameter type-id='type-id-4610' name='fb' filepath='drivers/gpu/drm/drm_gem_framebuffer_helper.c' line='122' column='1'/>
+        <parameter type-id='type-id-4616' name='file' filepath='drivers/gpu/drm/drm_gem_framebuffer_helper.c' line='122' column='1'/>
+        <parameter type-id='type-id-482' name='handle' filepath='drivers/gpu/drm/drm_gem_framebuffer_helper.c' line='123' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5069'>
+        <parameter type-id='type-id-5035'/>
+        <parameter type-id='type-id-5036'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5070'>
+        <parameter type-id='type-id-5035'/>
+        <parameter type-id='type-id-2159'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5071'>
+        <parameter type-id='type-id-5035'/>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5072'>
+        <parameter type-id='type-id-5036'/>
+        <parameter type-id='type-id-2159'/>
+        <return type-id='type-id-920'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5073'>
+        <parameter type-id='type-id-5066'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-1508'/>
+        <parameter type-id='type-id-1508'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5074'>
+        <parameter type-id='type-id-5035'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5075'>
+        <parameter type-id='type-id-5035'/>
+        <parameter type-id='type-id-5036'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5076'>
+        <parameter type-id='type-id-5035'/>
+        <parameter type-id='type-id-16'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5077'>
+        <parameter type-id='type-id-5035'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5078'>
+        <parameter type-id='type-id-5036'/>
+        <parameter type-id='type-id-920'/>
+        <parameter type-id='type-id-2159'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5079'>
+        <parameter type-id='type-id-4652'/>
+        <parameter type-id='type-id-5067'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5080'>
+        <parameter type-id='type-id-5035'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5081'>
+        <parameter type-id='type-id-5035'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-15'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_cache.c' language='LANG_C89'>
+      <function-decl name='drm_clflush_pages' mangled-name='drm_clflush_pages' filepath='drivers/gpu/drm/drm_cache.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_clflush_pages'>
+        <parameter type-id='type-id-921' name='pages' filepath='drivers/gpu/drm/drm_cache.c' line='81' column='1'/>
+        <parameter type-id='type-id-16' name='num_pages' filepath='drivers/gpu/drm/drm_cache.c' line='81' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_file.c' language='LANG_C89'>
+      <function-decl name='drm_open' mangled-name='drm_open' filepath='drivers/gpu/drm/drm_file.c' line='298' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_open'>
+        <parameter type-id='type-id-1127' name='inode' filepath='drivers/gpu/drm/drm_file.c' line='298' column='1'/>
+        <parameter type-id='type-id-83' name='filp' filepath='drivers/gpu/drm/drm_file.c' line='298' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_release' mangled-name='drm_release' filepath='drivers/gpu/drm/drm_file.c' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_release'>
+        <parameter type-id='type-id-1127' name='inode' filepath='drivers/gpu/drm/drm_file.c' line='466' column='1'/>
+        <parameter type-id='type-id-83' name='filp' filepath='drivers/gpu/drm/drm_file.c' line='466' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_read' mangled-name='drm_read' filepath='drivers/gpu/drm/drm_file.c' line='519' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_read'>
+        <parameter type-id='type-id-83' name='filp' filepath='drivers/gpu/drm/drm_file.c' line='519' column='1'/>
+        <parameter type-id='type-id-2' name='buffer' filepath='drivers/gpu/drm/drm_file.c' line='519' column='1'/>
+        <parameter type-id='type-id-84' name='count' filepath='drivers/gpu/drm/drm_file.c' line='520' column='1'/>
+        <parameter type-id='type-id-85' name='offset' filepath='drivers/gpu/drm/drm_file.c' line='520' column='1'/>
+        <return type-id='type-id-86'/>
+      </function-decl>
+      <function-decl name='drm_poll' mangled-name='drm_poll' filepath='drivers/gpu/drm/drm_file.c' line='606' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_poll'>
+        <parameter type-id='type-id-83' name='filp' filepath='drivers/gpu/drm/drm_file.c' line='606' column='1'/>
+        <parameter type-id='type-id-879' name='wait' filepath='drivers/gpu/drm/drm_file.c' line='606' column='1'/>
+        <return type-id='type-id-880'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_gem.c' language='LANG_C89'>
+      <function-decl name='drm_gem_object_init' mangled-name='drm_gem_object_init' filepath='drivers/gpu/drm/drm_gem.c' line='135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_object_init'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_gem.c' line='135' column='1'/>
+        <parameter type-id='type-id-5068' name='obj' filepath='drivers/gpu/drm/drm_gem.c' line='136' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='drivers/gpu/drm/drm_gem.c' line='136' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_gem_object_lookup' mangled-name='drm_gem_object_lookup' filepath='drivers/gpu/drm/drm_gem.c' line='637' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_object_lookup'>
+        <parameter type-id='type-id-4616' name='filp' filepath='drivers/gpu/drm/drm_gem.c' line='637' column='1'/>
+        <parameter type-id='type-id-7' name='handle' filepath='drivers/gpu/drm/drm_gem.c' line='637' column='1'/>
+        <return type-id='type-id-5068'/>
+      </function-decl>
+      <function-decl name='drm_gem_object_put_unlocked' mangled-name='drm_gem_object_put_unlocked' filepath='drivers/gpu/drm/drm_gem.c' line='858' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_object_put_unlocked'>
+        <parameter type-id='type-id-5068' name='obj' filepath='drivers/gpu/drm/drm_gem.c' line='858' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_gem_handle_create' mangled-name='drm_gem_handle_create' filepath='drivers/gpu/drm/drm_gem.c' line='446' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_handle_create'>
+        <parameter type-id='type-id-4616' name='file_priv' filepath='drivers/gpu/drm/drm_gem.c' line='446' column='1'/>
+        <parameter type-id='type-id-5068' name='obj' filepath='drivers/gpu/drm/drm_gem.c' line='447' column='1'/>
+        <parameter type-id='type-id-1565' name='handlep' filepath='drivers/gpu/drm/drm_gem.c' line='448' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_gem_object_release' mangled-name='drm_gem_object_release' filepath='drivers/gpu/drm/drm_gem.c' line='811' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_object_release'>
+        <parameter type-id='type-id-5068' name='obj' filepath='drivers/gpu/drm/drm_gem.c' line='811' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_drv.c' language='LANG_C89'>
+
+      <array-type-def dimensions='1' type-id='type-id-5082' size-in-bits='7360' id='type-id-5083'>
+        <subrange length='23' type-id='type-id-9' id='type-id-5084'/>
+
+      </array-type-def>
+      <class-decl name='drm_lock_data' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/drm/drm_auth.h' line='37' column='1' id='type-id-5085'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hw_lock' type-id='type-id-4578' visibility='default' filepath='include/drm/drm_auth.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='file_priv' type-id='type-id-4616' visibility='default' filepath='include/drm/drm_auth.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lock_queue' type-id='type-id-225' visibility='default' filepath='include/drm/drm_auth.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='lock_time' type-id='type-id-16' visibility='default' filepath='include/drm/drm_auth.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='spinlock' type-id='type-id-247' visibility='default' filepath='include/drm/drm_auth.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='kernel_waiters' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_auth.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='user_waiters' type-id='type-id-1341' visibility='default' filepath='include/drm/drm_auth.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='idle_has_lock' type-id='type-id-17' visibility='default' filepath='include/drm/drm_auth.h' line='45' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_buf_entry' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/drm/drm_legacy.h' line='86' column='1' id='type-id-5082'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buf_size' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='buf_count' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='buflist' type-id='type-id-5086' visibility='default' filepath='include/drm/drm_legacy.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='seg_count' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='page_order' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='seglist' type-id='type-id-5087' visibility='default' filepath='include/drm/drm_legacy.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='low_mark' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='high_mark' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='95' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='drm_buf' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/drm/drm_legacy.h' line='50' column='1' id='type-id-5088'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='idx' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='total' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='order' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='used' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='offset' type-id='type-id-16' visibility='default' filepath='include/drm/drm_legacy.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='address' type-id='type-id-15' visibility='default' filepath='include/drm/drm_legacy.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='bus_address' type-id='type-id-16' visibility='default' filepath='include/drm/drm_legacy.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='next' type-id='type-id-5086' visibility='default' filepath='include/drm/drm_legacy.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='waiting' type-id='type-id-5089' visibility='default' filepath='include/drm/drm_legacy.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='pending' type-id='type-id-5089' visibility='default' filepath='include/drm/drm_legacy.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='file_priv' type-id='type-id-4616' visibility='default' filepath='include/drm/drm_legacy.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='context' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='while_locked' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='list' type-id='type-id-5090' visibility='default' filepath='include/drm/drm_legacy.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='dev_priv_size' type-id='type-id-17' visibility='default' filepath='include/drm/drm_legacy.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='dev_private' type-id='type-id-15' visibility='default' filepath='include/drm/drm_legacy.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='include/drm/drm_legacy.h' line='64' column='1' id='type-id-5090'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DRM_LIST_NONE' value='0'/>
+        <enumerator name='DRM_LIST_FREE' value='1'/>
+        <enumerator name='DRM_LIST_WAIT' value='2'/>
+        <enumerator name='DRM_LIST_PEND' value='3'/>
+        <enumerator name='DRM_LIST_PRIO' value='4'/>
+        <enumerator name='DRM_LIST_RECLAIM' value='5'/>
+      </enum-decl>
+      <class-decl name='drm_dma_handle' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/drm/drm_legacy.h' line='77' column='1' id='type-id-5091'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='busaddr' type-id='type-id-2081' visibility='default' filepath='include/drm/drm_legacy.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='vaddr' type-id='type-id-15' visibility='default' filepath='include/drm/drm_legacy.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='size' type-id='type-id-84' visibility='default' filepath='include/drm/drm_legacy.h' line='80' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='__anonymous_enum__1' is-anonymous='yes' filepath='include/drm/drm_legacy.h' line='110' column='1' id='type-id-5092'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='_DRM_DMA_USE_AGP' value='1'/>
+        <enumerator name='_DRM_DMA_USE_SG' value='2'/>
+        <enumerator name='_DRM_DMA_USE_FB' value='4'/>
+        <enumerator name='_DRM_DMA_USE_PCI_RO' value='8'/>
+      </enum-decl>
+      <enum-decl name='drm_map_type' filepath='include/uapi/drm/drm.h' line='188' column='1' id='type-id-5093'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='_DRM_FRAME_BUFFER' value='0'/>
+        <enumerator name='_DRM_REGISTERS' value='1'/>
+        <enumerator name='_DRM_SHM' value='2'/>
+        <enumerator name='_DRM_AGP' value='3'/>
+        <enumerator name='_DRM_SCATTER_GATHER' value='4'/>
+        <enumerator name='_DRM_CONSISTENT' value='5'/>
+      </enum-decl>
+      <enum-decl name='drm_map_flags' filepath='include/uapi/drm/drm.h' line='200' column='1' id='type-id-5094'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='_DRM_RESTRICTED' value='1'/>
+        <enumerator name='_DRM_READ_ONLY' value='2'/>
+        <enumerator name='_DRM_LOCKED' value='4'/>
+        <enumerator name='_DRM_KERNEL' value='8'/>
+        <enumerator name='_DRM_WRITE_COMBINING' value='16'/>
+        <enumerator name='_DRM_CONTAINS_LOCK' value='32'/>
+        <enumerator name='_DRM_REMOVABLE' value='64'/>
+        <enumerator name='_DRM_DRIVER' value='128'/>
+      </enum-decl>
+      <pointer-type-def type-id='type-id-5088' size-in-bits='64' id='type-id-5086'/>
+      <pointer-type-def type-id='type-id-5086' size-in-bits='64' id='type-id-5095'/>
+      <pointer-type-def type-id='type-id-5091' size-in-bits='64' id='type-id-5096'/>
+      <pointer-type-def type-id='type-id-5096' size-in-bits='64' id='type-id-5087'/>
+      <qualified-type-def type-id='type-id-17' volatile='yes' id='type-id-5089'/>
+      <function-decl name='drm_dev_put' mangled-name='drm_dev_put' filepath='drivers/gpu/drm/drm_drv.c' line='698' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_dev_put'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_drv.c' line='698' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_put_dev' mangled-name='drm_put_dev' filepath='drivers/gpu/drm/drm_drv.c' line='310' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_put_dev'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_drv.c' line='310' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_dev_set_unique' mangled-name='drm_dev_set_unique' filepath='drivers/gpu/drm/drm_drv.c' line='898' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_dev_set_unique'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_drv.c' line='898' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/gpu/drm/drm_drv.c' line='898' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_dev_alloc' mangled-name='drm_dev_alloc' filepath='drivers/gpu/drm/drm_drv.c' line='640' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_dev_alloc'>
+        <parameter type-id='type-id-4496' name='driver' filepath='drivers/gpu/drm/drm_drv.c' line='640' column='1'/>
+        <parameter type-id='type-id-240' name='parent' filepath='drivers/gpu/drm/drm_drv.c' line='641' column='1'/>
+        <return type-id='type-id-4447'/>
+      </function-decl>
+      <function-decl name='drm_dev_register' mangled-name='drm_dev_register' filepath='drivers/gpu/drm/drm_drv.c' line='794' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_dev_register'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_drv.c' line='794' column='1'/>
+        <parameter type-id='type-id-16' name='flags' filepath='drivers/gpu/drm/drm_drv.c' line='794' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_ioctl.c' language='LANG_C89'>
+      <function-decl name='drm_ioctl' mangled-name='drm_ioctl' filepath='drivers/gpu/drm/drm_ioctl.c' line='775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_ioctl'>
+        <parameter type-id='type-id-83' name='filp' filepath='drivers/gpu/drm/drm_ioctl.c' line='775' column='1'/>
+        <parameter type-id='type-id-5' name='cmd' filepath='drivers/gpu/drm/drm_ioctl.c' line='776' column='1'/>
+        <parameter type-id='type-id-16' name='arg' filepath='drivers/gpu/drm/drm_ioctl.c' line='776' column='1'/>
+        <return type-id='type-id-192'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_mode_config.c' language='LANG_C89'>
+      <function-decl name='drm_mode_config_init' mangled-name='drm_mode_config_init' filepath='drivers/gpu/drm/drm_mode_config.c' line='371' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_mode_config_init'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_mode_config.c' line='371' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_mode_config_reset' mangled-name='drm_mode_config_reset' filepath='drivers/gpu/drm/drm_mode_config.c' line='176' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_mode_config_reset'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_mode_config.c' line='176' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_mode_config_cleanup' mangled-name='drm_mode_config_cleanup' filepath='drivers/gpu/drm/drm_mode_config.c' line='417' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_mode_config_cleanup'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_mode_config.c' line='417' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_sysfs.c' language='LANG_C89'>
+      <function-decl name='drm_class_device_register' mangled-name='drm_class_device_register' filepath='drivers/gpu/drm/drm_sysfs.c' line='380' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_class_device_register'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/gpu/drm/drm_sysfs.c' line='380' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_class_device_unregister' mangled-name='drm_class_device_unregister' filepath='drivers/gpu/drm/drm_sysfs.c' line='398' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_class_device_unregister'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/gpu/drm/drm_sysfs.c' line='398' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_hashtab.c' language='LANG_C89'>
+      <class-decl name='drm_hash_item' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/drm/drm_hashtab.h' line='42' column='1' id='type-id-5097'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-520' visibility='default' filepath='include/drm/drm_hashtab.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='key' type-id='type-id-16' visibility='default' filepath='include/drm/drm_hashtab.h' line='44' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-5097' size-in-bits='64' id='type-id-5098'/>
+      <pointer-type-def type-id='type-id-5098' size-in-bits='64' id='type-id-5099'/>
+      <pointer-type-def type-id='type-id-4499' size-in-bits='64' id='type-id-5100'/>
+      <function-decl name='drm_ht_create' mangled-name='drm_ht_create' filepath='drivers/gpu/drm/drm_hashtab.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_ht_create'>
+        <parameter type-id='type-id-5100' name='ht' filepath='drivers/gpu/drm/drm_hashtab.c' line='41' column='1'/>
+        <parameter type-id='type-id-5' name='order' filepath='drivers/gpu/drm/drm_hashtab.c' line='41' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_ht_insert_item' mangled-name='drm_ht_insert_item' filepath='drivers/gpu/drm/drm_hashtab.c' line='109' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_ht_insert_item'>
+        <parameter type-id='type-id-5100' name='ht' filepath='drivers/gpu/drm/drm_hashtab.c' line='109' column='1'/>
+        <parameter type-id='type-id-5098' name='item' filepath='drivers/gpu/drm/drm_hashtab.c' line='109' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_ht_just_insert_please' mangled-name='drm_ht_just_insert_please' filepath='drivers/gpu/drm/drm_hashtab.c' line='140' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_ht_just_insert_please'>
+        <parameter type-id='type-id-5100' name='ht' filepath='drivers/gpu/drm/drm_hashtab.c' line='140' column='1'/>
+        <parameter type-id='type-id-5098' name='item' filepath='drivers/gpu/drm/drm_hashtab.c' line='140' column='1'/>
+        <parameter type-id='type-id-16' name='seed' filepath='drivers/gpu/drm/drm_hashtab.c' line='141' column='1'/>
+        <parameter type-id='type-id-17' name='bits' filepath='drivers/gpu/drm/drm_hashtab.c' line='141' column='1'/>
+        <parameter type-id='type-id-17' name='shift' filepath='drivers/gpu/drm/drm_hashtab.c' line='141' column='1'/>
+        <parameter type-id='type-id-16' name='add' filepath='drivers/gpu/drm/drm_hashtab.c' line='142' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_ht_find_item' mangled-name='drm_ht_find_item' filepath='drivers/gpu/drm/drm_hashtab.c' line='165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_ht_find_item'>
+        <parameter type-id='type-id-5100' name='ht' filepath='drivers/gpu/drm/drm_hashtab.c' line='165' column='1'/>
+        <parameter type-id='type-id-16' name='key' filepath='drivers/gpu/drm/drm_hashtab.c' line='165' column='1'/>
+        <parameter type-id='type-id-5099' name='item' filepath='drivers/gpu/drm/drm_hashtab.c' line='166' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_ht_remove_item' mangled-name='drm_ht_remove_item' filepath='drivers/gpu/drm/drm_hashtab.c' line='191' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_ht_remove_item'>
+        <parameter type-id='type-id-5100' name='ht' filepath='drivers/gpu/drm/drm_hashtab.c' line='191' column='1'/>
+        <parameter type-id='type-id-5098' name='item' filepath='drivers/gpu/drm/drm_hashtab.c' line='191' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_ht_remove' mangled-name='drm_ht_remove' filepath='drivers/gpu/drm/drm_hashtab.c' line='198' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_ht_remove'>
+        <parameter type-id='type-id-5100' name='ht' filepath='drivers/gpu/drm/drm_hashtab.c' line='198' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_mm.c' language='LANG_C89'>
+      <enum-decl name='drm_mm_insert_mode' filepath='include/drm/drm_mm.h' line='68' column='1' id='type-id-5101'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DRM_MM_INSERT_BEST' value='0'/>
+        <enumerator name='DRM_MM_INSERT_LOW' value='1'/>
+        <enumerator name='DRM_MM_INSERT_HIGH' value='2'/>
+        <enumerator name='DRM_MM_INSERT_EVICT' value='3'/>
+        <enumerator name='DRM_MM_INSERT_ONCE' value='2147483648'/>
+        <enumerator name='DRM_MM_INSERT_HIGHEST' value='2147483650'/>
+        <enumerator name='DRM_MM_INSERT_LOWEST' value='2147483649'/>
+      </enum-decl>
+      <qualified-type-def type-id='type-id-5039' const='yes' id='type-id-5102'/>
+      <pointer-type-def type-id='type-id-5102' size-in-bits='64' id='type-id-5103'/>
+      <qualified-type-def type-id='type-id-5038' const='yes' id='type-id-5104'/>
+      <pointer-type-def type-id='type-id-5037' size-in-bits='64' id='type-id-5105'/>
+      <qualified-type-def type-id='type-id-5105' const='yes' id='type-id-5106'/>
+      <function-decl name='drm_mm_insert_node_in_range' mangled-name='drm_mm_insert_node_in_range' filepath='drivers/gpu/drm/drm_mm.c' line='474' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_mm_insert_node_in_range'>
+        <parameter type-id='type-id-5104' name='mm' filepath='drivers/gpu/drm/drm_mm.c' line='474' column='1'/>
+        <parameter type-id='type-id-5106' name='node' filepath='drivers/gpu/drm/drm_mm.c' line='475' column='1'/>
+        <parameter type-id='type-id-40' name='size' filepath='drivers/gpu/drm/drm_mm.c' line='476' column='1'/>
+        <parameter type-id='type-id-40' name='alignment' filepath='drivers/gpu/drm/drm_mm.c' line='476' column='1'/>
+        <parameter type-id='type-id-16' name='color' filepath='drivers/gpu/drm/drm_mm.c' line='477' column='1'/>
+        <parameter type-id='type-id-40' name='range_start' filepath='drivers/gpu/drm/drm_mm.c' line='478' column='1'/>
+        <parameter type-id='type-id-40' name='range_end' filepath='drivers/gpu/drm/drm_mm.c' line='478' column='1'/>
+        <parameter type-id='type-id-5101' name='mode' filepath='drivers/gpu/drm/drm_mm.c' line='479' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_mm_remove_node' mangled-name='drm_mm_remove_node' filepath='drivers/gpu/drm/drm_mm.c' line='582' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_mm_remove_node'>
+        <parameter type-id='type-id-5105' name='node' filepath='drivers/gpu/drm/drm_mm.c' line='582' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_mm_init' mangled-name='drm_mm_init' filepath='drivers/gpu/drm/drm_mm.c' line='917' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_mm_init'>
+        <parameter type-id='type-id-5038' name='mm' filepath='drivers/gpu/drm/drm_mm.c' line='917' column='1'/>
+        <parameter type-id='type-id-40' name='start' filepath='drivers/gpu/drm/drm_mm.c' line='917' column='1'/>
+        <parameter type-id='type-id-40' name='size' filepath='drivers/gpu/drm/drm_mm.c' line='917' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_mm_takedown' mangled-name='drm_mm_takedown' filepath='drivers/gpu/drm/drm_mm.c' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_mm_takedown'>
+        <parameter type-id='type-id-5038' name='mm' filepath='drivers/gpu/drm/drm_mm.c' line='947' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_mm_print' mangled-name='drm_mm_print' filepath='drivers/gpu/drm/drm_mm.c' line='973' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_mm_print'>
+        <parameter type-id='type-id-5103' name='mm' filepath='drivers/gpu/drm/drm_mm.c' line='973' column='1'/>
+        <parameter type-id='type-id-4868' name='p' filepath='drivers/gpu/drm/drm_mm.c' line='973' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_crtc.c' language='LANG_C89'>
+      <class-decl name='drm_encoder' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5107'/>
+      <union-decl name='__anonymous_union__' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/drm/drm_vblank.h' line='57' column='1' id='type-id-5108'>
+        <data-member access='private'>
+          <var-decl name='base' type-id='type-id-4690' visibility='default' filepath='include/drm/drm_vblank.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='vbl' type-id='type-id-4691' visibility='default' filepath='include/drm/drm_vblank.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='seq' type-id='type-id-4692' visibility='default' filepath='include/drm/drm_vblank.h' line='76' column='1'/>
+        </data-member>
+      </union-decl>
+      <pointer-type-def type-id='type-id-5107' size-in-bits='64' id='type-id-5109'/>
+      <function-decl name='drm_crtc_init_with_planes' mangled-name='drm_crtc_init_with_planes' filepath='drivers/gpu/drm/drm_crtc.c' line='266' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_crtc_init_with_planes'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_crtc.c' line='266' column='1'/>
+        <parameter type-id='type-id-4624' name='crtc' filepath='drivers/gpu/drm/drm_crtc.c' line='266' column='1'/>
+        <parameter type-id='type-id-4627' name='primary' filepath='drivers/gpu/drm/drm_crtc.c' line='267' column='1'/>
+        <parameter type-id='type-id-4627' name='cursor' filepath='drivers/gpu/drm/drm_crtc.c' line='268' column='1'/>
+        <parameter type-id='type-id-4628' name='funcs' filepath='drivers/gpu/drm/drm_crtc.c' line='269' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/gpu/drm/drm_crtc.c' line='270' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_crtc_cleanup' mangled-name='drm_crtc_cleanup' filepath='drivers/gpu/drm/drm_crtc.c' line='354' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_crtc_cleanup'>
+        <parameter type-id='type-id-4624' name='crtc' filepath='drivers/gpu/drm/drm_crtc.c' line='354' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_debugfs.c' language='LANG_C89'>
+      <class-decl name='drm_info_list' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/drm/drm_debugfs.h' line='41' column='1' id='type-id-5110'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/drm/drm_debugfs.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='show' type-id='type-id-311' visibility='default' filepath='include/drm/drm_debugfs.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='driver_features' type-id='type-id-7' visibility='default' filepath='include/drm/drm_debugfs.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/drm/drm_debugfs.h' line='55' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-5110' const='yes' id='type-id-5111'/>
+      <pointer-type-def type-id='type-id-5111' size-in-bits='64' id='type-id-5112'/>
+      <function-decl name='drm_debugfs_create_files' mangled-name='drm_debugfs_create_files' filepath='drivers/gpu/drm/drm_debugfs.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_debugfs_create_files'>
+        <parameter type-id='type-id-5112' name='files' filepath='drivers/gpu/drm/drm_debugfs.c' line='83' column='1'/>
+        <parameter type-id='type-id-17' name='count' filepath='drivers/gpu/drm/drm_debugfs.c' line='83' column='1'/>
+        <parameter type-id='type-id-23' name='root' filepath='drivers/gpu/drm/drm_debugfs.c' line='84' column='1'/>
+        <parameter type-id='type-id-4497' name='minor' filepath='drivers/gpu/drm/drm_debugfs.c' line='84' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_edid.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-5113' size-in-bits='96' id='type-id-5114'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5115' size-in-bits='576' id='type-id-5116'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5117' size-in-bits='96' id='type-id-5118'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5117' size-in-bits='128' id='type-id-5119'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='104' id='type-id-5120'>
+        <subrange length='13' type-id='type-id-9' id='type-id-201'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='16' id='type-id-5121'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <class-decl name='edid' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/drm/drm_edid.h' line='282' column='1' id='type-id-5006'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='header' type-id='type-id-1184' visibility='default' filepath='include/drm/drm_edid.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mfg_id' type-id='type-id-5121' visibility='default' filepath='include/drm/drm_edid.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='prod_code' type-id='type-id-5121' visibility='default' filepath='include/drm/drm_edid.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='serial' type-id='type-id-7' visibility='default' filepath='include/drm/drm_edid.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='mfg_week' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='136'>
+          <var-decl name='mfg_year' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='289' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='144'>
+          <var-decl name='version' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='152'>
+          <var-decl name='revision' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='input' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='168'>
+          <var-decl name='width_cm' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='176'>
+          <var-decl name='height_cm' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='184'>
+          <var-decl name='gamma' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='features' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='200'>
+          <var-decl name='red_green_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='208'>
+          <var-decl name='black_white_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='216'>
+          <var-decl name='red_x' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='red_y' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='232'>
+          <var-decl name='green_x' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='240'>
+          <var-decl name='green_y' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='248'>
+          <var-decl name='blue_x' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='blue_y' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='264'>
+          <var-decl name='white_x' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='white_y' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='280'>
+          <var-decl name='established_timings' type-id='type-id-5122' visibility='default' filepath='include/drm/drm_edid.h' line='311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='304'>
+          <var-decl name='standard_timings' type-id='type-id-5119' visibility='default' filepath='include/drm/drm_edid.h' line='313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='432'>
+          <var-decl name='detailed_timings' type-id='type-id-5116' visibility='default' filepath='include/drm/drm_edid.h' line='315' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1008'>
+          <var-decl name='extensions' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1016'>
+          <var-decl name='checksum' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='319' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='est_timings' size-in-bits='24' is-struct='yes' visibility='default' filepath='include/drm/drm_edid.h' line='43' column='1' id='type-id-5122'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='t1' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='t2' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='mfg_rsvd' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='46' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='std_timing' size-in-bits='16' is-struct='yes' visibility='default' filepath='include/drm/drm_edid.h' line='57' column='1' id='type-id-5117'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hsize' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='vfreq_aspect' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='59' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='detailed_timing' size-in-bits='144' is-struct='yes' visibility='default' filepath='include/drm/drm_edid.h' line='164' column='1' id='type-id-5115'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pixel_clock' type-id='type-id-5123' visibility='default' filepath='include/drm/drm_edid.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='data' type-id='type-id-5124' visibility='default' filepath='include/drm/drm_edid.h' line='169' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__le16' type-id='type-id-108' filepath='include/uapi/linux/types.h' line='29' column='1' id='type-id-5123'/>
+      <union-decl name='__anonymous_union__' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/drm/drm_edid.h' line='166' column='1' id='type-id-5124'>
+        <data-member access='private'>
+          <var-decl name='pixel_data' type-id='type-id-5125' visibility='default' filepath='include/drm/drm_edid.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='other_data' type-id='type-id-5126' visibility='default' filepath='include/drm/drm_edid.h' line='168' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='detailed_pixel_timing' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/drm/drm_edid.h' line='69' column='1' id='type-id-5125'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hactive_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='hblank_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='hactive_hblank_hi' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='vactive_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='vblank_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='vactive_vblank_hi' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='hsync_offset_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='hsync_pulse_width_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='vsync_offset_pulse_width_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='72'>
+          <var-decl name='hsync_vsync_offset_pulse_width_hi' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='width_mm_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='88'>
+          <var-decl name='height_mm_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='width_height_mm_hi' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='104'>
+          <var-decl name='hborder' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='vborder' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='misc' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='85' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='detailed_non_pixel' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/drm/drm_edid.h' line='139' column='1' id='type-id-5126'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pad1' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='type' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='pad2' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='data' type-id='type-id-5127' visibility='default' filepath='include/drm/drm_edid.h' line='151' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='104' is-anonymous='yes' visibility='default' filepath='include/drm/drm_edid.h' line='145' column='1' id='type-id-5127'>
+        <data-member access='private'>
+          <var-decl name='str' type-id='type-id-5128' visibility='default' filepath='include/drm/drm_edid.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='range' type-id='type-id-5129' visibility='default' filepath='include/drm/drm_edid.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='color' type-id='type-id-5130' visibility='default' filepath='include/drm/drm_edid.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='timings' type-id='type-id-5118' visibility='default' filepath='include/drm/drm_edid.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='cvt' type-id='type-id-5114' visibility='default' filepath='include/drm/drm_edid.h' line='150' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='detailed_data_string' size-in-bits='104' is-struct='yes' visibility='default' filepath='include/drm/drm_edid.h' line='89' column='1' id='type-id-5128'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='str' type-id='type-id-5120' visibility='default' filepath='include/drm/drm_edid.h' line='90' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='detailed_data_monitor_range' size-in-bits='104' is-struct='yes' visibility='default' filepath='include/drm/drm_edid.h' line='93' column='1' id='type-id-5129'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='min_vfreq' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='max_vfreq' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='min_hfreq_khz' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='max_hfreq_khz' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='pixel_clock_mhz' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='formula' type-id='type-id-5131' visibility='default' filepath='include/drm/drm_edid.h' line='118' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__2' size-in-bits='56' is-anonymous='yes' visibility='default' filepath='include/drm/drm_edid.h' line='100' column='1' id='type-id-5131'>
+        <data-member access='private'>
+          <var-decl name='gtf2' type-id='type-id-5132' visibility='default' filepath='include/drm/drm_edid.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='cvt' type-id='type-id-5133' visibility='default' filepath='include/drm/drm_edid.h' line='117' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='56' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_edid.h' line='101' column='1' id='type-id-5132'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='reserved' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='hfreq_start_khz' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='c' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='m' type-id='type-id-5123' visibility='default' filepath='include/drm/drm_edid.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='k' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='j' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='107' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__1' size-in-bits='56' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_edid.h' line='109' column='1' id='type-id-5133'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='version' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='data1' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='data2' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='supported_aspects' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='supported_scalings' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='preferred_refresh' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='116' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='detailed_data_wpindex' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/drm/drm_edid.h' line='121' column='1' id='type-id-5130'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='white_yx_lo' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='white_x_hi' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='white_y_hi' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='gamma' type-id='type-id-214' visibility='default' filepath='include/drm/drm_edid.h' line='125' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cvt_timing' size-in-bits='24' is-struct='yes' visibility='default' filepath='include/drm/drm_edid.h' line='135' column='1' id='type-id-5113'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='code' type-id='type-id-1183' visibility='default' filepath='include/drm/drm_edid.h' line='136' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-5006' size-in-bits='64' id='type-id-5134'/>
+      <pointer-type-def type-id='type-id-5135' size-in-bits='64' id='type-id-5136'/>
+      <function-decl name='drm_add_edid_modes' mangled-name='drm_add_edid_modes' filepath='drivers/gpu/drm/drm_edid.c' line='4818' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_add_edid_modes'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_edid.c' line='4818' column='1'/>
+        <parameter type-id='type-id-5134' name='edid' filepath='drivers/gpu/drm/drm_edid.c' line='4818' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_do_get_edid' mangled-name='drm_do_get_edid' filepath='drivers/gpu/drm/drm_edid.c' line='1651' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_do_get_edid'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_edid.c' line='1651' column='1'/>
+        <parameter type-id='type-id-5136' name='get_edid_block' filepath='drivers/gpu/drm/drm_edid.c' line='1652' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='drivers/gpu/drm/drm_edid.c' line='1654' column='1'/>
+        <return type-id='type-id-5134'/>
+      </function-decl>
+      <function-decl name='drm_add_modes_noedid' mangled-name='drm_add_modes_noedid' filepath='drivers/gpu/drm/drm_edid.c' line='4897' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_add_modes_noedid'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_edid.c' line='4897' column='1'/>
+        <parameter type-id='type-id-17' name='hdisplay' filepath='drivers/gpu/drm/drm_edid.c' line='4898' column='1'/>
+        <parameter type-id='type-id-17' name='vdisplay' filepath='drivers/gpu/drm/drm_edid.c' line='4898' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_set_preferred_mode' mangled-name='drm_set_preferred_mode' filepath='drivers/gpu/drm/drm_edid.c' line='4943' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_set_preferred_mode'>
+        <parameter type-id='type-id-4445' name='connector' filepath='drivers/gpu/drm/drm_edid.c' line='4943' column='1'/>
+        <parameter type-id='type-id-17' name='hpref' filepath='drivers/gpu/drm/drm_edid.c' line='4944' column='1'/>
+        <parameter type-id='type-id-17' name='vpref' filepath='drivers/gpu/drm/drm_edid.c' line='4944' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5135'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_global.c' language='LANG_C89'>
+      <class-decl name='drm_global_reference' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/drm/drm_global.h' line='40' column='1' id='type-id-5137'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='global_type' type-id='type-id-5138' visibility='default' filepath='include/drm/drm_global.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='size' type-id='type-id-84' visibility='default' filepath='include/drm/drm_global.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='object' type-id='type-id-15' visibility='default' filepath='include/drm/drm_global.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='init' type-id='type-id-5139' visibility='default' filepath='include/drm/drm_global.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='release' type-id='type-id-5140' visibility='default' filepath='include/drm/drm_global.h' line='45' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='drm_global_types' filepath='include/drm/drm_global.h' line='33' column='1' id='type-id-5138'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='DRM_GLOBAL_TTM_MEM' value='0'/>
+        <enumerator name='DRM_GLOBAL_TTM_BO' value='1'/>
+        <enumerator name='DRM_GLOBAL_TTM_OBJECT' value='2'/>
+        <enumerator name='DRM_GLOBAL_NUM' value='3'/>
+      </enum-decl>
+      <pointer-type-def type-id='type-id-5137' size-in-bits='64' id='type-id-5141'/>
+      <pointer-type-def type-id='type-id-5142' size-in-bits='64' id='type-id-5139'/>
+      <pointer-type-def type-id='type-id-5143' size-in-bits='64' id='type-id-5140'/>
+      <function-decl name='drm_global_item_ref' mangled-name='drm_global_item_ref' filepath='drivers/gpu/drm/drm_global.c' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_global_item_ref'>
+        <parameter type-id='type-id-5141' name='ref' filepath='drivers/gpu/drm/drm_global.c' line='78' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_global_item_unref' mangled-name='drm_global_item_unref' filepath='drivers/gpu/drm/drm_global.c' line='123' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_global_item_unref'>
+        <parameter type-id='type-id-5141' name='ref' filepath='drivers/gpu/drm/drm_global.c' line='123' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5142'>
+        <parameter type-id='type-id-5141' name='ref'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5143'>
+        <parameter type-id='type-id-5141'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_prime.c' language='LANG_C89'>
+      <function-decl name='drm_gem_prime_export' mangled-name='drm_gem_prime_export' filepath='drivers/gpu/drm/drm_prime.c' line='530' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_prime_export'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_prime.c' line='530' column='1'/>
+        <parameter type-id='type-id-5068' name='obj' filepath='drivers/gpu/drm/drm_prime.c' line='531' column='1'/>
+        <parameter type-id='type-id-17' name='flags' filepath='drivers/gpu/drm/drm_prime.c' line='532' column='1'/>
+        <return type-id='type-id-5035'/>
+      </function-decl>
+      <function-decl name='drm_gem_prime_handle_to_fd' mangled-name='drm_gem_prime_handle_to_fd' filepath='drivers/gpu/drm/drm_prime.c' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_prime_handle_to_fd'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_prime.c' line='594' column='1'/>
+        <parameter type-id='type-id-4616' name='file_priv' filepath='drivers/gpu/drm/drm_prime.c' line='595' column='1'/>
+        <parameter type-id='type-id-1341' name='handle' filepath='drivers/gpu/drm/drm_prime.c' line='595' column='1'/>
+        <parameter type-id='type-id-1341' name='flags' filepath='drivers/gpu/drm/drm_prime.c' line='596' column='1'/>
+        <parameter type-id='type-id-666' name='prime_fd' filepath='drivers/gpu/drm/drm_prime.c' line='597' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_gem_prime_mmap' mangled-name='drm_gem_prime_mmap' filepath='drivers/gpu/drm/drm_prime.c' line='693' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_prime_mmap'>
+        <parameter type-id='type-id-5068' name='obj' filepath='drivers/gpu/drm/drm_prime.c' line='693' column='1'/>
+        <parameter type-id='type-id-1207' name='vma' filepath='drivers/gpu/drm/drm_prime.c' line='693' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_gem_prime_import' mangled-name='drm_gem_prime_import' filepath='drivers/gpu/drm/drm_prime.c' line='792' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_prime_import'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_prime.c' line='792' column='1'/>
+        <parameter type-id='type-id-5035' name='dma_buf' filepath='drivers/gpu/drm/drm_prime.c' line='793' column='1'/>
+        <return type-id='type-id-5068'/>
+      </function-decl>
+      <function-decl name='drm_gem_prime_fd_to_handle' mangled-name='drm_gem_prime_fd_to_handle' filepath='drivers/gpu/drm/drm_prime.c' line='811' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_gem_prime_fd_to_handle'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_prime.c' line='811' column='1'/>
+        <parameter type-id='type-id-4616' name='file_priv' filepath='drivers/gpu/drm/drm_prime.c' line='812' column='1'/>
+        <parameter type-id='type-id-17' name='prime_fd' filepath='drivers/gpu/drm/drm_prime.c' line='812' column='1'/>
+        <parameter type-id='type-id-4634' name='handle' filepath='drivers/gpu/drm/drm_prime.c' line='813' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_prime_pages_to_sg' mangled-name='drm_prime_pages_to_sg' filepath='drivers/gpu/drm/drm_prime.c' line='921' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_prime_pages_to_sg'>
+        <parameter type-id='type-id-921' name='pages' filepath='drivers/gpu/drm/drm_prime.c' line='921' column='1'/>
+        <parameter type-id='type-id-5' name='nr_pages' filepath='drivers/gpu/drm/drm_prime.c' line='921' column='1'/>
+        <return type-id='type-id-920'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_vma_manager.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-5034' size-in-bits='64' id='type-id-5144'/>
+      <function-decl name='drm_vma_offset_manager_init' mangled-name='drm_vma_offset_manager_init' filepath='drivers/gpu/drm/drm_vma_manager.c' line='85' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_vma_offset_manager_init'>
+        <parameter type-id='type-id-4507' name='mgr' filepath='drivers/gpu/drm/drm_vma_manager.c' line='85' column='1'/>
+        <parameter type-id='type-id-16' name='page_offset' filepath='drivers/gpu/drm/drm_vma_manager.c' line='86' column='1'/>
+        <parameter type-id='type-id-16' name='size' filepath='drivers/gpu/drm/drm_vma_manager.c' line='86' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_vma_offset_manager_destroy' mangled-name='drm_vma_offset_manager_destroy' filepath='drivers/gpu/drm/drm_vma_manager.c' line='104' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_vma_offset_manager_destroy'>
+        <parameter type-id='type-id-4507' name='mgr' filepath='drivers/gpu/drm/drm_vma_manager.c' line='104' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_vma_offset_lookup_locked' mangled-name='drm_vma_offset_lookup_locked' filepath='drivers/gpu/drm/drm_vma_manager.c' line='143' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_vma_offset_lookup_locked'>
+        <parameter type-id='type-id-4507' name='mgr' filepath='drivers/gpu/drm/drm_vma_manager.c' line='143' column='1'/>
+        <parameter type-id='type-id-16' name='start' filepath='drivers/gpu/drm/drm_vma_manager.c' line='144' column='1'/>
+        <parameter type-id='type-id-16' name='pages' filepath='drivers/gpu/drm/drm_vma_manager.c' line='145' column='1'/>
+        <return type-id='type-id-5144'/>
+      </function-decl>
+      <function-decl name='drm_vma_offset_add' mangled-name='drm_vma_offset_add' filepath='drivers/gpu/drm/drm_vma_manager.c' line='204' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_vma_offset_add'>
+        <parameter type-id='type-id-4507' name='mgr' filepath='drivers/gpu/drm/drm_vma_manager.c' line='204' column='1'/>
+        <parameter type-id='type-id-5144' name='node' filepath='drivers/gpu/drm/drm_vma_manager.c' line='205' column='1'/>
+        <parameter type-id='type-id-16' name='pages' filepath='drivers/gpu/drm/drm_vma_manager.c' line='205' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_vma_offset_remove' mangled-name='drm_vma_offset_remove' filepath='drivers/gpu/drm/drm_vma_manager.c' line='232' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_vma_offset_remove'>
+        <parameter type-id='type-id-4507' name='mgr' filepath='drivers/gpu/drm/drm_vma_manager.c' line='232' column='1'/>
+        <parameter type-id='type-id-5144' name='node' filepath='drivers/gpu/drm/drm_vma_manager.c' line='233' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_framebuffer.c' language='LANG_C89'>
+      <function-decl name='drm_framebuffer_init' mangled-name='drm_framebuffer_init' filepath='drivers/gpu/drm/drm_framebuffer.c' line='681' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_framebuffer_init'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_framebuffer.c' line='681' column='1'/>
+        <parameter type-id='type-id-4610' name='fb' filepath='drivers/gpu/drm/drm_framebuffer.c' line='681' column='1'/>
+        <parameter type-id='type-id-4598' name='funcs' filepath='drivers/gpu/drm/drm_framebuffer.c' line='682' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_encoder.c' language='LANG_C89'>
+      <function-decl name='drm_encoder_init' mangled-name='drm_encoder_init' filepath='drivers/gpu/drm/drm_encoder.c' line='106' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_encoder_init'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_encoder.c' line='106' column='1'/>
+        <parameter type-id='type-id-4491' name='encoder' filepath='drivers/gpu/drm/drm_encoder.c' line='107' column='1'/>
+        <parameter type-id='type-id-4775' name='funcs' filepath='drivers/gpu/drm/drm_encoder.c' line='108' column='1'/>
+        <parameter type-id='type-id-17' name='encoder_type' filepath='drivers/gpu/drm/drm_encoder.c' line='109' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/gpu/drm/drm_encoder.c' line='109' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_encoder_cleanup' mangled-name='drm_encoder_cleanup' filepath='drivers/gpu/drm/drm_encoder.c' line='157' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_encoder_cleanup'>
+        <parameter type-id='type-id-4491' name='encoder' filepath='drivers/gpu/drm/drm_encoder.c' line='157' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_plane.c' language='LANG_C89'>
+      <qualified-type-def type-id='type-id-1341' const='yes' id='type-id-5145'/>
+      <pointer-type-def type-id='type-id-5145' size-in-bits='64' id='type-id-5146'/>
+      <qualified-type-def type-id='type-id-2438' const='yes' id='type-id-5147'/>
+      <pointer-type-def type-id='type-id-5147' size-in-bits='64' id='type-id-5148'/>
+      <function-decl name='drm_universal_plane_init' mangled-name='drm_universal_plane_init' filepath='drivers/gpu/drm/drm_plane.c' line='164' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_universal_plane_init'>
+        <parameter type-id='type-id-4447' name='dev' filepath='drivers/gpu/drm/drm_plane.c' line='164' column='1'/>
+        <parameter type-id='type-id-4627' name='plane' filepath='drivers/gpu/drm/drm_plane.c' line='164' column='1'/>
+        <parameter type-id='type-id-1341' name='possible_crtcs' filepath='drivers/gpu/drm/drm_plane.c' line='165' column='1'/>
+        <parameter type-id='type-id-4635' name='funcs' filepath='drivers/gpu/drm/drm_plane.c' line='166' column='1'/>
+        <parameter type-id='type-id-5146' name='formats' filepath='drivers/gpu/drm/drm_plane.c' line='167' column='1'/>
+        <parameter type-id='type-id-5' name='format_count' filepath='drivers/gpu/drm/drm_plane.c' line='167' column='1'/>
+        <parameter type-id='type-id-5148' name='format_modifiers' filepath='drivers/gpu/drm/drm_plane.c' line='168' column='1'/>
+        <parameter type-id='type-id-4636' name='type' filepath='drivers/gpu/drm/drm_plane.c' line='169' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/gpu/drm/drm_plane.c' line='170' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='drm_plane_cleanup' mangled-name='drm_plane_cleanup' filepath='drivers/gpu/drm/drm_plane.c' line='346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_plane_cleanup'>
+        <parameter type-id='type-id-4627' name='plane' filepath='drivers/gpu/drm/drm_plane.c' line='346' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_print.c' language='LANG_C89'>
+      <function-decl name='__drm_printfn_debug' mangled-name='__drm_printfn_debug' filepath='drivers/gpu/drm/drm_print.c' line='139' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__drm_printfn_debug'>
+        <parameter type-id='type-id-4868' name='p' filepath='drivers/gpu/drm/drm_print.c' line='139' column='1'/>
+        <parameter type-id='type-id-4964' name='vaf' filepath='drivers/gpu/drm/drm_print.c' line='139' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_dbg' mangled-name='drm_dbg' filepath='drivers/gpu/drm/drm_print.c' line='222' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_dbg'>
+        <parameter type-id='type-id-5' name='category' filepath='drivers/gpu/drm/drm_print.c' line='222' column='1'/>
+        <parameter type-id='type-id-4' name='format' filepath='drivers/gpu/drm/drm_print.c' line='222' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='drm_err' mangled-name='drm_err' filepath='drivers/gpu/drm/drm_print.c' line='241' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_err'>
+        <parameter type-id='type-id-4' name='format' filepath='drivers/gpu/drm/drm_print.c' line='241' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_vblank.c' language='LANG_C89'>
+      <function-decl name='drm_crtc_send_vblank_event' mangled-name='drm_crtc_send_vblank_event' filepath='drivers/gpu/drm/drm_vblank.c' line='912' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_crtc_send_vblank_event'>
+        <parameter type-id='type-id-4624' name='crtc' filepath='drivers/gpu/drm/drm_vblank.c' line='912' column='1'/>
+        <parameter type-id='type-id-4694' name='e' filepath='drivers/gpu/drm/drm_vblank.c' line='913' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/gpu/drm/drm_ioc32.c' language='LANG_C89'>
+      <function-decl name='drm_compat_ioctl' mangled-name='drm_compat_ioctl' filepath='drivers/gpu/drm/drm_ioc32.c' line='957' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_compat_ioctl'>
+        <parameter type-id='type-id-83' name='filp' filepath='drivers/gpu/drm/drm_ioc32.c' line='957' column='1'/>
+        <parameter type-id='type-id-5' name='cmd' filepath='drivers/gpu/drm/drm_ioc32.c' line='957' column='1'/>
+        <parameter type-id='type-id-16' name='arg' filepath='drivers/gpu/drm/drm_ioc32.c' line='957' column='1'/>
+        <return type-id='type-id-192'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/driver.c' language='LANG_C89'>
+      <function-decl name='driver_register' mangled-name='driver_register' filepath='drivers/base/driver.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='driver_register'>
+        <parameter type-id='type-id-2011' name='drv' filepath='drivers/base/driver.c' line='146' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='driver_unregister' mangled-name='driver_unregister' filepath='drivers/base/driver.c' line='190' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='driver_unregister'>
+        <parameter type-id='type-id-2011' name='drv' filepath='drivers/base/driver.c' line='190' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/class.c' language='LANG_C89'>
+      <function-decl name='__class_register' mangled-name='__class_register' filepath='drivers/base/class.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__class_register'>
+        <parameter type-id='type-id-2025' name='cls' filepath='drivers/base/class.c' line='146' column='1'/>
+        <parameter type-id='type-id-1696' name='key' filepath='drivers/base/class.c' line='146' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='class_unregister' mangled-name='class_unregister' filepath='drivers/base/class.c' line='192' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='class_unregister'>
+        <parameter type-id='type-id-2025' name='cls' filepath='drivers/base/class.c' line='192' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__class_create' mangled-name='__class_create' filepath='drivers/base/class.c' line='219' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__class_create'>
+        <parameter type-id='type-id-260' name='owner' filepath='drivers/base/class.c' line='219' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/base/class.c' line='219' column='1'/>
+        <parameter type-id='type-id-1696' name='key' filepath='drivers/base/class.c' line='220' column='1'/>
+        <return type-id='type-id-2025'/>
+      </function-decl>
+      <function-decl name='class_destroy' mangled-name='class_destroy' filepath='drivers/base/class.c' line='254' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='class_destroy'>
+        <parameter type-id='type-id-2025' name='cls' filepath='drivers/base/class.c' line='254' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/devres.c' language='LANG_C89'>
+      <typedef-decl name='dr_release_t' type-id='type-id-4368' filepath='include/linux/device.h' line='642' column='1' id='type-id-5149'/>
+      <typedef-decl name='dr_match_t' type-id='type-id-5150' filepath='include/linux/device.h' line='643' column='1' id='type-id-5151'/>
+      <pointer-type-def type-id='type-id-5152' size-in-bits='64' id='type-id-5150'/>
+      <function-decl name='__devres_alloc_node' mangled-name='__devres_alloc_node' filepath='drivers/base/devres.c' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__devres_alloc_node'>
+        <parameter type-id='type-id-5149' name='release' filepath='drivers/base/devres.c' line='120' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='drivers/base/devres.c' line='120' column='1'/>
+        <parameter type-id='type-id-485' name='gfp' filepath='drivers/base/devres.c' line='120' column='1'/>
+        <parameter type-id='type-id-17' name='nid' filepath='drivers/base/devres.c' line='120' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/base/devres.c' line='121' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='devres_free' mangled-name='devres_free' filepath='drivers/base/devres.c' line='207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devres_free'>
+        <parameter type-id='type-id-15' name='res' filepath='drivers/base/devres.c' line='207' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='devres_add' mangled-name='devres_add' filepath='drivers/base/devres.c' line='227' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devres_add'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/devres.c' line='227' column='1'/>
+        <parameter type-id='type-id-15' name='res' filepath='drivers/base/devres.c' line='227' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='devres_destroy' mangled-name='devres_destroy' filepath='drivers/base/devres.c' line='374' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devres_destroy'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/devres.c' line='374' column='1'/>
+        <parameter type-id='type-id-5149' name='release' filepath='drivers/base/devres.c' line='374' column='1'/>
+        <parameter type-id='type-id-5151' name='match' filepath='drivers/base/devres.c' line='375' column='1'/>
+        <parameter type-id='type-id-15' name='match_data' filepath='drivers/base/devres.c' line='375' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='devm_kmalloc' mangled-name='devm_kmalloc' filepath='drivers/base/devres.c' line='786' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_kmalloc'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/devres.c' line='786' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='drivers/base/devres.c' line='786' column='1'/>
+        <parameter type-id='type-id-485' name='gfp' filepath='drivers/base/devres.c' line='786' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='devm_kfree' mangled-name='devm_kfree' filepath='drivers/base/devres.c' line='894' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_kfree'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/devres.c' line='894' column='1'/>
+        <parameter type-id='type-id-15' name='p' filepath='drivers/base/devres.c' line='894' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5152'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/power/generic_ops.c' language='LANG_C89'>
+      <function-decl name='pm_generic_runtime_suspend' mangled-name='pm_generic_runtime_suspend' filepath='drivers/base/power/generic_ops.c' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_generic_runtime_suspend'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/generic_ops.c' line='22' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pm_generic_runtime_resume' mangled-name='pm_generic_runtime_resume' filepath='drivers/base/power/generic_ops.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_generic_runtime_resume'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/generic_ops.c' line='41' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pm_generic_suspend' mangled-name='pm_generic_suspend' filepath='drivers/base/power/generic_ops.c' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_generic_suspend'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/generic_ops.c' line='99' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='pm_generic_resume' mangled-name='pm_generic_resume' filepath='drivers/base/power/generic_ops.c' line='243' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_generic_resume'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/generic_ops.c' line='243' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/power/common.c' language='LANG_C89'>
+      <function-decl name='dev_pm_domain_attach' mangled-name='dev_pm_domain_attach' filepath='drivers/base/power/common.c' line='104' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_pm_domain_attach'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/common.c' line='104' column='1'/>
+        <parameter type-id='type-id-33' name='power_on' filepath='drivers/base/power/common.c' line='104' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='dev_pm_domain_detach' mangled-name='dev_pm_domain_detach' filepath='drivers/base/power/common.c' line='185' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_pm_domain_detach'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/common.c' line='185' column='1'/>
+        <parameter type-id='type-id-33' name='power_off' filepath='drivers/base/power/common.c' line='185' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/power/runtime.c' language='LANG_C89'>
+      <function-decl name='__pm_runtime_idle' mangled-name='__pm_runtime_idle' filepath='drivers/base/power/runtime.c' line='965' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__pm_runtime_idle'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/runtime.c' line='965' column='1'/>
+        <parameter type-id='type-id-17' name='rpmflags' filepath='drivers/base/power/runtime.c' line='965' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__pm_runtime_suspend' mangled-name='__pm_runtime_suspend' filepath='drivers/base/power/runtime.c' line='997' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__pm_runtime_suspend'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/runtime.c' line='997' column='1'/>
+        <parameter type-id='type-id-17' name='rpmflags' filepath='drivers/base/power/runtime.c' line='997' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__pm_runtime_resume' mangled-name='__pm_runtime_resume' filepath='drivers/base/power/runtime.c' line='1028' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__pm_runtime_resume'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/runtime.c' line='1028' column='1'/>
+        <parameter type-id='type-id-17' name='rpmflags' filepath='drivers/base/power/runtime.c' line='1028' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__pm_runtime_set_status' mangled-name='__pm_runtime_set_status' filepath='drivers/base/power/runtime.c' line='1088' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__pm_runtime_set_status'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/runtime.c' line='1088' column='1'/>
+        <parameter type-id='type-id-5' name='status' filepath='drivers/base/power/runtime.c' line='1088' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__pm_runtime_disable' mangled-name='__pm_runtime_disable' filepath='drivers/base/power/runtime.c' line='1245' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__pm_runtime_disable'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/runtime.c' line='1245' column='1'/>
+        <parameter type-id='type-id-33' name='check_resume' filepath='drivers/base/power/runtime.c' line='1245' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='pm_runtime_enable' mangled-name='pm_runtime_enable' filepath='drivers/base/power/runtime.c' line='1284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_runtime_enable'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/runtime.c' line='1284' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='pm_runtime_set_autosuspend_delay' mangled-name='pm_runtime_set_autosuspend_delay' filepath='drivers/base/power/runtime.c' line='1435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_runtime_set_autosuspend_delay'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/runtime.c' line='1435' column='1'/>
+        <parameter type-id='type-id-17' name='delay' filepath='drivers/base/power/runtime.c' line='1435' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__pm_runtime_use_autosuspend' mangled-name='__pm_runtime_use_autosuspend' filepath='drivers/base/power/runtime.c' line='1456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__pm_runtime_use_autosuspend'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/runtime.c' line='1456' column='1'/>
+        <parameter type-id='type-id-33' name='use' filepath='drivers/base/power/runtime.c' line='1456' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/base/power/wakeup.c' language='LANG_C89'>
+      <function-decl name='pm_wakeup_dev_event' mangled-name='pm_wakeup_dev_event' filepath='drivers/base/power/wakeup.c' line='804' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_wakeup_dev_event'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/base/power/wakeup.c' line='804' column='1'/>
+        <parameter type-id='type-id-5' name='msec' filepath='drivers/base/power/wakeup.c' line='804' column='1'/>
+        <parameter type-id='type-id-33' name='hard' filepath='drivers/base/power/wakeup.c' line='804' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/dma-buf/dma-buf.c' language='LANG_C89'>
+      <class-decl name='dma_buf_export_info' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/dma-buf.h' line='344' column='1' id='type-id-5153'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='exp_name' type-id='type-id-4' visibility='default' filepath='include/linux/dma-buf.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/dma-buf.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ops' type-id='type-id-5042' visibility='default' filepath='include/linux/dma-buf.h' line='347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='size' type-id='type-id-84' visibility='default' filepath='include/linux/dma-buf.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/dma-buf.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='resv' type-id='type-id-5043' visibility='default' filepath='include/linux/dma-buf.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='priv' type-id='type-id-15' visibility='default' filepath='include/linux/dma-buf.h' line='351' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-5153' const='yes' id='type-id-5154'/>
+      <pointer-type-def type-id='type-id-5154' size-in-bits='64' id='type-id-5155'/>
+      <function-decl name='dma_buf_export' mangled-name='dma_buf_export' filepath='drivers/dma-buf/dma-buf.c' line='508' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_buf_export'>
+        <parameter type-id='type-id-5155' name='exp_info' filepath='drivers/dma-buf/dma-buf.c' line='508' column='1'/>
+        <return type-id='type-id-5035'/>
+      </function-decl>
+      <function-decl name='dma_buf_fd' mangled-name='dma_buf_fd' filepath='drivers/dma-buf/dma-buf.c' line='589' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_buf_fd'>
+        <parameter type-id='type-id-5035' name='dmabuf' filepath='drivers/dma-buf/dma-buf.c' line='589' column='1'/>
+        <parameter type-id='type-id-17' name='flags' filepath='drivers/dma-buf/dma-buf.c' line='589' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='dma_buf_get' mangled-name='dma_buf_get' filepath='drivers/dma-buf/dma-buf.c' line='614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_buf_get'>
+        <parameter type-id='type-id-17' name='fd' filepath='drivers/dma-buf/dma-buf.c' line='614' column='1'/>
+        <return type-id='type-id-5035'/>
+      </function-decl>
+      <function-decl name='dma_buf_put' mangled-name='dma_buf_put' filepath='drivers/dma-buf/dma-buf.c' line='642' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_buf_put'>
+        <parameter type-id='type-id-5035' name='dmabuf' filepath='drivers/dma-buf/dma-buf.c' line='642' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/dma-buf/dma-fence.c' language='LANG_C89'>
+      <function-decl name='dma_fence_context_alloc' mangled-name='dma_fence_context_alloc' filepath='drivers/dma-buf/dma-fence.c' line='79' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_fence_context_alloc'>
+        <parameter type-id='type-id-5' name='num' filepath='drivers/dma-buf/dma-fence.c' line='79' column='1'/>
+        <return type-id='type-id-40'/>
+      </function-decl>
+      <function-decl name='dma_fence_signal_locked' mangled-name='dma_fence_signal_locked' filepath='drivers/dma-buf/dma-fence.c' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_fence_signal_locked'>
+        <parameter type-id='type-id-4652' name='fence' filepath='drivers/dma-buf/dma-fence.c' line='102' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='dma_fence_signal' mangled-name='dma_fence_signal' filepath='drivers/dma-buf/dma-fence.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_fence_signal'>
+        <parameter type-id='type-id-4652' name='fence' filepath='drivers/dma-buf/dma-fence.c' line='146' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='dma_fence_wait_timeout' mangled-name='dma_fence_wait_timeout' filepath='drivers/dma-buf/dma-fence.c' line='193' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_fence_wait_timeout'>
+        <parameter type-id='type-id-4652' name='fence' filepath='drivers/dma-buf/dma-fence.c' line='193' column='1'/>
+        <parameter type-id='type-id-33' name='intr' filepath='drivers/dma-buf/dma-fence.c' line='193' column='1'/>
+        <parameter type-id='type-id-192' name='timeout' filepath='drivers/dma-buf/dma-fence.c' line='193' column='1'/>
+        <return type-id='type-id-192'/>
+      </function-decl>
+      <function-decl name='dma_fence_release' mangled-name='dma_fence_release' filepath='drivers/dma-buf/dma-fence.c' line='217' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_fence_release'>
+        <parameter type-id='type-id-4945' name='kref' filepath='drivers/dma-buf/dma-fence.c' line='217' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='dma_fence_enable_sw_signaling' mangled-name='dma_fence_enable_sw_signaling' filepath='drivers/dma-buf/dma-fence.c' line='255' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_fence_enable_sw_signaling'>
+        <parameter type-id='type-id-4652' name='fence' filepath='drivers/dma-buf/dma-fence.c' line='255' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='dma_fence_init' mangled-name='dma_fence_init' filepath='drivers/dma-buf/dma-fence.c' line='617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_fence_init'>
+        <parameter type-id='type-id-4652' name='fence' filepath='drivers/dma-buf/dma-fence.c' line='617' column='1'/>
+        <parameter type-id='type-id-4658' name='ops' filepath='drivers/dma-buf/dma-fence.c' line='617' column='1'/>
+        <parameter type-id='type-id-486' name='lock' filepath='drivers/dma-buf/dma-fence.c' line='618' column='1'/>
+        <parameter type-id='type-id-40' name='context' filepath='drivers/dma-buf/dma-fence.c' line='618' column='1'/>
+        <parameter type-id='type-id-5' name='seqno' filepath='drivers/dma-buf/dma-fence.c' line='618' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/dma-buf/dma-fence-array.c' language='LANG_C89'>
+      <function-decl name='dma_fence_match_context' mangled-name='dma_fence_match_context' filepath='drivers/dma-buf/dma-fence-array.c' line='166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dma_fence_match_context'>
+        <parameter type-id='type-id-4652' name='fence' filepath='drivers/dma-buf/dma-fence-array.c' line='166' column='1'/>
+        <parameter type-id='type-id-40' name='context' filepath='drivers/dma-buf/dma-fence-array.c' line='166' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/dma-buf/reservation.c' language='LANG_C89'>
+      <function-decl name='reservation_object_reserve_shared' mangled-name='reservation_object_reserve_shared' filepath='drivers/dma-buf/reservation.c' line='69' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reservation_object_reserve_shared'>
+        <parameter type-id='type-id-5043' name='obj' filepath='drivers/dma-buf/reservation.c' line='69' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='reservation_object_add_shared_fence' mangled-name='reservation_object_add_shared_fence' filepath='drivers/dma-buf/reservation.c' line='226' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reservation_object_add_shared_fence'>
+        <parameter type-id='type-id-5043' name='obj' filepath='drivers/dma-buf/reservation.c' line='226' column='1'/>
+        <parameter type-id='type-id-4652' name='fence' filepath='drivers/dma-buf/reservation.c' line='227' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='reservation_object_add_excl_fence' mangled-name='reservation_object_add_excl_fence' filepath='drivers/dma-buf/reservation.c' line='248' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reservation_object_add_excl_fence'>
+        <parameter type-id='type-id-5043' name='obj' filepath='drivers/dma-buf/reservation.c' line='248' column='1'/>
+        <parameter type-id='type-id-4652' name='fence' filepath='drivers/dma-buf/reservation.c' line='249' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='reservation_object_copy_fences' mangled-name='reservation_object_copy_fences' filepath='drivers/dma-buf/reservation.c' line='287' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reservation_object_copy_fences'>
+        <parameter type-id='type-id-5043' name='dst' filepath='drivers/dma-buf/reservation.c' line='287' column='1'/>
+        <parameter type-id='type-id-5043' name='src' filepath='drivers/dma-buf/reservation.c' line='288' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='reservation_object_wait_timeout_rcu' mangled-name='reservation_object_wait_timeout_rcu' filepath='drivers/dma-buf/reservation.c' line='486' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reservation_object_wait_timeout_rcu'>
+        <parameter type-id='type-id-5043' name='obj' filepath='drivers/dma-buf/reservation.c' line='486' column='1'/>
+        <parameter type-id='type-id-33' name='wait_all' filepath='drivers/dma-buf/reservation.c' line='487' column='1'/>
+        <parameter type-id='type-id-33' name='intr' filepath='drivers/dma-buf/reservation.c' line='487' column='1'/>
+        <parameter type-id='type-id-16' name='timeout' filepath='drivers/dma-buf/reservation.c' line='488' column='1'/>
+        <return type-id='type-id-192'/>
+      </function-decl>
+      <function-decl name='reservation_object_test_signaled_rcu' mangled-name='reservation_object_test_signaled_rcu' filepath='drivers/dma-buf/reservation.c' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reservation_object_test_signaled_rcu'>
+        <parameter type-id='type-id-5043' name='obj' filepath='drivers/dma-buf/reservation.c' line='590' column='1'/>
+        <parameter type-id='type-id-33' name='test_all' filepath='drivers/dma-buf/reservation.c' line='591' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/dma-buf/sync_file.c' language='LANG_C89'>
+      <class-decl name='cred' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5156'/>
+      <class-decl name='sync_file' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/sync_file.h' line='35' column='1' id='type-id-5157'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='file' type-id='type-id-83' visibility='default' filepath='include/linux/sync_file.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='user_name' type-id='type-id-373' visibility='default' filepath='include/linux/sync_file.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='sync_file_list' type-id='type-id-20' visibility='default' filepath='include/linux/sync_file.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='wq' type-id='type-id-225' visibility='default' filepath='include/linux/sync_file.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/sync_file.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='fence' type-id='type-id-4652' visibility='default' filepath='include/linux/sync_file.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='cb' type-id='type-id-5061' visibility='default' filepath='include/linux/sync_file.h' line='53' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-5156' const='yes' id='type-id-5158'/>
+      <pointer-type-def type-id='type-id-5158' size-in-bits='64' id='type-id-5159'/>
+      <pointer-type-def type-id='type-id-5157' size-in-bits='64' id='type-id-5160'/>
+      <function-decl name='sync_file_create' mangled-name='sync_file_create' filepath='drivers/dma-buf/sync_file.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sync_file_create'>
+        <parameter type-id='type-id-4652' name='fence' filepath='drivers/dma-buf/sync_file.c' line='73' column='1'/>
+        <return type-id='type-id-5160'/>
+      </function-decl>
+      <function-decl name='sync_file_get_fence' mangled-name='sync_file_get_fence' filepath='drivers/dma-buf/sync_file.c' line='111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sync_file_get_fence'>
+        <parameter type-id='type-id-17' name='fd' filepath='drivers/dma-buf/sync_file.c' line='111' column='1'/>
+        <return type-id='type-id-4652'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/ethtool.c' language='LANG_C89'>
+
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='488' id='type-id-5161'>
+        <subrange length='61' type-id='type-id-9' id='type-id-5162'/>
+
+      </array-type-def>
+      <class-decl name='Qdisc' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5163'/>
+      <class-decl name='mini_Qdisc' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5164'/>
+      <class-decl name='phylink' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5165'/>
+      <array-type-def dimensions='1' type-id='type-id-5166' size-in-bits='2048' id='type-id-5167'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='256' id='type-id-5168'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <class-decl name='mdio_device' size-in-bits='6912' is-struct='yes' visibility='default' filepath='include/linux/mdio.h' line='29' column='1' id='type-id-5169'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/mdio.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='bus' type-id='type-id-5170' visibility='default' filepath='include/linux/mdio.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='modalias' type-id='type-id-373' visibility='default' filepath='include/linux/mdio.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='bus_match' type-id='type-id-2043' visibility='default' filepath='include/linux/mdio.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='device_free' type-id='type-id-5171' visibility='default' filepath='include/linux/mdio.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='device_remove' type-id='type-id-5171' visibility='default' filepath='include/linux/mdio.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6720'>
+          <var-decl name='addr' type-id='type-id-17' visibility='default' filepath='include/linux/mdio.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6752'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/mdio.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6784'>
+          <var-decl name='reset' type-id='type-id-4019' visibility='default' filepath='include/linux/mdio.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6848'>
+          <var-decl name='reset_assert_delay' type-id='type-id-5' visibility='default' filepath='include/linux/mdio.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6880'>
+          <var-decl name='reset_deassert_delay' type-id='type-id-5' visibility='default' filepath='include/linux/mdio.h' line='44' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mii_bus' size-in-bits='10752' is-struct='yes' visibility='default' filepath='include/linux/phy.h' line='193' column='1' id='type-id-5172'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/phy.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/phy.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='id' type-id='type-id-5161' visibility='default' filepath='include/linux/phy.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='priv' type-id='type-id-15' visibility='default' filepath='include/linux/phy.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='read' type-id='type-id-5173' visibility='default' filepath='include/linux/phy.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='write' type-id='type-id-5174' visibility='default' filepath='include/linux/phy.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='reset' type-id='type-id-5175' visibility='default' filepath='include/linux/phy.h' line='200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='mdio_lock' type-id='type-id-245' visibility='default' filepath='include/linux/phy.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='parent' type-id='type-id-240' visibility='default' filepath='include/linux/phy.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='state' type-id='type-id-5176' visibility='default' filepath='include/linux/phy.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/phy.h' line='215' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='mdio_map' type-id='type-id-5167' visibility='default' filepath='include/linux/phy.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9536'>
+          <var-decl name='phy_mask' type-id='type-id-7' visibility='default' filepath='include/linux/phy.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9568'>
+          <var-decl name='phy_ignore_ta_mask' type-id='type-id-7' visibility='default' filepath='include/linux/phy.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9600'>
+          <var-decl name='irq' type-id='type-id-5177' visibility='default' filepath='include/linux/phy.h' line='230' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10624'>
+          <var-decl name='reset_delay_us' type-id='type-id-17' visibility='default' filepath='include/linux/phy.h' line='233' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10688'>
+          <var-decl name='reset_gpiod' type-id='type-id-4019' visibility='default' filepath='include/linux/phy.h' line='235' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='__anonymous_enum__2' is-anonymous='yes' filepath='include/linux/phy.h' line='209' column='1' id='type-id-5176'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='MDIOBUS_ALLOCATED' value='1'/>
+        <enumerator name='MDIOBUS_REGISTERED' value='2'/>
+        <enumerator name='MDIOBUS_UNREGISTERED' value='3'/>
+        <enumerator name='MDIOBUS_RELEASED' value='4'/>
+      </enum-decl>
+      <class-decl name='phy_driver' size-in-bits='3520' is-struct='yes' visibility='default' filepath='include/linux/phy.h' line='507' column='1' id='type-id-5178'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mdiodrv' type-id='type-id-5179' visibility='default' filepath='include/linux/phy.h' line='508' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='phy_id' type-id='type-id-7' visibility='default' filepath='include/linux/phy.h' line='509' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='name' type-id='type-id-2' visibility='default' filepath='include/linux/phy.h' line='510' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='phy_id_mask' type-id='type-id-7' visibility='default' filepath='include/linux/phy.h' line='511' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='features' type-id='type-id-7' visibility='default' filepath='include/linux/phy.h' line='512' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/linux/phy.h' line='513' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='driver_data' type-id='type-id-15' visibility='default' filepath='include/linux/phy.h' line='514' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='soft_reset' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='519' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='config_init' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='525' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='probe' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='531' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='suspend' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='534' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='resume' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='535' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='config_aneg' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='543' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='aneg_done' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='546' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='read_status' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='549' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='ack_interrupt' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='552' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='config_intr' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='555' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='did_interrupt' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='561' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='remove' type-id='type-id-5181' visibility='default' filepath='include/linux/phy.h' line='564' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='match_phy_device' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='570' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='ts_info' type-id='type-id-5182' visibility='default' filepath='include/linux/phy.h' line='573' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='hwtstamp' type-id='type-id-5183' visibility='default' filepath='include/linux/phy.h' line='576' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='rxtstamp' type-id='type-id-5184' visibility='default' filepath='include/linux/phy.h' line='585' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='txtstamp' type-id='type-id-5185' visibility='default' filepath='include/linux/phy.h' line='593' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='set_wol' type-id='type-id-5186' visibility='default' filepath='include/linux/phy.h' line='598' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='get_wol' type-id='type-id-5187' visibility='default' filepath='include/linux/phy.h' line='601' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='link_change_notify' type-id='type-id-5181' visibility='default' filepath='include/linux/phy.h' line='610' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='read_mmd' type-id='type-id-5188' visibility='default' filepath='include/linux/phy.h' line='621' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='write_mmd' type-id='type-id-5189' visibility='default' filepath='include/linux/phy.h' line='633' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='read_page' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='636' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='write_page' type-id='type-id-5190' visibility='default' filepath='include/linux/phy.h' line='637' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='module_info' type-id='type-id-5191' visibility='default' filepath='include/linux/phy.h' line='641' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='module_eeprom' type-id='type-id-5192' visibility='default' filepath='include/linux/phy.h' line='645' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='get_sset_count' type-id='type-id-5180' visibility='default' filepath='include/linux/phy.h' line='649' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='get_strings' type-id='type-id-5193' visibility='default' filepath='include/linux/phy.h' line='650' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='get_stats' type-id='type-id-5194' visibility='default' filepath='include/linux/phy.h' line='651' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='get_tunable' type-id='type-id-5195' visibility='default' filepath='include/linux/phy.h' line='655' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='set_tunable' type-id='type-id-5195' visibility='default' filepath='include/linux/phy.h' line='657' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='set_loopback' type-id='type-id-5196' visibility='default' filepath='include/linux/phy.h' line='660' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mdio_driver_common' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/linux/mdio.h' line='49' column='1' id='type-id-5179'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='driver' type-id='type-id-2047' visibility='default' filepath='include/linux/mdio.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/mdio.h' line='51' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='phy_c45_device_ids' size-in-bits='288' is-struct='yes' visibility='default' filepath='include/linux/phy.h' line='361' column='1' id='type-id-5197'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='devices_in_package' type-id='type-id-7' visibility='default' filepath='include/linux/phy.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='device_ids' type-id='type-id-5168' visibility='default' filepath='include/linux/phy.h' line='363' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='phy_state' filepath='include/linux/phy.h' line='341' column='1' id='type-id-5198'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='PHY_DOWN' value='0'/>
+        <enumerator name='PHY_STARTING' value='1'/>
+        <enumerator name='PHY_READY' value='2'/>
+        <enumerator name='PHY_PENDING' value='3'/>
+        <enumerator name='PHY_UP' value='4'/>
+        <enumerator name='PHY_AN' value='5'/>
+        <enumerator name='PHY_RUNNING' value='6'/>
+        <enumerator name='PHY_NOLINK' value='7'/>
+        <enumerator name='PHY_FORCING' value='8'/>
+        <enumerator name='PHY_CHANGELINK' value='9'/>
+        <enumerator name='PHY_HALTED' value='10'/>
+        <enumerator name='PHY_RESUMING' value='11'/>
+      </enum-decl>
+      <typedef-decl name='phy_interface_t' type-id='type-id-5199' filepath='include/linux/phy.h' line='92' column='1' id='type-id-5200'/>
+      <enum-decl name='__anonymous_enum__3' is-anonymous='yes' filepath='include/linux/phy.h' line='66' column='1' id='type-id-5199'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='PHY_INTERFACE_MODE_NA' value='0'/>
+        <enumerator name='PHY_INTERFACE_MODE_INTERNAL' value='1'/>
+        <enumerator name='PHY_INTERFACE_MODE_MII' value='2'/>
+        <enumerator name='PHY_INTERFACE_MODE_GMII' value='3'/>
+        <enumerator name='PHY_INTERFACE_MODE_SGMII' value='4'/>
+        <enumerator name='PHY_INTERFACE_MODE_TBI' value='5'/>
+        <enumerator name='PHY_INTERFACE_MODE_REVMII' value='6'/>
+        <enumerator name='PHY_INTERFACE_MODE_RMII' value='7'/>
+        <enumerator name='PHY_INTERFACE_MODE_RGMII' value='8'/>
+        <enumerator name='PHY_INTERFACE_MODE_RGMII_ID' value='9'/>
+        <enumerator name='PHY_INTERFACE_MODE_RGMII_RXID' value='10'/>
+        <enumerator name='PHY_INTERFACE_MODE_RGMII_TXID' value='11'/>
+        <enumerator name='PHY_INTERFACE_MODE_RTBI' value='12'/>
+        <enumerator name='PHY_INTERFACE_MODE_SMII' value='13'/>
+        <enumerator name='PHY_INTERFACE_MODE_XGMII' value='14'/>
+        <enumerator name='PHY_INTERFACE_MODE_MOCA' value='15'/>
+        <enumerator name='PHY_INTERFACE_MODE_QSGMII' value='16'/>
+        <enumerator name='PHY_INTERFACE_MODE_TRGMII' value='17'/>
+        <enumerator name='PHY_INTERFACE_MODE_1000BASEX' value='18'/>
+        <enumerator name='PHY_INTERFACE_MODE_2500BASEX' value='19'/>
+        <enumerator name='PHY_INTERFACE_MODE_RXAUI' value='20'/>
+        <enumerator name='PHY_INTERFACE_MODE_XAUI' value='21'/>
+        <enumerator name='PHY_INTERFACE_MODE_10GKR' value='22'/>
+        <enumerator name='PHY_INTERFACE_MODE_MAX' value='23'/>
+      </enum-decl>
+      <pointer-type-def type-id='type-id-5163' size-in-bits='64' id='type-id-5201'/>
+      <pointer-type-def type-id='type-id-1904' size-in-bits='64' id='type-id-5202'/>
+      <pointer-type-def type-id='type-id-5203' size-in-bits='64' id='type-id-5175'/>
+      <pointer-type-def type-id='type-id-5204' size-in-bits='64' id='type-id-5173'/>
+      <pointer-type-def type-id='type-id-5205' size-in-bits='64' id='type-id-5174'/>
+      <pointer-type-def type-id='type-id-5206' size-in-bits='64' id='type-id-5180'/>
+      <pointer-type-def type-id='type-id-5207' size-in-bits='64' id='type-id-5192'/>
+      <pointer-type-def type-id='type-id-5208' size-in-bits='64' id='type-id-5191'/>
+      <pointer-type-def type-id='type-id-5209' size-in-bits='64' id='type-id-5182'/>
+      <pointer-type-def type-id='type-id-5210' size-in-bits='64' id='type-id-5195'/>
+      <pointer-type-def type-id='type-id-5211' size-in-bits='64' id='type-id-5186'/>
+      <pointer-type-def type-id='type-id-5212' size-in-bits='64' id='type-id-5183'/>
+      <pointer-type-def type-id='type-id-5213' size-in-bits='64' id='type-id-5190'/>
+      <pointer-type-def type-id='type-id-5214' size-in-bits='64' id='type-id-5188'/>
+      <pointer-type-def type-id='type-id-5215' size-in-bits='64' id='type-id-5189'/>
+      <pointer-type-def type-id='type-id-5216' size-in-bits='64' id='type-id-5196'/>
+      <pointer-type-def type-id='type-id-5169' size-in-bits='64' id='type-id-5166'/>
+      <pointer-type-def type-id='type-id-5172' size-in-bits='64' id='type-id-5170'/>
+      <pointer-type-def type-id='type-id-5164' size-in-bits='64' id='type-id-5217'/>
+      <pointer-type-def type-id='type-id-5178' size-in-bits='64' id='type-id-5218'/>
+      <pointer-type-def type-id='type-id-5165' size-in-bits='64' id='type-id-5219'/>
+      <pointer-type-def type-id='type-id-5220' size-in-bits='64' id='type-id-5184'/>
+      <pointer-type-def type-id='type-id-5221' size-in-bits='64' id='type-id-5171'/>
+      <pointer-type-def type-id='type-id-5222' size-in-bits='64' id='type-id-5181'/>
+      <pointer-type-def type-id='type-id-5223' size-in-bits='64' id='type-id-5194'/>
+      <pointer-type-def type-id='type-id-5224' size-in-bits='64' id='type-id-5187'/>
+      <pointer-type-def type-id='type-id-5225' size-in-bits='64' id='type-id-5185'/>
+      <pointer-type-def type-id='type-id-5226' size-in-bits='64' id='type-id-5227'/>
+      <pointer-type-def type-id='type-id-5228' size-in-bits='64' id='type-id-5193'/>
+      <function-decl name='__ethtool_get_link_ksettings' mangled-name='__ethtool_get_link_ksettings' filepath='net/core/ethtool.c' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ethtool_get_link_ksettings'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/ethtool.c' line='552' column='1'/>
+        <parameter type-id='type-id-2760' name='link_ksettings' filepath='net/core/ethtool.c' line='553' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='ethtool_op_get_link' mangled-name='ethtool_op_get_link' filepath='net/core/ethtool.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ethtool_op_get_link'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/ethtool.c' line='37' column='1'/>
+        <return type-id='type-id-7'/>
+      </function-decl>
+      <function-decl name='ethtool_op_get_ts_info' mangled-name='ethtool_op_get_ts_info' filepath='net/core/ethtool.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ethtool_op_get_ts_info'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/ethtool.c' line='43' column='1'/>
+        <parameter type-id='type-id-2768' name='info' filepath='net/core/ethtool.c' line='43' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5203'>
+        <parameter type-id='type-id-5170'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5204'>
+        <parameter type-id='type-id-5170'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5205'>
+        <parameter type-id='type-id-5170'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5206'>
+        <parameter type-id='type-id-1694'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5207'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-2757'/>
+        <parameter type-id='type-id-3121'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5208'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-2761'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5209'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-2768'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5210'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-5202'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5211'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-2769'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5212'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-2784'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5213'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5214'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5215'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-688'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5216'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5220'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5221'>
+        <parameter type-id='type-id-5166'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5222'>
+        <parameter type-id='type-id-1694'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5223'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-2766'/>
+        <parameter type-id='type-id-1508'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5224'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-2769'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5225'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5226'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5228'>
+        <parameter type-id='type-id-1694'/>
+        <parameter type-id='type-id-3121'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/skbuff.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-5229' size-in-bits='1536' id='type-id-5230'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5231' size-in-bits='160' id='type-id-5232'>
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5233' size-in-bits='384' id='type-id-5234'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <class-decl name='xfrm_offload' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='1071' column='1' id='type-id-5231'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='seq' type-id='type-id-5235' visibility='default' filepath='include/net/xfrm.h' line='1076' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-511' visibility='default' filepath='include/net/xfrm.h' line='1078' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='status' type-id='type-id-511' visibility='default' filepath='include/net/xfrm.h' line='1088' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='proto' type-id='type-id-893' visibility='default' filepath='include/net/xfrm.h' line='1098' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/xfrm.h' line='1073' column='1' id='type-id-5235'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='low' type-id='type-id-511' visibility='default' filepath='include/net/xfrm.h' line='1074' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='hi' type-id='type-id-511' visibility='default' filepath='include/net/xfrm.h' line='1075' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='napi_struct' size-in-bits='2880' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='319' column='1' id='type-id-5236'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='poll_list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='state' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='weight' type-id='type-id-17' visibility='default' filepath='include/linux/netdevice.h' line='329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='gro_bitmask' type-id='type-id-16' visibility='default' filepath='include/linux/netdevice.h' line='330' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='poll' type-id='type-id-5237' visibility='default' filepath='include/linux/netdevice.h' line='331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/linux/netdevice.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='gro_hash' type-id='type-id-5230' visibility='default' filepath='include/linux/netdevice.h' line='336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='skb' type-id='type-id-1766' visibility='default' filepath='include/linux/netdevice.h' line='337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='timer' type-id='type-id-681' visibility='default' filepath='include/linux/netdevice.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='dev_list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='339' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='napi_hash_node' type-id='type-id-520' visibility='default' filepath='include/linux/netdevice.h' line='340' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='napi_id' type-id='type-id-5' visibility='default' filepath='include/linux/netdevice.h' line='341' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='gro_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='305' column='1' id='type-id-5229'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='count' type-id='type-id-17' visibility='default' filepath='include/linux/netdevice.h' line='307' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='skb_shared_hwtstamps' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/skbuff.h' line='400' column='1' id='type-id-5238'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hwtstamp' type-id='type-id-682' visibility='default' filepath='include/linux/skbuff.h' line='401' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-5239' size-in-bits='64' id='type-id-5237'/>
+      <pointer-type-def type-id='type-id-5236' size-in-bits='64' id='type-id-5240'/>
+      <pointer-type-def type-id='type-id-1659' size-in-bits='64' id='type-id-5241'/>
+      <pointer-type-def type-id='type-id-5238' size-in-bits='64' id='type-id-5242'/>
+      <function-decl name='__alloc_skb' mangled-name='__alloc_skb' filepath='net/core/skbuff.c' line='177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__alloc_skb'>
+        <parameter type-id='type-id-5' name='size' filepath='net/core/skbuff.c' line='177' column='1'/>
+        <parameter type-id='type-id-485' name='gfp_mask' filepath='net/core/skbuff.c' line='177' column='1'/>
+        <parameter type-id='type-id-17' name='flags' filepath='net/core/skbuff.c' line='178' column='1'/>
+        <parameter type-id='type-id-17' name='node' filepath='net/core/skbuff.c' line='178' column='1'/>
+        <return type-id='type-id-1766'/>
+      </function-decl>
+      <function-decl name='build_skb' mangled-name='build_skb' filepath='net/core/skbuff.c' line='310' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='build_skb'>
+        <parameter type-id='type-id-15' name='data' filepath='net/core/skbuff.c' line='310' column='1'/>
+        <parameter type-id='type-id-5' name='frag_size' filepath='net/core/skbuff.c' line='310' column='1'/>
+        <return type-id='type-id-1766'/>
+      </function-decl>
+      <function-decl name='__netdev_alloc_skb' mangled-name='__netdev_alloc_skb' filepath='net/core/skbuff.c' line='390' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__netdev_alloc_skb'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/skbuff.c' line='390' column='1'/>
+        <parameter type-id='type-id-5' name='len' filepath='net/core/skbuff.c' line='390' column='1'/>
+        <parameter type-id='type-id-485' name='gfp_mask' filepath='net/core/skbuff.c' line='391' column='1'/>
+        <return type-id='type-id-1766'/>
+      </function-decl>
+      <function-decl name='__napi_alloc_skb' mangled-name='__napi_alloc_skb' filepath='net/core/skbuff.c' line='459' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__napi_alloc_skb'>
+        <parameter type-id='type-id-5240' name='napi' filepath='net/core/skbuff.c' line='459' column='1'/>
+        <parameter type-id='type-id-5' name='len' filepath='net/core/skbuff.c' line='459' column='1'/>
+        <parameter type-id='type-id-485' name='gfp_mask' filepath='net/core/skbuff.c' line='460' column='1'/>
+        <return type-id='type-id-1766'/>
+      </function-decl>
+      <function-decl name='skb_add_rx_frag' mangled-name='skb_add_rx_frag' filepath='net/core/skbuff.c' line='506' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_add_rx_frag'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/skbuff.c' line='506' column='1'/>
+        <parameter type-id='type-id-17' name='i' filepath='net/core/skbuff.c' line='506' column='1'/>
+        <parameter type-id='type-id-512' name='page' filepath='net/core/skbuff.c' line='506' column='1'/>
+        <parameter type-id='type-id-17' name='off' filepath='net/core/skbuff.c' line='506' column='1'/>
+        <parameter type-id='type-id-17' name='size' filepath='net/core/skbuff.c' line='507' column='1'/>
+        <parameter type-id='type-id-5' name='truesize' filepath='net/core/skbuff.c' line='507' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='skb_coalesce_rx_frag' mangled-name='skb_coalesce_rx_frag' filepath='net/core/skbuff.c' line='516' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_coalesce_rx_frag'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/skbuff.c' line='516' column='1'/>
+        <parameter type-id='type-id-17' name='i' filepath='net/core/skbuff.c' line='516' column='1'/>
+        <parameter type-id='type-id-17' name='size' filepath='net/core/skbuff.c' line='516' column='1'/>
+        <parameter type-id='type-id-5' name='truesize' filepath='net/core/skbuff.c' line='517' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='kfree_skb' mangled-name='kfree_skb' filepath='net/core/skbuff.c' line='657' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kfree_skb'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/skbuff.c' line='657' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='consume_skb' mangled-name='consume_skb' filepath='net/core/skbuff.c' line='699' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='consume_skb'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/skbuff.c' line='699' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='napi_consume_skb' mangled-name='napi_consume_skb' filepath='net/core/skbuff.c' line='762' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='napi_consume_skb'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/skbuff.c' line='762' column='1'/>
+        <parameter type-id='type-id-17' name='budget' filepath='net/core/skbuff.c' line='762' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='skb_clone' mangled-name='skb_clone' filepath='net/core/skbuff.c' line='1266' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_clone'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/skbuff.c' line='1266' column='1'/>
+        <parameter type-id='type-id-485' name='gfp_mask' filepath='net/core/skbuff.c' line='1266' column='1'/>
+        <return type-id='type-id-1766'/>
+      </function-decl>
+      <function-decl name='skb_copy' mangled-name='skb_copy' filepath='net/core/skbuff.c' line='1345' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_copy'>
+        <parameter type-id='type-id-2719' name='skb' filepath='net/core/skbuff.c' line='1345' column='1'/>
+        <parameter type-id='type-id-485' name='gfp_mask' filepath='net/core/skbuff.c' line='1345' column='1'/>
+        <return type-id='type-id-1766'/>
+      </function-decl>
+      <function-decl name='skb_put' mangled-name='skb_put' filepath='net/core/skbuff.c' line='1695' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_put'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/skbuff.c' line='1695' column='1'/>
+        <parameter type-id='type-id-5' name='len' filepath='net/core/skbuff.c' line='1695' column='1'/>
+        <return type-id='type-id-15'/>
+      </function-decl>
+      <function-decl name='skb_trim' mangled-name='skb_trim' filepath='net/core/skbuff.c' line='1751' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_trim'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/skbuff.c' line='1751' column='1'/>
+        <parameter type-id='type-id-5' name='len' filepath='net/core/skbuff.c' line='1751' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='skb_dequeue' mangled-name='skb_dequeue' filepath='net/core/skbuff.c' line='2814' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_dequeue'>
+        <parameter type-id='type-id-5241' name='list' filepath='net/core/skbuff.c' line='2814' column='1'/>
+        <return type-id='type-id-1766'/>
+      </function-decl>
+      <function-decl name='skb_queue_purge' mangled-name='skb_queue_purge' filepath='net/core/skbuff.c' line='2854' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_queue_purge'>
+        <parameter type-id='type-id-5241' name='list' filepath='net/core/skbuff.c' line='2854' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='skb_queue_tail' mangled-name='skb_queue_tail' filepath='net/core/skbuff.c' line='2920' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_queue_tail'>
+        <parameter type-id='type-id-5241' name='list' filepath='net/core/skbuff.c' line='2920' column='1'/>
+        <parameter type-id='type-id-1766' name='newsk' filepath='net/core/skbuff.c' line='2920' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='skb_to_sgvec' mangled-name='skb_to_sgvec' filepath='net/core/skbuff.c' line='4058' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_to_sgvec'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/skbuff.c' line='4058' column='1'/>
+        <parameter type-id='type-id-918' name='sg' filepath='net/core/skbuff.c' line='4058' column='1'/>
+        <parameter type-id='type-id-17' name='offset' filepath='net/core/skbuff.c' line='4058' column='1'/>
+        <parameter type-id='type-id-17' name='len' filepath='net/core/skbuff.c' line='4058' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='skb_tstamp_tx' mangled-name='skb_tstamp_tx' filepath='net/core/skbuff.c' line='4432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_tstamp_tx'>
+        <parameter type-id='type-id-1766' name='orig_skb' filepath='net/core/skbuff.c' line='4432' column='1'/>
+        <parameter type-id='type-id-5242' name='hwtstamps' filepath='net/core/skbuff.c' line='4433' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='skb_partial_csum_set' mangled-name='skb_partial_csum_set' filepath='net/core/skbuff.c' line='4478' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_partial_csum_set'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/skbuff.c' line='4478' column='1'/>
+        <parameter type-id='type-id-688' name='start' filepath='net/core/skbuff.c' line='4478' column='1'/>
+        <parameter type-id='type-id-688' name='off' filepath='net/core/skbuff.c' line='4478' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5239'>
+        <parameter type-id='type-id-5240'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/utils.c' language='LANG_C89'>
+      <function-decl name='net_ratelimit' mangled-name='net_ratelimit' filepath='net/core/utils.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='net_ratelimit'>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/usb/core/usb.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-2461' size-in-bits='32' id='type-id-5243'>
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <class-decl name='ep_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5244'/>
+      <class-decl name='wusb_dev' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5245'/>
+      <array-type-def dimensions='1' type-id='type-id-5246' size-in-bits='1024' id='type-id-5247'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5248' size-in-bits='infinite' id='type-id-5249'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5250' size-in-bits='2048' id='type-id-5251'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5252' size-in-bits='1024' id='type-id-5253'>
+        <subrange length='16' type-id='type-id-9' id='type-id-135'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5254' size-in-bits='2048' id='type-id-5255'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <class-decl name='usb_device' size-in-bits='11264' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='631' column='1' id='type-id-5256'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='devnum' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='632' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='devpath' type-id='type-id-43' visibility='default' filepath='include/linux/usb.h' line='633' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='route' type-id='type-id-7' visibility='default' filepath='include/linux/usb.h' line='634' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='state' type-id='type-id-5257' visibility='default' filepath='include/linux/usb.h' line='635' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='speed' type-id='type-id-5258' visibility='default' filepath='include/linux/usb.h' line='636' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rx_lanes' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='637' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='tx_lanes' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='638' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='tt' type-id='type-id-5259' visibility='default' filepath='include/linux/usb.h' line='640' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ttport' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='641' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='toggle' type-id='type-id-488' visibility='default' filepath='include/linux/usb.h' line='643' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='parent' type-id='type-id-5260' visibility='default' filepath='include/linux/usb.h' line='645' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='bus' type-id='type-id-5261' visibility='default' filepath='include/linux/usb.h' line='646' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='ep0' type-id='type-id-5262' visibility='default' filepath='include/linux/usb.h' line='647' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/usb.h' line='649' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='descriptor' type-id='type-id-5263' visibility='default' filepath='include/linux/usb.h' line='651' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7680'>
+          <var-decl name='bos' type-id='type-id-5264' visibility='default' filepath='include/linux/usb.h' line='652' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7744'>
+          <var-decl name='config' type-id='type-id-5265' visibility='default' filepath='include/linux/usb.h' line='653' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7808'>
+          <var-decl name='actconfig' type-id='type-id-5265' visibility='default' filepath='include/linux/usb.h' line='655' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7872'>
+          <var-decl name='ep_in' type-id='type-id-5247' visibility='default' filepath='include/linux/usb.h' line='656' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8896'>
+          <var-decl name='ep_out' type-id='type-id-5247' visibility='default' filepath='include/linux/usb.h' line='657' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9920'>
+          <var-decl name='rawdescriptors' type-id='type-id-3458' visibility='default' filepath='include/linux/usb.h' line='659' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9984'>
+          <var-decl name='bus_mA' type-id='type-id-312' visibility='default' filepath='include/linux/usb.h' line='661' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10000'>
+          <var-decl name='portnum' type-id='type-id-214' visibility='default' filepath='include/linux/usb.h' line='662' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10008'>
+          <var-decl name='level' type-id='type-id-214' visibility='default' filepath='include/linux/usb.h' line='663' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='can_submit' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='665' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='persist_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='666' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='have_langid' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='authorized' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='668' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='authenticated' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='669' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26'>
+          <var-decl name='wusb' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='25'>
+          <var-decl name='lpm_capable' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='671' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='usb2_hw_lpm_capable' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23'>
+          <var-decl name='usb2_hw_lpm_besl_capable' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22'>
+          <var-decl name='usb2_hw_lpm_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='674' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='21'>
+          <var-decl name='usb2_hw_lpm_allowed' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='675' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20'>
+          <var-decl name='usb3_lpm_u1_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='676' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19'>
+          <var-decl name='usb3_lpm_u2_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='677' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10048'>
+          <var-decl name='string_langid' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='678' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10112'>
+          <var-decl name='product' type-id='type-id-2' visibility='default' filepath='include/linux/usb.h' line='681' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10176'>
+          <var-decl name='manufacturer' type-id='type-id-2' visibility='default' filepath='include/linux/usb.h' line='682' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10240'>
+          <var-decl name='serial' type-id='type-id-2' visibility='default' filepath='include/linux/usb.h' line='683' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10304'>
+          <var-decl name='filelist' type-id='type-id-20' visibility='default' filepath='include/linux/usb.h' line='685' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10432'>
+          <var-decl name='maxchild' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='687' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10464'>
+          <var-decl name='quirks' type-id='type-id-7' visibility='default' filepath='include/linux/usb.h' line='689' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10496'>
+          <var-decl name='urbnum' type-id='type-id-26' visibility='default' filepath='include/linux/usb.h' line='690' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10560'>
+          <var-decl name='active_duration' type-id='type-id-16' visibility='default' filepath='include/linux/usb.h' line='692' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10624'>
+          <var-decl name='connect_time' type-id='type-id-16' visibility='default' filepath='include/linux/usb.h' line='695' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='do_remote_wakeup' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='697' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='reset_resume' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='698' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='port_is_suspended' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='699' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10752'>
+          <var-decl name='wusb_dev' type-id='type-id-5266' visibility='default' filepath='include/linux/usb.h' line='701' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10816'>
+          <var-decl name='slot_id' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='702' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10848'>
+          <var-decl name='removable' type-id='type-id-5267' visibility='default' filepath='include/linux/usb.h' line='703' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10880'>
+          <var-decl name='l1_params' type-id='type-id-5268' visibility='default' filepath='include/linux/usb.h' line='704' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10944'>
+          <var-decl name='u1_params' type-id='type-id-5269' visibility='default' filepath='include/linux/usb.h' line='705' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11072'>
+          <var-decl name='u2_params' type-id='type-id-5269' visibility='default' filepath='include/linux/usb.h' line='706' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11200'>
+          <var-decl name='lpm_disable_count' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='707' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='11232'>
+          <var-decl name='hub_delay' type-id='type-id-688' visibility='default' filepath='include/linux/usb.h' line='709' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='usb_device_state' filepath='include/uapi/linux/usb/ch9.h' line='1147' column='1' id='type-id-5257'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='USB_STATE_NOTATTACHED' value='0'/>
+        <enumerator name='USB_STATE_ATTACHED' value='1'/>
+        <enumerator name='USB_STATE_POWERED' value='2'/>
+        <enumerator name='USB_STATE_RECONNECTING' value='3'/>
+        <enumerator name='USB_STATE_UNAUTHENTICATED' value='4'/>
+        <enumerator name='USB_STATE_DEFAULT' value='5'/>
+        <enumerator name='USB_STATE_ADDRESS' value='6'/>
+        <enumerator name='USB_STATE_CONFIGURED' value='7'/>
+        <enumerator name='USB_STATE_SUSPENDED' value='8'/>
+      </enum-decl>
+      <enum-decl name='usb_device_speed' filepath='include/uapi/linux/usb/ch9.h' line='1137' column='1' id='type-id-5258'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='USB_SPEED_UNKNOWN' value='0'/>
+        <enumerator name='USB_SPEED_LOW' value='1'/>
+        <enumerator name='USB_SPEED_FULL' value='2'/>
+        <enumerator name='USB_SPEED_HIGH' value='3'/>
+        <enumerator name='USB_SPEED_WIRELESS' value='4'/>
+        <enumerator name='USB_SPEED_SUPER' value='5'/>
+        <enumerator name='USB_SPEED_SUPER_PLUS' value='6'/>
+      </enum-decl>
+      <class-decl name='usb_tt' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/usb/hcd.h' line='543' column='1' id='type-id-5270'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hub' type-id='type-id-5260' visibility='default' filepath='include/linux/usb/hcd.h' line='544' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='multi' type-id='type-id-17' visibility='default' filepath='include/linux/usb/hcd.h' line='545' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='think_time' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='546' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hcpriv' type-id='type-id-15' visibility='default' filepath='include/linux/usb/hcd.h' line='547' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/usb/hcd.h' line='550' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='clear_list' type-id='type-id-20' visibility='default' filepath='include/linux/usb/hcd.h' line='551' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='clear_work' type-id='type-id-255' visibility='default' filepath='include/linux/usb/hcd.h' line='552' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_bus' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='424' column='1' id='type-id-5271'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='controller' type-id='type-id-240' visibility='default' filepath='include/linux/usb.h' line='425' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sysdev' type-id='type-id-240' visibility='default' filepath='include/linux/usb.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='busnum' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='427' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='bus_name' type-id='type-id-4' visibility='default' filepath='include/linux/usb.h' line='428' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='uses_dma' type-id='type-id-214' visibility='default' filepath='include/linux/usb.h' line='429' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='264'>
+          <var-decl name='uses_pio_for_control' type-id='type-id-214' visibility='default' filepath='include/linux/usb.h' line='430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='otg_port' type-id='type-id-214' visibility='default' filepath='include/linux/usb.h' line='434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='is_b_host' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='435' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='b_hnp_enable' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='436' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5'>
+          <var-decl name='no_stop_on_short' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='no_sg_constraint' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='442' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='sg_tablesize' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='devnum_next' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='445' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='devnum_next_mutex' type-id='type-id-245' visibility='default' filepath='include/linux/usb.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='devmap' type-id='type-id-5272' visibility='default' filepath='include/linux/usb.h' line='449' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='root_hub' type-id='type-id-5260' visibility='default' filepath='include/linux/usb.h' line='450' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='hs_companion' type-id='type-id-5261' visibility='default' filepath='include/linux/usb.h' line='451' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='bandwidth_allocated' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='453' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='bandwidth_int_reqs' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='bandwidth_isoc_reqs' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='461' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='resuming_ports' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='463' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_devmap' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='417' column='1' id='type-id-5272'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='devicemap' type-id='type-id-219' visibility='default' filepath='include/linux/usb.h' line='418' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_host_endpoint' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='67' column='1' id='type-id-5262'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='desc' type-id='type-id-5273' visibility='default' filepath='include/linux/usb.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='72'>
+          <var-decl name='ss_ep_comp' type-id='type-id-5274' visibility='default' filepath='include/linux/usb.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='ssp_isoc_ep_comp' type-id='type-id-5275' visibility='default' filepath='include/linux/usb.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='urb_list' type-id='type-id-20' visibility='default' filepath='include/linux/usb.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='hcpriv' type-id='type-id-15' visibility='default' filepath='include/linux/usb.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ep_dev' type-id='type-id-5276' visibility='default' filepath='include/linux/usb.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='extra' type-id='type-id-256' visibility='default' filepath='include/linux/usb.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='extralen' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='enabled' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='streams' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='78' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_endpoint_descriptor' size-in-bits='72' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='400' column='1' id='type-id-5273'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bEndpointAddress' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='bmAttributes' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='wMaxPacketSize' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='bInterval' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='bRefresh' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bSynchAddress' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='412' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_ss_ep_comp_descriptor' size-in-bits='48' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='682' column='1' id='type-id-5274'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='683' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='684' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bMaxBurst' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='686' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='bmAttributes' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='687' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='wBytesPerInterval' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='688' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_ssp_isoc_ep_comp_descriptor' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='670' column='1' id='type-id-5275'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='671' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='wReseved' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='dwBytesPerInterval' type-id='type-id-2461' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='674' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_device_descriptor' size-in-bits='144' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='289' column='1' id='type-id-5263'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bcdUSB' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='bDeviceClass' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='bDeviceSubClass' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='bDeviceProtocol' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='bMaxPacketSize0' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='idVendor' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='idProduct' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='bcdDevice' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='iManufacturer' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='iProduct' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='iSerialNumber' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='136'>
+          <var-decl name='bNumConfigurations' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='304' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_host_bos' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='396' column='1' id='type-id-5277'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='desc' type-id='type-id-5278' visibility='default' filepath='include/linux/usb.h' line='397' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ext_cap' type-id='type-id-5279' visibility='default' filepath='include/linux/usb.h' line='400' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ss_cap' type-id='type-id-5280' visibility='default' filepath='include/linux/usb.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ssp_cap' type-id='type-id-5281' visibility='default' filepath='include/linux/usb.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ss_id' type-id='type-id-5282' visibility='default' filepath='include/linux/usb.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ptm_cap' type-id='type-id-5283' visibility='default' filepath='include/linux/usb.h' line='404' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_bos_descriptor' size-in-bits='40' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='837' column='1' id='type-id-5284'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='838' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='839' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='wTotalLength' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='841' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='bNumDeviceCaps' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='842' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_ext_cap_descriptor' size-in-bits='56' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='888' column='1' id='type-id-5285'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='889' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='890' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bDevCapabilityType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='891' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='bmAttributes' type-id='type-id-2461' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='892' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_ss_cap_descriptor' size-in-bits='80' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='908' column='1' id='type-id-5286'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='909' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='910' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bDevCapabilityType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='911' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='bmAttributes' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='912' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='wSpeedSupported' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='914' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='bFunctionalitySupport' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='919' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='bU1devExitLat' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='920' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bU2DevExitLat' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='921' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_ssp_cap_descriptor' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='946' column='1' id='type-id-5287'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='947' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='948' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bDevCapabilityType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='949' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='bReserved' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='950' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='bmAttributes' type-id='type-id-2461' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='951' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wFunctionalitySupport' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='954' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='wReserved' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='958' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='bmSublinkSpeedAttr' type-id='type-id-5243' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='959' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_ss_container_id_descriptor' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='931' column='1' id='type-id-5288'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='932' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='933' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bDevCapabilityType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='934' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='bReserved' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='935' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ContainerID' type-id='type-id-936' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='936' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_ptm_cap_descriptor' size-in-bits='24' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='1071' column='1' id='type-id-5289'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='1072' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='1073' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bDevCapabilityType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='1074' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_host_config' size-in-bits='5440' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='374' column='1' id='type-id-5290'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='desc' type-id='type-id-5291' visibility='default' filepath='include/linux/usb.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='string' type-id='type-id-2' visibility='default' filepath='include/linux/usb.h' line='377' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='intf_assoc' type-id='type-id-5253' visibility='default' filepath='include/linux/usb.h' line='381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='interface' type-id='type-id-5251' visibility='default' filepath='include/linux/usb.h' line='385' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='intf_cache' type-id='type-id-5255' visibility='default' filepath='include/linux/usb.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='extra' type-id='type-id-256' visibility='default' filepath='include/linux/usb.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='extralen' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='392' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_config_descriptor' size-in-bits='72' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='345' column='1' id='type-id-5291'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='wTotalLength' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='bNumInterfaces' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='bConfigurationValue' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='iConfiguration' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='bmAttributes' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bMaxPower' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='354' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_interface_assoc_descriptor' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='776' column='1' id='type-id-5292'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='777' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='778' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bFirstInterface' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='780' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='bInterfaceCount' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='781' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='bFunctionClass' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='782' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='bFunctionSubClass' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='783' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='bFunctionProtocol' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='784' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='iFunction' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='785' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_interface' size-in-bits='6912' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='232' column='1' id='type-id-5293'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='altsetting' type-id='type-id-5294' visibility='default' filepath='include/linux/usb.h' line='235' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cur_altsetting' type-id='type-id-5294' visibility='default' filepath='include/linux/usb.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='num_altsetting' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='intf_assoc' type-id='type-id-5252' visibility='default' filepath='include/linux/usb.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='minor' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='245' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='condition' type-id='type-id-5295' visibility='default' filepath='include/linux/usb.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='sysfs_files_created' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='ep_devs_created' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='unregistering' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='250' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='needs_remote_wakeup' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='needs_altsetting0' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='252' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26'>
+          <var-decl name='needs_binding' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='253' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='25'>
+          <var-decl name='resetting_device' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='authorized' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/usb.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='usb_dev' type-id='type-id-240' visibility='default' filepath='include/linux/usb.h' line='258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='reset_ws' type-id='type-id-255' visibility='default' filepath='include/linux/usb.h' line='259' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_host_interface' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='82' column='1' id='type-id-5248'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='desc' type-id='type-id-5296' visibility='default' filepath='include/linux/usb.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='extralen' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='extra' type-id='type-id-256' visibility='default' filepath='include/linux/usb.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='endpoint' type-id='type-id-5246' visibility='default' filepath='include/linux/usb.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='string' type-id='type-id-2' visibility='default' filepath='include/linux/usb.h' line='93' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_interface_descriptor' size-in-bits='72' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='382' column='1' id='type-id-5296'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bLength' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='383' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bDescriptorType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='384' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bInterfaceNumber' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='bAlternateSetting' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='bNumEndpoints' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='388' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='bInterfaceClass' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='bInterfaceSubClass' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='bInterfaceProtocol' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='iInterface' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='392' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='usb_interface_condition' filepath='include/linux/usb.h' line='96' column='1' id='type-id-5295'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='USB_INTERFACE_UNBOUND' value='0'/>
+        <enumerator name='USB_INTERFACE_BINDING' value='1'/>
+        <enumerator name='USB_INTERFACE_BOUND' value='2'/>
+        <enumerator name='USB_INTERFACE_UNBINDING' value='3'/>
+      </enum-decl>
+      <class-decl name='usb_interface_cache' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='322' column='1' id='type-id-5297'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='num_altsetting' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ref' type-id='type-id-239' visibility='default' filepath='include/linux/usb.h' line='324' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='altsetting' type-id='type-id-5249' visibility='default' filepath='include/linux/usb.h' line='328' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='usb_device_removable' filepath='include/linux/usb.h' line='477' column='1' id='type-id-5267'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='USB_DEVICE_REMOVABLE_UNKNOWN' value='0'/>
+        <enumerator name='USB_DEVICE_REMOVABLE' value='1'/>
+        <enumerator name='USB_DEVICE_FIXED' value='2'/>
+      </enum-decl>
+      <class-decl name='usb2_lpm_parameters' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='503' column='1' id='type-id-5268'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='besl' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='507' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='timeout' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='513' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb3_lpm_parameters' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='523' column='1' id='type-id-5269'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mel' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='530' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='pel' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='536' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sel' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='546' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='timeout' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='552' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-3458'/>
+      <pointer-type-def type-id='type-id-5244' size-in-bits='64' id='type-id-5276'/>
+      <pointer-type-def type-id='type-id-5284' size-in-bits='64' id='type-id-5278'/>
+      <pointer-type-def type-id='type-id-5271' size-in-bits='64' id='type-id-5261'/>
+      <pointer-type-def type-id='type-id-5256' size-in-bits='64' id='type-id-5260'/>
+      <pointer-type-def type-id='type-id-5285' size-in-bits='64' id='type-id-5279'/>
+      <pointer-type-def type-id='type-id-5277' size-in-bits='64' id='type-id-5264'/>
+      <pointer-type-def type-id='type-id-5290' size-in-bits='64' id='type-id-5265'/>
+      <pointer-type-def type-id='type-id-5262' size-in-bits='64' id='type-id-5246'/>
+      <pointer-type-def type-id='type-id-5248' size-in-bits='64' id='type-id-5294'/>
+      <pointer-type-def type-id='type-id-5293' size-in-bits='64' id='type-id-5250'/>
+      <pointer-type-def type-id='type-id-5292' size-in-bits='64' id='type-id-5252'/>
+      <pointer-type-def type-id='type-id-5297' size-in-bits='64' id='type-id-5254'/>
+      <pointer-type-def type-id='type-id-5289' size-in-bits='64' id='type-id-5283'/>
+      <pointer-type-def type-id='type-id-5286' size-in-bits='64' id='type-id-5280'/>
+      <pointer-type-def type-id='type-id-5288' size-in-bits='64' id='type-id-5282'/>
+      <pointer-type-def type-id='type-id-5287' size-in-bits='64' id='type-id-5281'/>
+      <pointer-type-def type-id='type-id-5270' size-in-bits='64' id='type-id-5259'/>
+      <pointer-type-def type-id='type-id-5245' size-in-bits='64' id='type-id-5266'/>
+      <function-decl name='usb_disabled' mangled-name='usb_disabled' filepath='drivers/usb/core/usb.c' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_disabled'>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='usb_get_dev' mangled-name='usb_get_dev' filepath='drivers/usb/core/usb.c' line='688' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_get_dev'>
+        <parameter type-id='type-id-5260' name='dev' filepath='drivers/usb/core/usb.c' line='688' column='1'/>
+        <return type-id='type-id-5260'/>
+      </function-decl>
+      <function-decl name='usb_put_dev' mangled-name='usb_put_dev' filepath='drivers/usb/core/usb.c' line='703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_put_dev'>
+        <parameter type-id='type-id-5260' name='dev' filepath='drivers/usb/core/usb.c' line='703' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/usb/core/hcd.c' language='LANG_C89'>
+      <class-decl name='dma_pool' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5298'/>
+      <class-decl name='extcon_dev' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5299'/>
+      <class-decl name='regulator' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5300'/>
+      <class-decl name='usb_gadget' size-in-bits='7232' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5301'/>
+      <class-decl name='usb_phy_roothub' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5302'/>
+      <array-type-def dimensions='1' type-id='type-id-5303' size-in-bits='256' id='type-id-5304'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5305' size-in-bits='infinite' id='type-id-5306'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='usb_hcd' size-in-bits='4352' is-struct='yes' visibility='default' filepath='include/linux/usb/hcd.h' line='75' column='1' id='type-id-5307'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='self' type-id='type-id-5271' visibility='default' filepath='include/linux/usb/hcd.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='kref' type-id='type-id-239' visibility='default' filepath='include/linux/usb/hcd.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='product_desc' type-id='type-id-4' visibility='default' filepath='include/linux/usb/hcd.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='speed' type-id='type-id-17' visibility='default' filepath='include/linux/usb/hcd.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='irq_descr' type-id='type-id-3435' visibility='default' filepath='include/linux/usb/hcd.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='rh_timer' type-id='type-id-417' visibility='default' filepath='include/linux/usb/hcd.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='status_urb' type-id='type-id-5308' visibility='default' filepath='include/linux/usb/hcd.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='wakeup_work' type-id='type-id-255' visibility='default' filepath='include/linux/usb/hcd.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='driver' type-id='type-id-5309' visibility='default' filepath='include/linux/usb/hcd.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='usb_phy' type-id='type-id-5310' visibility='default' filepath='include/linux/usb/hcd.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='phy_roothub' type-id='type-id-5311' visibility='default' filepath='include/linux/usb/hcd.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/usb/hcd.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='rh_registered' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='rh_pollable' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='msix_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='msi_enabled' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='skip_phy_initialization' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26'>
+          <var-decl name='uses_new_polling' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='25'>
+          <var-decl name='wireless' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='has_tt' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23'>
+          <var-decl name='amd_resume_bug' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22'>
+          <var-decl name='can_do_streams' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='21'>
+          <var-decl name='tpl_support' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20'>
+          <var-decl name='cant_recv_wakeups' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2336'>
+          <var-decl name='irq' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='regs' type-id='type-id-15' visibility='default' filepath='include/linux/usb/hcd.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='rsrc_start' type-id='type-id-2154' visibility='default' filepath='include/linux/usb/hcd.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='rsrc_len' type-id='type-id-2154' visibility='default' filepath='include/linux/usb/hcd.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='power_budget' type-id='type-id-5' visibility='default' filepath='include/linux/usb/hcd.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='high_prio_bh' type-id='type-id-5312' visibility='default' filepath='include/linux/usb/hcd.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='low_prio_bh' type-id='type-id-5312' visibility='default' filepath='include/linux/usb/hcd.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='address0_mutex' type-id='type-id-3475' visibility='default' filepath='include/linux/usb/hcd.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='bandwidth_mutex' type-id='type-id-3475' visibility='default' filepath='include/linux/usb/hcd.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3904'>
+          <var-decl name='shared_hcd' type-id='type-id-5313' visibility='default' filepath='include/linux/usb/hcd.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='primary_hcd' type-id='type-id-5313' visibility='default' filepath='include/linux/usb/hcd.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='pool' type-id='type-id-5304' visibility='default' filepath='include/linux/usb/hcd.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='state' type-id='type-id-17' visibility='default' filepath='include/linux/usb/hcd.h' line='200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='hcd_priv' type-id='type-id-280' visibility='default' filepath='include/linux/usb/hcd.h' line='223' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='urb' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='1543' column='1' id='type-id-5314'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kref' type-id='type-id-239' visibility='default' filepath='include/linux/usb.h' line='1545' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='hcpriv' type-id='type-id-15' visibility='default' filepath='include/linux/usb.h' line='1546' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='use_count' type-id='type-id-26' visibility='default' filepath='include/linux/usb.h' line='1547' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='reject' type-id='type-id-26' visibility='default' filepath='include/linux/usb.h' line='1548' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='unlinked' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='1549' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='urb_list' type-id='type-id-20' visibility='default' filepath='include/linux/usb.h' line='1552' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='anchor_list' type-id='type-id-20' visibility='default' filepath='include/linux/usb.h' line='1554' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='anchor' type-id='type-id-5315' visibility='default' filepath='include/linux/usb.h' line='1555' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='dev' type-id='type-id-5260' visibility='default' filepath='include/linux/usb.h' line='1556' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='ep' type-id='type-id-5246' visibility='default' filepath='include/linux/usb.h' line='1557' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='pipe' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='1558' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='stream_id' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='1559' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='status' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='1560' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='transfer_flags' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='1561' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='transfer_buffer' type-id='type-id-15' visibility='default' filepath='include/linux/usb.h' line='1562' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='transfer_dma' type-id='type-id-2081' visibility='default' filepath='include/linux/usb.h' line='1563' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='sg' type-id='type-id-918' visibility='default' filepath='include/linux/usb.h' line='1564' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='num_mapped_sgs' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='1565' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='num_sgs' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='1566' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='transfer_buffer_length' type-id='type-id-7' visibility='default' filepath='include/linux/usb.h' line='1567' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='actual_length' type-id='type-id-7' visibility='default' filepath='include/linux/usb.h' line='1568' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='setup_packet' type-id='type-id-256' visibility='default' filepath='include/linux/usb.h' line='1569' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='setup_dma' type-id='type-id-2081' visibility='default' filepath='include/linux/usb.h' line='1570' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='start_frame' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='1571' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='number_of_packets' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='1572' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='interval' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='1573' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='error_count' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='1575' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='context' type-id='type-id-15' visibility='default' filepath='include/linux/usb.h' line='1576' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='complete' type-id='type-id-5316' visibility='default' filepath='include/linux/usb.h' line='1577' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='iso_frame_desc' type-id='type-id-5306' visibility='default' filepath='include/linux/usb.h' line='1578' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_anchor' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='1342' column='1' id='type-id-5317'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='urb_list' type-id='type-id-20' visibility='default' filepath='include/linux/usb.h' line='1343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='wait' type-id='type-id-225' visibility='default' filepath='include/linux/usb.h' line='1344' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/usb.h' line='1345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='suspend_wakeups' type-id='type-id-26' visibility='default' filepath='include/linux/usb.h' line='1346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='poisoned' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='1347' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='usb_complete_t' type-id='type-id-5318' filepath='include/linux/usb.h' line='1358' column='1' id='type-id-5316'/>
+      <class-decl name='usb_iso_packet_descriptor' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/usb.h' line='1333' column='1' id='type-id-5305'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='offset' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='1334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='length' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='1335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='actual_length' type-id='type-id-5' visibility='default' filepath='include/linux/usb.h' line='1336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='status' type-id='type-id-17' visibility='default' filepath='include/linux/usb.h' line='1337' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hc_driver' size-in-bits='2880' is-struct='yes' visibility='default' filepath='include/linux/usb/hcd.h' line='246' column='1' id='type-id-5319'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='description' type-id='type-id-4' visibility='default' filepath='include/linux/usb/hcd.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='product_desc' type-id='type-id-4' visibility='default' filepath='include/linux/usb/hcd.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hcd_priv_size' type-id='type-id-84' visibility='default' filepath='include/linux/usb/hcd.h' line='249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='irq' type-id='type-id-5320' visibility='default' filepath='include/linux/usb/hcd.h' line='252' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/usb/hcd.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='reset' type-id='type-id-5321' visibility='default' filepath='include/linux/usb/hcd.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='start' type-id='type-id-5321' visibility='default' filepath='include/linux/usb/hcd.h' line='269' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='pci_suspend' type-id='type-id-5322' visibility='default' filepath='include/linux/usb/hcd.h' line='275' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pci_resume' type-id='type-id-5322' visibility='default' filepath='include/linux/usb/hcd.h' line='278' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='stop' type-id='type-id-5323' visibility='default' filepath='include/linux/usb/hcd.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='shutdown' type-id='type-id-5323' visibility='default' filepath='include/linux/usb/hcd.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='get_frame_number' type-id='type-id-5321' visibility='default' filepath='include/linux/usb/hcd.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='urb_enqueue' type-id='type-id-5324' visibility='default' filepath='include/linux/usb/hcd.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='urb_dequeue' type-id='type-id-5325' visibility='default' filepath='include/linux/usb/hcd.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='map_urb_for_dma' type-id='type-id-5324' visibility='default' filepath='include/linux/usb/hcd.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='unmap_urb_for_dma' type-id='type-id-5326' visibility='default' filepath='include/linux/usb/hcd.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='endpoint_disable' type-id='type-id-5327' visibility='default' filepath='include/linux/usb/hcd.h' line='309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='endpoint_reset' type-id='type-id-5327' visibility='default' filepath='include/linux/usb/hcd.h' line='314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='hub_status_data' type-id='type-id-5328' visibility='default' filepath='include/linux/usb/hcd.h' line='318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='hub_control' type-id='type-id-5329' visibility='default' filepath='include/linux/usb/hcd.h' line='319' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='bus_suspend' type-id='type-id-5321' visibility='default' filepath='include/linux/usb/hcd.h' line='322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='bus_resume' type-id='type-id-5321' visibility='default' filepath='include/linux/usb/hcd.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='start_port_reset' type-id='type-id-5330' visibility='default' filepath='include/linux/usb/hcd.h' line='324' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='get_resuming_ports' type-id='type-id-5331' visibility='default' filepath='include/linux/usb/hcd.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='relinquish_port' type-id='type-id-5332' visibility='default' filepath='include/linux/usb/hcd.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='port_handed_over' type-id='type-id-5333' visibility='default' filepath='include/linux/usb/hcd.h' line='330' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='clear_tt_buffer_complete' type-id='type-id-5327' visibility='default' filepath='include/linux/usb/hcd.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='alloc_dev' type-id='type-id-5334' visibility='default' filepath='include/linux/usb/hcd.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='free_dev' type-id='type-id-5335' visibility='default' filepath='include/linux/usb/hcd.h' line='340' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='alloc_streams' type-id='type-id-5336' visibility='default' filepath='include/linux/usb/hcd.h' line='342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='free_streams' type-id='type-id-5337' visibility='default' filepath='include/linux/usb/hcd.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='add_endpoint' type-id='type-id-5338' visibility='default' filepath='include/linux/usb/hcd.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='drop_endpoint' type-id='type-id-5338' visibility='default' filepath='include/linux/usb/hcd.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='check_bandwidth' type-id='type-id-5334' visibility='default' filepath='include/linux/usb/hcd.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='reset_bandwidth' type-id='type-id-5335' visibility='default' filepath='include/linux/usb/hcd.h' line='381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='address_device' type-id='type-id-5334' visibility='default' filepath='include/linux/usb/hcd.h' line='383' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='enable_device' type-id='type-id-5334' visibility='default' filepath='include/linux/usb/hcd.h' line='385' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='update_hub_device' type-id='type-id-5339' visibility='default' filepath='include/linux/usb/hcd.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='reset_device' type-id='type-id-5334' visibility='default' filepath='include/linux/usb/hcd.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='update_device' type-id='type-id-5334' visibility='default' filepath='include/linux/usb/hcd.h' line='395' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='set_usb2_hw_lpm' type-id='type-id-5340' visibility='default' filepath='include/linux/usb/hcd.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='enable_usb3_lpm_timeout' type-id='type-id-5341' visibility='default' filepath='include/linux/usb/hcd.h' line='399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='disable_usb3_lpm_timeout' type-id='type-id-5341' visibility='default' filepath='include/linux/usb/hcd.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='find_raw_port_number' type-id='type-id-5333' visibility='default' filepath='include/linux/usb/hcd.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='port_power' type-id='type-id-5342' visibility='default' filepath='include/linux/usb/hcd.h' line='408' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='usb3_link_state' filepath='include/uapi/linux/usb/ch9.h' line='1172' column='1' id='type-id-5343'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='USB3_LPM_U0' value='0'/>
+        <enumerator name='USB3_LPM_U1' value='1'/>
+        <enumerator name='USB3_LPM_U2' value='2'/>
+        <enumerator name='USB3_LPM_U3' value='3'/>
+      </enum-decl>
+      <class-decl name='usb_phy' size-in-bits='2688' is-struct='yes' visibility='default' filepath='include/linux/usb/phy.h' line='88' column='1' id='type-id-5344'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/usb/phy.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='label' type-id='type-id-4' visibility='default' filepath='include/linux/usb/phy.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/usb/phy.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='type' type-id='type-id-5345' visibility='default' filepath='include/linux/usb/phy.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='last_event' type-id='type-id-5346' visibility='default' filepath='include/linux/usb/phy.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='otg' type-id='type-id-5347' visibility='default' filepath='include/linux/usb/phy.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='io_dev' type-id='type-id-240' visibility='default' filepath='include/linux/usb/phy.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='io_ops' type-id='type-id-5348' visibility='default' filepath='include/linux/usb/phy.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='io_priv' type-id='type-id-15' visibility='default' filepath='include/linux/usb/phy.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='edev' type-id='type-id-5349' visibility='default' filepath='include/linux/usb/phy.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='id_edev' type-id='type-id-5349' visibility='default' filepath='include/linux/usb/phy.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='vbus_nb' type-id='type-id-3269' visibility='default' filepath='include/linux/usb/phy.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='id_nb' type-id='type-id-3269' visibility='default' filepath='include/linux/usb/phy.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='type_nb' type-id='type-id-3269' visibility='default' filepath='include/linux/usb/phy.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='chg_type' type-id='type-id-5350' visibility='default' filepath='include/linux/usb/phy.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1248'>
+          <var-decl name='chg_state' type-id='type-id-5351' visibility='default' filepath='include/linux/usb/phy.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='chg_cur' type-id='type-id-5352' visibility='default' filepath='include/linux/usb/phy.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='chg_work' type-id='type-id-255' visibility='default' filepath='include/linux/usb/phy.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='notifier' type-id='type-id-5353' visibility='default' filepath='include/linux/usb/phy.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='port_status' type-id='type-id-688' visibility='default' filepath='include/linux/usb/phy.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1936'>
+          <var-decl name='port_change' type-id='type-id-688' visibility='default' filepath='include/linux/usb/phy.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/linux/usb/phy.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='init' type-id='type-id-5354' visibility='default' filepath='include/linux/usb/phy.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='shutdown' type-id='type-id-5355' visibility='default' filepath='include/linux/usb/phy.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='set_vbus' type-id='type-id-5356' visibility='default' filepath='include/linux/usb/phy.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='set_power' type-id='type-id-5357' visibility='default' filepath='include/linux/usb/phy.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='set_suspend' type-id='type-id-5356' visibility='default' filepath='include/linux/usb/phy.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='set_wakeup' type-id='type-id-5358' visibility='default' filepath='include/linux/usb/phy.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='notify_connect' type-id='type-id-5359' visibility='default' filepath='include/linux/usb/phy.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='notify_disconnect' type-id='type-id-5359' visibility='default' filepath='include/linux/usb/phy.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='charger_detect' type-id='type-id-5360' visibility='default' filepath='include/linux/usb/phy.h' line='157' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='usb_phy_type' filepath='include/linux/usb/phy.h' line='36' column='1' id='type-id-5345'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='USB_PHY_TYPE_UNDEFINED' value='0'/>
+        <enumerator name='USB_PHY_TYPE_USB2' value='1'/>
+        <enumerator name='USB_PHY_TYPE_USB3' value='2'/>
+      </enum-decl>
+      <enum-decl name='usb_phy_events' filepath='include/linux/usb/phy.h' line='27' column='1' id='type-id-5346'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='USB_EVENT_NONE' value='0'/>
+        <enumerator name='USB_EVENT_VBUS' value='1'/>
+        <enumerator name='USB_EVENT_ID' value='2'/>
+        <enumerator name='USB_EVENT_CHARGER' value='3'/>
+        <enumerator name='USB_EVENT_ENUMERATED' value='4'/>
+      </enum-decl>
+      <class-decl name='usb_otg' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/usb/otg.h' line='16' column='1' id='type-id-5361'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='default_a' type-id='type-id-214' visibility='default' filepath='include/linux/usb/otg.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='phy' type-id='type-id-5362' visibility='default' filepath='include/linux/usb/otg.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='usb_phy' type-id='type-id-5310' visibility='default' filepath='include/linux/usb/otg.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='host' type-id='type-id-5261' visibility='default' filepath='include/linux/usb/otg.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='gadget' type-id='type-id-5363' visibility='default' filepath='include/linux/usb/otg.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='state' type-id='type-id-5364' visibility='default' filepath='include/linux/usb/otg.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='set_host' type-id='type-id-5365' visibility='default' filepath='include/linux/usb/otg.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='set_peripheral' type-id='type-id-5366' visibility='default' filepath='include/linux/usb/otg.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='set_vbus' type-id='type-id-5367' visibility='default' filepath='include/linux/usb/otg.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='start_srp' type-id='type-id-5368' visibility='default' filepath='include/linux/usb/otg.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='start_hnp' type-id='type-id-5368' visibility='default' filepath='include/linux/usb/otg.h' line='41' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='phy' size-in-bits='6784' is-struct='yes' visibility='default' filepath='include/linux/phy/phy.h' line='88' column='1' id='type-id-5369'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/phy/phy.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/phy/phy.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='ops' type-id='type-id-5370' visibility='default' filepath='include/linux/phy/phy.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/phy/phy.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='init_count' type-id='type-id-17' visibility='default' filepath='include/linux/phy/phy.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6624'>
+          <var-decl name='power_count' type-id='type-id-17' visibility='default' filepath='include/linux/phy/phy.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='attrs' type-id='type-id-5371' visibility='default' filepath='include/linux/phy/phy.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6720'>
+          <var-decl name='pwr' type-id='type-id-5372' visibility='default' filepath='include/linux/phy/phy.h' line='96' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='phy_ops' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/phy/phy.h' line='56' column='1' id='type-id-5373'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='init' type-id='type-id-5374' visibility='default' filepath='include/linux/phy/phy.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='exit' type-id='type-id-5374' visibility='default' filepath='include/linux/phy/phy.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='power_on' type-id='type-id-5374' visibility='default' filepath='include/linux/phy/phy.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='power_off' type-id='type-id-5374' visibility='default' filepath='include/linux/phy/phy.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='set_mode' type-id='type-id-5375' visibility='default' filepath='include/linux/phy/phy.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='reset' type-id='type-id-5374' visibility='default' filepath='include/linux/phy/phy.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='calibrate' type-id='type-id-5374' visibility='default' filepath='include/linux/phy/phy.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/phy/phy.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='phy_mode' filepath='include/linux/phy/phy.h' line='25' column='1' id='type-id-5376'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='PHY_MODE_INVALID' value='0'/>
+        <enumerator name='PHY_MODE_USB_HOST' value='1'/>
+        <enumerator name='PHY_MODE_USB_HOST_LS' value='2'/>
+        <enumerator name='PHY_MODE_USB_HOST_FS' value='3'/>
+        <enumerator name='PHY_MODE_USB_HOST_HS' value='4'/>
+        <enumerator name='PHY_MODE_USB_HOST_SS' value='5'/>
+        <enumerator name='PHY_MODE_USB_DEVICE' value='6'/>
+        <enumerator name='PHY_MODE_USB_DEVICE_LS' value='7'/>
+        <enumerator name='PHY_MODE_USB_DEVICE_FS' value='8'/>
+        <enumerator name='PHY_MODE_USB_DEVICE_HS' value='9'/>
+        <enumerator name='PHY_MODE_USB_DEVICE_SS' value='10'/>
+        <enumerator name='PHY_MODE_USB_OTG' value='11'/>
+        <enumerator name='PHY_MODE_SGMII' value='12'/>
+        <enumerator name='PHY_MODE_2500SGMII' value='13'/>
+        <enumerator name='PHY_MODE_10GKR' value='14'/>
+        <enumerator name='PHY_MODE_UFS_HS_A' value='15'/>
+        <enumerator name='PHY_MODE_UFS_HS_B' value='16'/>
+      </enum-decl>
+      <class-decl name='phy_attrs' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/phy/phy.h' line='71' column='1' id='type-id-5371'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bus_width' type-id='type-id-7' visibility='default' filepath='include/linux/phy/phy.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='mode' type-id='type-id-5376' visibility='default' filepath='include/linux/phy/phy.h' line='73' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='usb_otg_state' filepath='include/linux/usb/phy.h' line='43' column='1' id='type-id-5364'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='OTG_STATE_UNDEFINED' value='0'/>
+        <enumerator name='OTG_STATE_B_IDLE' value='1'/>
+        <enumerator name='OTG_STATE_B_SRP_INIT' value='2'/>
+        <enumerator name='OTG_STATE_B_PERIPHERAL' value='3'/>
+        <enumerator name='OTG_STATE_B_WAIT_ACON' value='4'/>
+        <enumerator name='OTG_STATE_B_HOST' value='5'/>
+        <enumerator name='OTG_STATE_A_IDLE' value='6'/>
+        <enumerator name='OTG_STATE_A_WAIT_VRISE' value='7'/>
+        <enumerator name='OTG_STATE_A_WAIT_BCON' value='8'/>
+        <enumerator name='OTG_STATE_A_HOST' value='9'/>
+        <enumerator name='OTG_STATE_A_SUSPEND' value='10'/>
+        <enumerator name='OTG_STATE_A_PERIPHERAL' value='11'/>
+        <enumerator name='OTG_STATE_A_WAIT_VFALL' value='12'/>
+        <enumerator name='OTG_STATE_A_VBUS_ERR' value='13'/>
+      </enum-decl>
+      <class-decl name='usb_phy_io_ops' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/usb/phy.h' line='72' column='1' id='type-id-5377'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='read' type-id='type-id-5378' visibility='default' filepath='include/linux/usb/phy.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='write' type-id='type-id-5379' visibility='default' filepath='include/linux/usb/phy.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='usb_charger_type' filepath='include/uapi/linux/usb/charger.h' line='16' column='1' id='type-id-5350'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='UNKNOWN_TYPE' value='0'/>
+        <enumerator name='SDP_TYPE' value='1'/>
+        <enumerator name='DCP_TYPE' value='2'/>
+        <enumerator name='CDP_TYPE' value='3'/>
+        <enumerator name='ACA_TYPE' value='4'/>
+      </enum-decl>
+      <enum-decl name='usb_charger_state' filepath='include/uapi/linux/usb/charger.h' line='25' column='1' id='type-id-5351'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='USB_CHARGER_DEFAULT' value='0'/>
+        <enumerator name='USB_CHARGER_PRESENT' value='1'/>
+        <enumerator name='USB_CHARGER_ABSENT' value='2'/>
+      </enum-decl>
+      <class-decl name='usb_charger_current' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/usb/phy.h' line='77' column='1' id='type-id-5352'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sdp_min' type-id='type-id-5' visibility='default' filepath='include/linux/usb/phy.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='sdp_max' type-id='type-id-5' visibility='default' filepath='include/linux/usb/phy.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dcp_min' type-id='type-id-5' visibility='default' filepath='include/linux/usb/phy.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='dcp_max' type-id='type-id-5' visibility='default' filepath='include/linux/usb/phy.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='cdp_min' type-id='type-id-5' visibility='default' filepath='include/linux/usb/phy.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='cdp_max' type-id='type-id-5' visibility='default' filepath='include/linux/usb/phy.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='aca_min' type-id='type-id-5' visibility='default' filepath='include/linux/usb/phy.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='aca_max' type-id='type-id-5' visibility='default' filepath='include/linux/usb/phy.h' line='85' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='atomic_notifier_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/notifier.h' line='60' column='1' id='type-id-5353'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/notifier.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='head' type-id='type-id-3271' visibility='default' filepath='include/linux/notifier.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='giveback_urb_bh' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/usb/hcd.h' line='67' column='1' id='type-id-5312'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='running' type-id='type-id-33' visibility='default' filepath='include/linux/usb/hcd.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/linux/usb/hcd.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='head' type-id='type-id-20' visibility='default' filepath='include/linux/usb/hcd.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='bh' type-id='type-id-3298' visibility='default' filepath='include/linux/usb/hcd.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='completing_ep' type-id='type-id-5246' visibility='default' filepath='include/linux/usb/hcd.h' line='72' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-5319' const='yes' id='type-id-5380'/>
+      <pointer-type-def type-id='type-id-5380' size-in-bits='64' id='type-id-5309'/>
+      <qualified-type-def type-id='type-id-5373' const='yes' id='type-id-5381'/>
+      <pointer-type-def type-id='type-id-5381' size-in-bits='64' id='type-id-5370'/>
+      <pointer-type-def type-id='type-id-5298' size-in-bits='64' id='type-id-5303'/>
+      <pointer-type-def type-id='type-id-5382' size-in-bits='64' id='type-id-5360'/>
+      <pointer-type-def type-id='type-id-5299' size-in-bits='64' id='type-id-5349'/>
+      <pointer-type-def type-id='type-id-5383' size-in-bits='64' id='type-id-5374'/>
+      <pointer-type-def type-id='type-id-5384' size-in-bits='64' id='type-id-5375'/>
+      <pointer-type-def type-id='type-id-5385' size-in-bits='64' id='type-id-5321'/>
+      <pointer-type-def type-id='type-id-5386' size-in-bits='64' id='type-id-5328'/>
+      <pointer-type-def type-id='type-id-5387' size-in-bits='64' id='type-id-5333'/>
+      <pointer-type-def type-id='type-id-5388' size-in-bits='64' id='type-id-5342'/>
+      <pointer-type-def type-id='type-id-5389' size-in-bits='64' id='type-id-5322'/>
+      <pointer-type-def type-id='type-id-5390' size-in-bits='64' id='type-id-5329'/>
+      <pointer-type-def type-id='type-id-5391' size-in-bits='64' id='type-id-5330'/>
+      <pointer-type-def type-id='type-id-5392' size-in-bits='64' id='type-id-5325'/>
+      <pointer-type-def type-id='type-id-5393' size-in-bits='64' id='type-id-5324'/>
+      <pointer-type-def type-id='type-id-5394' size-in-bits='64' id='type-id-5334'/>
+      <pointer-type-def type-id='type-id-5395' size-in-bits='64' id='type-id-5341'/>
+      <pointer-type-def type-id='type-id-5396' size-in-bits='64' id='type-id-5340'/>
+      <pointer-type-def type-id='type-id-5397' size-in-bits='64' id='type-id-5338'/>
+      <pointer-type-def type-id='type-id-5398' size-in-bits='64' id='type-id-5337'/>
+      <pointer-type-def type-id='type-id-5399' size-in-bits='64' id='type-id-5336'/>
+      <pointer-type-def type-id='type-id-5400' size-in-bits='64' id='type-id-5339'/>
+      <pointer-type-def type-id='type-id-5401' size-in-bits='64' id='type-id-5368'/>
+      <pointer-type-def type-id='type-id-5402' size-in-bits='64' id='type-id-5367'/>
+      <pointer-type-def type-id='type-id-5403' size-in-bits='64' id='type-id-5365'/>
+      <pointer-type-def type-id='type-id-5404' size-in-bits='64' id='type-id-5366'/>
+      <pointer-type-def type-id='type-id-5405' size-in-bits='64' id='type-id-5354'/>
+      <pointer-type-def type-id='type-id-5406' size-in-bits='64' id='type-id-5359'/>
+      <pointer-type-def type-id='type-id-5407' size-in-bits='64' id='type-id-5356'/>
+      <pointer-type-def type-id='type-id-5408' size-in-bits='64' id='type-id-5358'/>
+      <pointer-type-def type-id='type-id-5409' size-in-bits='64' id='type-id-5378'/>
+      <pointer-type-def type-id='type-id-5410' size-in-bits='64' id='type-id-5379'/>
+      <pointer-type-def type-id='type-id-5411' size-in-bits='64' id='type-id-5357'/>
+      <pointer-type-def type-id='type-id-5369' size-in-bits='64' id='type-id-5362'/>
+      <pointer-type-def type-id='type-id-5300' size-in-bits='64' id='type-id-5372'/>
+      <pointer-type-def type-id='type-id-5412' size-in-bits='64' id='type-id-5320'/>
+      <pointer-type-def type-id='type-id-5413' size-in-bits='64' id='type-id-5331'/>
+      <pointer-type-def type-id='type-id-5314' size-in-bits='64' id='type-id-5308'/>
+      <pointer-type-def type-id='type-id-5317' size-in-bits='64' id='type-id-5315'/>
+      <pointer-type-def type-id='type-id-5301' size-in-bits='64' id='type-id-5363'/>
+      <pointer-type-def type-id='type-id-5307' size-in-bits='64' id='type-id-5313'/>
+      <pointer-type-def type-id='type-id-5246' size-in-bits='64' id='type-id-5414'/>
+      <pointer-type-def type-id='type-id-5361' size-in-bits='64' id='type-id-5347'/>
+      <pointer-type-def type-id='type-id-5344' size-in-bits='64' id='type-id-5310'/>
+      <pointer-type-def type-id='type-id-5377' size-in-bits='64' id='type-id-5348'/>
+      <pointer-type-def type-id='type-id-5302' size-in-bits='64' id='type-id-5311'/>
+      <pointer-type-def type-id='type-id-5415' size-in-bits='64' id='type-id-5318'/>
+      <pointer-type-def type-id='type-id-5416' size-in-bits='64' id='type-id-5323'/>
+      <pointer-type-def type-id='type-id-5417' size-in-bits='64' id='type-id-5332'/>
+      <pointer-type-def type-id='type-id-5418' size-in-bits='64' id='type-id-5326'/>
+      <pointer-type-def type-id='type-id-5419' size-in-bits='64' id='type-id-5335'/>
+      <pointer-type-def type-id='type-id-5420' size-in-bits='64' id='type-id-5327'/>
+      <pointer-type-def type-id='type-id-5421' size-in-bits='64' id='type-id-5355'/>
+      <function-decl name='usb_hcd_poll_rh_status' mangled-name='usb_hcd_poll_rh_status' filepath='drivers/usb/core/hcd.c' line='749' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_hcd_poll_rh_status'>
+        <parameter type-id='type-id-5313' name='hcd' filepath='drivers/usb/core/hcd.c' line='749' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='usb_hcd_unlink_urb_from_ep' mangled-name='usb_hcd_unlink_urb_from_ep' filepath='drivers/usb/core/hcd.c' line='1332' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_hcd_unlink_urb_from_ep'>
+        <parameter type-id='type-id-5313' name='hcd' filepath='drivers/usb/core/hcd.c' line='1332' column='1'/>
+        <parameter type-id='type-id-5308' name='urb' filepath='drivers/usb/core/hcd.c' line='1332' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='usb_hcd_giveback_urb' mangled-name='usb_hcd_giveback_urb' filepath='drivers/usb/core/hcd.c' line='1826' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_hcd_giveback_urb'>
+        <parameter type-id='type-id-5313' name='hcd' filepath='drivers/usb/core/hcd.c' line='1826' column='1'/>
+        <parameter type-id='type-id-5308' name='urb' filepath='drivers/usb/core/hcd.c' line='1826' column='1'/>
+        <parameter type-id='type-id-17' name='status' filepath='drivers/usb/core/hcd.c' line='1826' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='usb_hcd_link_urb_to_ep' mangled-name='usb_hcd_link_urb_to_ep' filepath='drivers/usb/core/hcd.c' line='1241' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_hcd_link_urb_to_ep'>
+        <parameter type-id='type-id-5313' name='hcd' filepath='drivers/usb/core/hcd.c' line='1241' column='1'/>
+        <parameter type-id='type-id-5308' name='urb' filepath='drivers/usb/core/hcd.c' line='1241' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='usb_hcd_check_unlink_urb' mangled-name='usb_hcd_check_unlink_urb' filepath='drivers/usb/core/hcd.c' line='1299' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_hcd_check_unlink_urb'>
+        <parameter type-id='type-id-5313' name='hcd' filepath='drivers/usb/core/hcd.c' line='1299' column='1'/>
+        <parameter type-id='type-id-5308' name='urb' filepath='drivers/usb/core/hcd.c' line='1299' column='1'/>
+        <parameter type-id='type-id-17' name='status' filepath='drivers/usb/core/hcd.c' line='1300' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='usb_hcd_resume_root_hub' mangled-name='usb_hcd_resume_root_hub' filepath='drivers/usb/core/hcd.c' line='2377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_hcd_resume_root_hub'>
+        <parameter type-id='type-id-5313' name='hcd' filepath='drivers/usb/core/hcd.c' line='2377' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='usb_hcd_is_primary_hcd' mangled-name='usb_hcd_is_primary_hcd' filepath='drivers/usb/core/hcd.c' line='2666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_hcd_is_primary_hcd'>
+        <parameter type-id='type-id-5313' name='hcd' filepath='drivers/usb/core/hcd.c' line='2666' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='usb_create_shared_hcd' mangled-name='usb_create_shared_hcd' filepath='drivers/usb/core/hcd.c' line='2595' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_create_shared_hcd'>
+        <parameter type-id='type-id-5309' name='driver' filepath='drivers/usb/core/hcd.c' line='2595' column='1'/>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/usb/core/hcd.c' line='2596' column='1'/>
+        <parameter type-id='type-id-4' name='bus_name' filepath='drivers/usb/core/hcd.c' line='2596' column='1'/>
+        <parameter type-id='type-id-5313' name='primary_hcd' filepath='drivers/usb/core/hcd.c' line='2597' column='1'/>
+        <return type-id='type-id-5313'/>
+      </function-decl>
+      <function-decl name='usb_create_hcd' mangled-name='usb_create_hcd' filepath='drivers/usb/core/hcd.c' line='2617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_create_hcd'>
+        <parameter type-id='type-id-5309' name='driver' filepath='drivers/usb/core/hcd.c' line='2617' column='1'/>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/usb/core/hcd.c' line='2618' column='1'/>
+        <parameter type-id='type-id-4' name='bus_name' filepath='drivers/usb/core/hcd.c' line='2618' column='1'/>
+        <return type-id='type-id-5313'/>
+      </function-decl>
+      <function-decl name='usb_put_hcd' mangled-name='usb_put_hcd' filepath='drivers/usb/core/hcd.c' line='2659' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_put_hcd'>
+        <parameter type-id='type-id-5313' name='hcd' filepath='drivers/usb/core/hcd.c' line='2659' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='usb_add_hcd' mangled-name='usb_add_hcd' filepath='drivers/usb/core/hcd.c' line='2740' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_add_hcd'>
+        <parameter type-id='type-id-5313' name='hcd' filepath='drivers/usb/core/hcd.c' line='2740' column='1'/>
+        <parameter type-id='type-id-5' name='irqnum' filepath='drivers/usb/core/hcd.c' line='2741' column='1'/>
+        <parameter type-id='type-id-16' name='irqflags' filepath='drivers/usb/core/hcd.c' line='2741' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='usb_remove_hcd' mangled-name='usb_remove_hcd' filepath='drivers/usb/core/hcd.c' line='2947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_remove_hcd'>
+        <parameter type-id='type-id-5313' name='hcd' filepath='drivers/usb/core/hcd.c' line='2947' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5382'>
+        <parameter type-id='type-id-5310'/>
+        <return type-id='type-id-5350'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5383'>
+        <parameter type-id='type-id-5362'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5384'>
+        <parameter type-id='type-id-5362'/>
+        <parameter type-id='type-id-5376'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5385'>
+        <parameter type-id='type-id-5313'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5386'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5387'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5388'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5389'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5390'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-688'/>
+        <parameter type-id='type-id-688'/>
+        <parameter type-id='type-id-688'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5391'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5392'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5308'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5393'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5308'/>
+        <parameter type-id='type-id-485'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5394'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5260'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5395'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5260'/>
+        <parameter type-id='type-id-5343'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5396'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5260'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5397'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5260'/>
+        <parameter type-id='type-id-5246'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5398'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5260'/>
+        <parameter type-id='type-id-5414'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-485'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5399'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5260'/>
+        <parameter type-id='type-id-5414'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-485'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5400'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5260'/>
+        <parameter type-id='type-id-5259'/>
+        <parameter type-id='type-id-485'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5401'>
+        <parameter type-id='type-id-5347'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5402'>
+        <parameter type-id='type-id-5347'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5403'>
+        <parameter type-id='type-id-5347'/>
+        <parameter type-id='type-id-5261'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5404'>
+        <parameter type-id='type-id-5347'/>
+        <parameter type-id='type-id-5363'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5405'>
+        <parameter type-id='type-id-5310'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5406'>
+        <parameter type-id='type-id-5310'/>
+        <parameter type-id='type-id-5258'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5407'>
+        <parameter type-id='type-id-5310'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5408'>
+        <parameter type-id='type-id-5310'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5409'>
+        <parameter type-id='type-id-5310'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5410'>
+        <parameter type-id='type-id-5310'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5411'>
+        <parameter type-id='type-id-5310'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5412'>
+        <parameter type-id='type-id-5313'/>
+        <return type-id='type-id-3484'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5413'>
+        <parameter type-id='type-id-5313'/>
+        <return type-id='type-id-16'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5415'>
+        <parameter type-id='type-id-5308'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5416'>
+        <parameter type-id='type-id-5313' name='hcd'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5417'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5418'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5308'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5419'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5260'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5420'>
+        <parameter type-id='type-id-5313'/>
+        <parameter type-id='type-id-5246'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5421'>
+        <parameter type-id='type-id-5310'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/usb/gadget/udc/core.c' language='LANG_C89'>
+      <class-decl name='usb_otg_caps' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5422'/>
+      <class-decl name='usb_ep' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/usb/gadget.h' line='218' column='1' id='type-id-5423'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='driver_data' type-id='type-id-15' visibility='default' filepath='include/linux/usb/gadget.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/usb/gadget.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ops' type-id='type-id-5424' visibility='default' filepath='include/linux/usb/gadget.h' line='222' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ep_list' type-id='type-id-20' visibility='default' filepath='include/linux/usb/gadget.h' line='223' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='caps' type-id='type-id-5425' visibility='default' filepath='include/linux/usb/gadget.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='claimed' type-id='type-id-33' visibility='default' filepath='include/linux/usb/gadget.h' line='225' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='360'>
+          <var-decl name='enabled' type-id='type-id-33' visibility='default' filepath='include/linux/usb/gadget.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='maxpacket' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='maxpacket_limit' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='max_streams' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='mult' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='230' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='25'>
+          <var-decl name='maxburst' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='231' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='424'>
+          <var-decl name='address' type-id='type-id-214' visibility='default' filepath='include/linux/usb/gadget.h' line='232' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='desc' type-id='type-id-5426' visibility='default' filepath='include/linux/usb/gadget.h' line='233' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='comp_desc' type-id='type-id-5427' visibility='default' filepath='include/linux/usb/gadget.h' line='234' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_ep_ops' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/usb/gadget.h' line='128' column='1' id='type-id-5428'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='enable' type-id='type-id-5429' visibility='default' filepath='include/linux/usb/gadget.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='disable' type-id='type-id-5430' visibility='default' filepath='include/linux/usb/gadget.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dispose' type-id='type-id-5431' visibility='default' filepath='include/linux/usb/gadget.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='alloc_request' type-id='type-id-5432' visibility='default' filepath='include/linux/usb/gadget.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='free_request' type-id='type-id-5433' visibility='default' filepath='include/linux/usb/gadget.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='queue' type-id='type-id-5434' visibility='default' filepath='include/linux/usb/gadget.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dequeue' type-id='type-id-5435' visibility='default' filepath='include/linux/usb/gadget.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='set_halt' type-id='type-id-5436' visibility='default' filepath='include/linux/usb/gadget.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='set_wedge' type-id='type-id-5430' visibility='default' filepath='include/linux/usb/gadget.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='fifo_status' type-id='type-id-5430' visibility='default' filepath='include/linux/usb/gadget.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='fifo_flush' type-id='type-id-5431' visibility='default' filepath='include/linux/usb/gadget.h' line='146' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_request' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/usb/gadget.h' line='95' column='1' id='type-id-5437'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buf' type-id='type-id-15' visibility='default' filepath='include/linux/usb/gadget.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='length' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dma' type-id='type-id-2081' visibility='default' filepath='include/linux/usb/gadget.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sg' type-id='type-id-918' visibility='default' filepath='include/linux/usb/gadget.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='num_sgs' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='num_mapped_sgs' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='stream_id' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='15'>
+          <var-decl name='no_interrupt' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14'>
+          <var-decl name='zero' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13'>
+          <var-decl name='short_not_ok' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12'>
+          <var-decl name='dma_mapped' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='complete' type-id='type-id-5433' visibility='default' filepath='include/linux/usb/gadget.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='context' type-id='type-id-15' visibility='default' filepath='include/linux/usb/gadget.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/usb/gadget.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='status' type-id='type-id-17' visibility='default' filepath='include/linux/usb/gadget.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='actual' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='116' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_ep_caps' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/usb/gadget.h' line='158' column='1' id='type-id-5425'>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='type_control' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='type_iso' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='type_bulk' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='type_int' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27'>
+          <var-decl name='dir_in' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26'>
+          <var-decl name='dir_out' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='164' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_udc' size-in-bits='6528' is-struct='yes' visibility='default' filepath='drivers/usb/gadget/udc/core.c' line='36' column='1' id='type-id-5438'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='driver' type-id='type-id-5439' visibility='default' filepath='drivers/usb/gadget/udc/core.c' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='gadget' type-id='type-id-5363' visibility='default' filepath='drivers/usb/gadget/udc/core.c' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='drivers/usb/gadget/udc/core.c' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='drivers/usb/gadget/udc/core.c' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='vbus' type-id='type-id-33' visibility='default' filepath='drivers/usb/gadget/udc/core.c' line='41' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_gadget_driver' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/usb/gadget.h' line='664' column='1' id='type-id-5440'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='function' type-id='type-id-2' visibility='default' filepath='include/linux/usb/gadget.h' line='665' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='max_speed' type-id='type-id-5258' visibility='default' filepath='include/linux/usb/gadget.h' line='666' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bind' type-id='type-id-5441' visibility='default' filepath='include/linux/usb/gadget.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='unbind' type-id='type-id-5442' visibility='default' filepath='include/linux/usb/gadget.h' line='669' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='setup' type-id='type-id-5443' visibility='default' filepath='include/linux/usb/gadget.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='disconnect' type-id='type-id-5442' visibility='default' filepath='include/linux/usb/gadget.h' line='672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='suspend' type-id='type-id-5442' visibility='default' filepath='include/linux/usb/gadget.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='resume' type-id='type-id-5442' visibility='default' filepath='include/linux/usb/gadget.h' line='674' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='reset' type-id='type-id-5442' visibility='default' filepath='include/linux/usb/gadget.h' line='675' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='driver' type-id='type-id-2047' visibility='default' filepath='include/linux/usb/gadget.h' line='678' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='udc_name' type-id='type-id-2' visibility='default' filepath='include/linux/usb/gadget.h' line='680' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='pending' type-id='type-id-20' visibility='default' filepath='include/linux/usb/gadget.h' line='681' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='match_existing_only' type-id='type-id-5' visibility='default' filepath='include/linux/usb/gadget.h' line='682' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_ctrlrequest' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='213' column='1' id='type-id-5444'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bRequestType' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bRequest' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='215' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='wValue' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='wIndex' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='wLength' type-id='type-id-5123' visibility='default' filepath='include/uapi/linux/usb/ch9.h' line='218' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_gadget_ops' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/usb/gadget.h' line='300' column='1' id='type-id-5445'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='get_frame' type-id='type-id-5446' visibility='default' filepath='include/linux/usb/gadget.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wakeup' type-id='type-id-5446' visibility='default' filepath='include/linux/usb/gadget.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='set_selfpowered' type-id='type-id-5447' visibility='default' filepath='include/linux/usb/gadget.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='vbus_session' type-id='type-id-5447' visibility='default' filepath='include/linux/usb/gadget.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='vbus_draw' type-id='type-id-5448' visibility='default' filepath='include/linux/usb/gadget.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='pullup' type-id='type-id-5447' visibility='default' filepath='include/linux/usb/gadget.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ioctl' type-id='type-id-5449' visibility='default' filepath='include/linux/usb/gadget.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_config_params' type-id='type-id-5450' visibility='default' filepath='include/linux/usb/gadget.h' line='309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='udc_start' type-id='type-id-5441' visibility='default' filepath='include/linux/usb/gadget.h' line='310' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='udc_stop' type-id='type-id-5446' visibility='default' filepath='include/linux/usb/gadget.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='udc_set_speed' type-id='type-id-5451' visibility='default' filepath='include/linux/usb/gadget.h' line='313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='match_ep' type-id='type-id-5452' visibility='default' filepath='include/linux/usb/gadget.h' line='314' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='usb_dcd_config_params' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/usb/gadget.h' line='285' column='1' id='type-id-5453'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bU1devExitLat' type-id='type-id-893' visibility='default' filepath='include/linux/usb/gadget.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='bU2DevExitLat' type-id='type-id-5123' visibility='default' filepath='include/linux/usb/gadget.h' line='288' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-5444' const='yes' id='type-id-5454'/>
+      <pointer-type-def type-id='type-id-5454' size-in-bits='64' id='type-id-5455'/>
+      <qualified-type-def type-id='type-id-5273' const='yes' id='type-id-5456'/>
+      <pointer-type-def type-id='type-id-5456' size-in-bits='64' id='type-id-5426'/>
+      <qualified-type-def type-id='type-id-5428' const='yes' id='type-id-5457'/>
+      <pointer-type-def type-id='type-id-5457' size-in-bits='64' id='type-id-5424'/>
+      <qualified-type-def type-id='type-id-5445' const='yes' id='type-id-5458'/>
+      <pointer-type-def type-id='type-id-5458' size-in-bits='64' id='type-id-5459'/>
+      <qualified-type-def type-id='type-id-5274' const='yes' id='type-id-5460'/>
+      <pointer-type-def type-id='type-id-5460' size-in-bits='64' id='type-id-5427'/>
+      <pointer-type-def type-id='type-id-5461' size-in-bits='64' id='type-id-5430'/>
+      <pointer-type-def type-id='type-id-5462' size-in-bits='64' id='type-id-5429'/>
+      <pointer-type-def type-id='type-id-5463' size-in-bits='64' id='type-id-5436'/>
+      <pointer-type-def type-id='type-id-5464' size-in-bits='64' id='type-id-5435'/>
+      <pointer-type-def type-id='type-id-5465' size-in-bits='64' id='type-id-5434'/>
+      <pointer-type-def type-id='type-id-5466' size-in-bits='64' id='type-id-5446'/>
+      <pointer-type-def type-id='type-id-5467' size-in-bits='64' id='type-id-5443'/>
+      <pointer-type-def type-id='type-id-5468' size-in-bits='64' id='type-id-5447'/>
+      <pointer-type-def type-id='type-id-5469' size-in-bits='64' id='type-id-5448'/>
+      <pointer-type-def type-id='type-id-5470' size-in-bits='64' id='type-id-5449'/>
+      <pointer-type-def type-id='type-id-5471' size-in-bits='64' id='type-id-5441'/>
+      <pointer-type-def type-id='type-id-5453' size-in-bits='64' id='type-id-5472'/>
+      <pointer-type-def type-id='type-id-5273' size-in-bits='64' id='type-id-5473'/>
+      <pointer-type-def type-id='type-id-5423' size-in-bits='64' id='type-id-5474'/>
+      <pointer-type-def type-id='type-id-5475' size-in-bits='64' id='type-id-5452'/>
+      <pointer-type-def type-id='type-id-5440' size-in-bits='64' id='type-id-5439'/>
+      <pointer-type-def type-id='type-id-5422' size-in-bits='64' id='type-id-5476'/>
+      <pointer-type-def type-id='type-id-5437' size-in-bits='64' id='type-id-5477'/>
+      <pointer-type-def type-id='type-id-5478' size-in-bits='64' id='type-id-5432'/>
+      <pointer-type-def type-id='type-id-5274' size-in-bits='64' id='type-id-5479'/>
+      <pointer-type-def type-id='type-id-5438' size-in-bits='64' id='type-id-5480'/>
+      <pointer-type-def type-id='type-id-5481' size-in-bits='64' id='type-id-5450'/>
+      <pointer-type-def type-id='type-id-5482' size-in-bits='64' id='type-id-5431'/>
+      <pointer-type-def type-id='type-id-5483' size-in-bits='64' id='type-id-5433'/>
+      <pointer-type-def type-id='type-id-5484' size-in-bits='64' id='type-id-5442'/>
+      <pointer-type-def type-id='type-id-5485' size-in-bits='64' id='type-id-5451'/>
+      <function-decl name='usb_ep_set_maxpacket_limit' mangled-name='usb_ep_set_maxpacket_limit' filepath='drivers/usb/gadget/udc/core.c' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_ep_set_maxpacket_limit'>
+        <parameter type-id='type-id-5474' name='ep' filepath='drivers/usb/gadget/udc/core.c' line='62' column='1'/>
+        <parameter type-id='type-id-5' name='maxpacket_limit' filepath='drivers/usb/gadget/udc/core.c' line='63' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='usb_gadget_giveback_request' mangled-name='usb_gadget_giveback_request' filepath='drivers/usb/gadget/udc/core.c' line='894' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_gadget_giveback_request'>
+        <parameter type-id='type-id-5474' name='ep' filepath='drivers/usb/gadget/udc/core.c' line='894' column='1'/>
+        <parameter type-id='type-id-5477' name='req' filepath='drivers/usb/gadget/udc/core.c' line='895' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='usb_gadget_udc_reset' mangled-name='usb_gadget_udc_reset' filepath='drivers/usb/gadget/udc/core.c' line='1054' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_gadget_udc_reset'>
+        <parameter type-id='type-id-5363' name='gadget' filepath='drivers/usb/gadget/udc/core.c' line='1054' column='1'/>
+        <parameter type-id='type-id-5439' name='driver' filepath='drivers/usb/gadget/udc/core.c' line='1055' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='usb_add_gadget_udc' mangled-name='usb_add_gadget_udc' filepath='drivers/usb/gadget/udc/core.c' line='1281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_add_gadget_udc'>
+        <parameter type-id='type-id-240' name='parent' filepath='drivers/usb/gadget/udc/core.c' line='1281' column='1'/>
+        <parameter type-id='type-id-5363' name='gadget' filepath='drivers/usb/gadget/udc/core.c' line='1281' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='usb_del_gadget_udc' mangled-name='usb_del_gadget_udc' filepath='drivers/usb/gadget/udc/core.c' line='1311' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_del_gadget_udc'>
+        <parameter type-id='type-id-5363' name='gadget' filepath='drivers/usb/gadget/udc/core.c' line='1311' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5461'>
+        <parameter type-id='type-id-5474'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5462'>
+        <parameter type-id='type-id-5474'/>
+        <parameter type-id='type-id-5426'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5463'>
+        <parameter type-id='type-id-5474'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5464'>
+        <parameter type-id='type-id-5474'/>
+        <parameter type-id='type-id-5477'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5465'>
+        <parameter type-id='type-id-5474'/>
+        <parameter type-id='type-id-5477'/>
+        <parameter type-id='type-id-485'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5466'>
+        <parameter type-id='type-id-5363'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5467'>
+        <parameter type-id='type-id-5363'/>
+        <parameter type-id='type-id-5455'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5468'>
+        <parameter type-id='type-id-5363'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5469'>
+        <parameter type-id='type-id-5363'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5470'>
+        <parameter type-id='type-id-5363'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5471'>
+        <parameter type-id='type-id-5363'/>
+        <parameter type-id='type-id-5439'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5475'>
+        <parameter type-id='type-id-5363'/>
+        <parameter type-id='type-id-5473'/>
+        <parameter type-id='type-id-5479'/>
+        <return type-id='type-id-5474'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5478'>
+        <parameter type-id='type-id-5474'/>
+        <parameter type-id='type-id-485'/>
+        <return type-id='type-id-5477'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5481'>
+        <parameter type-id='type-id-5472'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5482'>
+        <parameter type-id='type-id-5474'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5483'>
+        <parameter type-id='type-id-5474'/>
+        <parameter type-id='type-id-5477'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5484'>
+        <parameter type-id='type-id-5363'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5485'>
+        <parameter type-id='type-id-5363'/>
+        <parameter type-id='type-id-5258'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/input/input.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-5486' size-in-bits='192' id='type-id-5487'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-83' size-in-bits='infinite' id='type-id-5488'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5489' size-in-bits='infinite' id='type-id-5490'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='448' id='type-id-5491'>
+        <subrange length='14' type-id='type-id-9' id='type-id-117'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3539' size-in-bits='768' id='type-id-5492'>
+        <subrange length='12' type-id='type-id-9' id='type-id-965'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3539' size-in-bits='64' id='type-id-5493'>
+        <subrange length='1' type-id='type-id-9' id='type-id-180'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3539' size-in-bits='128' id='type-id-5494'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <class-decl name='input_dev' size-in-bits='10944' is-struct='yes' visibility='default' filepath='include/linux/input.h' line='121' column='1' id='type-id-5495'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/input.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='phys' type-id='type-id-4' visibility='default' filepath='include/linux/input.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='uniq' type-id='type-id-4' visibility='default' filepath='include/linux/input.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='id' type-id='type-id-5496' visibility='default' filepath='include/linux/input.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='propbit' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='evbit' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='keybit' type-id='type-id-1195' visibility='default' filepath='include/linux/input.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='relbit' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='absbit' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='mscbit' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='ledbit' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='sndbit' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='ffbit' type-id='type-id-219' visibility='default' filepath='include/linux/input.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='swbit' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='hint_events_per_packet' type-id='type-id-5' visibility='default' filepath='include/linux/input.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1696'>
+          <var-decl name='keycodemax' type-id='type-id-5' visibility='default' filepath='include/linux/input.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='keycodesize' type-id='type-id-5' visibility='default' filepath='include/linux/input.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='keycode' type-id='type-id-15' visibility='default' filepath='include/linux/input.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='setkeycode' type-id='type-id-5497' visibility='default' filepath='include/linux/input.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='getkeycode' type-id='type-id-5498' visibility='default' filepath='include/linux/input.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='ff' type-id='type-id-5499' visibility='default' filepath='include/linux/input.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='repeat_key' type-id='type-id-5' visibility='default' filepath='include/linux/input.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='timer' type-id='type-id-417' visibility='default' filepath='include/linux/input.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='rep' type-id='type-id-465' visibility='default' filepath='include/linux/input.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='mt' type-id='type-id-5500' visibility='default' filepath='include/linux/input.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='absinfo' type-id='type-id-5501' visibility='default' filepath='include/linux/input.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='key' type-id='type-id-1195' visibility='default' filepath='include/linux/input.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='led' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='snd' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='sw' type-id='type-id-491' visibility='default' filepath='include/linux/input.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='open' type-id='type-id-5502' visibility='default' filepath='include/linux/input.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='close' type-id='type-id-5503' visibility='default' filepath='include/linux/input.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='flush' type-id='type-id-5504' visibility='default' filepath='include/linux/input.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='event' type-id='type-id-5505' visibility='default' filepath='include/linux/input.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='grab' type-id='type-id-5506' visibility='default' filepath='include/linux/input.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3904'>
+          <var-decl name='event_lock' type-id='type-id-247' visibility='default' filepath='include/linux/input.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/input.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='users' type-id='type-id-5' visibility='default' filepath='include/linux/input.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4256'>
+          <var-decl name='going_away' type-id='type-id-33' visibility='default' filepath='include/linux/input.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/input.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10496'>
+          <var-decl name='h_list' type-id='type-id-20' visibility='default' filepath='include/linux/input.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10624'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/linux/input.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10752'>
+          <var-decl name='num_vals' type-id='type-id-5' visibility='default' filepath='include/linux/input.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10784'>
+          <var-decl name='max_vals' type-id='type-id-5' visibility='default' filepath='include/linux/input.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10816'>
+          <var-decl name='vals' type-id='type-id-5507' visibility='default' filepath='include/linux/input.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10880'>
+          <var-decl name='devres_managed' type-id='type-id-33' visibility='default' filepath='include/linux/input.h' line='189' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='input_id' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='58' column='1' id='type-id-5496'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bustype' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='vendor' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='product' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='version' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='input_keymap_entry' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='113' column='1' id='type-id-5508'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/input.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='len' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/input.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='index' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='keycode' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/input.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='scancode' type-id='type-id-938' visibility='default' filepath='include/uapi/linux/input.h' line='119' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ff_device' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/input.h' line='510' column='1' id='type-id-5509'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='upload' type-id='type-id-5510' visibility='default' filepath='include/linux/input.h' line='511' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='erase' type-id='type-id-5511' visibility='default' filepath='include/linux/input.h' line='513' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='playback' type-id='type-id-5512' visibility='default' filepath='include/linux/input.h' line='515' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='set_gain' type-id='type-id-5513' visibility='default' filepath='include/linux/input.h' line='516' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='set_autocenter' type-id='type-id-5513' visibility='default' filepath='include/linux/input.h' line='517' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='destroy' type-id='type-id-5514' visibility='default' filepath='include/linux/input.h' line='519' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/input.h' line='521' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ffbit' type-id='type-id-219' visibility='default' filepath='include/linux/input.h' line='523' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mutex' type-id='type-id-245' visibility='default' filepath='include/linux/input.h' line='525' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='max_effects' type-id='type-id-17' visibility='default' filepath='include/linux/input.h' line='527' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='effects' type-id='type-id-5515' visibility='default' filepath='include/linux/input.h' line='528' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='effect_owners' type-id='type-id-5488' visibility='default' filepath='include/linux/input.h' line='529' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ff_effect' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='449' column='1' id='type-id-5516'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='450' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='id' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/input.h' line='451' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='direction' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='452' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='trigger' type-id='type-id-5517' visibility='default' filepath='include/uapi/linux/input.h' line='453' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='replay' type-id='type-id-5518' visibility='default' filepath='include/uapi/linux/input.h' line='454' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='u' type-id='type-id-5519' visibility='default' filepath='include/uapi/linux/input.h' line='462' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ff_trigger' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='315' column='1' id='type-id-5517'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='button' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='316' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='interval' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='317' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ff_replay' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='305' column='1' id='type-id-5518'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='length' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='delay' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='307' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/input.h' line='456' column='1' id='type-id-5519'>
+        <data-member access='private'>
+          <var-decl name='constant' type-id='type-id-5520' visibility='default' filepath='include/uapi/linux/input.h' line='457' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ramp' type-id='type-id-5521' visibility='default' filepath='include/uapi/linux/input.h' line='458' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='periodic' type-id='type-id-5522' visibility='default' filepath='include/uapi/linux/input.h' line='459' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='condition' type-id='type-id-5487' visibility='default' filepath='include/uapi/linux/input.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rumble' type-id='type-id-5523' visibility='default' filepath='include/uapi/linux/input.h' line='461' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='ff_constant_effect' size-in-bits='80' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='344' column='1' id='type-id-5520'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='level' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/input.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='envelope' type-id='type-id-5524' visibility='default' filepath='include/uapi/linux/input.h' line='346' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ff_envelope' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='332' column='1' id='type-id-5524'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='attack_length' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='attack_level' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='fade_length' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='fade_level' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='336' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ff_ramp_effect' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='355' column='1' id='type-id-5521'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start_level' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/input.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='end_level' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/input.h' line='357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='envelope' type-id='type-id-5524' visibility='default' filepath='include/uapi/linux/input.h' line='358' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ff_periodic_effect' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='400' column='1' id='type-id-5522'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='waveform' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='period' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='magnitude' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/input.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='offset' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/input.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='phase' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='envelope' type-id='type-id-5524' visibility='default' filepath='include/uapi/linux/input.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='custom_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/input.h' line='409' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='custom_data' type-id='type-id-5525' visibility='default' filepath='include/uapi/linux/input.h' line='410' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ff_condition_effect' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='371' column='1' id='type-id-5486'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='right_saturation' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='372' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='left_saturation' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='right_coeff' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/input.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='left_coeff' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/input.h' line='376' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='deadband' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='378' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='center' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/input.h' line='379' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ff_rumble_effect' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='421' column='1' id='type-id-5523'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='strong_magnitude' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='weak_magnitude' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/input.h' line='423' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='input_mt' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/input/mt.h' line='46' column='1' id='type-id-5526'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='trkid' type-id='type-id-17' visibility='default' filepath='include/linux/input/mt.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='num_slots' type-id='type-id-17' visibility='default' filepath='include/linux/input/mt.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='slot' type-id='type-id-17' visibility='default' filepath='include/linux/input/mt.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/input/mt.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='frame' type-id='type-id-5' visibility='default' filepath='include/linux/input/mt.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='red' type-id='type-id-666' visibility='default' filepath='include/linux/input/mt.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='slots' type-id='type-id-5490' visibility='default' filepath='include/linux/input/mt.h' line='53' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='input_mt_slot' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/input/mt.h' line='30' column='1' id='type-id-5489'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='abs' type-id='type-id-5491' visibility='default' filepath='include/linux/input/mt.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='frame' type-id='type-id-5' visibility='default' filepath='include/linux/input/mt.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='key' type-id='type-id-5' visibility='default' filepath='include/linux/input/mt.h' line='33' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='input_absinfo' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/input.h' line='89' column='1' id='type-id-5527'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='value' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/input.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='minimum' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/input.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='maximum' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/input.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='fuzz' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/input.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flat' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/input.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='resolution' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/input.h' line='95' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='input_handle' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/input.h' line='323' column='1' id='type-id-5528'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/input.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='open' type-id='type-id-17' visibility='default' filepath='include/linux/input.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/input.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dev' type-id='type-id-5529' visibility='default' filepath='include/linux/input.h' line='330' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='handler' type-id='type-id-5530' visibility='default' filepath='include/linux/input.h' line='331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='d_node' type-id='type-id-20' visibility='default' filepath='include/linux/input.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='h_node' type-id='type-id-20' visibility='default' filepath='include/linux/input.h' line='334' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='input_handler' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/input.h' line='288' column='1' id='type-id-5531'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='private' type-id='type-id-15' visibility='default' filepath='include/linux/input.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='event' type-id='type-id-5532' visibility='default' filepath='include/linux/input.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='events' type-id='type-id-5533' visibility='default' filepath='include/linux/input.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='filter' type-id='type-id-5534' visibility='default' filepath='include/linux/input.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='match' type-id='type-id-5535' visibility='default' filepath='include/linux/input.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='connect' type-id='type-id-5536' visibility='default' filepath='include/linux/input.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='disconnect' type-id='type-id-5537' visibility='default' filepath='include/linux/input.h' line='298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='start' type-id='type-id-5537' visibility='default' filepath='include/linux/input.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='legacy_minors' type-id='type-id-33' visibility='default' filepath='include/linux/input.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='minor' type-id='type-id-17' visibility='default' filepath='include/linux/input.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/input.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='id_table' type-id='type-id-5538' visibility='default' filepath='include/linux/input.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='h_list' type-id='type-id-20' visibility='default' filepath='include/linux/input.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/linux/input.h' line='308' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='input_value' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/input.h' line='33' column='1' id='type-id-5539'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-108' visibility='default' filepath='include/linux/input.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='code' type-id='type-id-108' visibility='default' filepath='include/linux/input.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='value' type-id='type-id-653' visibility='default' filepath='include/linux/input.h' line='36' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='input_device_id' size-in-bits='1600' is-struct='yes' visibility='default' filepath='include/linux/mod_devicetable.h' line='321' column='1' id='type-id-5540'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-3539' visibility='default' filepath='include/linux/mod_devicetable.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bustype' type-id='type-id-108' visibility='default' filepath='include/linux/mod_devicetable.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='vendor' type-id='type-id-108' visibility='default' filepath='include/linux/mod_devicetable.h' line='326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='product' type-id='type-id-108' visibility='default' filepath='include/linux/mod_devicetable.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='version' type-id='type-id-108' visibility='default' filepath='include/linux/mod_devicetable.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='evbit' type-id='type-id-5493' visibility='default' filepath='include/linux/mod_devicetable.h' line='330' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='keybit' type-id='type-id-5492' visibility='default' filepath='include/linux/mod_devicetable.h' line='331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='relbit' type-id='type-id-5493' visibility='default' filepath='include/linux/mod_devicetable.h' line='332' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='absbit' type-id='type-id-5493' visibility='default' filepath='include/linux/mod_devicetable.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='mscbit' type-id='type-id-5493' visibility='default' filepath='include/linux/mod_devicetable.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='ledbit' type-id='type-id-5493' visibility='default' filepath='include/linux/mod_devicetable.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='sndbit' type-id='type-id-5493' visibility='default' filepath='include/linux/mod_devicetable.h' line='336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='ffbit' type-id='type-id-5494' visibility='default' filepath='include/linux/mod_devicetable.h' line='337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='swbit' type-id='type-id-5493' visibility='default' filepath='include/linux/mod_devicetable.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='propbit' type-id='type-id-5493' visibility='default' filepath='include/linux/mod_devicetable.h' line='339' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='driver_info' type-id='type-id-3539' visibility='default' filepath='include/linux/mod_devicetable.h' line='341' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-2202' size-in-bits='64' id='type-id-5525'/>
+      <qualified-type-def type-id='type-id-5540' const='yes' id='type-id-5541'/>
+      <pointer-type-def type-id='type-id-5541' size-in-bits='64' id='type-id-5538'/>
+      <qualified-type-def type-id='type-id-5508' const='yes' id='type-id-5542'/>
+      <pointer-type-def type-id='type-id-5542' size-in-bits='64' id='type-id-5543'/>
+      <qualified-type-def type-id='type-id-5539' const='yes' id='type-id-5544'/>
+      <pointer-type-def type-id='type-id-5544' size-in-bits='64' id='type-id-5545'/>
+      <pointer-type-def type-id='type-id-5509' size-in-bits='64' id='type-id-5499'/>
+      <pointer-type-def type-id='type-id-5516' size-in-bits='64' id='type-id-5515'/>
+      <pointer-type-def type-id='type-id-5527' size-in-bits='64' id='type-id-5501'/>
+      <pointer-type-def type-id='type-id-5495' size-in-bits='64' id='type-id-5529'/>
+      <pointer-type-def type-id='type-id-5528' size-in-bits='64' id='type-id-5506'/>
+      <pointer-type-def type-id='type-id-5531' size-in-bits='64' id='type-id-5530'/>
+      <pointer-type-def type-id='type-id-5508' size-in-bits='64' id='type-id-5546'/>
+      <pointer-type-def type-id='type-id-5526' size-in-bits='64' id='type-id-5500'/>
+      <pointer-type-def type-id='type-id-5539' size-in-bits='64' id='type-id-5507'/>
+      <pointer-type-def type-id='type-id-5547' size-in-bits='64' id='type-id-5502'/>
+      <pointer-type-def type-id='type-id-5548' size-in-bits='64' id='type-id-5497'/>
+      <pointer-type-def type-id='type-id-5549' size-in-bits='64' id='type-id-5510'/>
+      <pointer-type-def type-id='type-id-5550' size-in-bits='64' id='type-id-5504'/>
+      <pointer-type-def type-id='type-id-5551' size-in-bits='64' id='type-id-5498'/>
+      <pointer-type-def type-id='type-id-5552' size-in-bits='64' id='type-id-5511'/>
+      <pointer-type-def type-id='type-id-5553' size-in-bits='64' id='type-id-5512'/>
+      <pointer-type-def type-id='type-id-5554' size-in-bits='64' id='type-id-5505'/>
+      <pointer-type-def type-id='type-id-5555' size-in-bits='64' id='type-id-5536'/>
+      <pointer-type-def type-id='type-id-5556' size-in-bits='64' id='type-id-5534'/>
+      <pointer-type-def type-id='type-id-5557' size-in-bits='64' id='type-id-5535'/>
+      <pointer-type-def type-id='type-id-5558' size-in-bits='64' id='type-id-5514'/>
+      <pointer-type-def type-id='type-id-5559' size-in-bits='64' id='type-id-5503'/>
+      <pointer-type-def type-id='type-id-5560' size-in-bits='64' id='type-id-5513'/>
+      <pointer-type-def type-id='type-id-5561' size-in-bits='64' id='type-id-5537'/>
+      <pointer-type-def type-id='type-id-5562' size-in-bits='64' id='type-id-5533'/>
+      <pointer-type-def type-id='type-id-5563' size-in-bits='64' id='type-id-5532'/>
+      <function-decl name='input_allocate_device' mangled-name='input_allocate_device' filepath='drivers/input/input.c' line='1783' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='input_allocate_device'>
+        <return type-id='type-id-5529'/>
+      </function-decl>
+      <function-decl name='input_event' mangled-name='input_event' filepath='drivers/input/input.c' line='428' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='input_event'>
+        <parameter type-id='type-id-5529' name='dev' filepath='drivers/input/input.c' line='428' column='1'/>
+        <parameter type-id='type-id-5' name='type' filepath='drivers/input/input.c' line='429' column='1'/>
+        <parameter type-id='type-id-5' name='code' filepath='drivers/input/input.c' line='429' column='1'/>
+        <parameter type-id='type-id-17' name='value' filepath='drivers/input/input.c' line='429' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='input_alloc_absinfo' mangled-name='input_alloc_absinfo' filepath='drivers/input/input.c' line='481' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='input_alloc_absinfo'>
+        <parameter type-id='type-id-5529' name='dev' filepath='drivers/input/input.c' line='481' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='input_set_abs_params' mangled-name='input_set_abs_params' filepath='drivers/input/input.c' line='499' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='input_set_abs_params'>
+        <parameter type-id='type-id-5529' name='dev' filepath='drivers/input/input.c' line='499' column='1'/>
+        <parameter type-id='type-id-5' name='axis' filepath='drivers/input/input.c' line='499' column='1'/>
+        <parameter type-id='type-id-17' name='min' filepath='drivers/input/input.c' line='500' column='1'/>
+        <parameter type-id='type-id-17' name='max' filepath='drivers/input/input.c' line='500' column='1'/>
+        <parameter type-id='type-id-17' name='fuzz' filepath='drivers/input/input.c' line='500' column='1'/>
+        <parameter type-id='type-id-17' name='flat' filepath='drivers/input/input.c' line='500' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='input_free_device' mangled-name='input_free_device' filepath='drivers/input/input.c' line='1888' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='input_free_device'>
+        <parameter type-id='type-id-5529' name='dev' filepath='drivers/input/input.c' line='1888' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='input_register_device' mangled-name='input_register_device' filepath='drivers/input/input.c' line='2086' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='input_register_device'>
+        <parameter type-id='type-id-5529' name='dev' filepath='drivers/input/input.c' line='2086' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='input_unregister_device' mangled-name='input_unregister_device' filepath='drivers/input/input.c' line='2190' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='input_unregister_device'>
+        <parameter type-id='type-id-5529' name='dev' filepath='drivers/input/input.c' line='2190' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5547'>
+        <parameter type-id='type-id-5529'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5548'>
+        <parameter type-id='type-id-5529'/>
+        <parameter type-id='type-id-5543'/>
+        <parameter type-id='type-id-482'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5549'>
+        <parameter type-id='type-id-5529'/>
+        <parameter type-id='type-id-5515'/>
+        <parameter type-id='type-id-5515'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5550'>
+        <parameter type-id='type-id-5529'/>
+        <parameter type-id='type-id-83'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5551'>
+        <parameter type-id='type-id-5529'/>
+        <parameter type-id='type-id-5546'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5552'>
+        <parameter type-id='type-id-5529'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5553'>
+        <parameter type-id='type-id-5529'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5554'>
+        <parameter type-id='type-id-5529'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5555'>
+        <parameter type-id='type-id-5530'/>
+        <parameter type-id='type-id-5529'/>
+        <parameter type-id='type-id-5538'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5556'>
+        <parameter type-id='type-id-5506'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5557'>
+        <parameter type-id='type-id-5530'/>
+        <parameter type-id='type-id-5529'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5558'>
+        <parameter type-id='type-id-5499'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5559'>
+        <parameter type-id='type-id-5529'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5560'>
+        <parameter type-id='type-id-5529'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5561'>
+        <parameter type-id='type-id-5506'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5562'>
+        <parameter type-id='type-id-5506'/>
+        <parameter type-id='type-id-5545'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5563'>
+        <parameter type-id='type-id-5506'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/input/input-mt.c' language='LANG_C89'>
+      <function-decl name='input_mt_init_slots' mangled-name='input_mt_init_slots' filepath='drivers/input/input-mt.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='input_mt_init_slots'>
+        <parameter type-id='type-id-5529' name='dev' filepath='drivers/input/input-mt.c' line='41' column='1'/>
+        <parameter type-id='type-id-5' name='num_slots' filepath='drivers/input/input-mt.c' line='41' column='1'/>
+        <parameter type-id='type-id-5' name='flags' filepath='drivers/input/input-mt.c' line='42' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/rtc/rtc-lib.c' language='LANG_C89'>
+      <class-decl name='rtc_time' size-in-bits='288' is-struct='yes' visibility='default' filepath='include/uapi/linux/rtc.h' line='21' column='1' id='type-id-5564'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tm_sec' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/rtc.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='tm_min' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/rtc.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tm_hour' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/rtc.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='tm_mday' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/rtc.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tm_mon' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/rtc.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='tm_year' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/rtc.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tm_wday' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/rtc.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='tm_yday' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/rtc.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='tm_isdst' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/rtc.h' line='30' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-5564' size-in-bits='64' id='type-id-5565'/>
+      <function-decl name='rtc_time64_to_tm' mangled-name='rtc_time64_to_tm' filepath='drivers/rtc/rtc-lib.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtc_time64_to_tm'>
+        <parameter type-id='type-id-1339' name='time' filepath='drivers/rtc/rtc-lib.c' line='53' column='1'/>
+        <parameter type-id='type-id-5565' name='tm' filepath='drivers/rtc/rtc-lib.c' line='53' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='rtc_tm_to_time64' mangled-name='rtc_tm_to_time64' filepath='drivers/rtc/rtc-lib.c' line='117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtc_tm_to_time64'>
+        <parameter type-id='type-id-5565' name='tm' filepath='drivers/rtc/rtc-lib.c' line='117' column='1'/>
+        <return type-id='type-id-1339'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/rtc/class.c' language='LANG_C89'>
+      <class-decl name='nvmem_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5566'/>
+      <class-decl name='rtc_device' size-in-bits='10688' is-struct='yes' visibility='default' filepath='include/linux/rtc.h' line='102' column='1' id='type-id-5567'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/linux/rtc.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/rtc.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='id' type-id='type-id-17' visibility='default' filepath='include/linux/rtc.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='ops' type-id='type-id-5568' visibility='default' filepath='include/linux/rtc.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='ops_lock' type-id='type-id-245' visibility='default' filepath='include/linux/rtc.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='char_dev' type-id='type-id-266' visibility='default' filepath='include/linux/rtc.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7488'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/rtc.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7552'>
+          <var-decl name='irq_data' type-id='type-id-16' visibility='default' filepath='include/linux/rtc.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7616'>
+          <var-decl name='irq_lock' type-id='type-id-247' visibility='default' filepath='include/linux/rtc.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7680'>
+          <var-decl name='irq_queue' type-id='type-id-225' visibility='default' filepath='include/linux/rtc.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7872'>
+          <var-decl name='async_queue' type-id='type-id-254' visibility='default' filepath='include/linux/rtc.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7936'>
+          <var-decl name='irq_freq' type-id='type-id-17' visibility='default' filepath='include/linux/rtc.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7968'>
+          <var-decl name='max_user_freq' type-id='type-id-17' visibility='default' filepath='include/linux/rtc.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8000'>
+          <var-decl name='timerqueue' type-id='type-id-1557' visibility='default' filepath='include/linux/rtc.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8128'>
+          <var-decl name='aie_timer' type-id='type-id-5569' visibility='default' filepath='include/linux/rtc.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8640'>
+          <var-decl name='uie_rtctimer' type-id='type-id-5569' visibility='default' filepath='include/linux/rtc.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9152'>
+          <var-decl name='pie_timer' type-id='type-id-681' visibility='default' filepath='include/linux/rtc.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9664'>
+          <var-decl name='pie_enabled' type-id='type-id-17' visibility='default' filepath='include/linux/rtc.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9728'>
+          <var-decl name='irqwork' type-id='type-id-255' visibility='default' filepath='include/linux/rtc.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9984'>
+          <var-decl name='uie_unsupported' type-id='type-id-17' visibility='default' filepath='include/linux/rtc.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10048'>
+          <var-decl name='set_offset_nsec' type-id='type-id-192' visibility='default' filepath='include/linux/rtc.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10112'>
+          <var-decl name='registered' type-id='type-id-33' visibility='default' filepath='include/linux/rtc.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10176'>
+          <var-decl name='nvmem' type-id='type-id-5570' visibility='default' filepath='include/linux/rtc.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10240'>
+          <var-decl name='nvram_old_abi' type-id='type-id-33' visibility='default' filepath='include/linux/rtc.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10304'>
+          <var-decl name='nvram' type-id='type-id-2609' visibility='default' filepath='include/linux/rtc.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10368'>
+          <var-decl name='range_min' type-id='type-id-1339' visibility='default' filepath='include/linux/rtc.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10432'>
+          <var-decl name='range_max' type-id='type-id-5571' visibility='default' filepath='include/linux/rtc.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10496'>
+          <var-decl name='start_secs' type-id='type-id-1339' visibility='default' filepath='include/linux/rtc.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10560'>
+          <var-decl name='offset_secs' type-id='type-id-1339' visibility='default' filepath='include/linux/rtc.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='10624'>
+          <var-decl name='set_start_time' type-id='type-id-33' visibility='default' filepath='include/linux/rtc.h' line='150' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rtc_class_ops' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/linux/rtc.h' line='75' column='1' id='type-id-5572'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ioctl' type-id='type-id-5573' visibility='default' filepath='include/linux/rtc.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='read_time' type-id='type-id-5574' visibility='default' filepath='include/linux/rtc.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='set_time' type-id='type-id-5574' visibility='default' filepath='include/linux/rtc.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='read_alarm' type-id='type-id-5575' visibility='default' filepath='include/linux/rtc.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='set_alarm' type-id='type-id-5575' visibility='default' filepath='include/linux/rtc.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='proc' type-id='type-id-5576' visibility='default' filepath='include/linux/rtc.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='set_mmss64' type-id='type-id-5577' visibility='default' filepath='include/linux/rtc.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='set_mmss' type-id='type-id-5578' visibility='default' filepath='include/linux/rtc.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='read_callback' type-id='type-id-5579' visibility='default' filepath='include/linux/rtc.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='alarm_irq_enable' type-id='type-id-5580' visibility='default' filepath='include/linux/rtc.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='read_offset' type-id='type-id-5581' visibility='default' filepath='include/linux/rtc.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='set_offset' type-id='type-id-5582' visibility='default' filepath='include/linux/rtc.h' line='87' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rtc_wkalrm' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/uapi/linux/rtc.h' line='37' column='1' id='type-id-5583'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='enabled' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/rtc.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='pending' type-id='type-id-216' visibility='default' filepath='include/uapi/linux/rtc.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='time' type-id='type-id-5564' visibility='default' filepath='include/uapi/linux/rtc.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rtc_timer' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/rtc.h' line='90' column='1' id='type-id-5569'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='node' type-id='type-id-1550' visibility='default' filepath='include/linux/rtc.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='period' type-id='type-id-682' visibility='default' filepath='include/linux/rtc.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='func' type-id='type-id-517' visibility='default' filepath='include/linux/rtc.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='private_data' type-id='type-id-15' visibility='default' filepath='include/linux/rtc.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='enabled' type-id='type-id-17' visibility='default' filepath='include/linux/rtc.h' line='95' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='timeu64_t' type-id='type-id-100' filepath='include/linux/time64.h' line='8' column='1' id='type-id-5571'/>
+      <qualified-type-def type-id='type-id-5572' const='yes' id='type-id-5584'/>
+      <pointer-type-def type-id='type-id-5584' size-in-bits='64' id='type-id-5568'/>
+      <pointer-type-def type-id='type-id-5585' size-in-bits='64' id='type-id-5579'/>
+      <pointer-type-def type-id='type-id-5586' size-in-bits='64' id='type-id-5582'/>
+      <pointer-type-def type-id='type-id-5587' size-in-bits='64' id='type-id-5581'/>
+      <pointer-type-def type-id='type-id-5588' size-in-bits='64' id='type-id-5574'/>
+      <pointer-type-def type-id='type-id-5589' size-in-bits='64' id='type-id-5575'/>
+      <pointer-type-def type-id='type-id-5590' size-in-bits='64' id='type-id-5576'/>
+      <pointer-type-def type-id='type-id-5591' size-in-bits='64' id='type-id-5577'/>
+      <pointer-type-def type-id='type-id-5592' size-in-bits='64' id='type-id-5580'/>
+      <pointer-type-def type-id='type-id-5593' size-in-bits='64' id='type-id-5573'/>
+      <pointer-type-def type-id='type-id-5594' size-in-bits='64' id='type-id-5578'/>
+      <pointer-type-def type-id='type-id-192' size-in-bits='64' id='type-id-5595'/>
+      <pointer-type-def type-id='type-id-5566' size-in-bits='64' id='type-id-5570'/>
+      <pointer-type-def type-id='type-id-5567' size-in-bits='64' id='type-id-5596'/>
+      <pointer-type-def type-id='type-id-5583' size-in-bits='64' id='type-id-5597'/>
+      <function-decl name='devm_rtc_allocate_device' mangled-name='devm_rtc_allocate_device' filepath='drivers/rtc/class.c' line='460' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_rtc_allocate_device'>
+        <parameter type-id='type-id-240' name='dev' filepath='drivers/rtc/class.c' line='460' column='1'/>
+        <return type-id='type-id-5596'/>
+      </function-decl>
+      <function-decl name='__rtc_register_device' mangled-name='__rtc_register_device' filepath='drivers/rtc/class.c' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__rtc_register_device'>
+        <parameter type-id='type-id-260' name='owner' filepath='drivers/rtc/class.c' line='498' column='1'/>
+        <parameter type-id='type-id-5596' name='rtc' filepath='drivers/rtc/class.c' line='498' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5585'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5586'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-192'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5587'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-5595'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5588'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-5565'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5589'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-5597'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5590'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-88'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5591'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-1339'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5592'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5593'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5594'>
+        <parameter type-id='type-id-240'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/rtc/interface.c' language='LANG_C89'>
+      <union-decl name='__anonymous_union__1' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/linux/fs.h' line='624' column='1' id='type-id-5598'>
+        <data-member access='private'>
+          <var-decl name='i_nlink' type-id='type-id-2729' visibility='default' filepath='include/linux/fs.h' line='625' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='__i_nlink' type-id='type-id-5' visibility='default' filepath='include/linux/fs.h' line='626' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/uio.h' line='35' column='1' id='type-id-5599'>
+        <data-member access='private'>
+          <var-decl name='iov' type-id='type-id-2115' visibility='default' filepath='include/linux/uio.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='kvec' type-id='type-id-2116' visibility='default' filepath='include/linux/uio.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='bvec' type-id='type-id-2117' visibility='default' filepath='include/linux/uio.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='pipe' type-id='type-id-3454' visibility='default' filepath='include/linux/uio.h' line='39' column='1'/>
+        </data-member>
+      </union-decl>
+      <function-decl name='rtc_update_irq' mangled-name='rtc_update_irq' filepath='drivers/rtc/interface.c' line='688' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtc_update_irq'>
+        <parameter type-id='type-id-5596' name='rtc' filepath='drivers/rtc/interface.c' line='688' column='1'/>
+        <parameter type-id='type-id-16' name='num' filepath='drivers/rtc/interface.c' line='689' column='1'/>
+        <parameter type-id='type-id-16' name='events' filepath='drivers/rtc/interface.c' line='689' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/cpufreq/cpufreq.c' language='LANG_C89'>
+      <class-decl name='cpufreq_stats' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5600'/>
+      <class-decl name='cpufreq_driver' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/linux/cpufreq.h' line='266' column='1' id='type-id-5601'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-43' visibility='default' filepath='include/linux/cpufreq.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/linux/cpufreq.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='driver_data' type-id='type-id-15' visibility='default' filepath='include/linux/cpufreq.h' line='269' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='init' type-id='type-id-5602' visibility='default' filepath='include/linux/cpufreq.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='verify' type-id='type-id-5602' visibility='default' filepath='include/linux/cpufreq.h' line='273' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='setpolicy' type-id='type-id-5602' visibility='default' filepath='include/linux/cpufreq.h' line='276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='target' type-id='type-id-5603' visibility='default' filepath='include/linux/cpufreq.h' line='282' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='target_index' type-id='type-id-5604' visibility='default' filepath='include/linux/cpufreq.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='fast_switch' type-id='type-id-5605' visibility='default' filepath='include/linux/cpufreq.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='resolve_freq' type-id='type-id-5605' visibility='default' filepath='include/linux/cpufreq.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='get_intermediate' type-id='type-id-5605' visibility='default' filepath='include/linux/cpufreq.h' line='314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='target_intermediate' type-id='type-id-5604' visibility='default' filepath='include/linux/cpufreq.h' line='316' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='get' type-id='type-id-4016' visibility='default' filepath='include/linux/cpufreq.h' line='320' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='bios_limit' type-id='type-id-5606' visibility='default' filepath='include/linux/cpufreq.h' line='323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='exit' type-id='type-id-5602' visibility='default' filepath='include/linux/cpufreq.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='stop_cpu' type-id='type-id-5607' visibility='default' filepath='include/linux/cpufreq.h' line='326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='suspend' type-id='type-id-5602' visibility='default' filepath='include/linux/cpufreq.h' line='327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='resume' type-id='type-id-5602' visibility='default' filepath='include/linux/cpufreq.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='ready' type-id='type-id-5607' visibility='default' filepath='include/linux/cpufreq.h' line='331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='attr' type-id='type-id-5608' visibility='default' filepath='include/linux/cpufreq.h' line='333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='boost_enabled' type-id='type-id-33' visibility='default' filepath='include/linux/cpufreq.h' line='336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='set_boost' type-id='type-id-2565' visibility='default' filepath='include/linux/cpufreq.h' line='337' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpufreq_policy' size-in-bits='3200' is-struct='yes' visibility='default' filepath='include/linux/cpufreq.h' line='65' column='1' id='type-id-5609'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cpus' type-id='type-id-38' visibility='default' filepath='include/linux/cpufreq.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='related_cpus' type-id='type-id-38' visibility='default' filepath='include/linux/cpufreq.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='real_cpus' type-id='type-id-38' visibility='default' filepath='include/linux/cpufreq.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='shared_type' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='cpu' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='clk' type-id='type-id-4191' visibility='default' filepath='include/linux/cpufreq.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='cpuinfo' type-id='type-id-5610' visibility='default' filepath='include/linux/cpufreq.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='min' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='max' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='cur' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='restore_freq' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='suspend_freq' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='policy' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='last_policy' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='governor' type-id='type-id-5611' visibility='default' filepath='include/linux/cpufreq.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='governor_data' type-id='type-id-15' visibility='default' filepath='include/linux/cpufreq.h' line='88' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='last_governor' type-id='type-id-43' visibility='default' filepath='include/linux/cpufreq.h' line='89' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='update' type-id='type-id-255' visibility='default' filepath='include/linux/cpufreq.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='user_policy' type-id='type-id-5612' visibility='default' filepath='include/linux/cpufreq.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='freq_table' type-id='type-id-5613' visibility='default' filepath='include/linux/cpufreq.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='freq_table_sorted' type-id='type-id-5614' visibility='default' filepath='include/linux/cpufreq.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='policy_list' type-id='type-id-20' visibility='default' filepath='include/linux/cpufreq.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='kobj' type-id='type-id-267' visibility='default' filepath='include/linux/cpufreq.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='kobj_unregister' type-id='type-id-1606' visibility='default' filepath='include/linux/cpufreq.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='rwsem' type-id='type-id-246' visibility='default' filepath='include/linux/cpufreq.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='fast_switch_possible' type-id='type-id-33' visibility='default' filepath='include/linux/cpufreq.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2568'>
+          <var-decl name='fast_switch_enabled' type-id='type-id-33' visibility='default' filepath='include/linux/cpufreq.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2592'>
+          <var-decl name='transition_delay_us' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='dvfs_possible_from_any_cpu' type-id='type-id-33' visibility='default' filepath='include/linux/cpufreq.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2656'>
+          <var-decl name='cached_target_freq' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='cached_resolved_idx' type-id='type-id-17' visibility='default' filepath='include/linux/cpufreq.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2720'>
+          <var-decl name='transition_ongoing' type-id='type-id-33' visibility='default' filepath='include/linux/cpufreq.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='transition_lock' type-id='type-id-247' visibility='default' filepath='include/linux/cpufreq.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='transition_wait' type-id='type-id-225' visibility='default' filepath='include/linux/cpufreq.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='transition_task' type-id='type-id-431' visibility='default' filepath='include/linux/cpufreq.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='stats' type-id='type-id-5615' visibility='default' filepath='include/linux/cpufreq.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='driver_data' type-id='type-id-15' visibility='default' filepath='include/linux/cpufreq.h' line='153' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpufreq_cpuinfo' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/linux/cpufreq.h' line='52' column='1' id='type-id-5610'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='max_freq' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='min_freq' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='transition_latency' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='57' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpufreq_governor' size-in-bits='832' is-struct='yes' visibility='default' filepath='include/linux/cpufreq.h' line='500' column='1' id='type-id-5616'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-43' visibility='default' filepath='include/linux/cpufreq.h' line='501' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='init' type-id='type-id-5602' visibility='default' filepath='include/linux/cpufreq.h' line='502' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='exit' type-id='type-id-5607' visibility='default' filepath='include/linux/cpufreq.h' line='503' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='start' type-id='type-id-5602' visibility='default' filepath='include/linux/cpufreq.h' line='504' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='stop' type-id='type-id-5607' visibility='default' filepath='include/linux/cpufreq.h' line='505' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='limits' type-id='type-id-5607' visibility='default' filepath='include/linux/cpufreq.h' line='506' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='show_setspeed' type-id='type-id-5617' visibility='default' filepath='include/linux/cpufreq.h' line='507' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='store_setspeed' type-id='type-id-5604' visibility='default' filepath='include/linux/cpufreq.h' line='509' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='dynamic_switching' type-id='type-id-33' visibility='default' filepath='include/linux/cpufreq.h' line='512' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='governor_list' type-id='type-id-20' visibility='default' filepath='include/linux/cpufreq.h' line='513' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/cpufreq.h' line='514' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpufreq_user_policy' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/cpufreq.h' line='60' column='1' id='type-id-5612'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='min' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='max' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='62' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cpufreq_frequency_table' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/linux/cpufreq.h' line='587' column='1' id='type-id-5618'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='588' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='driver_data' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='589' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='frequency' type-id='type-id-5' visibility='default' filepath='include/linux/cpufreq.h' line='590' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='cpufreq_table_sorting' filepath='include/linux/cpufreq.h' line='39' column='1' id='type-id-5614'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='CPUFREQ_TABLE_UNSORTED' value='0'/>
+        <enumerator name='CPUFREQ_TABLE_SORTED_ASCENDING' value='1'/>
+        <enumerator name='CPUFREQ_TABLE_SORTED_DESCENDING' value='2'/>
+      </enum-decl>
+      <class-decl name='freq_attr' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/cpufreq.h' line='235' column='1' id='type-id-5619'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='attr' type-id='type-id-619' visibility='default' filepath='include/linux/cpufreq.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='show' type-id='type-id-5617' visibility='default' filepath='include/linux/cpufreq.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='store' type-id='type-id-5620' visibility='default' filepath='include/linux/cpufreq.h' line='238' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-5601' size-in-bits='64' id='type-id-5621'/>
+      <pointer-type-def type-id='type-id-5618' size-in-bits='64' id='type-id-5613'/>
+      <pointer-type-def type-id='type-id-5616' size-in-bits='64' id='type-id-5611'/>
+      <pointer-type-def type-id='type-id-5609' size-in-bits='64' id='type-id-5622'/>
+      <pointer-type-def type-id='type-id-5600' size-in-bits='64' id='type-id-5615'/>
+      <pointer-type-def type-id='type-id-5619' size-in-bits='64' id='type-id-5623'/>
+      <pointer-type-def type-id='type-id-5623' size-in-bits='64' id='type-id-5608'/>
+      <pointer-type-def type-id='type-id-5624' size-in-bits='64' id='type-id-5602'/>
+      <pointer-type-def type-id='type-id-5625' size-in-bits='64' id='type-id-5604'/>
+      <pointer-type-def type-id='type-id-5626' size-in-bits='64' id='type-id-5603'/>
+      <pointer-type-def type-id='type-id-5627' size-in-bits='64' id='type-id-5606'/>
+      <pointer-type-def type-id='type-id-5628' size-in-bits='64' id='type-id-5617'/>
+      <pointer-type-def type-id='type-id-5629' size-in-bits='64' id='type-id-5620'/>
+      <pointer-type-def type-id='type-id-5630' size-in-bits='64' id='type-id-5605'/>
+      <pointer-type-def type-id='type-id-5631' size-in-bits='64' id='type-id-5607'/>
+      <function-decl name='cpufreq_register_driver' mangled-name='cpufreq_register_driver' filepath='drivers/cpufreq/cpufreq.c' line='2493' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpufreq_register_driver'>
+        <parameter type-id='type-id-5621' name='driver_data' filepath='drivers/cpufreq/cpufreq.c' line='2493' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='cpufreq_unregister_driver' mangled-name='cpufreq_unregister_driver' filepath='drivers/cpufreq/cpufreq.c' line='2579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpufreq_unregister_driver'>
+        <parameter type-id='type-id-5621' name='driver' filepath='drivers/cpufreq/cpufreq.c' line='2579' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5624'>
+        <parameter type-id='type-id-5622'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5625'>
+        <parameter type-id='type-id-5622'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5626'>
+        <parameter type-id='type-id-5622'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5627'>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-482'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5628'>
+        <parameter type-id='type-id-5622'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5629'>
+        <parameter type-id='type-id-5622'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5630'>
+        <parameter type-id='type-id-5622'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5631'>
+        <parameter type-id='type-id-5622'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/leds/led-class.c' language='LANG_C89'>
+      <class-decl name='led_classdev' size-in-bits='2624' is-struct='yes' visibility='default' filepath='include/linux/leds.h' line='36' column='1' id='type-id-5632'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/leds.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='brightness' type-id='type-id-5633' visibility='default' filepath='include/linux/leds.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='max_brightness' type-id='type-id-5633' visibility='default' filepath='include/linux/leds.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/linux/leds.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='work_flags' type-id='type-id-16' visibility='default' filepath='include/linux/leds.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='brightness_set' type-id='type-id-5634' visibility='default' filepath='include/linux/leds.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='brightness_set_blocking' type-id='type-id-5635' visibility='default' filepath='include/linux/leds.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='brightness_get' type-id='type-id-5636' visibility='default' filepath='include/linux/leds.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='blink_set' type-id='type-id-5637' visibility='default' filepath='include/linux/leds.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dev' type-id='type-id-240' visibility='default' filepath='include/linux/leds.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='groups' type-id='type-id-665' visibility='default' filepath='include/linux/leds.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/linux/leds.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='default_trigger' type-id='type-id-4' visibility='default' filepath='include/linux/leds.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='blink_delay_on' type-id='type-id-16' visibility='default' filepath='include/linux/leds.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='blink_delay_off' type-id='type-id-16' visibility='default' filepath='include/linux/leds.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='blink_timer' type-id='type-id-417' visibility='default' filepath='include/linux/leds.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='blink_brightness' type-id='type-id-17' visibility='default' filepath='include/linux/leds.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='new_blink_brightness' type-id='type-id-17' visibility='default' filepath='include/linux/leds.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='flash_resume' type-id='type-id-5638' visibility='default' filepath='include/linux/leds.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='set_brightness_work' type-id='type-id-255' visibility='default' filepath='include/linux/leds.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='delayed_set_value' type-id='type-id-17' visibility='default' filepath='include/linux/leds.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='trigger_lock' type-id='type-id-246' visibility='default' filepath='include/linux/leds.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='trigger' type-id='type-id-5639' visibility='default' filepath='include/linux/leds.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='trig_list' type-id='type-id-20' visibility='default' filepath='include/linux/leds.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='trigger_data' type-id='type-id-15' visibility='default' filepath='include/linux/leds.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='activated' type-id='type-id-33' visibility='default' filepath='include/linux/leds.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='led_access' type-id='type-id-245' visibility='default' filepath='include/linux/leds.h' line='123' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='led_brightness' filepath='include/linux/leds.h' line='29' column='1' id='type-id-5633'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='LED_OFF' value='0'/>
+        <enumerator name='LED_ON' value='1'/>
+        <enumerator name='LED_HALF' value='127'/>
+        <enumerator name='LED_FULL' value='255'/>
+      </enum-decl>
+      <class-decl name='led_trigger' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/leds.h' line='253' column='1' id='type-id-5640'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='name' type-id='type-id-4' visibility='default' filepath='include/linux/leds.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='activate' type-id='type-id-5641' visibility='default' filepath='include/linux/leds.h' line='256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='deactivate' type-id='type-id-5638' visibility='default' filepath='include/linux/leds.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='leddev_list_lock' type-id='type-id-885' visibility='default' filepath='include/linux/leds.h' line='260' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='led_cdevs' type-id='type-id-20' visibility='default' filepath='include/linux/leds.h' line='261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='next_trig' type-id='type-id-20' visibility='default' filepath='include/linux/leds.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='groups' type-id='type-id-665' visibility='default' filepath='include/linux/leds.h' line='266' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-5642' size-in-bits='64' id='type-id-5636'/>
+      <pointer-type-def type-id='type-id-5643' size-in-bits='64' id='type-id-5641'/>
+      <pointer-type-def type-id='type-id-5644' size-in-bits='64' id='type-id-5635'/>
+      <pointer-type-def type-id='type-id-5645' size-in-bits='64' id='type-id-5637'/>
+      <pointer-type-def type-id='type-id-5632' size-in-bits='64' id='type-id-5646'/>
+      <pointer-type-def type-id='type-id-5640' size-in-bits='64' id='type-id-5639'/>
+      <pointer-type-def type-id='type-id-5647' size-in-bits='64' id='type-id-5638'/>
+      <pointer-type-def type-id='type-id-5648' size-in-bits='64' id='type-id-5634'/>
+      <function-decl name='of_led_classdev_register' mangled-name='of_led_classdev_register' filepath='drivers/leds/led-class.c' line='253' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_led_classdev_register'>
+        <parameter type-id='type-id-240' name='parent' filepath='drivers/leds/led-class.c' line='253' column='1'/>
+        <parameter type-id='type-id-2022' name='np' filepath='drivers/leds/led-class.c' line='253' column='1'/>
+        <parameter type-id='type-id-5646' name='led_cdev' filepath='drivers/leds/led-class.c' line='254' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='led_classdev_unregister' mangled-name='led_classdev_unregister' filepath='drivers/leds/led-class.c' line='324' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='led_classdev_unregister'>
+        <parameter type-id='type-id-5646' name='led_cdev' filepath='drivers/leds/led-class.c' line='324' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5642'>
+        <parameter type-id='type-id-5646'/>
+        <return type-id='type-id-5633'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5643'>
+        <parameter type-id='type-id-5646'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5644'>
+        <parameter type-id='type-id-5646'/>
+        <parameter type-id='type-id-5633'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5645'>
+        <parameter type-id='type-id-5646'/>
+        <parameter type-id='type-id-45'/>
+        <parameter type-id='type-id-45'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5647'>
+        <parameter type-id='type-id-5646'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5648'>
+        <parameter type-id='type-id-5646'/>
+        <parameter type-id='type-id-5633'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/leds/led-triggers.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-5639' size-in-bits='64' id='type-id-5649'/>
+      <function-decl name='led_trigger_event' mangled-name='led_trigger_event' filepath='drivers/leds/led-triggers.c' line='316' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='led_trigger_event'>
+        <parameter type-id='type-id-5639' name='trig' filepath='drivers/leds/led-triggers.c' line='316' column='1'/>
+        <parameter type-id='type-id-5633' name='brightness' filepath='drivers/leds/led-triggers.c' line='317' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='led_trigger_register_simple' mangled-name='led_trigger_register_simple' filepath='drivers/leds/led-triggers.c' line='370' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='led_trigger_register_simple'>
+        <parameter type-id='type-id-4' name='name' filepath='drivers/leds/led-triggers.c' line='370' column='1'/>
+        <parameter type-id='type-id-5649' name='tp' filepath='drivers/leds/led-triggers.c' line='370' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='led_trigger_unregister_simple' mangled-name='led_trigger_unregister_simple' filepath='drivers/leds/led-triggers.c' line='394' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='led_trigger_unregister_simple'>
+        <parameter type-id='type-id-5639' name='trig' filepath='drivers/leds/led-triggers.c' line='394' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/of/property.c' language='LANG_C89'>
+      <function-decl name='of_property_read_variable_u32_array' mangled-name='of_property_read_variable_u32_array' filepath='drivers/of/property.c' line='277' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_property_read_variable_u32_array'>
+        <parameter type-id='type-id-3994' name='np' filepath='drivers/of/property.c' line='277' column='1'/>
+        <parameter type-id='type-id-4' name='propname' filepath='drivers/of/property.c' line='278' column='1'/>
+        <parameter type-id='type-id-1565' name='out_values' filepath='drivers/of/property.c' line='278' column='1'/>
+        <parameter type-id='type-id-84' name='sz_min' filepath='drivers/of/property.c' line='279' column='1'/>
+        <parameter type-id='type-id-84' name='sz_max' filepath='drivers/of/property.c' line='279' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='of_property_read_u64' mangled-name='of_property_read_u64' filepath='drivers/of/property.c' line='316' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_property_read_u64'>
+        <parameter type-id='type-id-3994' name='np' filepath='drivers/of/property.c' line='316' column='1'/>
+        <parameter type-id='type-id-4' name='propname' filepath='drivers/of/property.c' line='316' column='1'/>
+        <parameter type-id='type-id-1508' name='out_value' filepath='drivers/of/property.c' line='317' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/of/address.c' language='LANG_C89'>
+      <function-decl name='of_address_to_resource' mangled-name='of_address_to_resource' filepath='drivers/of/address.c' line='788' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_address_to_resource'>
+        <parameter type-id='type-id-3543' name='dev' filepath='drivers/of/address.c' line='788' column='1'/>
+        <parameter type-id='type-id-17' name='index' filepath='drivers/of/address.c' line='788' column='1'/>
+        <parameter type-id='type-id-2155' name='r' filepath='drivers/of/address.c' line='789' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='drivers/of/irq.c' language='LANG_C89'>
+      <function-decl name='of_irq_get' mangled-name='of_irq_get' filepath='drivers/of/irq.c' line='388' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_irq_get'>
+        <parameter type-id='type-id-3543' name='dev' filepath='drivers/of/irq.c' line='388' column='1'/>
+        <parameter type-id='type-id-17' name='index' filepath='drivers/of/irq.c' line='388' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/socket.c' language='LANG_C89'>
+      <class-decl name='bpf_prog_aux' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5650'/>
+      <class-decl name='lwtunnel_state' size-in-bits='384' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5651'/>
+      <class-decl name='raw_hashinfo' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5652'/>
+      <class-decl name='sock_reuseport' size-in-bits='320' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5653'/>
+      <class-decl name='udp_table' size-in-bits='192' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5654'/>
+      <class-decl name='xfrm_policy' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5655'/>
+      <class-decl name='xfrm_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5656'/>
+      <array-type-def dimensions='1' type-id='type-id-5657' size-in-bits='128' id='type-id-5658'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <class-decl name='msghdr' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/socket.h' line='48' column='1' id='type-id-5659'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='msg_name' type-id='type-id-15' visibility='default' filepath='include/linux/socket.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='msg_namelen' type-id='type-id-17' visibility='default' filepath='include/linux/socket.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='msg_iter' type-id='type-id-2111' visibility='default' filepath='include/linux/socket.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='msg_control' type-id='type-id-15' visibility='default' filepath='include/linux/socket.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='msg_controllen' type-id='type-id-887' visibility='default' filepath='include/linux/socket.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='msg_flags' type-id='type-id-5' visibility='default' filepath='include/linux/socket.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='msg_iocb' type-id='type-id-3011' visibility='default' filepath='include/linux/socket.h' line='55' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__3' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/fs.h' line='1064' column='1' id='type-id-5660'>
+        <data-member access='private'>
+          <var-decl name='nfs_fl' type-id='type-id-2594' visibility='default' filepath='include/linux/fs.h' line='1065' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='nfs4_fl' type-id='type-id-2596' visibility='default' filepath='include/linux/fs.h' line='1066' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='afs' type-id='type-id-2598' visibility='default' filepath='include/linux/fs.h' line='1070' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='sock' size-in-bits='5696' is-struct='yes' visibility='default' filepath='include/net/sock.h' line='327' column='1' id='type-id-5661'>
+        <member-type access='public'>
+          <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='413' column='1' id='type-id-5662'>
+            <data-member access='private'>
+              <var-decl name='sk_send_head' type-id='type-id-1766' visibility='default' filepath='include/net/sock.h' line='414' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='tcp_rtx_queue' type-id='type-id-416' visibility='default' filepath='include/net/sock.h' line='415' column='1'/>
+            </data-member>
+          </union-decl>
+        </member-type>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='__sk_common' type-id='type-id-5663' visibility='default' filepath='include/net/sock.h' line='332' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='sk_lock' type-id='type-id-5664' visibility='default' filepath='include/net/sock.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='sk_drops' type-id='type-id-26' visibility='default' filepath='include/net/sock.h' line='368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1312'>
+          <var-decl name='sk_rcvlowat' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='sk_error_queue' type-id='type-id-1659' visibility='default' filepath='include/net/sock.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='sk_receive_queue' type-id='type-id-1659' visibility='default' filepath='include/net/sock.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='sk_backlog' type-id='type-id-5665' visibility='default' filepath='include/net/sock.h' line='385' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='sk_forward_alloc' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='388' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1952'>
+          <var-decl name='sk_ll_usec' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='390' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='sk_napi_id' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2016'>
+          <var-decl name='sk_rcvbuf' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='sk_filter' type-id='type-id-5666' visibility='default' filepath='include/net/sock.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='' type-id='type-id-5667' visibility='default' filepath='include/net/sock.h' line='397' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='sk_policy' type-id='type-id-5658' visibility='default' filepath='include/net/sock.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='sk_rx_dst' type-id='type-id-5668' visibility='default' filepath='include/net/sock.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='sk_dst_cache' type-id='type-id-5668' visibility='default' filepath='include/net/sock.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='sk_omem_alloc' type-id='type-id-26' visibility='default' filepath='include/net/sock.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2464'>
+          <var-decl name='sk_sndbuf' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='sk_wmem_queued' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2528'>
+          <var-decl name='sk_wmem_alloc' type-id='type-id-421' visibility='default' filepath='include/net/sock.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='sk_tsq_flags' type-id='type-id-16' visibility='default' filepath='include/net/sock.h' line='412' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='sk_write_queue' type-id='type-id-1659' visibility='default' filepath='include/net/sock.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='sk_peek_off' type-id='type-id-653' visibility='default' filepath='include/net/sock.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2912'>
+          <var-decl name='sk_write_pending' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='sk_dst_pending_confirm' type-id='type-id-511' visibility='default' filepath='include/net/sock.h' line='420' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2976'>
+          <var-decl name='sk_pacing_status' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='421' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='sk_sndtimeo' type-id='type-id-192' visibility='default' filepath='include/net/sock.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='sk_timer' type-id='type-id-417' visibility='default' filepath='include/net/sock.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='sk_priority' type-id='type-id-511' visibility='default' filepath='include/net/sock.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3424'>
+          <var-decl name='sk_mark' type-id='type-id-511' visibility='default' filepath='include/net/sock.h' line='425' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='sk_pacing_rate' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3488'>
+          <var-decl name='sk_max_pacing_rate' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='427' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='sk_frag' type-id='type-id-1534' visibility='default' filepath='include/net/sock.h' line='428' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='sk_route_caps' type-id='type-id-1666' visibility='default' filepath='include/net/sock.h' line='429' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='sk_route_nocaps' type-id='type-id-1666' visibility='default' filepath='include/net/sock.h' line='430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='sk_route_forced_caps' type-id='type-id-1666' visibility='default' filepath='include/net/sock.h' line='431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='sk_gso_type' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3872'>
+          <var-decl name='sk_gso_max_size' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='433' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3904'>
+          <var-decl name='sk_allocation' type-id='type-id-485' visibility='default' filepath='include/net/sock.h' line='434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3936'>
+          <var-decl name='sk_txhash' type-id='type-id-511' visibility='default' filepath='include/net/sock.h' line='435' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='__sk_flags_offset' type-id='type-id-4074' visibility='default' filepath='include/net/sock.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='31'>
+          <var-decl name='sk_padding' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='456' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='30'>
+          <var-decl name='sk_kern_sock' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='457' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='29'>
+          <var-decl name='sk_no_check_tx' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='458' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28'>
+          <var-decl name='sk_no_check_rx' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='459' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='sk_userlocks' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='sk_protocol' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='461' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='sk_type' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4000'>
+          <var-decl name='sk_gso_max_segs' type-id='type-id-688' visibility='default' filepath='include/net/sock.h' line='464' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4016'>
+          <var-decl name='sk_pacing_shift' type-id='type-id-214' visibility='default' filepath='include/net/sock.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='sk_lingertime' type-id='type-id-16' visibility='default' filepath='include/net/sock.h' line='466' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='sk_prot_creator' type-id='type-id-5669' visibility='default' filepath='include/net/sock.h' line='467' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='sk_callback_lock' type-id='type-id-885' visibility='default' filepath='include/net/sock.h' line='468' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='sk_err' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='469' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4256'>
+          <var-decl name='sk_err_soft' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='470' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='sk_ack_backlog' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='471' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4320'>
+          <var-decl name='sk_max_ack_backlog' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='sk_uid' type-id='type-id-42' visibility='default' filepath='include/net/sock.h' line='473' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='sk_peer_pid' type-id='type-id-251' visibility='default' filepath='include/net/sock.h' line='474' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='sk_peer_cred' type-id='type-id-1277' visibility='default' filepath='include/net/sock.h' line='475' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='sk_rcvtimeo' type-id='type-id-192' visibility='default' filepath='include/net/sock.h' line='476' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='sk_stamp' type-id='type-id-682' visibility='default' filepath='include/net/sock.h' line='477' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='sk_tsflags' type-id='type-id-688' visibility='default' filepath='include/net/sock.h' line='481' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4688'>
+          <var-decl name='sk_shutdown' type-id='type-id-214' visibility='default' filepath='include/net/sock.h' line='482' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4704'>
+          <var-decl name='sk_tskey' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='483' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='sk_zckey' type-id='type-id-26' visibility='default' filepath='include/net/sock.h' line='484' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4768'>
+          <var-decl name='sk_clockid' type-id='type-id-214' visibility='default' filepath='include/net/sock.h' line='486' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='sk_txtime_deadline_mode' type-id='type-id-214' visibility='default' filepath='include/net/sock.h' line='487' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6'>
+          <var-decl name='sk_txtime_report_errors' type-id='type-id-214' visibility='default' filepath='include/net/sock.h' line='488' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4776'>
+          <var-decl name='sk_txtime_unused' type-id='type-id-214' visibility='default' filepath='include/net/sock.h' line='489' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='sk_socket' type-id='type-id-5670' visibility='default' filepath='include/net/sock.h' line='491' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='sk_user_data' type-id='type-id-15' visibility='default' filepath='include/net/sock.h' line='492' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='sk_security' type-id='type-id-15' visibility='default' filepath='include/net/sock.h' line='494' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='sk_cgrp_data' type-id='type-id-5671' visibility='default' filepath='include/net/sock.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='sk_memcg' type-id='type-id-447' visibility='default' filepath='include/net/sock.h' line='497' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='sk_state_change' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='498' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='sk_data_ready' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='499' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5248'>
+          <var-decl name='sk_write_space' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='500' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='sk_error_report' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='501' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='sk_backlog_rcv' type-id='type-id-5673' visibility='default' filepath='include/net/sock.h' line='502' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='sk_destruct' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='509' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='sk_reuseport_cb' type-id='type-id-5674' visibility='default' filepath='include/net/sock.h' line='510' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='sk_rcu' type-id='type-id-385' visibility='default' filepath='include/net/sock.h' line='511' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sock_common' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/net/sock.h' line='152' column='1' id='type-id-5663'>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='163' column='1' id='type-id-5675'>
+              <data-member access='private'>
+                <var-decl name='skc_hash' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='164' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='skc_u16hashes' type-id='type-id-4448' visibility='default' filepath='include/net/sock.h' line='165' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__1' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='168' column='1' id='type-id-5676'>
+              <data-member access='private'>
+                <var-decl name='skc_portpair' type-id='type-id-5677' visibility='default' filepath='include/net/sock.h' line='169' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='' type-id='type-id-5678' visibility='default' filepath='include/net/sock.h' line='170' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='183' column='1' id='type-id-5679'>
+              <data-member access='private'>
+                <var-decl name='skc_bind_node' type-id='type-id-520' visibility='default' filepath='include/net/sock.h' line='184' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='skc_portaddr_node' type-id='type-id-520' visibility='default' filepath='include/net/sock.h' line='185' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='202' column='1' id='type-id-5680'>
+              <data-member access='private'>
+                <var-decl name='skc_flags' type-id='type-id-16' visibility='default' filepath='include/net/sock.h' line='203' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='skc_listener' type-id='type-id-3666' visibility='default' filepath='include/net/sock.h' line='204' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='skc_tw_dr' type-id='type-id-5681' visibility='default' filepath='include/net/sock.h' line='205' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__4' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='214' column='1' id='type-id-5682'>
+              <data-member access='private'>
+                <var-decl name='skc_node' type-id='type-id-520' visibility='default' filepath='include/net/sock.h' line='215' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='skc_nulls_node' type-id='type-id-2293' visibility='default' filepath='include/net/sock.h' line='216' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+
+          <member-type access='public'>
+            <union-decl name='__anonymous_union__5' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='222' column='1' id='type-id-5683'>
+              <data-member access='private'>
+                <var-decl name='skc_incoming_cpu' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='223' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='skc_rcv_wnd' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='224' column='1'/>
+              </data-member>
+              <data-member access='private'>
+                <var-decl name='skc_tw_rcv_nxt' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='225' column='1'/>
+              </data-member>
+            </union-decl>
+          </member-type>
+        <member-type access='public'>
+          <union-decl name='__anonymous_union__6' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='231' column='1' id='type-id-5684'>
+            <data-member access='private'>
+              <var-decl name='skc_rxhash' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='232' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='skc_window_clamp' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='233' column='1'/>
+            </data-member>
+            <data-member access='private'>
+              <var-decl name='skc_tw_snd_nxt' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='234' column='1'/>
+            </data-member>
+          </union-decl>
+        </member-type>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-5685' visibility='default' filepath='include/net/sock.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='skc_family' type-id='type-id-312' visibility='default' filepath='include/net/sock.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='144'>
+          <var-decl name='skc_state' type-id='type-id-5686' visibility='default' filepath='include/net/sock.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4'>
+          <var-decl name='skc_reuse' type-id='type-id-216' visibility='default' filepath='include/net/sock.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3'>
+          <var-decl name='skc_reuseport' type-id='type-id-216' visibility='default' filepath='include/net/sock.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2'>
+          <var-decl name='skc_ipv6only' type-id='type-id-216' visibility='default' filepath='include/net/sock.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1'>
+          <var-decl name='skc_net_refcnt' type-id='type-id-216' visibility='default' filepath='include/net/sock.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='skc_bound_dev_if' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='skc_prot' type-id='type-id-5669' visibility='default' filepath='include/net/sock.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='skc_net' type-id='type-id-1690' visibility='default' filepath='include/net/sock.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='skc_v6_daddr' type-id='type-id-2250' visibility='default' filepath='include/net/sock.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='skc_v6_rcv_saddr' type-id='type-id-2250' visibility='default' filepath='include/net/sock.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='skc_cookie' type-id='type-id-113' visibility='default' filepath='include/net/sock.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='skc_dontcopy_begin' type-id='type-id-1134' visibility='default' filepath='include/net/sock.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='skc_tx_queue_mapping' type-id='type-id-312' visibility='default' filepath='include/net/sock.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='912'>
+          <var-decl name='skc_rx_queue_mapping' type-id='type-id-312' visibility='default' filepath='include/net/sock.h' line='220' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='skc_refcnt' type-id='type-id-421' visibility='default' filepath='include/net/sock.h' line='228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='skc_dontcopy_end' type-id='type-id-1134' visibility='default' filepath='include/net/sock.h' line='230' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__addrpair' type-id='type-id-100' filepath='include/net/sock.h' line='120' column='1' id='type-id-5687'/>
+      <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='158' column='1' id='type-id-5688'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='skc_daddr' type-id='type-id-927' visibility='default' filepath='include/net/sock.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='skc_rcv_saddr' type-id='type-id-927' visibility='default' filepath='include/net/sock.h' line='160' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__portpair' type-id='type-id-511' filepath='include/net/sock.h' line='119' column='1' id='type-id-5677'/>
+      <class-decl name='__anonymous_struct__1' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='170' column='1' id='type-id-5678'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='skc_dport' type-id='type-id-924' visibility='default' filepath='include/net/sock.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='skc_num' type-id='type-id-108' visibility='default' filepath='include/net/sock.h' line='172' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='proto' size-in-bits='3392' is-struct='yes' visibility='default' filepath='include/net/sock.h' line='1058' column='1' id='type-id-5689'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='close' type-id='type-id-5690' visibility='default' filepath='include/net/sock.h' line='1059' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pre_connect' type-id='type-id-5691' visibility='default' filepath='include/net/sock.h' line='1061' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='connect' type-id='type-id-5691' visibility='default' filepath='include/net/sock.h' line='1064' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='disconnect' type-id='type-id-5692' visibility='default' filepath='include/net/sock.h' line='1067' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='accept' type-id='type-id-5693' visibility='default' filepath='include/net/sock.h' line='1069' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ioctl' type-id='type-id-5694' visibility='default' filepath='include/net/sock.h' line='1072' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='init' type-id='type-id-5695' visibility='default' filepath='include/net/sock.h' line='1074' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='destroy' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='1075' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='shutdown' type-id='type-id-5696' visibility='default' filepath='include/net/sock.h' line='1076' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='setsockopt' type-id='type-id-5697' visibility='default' filepath='include/net/sock.h' line='1077' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='getsockopt' type-id='type-id-5698' visibility='default' filepath='include/net/sock.h' line='1080' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='keepalive' type-id='type-id-5696' visibility='default' filepath='include/net/sock.h' line='1083' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='compat_setsockopt' type-id='type-id-5697' visibility='default' filepath='include/net/sock.h' line='1085' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='compat_getsockopt' type-id='type-id-5698' visibility='default' filepath='include/net/sock.h' line='1089' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='compat_ioctl' type-id='type-id-5699' visibility='default' filepath='include/net/sock.h' line='1093' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='sendmsg' type-id='type-id-5700' visibility='default' filepath='include/net/sock.h' line='1096' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='recvmsg' type-id='type-id-5701' visibility='default' filepath='include/net/sock.h' line='1098' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='sendpage' type-id='type-id-5702' visibility='default' filepath='include/net/sock.h' line='1101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='bind' type-id='type-id-5691' visibility='default' filepath='include/net/sock.h' line='1103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='backlog_rcv' type-id='type-id-5673' visibility='default' filepath='include/net/sock.h' line='1106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='release_cb' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='1109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='hash' type-id='type-id-5695' visibility='default' filepath='include/net/sock.h' line='1112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='unhash' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='1113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='rehash' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='1114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='get_port' type-id='type-id-5703' visibility='default' filepath='include/net/sock.h' line='1115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='inuse_idx' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='1119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='stream_memory_free' type-id='type-id-5704' visibility='default' filepath='include/net/sock.h' line='1122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='stream_memory_read' type-id='type-id-5704' visibility='default' filepath='include/net/sock.h' line='1123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='enter_memory_pressure' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='1125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='leave_memory_pressure' type-id='type-id-5672' visibility='default' filepath='include/net/sock.h' line='1126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='memory_allocated' type-id='type-id-2545' visibility='default' filepath='include/net/sock.h' line='1127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='sockets_allocated' type-id='type-id-5705' visibility='default' filepath='include/net/sock.h' line='1128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='memory_pressure' type-id='type-id-45' visibility='default' filepath='include/net/sock.h' line='1135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='sysctl_mem' type-id='type-id-5595' visibility='default' filepath='include/net/sock.h' line='1136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='sysctl_wmem' type-id='type-id-666' visibility='default' filepath='include/net/sock.h' line='1138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='sysctl_rmem' type-id='type-id-666' visibility='default' filepath='include/net/sock.h' line='1139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='sysctl_wmem_offset' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='1140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2336'>
+          <var-decl name='sysctl_rmem_offset' type-id='type-id-7' visibility='default' filepath='include/net/sock.h' line='1141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='max_header' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='1143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2400'>
+          <var-decl name='no_autobind' type-id='type-id-33' visibility='default' filepath='include/net/sock.h' line='1144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='slab' type-id='type-id-538' visibility='default' filepath='include/net/sock.h' line='1146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='obj_size' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='1147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2528'>
+          <var-decl name='slab_flags' type-id='type-id-3256' visibility='default' filepath='include/net/sock.h' line='1148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='useroffset' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='1149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2592'>
+          <var-decl name='usersize' type-id='type-id-5' visibility='default' filepath='include/net/sock.h' line='1150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='orphan_count' type-id='type-id-5705' visibility='default' filepath='include/net/sock.h' line='1152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='rsk_prot' type-id='type-id-5706' visibility='default' filepath='include/net/sock.h' line='1154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='twsk_prot' type-id='type-id-5707' visibility='default' filepath='include/net/sock.h' line='1155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='h' type-id='type-id-5708' visibility='default' filepath='include/net/sock.h' line='1162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/net/sock.h' line='1164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='name' type-id='type-id-373' visibility='default' filepath='include/net/sock.h' line='1166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='node' type-id='type-id-20' visibility='default' filepath='include/net/sock.h' line='1168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='diag_destroy' type-id='type-id-5692' visibility='default' filepath='include/net/sock.h' line='1172' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='request_sock_ops' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/request_sock.h' line='31' column='1' id='type-id-5709'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-17' visibility='default' filepath='include/net/request_sock.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='obj_size' type-id='type-id-5' visibility='default' filepath='include/net/request_sock.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='slab' type-id='type-id-538' visibility='default' filepath='include/net/request_sock.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='slab_name' type-id='type-id-2' visibility='default' filepath='include/net/request_sock.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rtx_syn_ack' type-id='type-id-5710' visibility='default' filepath='include/net/request_sock.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='send_ack' type-id='type-id-5711' visibility='default' filepath='include/net/request_sock.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='send_reset' type-id='type-id-5712' visibility='default' filepath='include/net/request_sock.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='destructor' type-id='type-id-5713' visibility='default' filepath='include/net/request_sock.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='syn_ack_timeout' type-id='type-id-5714' visibility='default' filepath='include/net/request_sock.h' line='43' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='request_sock' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/net/request_sock.h' line='50' column='1' id='type-id-5715'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='__req_common' type-id='type-id-5663' visibility='default' filepath='include/net/request_sock.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='dl_next' type-id='type-id-5716' visibility='default' filepath='include/net/request_sock.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='mss' type-id='type-id-688' visibility='default' filepath='include/net/request_sock.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1104'>
+          <var-decl name='num_retrans' type-id='type-id-214' visibility='default' filepath='include/net/request_sock.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='7'>
+          <var-decl name='cookie_ts' type-id='type-id-214' visibility='default' filepath='include/net/request_sock.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1112'>
+          <var-decl name='num_timeout' type-id='type-id-214' visibility='default' filepath='include/net/request_sock.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='ts_recent' type-id='type-id-7' visibility='default' filepath='include/net/request_sock.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='rsk_timer' type-id='type-id-417' visibility='default' filepath='include/net/request_sock.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='rsk_ops' type-id='type-id-5717' visibility='default' filepath='include/net/request_sock.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='sk' type-id='type-id-3666' visibility='default' filepath='include/net/request_sock.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='saved_syn' type-id='type-id-1565' visibility='default' filepath='include/net/request_sock.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='secid' type-id='type-id-7' visibility='default' filepath='include/net/request_sock.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1696'>
+          <var-decl name='peer_secid' type-id='type-id-7' visibility='default' filepath='include/net/request_sock.h' line='69' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='timewait_sock_ops' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/timewait_sock.h' line='18' column='1' id='type-id-5718'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='twsk_slab' type-id='type-id-538' visibility='default' filepath='include/net/timewait_sock.h' line='19' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='twsk_slab_name' type-id='type-id-2' visibility='default' filepath='include/net/timewait_sock.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='twsk_obj_size' type-id='type-id-5' visibility='default' filepath='include/net/timewait_sock.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='twsk_unique' type-id='type-id-5719' visibility='default' filepath='include/net/timewait_sock.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='twsk_destructor' type-id='type-id-5672' visibility='default' filepath='include/net/timewait_sock.h' line='24' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='smc_hashinfo' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/smc.h' line='16' column='1' id='type-id-5720'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-885' visibility='default' filepath='include/net/smc.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ht' type-id='type-id-186' visibility='default' filepath='include/net/smc.h' line='18' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='socket_lock_t' type-id='type-id-5721' filepath='include/net/sock.h' line='113' column='1' id='type-id-5664'/>
+      <class-decl name='__anonymous_struct__2' size-in-bits='256' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-5664' visibility='default' filepath='include/net/sock.h' line='100' column='1' id='type-id-5721'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='slock' type-id='type-id-247' visibility='default' filepath='include/net/sock.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='owned' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='wq' type-id='type-id-225' visibility='default' filepath='include/net/sock.h' line='103' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__3' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='380' column='1' id='type-id-5665'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rmem_alloc' type-id='type-id-26' visibility='default' filepath='include/net/sock.h' line='381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='len' type-id='type-id-17' visibility='default' filepath='include/net/sock.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='head' type-id='type-id-1766' visibility='default' filepath='include/net/sock.h' line='383' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tail' type-id='type-id-1766' visibility='default' filepath='include/net/sock.h' line='384' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sk_filter' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='508' column='1' id='type-id-5722'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/linux/filter.h' line='509' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/filter.h' line='510' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='prog' type-id='type-id-1228' visibility='default' filepath='include/linux/filter.h' line='511' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='socket_wq' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='92' column='1' id='type-id-5723'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='wait' type-id='type-id-225' visibility='default' filepath='include/linux/net.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='fasync_list' type-id='type-id-254' visibility='default' filepath='include/linux/net.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/net.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/net.h' line='97' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dst_entry' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/net/dst.h' line='35' column='1' id='type-id-5724'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/net/dst.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ops' type-id='type-id-2749' visibility='default' filepath='include/net/dst.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='_metrics' type-id='type-id-16' visibility='default' filepath='include/net/dst.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='expires' type-id='type-id-16' visibility='default' filepath='include/net/dst.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='xfrm' type-id='type-id-5725' visibility='default' filepath='include/net/dst.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='input' type-id='type-id-5726' visibility='default' filepath='include/net/dst.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='output' type-id='type-id-2280' visibility='default' filepath='include/net/dst.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='flags' type-id='type-id-312' visibility='default' filepath='include/net/dst.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='464'>
+          <var-decl name='obsolete' type-id='type-id-261' visibility='default' filepath='include/net/dst.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='header_len' type-id='type-id-312' visibility='default' filepath='include/net/dst.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='496'>
+          <var-decl name='trailer_len' type-id='type-id-312' visibility='default' filepath='include/net/dst.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='__refcnt' type-id='type-id-26' visibility='default' filepath='include/net/dst.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='__use' type-id='type-id-17' visibility='default' filepath='include/net/dst.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='lastuse' type-id='type-id-16' visibility='default' filepath='include/net/dst.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='lwtstate' type-id='type-id-5727' visibility='default' filepath='include/net/dst.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/net/dst.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='error' type-id='type-id-261' visibility='default' filepath='include/net/dst.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='848'>
+          <var-decl name='__pad' type-id='type-id-261' visibility='default' filepath='include/net/dst.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='tclassid' type-id='type-id-511' visibility='default' filepath='include/net/dst.h' line='87' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ip_ra_chain' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/ip.h' line='120' column='1' id='type-id-5728'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-5729' visibility='default' filepath='include/net/ip.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sk' type-id='type-id-3666' visibility='default' filepath='include/net/ip.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='' type-id='type-id-5730' visibility='default' filepath='include/net/ip.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/ip.h' line='127' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/ip.h' line='123' column='1' id='type-id-5730'>
+        <data-member access='private'>
+          <var-decl name='destructor' type-id='type-id-5672' visibility='default' filepath='include/net/ip.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='saved_sk' type-id='type-id-3666' visibility='default' filepath='include/net/ip.h' line='125' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='fib_rules_ops' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/net/fib_rules.h' line='59' column='1' id='type-id-5731'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/fib_rules.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rule_size' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='addr_size' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='unresolved_rules' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='64' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='nr_goto_rules' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='fib_rules_seq' type-id='type-id-5' visibility='default' filepath='include/net/fib_rules.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='action' type-id='type-id-5732' visibility='default' filepath='include/net/fib_rules.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='suppress' type-id='type-id-5733' visibility='default' filepath='include/net/fib_rules.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='match' type-id='type-id-5734' visibility='default' filepath='include/net/fib_rules.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='configure' type-id='type-id-5735' visibility='default' filepath='include/net/fib_rules.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='delete' type-id='type-id-5736' visibility='default' filepath='include/net/fib_rules.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='compare' type-id='type-id-5737' visibility='default' filepath='include/net/fib_rules.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='fill' type-id='type-id-5738' visibility='default' filepath='include/net/fib_rules.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='nlmsg_payload' type-id='type-id-5739' visibility='default' filepath='include/net/fib_rules.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='flush_cache' type-id='type-id-5740' visibility='default' filepath='include/net/fib_rules.h' line='90' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='nlgroup' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='policy' type-id='type-id-2187' visibility='default' filepath='include/net/fib_rules.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='rules_list' type-id='type-id-20' visibility='default' filepath='include/net/fib_rules.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/net/fib_rules.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='fro_net' type-id='type-id-1643' visibility='default' filepath='include/net/fib_rules.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/fib_rules.h' line='97' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fib_rule' size-in-bits='1216' is-struct='yes' visibility='default' filepath='include/net/fib_rules.h' line='19' column='1' id='type-id-5741'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/fib_rules.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='iifindex' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='oifindex' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mark' type-id='type-id-7' visibility='default' filepath='include/net/fib_rules.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='mark_mask' type-id='type-id-7' visibility='default' filepath='include/net/fib_rules.h' line='24' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/fib_rules.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='table' type-id='type-id-7' visibility='default' filepath='include/net/fib_rules.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='action' type-id='type-id-214' visibility='default' filepath='include/net/fib_rules.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='328'>
+          <var-decl name='l3mdev' type-id='type-id-214' visibility='default' filepath='include/net/fib_rules.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='336'>
+          <var-decl name='proto' type-id='type-id-214' visibility='default' filepath='include/net/fib_rules.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='344'>
+          <var-decl name='ip_proto' type-id='type-id-214' visibility='default' filepath='include/net/fib_rules.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='target' type-id='type-id-7' visibility='default' filepath='include/net/fib_rules.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='tun_id' type-id='type-id-5742' visibility='default' filepath='include/net/fib_rules.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ctarget' type-id='type-id-5743' visibility='default' filepath='include/net/fib_rules.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='fr_net' type-id='type-id-1643' visibility='default' filepath='include/net/fib_rules.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/net/fib_rules.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='pref' type-id='type-id-7' visibility='default' filepath='include/net/fib_rules.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='suppress_ifgroup' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='suppress_prefixlen' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='iifname' type-id='type-id-43' visibility='default' filepath='include/net/fib_rules.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='oifname' type-id='type-id-43' visibility='default' filepath='include/net/fib_rules.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='uid_range' type-id='type-id-5744' visibility='default' filepath='include/net/fib_rules.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='sport_range' type-id='type-id-5745' visibility='default' filepath='include/net/fib_rules.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1056'>
+          <var-decl name='dport_range' type-id='type-id-5745' visibility='default' filepath='include/net/fib_rules.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/fib_rules.h' line='45' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__be64' type-id='type-id-100' filepath='include/uapi/linux/types.h' line='34' column='1' id='type-id-5742'/>
+      <class-decl name='fib_kuid_range' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/net/fib_rules.h' line='14' column='1' id='type-id-5744'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start' type-id='type-id-42' visibility='default' filepath='include/net/fib_rules.h' line='15' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='end' type-id='type-id-42' visibility='default' filepath='include/net/fib_rules.h' line='16' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fib_rule_port_range' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='38' column='1' id='type-id-5745'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='end' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='flowi' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/net/flow.h' line='171' column='1' id='type-id-5746'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='u' type-id='type-id-5747' visibility='default' filepath='include/net/flow.h' line='177' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__10' size-in-bits='704' is-anonymous='yes' visibility='default' filepath='include/net/flow.h' line='172' column='1' id='type-id-5747'>
+        <data-member access='private'>
+          <var-decl name='__fl_common' type-id='type-id-5748' visibility='default' filepath='include/net/flow.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ip4' type-id='type-id-5749' visibility='default' filepath='include/net/flow.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ip6' type-id='type-id-5750' visibility='default' filepath='include/net/flow.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='dn' type-id='type-id-5751' visibility='default' filepath='include/net/flow.h' line='176' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='flowi_common' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/flow.h' line='29' column='1' id='type-id-5748'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flowic_oif' type-id='type-id-17' visibility='default' filepath='include/net/flow.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='flowic_iif' type-id='type-id-17' visibility='default' filepath='include/net/flow.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flowic_mark' type-id='type-id-511' visibility='default' filepath='include/net/flow.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='flowic_tos' type-id='type-id-893' visibility='default' filepath='include/net/flow.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='104'>
+          <var-decl name='flowic_scope' type-id='type-id-893' visibility='default' filepath='include/net/flow.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='flowic_proto' type-id='type-id-893' visibility='default' filepath='include/net/flow.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='flowic_flags' type-id='type-id-893' visibility='default' filepath='include/net/flow.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flowic_secid' type-id='type-id-511' visibility='default' filepath='include/net/flow.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='flowic_tun_key' type-id='type-id-5752' visibility='default' filepath='include/net/flow.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='flowic_uid' type-id='type-id-42' visibility='default' filepath='include/net/flow.h' line='42' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='flowi_tunnel' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/net/flow.h' line='25' column='1' id='type-id-5752'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tun_id' type-id='type-id-5742' visibility='default' filepath='include/net/flow.h' line='26' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='flowi4' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/net/flow.h' line='69' column='1' id='type-id-5749'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='__fl_common' type-id='type-id-5748' visibility='default' filepath='include/net/flow.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='saddr' type-id='type-id-927' visibility='default' filepath='include/net/flow.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='daddr' type-id='type-id-927' visibility='default' filepath='include/net/flow.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='uli' type-id='type-id-5753' visibility='default' filepath='include/net/flow.h' line='86' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='flowi_uli' size-in-bits='32' visibility='default' filepath='include/net/flow.h' line='45' column='1' id='type-id-5753'>
+        <data-member access='private'>
+          <var-decl name='ports' type-id='type-id-5754' visibility='default' filepath='include/net/flow.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='icmpt' type-id='type-id-5755' visibility='default' filepath='include/net/flow.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='dnports' type-id='type-id-5756' visibility='default' filepath='include/net/flow.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='spi' type-id='type-id-927' visibility='default' filepath='include/net/flow.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='gre_key' type-id='type-id-927' visibility='default' filepath='include/net/flow.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='mht' type-id='type-id-5757' visibility='default' filepath='include/net/flow.h' line='66' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__4' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/flow.h' line='46' column='1' id='type-id-5754'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dport' type-id='type-id-924' visibility='default' filepath='include/net/flow.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='sport' type-id='type-id-924' visibility='default' filepath='include/net/flow.h' line='48' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__5' size-in-bits='16' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/flow.h' line='51' column='1' id='type-id-5755'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-893' visibility='default' filepath='include/net/flow.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='code' type-id='type-id-893' visibility='default' filepath='include/net/flow.h' line='53' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__6' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/flow.h' line='56' column='1' id='type-id-5756'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dport' type-id='type-id-5123' visibility='default' filepath='include/net/flow.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='sport' type-id='type-id-5123' visibility='default' filepath='include/net/flow.h' line='58' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__7' size-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/flow.h' line='64' column='1' id='type-id-5757'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-893' visibility='default' filepath='include/net/flow.h' line='65' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='flowi6' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/net/flow.h' line='130' column='1' id='type-id-5750'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='__fl_common' type-id='type-id-5748' visibility='default' filepath='include/net/flow.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='daddr' type-id='type-id-2250' visibility='default' filepath='include/net/flow.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='saddr' type-id='type-id-2250' visibility='default' filepath='include/net/flow.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='flowlabel' type-id='type-id-927' visibility='default' filepath='include/net/flow.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='uli' type-id='type-id-5753' visibility='default' filepath='include/net/flow.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='mp_hash' type-id='type-id-511' visibility='default' filepath='include/net/flow.h' line='153' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='flowidn' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/flow.h' line='156' column='1' id='type-id-5751'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='__fl_common' type-id='type-id-5748' visibility='default' filepath='include/net/flow.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='daddr' type-id='type-id-5123' visibility='default' filepath='include/net/flow.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='336'>
+          <var-decl name='saddr' type-id='type-id-5123' visibility='default' filepath='include/net/flow.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='uli' type-id='type-id-5753' visibility='default' filepath='include/net/flow.h' line='166' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fib_lookup_arg' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/fib_rules.h' line='48' column='1' id='type-id-5758'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lookup_ptr' type-id='type-id-15' visibility='default' filepath='include/net/fib_rules.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='lookup_data' type-id='type-id-15' visibility='default' filepath='include/net/fib_rules.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='result' type-id='type-id-15' visibility='default' filepath='include/net/fib_rules.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='rule' type-id='type-id-5743' visibility='default' filepath='include/net/fib_rules.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='table' type-id='type-id-7' visibility='default' filepath='include/net/fib_rules.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/net/fib_rules.h' line='54' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fib_rule_hdr' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='19' column='1' id='type-id-5759'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='20' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='dst_len' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='21' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='src_len' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='22' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='tos' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='23' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='table' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='25' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='res1' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='res2' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='action' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/fib_rules.h' line='30' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fib_notifier_ops' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/fib_notifier.h' line='28' column='1' id='type-id-5760'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-17' visibility='default' filepath='include/net/fib_notifier.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/fib_notifier.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='fib_seq_read' type-id='type-id-5761' visibility='default' filepath='include/net/fib_notifier.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='fib_dump' type-id='type-id-5762' visibility='default' filepath='include/net/fib_notifier.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/net/fib_notifier.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/fib_notifier.h' line='34' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ipv6_stable_secret' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/linux/ipv6.h' line='64' column='1' id='type-id-5763'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='initialized' type-id='type-id-33' visibility='default' filepath='include/linux/ipv6.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='secret' type-id='type-id-2250' visibility='default' filepath='include/linux/ipv6.h' line='66' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='socket' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='110' column='1' id='type-id-5764'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='state' type-id='type-id-5765' visibility='default' filepath='include/linux/net.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='type' type-id='type-id-261' visibility='default' filepath='include/linux/net.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/net.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='wq' type-id='type-id-3663' visibility='default' filepath='include/linux/net.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='file' type-id='type-id-83' visibility='default' filepath='include/linux/net.h' line='119' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='sk' type-id='type-id-3666' visibility='default' filepath='include/linux/net.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ops' type-id='type-id-5766' visibility='default' filepath='include/linux/net.h' line='121' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='socket_state' type-id='type-id-5767' filepath='include/uapi/linux/net.h' line='54' column='1' id='type-id-5765'/>
+      <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='include/uapi/linux/net.h' line='48' column='1' id='type-id-5767'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='SS_FREE' value='0'/>
+        <enumerator name='SS_UNCONNECTED' value='1'/>
+        <enumerator name='SS_CONNECTING' value='2'/>
+        <enumerator name='SS_CONNECTED' value='3'/>
+        <enumerator name='SS_DISCONNECTING' value='4'/>
+      </enum-decl>
+      <class-decl name='proto_ops' size-in-bits='1792' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='133' column='1' id='type-id-5768'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-17' visibility='default' filepath='include/linux/net.h' line='134' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/net.h' line='135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='release' type-id='type-id-5769' visibility='default' filepath='include/linux/net.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='bind' type-id='type-id-5770' visibility='default' filepath='include/linux/net.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='connect' type-id='type-id-5771' visibility='default' filepath='include/linux/net.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='socketpair' type-id='type-id-5772' visibility='default' filepath='include/linux/net.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='accept' type-id='type-id-5773' visibility='default' filepath='include/linux/net.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='getname' type-id='type-id-5770' visibility='default' filepath='include/linux/net.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='poll' type-id='type-id-5774' visibility='default' filepath='include/linux/net.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='ioctl' type-id='type-id-5775' visibility='default' filepath='include/linux/net.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='compat_ioctl' type-id='type-id-5775' visibility='default' filepath='include/linux/net.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='listen' type-id='type-id-5776' visibility='default' filepath='include/linux/net.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='shutdown' type-id='type-id-5776' visibility='default' filepath='include/linux/net.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='setsockopt' type-id='type-id-5777' visibility='default' filepath='include/linux/net.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='getsockopt' type-id='type-id-5778' visibility='default' filepath='include/linux/net.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='compat_setsockopt' type-id='type-id-5777' visibility='default' filepath='include/linux/net.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='compat_getsockopt' type-id='type-id-5778' visibility='default' filepath='include/linux/net.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='sendmsg' type-id='type-id-5779' visibility='default' filepath='include/linux/net.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='recvmsg' type-id='type-id-5780' visibility='default' filepath='include/linux/net.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='mmap' type-id='type-id-5781' visibility='default' filepath='include/linux/net.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='sendpage' type-id='type-id-5782' visibility='default' filepath='include/linux/net.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='splice_read' type-id='type-id-5783' visibility='default' filepath='include/linux/net.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='set_peek_off' type-id='type-id-5692' visibility='default' filepath='include/linux/net.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='peek_len' type-id='type-id-5769' visibility='default' filepath='include/linux/net.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='read_sock' type-id='type-id-5784' visibility='default' filepath='include/linux/net.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='sendpage_locked' type-id='type-id-5702' visibility='default' filepath='include/linux/net.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='sendmsg_locked' type-id='type-id-5700' visibility='default' filepath='include/linux/net.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='set_rcvlowat' type-id='type-id-5692' visibility='default' filepath='include/linux/net.h' line='200' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='read_descriptor_t' type-id='type-id-5785' filepath='include/linux/fs.h' line='348' column='1' id='type-id-5786'/>
+      <class-decl name='__anonymous_struct__8' size-in-bits='256' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-5786' visibility='default' filepath='include/linux/fs.h' line='340' column='1' id='type-id-5785'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='written' type-id='type-id-84' visibility='default' filepath='include/linux/fs.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='count' type-id='type-id-84' visibility='default' filepath='include/linux/fs.h' line='342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='arg' type-id='type-id-5787' visibility='default' filepath='include/linux/fs.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='error' type-id='type-id-17' visibility='default' filepath='include/linux/fs.h' line='347' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__11' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/fs.h' line='343' column='1' id='type-id-5787'>
+        <data-member access='private'>
+          <var-decl name='buf' type-id='type-id-2' visibility='default' filepath='include/linux/fs.h' line='344' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/linux/fs.h' line='345' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='sk_read_actor_t' type-id='type-id-5788' filepath='include/linux/net.h' line='130' column='1' id='type-id-5789'/>
+      <class-decl name='sock_cgroup_data' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='762' column='1' id='type-id-5671'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-5790' visibility='default' filepath='include/linux/cgroup-defs.h' line='763' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__12' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='763' column='1' id='type-id-5790'>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-5791' visibility='default' filepath='include/linux/cgroup-defs.h' line='765' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='val' type-id='type-id-40' visibility='default' filepath='include/linux/cgroup-defs.h' line='779' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__9' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='765' column='1' id='type-id-5791'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='is_data' type-id='type-id-214' visibility='default' filepath='include/linux/cgroup-defs.h' line='766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='padding' type-id='type-id-214' visibility='default' filepath='include/linux/cgroup-defs.h' line='767' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='prioidx' type-id='type-id-688' visibility='default' filepath='include/linux/cgroup-defs.h' line='768' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='classid' type-id='type-id-7' visibility='default' filepath='include/linux/cgroup-defs.h' line='769' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='net_proto_family' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='206' column='1' id='type-id-5792'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-17' visibility='default' filepath='include/linux/net.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='create' type-id='type-id-5793' visibility='default' filepath='include/linux/net.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/linux/net.h' line='210' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-893' size-in-bits='64' id='type-id-5794'/>
+      <pointer-type-def type-id='type-id-5650' size-in-bits='64' id='type-id-5795'/>
+      <qualified-type-def type-id='type-id-5792' const='yes' id='type-id-5796'/>
+      <pointer-type-def type-id='type-id-5796' size-in-bits='64' id='type-id-5797'/>
+      <qualified-type-def type-id='type-id-5768' const='yes' id='type-id-5798'/>
+      <pointer-type-def type-id='type-id-5798' size-in-bits='64' id='type-id-5766'/>
+      <qualified-type-def type-id='type-id-5715' const='yes' id='type-id-5799'/>
+      <pointer-type-def type-id='type-id-5799' size-in-bits='64' id='type-id-5800'/>
+      <qualified-type-def type-id='type-id-5709' const='yes' id='type-id-5801'/>
+      <pointer-type-def type-id='type-id-5801' size-in-bits='64' id='type-id-5717'/>
+      <qualified-type-def type-id='type-id-5661' const='yes' id='type-id-5802'/>
+      <pointer-type-def type-id='type-id-5802' size-in-bits='64' id='type-id-5803'/>
+      <pointer-type-def type-id='type-id-5724' size-in-bits='64' id='type-id-5668'/>
+      <pointer-type-def type-id='type-id-5758' size-in-bits='64' id='type-id-5804'/>
+      <pointer-type-def type-id='type-id-5760' size-in-bits='64' id='type-id-5805'/>
+      <pointer-type-def type-id='type-id-5741' size-in-bits='64' id='type-id-5743'/>
+      <pointer-type-def type-id='type-id-5759' size-in-bits='64' id='type-id-5806'/>
+      <pointer-type-def type-id='type-id-5731' size-in-bits='64' id='type-id-5807'/>
+      <pointer-type-def type-id='type-id-5746' size-in-bits='64' id='type-id-5808'/>
+      <pointer-type-def type-id='type-id-2231' size-in-bits='64' id='type-id-5681'/>
+      <pointer-type-def type-id='type-id-5809' size-in-bits='64' id='type-id-5710'/>
+      <pointer-type-def type-id='type-id-5810' size-in-bits='64' id='type-id-5736'/>
+      <pointer-type-def type-id='type-id-5811' size-in-bits='64' id='type-id-5737'/>
+      <pointer-type-def type-id='type-id-5812' size-in-bits='64' id='type-id-5734'/>
+      <pointer-type-def type-id='type-id-5813' size-in-bits='64' id='type-id-5732'/>
+      <pointer-type-def type-id='type-id-5814' size-in-bits='64' id='type-id-5738'/>
+      <pointer-type-def type-id='type-id-5815' size-in-bits='64' id='type-id-5735'/>
+      <pointer-type-def type-id='type-id-5816' size-in-bits='64' id='type-id-5781'/>
+      <pointer-type-def type-id='type-id-5817' size-in-bits='64' id='type-id-5762'/>
+      <pointer-type-def type-id='type-id-5818' size-in-bits='64' id='type-id-5793'/>
+      <pointer-type-def type-id='type-id-5819' size-in-bits='64' id='type-id-5788'/>
+      <pointer-type-def type-id='type-id-5820' size-in-bits='64' id='type-id-5726'/>
+      <pointer-type-def type-id='type-id-5821' size-in-bits='64' id='type-id-5695'/>
+      <pointer-type-def type-id='type-id-5822' size-in-bits='64' id='type-id-5692'/>
+      <pointer-type-def type-id='type-id-5823' size-in-bits='64' id='type-id-5698'/>
+      <pointer-type-def type-id='type-id-5824' size-in-bits='64' id='type-id-5697'/>
+      <pointer-type-def type-id='type-id-5825' size-in-bits='64' id='type-id-5694'/>
+      <pointer-type-def type-id='type-id-5826' size-in-bits='64' id='type-id-5700'/>
+      <pointer-type-def type-id='type-id-5827' size-in-bits='64' id='type-id-5701'/>
+      <pointer-type-def type-id='type-id-5828' size-in-bits='64' id='type-id-5702'/>
+      <pointer-type-def type-id='type-id-5829' size-in-bits='64' id='type-id-5784'/>
+      <pointer-type-def type-id='type-id-5830' size-in-bits='64' id='type-id-5673'/>
+      <pointer-type-def type-id='type-id-5831' size-in-bits='64' id='type-id-5719'/>
+      <pointer-type-def type-id='type-id-5832' size-in-bits='64' id='type-id-5691'/>
+      <pointer-type-def type-id='type-id-5833' size-in-bits='64' id='type-id-5699'/>
+      <pointer-type-def type-id='type-id-5834' size-in-bits='64' id='type-id-5703'/>
+      <pointer-type-def type-id='type-id-5835' size-in-bits='64' id='type-id-5769'/>
+      <pointer-type-def type-id='type-id-5836' size-in-bits='64' id='type-id-5776'/>
+      <pointer-type-def type-id='type-id-5837' size-in-bits='64' id='type-id-5778'/>
+      <pointer-type-def type-id='type-id-5838' size-in-bits='64' id='type-id-5777'/>
+      <pointer-type-def type-id='type-id-5839' size-in-bits='64' id='type-id-5779'/>
+      <pointer-type-def type-id='type-id-5840' size-in-bits='64' id='type-id-5780'/>
+      <pointer-type-def type-id='type-id-5841' size-in-bits='64' id='type-id-5770'/>
+      <pointer-type-def type-id='type-id-5842' size-in-bits='64' id='type-id-5771'/>
+      <pointer-type-def type-id='type-id-5843' size-in-bits='64' id='type-id-5772'/>
+      <pointer-type-def type-id='type-id-5844' size-in-bits='64' id='type-id-5773'/>
+      <pointer-type-def type-id='type-id-5845' size-in-bits='64' id='type-id-5775'/>
+      <pointer-type-def type-id='type-id-5728' size-in-bits='64' id='type-id-5729'/>
+      <pointer-type-def type-id='type-id-5651' size-in-bits='64' id='type-id-5727'/>
+      <pointer-type-def type-id='type-id-5659' size-in-bits='64' id='type-id-5846'/>
+      <pointer-type-def type-id='type-id-204' size-in-bits='64' id='type-id-5705'/>
+      <pointer-type-def type-id='type-id-5689' size-in-bits='64' id='type-id-5669'/>
+      <pointer-type-def type-id='type-id-5652' size-in-bits='64' id='type-id-5847'/>
+      <pointer-type-def type-id='type-id-5786' size-in-bits='64' id='type-id-5848'/>
+      <pointer-type-def type-id='type-id-5715' size-in-bits='64' id='type-id-5716'/>
+      <pointer-type-def type-id='type-id-5709' size-in-bits='64' id='type-id-5706'/>
+      <pointer-type-def type-id='type-id-5722' size-in-bits='64' id='type-id-5666'/>
+      <pointer-type-def type-id='type-id-5720' size-in-bits='64' id='type-id-5849'/>
+      <pointer-type-def type-id='type-id-5661' size-in-bits='64' id='type-id-3666'/>
+      <pointer-type-def type-id='type-id-5850' size-in-bits='64' id='type-id-5693'/>
+      <pointer-type-def type-id='type-id-3666' size-in-bits='64' id='type-id-5851'/>
+      <pointer-type-def type-id='type-id-5653' size-in-bits='64' id='type-id-5674'/>
+      <pointer-type-def type-id='type-id-1774' size-in-bits='64' id='type-id-5852'/>
+      <pointer-type-def type-id='type-id-5764' size-in-bits='64' id='type-id-5670'/>
+      <pointer-type-def type-id='type-id-5723' size-in-bits='64' id='type-id-3663'/>
+      <pointer-type-def type-id='type-id-5718' size-in-bits='64' id='type-id-5707'/>
+      <pointer-type-def type-id='type-id-5853' size-in-bits='64' id='type-id-5774'/>
+      <pointer-type-def type-id='type-id-5854' size-in-bits='64' id='type-id-5704'/>
+      <pointer-type-def type-id='type-id-5855' size-in-bits='64' id='type-id-5733'/>
+      <pointer-type-def type-id='type-id-5856' size-in-bits='64' id='type-id-5739'/>
+      <pointer-type-def type-id='type-id-5857' size-in-bits='64' id='type-id-5783'/>
+      <pointer-type-def type-id='type-id-5858' size-in-bits='64' id='type-id-5782'/>
+      <pointer-type-def type-id='type-id-5654' size-in-bits='64' id='type-id-5859'/>
+      <pointer-type-def type-id='type-id-5860' size-in-bits='64' id='type-id-5761'/>
+      <pointer-type-def type-id='type-id-5861' size-in-bits='64' id='type-id-5714'/>
+      <pointer-type-def type-id='type-id-5862' size-in-bits='64' id='type-id-5712'/>
+      <pointer-type-def type-id='type-id-5863' size-in-bits='64' id='type-id-5711'/>
+      <pointer-type-def type-id='type-id-5864' size-in-bits='64' id='type-id-5740'/>
+      <pointer-type-def type-id='type-id-5865' size-in-bits='64' id='type-id-5713'/>
+      <pointer-type-def type-id='type-id-5866' size-in-bits='64' id='type-id-5672'/>
+      <pointer-type-def type-id='type-id-5867' size-in-bits='64' id='type-id-5696'/>
+      <pointer-type-def type-id='type-id-5868' size-in-bits='64' id='type-id-5690'/>
+      <qualified-type-def type-id='type-id-216' volatile='yes' id='type-id-5686'/>
+      <pointer-type-def type-id='type-id-5655' size-in-bits='64' id='type-id-5657'/>
+      <pointer-type-def type-id='type-id-5656' size-in-bits='64' id='type-id-5725'/>
+      <function-decl name='__sock_tx_timestamp' mangled-name='__sock_tx_timestamp' filepath='net/socket.c' line='603' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__sock_tx_timestamp'>
+        <parameter type-id='type-id-108' name='tsflags' filepath='net/socket.c' line='603' column='1'/>
+        <parameter type-id='type-id-5794' name='tx_flags' filepath='net/socket.c' line='603' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__sock_recv_ts_and_drops' mangled-name='__sock_recv_ts_and_drops' filepath='net/socket.c' line='784' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__sock_recv_ts_and_drops'>
+        <parameter type-id='type-id-5846' name='msg' filepath='net/socket.c' line='784' column='1'/>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/socket.c' line='784' column='1'/>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/socket.c' line='785' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sock_register' mangled-name='sock_register' filepath='net/socket.c' line='2629' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_register'>
+        <parameter type-id='type-id-5797' name='ops' filepath='net/socket.c' line='2629' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_unregister' mangled-name='sock_unregister' filepath='net/socket.c' line='2666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_unregister'>
+        <parameter type-id='type-id-17' name='family' filepath='net/socket.c' line='2666' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-5809'>
+        <parameter type-id='type-id-5803'/>
+        <parameter type-id='type-id-5716'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5810'>
+        <parameter type-id='type-id-5743'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5811'>
+        <parameter type-id='type-id-5743'/>
+        <parameter type-id='type-id-5806'/>
+        <parameter type-id='type-id-3034'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5812'>
+        <parameter type-id='type-id-5743'/>
+        <parameter type-id='type-id-5808'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5813'>
+        <parameter type-id='type-id-5743'/>
+        <parameter type-id='type-id-5808'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-5804'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5814'>
+        <parameter type-id='type-id-5743'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-5806'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5815'>
+        <parameter type-id='type-id-5743'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-5806'/>
+        <parameter type-id='type-id-3034'/>
+        <parameter type-id='type-id-1824'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5816'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-1207'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5817'>
+        <parameter type-id='type-id-1643'/>
+        <parameter type-id='type-id-3271'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5818'>
+        <parameter type-id='type-id-1643'/>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5819'>
+        <parameter type-id='type-id-5848'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5820'>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5821'>
+        <parameter type-id='type-id-3666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5822'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5823'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5824'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5825'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5826'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-5846'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5827'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-5846'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5828'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5829'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-5848'/>
+        <parameter type-id='type-id-5789'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5830'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5831'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5832'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-5852'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5833'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5834'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-312'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5835'>
+        <parameter type-id='type-id-5670'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5836'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5837'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5838'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-2'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5839'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-5846'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5840'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-5846'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5841'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-5852'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5842'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-5852'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5843'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-5670'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5844'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5845'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-16'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5850'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-666'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-3666'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5853'>
+        <parameter type-id='type-id-83'/>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-879'/>
+        <return type-id='type-id-880'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5854'>
+        <parameter type-id='type-id-5803'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5855'>
+        <parameter type-id='type-id-5743'/>
+        <parameter type-id='type-id-5804'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5856'>
+        <parameter type-id='type-id-5743'/>
+        <return type-id='type-id-84'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5857'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-85'/>
+        <parameter type-id='type-id-87'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-5'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5858'>
+        <parameter type-id='type-id-5670'/>
+        <parameter type-id='type-id-512'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-86'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5860'>
+        <parameter type-id='type-id-1643'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5861'>
+        <parameter type-id='type-id-5800'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5862'>
+        <parameter type-id='type-id-5803'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5863'>
+        <parameter type-id='type-id-5803'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-5716'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5864'>
+        <parameter type-id='type-id-5807'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5865'>
+        <parameter type-id='type-id-5716'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5866'>
+        <parameter type-id='type-id-3666'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5867'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-5868'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-192'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='156' column='1' id='type-id-5685'>
+        <data-member access='private'>
+          <var-decl name='skc_addrpair' type-id='type-id-5687' visibility='default' filepath='include/net/sock.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-5688' visibility='default' filepath='include/net/sock.h' line='158' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1157' column='1' id='type-id-5708'>
+        <data-member access='private'>
+          <var-decl name='hashinfo' type-id='type-id-2260' visibility='default' filepath='include/net/sock.h' line='1158' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='udp_table' type-id='type-id-5859' visibility='default' filepath='include/net/sock.h' line='1159' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='raw_hash' type-id='type-id-5847' visibility='default' filepath='include/net/sock.h' line='1160' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='smc_hash' type-id='type-id-5849' visibility='default' filepath='include/net/sock.h' line='1161' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='397' column='1' id='type-id-5667'>
+        <data-member access='private'>
+          <var-decl name='sk_wq' type-id='type-id-3663' visibility='default' filepath='include/net/sock.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='sk_wq_raw' type-id='type-id-3663' visibility='default' filepath='include/net/sock.h' line='399' column='1'/>
+        </data-member>
+      </union-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/sock.c' language='LANG_C89'>
+
+      <array-type-def dimensions='1' type-id='type-id-115' size-in-bits='384' id='type-id-5869'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <class-decl name='crypto_cipher' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5870'/>
+      <class-decl name='prefix_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5871'/>
+      <class-decl name='uncached_list' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-5872'/>
+      <array-type-def dimensions='1' type-id='type-id-5873' size-in-bits='16384' id='type-id-5874'>
+        <subrange length='256' type-id='type-id-9' id='type-id-5875'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5876' size-in-bits='16384' id='type-id-5877'>
+        <subrange length='256' type-id='type-id-9' id='type-id-5875'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5878' size-in-bits='4096' id='type-id-5879'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='416' id='type-id-5880'>
+        <subrange length='13' type-id='type-id-9' id='type-id-201'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='2048' id='type-id-5881'>
+        <subrange length='64' type-id='type-id-9' id='type-id-188'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5882' size-in-bits='960' id='type-id-5883'>
+        <subrange length='15' type-id='type-id-9' id='type-id-3439'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-3666' size-in-bits='infinite' id='type-id-5884'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='infinite' id='type-id-5885'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <union-decl name='tcp_cc_info' visibility='default' is-declaration-only='yes' id='type-id-5886'/>
+      <array-type-def dimensions='1' type-id='type-id-5887' size-in-bits='320' id='type-id-5888'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-5889' size-in-bits='3072' id='type-id-5890'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <union-decl name='__anonymous_union__1' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/fs.h' line='898' column='1' id='type-id-5891'>
+        <data-member access='private'>
+          <var-decl name='fu_llist' type-id='type-id-281' visibility='default' filepath='include/linux/fs.h' line='899' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='fu_rcuhead' type-id='type-id-385' visibility='default' filepath='include/linux/fs.h' line='900' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/cred.h' line='154' column='1' id='type-id-5892'>
+        <data-member access='private'>
+          <var-decl name='non_rcu' type-id='type-id-17' visibility='default' filepath='include/linux/cred.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/cred.h' line='156' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1157' column='1' id='type-id-5893'>
+        <data-member access='private'>
+          <var-decl name='hashinfo' type-id='type-id-2260' visibility='default' filepath='include/net/sock.h' line='1158' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='udp_table' type-id='type-id-5859' visibility='default' filepath='include/net/sock.h' line='1159' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='raw_hash' type-id='type-id-5847' visibility='default' filepath='include/net/sock.h' line='1160' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='smc_hash' type-id='type-id-5849' visibility='default' filepath='include/net/sock.h' line='1161' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='inet_ehash_bucket' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='42' column='1' id='type-id-5894'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chain' type-id='type-id-2291' visibility='default' filepath='include/net/inet_hashtables.h' line='43' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='inet_bind_hashbucket' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='104' column='1' id='type-id-5895'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/net/inet_hashtables.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='chain' type-id='type-id-186' visibility='default' filepath='include/net/inet_hashtables.h' line='106' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='inet_listen_hashbucket' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='112' column='1' id='type-id-5878'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/net/inet_hashtables.h' line='113' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='count' type-id='type-id-5' visibility='default' filepath='include/net/inet_hashtables.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='head' type-id='type-id-186' visibility='default' filepath='include/net/inet_hashtables.h' line='115' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_policy' size-in-bits='6208' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='573' column='1' id='type-id-5896'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='xp_net' type-id='type-id-1690' visibility='default' filepath='include/net/xfrm.h' line='574' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bydst' type-id='type-id-520' visibility='default' filepath='include/net/xfrm.h' line='575' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='byidx' type-id='type-id-520' visibility='default' filepath='include/net/xfrm.h' line='576' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='lock' type-id='type-id-885' visibility='default' filepath='include/net/xfrm.h' line='579' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/net/xfrm.h' line='580' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='timer' type-id='type-id-417' visibility='default' filepath='include/net/xfrm.h' line='581' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='genid' type-id='type-id-26' visibility='default' filepath='include/net/xfrm.h' line='583' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='priority' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='584' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='index' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='585' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='if_id' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='586' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='mark' type-id='type-id-5897' visibility='default' filepath='include/net/xfrm.h' line='587' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='selector' type-id='type-id-5898' visibility='default' filepath='include/net/xfrm.h' line='588' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='lft' type-id='type-id-5899' visibility='default' filepath='include/net/xfrm.h' line='589' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='curlft' type-id='type-id-5900' visibility='default' filepath='include/net/xfrm.h' line='590' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='walk' type-id='type-id-5901' visibility='default' filepath='include/net/xfrm.h' line='591' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='polq' type-id='type-id-5902' visibility='default' filepath='include/net/xfrm.h' line='592' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='type' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='593' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2888'>
+          <var-decl name='action' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='594' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2896'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='595' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2904'>
+          <var-decl name='xfrm_nr' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='596' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2912'>
+          <var-decl name='family' type-id='type-id-688' visibility='default' filepath='include/net/xfrm.h' line='597' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='security' type-id='type-id-5903' visibility='default' filepath='include/net/xfrm.h' line='598' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='xfrm_vec' type-id='type-id-5890' visibility='default' filepath='include/net/xfrm.h' line='599' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/xfrm.h' line='600' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_mark' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='317' column='1' id='type-id-5897'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='v' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='m' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='319' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_selector' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='49' column='1' id='type-id-5898'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='daddr' type-id='type-id-5904' visibility='default' filepath='include/uapi/linux/xfrm.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='saddr' type-id='type-id-5904' visibility='default' filepath='include/uapi/linux/xfrm.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dport' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/xfrm.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='dport_mask' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/xfrm.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='sport' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/xfrm.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='304'>
+          <var-decl name='sport_mask' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/xfrm.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='family' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/xfrm.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='336'>
+          <var-decl name='prefixlen_d' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/xfrm.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='344'>
+          <var-decl name='prefixlen_s' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/xfrm.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='proto' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/xfrm.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ifindex' type-id='type-id-17' visibility='default' filepath='include/uapi/linux/xfrm.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='user' type-id='type-id-1310' visibility='default' filepath='include/uapi/linux/xfrm.h' line='61' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='xfrm_address_t' type-id='type-id-5905' filepath='include/uapi/linux/xfrm.h' line='19' column='1' id='type-id-5904'/>
+      <union-decl name='__anonymous_union__5' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='15' column='1' id='type-id-5905'>
+        <data-member access='private'>
+          <var-decl name='a4' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/xfrm.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='a6' type-id='type-id-929' visibility='default' filepath='include/uapi/linux/xfrm.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='in6' type-id='type-id-2250' visibility='default' filepath='include/uapi/linux/xfrm.h' line='18' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='xfrm_lifetime_cfg' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='66' column='1' id='type-id-5899'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='soft_byte_limit' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='hard_byte_limit' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='soft_packet_limit' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='hard_packet_limit' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='soft_add_expires_seconds' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='hard_add_expires_seconds' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='soft_use_expires_seconds' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='hard_use_expires_seconds' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='74' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_lifetime_cur' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='77' column='1' id='type-id-5900'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bytes' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='packets' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='add_time' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='use_time' type-id='type-id-100' visibility='default' filepath='include/uapi/linux/xfrm.h' line='81' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_policy_walk_entry' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='556' column='1' id='type-id-5901'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='all' type-id='type-id-20' visibility='default' filepath='include/net/xfrm.h' line='557' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dead' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='558' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_policy_queue' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='567' column='1' id='type-id-5902'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hold_queue' type-id='type-id-1659' visibility='default' filepath='include/net/xfrm.h' line='568' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='hold_timer' type-id='type-id-417' visibility='default' filepath='include/net/xfrm.h' line='569' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='timeout' type-id='type-id-16' visibility='default' filepath='include/net/xfrm.h' line='570' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_sec_ctx' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='31' column='1' id='type-id-5906'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ctx_doi' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/xfrm.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='ctx_alg' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/xfrm.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='ctx_len' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/xfrm.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ctx_sid' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ctx_str' type-id='type-id-440' visibility='default' filepath='include/uapi/linux/xfrm.h' line='36' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_tmpl' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='519' column='1' id='type-id-5889'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='id' type-id='type-id-5907' visibility='default' filepath='include/net/xfrm.h' line='526' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='saddr' type-id='type-id-5904' visibility='default' filepath='include/net/xfrm.h' line='529' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='encap_family' type-id='type-id-312' visibility='default' filepath='include/net/xfrm.h' line='531' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='reqid' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='533' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='mode' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='536' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='392'>
+          <var-decl name='share' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='539' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='400'>
+          <var-decl name='optional' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='542' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='408'>
+          <var-decl name='allalgs' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='545' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='aalgos' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='548' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ealgos' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='549' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='calgos' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='550' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_id' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='25' column='1' id='type-id-5907'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='daddr' type-id='type-id-5904' visibility='default' filepath='include/uapi/linux/xfrm.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='spi' type-id='type-id-927' visibility='default' filepath='include/uapi/linux/xfrm.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='proto' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/xfrm.h' line='28' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nd_opt_hdr' size-in-bits='16' is-struct='yes' visibility='default' filepath='include/net/ndisc.h' line='102' column='1' id='type-id-5908'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nd_opt_type' type-id='type-id-893' visibility='default' filepath='include/net/ndisc.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='nd_opt_len' type-id='type-id-893' visibility='default' filepath='include/net/ndisc.h' line='104' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ndisc_options' size-in-bits='1216' is-struct='yes' visibility='default' filepath='include/net/ndisc.h' line='108' column='1' id='type-id-5909'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nd_opt_array' type-id='type-id-5883' visibility='default' filepath='include/net/ndisc.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='nd_opts_ri' type-id='type-id-5882' visibility='default' filepath='include/net/ndisc.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='nd_opts_ri_end' type-id='type-id-5882' visibility='default' filepath='include/net/ndisc.h' line='112' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='nd_useropts' type-id='type-id-5882' visibility='default' filepath='include/net/ndisc.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='nd_useropts_end' type-id='type-id-5882' visibility='default' filepath='include/net/ndisc.h' line='115' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='neighbour' size-in-bits='2688' is-struct='yes' visibility='default' filepath='include/net/neighbour.h' line='135' column='1' id='type-id-5910'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-5911' visibility='default' filepath='include/net/neighbour.h' line='136' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tbl' type-id='type-id-5912' visibility='default' filepath='include/net/neighbour.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='parms' type-id='type-id-5913' visibility='default' filepath='include/net/neighbour.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='confirmed' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='updated' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='lock' type-id='type-id-885' visibility='default' filepath='include/net/neighbour.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/net/neighbour.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='arp_queue' type-id='type-id-1659' visibility='default' filepath='include/net/neighbour.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='arp_queue_len_bytes' type-id='type-id-5' visibility='default' filepath='include/net/neighbour.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='timer' type-id='type-id-417' visibility='default' filepath='include/net/neighbour.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='used' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='probes' type-id='type-id-26' visibility='default' filepath='include/net/neighbour.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='flags' type-id='type-id-893' visibility='default' filepath='include/net/neighbour.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1128'>
+          <var-decl name='nud_state' type-id='type-id-893' visibility='default' filepath='include/net/neighbour.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1136'>
+          <var-decl name='type' type-id='type-id-893' visibility='default' filepath='include/net/neighbour.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1144'>
+          <var-decl name='dead' type-id='type-id-893' visibility='default' filepath='include/net/neighbour.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='ha_lock' type-id='type-id-1917' visibility='default' filepath='include/net/neighbour.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='ha' type-id='type-id-35' visibility='default' filepath='include/net/neighbour.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='hh' type-id='type-id-1916' visibility='default' filepath='include/net/neighbour.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='output' type-id='type-id-5914' visibility='default' filepath='include/net/neighbour.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='ops' type-id='type-id-5915' visibility='default' filepath='include/net/neighbour.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/neighbour.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/net/neighbour.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='primary_key' type-id='type-id-5885' visibility='default' filepath='include/net/neighbour.h' line='159' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='neigh_table' size-in-bits='3648' is-struct='yes' visibility='default' filepath='include/net/neighbour.h' line='192' column='1' id='type-id-5916'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-17' visibility='default' filepath='include/net/neighbour.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='entry_size' type-id='type-id-5' visibility='default' filepath='include/net/neighbour.h' line='194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='key_len' type-id='type-id-5' visibility='default' filepath='include/net/neighbour.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='protocol' type-id='type-id-924' visibility='default' filepath='include/net/neighbour.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hash' type-id='type-id-5917' visibility='default' filepath='include/net/neighbour.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='key_eq' type-id='type-id-5918' visibility='default' filepath='include/net/neighbour.h' line='200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='constructor' type-id='type-id-5919' visibility='default' filepath='include/net/neighbour.h' line='201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='pconstructor' type-id='type-id-5920' visibility='default' filepath='include/net/neighbour.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='pdestructor' type-id='type-id-5921' visibility='default' filepath='include/net/neighbour.h' line='203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='proxy_redo' type-id='type-id-1768' visibility='default' filepath='include/net/neighbour.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='id' type-id='type-id-2' visibility='default' filepath='include/net/neighbour.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='parms' type-id='type-id-5922' visibility='default' filepath='include/net/neighbour.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='parms_list' type-id='type-id-20' visibility='default' filepath='include/net/neighbour.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='gc_interval' type-id='type-id-17' visibility='default' filepath='include/net/neighbour.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1888'>
+          <var-decl name='gc_thresh1' type-id='type-id-17' visibility='default' filepath='include/net/neighbour.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='gc_thresh2' type-id='type-id-17' visibility='default' filepath='include/net/neighbour.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1952'>
+          <var-decl name='gc_thresh3' type-id='type-id-17' visibility='default' filepath='include/net/neighbour.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='last_flush' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='gc_work' type-id='type-id-411' visibility='default' filepath='include/net/neighbour.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='proxy_timer' type-id='type-id-417' visibility='default' filepath='include/net/neighbour.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='proxy_queue' type-id='type-id-1659' visibility='default' filepath='include/net/neighbour.h' line='215' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='entries' type-id='type-id-26' visibility='default' filepath='include/net/neighbour.h' line='216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3296'>
+          <var-decl name='lock' type-id='type-id-885' visibility='default' filepath='include/net/neighbour.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='last_rand' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='stats' type-id='type-id-5923' visibility='default' filepath='include/net/neighbour.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='nht' type-id='type-id-5924' visibility='default' filepath='include/net/neighbour.h' line='220' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='phash_buckets' type-id='type-id-5925' visibility='default' filepath='include/net/neighbour.h' line='221' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='pneigh_entry' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/neighbour.h' line='170' column='1' id='type-id-5926'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-5927' visibility='default' filepath='include/net/neighbour.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='net' type-id='type-id-1690' visibility='default' filepath='include/net/neighbour.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/net/neighbour.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/net/neighbour.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='136'>
+          <var-decl name='key' type-id='type-id-5885' visibility='default' filepath='include/net/neighbour.h' line='175' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='neigh_parms' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/net/neighbour.h' line='70' column='1' id='type-id-5922'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='net' type-id='type-id-1690' visibility='default' filepath='include/net/neighbour.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/net/neighbour.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/neighbour.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='neigh_setup' type-id='type-id-5919' visibility='default' filepath='include/net/neighbour.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='neigh_cleanup' type-id='type-id-5928' visibility='default' filepath='include/net/neighbour.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='tbl' type-id='type-id-5912' visibility='default' filepath='include/net/neighbour.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='sysctl_table' type-id='type-id-15' visibility='default' filepath='include/net/neighbour.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='dead' type-id='type-id-17' visibility='default' filepath='include/net/neighbour.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/net/neighbour.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/net/neighbour.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='reachable_time' type-id='type-id-17' visibility='default' filepath='include/net/neighbour.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='data' type-id='type-id-5880' visibility='default' filepath='include/net/neighbour.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='data_state' type-id='type-id-491' visibility='default' filepath='include/net/neighbour.h' line='86' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='neigh_statistics' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/net/neighbour.h' line='113' column='1' id='type-id-5929'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='allocs' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='114' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='destroys' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='115' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hash_grows' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='res_failed' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='lookups' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='hits' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='rcv_probes_mcast' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='rcv_probes_ucast' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='periodic_gc_runs' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='forced_gc_runs' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='unres_discards' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='table_fulls' type-id='type-id-16' visibility='default' filepath='include/net/neighbour.h' line='130' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='neigh_hash_table' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/neighbour.h' line='184' column='1' id='type-id-5930'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hash_buckets' type-id='type-id-5931' visibility='default' filepath='include/net/neighbour.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='hash_shift' type-id='type-id-5' visibility='default' filepath='include/net/neighbour.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='hash_rnd' type-id='type-id-4449' visibility='default' filepath='include/net/neighbour.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/neighbour.h' line='188' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='neigh_ops' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/neighbour.h' line='162' column='1' id='type-id-5932'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-17' visibility='default' filepath='include/net/neighbour.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='solicit' type-id='type-id-5933' visibility='default' filepath='include/net/neighbour.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='error_report' type-id='type-id-5933' visibility='default' filepath='include/net/neighbour.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='output' type-id='type-id-5914' visibility='default' filepath='include/net/neighbour.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='connected_output' type-id='type-id-5914' visibility='default' filepath='include/net/neighbour.h' line='167' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='tcp_ca_event' filepath='include/net/tcp.h' line='955' column='1' id='type-id-5934'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='CA_EVENT_TX_START' value='0'/>
+        <enumerator name='CA_EVENT_CWND_RESTART' value='1'/>
+        <enumerator name='CA_EVENT_COMPLETE_CWR' value='2'/>
+        <enumerator name='CA_EVENT_LOSS' value='3'/>
+        <enumerator name='CA_EVENT_ECN_NO_CE' value='4'/>
+        <enumerator name='CA_EVENT_ECN_IS_CE' value='5'/>
+      </enum-decl>
+      <class-decl name='ack_sample' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/net/tcp.h' line='987' column='1' id='type-id-5935'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pkts_acked' type-id='type-id-7' visibility='default' filepath='include/net/tcp.h' line='988' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='rtt_us' type-id='type-id-738' visibility='default' filepath='include/net/tcp.h' line='989' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='in_flight' type-id='type-id-7' visibility='default' filepath='include/net/tcp.h' line='990' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rate_sample' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/net/tcp.h' line='1001' column='1' id='type-id-5936'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prior_mstamp' type-id='type-id-40' visibility='default' filepath='include/net/tcp.h' line='1002' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prior_delivered' type-id='type-id-7' visibility='default' filepath='include/net/tcp.h' line='1003' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='delivered' type-id='type-id-738' visibility='default' filepath='include/net/tcp.h' line='1004' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='interval_us' type-id='type-id-192' visibility='default' filepath='include/net/tcp.h' line='1005' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='snd_interval_us' type-id='type-id-7' visibility='default' filepath='include/net/tcp.h' line='1006' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='rcv_interval_us' type-id='type-id-7' visibility='default' filepath='include/net/tcp.h' line='1007' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rtt_us' type-id='type-id-192' visibility='default' filepath='include/net/tcp.h' line='1008' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='losses' type-id='type-id-17' visibility='default' filepath='include/net/tcp.h' line='1009' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='acked_sacked' type-id='type-id-7' visibility='default' filepath='include/net/tcp.h' line='1010' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='prior_in_flight' type-id='type-id-7' visibility='default' filepath='include/net/tcp.h' line='1011' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='is_app_limited' type-id='type-id-33' visibility='default' filepath='include/net/tcp.h' line='1012' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='424'>
+          <var-decl name='is_retrans' type-id='type-id-33' visibility='default' filepath='include/net/tcp.h' line='1013' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='432'>
+          <var-decl name='is_ack_delayed' type-id='type-id-33' visibility='default' filepath='include/net/tcp.h' line='1014' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fib6_node' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/ip6_fib.h' line='71' column='1' id='type-id-5937'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='parent' type-id='type-id-5938' visibility='default' filepath='include/net/ip6_fib.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='left' type-id='type-id-5938' visibility='default' filepath='include/net/ip6_fib.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='right' type-id='type-id-5938' visibility='default' filepath='include/net/ip6_fib.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='leaf' type-id='type-id-2264' visibility='default' filepath='include/net/ip6_fib.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='fn_bit' type-id='type-id-108' visibility='default' filepath='include/net/ip6_fib.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='fn_flags' type-id='type-id-108' visibility='default' filepath='include/net/ip6_fib.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='fn_sernum' type-id='type-id-17' visibility='default' filepath='include/net/ip6_fib.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='rr_ptr' type-id='type-id-2264' visibility='default' filepath='include/net/ip6_fib.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/ip6_fib.h' line='84' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='dst_metrics' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/net/dst.h' line='93' column='1' id='type-id-5939'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='metrics' type-id='type-id-4473' visibility='default' filepath='include/net/dst.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/net/dst.h' line='95' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rt6key' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/net/ip6_fib.h' line='103' column='1' id='type-id-5940'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='addr' type-id='type-id-2250' visibility='default' filepath='include/net/ip6_fib.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='plen' type-id='type-id-17' visibility='default' filepath='include/net/ip6_fib.h' line='105' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rt6_info' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/net/ip6_fib.h' line='181' column='1' id='type-id-5941'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dst' type-id='type-id-5724' visibility='default' filepath='include/net/ip6_fib.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='from' type-id='type-id-2264' visibility='default' filepath='include/net/ip6_fib.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='rt6i_dst' type-id='type-id-5940' visibility='default' filepath='include/net/ip6_fib.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='rt6i_src' type-id='type-id-5940' visibility='default' filepath='include/net/ip6_fib.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='rt6i_gateway' type-id='type-id-2250' visibility='default' filepath='include/net/ip6_fib.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='rt6i_idev' type-id='type-id-5942' visibility='default' filepath='include/net/ip6_fib.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='rt6i_flags' type-id='type-id-7' visibility='default' filepath='include/net/ip6_fib.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='rt6i_prefsrc' type-id='type-id-5940' visibility='default' filepath='include/net/ip6_fib.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='rt6i_uncached' type-id='type-id-20' visibility='default' filepath='include/net/ip6_fib.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='rt6i_uncached_list' type-id='type-id-5943' visibility='default' filepath='include/net/ip6_fib.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='rt6i_nfheader_len' type-id='type-id-312' visibility='default' filepath='include/net/ip6_fib.h' line='196' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='inet6_dev' size-in-bits='4864' is-struct='yes' visibility='default' filepath='include/net/if_inet6.h' line='166' column='1' id='type-id-5944'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/net/if_inet6.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='addr_list' type-id='type-id-20' visibility='default' filepath='include/net/if_inet6.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mc_list' type-id='type-id-5945' visibility='default' filepath='include/net/if_inet6.h' line='171' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mc_tomb' type-id='type-id-5945' visibility='default' filepath='include/net/if_inet6.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mc_lock' type-id='type-id-247' visibility='default' filepath='include/net/if_inet6.h' line='173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='mc_qrv' type-id='type-id-216' visibility='default' filepath='include/net/if_inet6.h' line='175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='360'>
+          <var-decl name='mc_gq_running' type-id='type-id-216' visibility='default' filepath='include/net/if_inet6.h' line='176' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='368'>
+          <var-decl name='mc_ifc_count' type-id='type-id-216' visibility='default' filepath='include/net/if_inet6.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='376'>
+          <var-decl name='mc_dad_count' type-id='type-id-216' visibility='default' filepath='include/net/if_inet6.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='mc_v1_seen' type-id='type-id-16' visibility='default' filepath='include/net/if_inet6.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='mc_qi' type-id='type-id-16' visibility='default' filepath='include/net/if_inet6.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='mc_qri' type-id='type-id-16' visibility='default' filepath='include/net/if_inet6.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mc_maxdelay' type-id='type-id-16' visibility='default' filepath='include/net/if_inet6.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='mc_gq_timer' type-id='type-id-417' visibility='default' filepath='include/net/if_inet6.h' line='185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='mc_ifc_timer' type-id='type-id-417' visibility='default' filepath='include/net/if_inet6.h' line='186' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='mc_dad_timer' type-id='type-id-417' visibility='default' filepath='include/net/if_inet6.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='ac_list' type-id='type-id-5946' visibility='default' filepath='include/net/if_inet6.h' line='189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='lock' type-id='type-id-885' visibility='default' filepath='include/net/if_inet6.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/net/if_inet6.h' line='191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1760'>
+          <var-decl name='if_flags' type-id='type-id-511' visibility='default' filepath='include/net/if_inet6.h' line='192' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='dead' type-id='type-id-17' visibility='default' filepath='include/net/if_inet6.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1824'>
+          <var-decl name='desync_factor' type-id='type-id-7' visibility='default' filepath='include/net/if_inet6.h' line='195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='rndid' type-id='type-id-1184' visibility='default' filepath='include/net/if_inet6.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='tempaddr_list' type-id='type-id-20' visibility='default' filepath='include/net/if_inet6.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='token' type-id='type-id-2250' visibility='default' filepath='include/net/if_inet6.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='nd_parms' type-id='type-id-5913' visibility='default' filepath='include/net/if_inet6.h' line='201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='cnf' type-id='type-id-1028' visibility='default' filepath='include/net/if_inet6.h' line='202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='stats' type-id='type-id-5947' visibility='default' filepath='include/net/if_inet6.h' line='203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='rs_timer' type-id='type-id-417' visibility='default' filepath='include/net/if_inet6.h' line='205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='rs_interval' type-id='type-id-653' visibility='default' filepath='include/net/if_inet6.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4640'>
+          <var-decl name='rs_probes' type-id='type-id-893' visibility='default' filepath='include/net/if_inet6.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='tstamp' type-id='type-id-16' visibility='default' filepath='include/net/if_inet6.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/if_inet6.h' line='210' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ifmcaddr6' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/net/if_inet6.h' line='119' column='1' id='type-id-5948'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mca_addr' type-id='type-id-2250' visibility='default' filepath='include/net/if_inet6.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='idev' type-id='type-id-5942' visibility='default' filepath='include/net/if_inet6.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='next' type-id='type-id-5945' visibility='default' filepath='include/net/if_inet6.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mca_sources' type-id='type-id-5949' visibility='default' filepath='include/net/if_inet6.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mca_tomb' type-id='type-id-5949' visibility='default' filepath='include/net/if_inet6.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='mca_sfmode' type-id='type-id-5' visibility='default' filepath='include/net/if_inet6.h' line='125' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='mca_crcount' type-id='type-id-216' visibility='default' filepath='include/net/if_inet6.h' line='126' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='mca_sfcount' type-id='type-id-219' visibility='default' filepath='include/net/if_inet6.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mca_timer' type-id='type-id-417' visibility='default' filepath='include/net/if_inet6.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='mca_flags' type-id='type-id-5' visibility='default' filepath='include/net/if_inet6.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='mca_users' type-id='type-id-17' visibility='default' filepath='include/net/if_inet6.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='mca_refcnt' type-id='type-id-421' visibility='default' filepath='include/net/if_inet6.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='mca_lock' type-id='type-id-247' visibility='default' filepath='include/net/if_inet6.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='mca_cstamp' type-id='type-id-16' visibility='default' filepath='include/net/if_inet6.h' line='133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='mca_tstamp' type-id='type-id-16' visibility='default' filepath='include/net/if_inet6.h' line='134' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ip6_sf_list' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/if_inet6.h' line='104' column='1' id='type-id-5950'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sf_next' type-id='type-id-5949' visibility='default' filepath='include/net/if_inet6.h' line='105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sf_addr' type-id='type-id-2250' visibility='default' filepath='include/net/if_inet6.h' line='106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sf_count' type-id='type-id-219' visibility='default' filepath='include/net/if_inet6.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='sf_gsresp' type-id='type-id-216' visibility='default' filepath='include/net/if_inet6.h' line='108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='328'>
+          <var-decl name='sf_oldin' type-id='type-id-216' visibility='default' filepath='include/net/if_inet6.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='336'>
+          <var-decl name='sf_crcount' type-id='type-id-216' visibility='default' filepath='include/net/if_inet6.h' line='110' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ifacaddr6' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/net/if_inet6.h' line='145' column='1' id='type-id-5951'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='aca_addr' type-id='type-id-2250' visibility='default' filepath='include/net/if_inet6.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='aca_rt' type-id='type-id-2264' visibility='default' filepath='include/net/if_inet6.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='aca_next' type-id='type-id-5946' visibility='default' filepath='include/net/if_inet6.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='aca_users' type-id='type-id-17' visibility='default' filepath='include/net/if_inet6.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='aca_refcnt' type-id='type-id-421' visibility='default' filepath='include/net/if_inet6.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='aca_cstamp' type-id='type-id-16' visibility='default' filepath='include/net/if_inet6.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='aca_tstamp' type-id='type-id-16' visibility='default' filepath='include/net/if_inet6.h' line='152' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ipv6_devstat' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/if_inet6.h' line='159' column='1' id='type-id-5947'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='proc_dir_entry' type-id='type-id-262' visibility='default' filepath='include/net/if_inet6.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ipv6' type-id='type-id-2205' visibility='default' filepath='include/net/if_inet6.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='icmpv6dev' type-id='type-id-5952' visibility='default' filepath='include/net/if_inet6.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='icmpv6msgdev' type-id='type-id-5953' visibility='default' filepath='include/net/if_inet6.h' line='163' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='icmpv6_mib_device' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='80' column='1' id='type-id-5954'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-5869' visibility='default' filepath='include/net/snmp.h' line='81' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='icmpv6msg_mib_device' size-in-bits='32768' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='90' column='1' id='type-id-5955'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mibs' type-id='type-id-948' visibility='default' filepath='include/net/snmp.h' line='91' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rt6_exception_bucket' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/ip6_fib.h' line='110' column='1' id='type-id-5956'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chain' type-id='type-id-186' visibility='default' filepath='include/net/ip6_fib.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='depth' type-id='type-id-17' visibility='default' filepath='include/net/ip6_fib.h' line='112' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='fib6_nh' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/ip6_fib.h' line='126' column='1' id='type-id-5957'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nh_gw' type-id='type-id-2250' visibility='default' filepath='include/net/ip6_fib.h' line='127' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='nh_dev' type-id='type-id-1648' visibility='default' filepath='include/net/ip6_fib.h' line='128' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='nh_lwtstate' type-id='type-id-5727' visibility='default' filepath='include/net/ip6_fib.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='nh_flags' type-id='type-id-5' visibility='default' filepath='include/net/ip6_fib.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='nh_upper_bound' type-id='type-id-26' visibility='default' filepath='include/net/ip6_fib.h' line='132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='nh_weight' type-id='type-id-17' visibility='default' filepath='include/net/ip6_fib.h' line='133' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_state' size-in-bits='6016' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='136' column='1' id='type-id-5958'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='xs_net' type-id='type-id-1690' visibility='default' filepath='include/net/xfrm.h' line='137' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='' type-id='type-id-5959' visibility='default' filepath='include/net/xfrm.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bysrc' type-id='type-id-520' visibility='default' filepath='include/net/xfrm.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='byspi' type-id='type-id-520' visibility='default' filepath='include/net/xfrm.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/net/xfrm.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/net/xfrm.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='id' type-id='type-id-5907' visibility='default' filepath='include/net/xfrm.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='sel' type-id='type-id-5898' visibility='default' filepath='include/net/xfrm.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='mark' type-id='type-id-5897' visibility='default' filepath='include/net/xfrm.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='if_id' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='tfcpad' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='genid' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='km' type-id='type-id-5960' visibility='default' filepath='include/net/xfrm.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='props' type-id='type-id-5961' visibility='default' filepath='include/net/xfrm.h' line='172' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='lft' type-id='type-id-5899' visibility='default' filepath='include/net/xfrm.h' line='174' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='aalg' type-id='type-id-5962' visibility='default' filepath='include/net/xfrm.h' line='177' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='ealg' type-id='type-id-5963' visibility='default' filepath='include/net/xfrm.h' line='178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='calg' type-id='type-id-5963' visibility='default' filepath='include/net/xfrm.h' line='179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='aead' type-id='type-id-5964' visibility='default' filepath='include/net/xfrm.h' line='180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='geniv' type-id='type-id-4' visibility='default' filepath='include/net/xfrm.h' line='181' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='encap' type-id='type-id-5965' visibility='default' filepath='include/net/xfrm.h' line='184' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='coaddr' type-id='type-id-5966' visibility='default' filepath='include/net/xfrm.h' line='187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='tunnel' type-id='type-id-5233' visibility='default' filepath='include/net/xfrm.h' line='190' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='tunnel_users' type-id='type-id-26' visibility='default' filepath='include/net/xfrm.h' line='193' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2976'>
+          <var-decl name='replay' type-id='type-id-5967' visibility='default' filepath='include/net/xfrm.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='replay_esn' type-id='type-id-5968' visibility='default' filepath='include/net/xfrm.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='preplay' type-id='type-id-5967' visibility='default' filepath='include/net/xfrm.h' line='200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='preplay_esn' type-id='type-id-5968' visibility='default' filepath='include/net/xfrm.h' line='201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='repl' type-id='type-id-5969' visibility='default' filepath='include/net/xfrm.h' line='204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='xflags' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3424'>
+          <var-decl name='replay_maxage' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='replay_maxdiff' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='rtimer' type-id='type-id-417' visibility='default' filepath='include/net/xfrm.h' line='216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='stats' type-id='type-id-5970' visibility='default' filepath='include/net/xfrm.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='curlft' type-id='type-id-5900' visibility='default' filepath='include/net/xfrm.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='mtimer' type-id='type-id-5971' visibility='default' filepath='include/net/xfrm.h' line='222' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='xso' type-id='type-id-5972' visibility='default' filepath='include/net/xfrm.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='saved_tmo' type-id='type-id-192' visibility='default' filepath='include/net/xfrm.h' line='227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='lastused' type-id='type-id-1339' visibility='default' filepath='include/net/xfrm.h' line='230' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='xfrag' type-id='type-id-1534' visibility='default' filepath='include/net/xfrm.h' line='232' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='type' type-id='type-id-5873' visibility='default' filepath='include/net/xfrm.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5632'>
+          <var-decl name='inner_mode' type-id='type-id-5887' visibility='default' filepath='include/net/xfrm.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5696'>
+          <var-decl name='inner_mode_iaf' type-id='type-id-5887' visibility='default' filepath='include/net/xfrm.h' line='238' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='outer_mode' type-id='type-id-5887' visibility='default' filepath='include/net/xfrm.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='type_offload' type-id='type-id-5876' visibility='default' filepath='include/net/xfrm.h' line='241' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='security' type-id='type-id-5903' visibility='default' filepath='include/net/xfrm.h' line='244' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5952'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/net/xfrm.h' line='248' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_state_walk' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='119' column='1' id='type-id-5960'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='all' type-id='type-id-20' visibility='default' filepath='include/net/xfrm.h' line='120' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='state' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='121' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='136'>
+          <var-decl name='dying' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='122' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='144'>
+          <var-decl name='proto' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='seq' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='filter' type-id='type-id-5973' visibility='default' filepath='include/net/xfrm.h' line='125' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_address_filter' size-in-bits='288' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='495' column='1' id='type-id-5974'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='saddr' type-id='type-id-5904' visibility='default' filepath='include/uapi/linux/xfrm.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='daddr' type-id='type-id-5904' visibility='default' filepath='include/uapi/linux/xfrm.h' line='497' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='family' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/xfrm.h' line='498' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='splen' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/xfrm.h' line='499' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='280'>
+          <var-decl name='dplen' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/xfrm.h' line='500' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/xfrm.h' line='160' column='1' id='type-id-5961'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='reqid' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='mode' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='replay_window' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='aalgo' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='ealgo' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='calgo' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='164' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='72'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='family' type-id='type-id-688' visibility='default' filepath='include/net/xfrm.h' line='166' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='saddr' type-id='type-id-5904' visibility='default' filepath='include/net/xfrm.h' line='167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='header_len' type-id='type-id-17' visibility='default' filepath='include/net/xfrm.h' line='168' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='trailer_len' type-id='type-id-17' visibility='default' filepath='include/net/xfrm.h' line='169' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='extra_flags' type-id='type-id-7' visibility='default' filepath='include/net/xfrm.h' line='170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='smark' type-id='type-id-5897' visibility='default' filepath='include/net/xfrm.h' line='171' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_algo_auth' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='108' column='1' id='type-id-5975'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='alg_name' type-id='type-id-250' visibility='default' filepath='include/uapi/linux/xfrm.h' line='109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='alg_key_len' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/xfrm.h' line='110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='alg_trunc_len' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/xfrm.h' line='111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='alg_key' type-id='type-id-440' visibility='default' filepath='include/uapi/linux/xfrm.h' line='112' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_algo' size-in-bits='544' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='102' column='1' id='type-id-5976'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='alg_name' type-id='type-id-250' visibility='default' filepath='include/uapi/linux/xfrm.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='alg_key_len' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/xfrm.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='alg_key' type-id='type-id-440' visibility='default' filepath='include/uapi/linux/xfrm.h' line='105' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_algo_aead' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='115' column='1' id='type-id-5977'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='alg_name' type-id='type-id-250' visibility='default' filepath='include/uapi/linux/xfrm.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='alg_key_len' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/xfrm.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='alg_icv_len' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/xfrm.h' line='118' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='alg_key' type-id='type-id-440' visibility='default' filepath='include/uapi/linux/xfrm.h' line='119' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_encap_tmpl' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='249' column='1' id='type-id-5978'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='encap_type' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/xfrm.h' line='250' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='encap_sport' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/xfrm.h' line='251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='encap_dport' type-id='type-id-924' visibility='default' filepath='include/uapi/linux/xfrm.h' line='252' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='encap_oa' type-id='type-id-5904' visibility='default' filepath='include/uapi/linux/xfrm.h' line='253' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_replay_state' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='84' column='1' id='type-id-5967'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='oseq' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='seq' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bitmap' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='87' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_replay_state_esn' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='92' column='1' id='type-id-5979'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bmp_len' type-id='type-id-5' visibility='default' filepath='include/uapi/linux/xfrm.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='oseq' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='seq' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='oseq_hi' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='seq_hi' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='replay_window' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='bmp' type-id='type-id-934' visibility='default' filepath='include/uapi/linux/xfrm.h' line='99' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_replay' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='285' column='1' id='type-id-5980'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='advance' type-id='type-id-5981' visibility='default' filepath='include/net/xfrm.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='check' type-id='type-id-5982' visibility='default' filepath='include/net/xfrm.h' line='287' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='recheck' type-id='type-id-5982' visibility='default' filepath='include/net/xfrm.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='notify' type-id='type-id-5983' visibility='default' filepath='include/net/xfrm.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='overflow' type-id='type-id-5984' visibility='default' filepath='include/net/xfrm.h' line='294' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_stats' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='122' column='1' id='type-id-5970'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='replay_window' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='123' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='replay' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='integrity_failed' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/xfrm.h' line='125' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='tasklet_hrtimer' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/linux/interrupt.h' line='626' column='1' id='type-id-5971'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='timer' type-id='type-id-681' visibility='default' filepath='include/linux/interrupt.h' line='627' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='tasklet' type-id='type-id-3298' visibility='default' filepath='include/linux/interrupt.h' line='628' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='function' type-id='type-id-1551' visibility='default' filepath='include/linux/interrupt.h' line='629' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_state_offload' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='128' column='1' id='type-id-5972'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/net/xfrm.h' line='129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='offload_handle' type-id='type-id-16' visibility='default' filepath='include/net/xfrm.h' line='130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='num_exthdrs' type-id='type-id-5' visibility='default' filepath='include/net/xfrm.h' line='131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='132' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_type' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='390' column='1' id='type-id-5985'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='description' type-id='type-id-2' visibility='default' filepath='include/net/xfrm.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/net/xfrm.h' line='392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='proto' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='393' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='136'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='init_state' type-id='type-id-5986' visibility='default' filepath='include/net/xfrm.h' line='400' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='destructor' type-id='type-id-5987' visibility='default' filepath='include/net/xfrm.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='input' type-id='type-id-5984' visibility='default' filepath='include/net/xfrm.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='output' type-id='type-id-5984' visibility='default' filepath='include/net/xfrm.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='reject' type-id='type-id-5988' visibility='default' filepath='include/net/xfrm.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='hdr_offset' type-id='type-id-5989' visibility='default' filepath='include/net/xfrm.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='get_mtu' type-id='type-id-5990' visibility='default' filepath='include/net/xfrm.h' line='408' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_mode' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='426' column='1' id='type-id-5991'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='input2' type-id='type-id-5984' visibility='default' filepath='include/net/xfrm.h' line='438' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='input' type-id='type-id-5984' visibility='default' filepath='include/net/xfrm.h' line='448' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='output2' type-id='type-id-5984' visibility='default' filepath='include/net/xfrm.h' line='461' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='output' type-id='type-id-5984' visibility='default' filepath='include/net/xfrm.h' line='472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='gso_segment' type-id='type-id-5992' visibility='default' filepath='include/net/xfrm.h' line='477' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='xmit' type-id='type-id-5993' visibility='default' filepath='include/net/xfrm.h' line='482' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='afinfo' type-id='type-id-5994' visibility='default' filepath='include/net/xfrm.h' line='484' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/net/xfrm.h' line='485' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='encap' type-id='type-id-5' visibility='default' filepath='include/net/xfrm.h' line='486' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='flags' type-id='type-id-17' visibility='default' filepath='include/net/xfrm.h' line='487' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_state_afinfo' size-in-bits='33984' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='344' column='1' id='type-id-5995'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-5' visibility='default' filepath='include/net/xfrm.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='proto' type-id='type-id-5' visibility='default' filepath='include/net/xfrm.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='eth_proto' type-id='type-id-924' visibility='default' filepath='include/net/xfrm.h' line='347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/net/xfrm.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='type_map' type-id='type-id-5874' visibility='default' filepath='include/net/xfrm.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16576'>
+          <var-decl name='type_offload_map' type-id='type-id-5877' visibility='default' filepath='include/net/xfrm.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32960'>
+          <var-decl name='mode_map' type-id='type-id-5888' visibility='default' filepath='include/net/xfrm.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33280'>
+          <var-decl name='init_flags' type-id='type-id-5986' visibility='default' filepath='include/net/xfrm.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33344'>
+          <var-decl name='init_tempsel' type-id='type-id-5996' visibility='default' filepath='include/net/xfrm.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33408'>
+          <var-decl name='init_temprop' type-id='type-id-5997' visibility='default' filepath='include/net/xfrm.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33472'>
+          <var-decl name='tmpl_sort' type-id='type-id-5998' visibility='default' filepath='include/net/xfrm.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33536'>
+          <var-decl name='state_sort' type-id='type-id-5999' visibility='default' filepath='include/net/xfrm.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33600'>
+          <var-decl name='output' type-id='type-id-2280' visibility='default' filepath='include/net/xfrm.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33664'>
+          <var-decl name='output_finish' type-id='type-id-5673' visibility='default' filepath='include/net/xfrm.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33728'>
+          <var-decl name='extract_input' type-id='type-id-5984' visibility='default' filepath='include/net/xfrm.h' line='364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33792'>
+          <var-decl name='extract_output' type-id='type-id-5984' visibility='default' filepath='include/net/xfrm.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33856'>
+          <var-decl name='transport_finish' type-id='type-id-6000' visibility='default' filepath='include/net/xfrm.h' line='368' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='33920'>
+          <var-decl name='local_error' type-id='type-id-6001' visibility='default' filepath='include/net/xfrm.h' line='370' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='xfrm_type_offload' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='414' column='1' id='type-id-6002'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='description' type-id='type-id-2' visibility='default' filepath='include/net/xfrm.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='owner' type-id='type-id-260' visibility='default' filepath='include/net/xfrm.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='proto' type-id='type-id-214' visibility='default' filepath='include/net/xfrm.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='encap' type-id='type-id-5993' visibility='default' filepath='include/net/xfrm.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='input_tail' type-id='type-id-5984' visibility='default' filepath='include/net/xfrm.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='xmit' type-id='type-id-6003' visibility='default' filepath='include/net/xfrm.h' line='420' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='timeval' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/time.h' line='16' column='1' id='type-id-6004'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tv_sec' type-id='type-id-1571' visibility='default' filepath='include/uapi/linux/time.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tv_usec' type-id='type-id-6005' visibility='default' filepath='include/uapi/linux/time.h' line='18' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='__kernel_suseconds_t' type-id='type-id-105' filepath='include/uapi/asm-generic/posix_types.h' line='41' column='1' id='type-id-6005'/>
+      <qualified-type-def type-id='type-id-5935' const='yes' id='type-id-6006'/>
+      <pointer-type-def type-id='type-id-6006' size-in-bits='64' id='type-id-6007'/>
+      <qualified-type-def type-id='type-id-5746' const='yes' id='type-id-6008'/>
+      <pointer-type-def type-id='type-id-6008' size-in-bits='64' id='type-id-6009'/>
+      <qualified-type-def type-id='type-id-5909' const='yes' id='type-id-6010'/>
+      <pointer-type-def type-id='type-id-6010' size-in-bits='64' id='type-id-6011'/>
+      <qualified-type-def type-id='type-id-5932' const='yes' id='type-id-6012'/>
+      <pointer-type-def type-id='type-id-6012' size-in-bits='64' id='type-id-5915'/>
+      <qualified-type-def type-id='type-id-5910' const='yes' id='type-id-6013'/>
+      <pointer-type-def type-id='type-id-6013' size-in-bits='64' id='type-id-6014'/>
+      <qualified-type-def type-id='type-id-5871' const='yes' id='type-id-6015'/>
+      <pointer-type-def type-id='type-id-6015' size-in-bits='64' id='type-id-6016'/>
+      <qualified-type-def type-id='type-id-5936' const='yes' id='type-id-6017'/>
+      <pointer-type-def type-id='type-id-6017' size-in-bits='64' id='type-id-6018'/>
+      <qualified-type-def type-id='type-id-5904' const='yes' id='type-id-6019'/>
+      <pointer-type-def type-id='type-id-6019' size-in-bits='64' id='type-id-6020'/>
+      <qualified-type-def type-id='type-id-5980' const='yes' id='type-id-6021'/>
+      <pointer-type-def type-id='type-id-6021' size-in-bits='64' id='type-id-5969'/>
+      <qualified-type-def type-id='type-id-5889' const='yes' id='type-id-6022'/>
+      <pointer-type-def type-id='type-id-6022' size-in-bits='64' id='type-id-6023'/>
+      <qualified-type-def type-id='type-id-5985' const='yes' id='type-id-6024'/>
+      <pointer-type-def type-id='type-id-6024' size-in-bits='64' id='type-id-5873'/>
+      <qualified-type-def type-id='type-id-6002' const='yes' id='type-id-6025'/>
+      <pointer-type-def type-id='type-id-6025' size-in-bits='64' id='type-id-5876'/>
+      <pointer-type-def type-id='type-id-5870' size-in-bits='64' id='type-id-6026'/>
+      <pointer-type-def type-id='type-id-5939' size-in-bits='64' id='type-id-6027'/>
+      <pointer-type-def type-id='type-id-5937' size-in-bits='64' id='type-id-5938'/>
+      <pointer-type-def type-id='type-id-5954' size-in-bits='64' id='type-id-5952'/>
+      <pointer-type-def type-id='type-id-5955' size-in-bits='64' id='type-id-5953'/>
+      <pointer-type-def type-id='type-id-5951' size-in-bits='64' id='type-id-5946'/>
+      <pointer-type-def type-id='type-id-5948' size-in-bits='64' id='type-id-5945'/>
+      <pointer-type-def type-id='type-id-2250' size-in-bits='64' id='type-id-6028'/>
+      <pointer-type-def type-id='type-id-5944' size-in-bits='64' id='type-id-5942'/>
+      <pointer-type-def type-id='type-id-5895' size-in-bits='64' id='type-id-6029'/>
+      <pointer-type-def type-id='type-id-5894' size-in-bits='64' id='type-id-6030'/>
+      <pointer-type-def type-id='type-id-5878' size-in-bits='64' id='type-id-6031'/>
+      <pointer-type-def type-id='type-id-6032' size-in-bits='64' id='type-id-6033'/>
+      <pointer-type-def type-id='type-id-6034' size-in-bits='64' id='type-id-6035'/>
+      <pointer-type-def type-id='type-id-6036' size-in-bits='64' id='type-id-5919'/>
+      <pointer-type-def type-id='type-id-6037' size-in-bits='64' id='type-id-5914'/>
+      <pointer-type-def type-id='type-id-6038' size-in-bits='64' id='type-id-5920'/>
+      <pointer-type-def type-id='type-id-6039' size-in-bits='64' id='type-id-6000'/>
+      <pointer-type-def type-id='type-id-6040' size-in-bits='64' id='type-id-6041'/>
+      <pointer-type-def type-id='type-id-6042' size-in-bits='64' id='type-id-5986'/>
+      <pointer-type-def type-id='type-id-6043' size-in-bits='64' id='type-id-5999'/>
+      <pointer-type-def type-id='type-id-6044' size-in-bits='64' id='type-id-5984'/>
+      <pointer-type-def type-id='type-id-6045' size-in-bits='64' id='type-id-5988'/>
+      <pointer-type-def type-id='type-id-6046' size-in-bits='64' id='type-id-5982'/>
+      <pointer-type-def type-id='type-id-6047' size-in-bits='64' id='type-id-6003'/>
+      <pointer-type-def type-id='type-id-6048' size-in-bits='64' id='type-id-5989'/>
+      <pointer-type-def type-id='type-id-6049' size-in-bits='64' id='type-id-5998'/>
+      <pointer-type-def type-id='type-id-5950' size-in-bits='64' id='type-id-5949'/>
+      <pointer-type-def type-id='type-id-5908' size-in-bits='64' id='type-id-5882'/>
+      <pointer-type-def type-id='type-id-5909' size-in-bits='64' id='type-id-6050'/>
+      <pointer-type-def type-id='type-id-5930' size-in-bits='64' id='type-id-5924'/>
+      <pointer-type-def type-id='type-id-5922' size-in-bits='64' id='type-id-5913'/>
+      <pointer-type-def type-id='type-id-5929' size-in-bits='64' id='type-id-5923'/>
+      <pointer-type-def type-id='type-id-5916' size-in-bits='64' id='type-id-5912'/>
+      <pointer-type-def type-id='type-id-5910' size-in-bits='64' id='type-id-5911'/>
+      <pointer-type-def type-id='type-id-5911' size-in-bits='64' id='type-id-5931'/>
+      <pointer-type-def type-id='type-id-1534' size-in-bits='64' id='type-id-6051'/>
+      <pointer-type-def type-id='type-id-5926' size-in-bits='64' id='type-id-5927'/>
+      <pointer-type-def type-id='type-id-5927' size-in-bits='64' id='type-id-5925'/>
+      <pointer-type-def type-id='type-id-5956' size-in-bits='64' id='type-id-6052'/>
+      <pointer-type-def type-id='type-id-5941' size-in-bits='64' id='type-id-6053'/>
+      <pointer-type-def type-id='type-id-6053' size-in-bits='64' id='type-id-6054'/>
+      <pointer-type-def type-id='type-id-6055' size-in-bits='64' id='type-id-5992'/>
+      <pointer-type-def type-id='type-id-5886' size-in-bits='64' id='type-id-6056'/>
+      <pointer-type-def type-id='type-id-6004' size-in-bits='64' id='type-id-6057'/>
+      <pointer-type-def type-id='type-id-6058' size-in-bits='64' id='type-id-5917'/>
+      <pointer-type-def type-id='type-id-6059' size-in-bits='64' id='type-id-5918'/>
+      <pointer-type-def type-id='type-id-6060' size-in-bits='64' id='type-id-6061'/>
+      <pointer-type-def type-id='type-id-6062' size-in-bits='64' id='type-id-6063'/>
+      <pointer-type-def type-id='type-id-6064' size-in-bits='64' id='type-id-5990'/>
+      <pointer-type-def type-id='type-id-3121' size-in-bits='64' id='type-id-6065'/>
+      <pointer-type-def type-id='type-id-5872' size-in-bits='64' id='type-id-5943'/>
+      <pointer-type-def type-id='type-id-6066' size-in-bits='64' id='type-id-6067'/>
+      <pointer-type-def type-id='type-id-6068' size-in-bits='64' id='type-id-6069'/>
+      <pointer-type-def type-id='type-id-6070' size-in-bits='64' id='type-id-5928'/>
+      <pointer-type-def type-id='type-id-6071' size-in-bits='64' id='type-id-5933'/>
+      <pointer-type-def type-id='type-id-6072' size-in-bits='64' id='type-id-6073'/>
+      <pointer-type-def type-id='type-id-6074' size-in-bits='64' id='type-id-5921'/>
+      <pointer-type-def type-id='type-id-6075' size-in-bits='64' id='type-id-6001'/>
+      <pointer-type-def type-id='type-id-6076' size-in-bits='64' id='type-id-6077'/>
+      <pointer-type-def type-id='type-id-6078' size-in-bits='64' id='type-id-6079'/>
+      <pointer-type-def type-id='type-id-6080' size-in-bits='64' id='type-id-6081'/>
+      <pointer-type-def type-id='type-id-6082' size-in-bits='64' id='type-id-6083'/>
+      <pointer-type-def type-id='type-id-6084' size-in-bits='64' id='type-id-6085'/>
+      <pointer-type-def type-id='type-id-6086' size-in-bits='64' id='type-id-6087'/>
+      <pointer-type-def type-id='type-id-6088' size-in-bits='64' id='type-id-5996'/>
+      <pointer-type-def type-id='type-id-6089' size-in-bits='64' id='type-id-5987'/>
+      <pointer-type-def type-id='type-id-6090' size-in-bits='64' id='type-id-5997'/>
+      <pointer-type-def type-id='type-id-6091' size-in-bits='64' id='type-id-5983'/>
+      <pointer-type-def type-id='type-id-6092' size-in-bits='64' id='type-id-5993'/>
+      <pointer-type-def type-id='type-id-6093' size-in-bits='64' id='type-id-5981'/>
+      <pointer-type-def type-id='type-id-5974' size-in-bits='64' id='type-id-5973'/>
+      <pointer-type-def type-id='type-id-5904' size-in-bits='64' id='type-id-5966'/>
+      <pointer-type-def type-id='type-id-5976' size-in-bits='64' id='type-id-5963'/>
+      <pointer-type-def type-id='type-id-5977' size-in-bits='64' id='type-id-5964'/>
+      <pointer-type-def type-id='type-id-5975' size-in-bits='64' id='type-id-5962'/>
+      <pointer-type-def type-id='type-id-5978' size-in-bits='64' id='type-id-5965'/>
+      <pointer-type-def type-id='type-id-5991' size-in-bits='64' id='type-id-5887'/>
+      <pointer-type-def type-id='type-id-5896' size-in-bits='64' id='type-id-6094'/>
+      <pointer-type-def type-id='type-id-5979' size-in-bits='64' id='type-id-5968'/>
+      <pointer-type-def type-id='type-id-5906' size-in-bits='64' id='type-id-5903'/>
+      <pointer-type-def type-id='type-id-5898' size-in-bits='64' id='type-id-6095'/>
+      <pointer-type-def type-id='type-id-5958' size-in-bits='64' id='type-id-5233'/>
+      <pointer-type-def type-id='type-id-5233' size-in-bits='64' id='type-id-6096'/>
+      <pointer-type-def type-id='type-id-5995' size-in-bits='64' id='type-id-5994'/>
+      <pointer-type-def type-id='type-id-5889' size-in-bits='64' id='type-id-6097'/>
+      <pointer-type-def type-id='type-id-6097' size-in-bits='64' id='type-id-6098'/>
+      <function-decl name='sock_queue_rcv_skb' mangled-name='sock_queue_rcv_skb' filepath='net/core/sock.c' line='437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_queue_rcv_skb'>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/sock.c' line='437' column='1'/>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/sock.c' line='437' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='release_sock' mangled-name='release_sock' filepath='net/core/sock.c' line='2851' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='release_sock'>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/sock.c' line='2851' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sk_alloc' mangled-name='sk_alloc' filepath='net/core/sock.c' line='1515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_alloc'>
+        <parameter type-id='type-id-1643' name='net' filepath='net/core/sock.c' line='1515' column='1'/>
+        <parameter type-id='type-id-17' name='family' filepath='net/core/sock.c' line='1515' column='1'/>
+        <parameter type-id='type-id-485' name='priority' filepath='net/core/sock.c' line='1515' column='1'/>
+        <parameter type-id='type-id-5669' name='prot' filepath='net/core/sock.c' line='1516' column='1'/>
+        <parameter type-id='type-id-17' name='kern' filepath='net/core/sock.c' line='1516' column='1'/>
+        <return type-id='type-id-3666'/>
+      </function-decl>
+      <function-decl name='sk_free' mangled-name='sk_free' filepath='net/core/sock.c' line='1612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_free'>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/sock.c' line='1612' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sock_efree' mangled-name='sock_efree' filepath='net/core/sock.c' line='1902' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_efree'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/sock.c' line='1902' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sock_i_ino' mangled-name='sock_i_ino' filepath='net/core/sock.c' line='1919' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_i_ino'>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/sock.c' line='1919' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+      <function-decl name='sock_alloc_send_skb' mangled-name='sock_alloc_send_skb' filepath='net/core/sock.c' line='2099' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_alloc_send_skb'>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/sock.c' line='2099' column='1'/>
+        <parameter type-id='type-id-16' name='size' filepath='net/core/sock.c' line='2099' column='1'/>
+        <parameter type-id='type-id-17' name='noblock' filepath='net/core/sock.c' line='2100' column='1'/>
+        <parameter type-id='type-id-666' name='errcode' filepath='net/core/sock.c' line='2100' column='1'/>
+        <return type-id='type-id-1766'/>
+      </function-decl>
+      <function-decl name='skb_page_frag_refill' mangled-name='skb_page_frag_refill' filepath='net/core/sock.c' line='2200' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_page_frag_refill'>
+        <parameter type-id='type-id-5' name='sz' filepath='net/core/sock.c' line='2200' column='1'/>
+        <parameter type-id='type-id-6051' name='pfrag' filepath='net/core/sock.c' line='2200' column='1'/>
+        <parameter type-id='type-id-485' name='gfp' filepath='net/core/sock.c' line='2200' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='sock_no_bind' mangled-name='sock_no_bind' filepath='net/core/sock.c' line='2543' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_bind'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2543' column='1'/>
+        <parameter type-id='type-id-5852' name='saddr' filepath='net/core/sock.c' line='2543' column='1'/>
+        <parameter type-id='type-id-17' name='len' filepath='net/core/sock.c' line='2543' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_connect' mangled-name='sock_no_connect' filepath='net/core/sock.c' line='2549' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_connect'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2549' column='1'/>
+        <parameter type-id='type-id-5852' name='saddr' filepath='net/core/sock.c' line='2549' column='1'/>
+        <parameter type-id='type-id-17' name='len' filepath='net/core/sock.c' line='2550' column='1'/>
+        <parameter type-id='type-id-17' name='flags' filepath='net/core/sock.c' line='2550' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_socketpair' mangled-name='sock_no_socketpair' filepath='net/core/sock.c' line='2556' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_socketpair'>
+        <parameter type-id='type-id-5670' name='sock1' filepath='net/core/sock.c' line='2556' column='1'/>
+        <parameter type-id='type-id-5670' name='sock2' filepath='net/core/sock.c' line='2556' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_accept' mangled-name='sock_no_accept' filepath='net/core/sock.c' line='2562' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_accept'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2562' column='1'/>
+        <parameter type-id='type-id-5670' name='newsock' filepath='net/core/sock.c' line='2562' column='1'/>
+        <parameter type-id='type-id-17' name='flags' filepath='net/core/sock.c' line='2562' column='1'/>
+        <parameter type-id='type-id-33' name='kern' filepath='net/core/sock.c' line='2563' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_getname' mangled-name='sock_no_getname' filepath='net/core/sock.c' line='2569' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_getname'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2569' column='1'/>
+        <parameter type-id='type-id-5852' name='saddr' filepath='net/core/sock.c' line='2569' column='1'/>
+        <parameter type-id='type-id-17' name='peer' filepath='net/core/sock.c' line='2570' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_ioctl' mangled-name='sock_no_ioctl' filepath='net/core/sock.c' line='2576' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_ioctl'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2576' column='1'/>
+        <parameter type-id='type-id-5' name='cmd' filepath='net/core/sock.c' line='2576' column='1'/>
+        <parameter type-id='type-id-16' name='arg' filepath='net/core/sock.c' line='2576' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_listen' mangled-name='sock_no_listen' filepath='net/core/sock.c' line='2582' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_listen'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2582' column='1'/>
+        <parameter type-id='type-id-17' name='backlog' filepath='net/core/sock.c' line='2582' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_shutdown' mangled-name='sock_no_shutdown' filepath='net/core/sock.c' line='2588' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_shutdown'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2588' column='1'/>
+        <parameter type-id='type-id-17' name='how' filepath='net/core/sock.c' line='2588' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_setsockopt' mangled-name='sock_no_setsockopt' filepath='net/core/sock.c' line='2594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_setsockopt'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2594' column='1'/>
+        <parameter type-id='type-id-17' name='level' filepath='net/core/sock.c' line='2594' column='1'/>
+        <parameter type-id='type-id-17' name='optname' filepath='net/core/sock.c' line='2594' column='1'/>
+        <parameter type-id='type-id-2' name='optval' filepath='net/core/sock.c' line='2595' column='1'/>
+        <parameter type-id='type-id-5' name='optlen' filepath='net/core/sock.c' line='2595' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_getsockopt' mangled-name='sock_no_getsockopt' filepath='net/core/sock.c' line='2601' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_getsockopt'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2601' column='1'/>
+        <parameter type-id='type-id-17' name='level' filepath='net/core/sock.c' line='2601' column='1'/>
+        <parameter type-id='type-id-17' name='optname' filepath='net/core/sock.c' line='2601' column='1'/>
+        <parameter type-id='type-id-2' name='optval' filepath='net/core/sock.c' line='2602' column='1'/>
+        <parameter type-id='type-id-666' name='optlen' filepath='net/core/sock.c' line='2602' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_mmap' mangled-name='sock_no_mmap' filepath='net/core/sock.c' line='2627' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_mmap'>
+        <parameter type-id='type-id-83' name='file' filepath='net/core/sock.c' line='2627' column='1'/>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2627' column='1'/>
+        <parameter type-id='type-id-1207' name='vma' filepath='net/core/sock.c' line='2627' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_no_sendpage' mangled-name='sock_no_sendpage' filepath='net/core/sock.c' line='2634' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_sendpage'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2634' column='1'/>
+        <parameter type-id='type-id-512' name='page' filepath='net/core/sock.c' line='2634' column='1'/>
+        <parameter type-id='type-id-17' name='offset' filepath='net/core/sock.c' line='2634' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='net/core/sock.c' line='2634' column='1'/>
+        <parameter type-id='type-id-17' name='flags' filepath='net/core/sock.c' line='2634' column='1'/>
+        <return type-id='type-id-86'/>
+      </function-decl>
+      <function-decl name='sock_init_data' mangled-name='sock_init_data' filepath='net/core/sock.c' line='2754' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_init_data'>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/sock.c' line='2754' column='1'/>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/sock.c' line='2754' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='lock_sock_nested' mangled-name='lock_sock_nested' filepath='net/core/sock.c' line='2835' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lock_sock_nested'>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/sock.c' line='2835' column='1'/>
+        <parameter type-id='type-id-17' name='subclass' filepath='net/core/sock.c' line='2835' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sock_get_timestamp' mangled-name='sock_get_timestamp' filepath='net/core/sock.c' line='2906' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_get_timestamp'>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/sock.c' line='2906' column='1'/>
+        <parameter type-id='type-id-6057' name='userstamp' filepath='net/core/sock.c' line='2906' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='proto_register' mangled-name='proto_register' filepath='net/core/sock.c' line='3263' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proto_register'>
+        <parameter type-id='type-id-5669' name='prot' filepath='net/core/sock.c' line='3263' column='1'/>
+        <parameter type-id='type-id-17' name='alloc_slab' filepath='net/core/sock.c' line='3263' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='proto_unregister' mangled-name='proto_unregister' filepath='net/core/sock.c' line='3318' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proto_unregister'>
+        <parameter type-id='type-id-5669' name='prot' filepath='net/core/sock.c' line='3318' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-6032'>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-5882'/>
+        <parameter type-id='type-id-6050'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6034'>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-5911'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-6065'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6036'>
+        <parameter type-id='type-id-5911'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6037'>
+        <parameter type-id='type-id-5911'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6038'>
+        <parameter type-id='type-id-5927'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6039'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6040'>
+        <parameter type-id='type-id-214'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6042'>
+        <parameter type-id='type-id-5233'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6043'>
+        <parameter type-id='type-id-6096'/>
+        <parameter type-id='type-id-6096'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6044'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6045'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-6009'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6046'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-927'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6047'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6048'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-6065'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6049'>
+        <parameter type-id='type-id-6098'/>
+        <parameter type-id='type-id-6098'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6055'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1666'/>
+        <return type-id='type-id-1766'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6058'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-3629'/>
+        <return type-id='type-id-511'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6059'>
+        <parameter type-id='type-id-6014'/>
+        <parameter type-id='type-id-15'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6060'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-666'/>
+        <parameter type-id='type-id-6056'/>
+        <return type-id='type-id-84'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6062'>
+        <parameter type-id='type-id-3666'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6064'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-7'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6066'>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-5911'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-6011'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6068'>
+        <parameter type-id='type-id-2696'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-658'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6070'>
+        <parameter type-id='type-id-5911'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6071'>
+        <parameter type-id='type-id-5911'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6072'>
+        <parameter type-id='type-id-1643'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6016'/>
+        <parameter type-id='type-id-5942'/>
+        <parameter type-id='type-id-6028'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-511'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6074'>
+        <parameter type-id='type-id-5927'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6075'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6076'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-6007'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6078'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-6018'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6080'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-5934'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6082'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6084'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6086'>
+        <parameter type-id='type-id-3666'/>
+        <parameter type-id='type-id-214'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6088'>
+        <parameter type-id='type-id-6095'/>
+        <parameter type-id='type-id-6009'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6089'>
+        <parameter type-id='type-id-5233'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6090'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-6023'/>
+        <parameter type-id='type-id-6020'/>
+        <parameter type-id='type-id-6020'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6091'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6092'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-1766'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6093'>
+        <parameter type-id='type-id-5233'/>
+        <parameter type-id='type-id-927'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <union-decl name='__anonymous_union__7' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/net/xfrm.h' line='138' column='1' id='type-id-5959'>
+        <data-member access='private'>
+          <var-decl name='gclist' type-id='type-id-520' visibility='default' filepath='include/net/xfrm.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='bydst' type-id='type-id-520' visibility='default' filepath='include/net/xfrm.h' line='140' column='1'/>
+        </data-member>
+      </union-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/datagram.c' language='LANG_C89'>
+      <typedef-decl name='poll_table' type-id='type-id-1066' filepath='include/linux/poll.h' line='42' column='1' id='type-id-6099'/>
+      <pointer-type-def type-id='type-id-6099' size-in-bits='64' id='type-id-6100'/>
+      <function-decl name='skb_recv_datagram' mangled-name='skb_recv_datagram' filepath='net/core/datagram.c' line='317' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_recv_datagram'>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/datagram.c' line='317' column='1'/>
+        <parameter type-id='type-id-5' name='flags' filepath='net/core/datagram.c' line='317' column='1'/>
+        <parameter type-id='type-id-17' name='noblock' filepath='net/core/datagram.c' line='318' column='1'/>
+        <parameter type-id='type-id-666' name='err' filepath='net/core/datagram.c' line='318' column='1'/>
+        <return type-id='type-id-1766'/>
+      </function-decl>
+      <function-decl name='skb_free_datagram' mangled-name='skb_free_datagram' filepath='net/core/datagram.c' line='327' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_free_datagram'>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/datagram.c' line='327' column='1'/>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/datagram.c' line='327' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='datagram_poll' mangled-name='datagram_poll' filepath='net/core/datagram.c' line='835' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='datagram_poll'>
+        <parameter type-id='type-id-83' name='file' filepath='net/core/datagram.c' line='835' column='1'/>
+        <parameter type-id='type-id-5670' name='sock' filepath='net/core/datagram.c' line='835' column='1'/>
+        <parameter type-id='type-id-6100' name='wait' filepath='net/core/datagram.c' line='836' column='1'/>
+        <return type-id='type-id-880'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/net_namespace.c' language='LANG_C89'>
+      <class-decl name='pernet_operations' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/net/net_namespace.h' line='330' column='1' id='type-id-6101'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/net_namespace.h' line='331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='init' type-id='type-id-6102' visibility='default' filepath='include/net/net_namespace.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='exit' type-id='type-id-6103' visibility='default' filepath='include/net/net_namespace.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='exit_batch' type-id='type-id-6104' visibility='default' filepath='include/net/net_namespace.h' line='352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='id' type-id='type-id-482' visibility='default' filepath='include/net/net_namespace.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='size' type-id='type-id-84' visibility='default' filepath='include/net/net_namespace.h' line='354' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1157' column='1' id='type-id-6105'>
+        <data-member access='private'>
+          <var-decl name='hashinfo' type-id='type-id-2260' visibility='default' filepath='include/net/sock.h' line='1158' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='udp_table' type-id='type-id-5859' visibility='default' filepath='include/net/sock.h' line='1159' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='raw_hash' type-id='type-id-5847' visibility='default' filepath='include/net/sock.h' line='1160' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='smc_hash' type-id='type-id-5849' visibility='default' filepath='include/net/sock.h' line='1161' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__4' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/net/netns/generic.h' line='29' column='1' id='type-id-6106'>
+        <data-member access='private'>
+          <var-decl name='s' type-id='type-id-6107' visibility='default' filepath='include/net/netns/generic.h' line='33' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ptr' type-id='type-id-1211' visibility='default' filepath='include/net/netns/generic.h' line='35' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/netns/generic.h' line='30' column='1' id='type-id-6107'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='len' type-id='type-id-5' visibility='default' filepath='include/net/netns/generic.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/net/netns/generic.h' line='32' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-6108' size-in-bits='64' id='type-id-6102'/>
+      <pointer-type-def type-id='type-id-6101' size-in-bits='64' id='type-id-6109'/>
+      <pointer-type-def type-id='type-id-6110' size-in-bits='64' id='type-id-6104'/>
+      <pointer-type-def type-id='type-id-6111' size-in-bits='64' id='type-id-6103'/>
+      <function-decl name='register_pernet_subsys' mangled-name='register_pernet_subsys' filepath='net/core/net_namespace.c' line='1051' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_pernet_subsys'>
+        <parameter type-id='type-id-6109' name='ops' filepath='net/core/net_namespace.c' line='1051' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='unregister_pernet_subsys' mangled-name='unregister_pernet_subsys' filepath='net/core/net_namespace.c' line='1070' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_pernet_subsys'>
+        <parameter type-id='type-id-6109' name='ops' filepath='net/core/net_namespace.c' line='1070' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-6108'>
+        <parameter type-id='type-id-1643'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6110'>
+        <parameter type-id='type-id-877'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6111'>
+        <parameter type-id='type-id-1643'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/flow_dissector.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-312' size-in-bits='384' id='type-id-6112'>
+        <subrange length='24' type-id='type-id-9' id='type-id-3436'/>
+
+      </array-type-def>
+      <class-decl name='flow_dissector' size-in-bits='416' is-struct='yes' visibility='default' filepath='include/net/flow_dissector.h' line='243' column='1' id='type-id-6113'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='used_keys' type-id='type-id-5' visibility='default' filepath='include/net/flow_dissector.h' line='244' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='offset' type-id='type-id-6112' visibility='default' filepath='include/net/flow_dissector.h' line='245' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-6113' size-in-bits='64' id='type-id-6114'/>
+      <function-decl name='__skb_flow_dissect' mangled-name='__skb_flow_dissect' filepath='net/core/flow_dissector.c' line='607' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__skb_flow_dissect'>
+        <parameter type-id='type-id-2719' name='skb' filepath='net/core/flow_dissector.c' line='607' column='1'/>
+        <parameter type-id='type-id-6114' name='flow_dissector' filepath='net/core/flow_dissector.c' line='608' column='1'/>
+        <parameter type-id='type-id-15' name='target_container' filepath='net/core/flow_dissector.c' line='609' column='1'/>
+        <parameter type-id='type-id-15' name='data' filepath='net/core/flow_dissector.c' line='610' column='1'/>
+        <parameter type-id='type-id-924' name='proto' filepath='net/core/flow_dissector.c' line='610' column='1'/>
+        <parameter type-id='type-id-17' name='nhoff' filepath='net/core/flow_dissector.c' line='610' column='1'/>
+        <parameter type-id='type-id-17' name='hlen' filepath='net/core/flow_dissector.c' line='610' column='1'/>
+        <parameter type-id='type-id-5' name='flags' filepath='net/core/flow_dissector.c' line='611' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/dev.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='type-id-6115' size-in-bits='infinite' id='type-id-6116'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <class-decl name='ip_mc_list' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-6117'/>
+      <class-decl name='libipw_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-6118'/>
+      <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='1024' id='type-id-5177'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-6119' size-in-bits='256' id='type-id-6120'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-6121' size-in-bits='infinite' id='type-id-6122'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-6123' size-in-bits='64' id='type-id-6124'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='2' type-id='type-id-6123' size-in-bits='112' id='type-id-6125'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <typedef-decl name='iw_handler' type-id='type-id-6126' filepath='include/net/iw_handler.h' line='315' column='1' id='type-id-6127'/>
+      <class-decl name='iw_request_info' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='304' column='1' id='type-id-6128'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-108' visibility='default' filepath='include/net/iw_handler.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='flags' type-id='type-id-108' visibility='default' filepath='include/net/iw_handler.h' line='306' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='iwreq_data' size-in-bits='128' visibility='default' filepath='include/uapi/linux/wireless.h' line='896' column='1' id='type-id-6129'>
+        <data-member access='private'>
+          <var-decl name='name' type-id='type-id-43' visibility='default' filepath='include/uapi/linux/wireless.h' line='898' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='essid' type-id='type-id-6130' visibility='default' filepath='include/uapi/linux/wireless.h' line='902' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='nwid' type-id='type-id-6131' visibility='default' filepath='include/uapi/linux/wireless.h' line='903' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='freq' type-id='type-id-6132' visibility='default' filepath='include/uapi/linux/wireless.h' line='904' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='sens' type-id='type-id-6131' visibility='default' filepath='include/uapi/linux/wireless.h' line='908' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='bitrate' type-id='type-id-6131' visibility='default' filepath='include/uapi/linux/wireless.h' line='909' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='txpower' type-id='type-id-6131' visibility='default' filepath='include/uapi/linux/wireless.h' line='910' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rts' type-id='type-id-6131' visibility='default' filepath='include/uapi/linux/wireless.h' line='911' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='frag' type-id='type-id-6131' visibility='default' filepath='include/uapi/linux/wireless.h' line='912' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='mode' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/wireless.h' line='913' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='retry' type-id='type-id-6131' visibility='default' filepath='include/uapi/linux/wireless.h' line='914' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='encoding' type-id='type-id-6130' visibility='default' filepath='include/uapi/linux/wireless.h' line='916' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='power' type-id='type-id-6131' visibility='default' filepath='include/uapi/linux/wireless.h' line='917' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='qual' type-id='type-id-6119' visibility='default' filepath='include/uapi/linux/wireless.h' line='918' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='ap_addr' type-id='type-id-1774' visibility='default' filepath='include/uapi/linux/wireless.h' line='920' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='addr' type-id='type-id-1774' visibility='default' filepath='include/uapi/linux/wireless.h' line='921' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='param' type-id='type-id-6131' visibility='default' filepath='include/uapi/linux/wireless.h' line='923' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='data' type-id='type-id-6130' visibility='default' filepath='include/uapi/linux/wireless.h' line='924' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='iw_point' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='685' column='1' id='type-id-6130'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pointer' type-id='type-id-15' visibility='default' filepath='include/uapi/linux/wireless.h' line='686' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='length' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/wireless.h' line='687' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='flags' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/wireless.h' line='688' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_param' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='674' column='1' id='type-id-6131'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='value' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/wireless.h' line='675' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='fixed' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/wireless.h' line='676' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='disabled' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/wireless.h' line='677' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='flags' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/wireless.h' line='678' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_freq' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='700' column='1' id='type-id-6132'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='m' type-id='type-id-653' visibility='default' filepath='include/uapi/linux/wireless.h' line='701' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='e' type-id='type-id-2202' visibility='default' filepath='include/uapi/linux/wireless.h' line='702' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='i' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/wireless.h' line='703' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='flags' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/wireless.h' line='704' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_quality' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='710' column='1' id='type-id-6119'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='qual' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/wireless.h' line='711' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='level' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/wireless.h' line='713' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='noise' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/wireless.h' line='714' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='updated' type-id='type-id-893' visibility='default' filepath='include/uapi/linux/wireless.h' line='715' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_priv_args' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='1057' column='1' id='type-id-6133'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/wireless.h' line='1058' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='set_args' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/wireless.h' line='1059' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='get_args' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/wireless.h' line='1060' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='type-id-43' visibility='default' filepath='include/uapi/linux/wireless.h' line='1061' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_statistics' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='875' column='1' id='type-id-6134'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='status' type-id='type-id-108' visibility='default' filepath='include/uapi/linux/wireless.h' line='876' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='qual' type-id='type-id-6119' visibility='default' filepath='include/uapi/linux/wireless.h' line='879' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='discard' type-id='type-id-6135' visibility='default' filepath='include/uapi/linux/wireless.h' line='881' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='miss' type-id='type-id-6136' visibility='default' filepath='include/uapi/linux/wireless.h' line='882' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_discarded' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='725' column='1' id='type-id-6135'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nwid' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/wireless.h' line='726' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='code' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/wireless.h' line='727' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fragment' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/wireless.h' line='728' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='retries' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/wireless.h' line='729' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='misc' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/wireless.h' line='730' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_missed' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='737' column='1' id='type-id-6136'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='beacon' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/wireless.h' line='738' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_spy_data' size-in-bits='800' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='396' column='1' id='type-id-6137'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='spy_number' type-id='type-id-17' visibility='default' filepath='include/net/iw_handler.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='spy_address' type-id='type-id-6125' visibility='default' filepath='include/net/iw_handler.h' line='399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='spy_stat' type-id='type-id-6120' visibility='default' filepath='include/net/iw_handler.h' line='400' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='spy_thr_low' type-id='type-id-6119' visibility='default' filepath='include/net/iw_handler.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='spy_thr_high' type-id='type-id-6119' visibility='default' filepath='include/net/iw_handler.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='spy_thr_under' type-id='type-id-6124' visibility='default' filepath='include/net/iw_handler.h' line='404' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='u_char' type-id='type-id-216' filepath='include/linux/types.h' line='84' column='1' id='type-id-6123'/>
+      <class-decl name='in_device' size-in-bits='2816' is-struct='yes' visibility='default' filepath='include/linux/inetdevice.h' line='25' column='1' id='type-id-6138'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/linux/inetdevice.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='refcnt' type-id='type-id-421' visibility='default' filepath='include/linux/inetdevice.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='dead' type-id='type-id-17' visibility='default' filepath='include/linux/inetdevice.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ifa_list' type-id='type-id-6139' visibility='default' filepath='include/linux/inetdevice.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mc_list' type-id='type-id-6140' visibility='default' filepath='include/linux/inetdevice.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mc_hash' type-id='type-id-6141' visibility='default' filepath='include/linux/inetdevice.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mc_count' type-id='type-id-17' visibility='default' filepath='include/linux/inetdevice.h' line='34' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='mc_tomb_lock' type-id='type-id-247' visibility='default' filepath='include/linux/inetdevice.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='mc_tomb' type-id='type-id-6140' visibility='default' filepath='include/linux/inetdevice.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='mr_v1_seen' type-id='type-id-16' visibility='default' filepath='include/linux/inetdevice.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='mr_v2_seen' type-id='type-id-16' visibility='default' filepath='include/linux/inetdevice.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mr_maxdelay' type-id='type-id-16' visibility='default' filepath='include/linux/inetdevice.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='mr_qi' type-id='type-id-16' visibility='default' filepath='include/linux/inetdevice.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='mr_qri' type-id='type-id-16' visibility='default' filepath='include/linux/inetdevice.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mr_qrv' type-id='type-id-216' visibility='default' filepath='include/linux/inetdevice.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='776'>
+          <var-decl name='mr_gq_running' type-id='type-id-216' visibility='default' filepath='include/linux/inetdevice.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='784'>
+          <var-decl name='mr_ifc_count' type-id='type-id-216' visibility='default' filepath='include/linux/inetdevice.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='mr_gq_timer' type-id='type-id-417' visibility='default' filepath='include/linux/inetdevice.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='mr_ifc_timer' type-id='type-id-417' visibility='default' filepath='include/linux/inetdevice.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='arp_parms' type-id='type-id-5913' visibility='default' filepath='include/linux/inetdevice.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='cnf' type-id='type-id-1027' visibility='default' filepath='include/linux/inetdevice.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/inetdevice.h' line='50' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='in_ifaddr' size-in-bits='960' is-struct='yes' visibility='default' filepath='include/linux/inetdevice.h' line='137' column='1' id='type-id-6142'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hash' type-id='type-id-520' visibility='default' filepath='include/linux/inetdevice.h' line='138' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ifa_next' type-id='type-id-6139' visibility='default' filepath='include/linux/inetdevice.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ifa_dev' type-id='type-id-6143' visibility='default' filepath='include/linux/inetdevice.h' line='140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/linux/inetdevice.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ifa_local' type-id='type-id-927' visibility='default' filepath='include/linux/inetdevice.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='ifa_address' type-id='type-id-927' visibility='default' filepath='include/linux/inetdevice.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ifa_mask' type-id='type-id-927' visibility='default' filepath='include/linux/inetdevice.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='ifa_rt_priority' type-id='type-id-511' visibility='default' filepath='include/linux/inetdevice.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='ifa_broadcast' type-id='type-id-927' visibility='default' filepath='include/linux/inetdevice.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='ifa_scope' type-id='type-id-216' visibility='default' filepath='include/linux/inetdevice.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='552'>
+          <var-decl name='ifa_prefixlen' type-id='type-id-216' visibility='default' filepath='include/linux/inetdevice.h' line='148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='ifa_flags' type-id='type-id-511' visibility='default' filepath='include/linux/inetdevice.h' line='149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='ifa_label' type-id='type-id-43' visibility='default' filepath='include/linux/inetdevice.h' line='150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='ifa_valid_lft' type-id='type-id-511' visibility='default' filepath='include/linux/inetdevice.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='ifa_preferred_lft' type-id='type-id-511' visibility='default' filepath='include/linux/inetdevice.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='ifa_cstamp' type-id='type-id-16' visibility='default' filepath='include/linux/inetdevice.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='ifa_tstamp' type-id='type-id-16' visibility='default' filepath='include/linux/inetdevice.h' line='156' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='666' column='1' id='type-id-6144'>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-6145' visibility='default' filepath='include/linux/skbuff.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rbnode' type-id='type-id-422' visibility='default' filepath='include/linux/skbuff.h' line='681' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/skbuff.h' line='682' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='667' column='1' id='type-id-6145'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-1766' visibility='default' filepath='include/linux/skbuff.h' line='669' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prev' type-id='type-id-1766' visibility='default' filepath='include/linux/skbuff.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='' type-id='type-id-6146' visibility='default' filepath='include/linux/skbuff.h' line='672' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='672' column='1' id='type-id-6146'>
+        <data-member access='private'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/linux/skbuff.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='dev_scratch' type-id='type-id-16' visibility='default' filepath='include/linux/skbuff.h' line='678' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='nf_hook_entry' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/netfilter.h' line='75' column='1' id='type-id-6121'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hook' type-id='type-id-6147' visibility='default' filepath='include/linux/netfilter.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='priv' type-id='type-id-15' visibility='default' filepath='include/linux/netfilter.h' line='77' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='nf_hookfn' type-id='type-id-6148' filepath='include/linux/netfilter.h' line='61' column='1' id='type-id-6149'/>
+      <class-decl name='nf_hook_state' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/netfilter.h' line='51' column='1' id='type-id-6150'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='hook' type-id='type-id-5' visibility='default' filepath='include/linux/netfilter.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='pf' type-id='type-id-6151' visibility='default' filepath='include/linux/netfilter.h' line='53' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='in' type-id='type-id-1648' visibility='default' filepath='include/linux/netfilter.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='out' type-id='type-id-1648' visibility='default' filepath='include/linux/netfilter.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sk' type-id='type-id-3666' visibility='default' filepath='include/linux/netfilter.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='net' type-id='type-id-1643' visibility='default' filepath='include/linux/netfilter.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='okfn' type-id='type-id-2280' visibility='default' filepath='include/linux/netfilter.h' line='58' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='u_int8_t' type-id='type-id-214' filepath='include/linux/types.h' line='98' column='1' id='type-id-6151'/>
+      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='156' column='1' id='type-id-6152'>
+        <data-member access='private'>
+          <var-decl name='skc_addrpair' type-id='type-id-5687' visibility='default' filepath='include/net/sock.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-5688' visibility='default' filepath='include/net/sock.h' line='158' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1157' column='1' id='type-id-6153'>
+        <data-member access='private'>
+          <var-decl name='hashinfo' type-id='type-id-2260' visibility='default' filepath='include/net/sock.h' line='1158' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='udp_table' type-id='type-id-5859' visibility='default' filepath='include/net/sock.h' line='1159' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='raw_hash' type-id='type-id-5847' visibility='default' filepath='include/net/sock.h' line='1160' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='smc_hash' type-id='type-id-5849' visibility='default' filepath='include/net/sock.h' line='1161' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='udp_hslot' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/udp.h' line='61' column='1' id='type-id-6154'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-186' visibility='default' filepath='include/net/udp.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='count' type-id='type-id-17' visibility='default' filepath='include/net/udp.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='lock' type-id='type-id-247' visibility='default' filepath='include/net/udp.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__7' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/net/xfrm.h' line='138' column='1' id='type-id-6155'>
+        <data-member access='private'>
+          <var-decl name='gclist' type-id='type-id-520' visibility='default' filepath='include/net/xfrm.h' line='139' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='bydst' type-id='type-id-520' visibility='default' filepath='include/net/xfrm.h' line='140' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/ip.h' line='123' column='1' id='type-id-6156'>
+        <data-member access='private'>
+          <var-decl name='destructor' type-id='type-id-5672' visibility='default' filepath='include/net/ip.h' line='124' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='saved_sk' type-id='type-id-3666' visibility='default' filepath='include/net/ip.h' line='125' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__1' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/cpu_rmap.h' line='31' column='1' id='type-id-6115'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='index' type-id='type-id-688' visibility='default' filepath='include/linux/cpu_rmap.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='dist' type-id='type-id-688' visibility='default' filepath='include/linux/cpu_rmap.h' line='33' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='packet_type' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='2332' column='1' id='type-id-6157'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-924' visibility='default' filepath='include/linux/netdevice.h' line='2333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/linux/netdevice.h' line='2334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='func' type-id='type-id-6158' visibility='default' filepath='include/linux/netdevice.h' line='2335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='list_func' type-id='type-id-6159' visibility='default' filepath='include/linux/netdevice.h' line='2339' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='id_match' type-id='type-id-6160' visibility='default' filepath='include/linux/netdevice.h' line='2342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='af_packet_priv' type-id='type-id-15' visibility='default' filepath='include/linux/netdevice.h' line='2344' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/netdevice.h' line='2345' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='skb_free_reason' filepath='include/linux/netdevice.h' line='3490' column='1' id='type-id-6161'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='SKB_REASON_CONSUMED' value='0'/>
+        <enumerator name='SKB_REASON_DROPPED' value='1'/>
+      </enum-decl>
+      <typedef-decl name='gro_result_t' type-id='type-id-6162' filepath='include/linux/netdevice.h' line='372' column='1' id='type-id-6163'/>
+      <enum-decl name='gro_result' filepath='include/linux/netdevice.h' line='364' column='1' id='type-id-6162'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='GRO_MERGED' value='0'/>
+        <enumerator name='GRO_MERGED_FREE' value='1'/>
+        <enumerator name='GRO_HELD' value='2'/>
+        <enumerator name='GRO_NORMAL' value='3'/>
+        <enumerator name='GRO_DROP' value='4'/>
+        <enumerator name='GRO_CONSUMED' value='5'/>
+      </enum-decl>
+      <qualified-type-def type-id='type-id-6127' const='yes' id='type-id-6164'/>
+      <pointer-type-def type-id='type-id-6164' size-in-bits='64' id='type-id-6165'/>
+      <qualified-type-def type-id='type-id-6133' const='yes' id='type-id-6166'/>
+      <pointer-type-def type-id='type-id-6166' size-in-bits='64' id='type-id-6167'/>
+      <qualified-type-def type-id='type-id-6150' const='yes' id='type-id-6168'/>
+      <pointer-type-def type-id='type-id-6168' size-in-bits='64' id='type-id-6169'/>
+      <pointer-type-def type-id='type-id-2153' size-in-bits='64' id='type-id-6170'/>
+      <pointer-type-def type-id='type-id-6138' size-in-bits='64' id='type-id-6143'/>
+      <pointer-type-def type-id='type-id-6142' size-in-bits='64' id='type-id-6139'/>
+      <pointer-type-def type-id='type-id-6171' size-in-bits='64' id='type-id-6126'/>
+      <pointer-type-def type-id='type-id-6172' size-in-bits='64' id='type-id-6158'/>
+      <pointer-type-def type-id='type-id-6117' size-in-bits='64' id='type-id-6140'/>
+      <pointer-type-def type-id='type-id-6140' size-in-bits='64' id='type-id-6141'/>
+      <pointer-type-def type-id='type-id-6128' size-in-bits='64' id='type-id-6173'/>
+      <pointer-type-def type-id='type-id-6137' size-in-bits='64' id='type-id-6174'/>
+      <pointer-type-def type-id='type-id-6134' size-in-bits='64' id='type-id-6175'/>
+      <pointer-type-def type-id='type-id-6176' size-in-bits='64' id='type-id-6177'/>
+      <pointer-type-def type-id='type-id-6129' size-in-bits='64' id='type-id-6178'/>
+      <pointer-type-def type-id='type-id-6118' size-in-bits='64' id='type-id-6179'/>
+      <pointer-type-def type-id='type-id-6149' size-in-bits='64' id='type-id-6147'/>
+      <pointer-type-def type-id='type-id-6157' size-in-bits='64' id='type-id-6180'/>
+      <pointer-type-def type-id='type-id-6181' size-in-bits='64' id='type-id-6160'/>
+      <pointer-type-def type-id='type-id-6154' size-in-bits='64' id='type-id-6182'/>
+      <pointer-type-def type-id='type-id-6183' size-in-bits='64' id='type-id-6159'/>
+      <function-decl name='netif_set_real_num_tx_queues' mangled-name='netif_set_real_num_tx_queues' filepath='net/core/dev.c' line='2632' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_set_real_num_tx_queues'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='2632' column='1'/>
+        <parameter type-id='type-id-5' name='txq' filepath='net/core/dev.c' line='2632' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='netif_set_real_num_rx_queues' mangled-name='netif_set_real_num_rx_queues' filepath='net/core/dev.c' line='2682' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_set_real_num_rx_queues'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='2682' column='1'/>
+        <parameter type-id='type-id-5' name='rxq' filepath='net/core/dev.c' line='2682' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='netdev_rx_handler_unregister' mangled-name='netdev_rx_handler_unregister' filepath='net/core/dev.c' line='4736' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_rx_handler_unregister'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='4736' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netif_napi_add' mangled-name='netif_napi_add' filepath='net/core/dev.c' line='6207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_napi_add'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='6207' column='1'/>
+        <parameter type-id='type-id-5240' name='napi' filepath='net/core/dev.c' line='6207' column='1'/>
+        <parameter type-id='type-id-5237' name='poll' filepath='net/core/dev.c' line='6208' column='1'/>
+        <parameter type-id='type-id-17' name='weight' filepath='net/core/dev.c' line='6208' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netdev_upper_dev_unlink' mangled-name='netdev_upper_dev_unlink' filepath='net/core/dev.c' line='7092' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_upper_dev_unlink'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='7092' column='1'/>
+        <parameter type-id='type-id-1648' name='upper_dev' filepath='net/core/dev.c' line='7093' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netdev_lower_state_changed' mangled-name='netdev_lower_state_changed' filepath='net/core/dev.c' line='7257' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_lower_state_changed'>
+        <parameter type-id='type-id-1648' name='lower_dev' filepath='net/core/dev.c' line='7257' column='1'/>
+        <parameter type-id='type-id-15' name='lower_state_info' filepath='net/core/dev.c' line='7258' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='register_netdevice' mangled-name='register_netdevice' filepath='net/core/dev.c' line='8452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_netdevice'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='8452' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='unregister_netdevice_queue' mangled-name='unregister_netdevice_queue' filepath='net/core/dev.c' line='9104' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_netdevice_queue'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='9104' column='1'/>
+        <parameter type-id='type-id-877' name='head' filepath='net/core/dev.c' line='9104' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='dev_add_pack' mangled-name='dev_add_pack' filepath='net/core/dev.c' line='406' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_add_pack'>
+        <parameter type-id='type-id-6180' name='pt' filepath='net/core/dev.c' line='406' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='dev_remove_pack' mangled-name='dev_remove_pack' filepath='net/core/dev.c' line='461' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_remove_pack'>
+        <parameter type-id='type-id-6180' name='pt' filepath='net/core/dev.c' line='461' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='synchronize_net' mangled-name='synchronize_net' filepath='net/core/dev.c' line='9081' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='synchronize_net'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__dev_get_by_index' mangled-name='__dev_get_by_index' filepath='net/core/dev.c' line='809' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__dev_get_by_index'>
+        <parameter type-id='type-id-1643' name='net' filepath='net/core/dev.c' line='809' column='1'/>
+        <parameter type-id='type-id-17' name='ifindex' filepath='net/core/dev.c' line='809' column='1'/>
+        <return type-id='type-id-1648'/>
+      </function-decl>
+      <function-decl name='dev_get_by_index_rcu' mangled-name='dev_get_by_index_rcu' filepath='net/core/dev.c' line='833' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_get_by_index_rcu'>
+        <parameter type-id='type-id-1643' name='net' filepath='net/core/dev.c' line='833' column='1'/>
+        <parameter type-id='type-id-17' name='ifindex' filepath='net/core/dev.c' line='833' column='1'/>
+        <return type-id='type-id-1648'/>
+      </function-decl>
+      <function-decl name='dev_get_by_index' mangled-name='dev_get_by_index' filepath='net/core/dev.c' line='858' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_get_by_index'>
+        <parameter type-id='type-id-1643' name='net' filepath='net/core/dev.c' line='858' column='1'/>
+        <parameter type-id='type-id-17' name='ifindex' filepath='net/core/dev.c' line='858' column='1'/>
+        <return type-id='type-id-1648'/>
+      </function-decl>
+      <function-decl name='netdev_info' mangled-name='netdev_info' filepath='net/core/dev.c' line='9493' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_info'>
+        <parameter type-id='type-id-2696' name='dev' filepath='net/core/dev.c' line='9493' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='net/core/dev.c' line='9493' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='call_netdevice_notifiers' mangled-name='call_netdevice_notifiers' filepath='net/core/dev.c' line='1759' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='call_netdevice_notifiers'>
+        <parameter type-id='type-id-16' name='val' filepath='net/core/dev.c' line='1759' column='1'/>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='1759' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='netdev_notify_peers' mangled-name='netdev_notify_peers' filepath='net/core/dev.c' line='1369' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_notify_peers'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='1369' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='dev_open' mangled-name='dev_open' filepath='net/core/dev.c' line='1433' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_open'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='1433' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='dev_close' mangled-name='dev_close' filepath='net/core/dev.c' line='1533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_close'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='1533' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='register_netdevice_notifier' mangled-name='register_netdevice_notifier' filepath='net/core/dev.c' line='1634' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_netdevice_notifier'>
+        <parameter type-id='type-id-3271' name='nb' filepath='net/core/dev.c' line='1634' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='unregister_netdevice_notifier' mangled-name='unregister_netdevice_notifier' filepath='net/core/dev.c' line='1704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_netdevice_notifier'>
+        <parameter type-id='type-id-3271' name='nb' filepath='net/core/dev.c' line='1704' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='__netif_set_xps_queue' mangled-name='__netif_set_xps_queue' filepath='net/core/dev.c' line='2298' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__netif_set_xps_queue'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='2298' column='1'/>
+        <parameter type-id='type-id-6170' name='mask' filepath='net/core/dev.c' line='2298' column='1'/>
+        <parameter type-id='type-id-688' name='index' filepath='net/core/dev.c' line='2299' column='1'/>
+        <parameter type-id='type-id-33' name='is_rxqs_map' filepath='net/core/dev.c' line='2299' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='netif_schedule_queue' mangled-name='netif_schedule_queue' filepath='net/core/dev.c' line='2747' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_schedule_queue'>
+        <parameter type-id='type-id-1683' name='txq' filepath='net/core/dev.c' line='2747' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netif_tx_wake_queue' mangled-name='netif_tx_wake_queue' filepath='net/core/dev.c' line='2759' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_tx_wake_queue'>
+        <parameter type-id='type-id-1683' name='dev_queue' filepath='net/core/dev.c' line='2759' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='__dev_kfree_skb_any' mangled-name='__dev_kfree_skb_any' filepath='net/core/dev.c' line='2794' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__dev_kfree_skb_any'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/dev.c' line='2794' column='1'/>
+        <parameter type-id='type-id-6161' name='reason' filepath='net/core/dev.c' line='2794' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netif_device_detach' mangled-name='netif_device_detach' filepath='net/core/dev.c' line='2810' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_device_detach'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='2810' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netif_tx_stop_all_queues' mangled-name='netif_tx_stop_all_queues' filepath='net/core/dev.c' line='8423' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_tx_stop_all_queues'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='8423' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netif_device_attach' mangled-name='netif_device_attach' filepath='net/core/dev.c' line='2825' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_device_attach'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='2825' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='passthru_features_check' mangled-name='passthru_features_check' filepath='net/core/dev.c' line='3168' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='passthru_features_check'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/dev.c' line='3168' column='1'/>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='3169' column='1'/>
+        <parameter type-id='type-id-1666' name='features' filepath='net/core/dev.c' line='3170' column='1'/>
+        <return type-id='type-id-1666'/>
+      </function-decl>
+      <function-decl name='netif_rx_ni' mangled-name='netif_rx_ni' filepath='net/core/dev.c' line='4534' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_rx_ni'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/dev.c' line='4534' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='dev_queue_xmit' mangled-name='dev_queue_xmit' filepath='net/core/dev.c' line='3874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_queue_xmit'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/dev.c' line='3874' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='netif_rx' mangled-name='netif_rx' filepath='net/core/dev.c' line='4526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_rx'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/dev.c' line='4526' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='netdev_rx_handler_register' mangled-name='netdev_rx_handler_register' filepath='net/core/dev.c' line='4710' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_rx_handler_register'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='4710' column='1'/>
+        <parameter type-id='type-id-1681' name='rx_handler' filepath='net/core/dev.c' line='4711' column='1'/>
+        <parameter type-id='type-id-15' name='rx_handler_data' filepath='net/core/dev.c' line='4712' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='netif_receive_skb' mangled-name='netif_receive_skb' filepath='net/core/dev.c' line='5230' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_receive_skb'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/dev.c' line='5230' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='napi_gro_receive' mangled-name='napi_gro_receive' filepath='net/core/dev.c' line='5645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='napi_gro_receive'>
+        <parameter type-id='type-id-5240' name='napi' filepath='net/core/dev.c' line='5645' column='1'/>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/core/dev.c' line='5645' column='1'/>
+        <return type-id='type-id-6163'/>
+      </function-decl>
+      <function-decl name='__napi_schedule' mangled-name='__napi_schedule' filepath='net/core/dev.c' line='5908' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__napi_schedule'>
+        <parameter type-id='type-id-5240' name='n' filepath='net/core/dev.c' line='5908' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='napi_schedule_prep' mangled-name='napi_schedule_prep' filepath='net/core/dev.c' line='5927' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='napi_schedule_prep'>
+        <parameter type-id='type-id-5240' name='n' filepath='net/core/dev.c' line='5927' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='napi_complete_done' mangled-name='napi_complete_done' filepath='net/core/dev.c' line='5963' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='napi_complete_done'>
+        <parameter type-id='type-id-5240' name='n' filepath='net/core/dev.c' line='5963' column='1'/>
+        <parameter type-id='type-id-17' name='work_done' filepath='net/core/dev.c' line='5963' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='napi_hash_del' mangled-name='napi_hash_del' filepath='net/core/dev.c' line='6165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='napi_hash_del'>
+        <parameter type-id='type-id-5240' name='napi' filepath='net/core/dev.c' line='6165' column='1'/>
+        <return type-id='type-id-33'/>
+      </function-decl>
+      <function-decl name='napi_disable' mangled-name='napi_disable' filepath='net/core/dev.c' line='6230' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='napi_disable'>
+        <parameter type-id='type-id-5240' name='n' filepath='net/core/dev.c' line='6230' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netif_napi_del' mangled-name='netif_napi_del' filepath='net/core/dev.c' line='6260' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_napi_del'>
+        <parameter type-id='type-id-5240' name='napi' filepath='net/core/dev.c' line='6260' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netdev_upper_dev_link' mangled-name='netdev_upper_dev_link' filepath='net/core/dev.c' line='7051' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_upper_dev_link'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='7051' column='1'/>
+        <parameter type-id='type-id-1648' name='upper_dev' filepath='net/core/dev.c' line='7052' column='1'/>
+        <parameter type-id='type-id-1824' name='extack' filepath='net/core/dev.c' line='7053' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='netdev_master_upper_dev_link' mangled-name='netdev_master_upper_dev_link' filepath='net/core/dev.c' line='7074' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_master_upper_dev_link'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='7074' column='1'/>
+        <parameter type-id='type-id-1648' name='upper_dev' filepath='net/core/dev.c' line='7075' column='1'/>
+        <parameter type-id='type-id-15' name='upper_priv' filepath='net/core/dev.c' line='7076' column='1'/>
+        <parameter type-id='type-id-15' name='upper_info' filepath='net/core/dev.c' line='7076' column='1'/>
+        <parameter type-id='type-id-1824' name='extack' filepath='net/core/dev.c' line='7077' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='dev_set_mtu' mangled-name='dev_set_mtu' filepath='net/core/dev.c' line='7658' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_set_mtu'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='7658' column='1'/>
+        <parameter type-id='type-id-17' name='new_mtu' filepath='net/core/dev.c' line='7658' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='netdev_err' mangled-name='netdev_err' filepath='net/core/dev.c' line='9490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_err'>
+        <parameter type-id='type-id-2696' name='dev' filepath='net/core/dev.c' line='9490' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='net/core/dev.c' line='9490' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netdev_change_features' mangled-name='netdev_change_features' filepath='net/core/dev.c' line='8304' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_change_features'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='8304' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netif_stacked_transfer_operstate' mangled-name='netif_stacked_transfer_operstate' filepath='net/core/dev.c' line='8320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_stacked_transfer_operstate'>
+        <parameter type-id='type-id-2696' name='rootdev' filepath='net/core/dev.c' line='8320' column='1'/>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='8321' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='register_netdev' mangled-name='register_netdev' filepath='net/core/dev.c' line='8661' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_netdev'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='8661' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='free_netdev' mangled-name='free_netdev' filepath='net/core/dev.c' line='9042' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='free_netdev'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='9042' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='dev_get_stats' mangled-name='dev_get_stats' filepath='net/core/dev.c' line='8862' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_get_stats'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='8862' column='1'/>
+        <parameter type-id='type-id-3052' name='storage' filepath='net/core/dev.c' line='8863' column='1'/>
+        <return type-id='type-id-3052'/>
+      </function-decl>
+      <function-decl name='alloc_netdev_mqs' mangled-name='alloc_netdev_mqs' filepath='net/core/dev.c' line='8930' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='alloc_netdev_mqs'>
+        <parameter type-id='type-id-17' name='sizeof_priv' filepath='net/core/dev.c' line='8930' column='1'/>
+        <parameter type-id='type-id-4' name='name' filepath='net/core/dev.c' line='8930' column='1'/>
+        <parameter type-id='type-id-216' name='name_assign_type' filepath='net/core/dev.c' line='8931' column='1'/>
+        <parameter type-id='type-id-1689' name='setup' filepath='net/core/dev.c' line='8932' column='1'/>
+        <parameter type-id='type-id-5' name='txqs' filepath='net/core/dev.c' line='8933' column='1'/>
+        <parameter type-id='type-id-5' name='rxqs' filepath='net/core/dev.c' line='8933' column='1'/>
+        <return type-id='type-id-1648'/>
+      </function-decl>
+      <function-decl name='unregister_netdev' mangled-name='unregister_netdev' filepath='net/core/dev.c' line='9149' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_netdev'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/dev.c' line='9149' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netdev_increment_features' mangled-name='netdev_increment_features' filepath='net/core/dev.c' line='9356' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_increment_features'>
+        <parameter type-id='type-id-1666' name='all' filepath='net/core/dev.c' line='9356' column='1'/>
+        <parameter type-id='type-id-1666' name='one' filepath='net/core/dev.c' line='9357' column='1'/>
+        <parameter type-id='type-id-1666' name='mask' filepath='net/core/dev.c' line='9357' column='1'/>
+        <return type-id='type-id-1666'/>
+      </function-decl>
+      <function-decl name='netdev_warn' mangled-name='netdev_warn' filepath='net/core/dev.c' line='9491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_warn'>
+        <parameter type-id='type-id-2696' name='dev' filepath='net/core/dev.c' line='9491' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='net/core/dev.c' line='9491' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-6171'>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6173'/>
+        <parameter type-id='type-id-6178'/>
+        <parameter type-id='type-id-2'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6172'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6180'/>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6176'>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-6175'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6181'>
+        <parameter type-id='type-id-6180'/>
+        <parameter type-id='type-id-3666'/>
+        <return type-id='type-id-33'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6148'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-6169'/>
+        <return type-id='type-id-5'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6183'>
+        <parameter type-id='type-id-877'/>
+        <parameter type-id='type-id-6180'/>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/dev_addr_lists.c' language='LANG_C89'>
+      <function-decl name='dev_uc_sync_multiple' mangled-name='dev_uc_sync_multiple' filepath='net/core/dev_addr_lists.c' line='567' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_uc_sync_multiple'>
+        <parameter type-id='type-id-1648' name='to' filepath='net/core/dev_addr_lists.c' line='567' column='1'/>
+        <parameter type-id='type-id-1648' name='from' filepath='net/core/dev_addr_lists.c' line='567' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='dev_uc_unsync' mangled-name='dev_uc_unsync' filepath='net/core/dev_addr_lists.c' line='592' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_uc_unsync'>
+        <parameter type-id='type-id-1648' name='to' filepath='net/core/dev_addr_lists.c' line='592' column='1'/>
+        <parameter type-id='type-id-1648' name='from' filepath='net/core/dev_addr_lists.c' line='592' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='dev_mc_sync_multiple' mangled-name='dev_mc_sync_multiple' filepath='net/core/dev_addr_lists.c' line='788' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_mc_sync_multiple'>
+        <parameter type-id='type-id-1648' name='to' filepath='net/core/dev_addr_lists.c' line='788' column='1'/>
+        <parameter type-id='type-id-1648' name='from' filepath='net/core/dev_addr_lists.c' line='788' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='dev_mc_unsync' mangled-name='dev_mc_unsync' filepath='net/core/dev_addr_lists.c' line='813' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_mc_unsync'>
+        <parameter type-id='type-id-1648' name='to' filepath='net/core/dev_addr_lists.c' line='813' column='1'/>
+        <parameter type-id='type-id-1648' name='from' filepath='net/core/dev_addr_lists.c' line='813' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/filter.c' language='LANG_C89'>
+      <union-decl name='__anonymous_union__2' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/bpf.h' line='298' column='1' id='type-id-6184'>
+        <data-member access='private'>
+          <var-decl name='work' type-id='type-id-255' visibility='default' filepath='include/linux/bpf.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rcu' type-id='type-id-385' visibility='default' filepath='include/linux/bpf.h' line='300' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__3' is-anonymous='yes' visibility='default' filepath='include/linux/filter.h' line='502' column='1' id='type-id-6185'>
+        <data-member access='private'>
+          <var-decl name='insns' type-id='type-id-1170' visibility='default' filepath='include/linux/filter.h' line='503' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='insnsi' type-id='type-id-954' visibility='default' filepath='include/linux/filter.h' line='504' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='xdp_buff' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/xdp.h' line='66' column='1' id='type-id-6186'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='data' type-id='type-id-15' visibility='default' filepath='include/net/xdp.h' line='67' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='data_end' type-id='type-id-15' visibility='default' filepath='include/net/xdp.h' line='68' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='data_meta' type-id='type-id-15' visibility='default' filepath='include/net/xdp.h' line='69' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='data_hard_start' type-id='type-id-15' visibility='default' filepath='include/net/xdp.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='handle' type-id='type-id-16' visibility='default' filepath='include/net/xdp.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='rxq' type-id='type-id-3594' visibility='default' filepath='include/net/xdp.h' line='72' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-6186' size-in-bits='64' id='type-id-6187'/>
+      <pointer-type-def type-id='type-id-1922' size-in-bits='64' id='type-id-3594'/>
+      <function-decl name='bpf_warn_invalid_xdp_action' mangled-name='bpf_warn_invalid_xdp_action' filepath='net/core/filter.c' line='5530' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_warn_invalid_xdp_action'>
+        <parameter type-id='type-id-7' name='act' filepath='net/core/filter.c' line='5530' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='xdp_do_flush_map' mangled-name='xdp_do_flush_map' filepath='net/core/filter.c' line='3214' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_do_flush_map'>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='xdp_do_redirect' mangled-name='xdp_do_redirect' filepath='net/core/filter.c' line='3300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_do_redirect'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/core/filter.c' line='3300' column='1'/>
+        <parameter type-id='type-id-6187' name='xdp' filepath='net/core/filter.c' line='3300' column='1'/>
+        <parameter type-id='type-id-1228' name='xdp_prog' filepath='net/core/filter.c' line='3301' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/core/sock_diag.c' language='LANG_C89'>
+      <class-decl name='sock_diag_handler' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/sock_diag.h' line='15' column='1' id='type-id-6188'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='family' type-id='type-id-893' visibility='default' filepath='include/linux/sock_diag.h' line='16' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dump' type-id='type-id-6189' visibility='default' filepath='include/linux/sock_diag.h' line='17' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='get_info' type-id='type-id-6190' visibility='default' filepath='include/linux/sock_diag.h' line='18' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='destroy' type-id='type-id-6189' visibility='default' filepath='include/linux/sock_diag.h' line='19' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='type-id-6188' const='yes' id='type-id-6191'/>
+      <pointer-type-def type-id='type-id-6191' size-in-bits='64' id='type-id-6192'/>
+      <pointer-type-def type-id='type-id-6193' size-in-bits='64' id='type-id-6189'/>
+      <pointer-type-def type-id='type-id-6194' size-in-bits='64' id='type-id-6190'/>
+      <function-decl name='sock_diag_save_cookie' mangled-name='sock_diag_save_cookie' filepath='net/core/sock_diag.c' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_diag_save_cookie'>
+        <parameter type-id='type-id-3666' name='sk' filepath='net/core/sock_diag.c' line='50' column='1'/>
+        <parameter type-id='type-id-3629' name='cookie' filepath='net/core/sock_diag.c' line='50' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='sock_diag_register' mangled-name='sock_diag_register' filepath='net/core/sock_diag.c' line='179' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_diag_register'>
+        <parameter type-id='type-id-6192' name='hndl' filepath='net/core/sock_diag.c' line='179' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sock_diag_unregister' mangled-name='sock_diag_unregister' filepath='net/core/sock_diag.c' line='197' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_diag_unregister'>
+        <parameter type-id='type-id-6192' name='hnld' filepath='net/core/sock_diag.c' line='197' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-6193'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-3035'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6194'>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-3666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/ethernet/eth.c' language='LANG_C89'>
+      <function-decl name='eth_type_trans' mangled-name='eth_type_trans' filepath='net/ethernet/eth.c' line='156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='eth_type_trans'>
+        <parameter type-id='type-id-1766' name='skb' filepath='net/ethernet/eth.c' line='156' column='1'/>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/ethernet/eth.c' line='156' column='1'/>
+        <return type-id='type-id-924'/>
+      </function-decl>
+      <function-decl name='eth_prepare_mac_addr_change' mangled-name='eth_prepare_mac_addr_change' filepath='net/ethernet/eth.c' line='269' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='eth_prepare_mac_addr_change'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/ethernet/eth.c' line='269' column='1'/>
+        <parameter type-id='type-id-15' name='p' filepath='net/ethernet/eth.c' line='269' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='eth_commit_mac_addr_change' mangled-name='eth_commit_mac_addr_change' filepath='net/ethernet/eth.c' line='286' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='eth_commit_mac_addr_change'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/ethernet/eth.c' line='286' column='1'/>
+        <parameter type-id='type-id-15' name='p' filepath='net/ethernet/eth.c' line='286' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='eth_validate_addr' mangled-name='eth_validate_addr' filepath='net/ethernet/eth.c' line='332' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='eth_validate_addr'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/ethernet/eth.c' line='332' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='ether_setup' mangled-name='ether_setup' filepath='net/ethernet/eth.c' line='354' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ether_setup'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/ethernet/eth.c' line='354' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='alloc_etherdev_mqs' mangled-name='alloc_etherdev_mqs' filepath='net/ethernet/eth.c' line='388' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='alloc_etherdev_mqs'>
+        <parameter type-id='type-id-17' name='sizeof_priv' filepath='net/ethernet/eth.c' line='388' column='1'/>
+        <parameter type-id='type-id-5' name='txqs' filepath='net/ethernet/eth.c' line='388' column='1'/>
+        <parameter type-id='type-id-5' name='rxqs' filepath='net/ethernet/eth.c' line='389' column='1'/>
+        <return type-id='type-id-1648'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/sched/sch_generic.c' language='LANG_C89'>
+      <function-decl name='netif_carrier_on' mangled-name='netif_carrier_on' filepath='net/sched/sch_generic.c' line='510' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_carrier_on'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/sched/sch_generic.c' line='510' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='netif_carrier_off' mangled-name='netif_carrier_off' filepath='net/sched/sch_generic.c' line='529' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_carrier_off'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/sched/sch_generic.c' line='529' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/netfilter/core.c' language='LANG_C89'>
+      <class-decl name='nf_conntrack' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/skbuff.h' line='248' column='1' id='type-id-6195'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='use' type-id='type-id-26' visibility='default' filepath='include/linux/skbuff.h' line='249' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='type-id-6195' size-in-bits='64' id='type-id-6196'/>
+      <function-decl name='nf_conntrack_destroy' mangled-name='nf_conntrack_destroy' filepath='net/netfilter/core.c' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nf_conntrack_destroy'>
+        <parameter type-id='type-id-6196' name='nfct' filepath='net/netfilter/core.c' line='594' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/wireless/core.c' language='LANG_C89'>
+
+      <array-type-def dimensions='1' type-id='type-id-6197' size-in-bits='864' id='type-id-6198'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-6199' size-in-bits='336' id='type-id-6200'>
+        <subrange length='21' type-id='type-id-9' id='type-id-956'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-6201' size-in-bits='128' id='type-id-6202'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='24' id='type-id-6203'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <class-decl name='cfg80211_conn' size-in-bits='3072' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-6204'/>
+      <array-type-def dimensions='1' type-id='type-id-6205' size-in-bits='infinite' id='type-id-6206'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-6207' size-in-bits='infinite' id='type-id-6208'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-6209' size-in-bits='192' id='type-id-6210'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-6211' size-in-bits='256' id='type-id-6212'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-6213' size-in-bits='1024' id='type-id-6214'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-6215' size-in-bits='infinite' id='type-id-6216'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-738' size-in-bits='infinite' id='type-id-6217'>
+        <subrange length='infinite' type-id='type-id-9' id='type-id-10'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-209' size-in-bits='32' id='type-id-6218'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-688' size-in-bits='128' id='type-id-6219'>
+        <subrange length='8' type-id='type-id-9' id='type-id-926'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='64' id='type-id-6220'>
+        <subrange length='2' type-id='type-id-9' id='type-id-128'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-7' size-in-bits='96' id='type-id-6221'>
+        <subrange length='3' type-id='type-id-9' id='type-id-196'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='80' id='type-id-6222'>
+        <subrange length='10' type-id='type-id-9' id='type-id-1189'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='200' id='type-id-6223'>
+        <subrange length='25' type-id='type-id-9' id='type-id-6224'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='256' id='type-id-6225'>
+        <subrange length='32' type-id='type-id-9' id='type-id-939'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='32' id='type-id-6226'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+      </array-type-def>
+      <array-type-def dimensions='2' type-id='type-id-214' size-in-bits='136' id='type-id-6227'>
+        <subrange length='4' type-id='type-id-9' id='type-id-107'/>
+
+        <subrange length='13' type-id='type-id-9' id='type-id-201'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='40' id='type-id-6228'>
+        <subrange length='5' type-id='type-id-9' id='type-id-110'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='48' id='type-id-6229'>
+        <subrange length='6' type-id='type-id-9' id='type-id-191'/>
+
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='type-id-214' size-in-bits='72' id='type-id-6230'>
+        <subrange length='9' type-id='type-id-9' id='type-id-951'/>
+
+      </array-type-def>
+      <class-decl name='wiphy' size-in-bits='9472' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='3972' column='1' id='type-id-6231'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='perm_addr' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='3976' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='addr_mask' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='3977' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='addresses' type-id='type-id-6232' visibility='default' filepath='include/net/cfg80211.h' line='3979' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mgmt_stypes' type-id='type-id-6233' visibility='default' filepath='include/net/cfg80211.h' line='3981' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='iface_combinations' type-id='type-id-6234' visibility='default' filepath='include/net/cfg80211.h' line='3983' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='n_iface_combinations' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3984' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='software_iftypes' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='3985' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='368'>
+          <var-decl name='n_addresses' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='3987' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='interface_modes' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='3990' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='400'>
+          <var-decl name='max_acl_mac_addrs' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='3992' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3994' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='regulatory_flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3994' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='features' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3994' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='ext_features' type-id='type-id-6226' visibility='default' filepath='include/net/cfg80211.h' line='3995' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='ap_sme_capa' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3997' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='signal_type' type-id='type-id-6235' visibility='default' filepath='include/net/cfg80211.h' line='3999' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='bss_priv_size' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='4001' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='max_scan_ssids' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4002' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='648'>
+          <var-decl name='max_sched_scan_reqs' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4003' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='656'>
+          <var-decl name='max_sched_scan_ssids' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4004' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='664'>
+          <var-decl name='max_match_sets' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4005' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='max_scan_ie_len' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='4006' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='688'>
+          <var-decl name='max_sched_scan_ie_len' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='4007' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='max_sched_scan_plans' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4008' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='max_sched_scan_plan_interval' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4009' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='max_sched_scan_plan_iterations' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4010' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='n_cipher_suites' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='4012' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='cipher_suites' type-id='type-id-2726' visibility='default' filepath='include/net/cfg80211.h' line='4013' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='retry_short' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4015' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='904'>
+          <var-decl name='retry_long' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4016' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='frag_threshold' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4017' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='rts_threshold' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4018' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='coverage_class' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4019' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1000'>
+          <var-decl name='fw_version' type-id='type-id-373' visibility='default' filepath='include/net/cfg80211.h' line='4021' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='hw_version' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4022' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='wowlan' type-id='type-id-6236' visibility='default' filepath='include/net/cfg80211.h' line='4025' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='wowlan_config' type-id='type-id-6237' visibility='default' filepath='include/net/cfg80211.h' line='4026' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='max_remain_on_channel_duration' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='4029' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1488'>
+          <var-decl name='max_num_pmkids' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4031' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1504'>
+          <var-decl name='available_antennas_tx' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4033' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='available_antennas_rx' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4034' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1568'>
+          <var-decl name='probe_resp_offload' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4041' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='extended_capabilities' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='4043' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='extended_capabilities_mask' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='4043' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='extended_capabilities_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4044' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='iftype_ext_capab' type-id='type-id-6238' visibility='default' filepath='include/net/cfg80211.h' line='4046' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='num_iftype_ext_capab' type-id='type-id-5' visibility='default' filepath='include/net/cfg80211.h' line='4047' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='privid' type-id='type-id-15' visibility='default' filepath='include/net/cfg80211.h' line='4054' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='bands' type-id='type-id-6210' visibility='default' filepath='include/net/cfg80211.h' line='4056' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='reg_notifier' type-id='type-id-6239' visibility='default' filepath='include/net/cfg80211.h' line='4059' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='regd' type-id='type-id-6240' visibility='default' filepath='include/net/cfg80211.h' line='4064' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='dev' type-id='type-id-388' visibility='default' filepath='include/net/cfg80211.h' line='4068' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8512'>
+          <var-decl name='registered' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='4071' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8576'>
+          <var-decl name='debugfsdir' type-id='type-id-23' visibility='default' filepath='include/net/cfg80211.h' line='4074' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8640'>
+          <var-decl name='ht_capa_mod_mask' type-id='type-id-6241' visibility='default' filepath='include/net/cfg80211.h' line='4076' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8704'>
+          <var-decl name='vht_capa_mod_mask' type-id='type-id-6242' visibility='default' filepath='include/net/cfg80211.h' line='4077' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8768'>
+          <var-decl name='wdev_list' type-id='type-id-20' visibility='default' filepath='include/net/cfg80211.h' line='4079' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8896'>
+          <var-decl name='_net' type-id='type-id-1690' visibility='default' filepath='include/net/cfg80211.h' line='4082' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8896'>
+          <var-decl name='coalesce' type-id='type-id-6243' visibility='default' filepath='include/net/cfg80211.h' line='4088' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8960'>
+          <var-decl name='vendor_commands' type-id='type-id-6244' visibility='default' filepath='include/net/cfg80211.h' line='4090' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9024'>
+          <var-decl name='vendor_events' type-id='type-id-6245' visibility='default' filepath='include/net/cfg80211.h' line='4091' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9088'>
+          <var-decl name='n_vendor_commands' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='4092' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9120'>
+          <var-decl name='n_vendor_events' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='4092' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9152'>
+          <var-decl name='max_ap_assoc_sta' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='4094' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9168'>
+          <var-decl name='max_num_csa_counters' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4096' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9176'>
+          <var-decl name='max_adj_channel_rssi_comp' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4097' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9184'>
+          <var-decl name='bss_select_support' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4099' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9216'>
+          <var-decl name='cookie_counter' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='4101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9280'>
+          <var-decl name='nan_supported_bands' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9312'>
+          <var-decl name='txq_limit' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9344'>
+          <var-decl name='txq_memory_limit' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9376'>
+          <var-decl name='txq_quantum' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='9472'>
+          <var-decl name='priv' type-id='type-id-440' visibility='default' filepath='include/net/cfg80211.h' line='4109' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mac_address' size-in-bits='48' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='793' column='1' id='type-id-6215'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='addr' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='794' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_txrx_stypes' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='3637' column='1' id='type-id-6246'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tx' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='3638' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='rx' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='3638' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_iface_combination' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='3579' column='1' id='type-id-6247'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='limits' type-id='type-id-6248' visibility='default' filepath='include/net/cfg80211.h' line='3584' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='num_different_channels' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3590' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='max_interfaces' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='3596' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='n_limits' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='3602' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='beacon_int_infra_match' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='3609' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='radar_detect_widths' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='3615' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='136'>
+          <var-decl name='radar_detect_regions' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='3621' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='beacon_int_min_gcd' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3634' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_iface_limit' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='3515' column='1' id='type-id-6249'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='max' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='3516' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='types' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='3517' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='cfg80211_signal_type' filepath='include/net/cfg80211.h' line='1903' column='1' id='type-id-6235'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='CFG80211_SIGNAL_TYPE_NONE' value='0'/>
+        <enumerator name='CFG80211_SIGNAL_TYPE_MBM' value='1'/>
+        <enumerator name='CFG80211_SIGNAL_TYPE_UNSPEC' value='2'/>
+      </enum-decl>
+      <class-decl name='wiphy_wowlan_support' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='3693' column='1' id='type-id-6250'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3694' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='n_patterns' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3695' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pattern_max_len' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3696' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='pattern_min_len' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3697' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='max_pkt_offset' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3698' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='max_nd_match_sets' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3699' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tcp' type-id='type-id-6251' visibility='default' filepath='include/net/cfg80211.h' line='3700' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='wiphy_wowlan_tcp_support' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='3670' column='1' id='type-id-6252'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tok' type-id='type-id-6253' visibility='default' filepath='include/net/cfg80211.h' line='3671' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='data_payload_max' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='data_interval_max' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3673' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='wake_payload_max' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3674' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='seq' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='3675' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nl80211_wowlan_tcp_data_token_feature' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4671' column='1' id='type-id-6254'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='min_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='max_len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4672' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bufsize' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4672' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_wowlan' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2463' column='1' id='type-id-6255'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='any' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2464' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='disconnect' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2464' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='magic_pkt' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2464' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='gtk_rekey_failure' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2464' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='eap_identity_req' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='four_way_handshake' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='rfkill_release' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2466' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='patterns' type-id='type-id-6256' visibility='default' filepath='include/net/cfg80211.h' line='2467' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tcp' type-id='type-id-6257' visibility='default' filepath='include/net/cfg80211.h' line='2468' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='n_patterns' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2469' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='nd_config' type-id='type-id-6258' visibility='default' filepath='include/net/cfg80211.h' line='2470' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_pkt_pattern' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2404' column='1' id='type-id-6259'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mask' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pattern' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='pattern_len' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='pkt_offset' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2407' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_wowlan_tcp' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2429' column='1' id='type-id-6260'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='sock' type-id='type-id-5670' visibility='default' filepath='include/net/cfg80211.h' line='2430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='src' type-id='type-id-927' visibility='default' filepath='include/net/cfg80211.h' line='2431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='dst' type-id='type-id-927' visibility='default' filepath='include/net/cfg80211.h' line='2431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='src_port' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='2432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='144'>
+          <var-decl name='dst_port' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='2432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='dst_mac' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='2433' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='payload_len' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='payload' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2435' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='payload_seq' type-id='type-id-6261' visibility='default' filepath='include/net/cfg80211.h' line='2436' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='data_interval' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='2437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='wake_len' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='2438' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='wake_data' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='wake_mask' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='tokens_size' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='2440' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='payload_tok' type-id='type-id-6262' visibility='default' filepath='include/net/cfg80211.h' line='2442' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__' size-in-bits='6848' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='353' column='1' id='type-id-6263'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mmap' type-id='type-id-1207' visibility='default' filepath='include/linux/mm_types.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mm_rb' type-id='type-id-416' visibility='default' filepath='include/linux/mm_types.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='vmacache_seqnum' type-id='type-id-40' visibility='default' filepath='include/linux/mm_types.h' line='356' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='get_unmapped_area' type-id='type-id-1482' visibility='default' filepath='include/linux/mm_types.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mmap_base' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='mmap_legacy_base' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='task_size' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='highest_vm_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='pgd' type-id='type-id-1483' visibility='default' filepath='include/linux/mm_types.h' line='371' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mm_users' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='mm_count' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='pgtables_bytes' type-id='type-id-115' visibility='default' filepath='include/linux/mm_types.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='map_count' type-id='type-id-17' visibility='default' filepath='include/linux/mm_types.h' line='396' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='page_table_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='mmap_sem' type-id='type-id-246' visibility='default' filepath='include/linux/mm_types.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='mmlist' type-id='type-id-20' visibility='default' filepath='include/linux/mm_types.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='hiwater_rss' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='hiwater_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='total_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='locked_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='pinned_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='data_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='exec_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='stack_vm' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='def_flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='419' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='arg_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='421' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='start_code' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='end_code' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='start_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='end_data' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='start_brk' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='brk' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='start_stack' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='423' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='arg_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='arg_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='env_start' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='env_end' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='saved_auxv' type-id='type-id-1200' visibility='default' filepath='include/linux/mm_types.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='rss_stat' type-id='type-id-1484' visibility='default' filepath='include/linux/mm_types.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='binfmt' type-id='type-id-1485' visibility='default' filepath='include/linux/mm_types.h' line='434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='context' type-id='type-id-1486' visibility='default' filepath='include/linux/mm_types.h' line='437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='flags' type-id='type-id-16' visibility='default' filepath='include/linux/mm_types.h' line='439' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='core_state' type-id='type-id-1487' visibility='default' filepath='include/linux/mm_types.h' line='441' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='membarrier_state' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='443' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6176'>
+          <var-decl name='ioctx_lock' type-id='type-id-247' visibility='default' filepath='include/linux/mm_types.h' line='446' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='ioctx_table' type-id='type-id-1488' visibility='default' filepath='include/linux/mm_types.h' line='447' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='owner' type-id='type-id-431' visibility='default' filepath='include/linux/mm_types.h' line='460' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='user_ns' type-id='type-id-915' visibility='default' filepath='include/linux/mm_types.h' line='462' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='exe_file' type-id='type-id-83' visibility='default' filepath='include/linux/mm_types.h' line='465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='tlb_flush_pending' type-id='type-id-26' visibility='default' filepath='include/linux/mm_types.h' line='491' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='uprobes_state' type-id='type-id-1489' visibility='default' filepath='include/linux/mm_types.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='async_put_work' type-id='type-id-255' visibility='default' filepath='include/linux/mm_types.h' line='500' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/mm_types.h' line='303' column='1' id='type-id-6264'>
+        <data-member access='private'>
+          <var-decl name='shared' type-id='type-id-2418' visibility='default' filepath='include/linux/mm_types.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='anon_name' type-id='type-id-4' visibility='default' filepath='include/linux/mm_types.h' line='308' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='nl80211_wowlan_tcp_data_seq' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4649' column='1' id='type-id-6261'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4650' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='offset' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4650' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4650' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nl80211_wowlan_tcp_data_token' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4660' column='1' id='type-id-6262'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='offset' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4661' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='len' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4661' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='token_stream' type-id='type-id-944' visibility='default' filepath='include/uapi/linux/nl80211.h' line='4662' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_sched_scan_request' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1859' column='1' id='type-id-6265'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='reqid' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1860' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ssids' type-id='type-id-6266' visibility='default' filepath='include/net/cfg80211.h' line='1861' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='n_ssids' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1862' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='n_channels' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1863' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='scan_width' type-id='type-id-6267' visibility='default' filepath='include/net/cfg80211.h' line='1864' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='1865' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ie_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='1866' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1867' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='match_sets' type-id='type-id-6268' visibility='default' filepath='include/net/cfg80211.h' line='1868' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='n_match_sets' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1869' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='min_rssi_thold' type-id='type-id-738' visibility='default' filepath='include/net/cfg80211.h' line='1870' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='delay' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1871' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='scan_plans' type-id='type-id-6269' visibility='default' filepath='include/net/cfg80211.h' line='1872' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='n_scan_plans' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1873' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='mac_addr' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='1875' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='784'>
+          <var-decl name='mac_addr_mask' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='1876' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='relative_rssi_set' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1878' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='840'>
+          <var-decl name='relative_rssi' type-id='type-id-209' visibility='default' filepath='include/net/cfg80211.h' line='1879' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='rssi_adjust' type-id='type-id-6270' visibility='default' filepath='include/net/cfg80211.h' line='1880' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='wiphy' type-id='type-id-6271' visibility='default' filepath='include/net/cfg80211.h' line='1883' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/net/cfg80211.h' line='1884' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='scan_start' type-id='type-id-16' visibility='default' filepath='include/net/cfg80211.h' line='1885' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='report_results' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1886' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/net/cfg80211.h' line='1887' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='owner_nlportid' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1888' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='nl_owner_dead' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1889' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/cfg80211.h' line='1890' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='channels' type-id='type-id-6206' visibility='default' filepath='include/net/cfg80211.h' line='1893' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_ssid' size-in-bits='264' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1679' column='1' id='type-id-6272'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ssid' type-id='type-id-6225' visibility='default' filepath='include/net/cfg80211.h' line='1680' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ssid_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1681' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_bss_scan_width' filepath='include/uapi/linux/nl80211.h' line='4070' column='1' id='type-id-6267'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_BSS_CHAN_WIDTH_20' value='0'/>
+        <enumerator name='NL80211_BSS_CHAN_WIDTH_10' value='1'/>
+        <enumerator name='NL80211_BSS_CHAN_WIDTH_5' value='2'/>
+      </enum-decl>
+      <class-decl name='cfg80211_match_set' size-in-bits='352' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1778' column='1' id='type-id-6273'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ssid' type-id='type-id-6272' visibility='default' filepath='include/net/cfg80211.h' line='1779' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='264'>
+          <var-decl name='bssid' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='1780' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='rssi_thold' type-id='type-id-738' visibility='default' filepath='include/net/cfg80211.h' line='1781' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_sched_scan_plan' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1793' column='1' id='type-id-6274'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='interval' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1794' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='iterations' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1795' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_bss_select_adjust' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1804' column='1' id='type-id-6270'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='band' type-id='type-id-6275' visibility='default' filepath='include/net/cfg80211.h' line='1805' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='delta' type-id='type-id-209' visibility='default' filepath='include/net/cfg80211.h' line='1806' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_band' filepath='include/uapi/linux/nl80211.h' line='4345' column='1' id='type-id-6275'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_BAND_2GHZ' value='0'/>
+        <enumerator name='NL80211_BAND_5GHZ' value='1'/>
+        <enumerator name='NL80211_BAND_60GHZ' value='2'/>
+        <enumerator name='NUM_NL80211_BANDS' value='3'/>
+      </enum-decl>
+      <class-decl name='wireless_dev' size-in-bits='2752' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='4312' column='1' id='type-id-6276'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='wiphy' type-id='type-id-6271' visibility='default' filepath='include/net/cfg80211.h' line='4313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='iftype' type-id='type-id-6277' visibility='default' filepath='include/net/cfg80211.h' line='4314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/cfg80211.h' line='4317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='netdev' type-id='type-id-1648' visibility='default' filepath='include/net/cfg80211.h' line='4318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='identifier' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4320' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='mgmt_registrations' type-id='type-id-20' visibility='default' filepath='include/net/cfg80211.h' line='4322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='mgmt_registrations_lock' type-id='type-id-247' visibility='default' filepath='include/net/cfg80211.h' line='4323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mtx' type-id='type-id-245' visibility='default' filepath='include/net/cfg80211.h' line='4325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='use_4addr' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='4327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='840'>
+          <var-decl name='is_running' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='4327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='848'>
+          <var-decl name='address' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='4329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='ssid' type-id='type-id-6225' visibility='default' filepath='include/net/cfg80211.h' line='4332' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='ssid_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1160'>
+          <var-decl name='mesh_id_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1168'>
+          <var-decl name='mesh_id_up_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='4333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='conn' type-id='type-id-6278' visibility='default' filepath='include/net/cfg80211.h' line='4334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='connect_keys' type-id='type-id-6279' visibility='default' filepath='include/net/cfg80211.h' line='4335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='conn_bss_type' type-id='type-id-6280' visibility='default' filepath='include/net/cfg80211.h' line='4336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='conn_owner_nlportid' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='disconnect_wk' type-id='type-id-255' visibility='default' filepath='include/net/cfg80211.h' line='4339' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='disconnect_bssid' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='4340' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='event_list' type-id='type-id-20' visibility='default' filepath='include/net/cfg80211.h' line='4342' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='event_lock' type-id='type-id-247' visibility='default' filepath='include/net/cfg80211.h' line='4343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='current_bss' type-id='type-id-6281' visibility='default' filepath='include/net/cfg80211.h' line='4345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='preset_chandef' type-id='type-id-6282' visibility='default' filepath='include/net/cfg80211.h' line='4346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='chandef' type-id='type-id-6282' visibility='default' filepath='include/net/cfg80211.h' line='4347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='ibss_fixed' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='4349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2376'>
+          <var-decl name='ibss_dfs_possible' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='4350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2384'>
+          <var-decl name='ps' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='4352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2400'>
+          <var-decl name='ps_timeout' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='4353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='beacon_interval' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='4355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2464'>
+          <var-decl name='ap_unexpected_nlportid' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='owner_nlportid' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='4359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2528'>
+          <var-decl name='nl_owner_dead' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='4360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2536'>
+          <var-decl name='cac_started' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='4362' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='cac_start_time' type-id='type-id-16' visibility='default' filepath='include/net/cfg80211.h' line='4363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='cac_time_ms' type-id='type-id-5' visibility='default' filepath='include/net/cfg80211.h' line='4364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='cqm_config' type-id='type-id-6283' visibility='default' filepath='include/net/cfg80211.h' line='4381' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_iftype' filepath='include/uapi/linux/nl80211.h' line='2775' column='1' id='type-id-6277'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_IFTYPE_UNSPECIFIED' value='0'/>
+        <enumerator name='NL80211_IFTYPE_ADHOC' value='1'/>
+        <enumerator name='NL80211_IFTYPE_STATION' value='2'/>
+        <enumerator name='NL80211_IFTYPE_AP' value='3'/>
+        <enumerator name='NL80211_IFTYPE_AP_VLAN' value='4'/>
+        <enumerator name='NL80211_IFTYPE_WDS' value='5'/>
+        <enumerator name='NL80211_IFTYPE_MONITOR' value='6'/>
+        <enumerator name='NL80211_IFTYPE_MESH_POINT' value='7'/>
+        <enumerator name='NL80211_IFTYPE_P2P_CLIENT' value='8'/>
+        <enumerator name='NL80211_IFTYPE_P2P_GO' value='9'/>
+        <enumerator name='NL80211_IFTYPE_P2P_DEVICE' value='10'/>
+        <enumerator name='NL80211_IFTYPE_OCB' value='11'/>
+        <enumerator name='NL80211_IFTYPE_NAN' value='12'/>
+        <enumerator name='NUM_NL80211_IFTYPES' value='13'/>
+        <enumerator name='NL80211_IFTYPE_MAX' value='12'/>
+      </enum-decl>
+      <class-decl name='cfg80211_cached_keys' size-in-bits='1472' is-struct='yes' visibility='default' filepath='net/wireless/core.h' line='246' column='1' id='type-id-6284'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='params' type-id='type-id-6214' visibility='default' filepath='net/wireless/core.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='data' type-id='type-id-6227' visibility='default' filepath='net/wireless/core.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1440'>
+          <var-decl name='def' type-id='type-id-17' visibility='default' filepath='net/wireless/core.h' line='249' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='key_params' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='489' column='1' id='type-id-6213'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='key' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='490' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='seq' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='491' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='key_len' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='492' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='seq_len' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='493' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='cipher' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='494' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='ieee80211_bss_type' filepath='include/net/cfg80211.h' line='208' column='1' id='type-id-6280'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='IEEE80211_BSS_TYPE_ESS' value='0'/>
+        <enumerator name='IEEE80211_BSS_TYPE_PBSS' value='1'/>
+        <enumerator name='IEEE80211_BSS_TYPE_IBSS' value='2'/>
+        <enumerator name='IEEE80211_BSS_TYPE_MBSS' value='3'/>
+        <enumerator name='IEEE80211_BSS_TYPE_ANY' value='4'/>
+      </enum-decl>
+      <class-decl name='cfg80211_internal_bss' size-in-bits='1408' is-struct='yes' visibility='default' filepath='net/wireless/core.h' line='140' column='1' id='type-id-6285'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='net/wireless/core.h' line='141' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='hidden_list' type-id='type-id-20' visibility='default' filepath='net/wireless/core.h' line='142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rbn' type-id='type-id-422' visibility='default' filepath='net/wireless/core.h' line='143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ts_boottime' type-id='type-id-40' visibility='default' filepath='net/wireless/core.h' line='144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='ts' type-id='type-id-16' visibility='default' filepath='net/wireless/core.h' line='145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='refcount' type-id='type-id-16' visibility='default' filepath='net/wireless/core.h' line='146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='hold' type-id='type-id-26' visibility='default' filepath='net/wireless/core.h' line='147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='parent_tsf' type-id='type-id-40' visibility='default' filepath='net/wireless/core.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='parent_bssid' type-id='type-id-6229' visibility='default' filepath='net/wireless/core.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='pub' type-id='type-id-6286' visibility='default' filepath='net/wireless/core.h' line='162' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_bss' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1985' column='1' id='type-id-6286'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='channel' type-id='type-id-6205' visibility='default' filepath='include/net/cfg80211.h' line='1986' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='scan_width' type-id='type-id-6267' visibility='default' filepath='include/net/cfg80211.h' line='1987' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ies' type-id='type-id-6287' visibility='default' filepath='include/net/cfg80211.h' line='1989' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='beacon_ies' type-id='type-id-6287' visibility='default' filepath='include/net/cfg80211.h' line='1990' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='proberesp_ies' type-id='type-id-6287' visibility='default' filepath='include/net/cfg80211.h' line='1991' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='hidden_beacon_bss' type-id='type-id-6288' visibility='default' filepath='include/net/cfg80211.h' line='1993' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='signal' type-id='type-id-738' visibility='default' filepath='include/net/cfg80211.h' line='1995' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='beacon_interval' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1997' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='432'>
+          <var-decl name='capability' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1998' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='bssid' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='2000' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='496'>
+          <var-decl name='chains' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2001' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='504'>
+          <var-decl name='chain_signal' type-id='type-id-6218' visibility='default' filepath='include/net/cfg80211.h' line='2002' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='priv' type-id='type-id-5885' visibility='default' filepath='include/net/cfg80211.h' line='2004' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_channel' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='150' column='1' id='type-id-6289'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='band' type-id='type-id-6275' visibility='default' filepath='include/net/cfg80211.h' line='151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='center_freq' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='hw_value' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='max_antenna_gain' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='155' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='max_power' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='max_reg_power' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='157' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='beacon_found' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='158' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='orig_flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='orig_mag' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='orig_mpwr' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='160' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dfs_state' type-id='type-id-6290' visibility='default' filepath='include/net/cfg80211.h' line='161' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='dfs_state_entered' type-id='type-id-16' visibility='default' filepath='include/net/cfg80211.h' line='162' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='dfs_cac_ms' type-id='type-id-5' visibility='default' filepath='include/net/cfg80211.h' line='163' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_dfs_state' filepath='include/uapi/linux/nl80211.h' line='5468' column='1' id='type-id-6290'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_DFS_USABLE' value='0'/>
+        <enumerator name='NL80211_DFS_UNAVAILABLE' value='1'/>
+        <enumerator name='NL80211_DFS_AVAILABLE' value='2'/>
+      </enum-decl>
+      <class-decl name='cfg80211_bss_ies' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1948' column='1' id='type-id-6291'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='tsf' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1949' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/net/cfg80211.h' line='1950' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='len' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1951' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='from_beacon' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1952' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='232'>
+          <var-decl name='data' type-id='type-id-5885' visibility='default' filepath='include/net/cfg80211.h' line='1953' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_chan_def' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='505' column='1' id='type-id-6282'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chan' type-id='type-id-6205' visibility='default' filepath='include/net/cfg80211.h' line='506' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='width' type-id='type-id-6292' visibility='default' filepath='include/net/cfg80211.h' line='507' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='center_freq1' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='508' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='center_freq2' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='509' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_chan_width' filepath='include/uapi/linux/nl80211.h' line='4050' column='1' id='type-id-6292'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_CHAN_WIDTH_20_NOHT' value='0'/>
+        <enumerator name='NL80211_CHAN_WIDTH_20' value='1'/>
+        <enumerator name='NL80211_CHAN_WIDTH_40' value='2'/>
+        <enumerator name='NL80211_CHAN_WIDTH_80' value='3'/>
+        <enumerator name='NL80211_CHAN_WIDTH_80P80' value='4'/>
+        <enumerator name='NL80211_CHAN_WIDTH_160' value='5'/>
+        <enumerator name='NL80211_CHAN_WIDTH_5' value='6'/>
+        <enumerator name='NL80211_CHAN_WIDTH_10' value='7'/>
+      </enum-decl>
+      <class-decl name='cfg80211_cqm_config' size-in-bits='96' is-struct='yes' visibility='default' filepath='net/wireless/core.h' line='263' column='1' id='type-id-6293'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rssi_hyst' type-id='type-id-7' visibility='default' filepath='net/wireless/core.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='last_rssi_event_value' type-id='type-id-738' visibility='default' filepath='net/wireless/core.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='n_rssi_thresholds' type-id='type-id-17' visibility='default' filepath='net/wireless/core.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='rssi_thresholds' type-id='type-id-6217' visibility='default' filepath='net/wireless/core.h' line='267' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='wiphy_iftype_ext_capab' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='3799' column='1' id='type-id-6294'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='iftype' type-id='type-id-6277' visibility='default' filepath='include/net/cfg80211.h' line='3800' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='extended_capabilities' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='3801' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='extended_capabilities_mask' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='3802' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='extended_capabilities_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='3803' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_supported_band' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='345' column='1' id='type-id-6295'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='channels' type-id='type-id-6205' visibility='default' filepath='include/net/cfg80211.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bitrates' type-id='type-id-6296' visibility='default' filepath='include/net/cfg80211.h' line='347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='band' type-id='type-id-6275' visibility='default' filepath='include/net/cfg80211.h' line='348' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='n_channels' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='n_bitrates' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='ht_cap' type-id='type-id-6297' visibility='default' filepath='include/net/cfg80211.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='vht_cap' type-id='type-id-6298' visibility='default' filepath='include/net/cfg80211.h' line='352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='n_iftype_data' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='iftype_data' type-id='type-id-6299' visibility='default' filepath='include/net/cfg80211.h' line='354' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_rate' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='246' column='1' id='type-id-6300'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='bitrate' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='hw_value' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='hw_value_short' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='249' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_sta_ht_cap' size-in-bits='176' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='264' column='1' id='type-id-6297'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cap' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='ht_supported' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='ampdu_factor' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ampdu_density' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='mcs' type-id='type-id-6301' visibility='default' filepath='include/net/cfg80211.h' line='269' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_mcs_info' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/ieee80211.h' line='1267' column='1' id='type-id-6301'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rx_mask' type-id='type-id-6222' visibility='default' filepath='include/linux/ieee80211.h' line='1268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='rx_highest' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1269' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='tx_params' type-id='type-id-214' visibility='default' filepath='include/linux/ieee80211.h' line='1270' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='104'>
+          <var-decl name='reserved' type-id='type-id-1183' visibility='default' filepath='include/linux/ieee80211.h' line='1271' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_sta_vht_cap' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='282' column='1' id='type-id-6298'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='vht_supported' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='283' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='cap' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='vht_mcs' type-id='type-id-6302' visibility='default' filepath='include/net/cfg80211.h' line='285' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_vht_mcs_info' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/ieee80211.h' line='1471' column='1' id='type-id-6302'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rx_mcs_map' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='rx_highest' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1473' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='tx_mcs_map' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1474' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='tx_highest' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1475' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_sband_iftype_data' size-in-bits='432' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='318' column='1' id='type-id-6303'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='types_mask' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='319' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='he_cap' type-id='type-id-6304' visibility='default' filepath='include/net/cfg80211.h' line='320' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_sta_he_cap' size-in-bits='416' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='301' column='1' id='type-id-6304'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='has_he' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='he_cap_elem' type-id='type-id-6305' visibility='default' filepath='include/net/cfg80211.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='he_mcs_nss_supp' type-id='type-id-6306' visibility='default' filepath='include/net/cfg80211.h' line='304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='216'>
+          <var-decl name='ppe_thres' type-id='type-id-6223' visibility='default' filepath='include/net/cfg80211.h' line='305' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_he_cap_elem' size-in-bits='112' is-struct='yes' visibility='default' filepath='include/linux/ieee80211.h' line='1550' column='1' id='type-id-6305'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mac_cap_info' type-id='type-id-6228' visibility='default' filepath='include/linux/ieee80211.h' line='1551' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='phy_cap_info' type-id='type-id-6230' visibility='default' filepath='include/linux/ieee80211.h' line='1552' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_he_mcs_nss_supp' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/linux/ieee80211.h' line='1597' column='1' id='type-id-6306'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rx_mcs_80' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1598' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='tx_mcs_80' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1599' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='rx_mcs_160' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1600' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='tx_mcs_160' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1601' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rx_mcs_80p80' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1602' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='tx_mcs_80p80' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1603' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='regulatory_request' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/regulatory.h' line='77' column='1' id='type-id-6307'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/net/regulatory.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='wiphy_idx' type-id='type-id-17' visibility='default' filepath='include/net/regulatory.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='initiator' type-id='type-id-6308' visibility='default' filepath='include/net/regulatory.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='user_reg_hint_type' type-id='type-id-6309' visibility='default' filepath='include/net/regulatory.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='alpha2' type-id='type-id-6203' visibility='default' filepath='include/net/regulatory.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dfs_region' type-id='type-id-6310' visibility='default' filepath='include/net/regulatory.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='intersect' type-id='type-id-33' visibility='default' filepath='include/net/regulatory.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='296'>
+          <var-decl name='processed' type-id='type-id-33' visibility='default' filepath='include/net/regulatory.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='country_ie_env' type-id='type-id-6311' visibility='default' filepath='include/net/regulatory.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/net/regulatory.h' line='87' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_reg_initiator' filepath='include/uapi/linux/nl80211.h' line='3445' column='1' id='type-id-6308'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_REGDOM_SET_BY_CORE' value='0'/>
+        <enumerator name='NL80211_REGDOM_SET_BY_USER' value='1'/>
+        <enumerator name='NL80211_REGDOM_SET_BY_DRIVER' value='2'/>
+        <enumerator name='NL80211_REGDOM_SET_BY_COUNTRY_IE' value='3'/>
+      </enum-decl>
+      <enum-decl name='nl80211_user_reg_hint_type' filepath='include/uapi/linux/nl80211.h' line='3645' column='1' id='type-id-6309'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_USER_REG_HINT_USER' value='0'/>
+        <enumerator name='NL80211_USER_REG_HINT_CELL_BASE' value='1'/>
+        <enumerator name='NL80211_USER_REG_HINT_INDOOR' value='2'/>
+      </enum-decl>
+      <enum-decl name='nl80211_dfs_regions' filepath='include/uapi/linux/nl80211.h' line='3621' column='1' id='type-id-6310'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_DFS_UNSET' value='0'/>
+        <enumerator name='NL80211_DFS_FCC' value='1'/>
+        <enumerator name='NL80211_DFS_ETSI' value='2'/>
+        <enumerator name='NL80211_DFS_JP' value='3'/>
+      </enum-decl>
+      <enum-decl name='environment_cap' filepath='include/net/regulatory.h' line='31' column='1' id='type-id-6311'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='ENVIRON_ANY' value='0'/>
+        <enumerator name='ENVIRON_INDOOR' value='1'/>
+        <enumerator name='ENVIRON_OUTDOOR' value='2'/>
+      </enum-decl>
+      <class-decl name='ieee80211_regdomain' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/regulatory.h' line='226' column='1' id='type-id-6312'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='callback_head' type-id='type-id-385' visibility='default' filepath='include/net/regulatory.h' line='227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='n_reg_rules' type-id='type-id-7' visibility='default' filepath='include/net/regulatory.h' line='228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='alpha2' type-id='type-id-6203' visibility='default' filepath='include/net/regulatory.h' line='229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dfs_region' type-id='type-id-6310' visibility='default' filepath='include/net/regulatory.h' line='230' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='reg_rules' type-id='type-id-6208' visibility='default' filepath='include/net/regulatory.h' line='231' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_reg_rule' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/net/regulatory.h' line='217' column='1' id='type-id-6207'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='freq_range' type-id='type-id-6313' visibility='default' filepath='include/net/regulatory.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='power_rule' type-id='type-id-6314' visibility='default' filepath='include/net/regulatory.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='wmm_rule' type-id='type-id-6315' visibility='default' filepath='include/net/regulatory.h' line='220' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/regulatory.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='dfs_cac_ms' type-id='type-id-7' visibility='default' filepath='include/net/regulatory.h' line='222' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='has_wmm' type-id='type-id-33' visibility='default' filepath='include/net/regulatory.h' line='223' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_freq_range' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/net/regulatory.h' line='181' column='1' id='type-id-6313'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='start_freq_khz' type-id='type-id-7' visibility='default' filepath='include/net/regulatory.h' line='182' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='end_freq_khz' type-id='type-id-7' visibility='default' filepath='include/net/regulatory.h' line='183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='max_bandwidth_khz' type-id='type-id-7' visibility='default' filepath='include/net/regulatory.h' line='184' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_power_rule' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/net/regulatory.h' line='187' column='1' id='type-id-6314'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='max_antenna_gain' type-id='type-id-7' visibility='default' filepath='include/net/regulatory.h' line='188' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='max_eirp' type-id='type-id-7' visibility='default' filepath='include/net/regulatory.h' line='189' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_wmm_rule' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/regulatory.h' line='212' column='1' id='type-id-6315'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='client' type-id='type-id-6212' visibility='default' filepath='include/net/regulatory.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ap' type-id='type-id-6212' visibility='default' filepath='include/net/regulatory.h' line='214' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_wmm_ac' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/net/regulatory.h' line='205' column='1' id='type-id-6211'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cw_min' type-id='type-id-688' visibility='default' filepath='include/net/regulatory.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='cw_max' type-id='type-id-688' visibility='default' filepath='include/net/regulatory.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='cot' type-id='type-id-688' visibility='default' filepath='include/net/regulatory.h' line='208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='aifsn' type-id='type-id-214' visibility='default' filepath='include/net/regulatory.h' line='209' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='106' column='1' id='type-id-6316'>
+        <data-member access='private'>
+          <var-decl name='d_lru' type-id='type-id-20' visibility='default' filepath='include/linux/dcache.h' line='107' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='d_wait' type-id='type-id-881' visibility='default' filepath='include/linux/dcache.h' line='108' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__3' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='115' column='1' id='type-id-6317'>
+        <data-member access='private'>
+          <var-decl name='d_alias' type-id='type-id-520' visibility='default' filepath='include/linux/dcache.h' line='116' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='d_in_lookup_hash' type-id='type-id-1284' visibility='default' filepath='include/linux/dcache.h' line='117' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='d_rcu' type-id='type-id-385' visibility='default' filepath='include/linux/dcache.h' line='118' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='ieee80211_ht_cap' size-in-bits='208' is-struct='yes' visibility='default' filepath='include/linux/ieee80211.h' line='1301' column='1' id='type-id-6318'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cap_info' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='ampdu_params_info' type-id='type-id-214' visibility='default' filepath='include/linux/ieee80211.h' line='1303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='mcs' type-id='type-id-6301' visibility='default' filepath='include/linux/ieee80211.h' line='1306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='152'>
+          <var-decl name='extended_ht_cap_info' type-id='type-id-5123' visibility='default' filepath='include/linux/ieee80211.h' line='1308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='168'>
+          <var-decl name='tx_BF_cap_info' type-id='type-id-2461' visibility='default' filepath='include/linux/ieee80211.h' line='1309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='200'>
+          <var-decl name='antenna_selection_info' type-id='type-id-214' visibility='default' filepath='include/linux/ieee80211.h' line='1310' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_vht_cap' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/linux/ieee80211.h' line='1507' column='1' id='type-id-6319'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='vht_cap_info' type-id='type-id-2461' visibility='default' filepath='include/linux/ieee80211.h' line='1508' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='supp_mcs' type-id='type-id-6302' visibility='default' filepath='include/linux/ieee80211.h' line='1509' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='wiphy_coalesce_support' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='3713' column='1' id='type-id-6320'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='n_rules' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3714' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='max_delay' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3715' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='n_patterns' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3716' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='pattern_max_len' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3717' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='pattern_min_len' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3718' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='max_pkt_offset' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='3719' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='wiphy_vendor_command' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='3778' column='1' id='type-id-6321'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='info' type-id='type-id-6322' visibility='default' filepath='include/net/cfg80211.h' line='3779' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='3780' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='doit' type-id='type-id-6323' visibility='default' filepath='include/net/cfg80211.h' line='3781' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='dumpit' type-id='type-id-6324' visibility='default' filepath='include/net/cfg80211.h' line='3783' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nl80211_vendor_cmd_info' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/nl80211.h' line='5533' column='1' id='type-id-6322'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='vendor_id' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='5534' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='subcmd' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='5535' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__4' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='666' column='1' id='type-id-6325'>
+        <data-member access='private'>
+          <var-decl name='' type-id='type-id-6326' visibility='default' filepath='include/linux/skbuff.h' line='667' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='rbnode' type-id='type-id-422' visibility='default' filepath='include/linux/skbuff.h' line='681' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='list' type-id='type-id-20' visibility='default' filepath='include/linux/skbuff.h' line='682' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__1' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='667' column='1' id='type-id-6326'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='next' type-id='type-id-1766' visibility='default' filepath='include/linux/skbuff.h' line='669' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='prev' type-id='type-id-1766' visibility='default' filepath='include/linux/skbuff.h' line='670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='' type-id='type-id-6327' visibility='default' filepath='include/linux/skbuff.h' line='672' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/skbuff.h' line='672' column='1' id='type-id-6327'>
+        <data-member access='private'>
+          <var-decl name='dev' type-id='type-id-1648' visibility='default' filepath='include/linux/skbuff.h' line='673' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='dev_scratch' type-id='type-id-16' visibility='default' filepath='include/linux/skbuff.h' line='678' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='cfg80211_ops' size-in-bits='6592' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='3130' column='1' id='type-id-6328'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='suspend' type-id='type-id-6329' visibility='default' filepath='include/net/cfg80211.h' line='3131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='resume' type-id='type-id-6330' visibility='default' filepath='include/net/cfg80211.h' line='3132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='set_wakeup' type-id='type-id-6331' visibility='default' filepath='include/net/cfg80211.h' line='3133' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='add_virtual_intf' type-id='type-id-6332' visibility='default' filepath='include/net/cfg80211.h' line='3135' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='del_virtual_intf' type-id='type-id-6333' visibility='default' filepath='include/net/cfg80211.h' line='3140' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='change_virtual_intf' type-id='type-id-6334' visibility='default' filepath='include/net/cfg80211.h' line='3142' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='add_key' type-id='type-id-6335' visibility='default' filepath='include/net/cfg80211.h' line='3147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='get_key' type-id='type-id-6336' visibility='default' filepath='include/net/cfg80211.h' line='3150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='del_key' type-id='type-id-6337' visibility='default' filepath='include/net/cfg80211.h' line='3154' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='set_default_key' type-id='type-id-6338' visibility='default' filepath='include/net/cfg80211.h' line='3156' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='set_default_mgmt_key' type-id='type-id-6339' visibility='default' filepath='include/net/cfg80211.h' line='3159' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='start_ap' type-id='type-id-6340' visibility='default' filepath='include/net/cfg80211.h' line='3163' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='change_beacon' type-id='type-id-6341' visibility='default' filepath='include/net/cfg80211.h' line='3165' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='stop_ap' type-id='type-id-6342' visibility='default' filepath='include/net/cfg80211.h' line='3167' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='add_station' type-id='type-id-6343' visibility='default' filepath='include/net/cfg80211.h' line='3170' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='del_station' type-id='type-id-6344' visibility='default' filepath='include/net/cfg80211.h' line='3173' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='change_station' type-id='type-id-6343' visibility='default' filepath='include/net/cfg80211.h' line='3175' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='get_station' type-id='type-id-6345' visibility='default' filepath='include/net/cfg80211.h' line='3178' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='dump_station' type-id='type-id-6346' visibility='default' filepath='include/net/cfg80211.h' line='3180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='add_mpath' type-id='type-id-6347' visibility='default' filepath='include/net/cfg80211.h' line='3183' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='del_mpath' type-id='type-id-6348' visibility='default' filepath='include/net/cfg80211.h' line='3185' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='change_mpath' type-id='type-id-6347' visibility='default' filepath='include/net/cfg80211.h' line='3187' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='get_mpath' type-id='type-id-6349' visibility='default' filepath='include/net/cfg80211.h' line='3189' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='dump_mpath' type-id='type-id-6350' visibility='default' filepath='include/net/cfg80211.h' line='3191' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1536'>
+          <var-decl name='get_mpp' type-id='type-id-6349' visibility='default' filepath='include/net/cfg80211.h' line='3194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='dump_mpp' type-id='type-id-6350' visibility='default' filepath='include/net/cfg80211.h' line='3196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='get_mesh_config' type-id='type-id-6351' visibility='default' filepath='include/net/cfg80211.h' line='3199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='update_mesh_config' type-id='type-id-6352' visibility='default' filepath='include/net/cfg80211.h' line='3202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1792'>
+          <var-decl name='join_mesh' type-id='type-id-6353' visibility='default' filepath='include/net/cfg80211.h' line='3205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='leave_mesh' type-id='type-id-6342' visibility='default' filepath='include/net/cfg80211.h' line='3208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='join_ocb' type-id='type-id-6354' visibility='default' filepath='include/net/cfg80211.h' line='3210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='leave_ocb' type-id='type-id-6342' visibility='default' filepath='include/net/cfg80211.h' line='3212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='change_bss' type-id='type-id-6355' visibility='default' filepath='include/net/cfg80211.h' line='3214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='set_txq_params' type-id='type-id-6356' visibility='default' filepath='include/net/cfg80211.h' line='3217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='libertas_set_mesh_channel' type-id='type-id-6357' visibility='default' filepath='include/net/cfg80211.h' line='3220' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='set_monitor_channel' type-id='type-id-6358' visibility='default' filepath='include/net/cfg80211.h' line='3224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='scan' type-id='type-id-6359' visibility='default' filepath='include/net/cfg80211.h' line='3227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='abort_scan' type-id='type-id-6360' visibility='default' filepath='include/net/cfg80211.h' line='3229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='auth' type-id='type-id-6361' visibility='default' filepath='include/net/cfg80211.h' line='3231' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='assoc' type-id='type-id-6362' visibility='default' filepath='include/net/cfg80211.h' line='3233' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='deauth' type-id='type-id-6363' visibility='default' filepath='include/net/cfg80211.h' line='3235' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='disassoc' type-id='type-id-6364' visibility='default' filepath='include/net/cfg80211.h' line='3237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='connect' type-id='type-id-6365' visibility='default' filepath='include/net/cfg80211.h' line='3240' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2752'>
+          <var-decl name='update_connect_params' type-id='type-id-6366' visibility='default' filepath='include/net/cfg80211.h' line='3242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='disconnect' type-id='type-id-6367' visibility='default' filepath='include/net/cfg80211.h' line='3246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2880'>
+          <var-decl name='join_ibss' type-id='type-id-6368' visibility='default' filepath='include/net/cfg80211.h' line='3249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='leave_ibss' type-id='type-id-6342' visibility='default' filepath='include/net/cfg80211.h' line='3251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='set_mcast_rate' type-id='type-id-6369' visibility='default' filepath='include/net/cfg80211.h' line='3253' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='set_wiphy_params' type-id='type-id-6370' visibility='default' filepath='include/net/cfg80211.h' line='3256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='set_tx_power' type-id='type-id-6371' visibility='default' filepath='include/net/cfg80211.h' line='3258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='get_tx_power' type-id='type-id-6372' visibility='default' filepath='include/net/cfg80211.h' line='3260' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='set_wds_peer' type-id='type-id-6348' visibility='default' filepath='include/net/cfg80211.h' line='3263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='rfkill_poll' type-id='type-id-6373' visibility='default' filepath='include/net/cfg80211.h' line='3266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='set_bitrate_mask' type-id='type-id-6374' visibility='default' filepath='include/net/cfg80211.h' line='3276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='dump_survey' type-id='type-id-6375' visibility='default' filepath='include/net/cfg80211.h' line='3281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3520'>
+          <var-decl name='set_pmksa' type-id='type-id-6376' visibility='default' filepath='include/net/cfg80211.h' line='3284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3584'>
+          <var-decl name='del_pmksa' type-id='type-id-6376' visibility='default' filepath='include/net/cfg80211.h' line='3286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3648'>
+          <var-decl name='flush_pmksa' type-id='type-id-6342' visibility='default' filepath='include/net/cfg80211.h' line='3288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3712'>
+          <var-decl name='remain_on_channel' type-id='type-id-6377' visibility='default' filepath='include/net/cfg80211.h' line='3290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3776'>
+          <var-decl name='cancel_remain_on_channel' type-id='type-id-6378' visibility='default' filepath='include/net/cfg80211.h' line='3295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='mgmt_tx' type-id='type-id-6379' visibility='default' filepath='include/net/cfg80211.h' line='3299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3904'>
+          <var-decl name='mgmt_tx_cancel_wait' type-id='type-id-6378' visibility='default' filepath='include/net/cfg80211.h' line='3302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='set_power_mgmt' type-id='type-id-6380' visibility='default' filepath='include/net/cfg80211.h' line='3306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4032'>
+          <var-decl name='set_cqm_rssi_config' type-id='type-id-6381' visibility='default' filepath='include/net/cfg80211.h' line='3309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4096'>
+          <var-decl name='set_cqm_rssi_range_config' type-id='type-id-6382' visibility='default' filepath='include/net/cfg80211.h' line='3313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4160'>
+          <var-decl name='set_cqm_txe_config' type-id='type-id-6383' visibility='default' filepath='include/net/cfg80211.h' line='3317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4224'>
+          <var-decl name='mgmt_frame_register' type-id='type-id-6384' visibility='default' filepath='include/net/cfg80211.h' line='3321' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4288'>
+          <var-decl name='set_antenna' type-id='type-id-6385' visibility='default' filepath='include/net/cfg80211.h' line='3325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4352'>
+          <var-decl name='get_antenna' type-id='type-id-6386' visibility='default' filepath='include/net/cfg80211.h' line='3326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4416'>
+          <var-decl name='sched_scan_start' type-id='type-id-6387' visibility='default' filepath='include/net/cfg80211.h' line='3328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4480'>
+          <var-decl name='sched_scan_stop' type-id='type-id-6388' visibility='default' filepath='include/net/cfg80211.h' line='3331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4544'>
+          <var-decl name='set_rekey_data' type-id='type-id-6389' visibility='default' filepath='include/net/cfg80211.h' line='3334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4608'>
+          <var-decl name='tdls_mgmt' type-id='type-id-6390' visibility='default' filepath='include/net/cfg80211.h' line='3337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4672'>
+          <var-decl name='tdls_oper' type-id='type-id-6391' visibility='default' filepath='include/net/cfg80211.h' line='3341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4736'>
+          <var-decl name='probe_client' type-id='type-id-6392' visibility='default' filepath='include/net/cfg80211.h' line='3344' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='set_noack_map' type-id='type-id-6367' visibility='default' filepath='include/net/cfg80211.h' line='3347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4864'>
+          <var-decl name='get_channel' type-id='type-id-6393' visibility='default' filepath='include/net/cfg80211.h' line='3351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4928'>
+          <var-decl name='start_p2p_device' type-id='type-id-6333' visibility='default' filepath='include/net/cfg80211.h' line='3355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4992'>
+          <var-decl name='stop_p2p_device' type-id='type-id-6360' visibility='default' filepath='include/net/cfg80211.h' line='3357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5056'>
+          <var-decl name='set_mac_acl' type-id='type-id-6394' visibility='default' filepath='include/net/cfg80211.h' line='3360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='start_radar_detection' type-id='type-id-6395' visibility='default' filepath='include/net/cfg80211.h' line='3363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5184'>
+          <var-decl name='update_ft_ies' type-id='type-id-6396' visibility='default' filepath='include/net/cfg80211.h' line='3367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5248'>
+          <var-decl name='crit_proto_start' type-id='type-id-6397' visibility='default' filepath='include/net/cfg80211.h' line='3369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5312'>
+          <var-decl name='crit_proto_stop' type-id='type-id-6360' visibility='default' filepath='include/net/cfg80211.h' line='3373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5376'>
+          <var-decl name='set_coalesce' type-id='type-id-6398' visibility='default' filepath='include/net/cfg80211.h' line='3375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5440'>
+          <var-decl name='channel_switch' type-id='type-id-6399' visibility='default' filepath='include/net/cfg80211.h' line='3378' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5504'>
+          <var-decl name='set_qos_map' type-id='type-id-6400' visibility='default' filepath='include/net/cfg80211.h' line='3382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5568'>
+          <var-decl name='set_ap_chanwidth' type-id='type-id-6401' visibility='default' filepath='include/net/cfg80211.h' line='3386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5632'>
+          <var-decl name='add_tx_ts' type-id='type-id-6402' visibility='default' filepath='include/net/cfg80211.h' line='3389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5696'>
+          <var-decl name='del_tx_ts' type-id='type-id-6403' visibility='default' filepath='include/net/cfg80211.h' line='3392' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='tdls_channel_switch' type-id='type-id-6404' visibility='default' filepath='include/net/cfg80211.h' line='3395' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='tdls_cancel_channel_switch' type-id='type-id-6405' visibility='default' filepath='include/net/cfg80211.h' line='3399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='start_nan' type-id='type-id-6406' visibility='default' filepath='include/net/cfg80211.h' line='3402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5952'>
+          <var-decl name='stop_nan' type-id='type-id-6360' visibility='default' filepath='include/net/cfg80211.h' line='3404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='add_nan_func' type-id='type-id-6407' visibility='default' filepath='include/net/cfg80211.h' line='3405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='del_nan_func' type-id='type-id-6408' visibility='default' filepath='include/net/cfg80211.h' line='3407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='nan_change_conf' type-id='type-id-6409' visibility='default' filepath='include/net/cfg80211.h' line='3409' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='set_multicast_to_unicast' type-id='type-id-6410' visibility='default' filepath='include/net/cfg80211.h' line='3414' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='get_txq_stats' type-id='type-id-6411' visibility='default' filepath='include/net/cfg80211.h' line='3418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='set_pmk' type-id='type-id-6412' visibility='default' filepath='include/net/cfg80211.h' line='3422' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='del_pmk' type-id='type-id-6348' visibility='default' filepath='include/net/cfg80211.h' line='3424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='external_auth' type-id='type-id-6413' visibility='default' filepath='include/net/cfg80211.h' line='3426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='tx_control_port' type-id='type-id-6414' visibility='default' filepath='include/net/cfg80211.h' line='3429' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='vif_params' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='468' column='1' id='type-id-6415'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='469' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='use_4addr' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='470' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='macaddr' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='471' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='vht_mumimo_groups' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='472' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='vht_mumimo_follow_addr' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='473' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_ap_settings' size-in-bits='3200' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='855' column='1' id='type-id-6416'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chandef' type-id='type-id-6282' visibility='default' filepath='include/net/cfg80211.h' line='856' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='beacon' type-id='type-id-6417' visibility='default' filepath='include/net/cfg80211.h' line='858' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='beacon_interval' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='860' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='992'>
+          <var-decl name='dtim_period' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='860' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='ssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='861' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='ssid_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='862' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='hidden_ssid' type-id='type-id-6418' visibility='default' filepath='include/net/cfg80211.h' line='863' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='crypto' type-id='type-id-6419' visibility='default' filepath='include/net/cfg80211.h' line='864' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='privacy' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='865' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1888'>
+          <var-decl name='auth_type' type-id='type-id-6420' visibility='default' filepath='include/net/cfg80211.h' line='866' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='smps_mode' type-id='type-id-6421' visibility='default' filepath='include/net/cfg80211.h' line='867' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1952'>
+          <var-decl name='inactivity_timeout' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='868' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1984'>
+          <var-decl name='p2p_ctwindow' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='869' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1992'>
+          <var-decl name='p2p_opp_ps' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='870' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='acl' type-id='type-id-6422' visibility='default' filepath='include/net/cfg80211.h' line='871' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2112'>
+          <var-decl name='pbss' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='872' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2144'>
+          <var-decl name='beacon_rate' type-id='type-id-6423' visibility='default' filepath='include/net/cfg80211.h' line='873' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='ht_cap' type-id='type-id-6241' visibility='default' filepath='include/net/cfg80211.h' line='875' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='vht_cap' type-id='type-id-6242' visibility='default' filepath='include/net/cfg80211.h' line='876' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='ht_required' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='877' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3144'>
+          <var-decl name='vht_required' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='877' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_beacon_data' size-in-bits='768' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='779' column='1' id='type-id-6417'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='head' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='780' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tail' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='780' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='beacon_ies' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='781' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='proberesp_ies' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='782' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='assocresp_ies' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='783' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='probe_resp' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='784' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='head_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='786' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='tail_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='786' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='beacon_ies_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='787' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='proberesp_ies_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='788' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='assocresp_ies_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='789' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='probe_resp_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='790' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_hidden_ssid' filepath='include/uapi/linux/nl80211.h' line='4942' column='1' id='type-id-6418'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_HIDDEN_SSID_NOT_IN_USE' value='0'/>
+        <enumerator name='NL80211_HIDDEN_SSID_ZERO_LEN' value='1'/>
+        <enumerator name='NL80211_HIDDEN_SSID_ZERO_CONTENTS' value='2'/>
+      </enum-decl>
+      <class-decl name='cfg80211_crypto_settings' size-in-bits='640' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='744' column='1' id='type-id-6419'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='wpa_versions' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='745' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='cipher_group' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='746' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='n_ciphers_pairwise' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='747' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='ciphers_pairwise' type-id='type-id-1175' visibility='default' filepath='include/net/cfg80211.h' line='748' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='n_akm_suites' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='749' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='akm_suites' type-id='type-id-6220' visibility='default' filepath='include/net/cfg80211.h' line='750' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='control_port' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='751' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='368'>
+          <var-decl name='control_port_ethertype' type-id='type-id-924' visibility='default' filepath='include/net/cfg80211.h' line='752' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='control_port_no_encrypt' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='753' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='392'>
+          <var-decl name='control_port_over_nl80211' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='754' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='wep_keys' type-id='type-id-6424' visibility='default' filepath='include/net/cfg80211.h' line='755' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='wep_tx_key' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='756' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='psk' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='757' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_auth_type' filepath='include/uapi/linux/nl80211.h' line='4190' column='1' id='type-id-6420'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_AUTHTYPE_OPEN_SYSTEM' value='0'/>
+        <enumerator name='NL80211_AUTHTYPE_SHARED_KEY' value='1'/>
+        <enumerator name='NL80211_AUTHTYPE_FT' value='2'/>
+        <enumerator name='NL80211_AUTHTYPE_NETWORK_EAP' value='3'/>
+        <enumerator name='NL80211_AUTHTYPE_SAE' value='4'/>
+        <enumerator name='NL80211_AUTHTYPE_FILS_SK' value='5'/>
+        <enumerator name='NL80211_AUTHTYPE_FILS_SK_PFS' value='6'/>
+        <enumerator name='NL80211_AUTHTYPE_FILS_PK' value='7'/>
+        <enumerator name='__NL80211_AUTHTYPE_NUM' value='8'/>
+        <enumerator name='NL80211_AUTHTYPE_MAX' value='7'/>
+        <enumerator name='NL80211_AUTHTYPE_AUTOMATIC' value='8'/>
+      </enum-decl>
+      <enum-decl name='nl80211_smps_mode' filepath='include/uapi/linux/nl80211.h' line='5418' column='1' id='type-id-6421'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_SMPS_OFF' value='0'/>
+        <enumerator name='NL80211_SMPS_STATIC' value='1'/>
+        <enumerator name='NL80211_SMPS_DYNAMIC' value='2'/>
+        <enumerator name='__NL80211_SMPS_AFTER_LAST' value='3'/>
+        <enumerator name='NL80211_SMPS_MAX' value='2'/>
+      </enum-decl>
+      <class-decl name='cfg80211_acl_data' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='805' column='1' id='type-id-6425'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='acl_policy' type-id='type-id-6426' visibility='default' filepath='include/net/cfg80211.h' line='806' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='n_acl_entries' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='807' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='mac_addrs' type-id='type-id-6216' visibility='default' filepath='include/net/cfg80211.h' line='810' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_acl_policy' filepath='include/uapi/linux/nl80211.h' line='5403' column='1' id='type-id-6426'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED' value='0'/>
+        <enumerator name='NL80211_ACL_POLICY_DENY_UNLESS_LISTED' value='1'/>
+      </enum-decl>
+      <class-decl name='cfg80211_bitrate_mask' size-in-bits='864' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='816' column='1' id='type-id-6423'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='control' type-id='type-id-6198' visibility='default' filepath='include/net/cfg80211.h' line='822' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__anonymous_struct__2' size-in-bits='288' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='817' column='1' id='type-id-6197'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='legacy' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='818' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='ht_mcs' type-id='type-id-6222' visibility='default' filepath='include/net/cfg80211.h' line='819' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='vht_mcs' type-id='type-id-6219' visibility='default' filepath='include/net/cfg80211.h' line='820' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='gi' type-id='type-id-6427' visibility='default' filepath='include/net/cfg80211.h' line='821' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_txrate_gi' filepath='include/uapi/linux/nl80211.h' line='4331' column='1' id='type-id-6427'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_TXRATE_DEFAULT_GI' value='0'/>
+        <enumerator name='NL80211_TXRATE_FORCE_SGI' value='1'/>
+        <enumerator name='NL80211_TXRATE_FORCE_LGI' value='2'/>
+      </enum-decl>
+      <class-decl name='station_parameters' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='992' column='1' id='type-id-6428'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='supported_rates' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='993' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='vlan' type-id='type-id-1648' visibility='default' filepath='include/net/cfg80211.h' line='994' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='sta_flags_mask' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='995' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='sta_flags_set' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='995' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sta_modify_mask' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='996' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='listen_interval' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='997' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='aid' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='998' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='peer_aid' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='999' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='supported_rates_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1000' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='296'>
+          <var-decl name='plink_action' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1001' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='304'>
+          <var-decl name='plink_state' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1002' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ht_capa' type-id='type-id-6241' visibility='default' filepath='include/net/cfg80211.h' line='1003' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='vht_capa' type-id='type-id-6242' visibility='default' filepath='include/net/cfg80211.h' line='1004' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='uapsd_queues' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1005' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='456'>
+          <var-decl name='max_sp' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1006' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='local_pm' type-id='type-id-6429' visibility='default' filepath='include/net/cfg80211.h' line='1007' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='capability' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1008' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='ext_capab' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='1009' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='ext_capab_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1010' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='supported_channels' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='1011' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='supported_channels_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1012' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='supported_oper_classes' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='1013' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='supported_oper_classes_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1014' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='904'>
+          <var-decl name='opmode_notif' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1015' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='912'>
+          <var-decl name='opmode_notif_used' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1016' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='support_p2p_ps' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1017' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='he_capa' type-id='type-id-6430' visibility='default' filepath='include/net/cfg80211.h' line='1018' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='he_capa_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1019' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_mesh_power_mode' filepath='include/uapi/linux/nl80211.h' line='3754' column='1' id='type-id-6429'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_MESH_POWER_UNKNOWN' value='0'/>
+        <enumerator name='NL80211_MESH_POWER_ACTIVE' value='1'/>
+        <enumerator name='NL80211_MESH_POWER_LIGHT_SLEEP' value='2'/>
+        <enumerator name='NL80211_MESH_POWER_DEEP_SLEEP' value='3'/>
+        <enumerator name='__NL80211_MESH_POWER_AFTER_LAST' value='4'/>
+        <enumerator name='NL80211_MESH_POWER_MAX' value='3'/>
+      </enum-decl>
+      <class-decl name='station_del_parameters' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1032' column='1' id='type-id-6431'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mac' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='1033' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='subtype' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1034' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='reason_code' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1035' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='station_info' size-in-bits='1536' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1294' column='1' id='type-id-6432'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='filled' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='connected_time' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='inactive_time' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='rx_bytes' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tx_bytes' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='llid' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='plid' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='plink_state' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='296'>
+          <var-decl name='signal' type-id='type-id-209' visibility='default' filepath='include/net/cfg80211.h' line='1303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='304'>
+          <var-decl name='signal_avg' type-id='type-id-209' visibility='default' filepath='include/net/cfg80211.h' line='1304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='312'>
+          <var-decl name='chains' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='chain_signal' type-id='type-id-6218' visibility='default' filepath='include/net/cfg80211.h' line='1307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='chain_signal_avg' type-id='type-id-6218' visibility='default' filepath='include/net/cfg80211.h' line='1308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='txrate' type-id='type-id-6433' visibility='default' filepath='include/net/cfg80211.h' line='1310' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='464'>
+          <var-decl name='rxrate' type-id='type-id-6433' visibility='default' filepath='include/net/cfg80211.h' line='1311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='rx_packets' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='tx_packets' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='tx_retries' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='tx_failed' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1315' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='rx_dropped_misc' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1316' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='bss_param' type-id='type-id-6434' visibility='default' filepath='include/net/cfg80211.h' line='1317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='sta_flags' type-id='type-id-6435' visibility='default' filepath='include/net/cfg80211.h' line='1318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='800'>
+          <var-decl name='generation' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1320' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='assoc_req_ies' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='1322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='assoc_req_ies_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='1323' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='beacon_loss_count' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='t_offset' type-id='type-id-1546' visibility='default' filepath='include/net/cfg80211.h' line='1326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='local_pm' type-id='type-id-6429' visibility='default' filepath='include/net/cfg80211.h' line='1327' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='peer_pm' type-id='type-id-6429' visibility='default' filepath='include/net/cfg80211.h' line='1328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='nonpeer_pm' type-id='type-id-6429' visibility='default' filepath='include/net/cfg80211.h' line='1329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1184'>
+          <var-decl name='expected_throughput' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1216'>
+          <var-decl name='rx_beacon' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1333' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='rx_duration' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='rx_beacon_signal_avg' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='pertid' type-id='type-id-6436' visibility='default' filepath='include/net/cfg80211.h' line='1336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='ack_signal' type-id='type-id-209' visibility='default' filepath='include/net/cfg80211.h' line='1337' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1480'>
+          <var-decl name='avg_ack_signal' type-id='type-id-209' visibility='default' filepath='include/net/cfg80211.h' line='1338' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='rate_info' size-in-bits='80' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1142' column='1' id='type-id-6433'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1143' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='mcs' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1144' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='legacy' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1145' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='nss' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1146' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='bw' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1147' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='he_gi' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1148' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='he_dcm' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1149' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='he_ru_alloc' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1150' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='sta_bss_parameters' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1178' column='1' id='type-id-6434'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1179' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='dtim_period' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1180' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='beacon_interval' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1181' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='nl80211_sta_flag_update' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/nl80211.h' line='2857' column='1' id='type-id-6435'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='mask' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='2858' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='set' type-id='type-id-511' visibility='default' filepath='include/uapi/linux/nl80211.h' line='2859' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_tid_stats' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1226' column='1' id='type-id-6437'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='filled' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='rx_msdu' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='tx_msdu' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='tx_msdu_retries' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1230' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='tx_msdu_failed' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1231' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='txq_stats' type-id='type-id-6438' visibility='default' filepath='include/net/cfg80211.h' line='1232' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_txq_stats' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1200' column='1' id='type-id-6438'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='filled' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='backlog_bytes' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='backlog_packets' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='flows' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='drops' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='ecn_marks' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='overlimit' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='overmemory' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='collisions' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='tx_bytes' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='tx_packets' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='max_flows' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1212' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mpath_info' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1429' column='1' id='type-id-6439'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='filled' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='frame_qlen' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='sn' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='metric' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1433' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='exptime' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1434' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='discovery_timeout' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1435' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='discovery_retries' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1436' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='200'>
+          <var-decl name='flags' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1437' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='generation' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1439' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mesh_config' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1543' column='1' id='type-id-6440'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dot11MeshRetryTimeout' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1544' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='dot11MeshConfirmTimeout' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1545' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='dot11MeshHoldingTimeout' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1546' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='dot11MeshMaxPeerLinks' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1547' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='dot11MeshMaxRetries' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1548' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='72'>
+          <var-decl name='dot11MeshTTL' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1549' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='element_ttl' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1550' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='88'>
+          <var-decl name='auto_open_plinks' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1551' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='dot11MeshNbrOffsetMaxNeighbor' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1552' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='dot11MeshHWMPmaxPREQretries' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1553' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='path_refresh_time' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1554' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='min_discovery_timeout' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1555' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='dot11MeshHWMPactivePathTimeout' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1556' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='dot11MeshHWMPpreqMinInterval' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1557' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='dot11MeshHWMPperrMinInterval' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1558' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='dot11MeshHWMPnetDiameterTraversalTime' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1559' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='304'>
+          <var-decl name='dot11MeshHWMPRootMode' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1560' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='dot11MeshHWMPRannInterval' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1561' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='336'>
+          <var-decl name='dot11MeshGateAnnouncementProtocol' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1562' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='344'>
+          <var-decl name='dot11MeshForwarding' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1563' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='rssi_threshold' type-id='type-id-738' visibility='default' filepath='include/net/cfg80211.h' line='1564' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ht_opmode' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1565' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='dot11MeshHWMPactivePathToRootTimeout' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1566' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='dot11MeshHWMProotInterval' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1567' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='464'>
+          <var-decl name='dot11MeshHWMPconfirmationInterval' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1568' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='power_mode' type-id='type-id-6429' visibility='default' filepath='include/net/cfg80211.h' line='1569' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dot11MeshAwakeWindowDuration' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1570' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='plink_timeout' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1571' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='mesh_setup' size-in-bits='1472' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1601' column='1' id='type-id-6441'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chandef' type-id='type-id-6282' visibility='default' filepath='include/net/cfg80211.h' line='1602' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='mesh_id' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='1603' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='mesh_id_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1604' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='264'>
+          <var-decl name='sync_method' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1605' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='272'>
+          <var-decl name='path_sel_proto' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1606' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='280'>
+          <var-decl name='path_metric' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1607' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='auth_id' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1608' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='1609' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ie_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1610' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='392'>
+          <var-decl name='is_authenticated' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1611' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='400'>
+          <var-decl name='is_secure' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1612' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='408'>
+          <var-decl name='user_mpm' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1613' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='dtim_period' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1614' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='432'>
+          <var-decl name='beacon_interval' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1615' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='mcast_rate' type-id='type-id-1131' visibility='default' filepath='include/net/cfg80211.h' line='1616' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='basic_rates' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1617' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='beacon_rate' type-id='type-id-6423' visibility='default' filepath='include/net/cfg80211.h' line='1618' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1440'>
+          <var-decl name='userspace_handles_dfs' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1619' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1448'>
+          <var-decl name='control_port_over_nl80211' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1620' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ocb_setup' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1629' column='1' id='type-id-6442'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chandef' type-id='type-id-6282' visibility='default' filepath='include/net/cfg80211.h' line='1630' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bss_parameters' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1462' column='1' id='type-id-6443'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='use_cts_prot' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1463' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='use_short_preamble' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1464' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='use_short_slot_time' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1465' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='basic_rates' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='1466' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='basic_rates_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1467' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='ap_isolate' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1468' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ht_opmode' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1469' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='p2p_ctwindow' type-id='type-id-209' visibility='default' filepath='include/net/cfg80211.h' line='1470' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='296'>
+          <var-decl name='p2p_opp_ps' type-id='type-id-209' visibility='default' filepath='include/net/cfg80211.h' line='1470' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='ieee80211_txq_params' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1643' column='1' id='type-id-6444'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ac' type-id='type-id-6445' visibility='default' filepath='include/net/cfg80211.h' line='1644' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='txop' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1645' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='cwmin' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1646' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cwmax' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1647' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='aifs' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1648' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_ac' filepath='include/uapi/linux/nl80211.h' line='4000' column='1' id='type-id-6445'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_AC_VO' value='0'/>
+        <enumerator name='NL80211_AC_VI' value='1'/>
+        <enumerator name='NL80211_AC_BE' value='2'/>
+        <enumerator name='NL80211_AC_BK' value='3'/>
+        <enumerator name='NL80211_NUM_ACS' value='4'/>
+      </enum-decl>
+      <class-decl name='cfg80211_scan_request' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1728' column='1' id='type-id-6446'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ssids' type-id='type-id-6266' visibility='default' filepath='include/net/cfg80211.h' line='1729' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='n_ssids' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='1730' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='n_channels' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1731' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='scan_width' type-id='type-id-6267' visibility='default' filepath='include/net/cfg80211.h' line='1732' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='1733' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ie_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='1734' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='duration' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='1735' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='336'>
+          <var-decl name='duration_mandatory' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1736' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='1737' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='rates' type-id='type-id-6221' visibility='default' filepath='include/net/cfg80211.h' line='1739' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='wdev' type-id='type-id-6447' visibility='default' filepath='include/net/cfg80211.h' line='1741' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='mac_addr' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='1743' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='624'>
+          <var-decl name='mac_addr_mask' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='1744' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='bssid' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='1745' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='wiphy' type-id='type-id-6271' visibility='default' filepath='include/net/cfg80211.h' line='1748' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='scan_start' type-id='type-id-16' visibility='default' filepath='include/net/cfg80211.h' line='1749' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='info' type-id='type-id-6448' visibility='default' filepath='include/net/cfg80211.h' line='1750' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='notified' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1751' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1032'>
+          <var-decl name='no_cck' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1752' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='channels' type-id='type-id-6206' visibility='default' filepath='include/net/cfg80211.h' line='1755' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_scan_info' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1693' column='1' id='type-id-6448'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='scan_start_tsf' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1694' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='tsf_bssid' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='1695' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='aborted' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='1696' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_auth_request' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2039' column='1' id='type-id-6449'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bss' type-id='type-id-6288' visibility='default' filepath='include/net/cfg80211.h' line='2040' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2041' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ie_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2042' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='auth_type' type-id='type-id-6420' visibility='default' filepath='include/net/cfg80211.h' line='2043' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='key' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2044' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='key_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2045' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='328'>
+          <var-decl name='key_idx' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2045' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='auth_data' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2046' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='auth_data_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2047' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_assoc_request' size-in-bits='1792' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2100' column='1' id='type-id-6450'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bss' type-id='type-id-6288' visibility='default' filepath='include/net/cfg80211.h' line='2101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='prev_bssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ie_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='crypto' type-id='type-id-6419' visibility='default' filepath='include/net/cfg80211.h' line='2104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='use_mfp' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2105' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='928'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='2106' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='ht_capa' type-id='type-id-6318' visibility='default' filepath='include/net/cfg80211.h' line='2107' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1168'>
+          <var-decl name='ht_capa_mask' type-id='type-id-6318' visibility='default' filepath='include/net/cfg80211.h' line='2108' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='vht_capa' type-id='type-id-6319' visibility='default' filepath='include/net/cfg80211.h' line='2109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1472'>
+          <var-decl name='vht_capa_mask' type-id='type-id-6319' visibility='default' filepath='include/net/cfg80211.h' line='2109' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='fils_kek' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2110' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1664'>
+          <var-decl name='fils_kek_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2111' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1728'>
+          <var-decl name='fils_nonces' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2112' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_deauth_request' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2128' column='1' id='type-id-6451'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2129' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2130' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ie_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2131' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='reason_code' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='2132' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='208'>
+          <var-decl name='local_state_change' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2133' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_disassoc_request' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2149' column='1' id='type-id-6452'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bss' type-id='type-id-6288' visibility='default' filepath='include/net/cfg80211.h' line='2150' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2151' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ie_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2152' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='reason_code' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='2153' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='208'>
+          <var-decl name='local_state_change' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2154' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_connect_params' size-in-bits='2752' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2289' column='1' id='type-id-6453'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='channel' type-id='type-id-6205' visibility='default' filepath='include/net/cfg80211.h' line='2290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='channel_hint' type-id='type-id-6205' visibility='default' filepath='include/net/cfg80211.h' line='2291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='bssid_hint' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ssid_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='auth_type' type-id='type-id-6420' visibility='default' filepath='include/net/cfg80211.h' line='2296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='ie_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2298' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='privacy' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='mfp' type-id='type-id-6454' visibility='default' filepath='include/net/cfg80211.h' line='2300' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='crypto' type-id='type-id-6419' visibility='default' filepath='include/net/cfg80211.h' line='2301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1280'>
+          <var-decl name='key' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2302' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1344'>
+          <var-decl name='key_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1352'>
+          <var-decl name='key_idx' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1376'>
+          <var-decl name='flags' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='2304' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1408'>
+          <var-decl name='bg_scan_period' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1440'>
+          <var-decl name='ht_capa' type-id='type-id-6318' visibility='default' filepath='include/net/cfg80211.h' line='2306' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1648'>
+          <var-decl name='ht_capa_mask' type-id='type-id-6318' visibility='default' filepath='include/net/cfg80211.h' line='2307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1856'>
+          <var-decl name='vht_capa' type-id='type-id-6319' visibility='default' filepath='include/net/cfg80211.h' line='2308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1952'>
+          <var-decl name='vht_capa_mask' type-id='type-id-6319' visibility='default' filepath='include/net/cfg80211.h' line='2309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2048'>
+          <var-decl name='pbss' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2310' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2080'>
+          <var-decl name='bss_select' type-id='type-id-6455' visibility='default' filepath='include/net/cfg80211.h' line='2311' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='prev_bssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='fils_erp_username' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2304'>
+          <var-decl name='fils_erp_username_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='fils_erp_realm' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2315' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='fils_erp_realm_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2316' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='fils_erp_next_seq_num' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='2317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2560'>
+          <var-decl name='fils_erp_rrk' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2318' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2624'>
+          <var-decl name='fils_erp_rrk_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2319' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2688'>
+          <var-decl name='want_1x' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2320' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_mfp' filepath='include/uapi/linux/nl80211.h' line='4227' column='1' id='type-id-6454'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_MFP_NO' value='0'/>
+        <enumerator name='NL80211_MFP_REQUIRED' value='1'/>
+        <enumerator name='NL80211_MFP_OPTIONAL' value='2'/>
+      </enum-decl>
+      <class-decl name='cfg80211_bss_selection' size-in-bits='96' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2221' column='1' id='type-id-6455'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='behaviour' type-id='type-id-6456' visibility='default' filepath='include/net/cfg80211.h' line='2222' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='param' type-id='type-id-6457' visibility='default' filepath='include/net/cfg80211.h' line='2226' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_bss_select_attr' filepath='include/uapi/linux/nl80211.h' line='5612' column='1' id='type-id-6456'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='__NL80211_BSS_SELECT_ATTR_INVALID' value='0'/>
+        <enumerator name='NL80211_BSS_SELECT_ATTR_RSSI' value='1'/>
+        <enumerator name='NL80211_BSS_SELECT_ATTR_BAND_PREF' value='2'/>
+        <enumerator name='NL80211_BSS_SELECT_ATTR_RSSI_ADJUST' value='3'/>
+        <enumerator name='__NL80211_BSS_SELECT_ATTR_AFTER_LAST' value='4'/>
+        <enumerator name='NL80211_BSS_SELECT_ATTR_MAX' value='3'/>
+      </enum-decl>
+      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2223' column='1' id='type-id-6457'>
+        <data-member access='private'>
+          <var-decl name='band_pref' type-id='type-id-6275' visibility='default' filepath='include/net/cfg80211.h' line='2224' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='adjust' type-id='type-id-6270' visibility='default' filepath='include/net/cfg80211.h' line='2225' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='cfg80211_ibss_params' size-in-bits='1152' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2193' column='1' id='type-id-6458'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='ssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2194' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2195' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='chandef' type-id='type-id-6282' visibility='default' filepath='include/net/cfg80211.h' line='2196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='ssid_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='392'>
+          <var-decl name='ie_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='400'>
+          <var-decl name='beacon_interval' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='2199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='basic_rates' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='2200' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='channel_fixed' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2201' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='456'>
+          <var-decl name='privacy' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2202' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='464'>
+          <var-decl name='control_port' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2203' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='472'>
+          <var-decl name='control_port_over_nl80211' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2204' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='userspace_handles_dfs' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2205' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='mcast_rate' type-id='type-id-1131' visibility='default' filepath='include/net/cfg80211.h' line='2206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='608'>
+          <var-decl name='ht_capa' type-id='type-id-6318' visibility='default' filepath='include/net/cfg80211.h' line='2207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='816'>
+          <var-decl name='ht_capa_mask' type-id='type-id-6318' visibility='default' filepath='include/net/cfg80211.h' line='2208' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='wep_keys' type-id='type-id-6424' visibility='default' filepath='include/net/cfg80211.h' line='2209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='wep_tx_key' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2210' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_tx_power_setting' filepath='include/uapi/linux/nl80211.h' line='4434' column='1' id='type-id-6459'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_TX_POWER_AUTOMATIC' value='0'/>
+        <enumerator name='NL80211_TX_POWER_LIMITED' value='1'/>
+        <enumerator name='NL80211_TX_POWER_FIXED' value='2'/>
+      </enum-decl>
+      <class-decl name='survey_info' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='706' column='1' id='type-id-6460'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='channel' type-id='type-id-6205' visibility='default' filepath='include/net/cfg80211.h' line='707' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='time' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='708' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='time_busy' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='709' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='time_ext_busy' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='710' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='time_rx' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='711' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='time_tx' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='712' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='time_scan' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='713' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='filled' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='714' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='noise' type-id='type-id-209' visibility='default' filepath='include/net/cfg80211.h' line='715' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_pmksa' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2383' column='1' id='type-id-6461'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='bssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2384' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pmkid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2385' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='pmk' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='pmk_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='ssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2388' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='ssid_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='cache_id' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2390' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_mgmt_tx_params' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2603' column='1' id='type-id-6462'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chan' type-id='type-id-6205' visibility='default' filepath='include/net/cfg80211.h' line='2604' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='offchan' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2605' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='wait' type-id='type-id-5' visibility='default' filepath='include/net/cfg80211.h' line='2606' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='buf' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2607' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2608' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='no_cck' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2609' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='264'>
+          <var-decl name='dont_wait_for_ack' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2610' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='n_csa_offsets' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2611' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='csa_offsets' type-id='type-id-3566' visibility='default' filepath='include/net/cfg80211.h' line='2612' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_gtk_rekey_data' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2569' column='1' id='type-id-6463'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kek' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2570' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='kck' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2570' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='replay_ctr' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2570' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_tdls_operation' filepath='include/uapi/linux/nl80211.h' line='4999' column='1' id='type-id-6464'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_TDLS_DISCOVERY_REQ' value='0'/>
+        <enumerator name='NL80211_TDLS_SETUP' value='1'/>
+        <enumerator name='NL80211_TDLS_TEARDOWN' value='2'/>
+        <enumerator name='NL80211_TDLS_ENABLE_LINK' value='3'/>
+        <enumerator name='NL80211_TDLS_DISABLE_LINK' value='4'/>
+      </enum-decl>
+      <class-decl name='cfg80211_update_ft_ies_params' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2582' column='1' id='type-id-6465'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='md' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='2583' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2584' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='ie_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='2585' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_crit_proto_id' filepath='include/uapi/linux/nl80211.h' line='5495' column='1' id='type-id-6466'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_CRIT_PROTO_UNSPEC' value='0'/>
+        <enumerator name='NL80211_CRIT_PROTO_DHCP' value='1'/>
+        <enumerator name='NL80211_CRIT_PROTO_EAPOL' value='2'/>
+        <enumerator name='NL80211_CRIT_PROTO_APIPA' value='3'/>
+        <enumerator name='NUM_NL80211_CRIT_PROTO' value='4'/>
+      </enum-decl>
+      <class-decl name='cfg80211_coalesce' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2497' column='1' id='type-id-6467'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rules' type-id='type-id-6468' visibility='default' filepath='include/net/cfg80211.h' line='2498' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='n_rules' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2499' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_coalesce_rules' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2483' column='1' id='type-id-6469'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='delay' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2484' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='condition' type-id='type-id-6470' visibility='default' filepath='include/net/cfg80211.h' line='2485' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='patterns' type-id='type-id-6256' visibility='default' filepath='include/net/cfg80211.h' line='2486' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='n_patterns' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2487' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_coalesce_condition' filepath='include/uapi/linux/nl80211.h' line='4770' column='1' id='type-id-6470'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_COALESCE_CONDITION_MATCH' value='0'/>
+        <enumerator name='NL80211_COALESCE_CONDITION_NO_MATCH' value='1'/>
+      </enum-decl>
+      <class-decl name='cfg80211_csa_settings' size-in-bits='1984' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='896' column='1' id='type-id-6471'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chandef' type-id='type-id-6282' visibility='default' filepath='include/net/cfg80211.h' line='897' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='beacon_csa' type-id='type-id-6417' visibility='default' filepath='include/net/cfg80211.h' line='898' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='counter_offsets_beacon' type-id='type-id-3566' visibility='default' filepath='include/net/cfg80211.h' line='899' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='counter_offsets_presp' type-id='type-id-3566' visibility='default' filepath='include/net/cfg80211.h' line='900' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1088'>
+          <var-decl name='n_counter_offsets_beacon' type-id='type-id-5' visibility='default' filepath='include/net/cfg80211.h' line='901' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1120'>
+          <var-decl name='n_counter_offsets_presp' type-id='type-id-5' visibility='default' filepath='include/net/cfg80211.h' line='902' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1152'>
+          <var-decl name='beacon_after' type-id='type-id-6417' visibility='default' filepath='include/net/cfg80211.h' line='903' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1920'>
+          <var-decl name='radar_required' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='904' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1928'>
+          <var-decl name='block_tx' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='905' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1936'>
+          <var-decl name='count' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='906' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_qos_map' size-in-bits='472' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2653' column='1' id='type-id-6472'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='num_des' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2654' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='dscp_exception' type-id='type-id-6200' visibility='default' filepath='include/net/cfg80211.h' line='2655' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='344'>
+          <var-decl name='up' type-id='type-id-6202' visibility='default' filepath='include/net/cfg80211.h' line='2656' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_dscp_exception' size-in-bits='16' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2621' column='1' id='type-id-6199'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='dscp' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2622' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='up' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2623' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_dscp_range' size-in-bits='16' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2632' column='1' id='type-id-6201'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='low' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2633' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='high' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2634' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_nan_conf' size-in-bits='16' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2669' column='1' id='type-id-6473'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='master_pref' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2670' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='bands' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2671' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_nan_func' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2726' column='1' id='type-id-6474'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='type-id-6475' visibility='default' filepath='include/net/cfg80211.h' line='2727' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='service_id' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='2728' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='publish_type' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2729' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='88'>
+          <var-decl name='close_range' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2730' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='publish_bcast' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2731' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='104'>
+          <var-decl name='subscribe_active' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2732' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='112'>
+          <var-decl name='followup_id' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2733' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='120'>
+          <var-decl name='followup_reqid' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2734' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='followup_dest' type-id='type-id-6215' visibility='default' filepath='include/net/cfg80211.h' line='2735' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='ttl' type-id='type-id-7' visibility='default' filepath='include/net/cfg80211.h' line='2736' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='serv_spec_info' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2737' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='serv_spec_info_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2738' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='328'>
+          <var-decl name='srf_include' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='2739' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='srf_bf' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2740' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='srf_bf_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2741' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='456'>
+          <var-decl name='srf_bf_idx' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2742' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='srf_macs' type-id='type-id-6232' visibility='default' filepath='include/net/cfg80211.h' line='2743' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='srf_num_macs' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='2744' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='rx_filters' type-id='type-id-6476' visibility='default' filepath='include/net/cfg80211.h' line='2745' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='tx_filters' type-id='type-id-6476' visibility='default' filepath='include/net/cfg80211.h' line='2746' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='768'>
+          <var-decl name='num_tx_filters' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2747' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='776'>
+          <var-decl name='num_rx_filters' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2748' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='784'>
+          <var-decl name='instance_id' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2749' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='cookie' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='2750' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_nan_function_type' filepath='include/uapi/linux/nl80211.h' line='5632' column='1' id='type-id-6475'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_NAN_FUNC_PUBLISH' value='0'/>
+        <enumerator name='NL80211_NAN_FUNC_SUBSCRIBE' value='1'/>
+        <enumerator name='NL80211_NAN_FUNC_FOLLOW_UP' value='2'/>
+        <enumerator name='__NL80211_NAN_FUNC_TYPE_AFTER_LAST' value='3'/>
+        <enumerator name='NL80211_NAN_FUNC_MAX_TYPE' value='2'/>
+      </enum-decl>
+      <class-decl name='cfg80211_nan_func_filter' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2692' column='1' id='type-id-6477'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='filter' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2693' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2694' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_pmk_conf' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2763' column='1' id='type-id-6478'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='aa' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2764' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='pmk_len' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='2765' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='pmk' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2766' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='pmk_r0_name' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='2767' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_external_auth_params' size-in-bits='416' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='2789' column='1' id='type-id-6479'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='action' type-id='type-id-6480' visibility='default' filepath='include/net/cfg80211.h' line='2790' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='bssid' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='2791' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='ssid' type-id='type-id-6272' visibility='default' filepath='include/net/cfg80211.h' line='2792' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='352'>
+          <var-decl name='key_mgmt_suite' type-id='type-id-5' visibility='default' filepath='include/net/cfg80211.h' line='2793' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='status' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='2794' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_external_auth_action' filepath='include/uapi/linux/nl80211.h' line='5796' column='1' id='type-id-6480'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_EXTERNAL_AUTH_START' value='0'/>
+        <enumerator name='NL80211_EXTERNAL_AUTH_ABORT' value='1'/>
+      </enum-decl>
+      <pointer-type-def type-id='type-id-6443' size-in-bits='64' id='type-id-6481'/>
+      <pointer-type-def type-id='type-id-6416' size-in-bits='64' id='type-id-6482'/>
+      <pointer-type-def type-id='type-id-6450' size-in-bits='64' id='type-id-6483'/>
+      <pointer-type-def type-id='type-id-6449' size-in-bits='64' id='type-id-6484'/>
+      <pointer-type-def type-id='type-id-6417' size-in-bits='64' id='type-id-6485'/>
+      <pointer-type-def type-id='type-id-6286' size-in-bits='64' id='type-id-6288'/>
+      <pointer-type-def type-id='type-id-6284' size-in-bits='64' id='type-id-6279'/>
+      <pointer-type-def type-id='type-id-6282' size-in-bits='64' id='type-id-6486'/>
+      <pointer-type-def type-id='type-id-6467' size-in-bits='64' id='type-id-6487'/>
+      <pointer-type-def type-id='type-id-6469' size-in-bits='64' id='type-id-6468'/>
+      <pointer-type-def type-id='type-id-6204' size-in-bits='64' id='type-id-6278'/>
+      <pointer-type-def type-id='type-id-6453' size-in-bits='64' id='type-id-6488'/>
+      <pointer-type-def type-id='type-id-6293' size-in-bits='64' id='type-id-6283'/>
+      <pointer-type-def type-id='type-id-6471' size-in-bits='64' id='type-id-6489'/>
+      <pointer-type-def type-id='type-id-6451' size-in-bits='64' id='type-id-6490'/>
+      <pointer-type-def type-id='type-id-6452' size-in-bits='64' id='type-id-6491'/>
+      <pointer-type-def type-id='type-id-6479' size-in-bits='64' id='type-id-6492'/>
+      <pointer-type-def type-id='type-id-6463' size-in-bits='64' id='type-id-6493'/>
+      <pointer-type-def type-id='type-id-6458' size-in-bits='64' id='type-id-6494'/>
+      <pointer-type-def type-id='type-id-6285' size-in-bits='64' id='type-id-6281'/>
+      <pointer-type-def type-id='type-id-6273' size-in-bits='64' id='type-id-6268'/>
+      <pointer-type-def type-id='type-id-6462' size-in-bits='64' id='type-id-6495'/>
+      <pointer-type-def type-id='type-id-6473' size-in-bits='64' id='type-id-6496'/>
+      <pointer-type-def type-id='type-id-6474' size-in-bits='64' id='type-id-6497'/>
+      <pointer-type-def type-id='type-id-6477' size-in-bits='64' id='type-id-6476'/>
+      <pointer-type-def type-id='type-id-6259' size-in-bits='64' id='type-id-6256'/>
+      <pointer-type-def type-id='type-id-6461' size-in-bits='64' id='type-id-6498'/>
+      <pointer-type-def type-id='type-id-6472' size-in-bits='64' id='type-id-6499'/>
+      <pointer-type-def type-id='type-id-6446' size-in-bits='64' id='type-id-6500'/>
+      <pointer-type-def type-id='type-id-6274' size-in-bits='64' id='type-id-6269'/>
+      <pointer-type-def type-id='type-id-6265' size-in-bits='64' id='type-id-6258'/>
+      <pointer-type-def type-id='type-id-6272' size-in-bits='64' id='type-id-6266'/>
+      <pointer-type-def type-id='type-id-6437' size-in-bits='64' id='type-id-6436'/>
+      <pointer-type-def type-id='type-id-6438' size-in-bits='64' id='type-id-6501'/>
+      <pointer-type-def type-id='type-id-6465' size-in-bits='64' id='type-id-6502'/>
+      <pointer-type-def type-id='type-id-6255' size-in-bits='64' id='type-id-6237'/>
+      <pointer-type-def type-id='type-id-6260' size-in-bits='64' id='type-id-6257'/>
+      <qualified-type-def type-id='type-id-924' const='yes' id='type-id-6503'/>
+      <qualified-type-def type-id='type-id-6425' const='yes' id='type-id-6504'/>
+      <pointer-type-def type-id='type-id-6504' size-in-bits='64' id='type-id-6422'/>
+      <qualified-type-def type-id='type-id-6423' const='yes' id='type-id-6505'/>
+      <pointer-type-def type-id='type-id-6505' size-in-bits='64' id='type-id-6506'/>
+      <qualified-type-def type-id='type-id-6291' const='yes' id='type-id-6507'/>
+      <pointer-type-def type-id='type-id-6507' size-in-bits='64' id='type-id-6287'/>
+      <qualified-type-def type-id='type-id-6328' const='yes' id='type-id-6508'/>
+      <pointer-type-def type-id='type-id-6508' size-in-bits='64' id='type-id-6509'/>
+      <qualified-type-def type-id='type-id-6478' const='yes' id='type-id-6510'/>
+      <pointer-type-def type-id='type-id-6510' size-in-bits='64' id='type-id-6511'/>
+      <qualified-type-def type-id='type-id-6305' const='yes' id='type-id-6512'/>
+      <pointer-type-def type-id='type-id-6512' size-in-bits='64' id='type-id-6430'/>
+      <qualified-type-def type-id='type-id-6318' const='yes' id='type-id-6513'/>
+      <pointer-type-def type-id='type-id-6513' size-in-bits='64' id='type-id-6241'/>
+      <qualified-type-def type-id='type-id-6247' const='yes' id='type-id-6514'/>
+      <pointer-type-def type-id='type-id-6514' size-in-bits='64' id='type-id-6234'/>
+      <qualified-type-def type-id='type-id-6249' const='yes' id='type-id-6515'/>
+      <pointer-type-def type-id='type-id-6515' size-in-bits='64' id='type-id-6248'/>
+      <qualified-type-def type-id='type-id-6312' const='yes' id='type-id-6516'/>
+      <pointer-type-def type-id='type-id-6516' size-in-bits='64' id='type-id-6240'/>
+      <qualified-type-def type-id='type-id-6303' const='yes' id='type-id-6517'/>
+      <pointer-type-def type-id='type-id-6517' size-in-bits='64' id='type-id-6299'/>
+      <qualified-type-def type-id='type-id-6246' const='yes' id='type-id-6518'/>
+      <pointer-type-def type-id='type-id-6518' size-in-bits='64' id='type-id-6233'/>
+      <qualified-type-def type-id='type-id-6319' const='yes' id='type-id-6519'/>
+      <pointer-type-def type-id='type-id-6519' size-in-bits='64' id='type-id-6242'/>
+      <qualified-type-def type-id='type-id-6440' const='yes' id='type-id-6520'/>
+      <pointer-type-def type-id='type-id-6520' size-in-bits='64' id='type-id-6521'/>
+      <qualified-type-def type-id='type-id-6441' const='yes' id='type-id-6522'/>
+      <pointer-type-def type-id='type-id-6522' size-in-bits='64' id='type-id-6523'/>
+      <qualified-type-def type-id='type-id-6322' const='yes' id='type-id-6524'/>
+      <pointer-type-def type-id='type-id-6524' size-in-bits='64' id='type-id-6245'/>
+      <qualified-type-def type-id='type-id-6254' const='yes' id='type-id-6525'/>
+      <pointer-type-def type-id='type-id-6525' size-in-bits='64' id='type-id-6253'/>
+      <qualified-type-def type-id='type-id-6320' const='yes' id='type-id-6526'/>
+      <pointer-type-def type-id='type-id-6526' size-in-bits='64' id='type-id-6243'/>
+      <qualified-type-def type-id='type-id-6294' const='yes' id='type-id-6527'/>
+      <pointer-type-def type-id='type-id-6527' size-in-bits='64' id='type-id-6238'/>
+      <qualified-type-def type-id='type-id-6321' const='yes' id='type-id-6528'/>
+      <pointer-type-def type-id='type-id-6528' size-in-bits='64' id='type-id-6244'/>
+      <qualified-type-def type-id='type-id-6250' const='yes' id='type-id-6529'/>
+      <pointer-type-def type-id='type-id-6529' size-in-bits='64' id='type-id-6236'/>
+      <qualified-type-def type-id='type-id-6252' const='yes' id='type-id-6530'/>
+      <pointer-type-def type-id='type-id-6530' size-in-bits='64' id='type-id-6251'/>
+      <pointer-type-def type-id='type-id-6289' size-in-bits='64' id='type-id-6205'/>
+      <pointer-type-def type-id='type-id-6300' size-in-bits='64' id='type-id-6296'/>
+      <pointer-type-def type-id='type-id-6295' size-in-bits='64' id='type-id-6209'/>
+      <pointer-type-def type-id='type-id-6444' size-in-bits='64' id='type-id-6531'/>
+      <pointer-type-def type-id='type-id-6532' size-in-bits='64' id='type-id-6330'/>
+      <pointer-type-def type-id='type-id-6533' size-in-bits='64' id='type-id-6358'/>
+      <pointer-type-def type-id='type-id-6534' size-in-bits='64' id='type-id-6398'/>
+      <pointer-type-def type-id='type-id-6535' size-in-bits='64' id='type-id-6359'/>
+      <pointer-type-def type-id='type-id-6536' size-in-bits='64' id='type-id-6329'/>
+      <pointer-type-def type-id='type-id-6537' size-in-bits='64' id='type-id-6342'/>
+      <pointer-type-def type-id='type-id-6538' size-in-bits='64' id='type-id-6355'/>
+      <pointer-type-def type-id='type-id-6539' size-in-bits='64' id='type-id-6340'/>
+      <pointer-type-def type-id='type-id-6540' size-in-bits='64' id='type-id-6362'/>
+      <pointer-type-def type-id='type-id-6541' size-in-bits='64' id='type-id-6361'/>
+      <pointer-type-def type-id='type-id-6542' size-in-bits='64' id='type-id-6341'/>
+      <pointer-type-def type-id='type-id-6543' size-in-bits='64' id='type-id-6401'/>
+      <pointer-type-def type-id='type-id-6544' size-in-bits='64' id='type-id-6395'/>
+      <pointer-type-def type-id='type-id-6545' size-in-bits='64' id='type-id-6365'/>
+      <pointer-type-def type-id='type-id-6546' size-in-bits='64' id='type-id-6366'/>
+      <pointer-type-def type-id='type-id-6547' size-in-bits='64' id='type-id-6399'/>
+      <pointer-type-def type-id='type-id-6548' size-in-bits='64' id='type-id-6363'/>
+      <pointer-type-def type-id='type-id-6549' size-in-bits='64' id='type-id-6364'/>
+      <pointer-type-def type-id='type-id-6550' size-in-bits='64' id='type-id-6413'/>
+      <pointer-type-def type-id='type-id-6551' size-in-bits='64' id='type-id-6389'/>
+      <pointer-type-def type-id='type-id-6552' size-in-bits='64' id='type-id-6368'/>
+      <pointer-type-def type-id='type-id-6553' size-in-bits='64' id='type-id-6376'/>
+      <pointer-type-def type-id='type-id-6554' size-in-bits='64' id='type-id-6400'/>
+      <pointer-type-def type-id='type-id-6555' size-in-bits='64' id='type-id-6387'/>
+      <pointer-type-def type-id='type-id-6556' size-in-bits='64' id='type-id-6396'/>
+      <pointer-type-def type-id='type-id-6557' size-in-bits='64' id='type-id-6410'/>
+      <pointer-type-def type-id='type-id-6558' size-in-bits='64' id='type-id-6394'/>
+      <pointer-type-def type-id='type-id-6559' size-in-bits='64' id='type-id-6412'/>
+      <pointer-type-def type-id='type-id-6560' size-in-bits='64' id='type-id-6353'/>
+      <pointer-type-def type-id='type-id-6561' size-in-bits='64' id='type-id-6348'/>
+      <pointer-type-def type-id='type-id-6562' size-in-bits='64' id='type-id-6374'/>
+      <pointer-type-def type-id='type-id-6563' size-in-bits='64' id='type-id-6347'/>
+      <pointer-type-def type-id='type-id-6564' size-in-bits='64' id='type-id-6391'/>
+      <pointer-type-def type-id='type-id-6565' size-in-bits='64' id='type-id-6345'/>
+      <pointer-type-def type-id='type-id-6566' size-in-bits='64' id='type-id-6343'/>
+      <pointer-type-def type-id='type-id-6567' size-in-bits='64' id='type-id-6414'/>
+      <pointer-type-def type-id='type-id-6568' size-in-bits='64' id='type-id-6404'/>
+      <pointer-type-def type-id='type-id-6569' size-in-bits='64' id='type-id-6390'/>
+      <pointer-type-def type-id='type-id-6570' size-in-bits='64' id='type-id-6392'/>
+      <pointer-type-def type-id='type-id-6571' size-in-bits='64' id='type-id-6334'/>
+      <pointer-type-def type-id='type-id-6572' size-in-bits='64' id='type-id-6357'/>
+      <pointer-type-def type-id='type-id-6573' size-in-bits='64' id='type-id-6356'/>
+      <pointer-type-def type-id='type-id-6574' size-in-bits='64' id='type-id-6369'/>
+      <pointer-type-def type-id='type-id-6575' size-in-bits='64' id='type-id-6375'/>
+      <pointer-type-def type-id='type-id-6576' size-in-bits='64' id='type-id-6346'/>
+      <pointer-type-def type-id='type-id-6577' size-in-bits='64' id='type-id-6350'/>
+      <pointer-type-def type-id='type-id-6578' size-in-bits='64' id='type-id-6351'/>
+      <pointer-type-def type-id='type-id-6579' size-in-bits='64' id='type-id-6354'/>
+      <pointer-type-def type-id='type-id-6580' size-in-bits='64' id='type-id-6344'/>
+      <pointer-type-def type-id='type-id-6581' size-in-bits='64' id='type-id-6380'/>
+      <pointer-type-def type-id='type-id-6582' size-in-bits='64' id='type-id-6382'/>
+      <pointer-type-def type-id='type-id-6583' size-in-bits='64' id='type-id-6381'/>
+      <pointer-type-def type-id='type-id-6584' size-in-bits='64' id='type-id-6367'/>
+      <pointer-type-def type-id='type-id-6585' size-in-bits='64' id='type-id-6352'/>
+      <pointer-type-def type-id='type-id-6586' size-in-bits='64' id='type-id-6383'/>
+      <pointer-type-def type-id='type-id-6587' size-in-bits='64' id='type-id-6388'/>
+      <pointer-type-def type-id='type-id-6588' size-in-bits='64' id='type-id-6339'/>
+      <pointer-type-def type-id='type-id-6589' size-in-bits='64' id='type-id-6403'/>
+      <pointer-type-def type-id='type-id-6590' size-in-bits='64' id='type-id-6402'/>
+      <pointer-type-def type-id='type-id-6591' size-in-bits='64' id='type-id-6337'/>
+      <pointer-type-def type-id='type-id-6592' size-in-bits='64' id='type-id-6335'/>
+      <pointer-type-def type-id='type-id-6593' size-in-bits='64' id='type-id-6336'/>
+      <pointer-type-def type-id='type-id-6594' size-in-bits='64' id='type-id-6338'/>
+      <pointer-type-def type-id='type-id-6595' size-in-bits='64' id='type-id-6349'/>
+      <pointer-type-def type-id='type-id-6596' size-in-bits='64' id='type-id-6370'/>
+      <pointer-type-def type-id='type-id-6597' size-in-bits='64' id='type-id-6385'/>
+      <pointer-type-def type-id='type-id-6598' size-in-bits='64' id='type-id-6386'/>
+      <pointer-type-def type-id='type-id-6599' size-in-bits='64' id='type-id-6333'/>
+      <pointer-type-def type-id='type-id-6600' size-in-bits='64' id='type-id-6393'/>
+      <pointer-type-def type-id='type-id-6601' size-in-bits='64' id='type-id-6379'/>
+      <pointer-type-def type-id='type-id-6602' size-in-bits='64' id='type-id-6406'/>
+      <pointer-type-def type-id='type-id-6603' size-in-bits='64' id='type-id-6409'/>
+      <pointer-type-def type-id='type-id-6604' size-in-bits='64' id='type-id-6407'/>
+      <pointer-type-def type-id='type-id-6605' size-in-bits='64' id='type-id-6411'/>
+      <pointer-type-def type-id='type-id-6606' size-in-bits='64' id='type-id-6397'/>
+      <pointer-type-def type-id='type-id-6607' size-in-bits='64' id='type-id-6371'/>
+      <pointer-type-def type-id='type-id-6608' size-in-bits='64' id='type-id-6377'/>
+      <pointer-type-def type-id='type-id-6609' size-in-bits='64' id='type-id-6372'/>
+      <pointer-type-def type-id='type-id-6610' size-in-bits='64' id='type-id-6324'/>
+      <pointer-type-def type-id='type-id-6611' size-in-bits='64' id='type-id-6378'/>
+      <pointer-type-def type-id='type-id-6612' size-in-bits='64' id='type-id-6323'/>
+      <pointer-type-def type-id='type-id-6213' size-in-bits='64' id='type-id-6424'/>
+      <pointer-type-def type-id='type-id-6215' size-in-bits='64' id='type-id-6232'/>
+      <pointer-type-def type-id='type-id-6440' size-in-bits='64' id='type-id-6613'/>
+      <pointer-type-def type-id='type-id-6439' size-in-bits='64' id='type-id-6614'/>
+      <pointer-type-def type-id='type-id-6442' size-in-bits='64' id='type-id-6615'/>
+      <pointer-type-def type-id='type-id-6307' size-in-bits='64' id='type-id-6616'/>
+      <pointer-type-def type-id='type-id-6431' size-in-bits='64' id='type-id-6617'/>
+      <pointer-type-def type-id='type-id-6432' size-in-bits='64' id='type-id-6618'/>
+      <pointer-type-def type-id='type-id-6428' size-in-bits='64' id='type-id-6619'/>
+      <pointer-type-def type-id='type-id-6460' size-in-bits='64' id='type-id-6620'/>
+      <pointer-type-def type-id='type-id-6415' size-in-bits='64' id='type-id-6621'/>
+      <pointer-type-def type-id='type-id-6622' size-in-bits='64' id='type-id-6623'/>
+      <pointer-type-def type-id='type-id-6624' size-in-bits='64' id='type-id-6373'/>
+      <pointer-type-def type-id='type-id-6625' size-in-bits='64' id='type-id-6405'/>
+      <pointer-type-def type-id='type-id-6626' size-in-bits='64' id='type-id-6239'/>
+      <pointer-type-def type-id='type-id-6627' size-in-bits='64' id='type-id-6331'/>
+      <pointer-type-def type-id='type-id-6628' size-in-bits='64' id='type-id-6360'/>
+      <pointer-type-def type-id='type-id-6629' size-in-bits='64' id='type-id-6384'/>
+      <pointer-type-def type-id='type-id-6630' size-in-bits='64' id='type-id-6408'/>
+      <pointer-type-def type-id='type-id-6231' size-in-bits='64' id='type-id-6271'/>
+      <pointer-type-def type-id='type-id-6276' size-in-bits='64' id='type-id-6447'/>
+      <pointer-type-def type-id='type-id-6631' size-in-bits='64' id='type-id-6332'/>
+      <function-decl name='wiphy_new_nm' mangled-name='wiphy_new_nm' filepath='net/wireless/core.c' line='383' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='wiphy_new_nm'>
+        <parameter type-id='type-id-6509' name='ops' filepath='net/wireless/core.c' line='383' column='1'/>
+        <parameter type-id='type-id-17' name='sizeof_priv' filepath='net/wireless/core.c' line='383' column='1'/>
+        <parameter type-id='type-id-4' name='requested_name' filepath='net/wireless/core.c' line='384' column='1'/>
+        <return type-id='type-id-6271'/>
+      </function-decl>
+      <function-decl name='wiphy_free' mangled-name='wiphy_free' filepath='net/wireless/core.c' line='1001' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='wiphy_free'>
+        <parameter type-id='type-id-6271' name='wiphy' filepath='net/wireless/core.c' line='1001' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='wiphy_register' mangled-name='wiphy_register' filepath='net/wireless/core.c' line='631' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='wiphy_register'>
+        <parameter type-id='type-id-6271' name='wiphy' filepath='net/wireless/core.c' line='631' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='wiphy_unregister' mangled-name='wiphy_unregister' filepath='net/wireless/core.c' line='929' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='wiphy_unregister'>
+        <parameter type-id='type-id-6271' name='wiphy' filepath='net/wireless/core.c' line='929' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='type-id-6532'>
+        <parameter type-id='type-id-6271'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6533'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6486'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6534'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6487'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6535'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6500'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6536'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6237'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6537'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6538'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6481'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6539'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6482'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6540'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6483'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6541'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6484'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6542'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6485'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6543'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6486'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6544'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6486'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6545'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6488'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6546'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6488'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6547'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6489'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6548'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6490'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6549'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6491'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6550'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6492'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6551'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6493'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6552'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6494'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6553'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6498'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6554'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6499'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6555'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6258'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6556'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6502'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6557'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3881'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6558'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6422'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6559'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6511'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6560'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6521'/>
+        <parameter type-id='type-id-6523'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6561'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6562'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-6506'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6563'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-658'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6564'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-6464'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6565'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-6618'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6566'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-6619'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6567'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-84'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-6503'/>
+        <parameter type-id='type-id-3881'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6568'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-6486'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6569'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-688'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-84'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6570'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-1508'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6571'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6277'/>
+        <parameter type-id='type-id-6621'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6572'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6205'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6573'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6531'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6574'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6575'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-6620'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6576'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-6618'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6577'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-6614'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6578'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6613'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6579'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6615'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6580'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-6617'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6581'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6582'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-738'/>
+        <parameter type-id='type-id-738'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6583'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-738'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6584'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6585'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-6521'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6586'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6587'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6588'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-214'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6589'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-658'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6590'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6591'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-658'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6592'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-6424'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6593'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-658'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-6623'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6594'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-214'/>
+        <parameter type-id='type-id-33'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6595'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-3121'/>
+        <parameter type-id='type-id-6614'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6596'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6597'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-7'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6598'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1565'/>
+        <parameter type-id='type-id-1565'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6599'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6600'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-6486'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6601'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-6495'/>
+        <parameter type-id='type-id-1508'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6602'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-6496'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6603'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-6496'/>
+        <parameter type-id='type-id-7'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6604'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-6497'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6605'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-6501'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6606'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-6466'/>
+        <parameter type-id='type-id-688'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6607'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-6459'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6608'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-6205'/>
+        <parameter type-id='type-id-5'/>
+        <parameter type-id='type-id-1508'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6609'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-666'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6610'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-1766'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-17'/>
+        <parameter type-id='type-id-45'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6611'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6612'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-17'/>
+        <return type-id='type-id-17'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6622'>
+        <parameter type-id='type-id-15'/>
+        <parameter type-id='type-id-6424'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6624'>
+        <parameter type-id='type-id-6271'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6625'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-1648'/>
+        <parameter type-id='type-id-658'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6626'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6616'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6627'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6628'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6629'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-688'/>
+        <parameter type-id='type-id-33'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6630'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-6447'/>
+        <parameter type-id='type-id-40'/>
+        <return type-id='type-id-81'/>
+      </function-type>
+      <function-type size-in-bits='64' id='type-id-6631'>
+        <parameter type-id='type-id-6271'/>
+        <parameter type-id='type-id-4'/>
+        <parameter type-id='type-id-216'/>
+        <parameter type-id='type-id-6277'/>
+        <parameter type-id='type-id-6621'/>
+        <return type-id='type-id-6447'/>
+      </function-type>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/wireless/scan.c' language='LANG_C89'>
+      <class-decl name='cfg80211_inform_bss' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='1929' column='1' id='type-id-6632'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='chan' type-id='type-id-6205' visibility='default' filepath='include/net/cfg80211.h' line='1930' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='scan_width' type-id='type-id-6267' visibility='default' filepath='include/net/cfg80211.h' line='1931' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='signal' type-id='type-id-738' visibility='default' filepath='include/net/cfg80211.h' line='1932' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='boottime_ns' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1933' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='parent_tsf' type-id='type-id-40' visibility='default' filepath='include/net/cfg80211.h' line='1934' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='parent_bssid' type-id='type-id-6229' visibility='default' filepath='include/net/cfg80211.h' line='1935' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='304'>
+          <var-decl name='chains' type-id='type-id-214' visibility='default' filepath='include/net/cfg80211.h' line='1936' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='312'>
+          <var-decl name='chain_signal' type-id='type-id-6218' visibility='default' filepath='include/net/cfg80211.h' line='1937' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='cfg80211_bss_frame_type' filepath='include/net/cfg80211.h' line='4975' column='1' id='type-id-6633'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='CFG80211_BSS_FTYPE_UNKNOWN' value='0'/>
+        <enumerator name='CFG80211_BSS_FTYPE_BEACON' value='1'/>
+        <enumerator name='CFG80211_BSS_FTYPE_PRESP' value='2'/>
+      </enum-decl>
+      <pointer-type-def type-id='type-id-6632' size-in-bits='64' id='type-id-6634'/>
+      <pointer-type-def type-id='type-id-6448' size-in-bits='64' id='type-id-6635'/>
+      <function-decl name='cfg80211_scan_done' mangled-name='cfg80211_scan_done' filepath='net/wireless/scan.c' line='292' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_scan_done'>
+        <parameter type-id='type-id-6500' name='request' filepath='net/wireless/scan.c' line='292' column='1'/>
+        <parameter type-id='type-id-6635' name='info' filepath='net/wireless/scan.c' line='293' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='cfg80211_inform_bss_data' mangled-name='cfg80211_inform_bss_data' filepath='net/wireless/scan.c' line='1132' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_inform_bss_data'>
+        <parameter type-id='type-id-6271' name='wiphy' filepath='net/wireless/scan.c' line='1132' column='1'/>
+        <parameter type-id='type-id-6634' name='data' filepath='net/wireless/scan.c' line='1133' column='1'/>
+        <parameter type-id='type-id-6633' name='ftype' filepath='net/wireless/scan.c' line='1134' column='1'/>
+        <parameter type-id='type-id-658' name='bssid' filepath='net/wireless/scan.c' line='1135' column='1'/>
+        <parameter type-id='type-id-40' name='tsf' filepath='net/wireless/scan.c' line='1135' column='1'/>
+        <parameter type-id='type-id-688' name='capability' filepath='net/wireless/scan.c' line='1135' column='1'/>
+        <parameter type-id='type-id-688' name='beacon_interval' filepath='net/wireless/scan.c' line='1136' column='1'/>
+        <parameter type-id='type-id-658' name='ie' filepath='net/wireless/scan.c' line='1136' column='1'/>
+        <parameter type-id='type-id-84' name='ielen' filepath='net/wireless/scan.c' line='1136' column='1'/>
+        <parameter type-id='type-id-485' name='gfp' filepath='net/wireless/scan.c' line='1137' column='1'/>
+        <return type-id='type-id-6288'/>
+      </function-decl>
+      <function-decl name='cfg80211_put_bss' mangled-name='cfg80211_put_bss' filepath='net/wireless/scan.c' line='1319' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_put_bss'>
+        <parameter type-id='type-id-6271' name='wiphy' filepath='net/wireless/scan.c' line='1319' column='1'/>
+        <parameter type-id='type-id-6288' name='pub' filepath='net/wireless/scan.c' line='1319' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='net/wireless/sme.c' language='LANG_C89'>
+      <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='net/wireless/sme.c' line='34' column='1' id='type-id-6636'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='CFG80211_CONN_SCANNING' value='0'/>
+        <enumerator name='CFG80211_CONN_SCAN_AGAIN' value='1'/>
+        <enumerator name='CFG80211_CONN_AUTHENTICATE_NEXT' value='2'/>
+        <enumerator name='CFG80211_CONN_AUTHENTICATING' value='3'/>
+        <enumerator name='CFG80211_CONN_AUTH_FAILED_TIMEOUT' value='4'/>
+        <enumerator name='CFG80211_CONN_ASSOCIATE_NEXT' value='5'/>
+        <enumerator name='CFG80211_CONN_ASSOCIATING' value='6'/>
+        <enumerator name='CFG80211_CONN_ASSOC_FAILED' value='7'/>
+        <enumerator name='CFG80211_CONN_ASSOC_FAILED_TIMEOUT' value='8'/>
+        <enumerator name='CFG80211_CONN_DEAUTH' value='9'/>
+        <enumerator name='CFG80211_CONN_ABANDON' value='10'/>
+        <enumerator name='CFG80211_CONN_CONNECTED' value='11'/>
+      </enum-decl>
+      <enum-decl name='__anonymous_enum__1' is-anonymous='yes' filepath='include/linux/netdevice.h' line='1960' column='1' id='type-id-6637'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NETREG_UNINITIALIZED' value='0'/>
+        <enumerator name='NETREG_REGISTERED' value='1'/>
+        <enumerator name='NETREG_UNREGISTERING' value='2'/>
+        <enumerator name='NETREG_UNREGISTERED' value='3'/>
+        <enumerator name='NETREG_RELEASED' value='4'/>
+        <enumerator name='NETREG_DUMMY' value='5'/>
+      </enum-decl>
+      <enum-decl name='__anonymous_enum__2' is-anonymous='yes' filepath='include/linux/netdevice.h' line='1970' column='1' id='type-id-6638'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='RTNL_LINK_INITIALIZED' value='0'/>
+        <enumerator name='RTNL_LINK_INITIALIZING' value='1'/>
+      </enum-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='1985' column='1' id='type-id-6639'>
+        <data-member access='private'>
+          <var-decl name='ml_priv' type-id='type-id-15' visibility='default' filepath='include/linux/netdevice.h' line='1986' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='lstats' type-id='type-id-3039' visibility='default' filepath='include/linux/netdevice.h' line='1987' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='tstats' type-id='type-id-3040' visibility='default' filepath='include/linux/netdevice.h' line='1988' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='dstats' type-id='type-id-3038' visibility='default' filepath='include/linux/netdevice.h' line='1989' column='1'/>
+        </data-member>
+        <data-member access='private'>
+          <var-decl name='vstats' type-id='type-id-3041' visibility='default' filepath='include/linux/netdevice.h' line='1990' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='cfg80211_connect_resp_params' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='5579' column='1' id='type-id-6640'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='status' type-id='type-id-17' visibility='default' filepath='include/net/cfg80211.h' line='5580' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='bssid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='5581' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='bss' type-id='type-id-6288' visibility='default' filepath='include/net/cfg80211.h' line='5582' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='req_ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='5583' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='req_ie_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='5584' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='resp_ie' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='5585' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='resp_ie_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='5586' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='fils' type-id='type-id-6641' visibility='default' filepath='include/net/cfg80211.h' line='5587' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='timeout_reason' type-id='type-id-6642' visibility='default' filepath='include/net/cfg80211.h' line='5588' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='cfg80211_fils_resp_params' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='5543' column='1' id='type-id-6641'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='kek' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='5544' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='kek_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='5545' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='update_erp_next_seq_num' type-id='type-id-33' visibility='default' filepath='include/net/cfg80211.h' line='5546' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='144'>
+          <var-decl name='erp_next_seq_num' type-id='type-id-688' visibility='default' filepath='include/net/cfg80211.h' line='5547' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='pmk' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='5548' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='pmk_len' type-id='type-id-84' visibility='default' filepath='include/net/cfg80211.h' line='5549' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='pmkid' type-id='type-id-658' visibility='default' filepath='include/net/cfg80211.h' line='5550' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='nl80211_timeout_reason' filepath='include/uapi/linux/nl80211.h' line='5308' column='1' id='type-id-6642'>
+        <underlying-type type-id='type-id-94'/>
+        <enumerator name='NL80211_TIMEOUT_UNSPECIFIED' value='0'/>
+        <enumerator name='NL80211_TIMEOUT_SCAN' value='1'/>
+        <enumerator name='NL80211_TIMEOUT_AUTH' value='2'/>
+        <enumerator name='NL80211_TIMEOUT_ASSOC' value='3'/>
+      </enum-decl>
+      <pointer-type-def type-id='type-id-6640' size-in-bits='64' id='type-id-6643'/>
+      <function-decl name='cfg80211_connect_done' mangled-name='cfg80211_connect_done' filepath='net/wireless/sme.c' line='788' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_connect_done'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/wireless/sme.c' line='788' column='1'/>
+        <parameter type-id='type-id-6643' name='params' filepath='net/wireless/sme.c' line='789' column='1'/>
+        <parameter type-id='type-id-485' name='gfp' filepath='net/wireless/sme.c' line='790' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='cfg80211_disconnected' mangled-name='cfg80211_disconnected' filepath='net/wireless/sme.c' line='1106' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_disconnected'>
+        <parameter type-id='type-id-1648' name='dev' filepath='net/wireless/sme.c' line='1106' column='1'/>
+        <parameter type-id='type-id-688' name='reason' filepath='net/wireless/sme.c' line='1106' column='1'/>
+        <parameter type-id='type-id-658' name='ie' filepath='net/wireless/sme.c' line='1107' column='1'/>
+        <parameter type-id='type-id-84' name='ie_len' filepath='net/wireless/sme.c' line='1107' column='1'/>
+        <parameter type-id='type-id-33' name='locally_generated' filepath='net/wireless/sme.c' line='1108' column='1'/>
+        <parameter type-id='type-id-485' name='gfp' filepath='net/wireless/sme.c' line='1108' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='arch/arm64/lib/delay.c' language='LANG_C89'>
+      <function-decl name='__const_udelay' mangled-name='__const_udelay' filepath='arch/arm64/lib/delay.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__const_udelay'>
+        <parameter type-id='type-id-16' name='xloops' filepath='arch/arm64/lib/delay.c' line='54' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/cmdline.c' language='LANG_C89'>
+      <function-decl name='memparse' mangled-name='memparse' filepath='lib/cmdline.c' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='memparse'>
+        <parameter type-id='type-id-4' name='ptr' filepath='lib/cmdline.c' line='128' column='1'/>
+        <parameter type-id='type-id-3458' name='retptr' filepath='lib/cmdline.c' line='128' column='1'/>
+        <return type-id='type-id-98'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/cpumask.c' language='LANG_C89'>
+      <function-decl name='cpumask_next' mangled-name='cpumask_next' filepath='lib/cpumask.c' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpumask_next'>
+        <parameter type-id='type-id-17' name='n' filepath='lib/cpumask.c' line='16' column='1'/>
+        <parameter type-id='type-id-3386' name='srcp' filepath='lib/cpumask.c' line='16' column='1'/>
+        <return type-id='type-id-5'/>
+      </function-decl>
+      <function-decl name='cpumask_next_wrap' mangled-name='cpumask_next_wrap' filepath='lib/cpumask.c' line='76' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpumask_next_wrap'>
+        <parameter type-id='type-id-17' name='n' filepath='lib/cpumask.c' line='76' column='1'/>
+        <parameter type-id='type-id-3386' name='mask' filepath='lib/cpumask.c' line='76' column='1'/>
+        <parameter type-id='type-id-17' name='start' filepath='lib/cpumask.c' line='76' column='1'/>
+        <parameter type-id='type-id-33' name='wrap' filepath='lib/cpumask.c' line='76' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/idr.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-3449' size-in-bits='64' id='type-id-6644'/>
+      <function-decl name='ida_destroy' mangled-name='ida_destroy' filepath='lib/idr.c' line='503' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ida_destroy'>
+        <parameter type-id='type-id-6644' name='ida' filepath='lib/idr.c' line='503' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='ida_alloc_range' mangled-name='ida_alloc_range' filepath='lib/idr.c' line='534' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ida_alloc_range'>
+        <parameter type-id='type-id-6644' name='ida' filepath='lib/idr.c' line='534' column='1'/>
+        <parameter type-id='type-id-5' name='min' filepath='lib/idr.c' line='534' column='1'/>
+        <parameter type-id='type-id-5' name='max' filepath='lib/idr.c' line='534' column='1'/>
+        <parameter type-id='type-id-485' name='gfp' filepath='lib/idr.c' line='535' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='ida_free' mangled-name='ida_free' filepath='lib/idr.c' line='572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ida_free'>
+        <parameter type-id='type-id-6644' name='ida' filepath='lib/idr.c' line='572' column='1'/>
+        <parameter type-id='type-id-5' name='id' filepath='lib/idr.c' line='572' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/kobject.c' language='LANG_C89'>
+      <function-decl name='kobject_init_and_add' mangled-name='kobject_init_and_add' filepath='lib/kobject.c' line='444' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kobject_init_and_add'>
+        <parameter type-id='type-id-379' name='kobj' filepath='lib/kobject.c' line='444' column='1'/>
+        <parameter type-id='type-id-1394' name='ktype' filepath='lib/kobject.c' line='444' column='1'/>
+        <parameter type-id='type-id-379' name='parent' filepath='lib/kobject.c' line='445' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='lib/kobject.c' line='445' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='kobject_put' mangled-name='kobject_put' filepath='lib/kobject.c' line='701' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kobject_put'>
+        <parameter type-id='type-id-379' name='kobj' filepath='lib/kobject.c' line='701' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+      <function-decl name='kobject_del' mangled-name='kobject_del' filepath='lib/kobject.c' line='584' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kobject_del'>
+        <parameter type-id='type-id-379' name='kobj' filepath='lib/kobject.c' line='584' column='1'/>
+        <return type-id='type-id-81'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/ratelimit.c' language='LANG_C89'>
+      <pointer-type-def type-id='type-id-1637' size-in-bits='64' id='type-id-6645'/>
+      <function-decl name='___ratelimit' mangled-name='___ratelimit' filepath='lib/ratelimit.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='___ratelimit'>
+        <parameter type-id='type-id-6645' name='rs' filepath='lib/ratelimit.c' line='28' column='1'/>
+        <parameter type-id='type-id-4' name='func' filepath='lib/ratelimit.c' line='28' column='1'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+    <abi-instr version='1.0' address-size='64' path='lib/vsprintf.c' language='LANG_C89'>
+      <function-decl name='simple_strtoul' mangled-name='simple_strtoul' filepath='lib/vsprintf.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='simple_strtoul'>
+        <parameter type-id='type-id-4' name='cp' filepath='lib/vsprintf.c' line='83' column='1'/>
+        <parameter type-id='type-id-3458' name='endp' filepath='lib/vsprintf.c' line='83' column='1'/>
+        <parameter type-id='type-id-5' name='base' filepath='lib/vsprintf.c' line='83' column='1'/>
+        <return type-id='type-id-16'/>
+      </function-decl>
+      <function-decl name='snprintf' mangled-name='snprintf' filepath='lib/vsprintf.c' line='2438' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='snprintf'>
+        <parameter type-id='type-id-2' name='buf' filepath='lib/vsprintf.c' line='2438' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='lib/vsprintf.c' line='2438' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='lib/vsprintf.c' line='2438' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='scnprintf' mangled-name='scnprintf' filepath='lib/vsprintf.c' line='2462' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scnprintf'>
+        <parameter type-id='type-id-2' name='buf' filepath='lib/vsprintf.c' line='2462' column='1'/>
+        <parameter type-id='type-id-84' name='size' filepath='lib/vsprintf.c' line='2462' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='lib/vsprintf.c' line='2462' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sprintf' mangled-name='sprintf' filepath='lib/vsprintf.c' line='2507' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sprintf'>
+        <parameter type-id='type-id-2' name='buf' filepath='lib/vsprintf.c' line='2507' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='lib/vsprintf.c' line='2507' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+      <function-decl name='sscanf' mangled-name='sscanf' filepath='lib/vsprintf.c' line='3210' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sscanf'>
+        <parameter type-id='type-id-4' name='buf' filepath='lib/vsprintf.c' line='3210' column='1'/>
+        <parameter type-id='type-id-4' name='fmt' filepath='lib/vsprintf.c' line='3210' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='type-id-17'/>
+      </function-decl>
+    </abi-instr>
+  </abi-corpus>
+  <abi-corpus path='can-dev.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='crypto_engine.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='dummy_hcd.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio_mmio.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio_crypto.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio-rng.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='binfmt_misc.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='ttm.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio_input.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='dummy-cpufreq.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio_net.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='can.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='sdhci-pltfm.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='vcan.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='mmc_core.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='vmw_vsock_virtio_transport_common.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='mmc_block.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='gnss-cmdline.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='can-gw.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='rtc-test.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virt_wifi.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='failover.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='kheaders.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio-gpu.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio_ring.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='gnss-serial.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio_blk.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='vsock_diag.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio_console.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='can-raw.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='sdhci.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='vsock.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='virtio_pci.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='net_failover.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='vmw_vsock_virtio_transport.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='can-bcm.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+  <abi-corpus path='8250_of.ko' architecture='elf-arm-aarch64'>
+  </abi-corpus>
+</abi-corpus-group>
+
+<!--
+     libabigail: abidw: 1.7.0-c088667b-goog
+     built with: clang: Android (6051079 based on r370808) clang version 10.0.1 (https://android.googlesource.com/toolchain/llvm-project b9738d6d99f614c8bf7a3e7c769659b313b88244)
+-->
diff --git a/abi_gki_aarch64_whitelist b/abi_gki_aarch64_whitelist
new file mode 100644
index 0000000..8c68d31
--- /dev/null
+++ b/abi_gki_aarch64_whitelist
@@ -0,0 +1,857 @@
+[abi_whitelist]
+  add_timer
+  add_uevent_var
+  add_wait_queue
+  alloc_chrdev_region
+  __alloc_disk_node
+  alloc_etherdev_mqs
+  alloc_netdev_mqs
+  alloc_pages_exact
+  __alloc_pages_nodemask
+  __alloc_percpu
+  __alloc_skb
+  __alloc_workqueue_key
+  arch_bpf_jit_check_func
+  __arch_copy_from_user
+  __arch_copy_to_user
+  arm64_const_caps_ready
+  autoremove_wake_function
+  bcmp
+  blk_cleanup_queue
+  blk_execute_rq
+  blk_get_queue
+  blk_get_request
+  blk_mq_alloc_tag_set
+  blk_mq_complete_request
+  __blk_mq_end_request
+  blk_mq_end_request
+  blk_mq_free_tag_set
+  blk_mq_init_queue
+  blk_mq_quiesce_queue
+  blk_mq_requeue_request
+  blk_mq_run_hw_queues
+  blk_mq_start_request
+  blk_mq_start_stopped_hw_queues
+  blk_mq_stop_hw_queue
+  blk_mq_unquiesce_queue
+  blk_mq_virtio_map_queues
+  blk_put_queue
+  blk_put_request
+  blk_queue_alignment_offset
+  blk_queue_bounce_limit
+  blk_queue_flag_clear
+  blk_queue_flag_set
+  blk_queue_io_min
+  blk_queue_io_opt
+  blk_queue_logical_block_size
+  blk_queue_max_discard_sectors
+  blk_queue_max_hw_sectors
+  blk_queue_max_segments
+  blk_queue_max_segment_size
+  blk_queue_physical_block_size
+  blk_queue_rq_timeout
+  blk_queue_write_cache
+  blk_rq_map_kern
+  blk_rq_map_sg
+  blk_status_to_errno
+  blk_update_request
+  bpf_prog_add
+  bpf_prog_put
+  bpf_prog_sub
+  bpf_trace_run10
+  bpf_trace_run2
+  bpf_trace_run8
+  bpf_warn_invalid_xdp_action
+  build_skb
+  bus_register
+  bus_unregister
+  call_netdevice_notifiers
+  call_rcu
+  cancel_delayed_work
+  cancel_delayed_work_sync
+  cancel_work_sync
+  capable
+  cdev_add
+  cdev_alloc
+  cdev_del
+  cdev_device_add
+  cdev_device_del
+  cdev_init
+  cfg80211_connect_done
+  cfg80211_disconnected
+  cfg80211_inform_bss_data
+  cfg80211_put_bss
+  cfg80211_scan_done
+  __cfi_slowpath
+  check_disk_change
+  __check_object_size
+  __class_create
+  class_destroy
+  __class_register
+  class_unregister
+  clear_page
+  clk_disable
+  clk_enable
+  clk_get_rate
+  clk_prepare
+  clk_unprepare
+  complete
+  complete_all
+  completion_done
+  console_suspend_enabled
+  __const_udelay
+  consume_skb
+  _copy_from_iter_full
+  copy_page
+  _copy_to_iter
+  cpu_bit_bitmap
+  cpufreq_generic_attr
+  cpufreq_register_driver
+  cpufreq_unregister_driver
+  __cpuhp_remove_state
+  __cpuhp_setup_state
+  __cpuhp_state_add_instance
+  __cpuhp_state_remove_instance
+  cpu_hwcap_keys
+  cpu_hwcaps
+  cpumask_next
+  cpumask_next_wrap
+  cpu_number
+  __cpu_online_mask
+  cpus_read_lock
+  cpus_read_unlock
+  cpu_topology
+  crypto_ablkcipher_type
+  crypto_dequeue_request
+  crypto_enqueue_request
+  crypto_init_queue
+  crypto_register_alg
+  crypto_unregister_alg
+  datagram_poll
+  debugfs_create_dir
+  debugfs_create_file
+  debugfs_create_x32
+  debugfs_remove
+  debugfs_remove_recursive
+  debug_smp_processor_id
+  default_llseek
+  default_wake_function
+  delayed_work_timer_fn
+  del_gendisk
+  del_timer
+  del_timer_sync
+  destroy_workqueue
+  dev_add_pack
+  dev_close
+  dev_driver_string
+  _dev_err
+  dev_fwnode
+  __dev_get_by_index
+  dev_get_by_index
+  dev_get_by_index_rcu
+  dev_get_stats
+  device_add
+  device_add_disk
+  device_create
+  device_create_file
+  device_del
+  device_destroy
+  device_for_each_child
+  device_initialize
+  device_property_present
+  device_property_read_u32_array
+  device_register
+  device_remove_file
+  device_unregister
+  _dev_info
+  __dev_kfree_skb_any
+  devm_clk_get
+  dev_mc_sync_multiple
+  dev_mc_unsync
+  devm_gpiod_get_index
+  devm_gpio_request_one
+  devm_ioremap
+  devm_ioremap_resource
+  devm_kfree
+  devm_kmalloc
+  devm_regulator_get_optional
+  __devm_request_region
+  devm_request_threaded_irq
+  __devm_reset_control_get
+  devm_rtc_allocate_device
+  _dev_notice
+  dev_open
+  dev_pm_domain_attach
+  dev_pm_domain_detach
+  dev_printk
+  dev_queue_xmit
+  dev_remove_pack
+  devres_add
+  __devres_alloc_node
+  devres_destroy
+  devres_free
+  dev_set_mtu
+  dev_set_name
+  dev_uc_sync_multiple
+  dev_uc_unsync
+  _dev_warn
+  disable_irq
+  dma_alloc_from_dev_coherent
+  dma_buf_export
+  dma_buf_fd
+  dma_buf_get
+  dma_buf_put
+  dma_fence_context_alloc
+  dma_fence_enable_sw_signaling
+  dma_fence_init
+  dma_fence_match_context
+  dma_fence_release
+  dma_fence_signal
+  dma_fence_signal_locked
+  dma_fence_wait_timeout
+  dma_release_from_dev_coherent
+  driver_register
+  driver_unregister
+  drm_add_edid_modes
+  drm_add_modes_noedid
+  drm_atomic_helper_check
+  drm_atomic_helper_cleanup_planes
+  drm_atomic_helper_commit
+  drm_atomic_helper_commit_hw_done
+  drm_atomic_helper_commit_modeset_disables
+  drm_atomic_helper_commit_modeset_enables
+  drm_atomic_helper_commit_planes
+  drm_atomic_helper_connector_destroy_state
+  drm_atomic_helper_connector_duplicate_state
+  drm_atomic_helper_connector_reset
+  drm_atomic_helper_crtc_destroy_state
+  drm_atomic_helper_crtc_duplicate_state
+  drm_atomic_helper_crtc_reset
+  drm_atomic_helper_disable_plane
+  drm_atomic_helper_page_flip
+  drm_atomic_helper_plane_destroy_state
+  drm_atomic_helper_plane_duplicate_state
+  drm_atomic_helper_plane_reset
+  drm_atomic_helper_set_config
+  drm_atomic_helper_shutdown
+  drm_atomic_helper_update_plane
+  drm_atomic_helper_wait_for_vblanks
+  drm_class_device_register
+  drm_class_device_unregister
+  drm_clflush_pages
+  drm_compat_ioctl
+  drm_connector_attach_edid_property
+  drm_connector_attach_encoder
+  drm_connector_cleanup
+  drm_connector_init
+  drm_connector_register
+  drm_connector_unregister
+  drm_connector_update_edid_property
+  drm_crtc_cleanup
+  drm_crtc_init_with_planes
+  drm_crtc_send_vblank_event
+  drm_cvt_mode
+  drm_dbg
+  drm_debugfs_create_files
+  drm_dev_alloc
+  drm_dev_put
+  drm_dev_register
+  drm_dev_set_unique
+  drm_do_get_edid
+  drm_encoder_cleanup
+  drm_encoder_init
+  drm_err
+  drm_framebuffer_init
+  drm_gem_fb_create_handle
+  drm_gem_fb_destroy
+  drm_gem_handle_create
+  drm_gem_object_init
+  drm_gem_object_lookup
+  drm_gem_object_put_unlocked
+  drm_gem_object_release
+  drm_gem_prime_export
+  drm_gem_prime_fd_to_handle
+  drm_gem_prime_handle_to_fd
+  drm_gem_prime_import
+  drm_gem_prime_mmap
+  drm_global_item_ref
+  drm_global_item_unref
+  drm_helper_hpd_irq_event
+  drm_helper_mode_fill_fb_struct
+  drm_helper_probe_single_connector_modes
+  drm_ht_create
+  drm_ht_find_item
+  drm_ht_insert_item
+  drm_ht_just_insert_please
+  drm_ht_remove
+  drm_ht_remove_item
+  drm_ioctl
+  drm_kms_helper_hotplug_event
+  drm_mm_init
+  drm_mm_insert_node_in_range
+  drm_mm_print
+  drm_mm_remove_node
+  drm_mm_takedown
+  drm_mode_config_cleanup
+  drm_mode_config_init
+  drm_mode_config_reset
+  drm_mode_probed_add
+  drm_open
+  drm_plane_cleanup
+  drm_poll
+  drm_prime_pages_to_sg
+  __drm_printfn_debug
+  drm_put_dev
+  drm_read
+  drm_release
+  drm_set_preferred_mode
+  drm_universal_plane_init
+  drm_vma_offset_add
+  drm_vma_offset_lookup_locked
+  drm_vma_offset_manager_destroy
+  drm_vma_offset_manager_init
+  drm_vma_offset_remove
+  dummy_dma_ops
+  eth_commit_mac_addr_change
+  ether_setup
+  eth_prepare_mac_addr_change
+  __ethtool_get_link_ksettings
+  ethtool_op_get_link
+  ethtool_op_get_ts_info
+  eth_type_trans
+  eth_validate_addr
+  event_triggers_call
+  fasync_helper
+  fd_install
+  finish_wait
+  flow_keys_basic_dissector
+  flush_work
+  flush_workqueue
+  fput
+  free_irq
+  free_netdev
+  __free_pages
+  free_pages_exact
+  free_percpu
+  freezing_slow_path
+  fsl8250_handle_irq
+  generic_file_llseek
+  get_device
+  get_random_bytes
+  __get_task_comm
+  get_unused_fd_flags
+  gpiod_cansleep
+  gpiod_get_raw_value
+  gpiod_get_raw_value_cansleep
+  gpiod_get_value
+  gpiod_get_value_cansleep
+  gpiod_is_active_low
+  gpiod_set_debounce
+  gpiod_to_irq
+  gpio_to_desc
+  hrtimer_active
+  hrtimer_cancel
+  hrtimer_forward
+  hrtimer_init
+  hrtimer_start_range_ns
+  hvc_alloc
+  hvc_instantiate
+  hvc_kick
+  hvc_poll
+  hvc_remove
+  __hvc_resize
+  hwrng_register
+  hwrng_unregister
+  ida_alloc_range
+  ida_destroy
+  ida_free
+  init_net
+  init_timer_key
+  init_wait_entry
+  __init_waitqueue_head
+  input_alloc_absinfo
+  input_allocate_device
+  input_event
+  input_free_device
+  input_mt_init_slots
+  input_register_device
+  input_set_abs_params
+  input_unregister_device
+  iomem_resource
+  __ioremap
+  __iounmap
+  irq_dispose_mapping
+  irq_set_affinity_hint
+  irq_set_irq_wake
+  jiffies
+  jiffies_to_msecs
+  kernel_kobj
+  kfree
+  kfree_call_rcu
+  kfree_skb
+  kill_fasync
+  kimage_voffset
+  __kmalloc
+  kmalloc_caches
+  kmalloc_order_trace
+  kmem_cache_alloc
+  kmem_cache_alloc_trace
+  kmem_cache_create
+  kmem_cache_destroy
+  kmem_cache_free
+  kmemdup
+  kobject_del
+  kobject_init_and_add
+  kobject_put
+  kobject_uevent
+  kobject_uevent_env
+  kstrtoull
+  kthread_create_on_node
+  kthread_create_worker
+  kthread_destroy_worker
+  kthread_queue_work
+  kthread_should_stop
+  kthread_stop
+  ktime_get
+  ktime_get_real_seconds
+  ktime_get_ts64
+  ktime_get_with_offset
+  kvfree
+  kvmalloc_node
+  kzfree
+  led_classdev_unregister
+  led_trigger_event
+  led_trigger_register_simple
+  led_trigger_unregister_simple
+  __ll_sc_atomic64_add
+  __ll_sc_atomic64_add_return_relaxed
+  __ll_sc_atomic64_andnot
+  __ll_sc_atomic64_fetch_or
+  __ll_sc_atomic64_or
+  __ll_sc_atomic_add
+  __ll_sc_atomic_add_return
+  __ll_sc_atomic_sub
+  __ll_sc_atomic_sub_return
+  __ll_sc___cmpxchg_case_mb_4
+  __ll_sc___cmpxchg_case_mb_8
+  __local_bh_enable_ip
+  lock_sock_nested
+  mark_page_accessed
+  memcpy
+  __memcpy_fromio
+  __memcpy_toio
+  memdup_user
+  memmove
+  memparse
+  memset
+  __memset_io
+  memstart_addr
+  memzero_explicit
+  misc_deregister
+  misc_register
+  mod_timer
+  __module_get
+  module_put
+  __msecs_to_jiffies
+  msleep
+  __mutex_init
+  mutex_lock
+  mutex_lock_interruptible
+  mutex_trylock
+  mutex_unlock
+  __napi_alloc_skb
+  napi_complete_done
+  napi_consume_skb
+  napi_disable
+  napi_gro_receive
+  napi_hash_del
+  __napi_schedule
+  napi_schedule_prep
+  __netdev_alloc_skb
+  netdev_change_features
+  netdev_err
+  netdev_increment_features
+  netdev_info
+  netdev_lower_state_changed
+  netdev_master_upper_dev_link
+  netdev_notify_peers
+  netdev_rx_handler_register
+  netdev_rx_handler_unregister
+  netdev_upper_dev_link
+  netdev_upper_dev_unlink
+  netdev_warn
+  netif_carrier_off
+  netif_carrier_on
+  netif_device_attach
+  netif_device_detach
+  netif_napi_add
+  netif_napi_del
+  netif_receive_skb
+  netif_rx
+  netif_rx_ni
+  netif_schedule_queue
+  netif_set_real_num_rx_queues
+  netif_set_real_num_tx_queues
+  __netif_set_xps_queue
+  netif_stacked_transfer_operstate
+  netif_tx_stop_all_queues
+  netif_tx_wake_queue
+  netlink_capable
+  __netlink_dump_start
+  net_ratelimit
+  nf_conntrack_destroy
+  nla_memcpy
+  nla_parse
+  nla_put
+  __nlmsg_put
+  no_llseek
+  nonseekable_open
+  noop_llseek
+  nr_cpu_ids
+  nr_swap_pages
+  nsecs_to_jiffies
+  of_address_to_resource
+  of_alias_get_id
+  of_device_is_big_endian
+  of_device_is_compatible
+  of_find_property
+  of_get_child_by_name
+  of_get_next_child
+  of_get_property
+  of_irq_get
+  of_led_classdev_register
+  of_match_device
+  of_parse_phandle
+  of_property_read_u64
+  of_property_read_variable_u32_array
+  panic
+  param_ops_bool
+  param_ops_int
+  param_ops_uint
+  passthru_features_check
+  pci_alloc_irq_vectors_affinity
+  pci_bus_type
+  pci_disable_device
+  pci_enable_device
+  pci_find_capability
+  pci_find_ext_capability
+  pci_find_next_capability
+  pci_free_irq_vectors
+  pci_iomap_range
+  pci_irq_get_affinity
+  pci_irq_vector
+  pci_read_config_byte
+  pci_read_config_dword
+  __pci_register_driver
+  pci_release_selected_regions
+  pci_request_selected_regions
+  pci_set_master
+  pci_unregister_driver
+  PDE_DATA
+  __per_cpu_offset
+  perf_trace_buf_alloc
+  perf_trace_run_bpf_submit
+  pipe_lock
+  pipe_unlock
+  platform_device_add
+  platform_device_add_data
+  platform_device_alloc
+  platform_device_del
+  platform_device_put
+  platform_device_register_full
+  platform_device_unregister
+  __platform_driver_register
+  platform_driver_unregister
+  platform_get_irq
+  platform_get_resource
+  pm_generic_resume
+  pm_generic_runtime_resume
+  pm_generic_runtime_suspend
+  pm_generic_suspend
+  __pm_runtime_disable
+  pm_runtime_enable
+  __pm_runtime_idle
+  __pm_runtime_resume
+  pm_runtime_set_autosuspend_delay
+  __pm_runtime_set_status
+  __pm_runtime_suspend
+  __pm_runtime_use_autosuspend
+  pm_wakeup_dev_event
+  prandom_u32
+  preempt_count_add
+  preempt_count_sub
+  preempt_schedule
+  preempt_schedule_notrace
+  prepare_to_wait
+  prepare_to_wait_event
+  printk
+  proc_create_net_single
+  proc_mkdir_data
+  proto_register
+  proto_unregister
+  __put_cred
+  put_device
+  put_disk
+  __put_page
+  put_unused_fd
+  queue_delayed_work_on
+  queue_work_on
+  ___ratelimit
+  _raw_read_lock
+  _raw_read_unlock
+  _raw_spin_lock
+  _raw_spin_lock_bh
+  _raw_spin_lock_irq
+  _raw_spin_lock_irqsave
+  _raw_spin_trylock
+  _raw_spin_unlock
+  _raw_spin_unlock_bh
+  _raw_spin_unlock_irq
+  _raw_spin_unlock_irqrestore
+  _raw_write_lock_bh
+  _raw_write_unlock_bh
+  rcu_barrier
+  __rcu_read_lock
+  __rcu_read_unlock
+  refcount_dec_and_test_checked
+  refcount_inc_checked
+  refcount_inc_not_zero_checked
+  __refrigerator
+  register_blkdev
+  __register_chrdev
+  register_netdev
+  register_netdevice
+  register_netdevice_notifier
+  register_pernet_subsys
+  register_pm_notifier
+  register_shrinker
+  regulator_count_voltages
+  regulator_disable
+  regulator_enable
+  regulator_get_current_limit
+  regulator_get_voltage
+  regulator_is_supported_voltage
+  regulator_list_voltage
+  regulator_set_voltage
+  release_sock
+  remove_conflicting_framebuffers
+  remove_proc_entry
+  remove_wait_queue
+  __request_module
+  request_threaded_irq
+  reservation_object_add_excl_fence
+  reservation_object_add_shared_fence
+  reservation_object_copy_fences
+  reservation_object_reserve_shared
+  reservation_object_test_signaled_rcu
+  reservation_object_wait_timeout_rcu
+  reservation_ww_class
+  reset_control_assert
+  reset_control_deassert
+  revalidate_disk
+  round_jiffies
+  __rtc_register_device
+  rtc_time64_to_tm
+  rtc_tm_to_time64
+  rtc_update_irq
+  rtnl_is_locked
+  rtnl_link_register
+  rtnl_link_unregister
+  rtnl_lock
+  rtnl_register_module
+  rtnl_unlock
+  rtnl_unregister
+  rtnl_unregister_all
+  sched_setscheduler
+  schedule
+  schedule_timeout
+  scnprintf
+  security_sock_graft
+  send_sig
+  seq_lseek
+  seq_printf
+  seq_putc
+  seq_puts
+  seq_read
+  serial8250_get_port
+  serial8250_register_8250_port
+  serial8250_resume_port
+  serial8250_suspend_port
+  serial8250_unregister_port
+  set_disk_ro
+  set_page_dirty
+  sg_alloc_table
+  sg_alloc_table_from_pages
+  sg_copy_from_buffer
+  sg_copy_to_buffer
+  sg_free_table
+  sg_init_one
+  sg_init_table
+  sg_miter_next
+  sg_miter_start
+  sg_miter_stop
+  sg_nents
+  sg_nents_for_len
+  sg_next
+  shmem_file_setup
+  shmem_read_mapping_page_gfp
+  si_mem_available
+  si_meminfo
+  simple_attr_open
+  simple_attr_read
+  simple_attr_release
+  simple_attr_write
+  simple_read_from_buffer
+  simple_strtoul
+  single_open
+  single_release
+  sk_alloc
+  skb_add_rx_frag
+  skb_clone
+  skb_coalesce_rx_frag
+  skb_copy
+  skb_dequeue
+  __skb_flow_dissect
+  skb_free_datagram
+  skb_page_frag_refill
+  skb_partial_csum_set
+  skb_put
+  skb_queue_purge
+  skb_queue_tail
+  skb_recv_datagram
+  skb_to_sgvec
+  skb_trim
+  skb_tstamp_tx
+  sk_free
+  snprintf
+  sock_alloc_send_skb
+  sock_diag_register
+  sock_diag_save_cookie
+  sock_diag_unregister
+  sock_efree
+  sock_get_timestamp
+  sock_i_ino
+  sock_init_data
+  sock_no_accept
+  sock_no_bind
+  sock_no_connect
+  sock_no_getname
+  sock_no_getsockopt
+  sock_no_ioctl
+  sock_no_listen
+  sock_no_mmap
+  sock_no_sendpage
+  sock_no_setsockopt
+  sock_no_shutdown
+  sock_no_socketpair
+  sock_queue_rcv_skb
+  __sock_recv_ts_and_drops
+  sock_register
+  __sock_tx_timestamp
+  sock_unregister
+  __splice_from_pipe
+  sprintf
+  sscanf
+  __stack_chk_fail
+  __stack_chk_guard
+  strcmp
+  strcpy
+  string_get_size
+  strlcpy
+  strlen
+  strncmp
+  strncpy
+  strstr
+  __sw_hweight64
+  swiotlb_max_segment
+  sync_file_create
+  sync_file_get_fence
+  synchronize_hardirq
+  synchronize_irq
+  synchronize_net
+  synchronize_rcu
+  sysfs_create_bin_file
+  sysfs_create_group
+  __sysfs_match_string
+  sysfs_remove_bin_file
+  sysfs_remove_group
+  system_freezable_wq
+  system_freezing_cnt
+  system_wq
+  __tasklet_hi_schedule
+  tasklet_init
+  tasklet_kill
+  __tasklet_schedule
+  trace_define_field
+  trace_event_buffer_commit
+  trace_event_buffer_reserve
+  trace_event_ignore_this_pid
+  trace_event_raw_init
+  trace_event_reg
+  trace_handle_return
+  __tracepoint_dma_fence_emit
+  __tracepoint_xdp_exception
+  trace_print_symbols_seq
+  trace_raw_output_prep
+  trace_seq_printf
+  try_module_get
+  unlock_page
+  unmap_mapping_range
+  unregister_blkdev
+  __unregister_chrdev
+  unregister_chrdev_region
+  unregister_netdev
+  unregister_netdevice_notifier
+  unregister_netdevice_queue
+  unregister_pernet_subsys
+  unregister_pm_notifier
+  unregister_shrinker
+  up_read
+  usb_add_gadget_udc
+  usb_add_hcd
+  usb_create_hcd
+  usb_create_shared_hcd
+  usb_del_gadget_udc
+  usb_disabled
+  usb_ep_set_maxpacket_limit
+  usb_gadget_giveback_request
+  usb_gadget_udc_reset
+  usb_get_dev
+  usb_hcd_check_unlink_urb
+  usb_hcd_giveback_urb
+  usb_hcd_is_primary_hcd
+  usb_hcd_link_urb_to_ep
+  usb_hcd_poll_rh_status
+  usb_hcd_resume_root_hub
+  usb_hcd_unlink_urb_from_ep
+  usb_put_dev
+  usb_put_hcd
+  usb_remove_hcd
+  usleep_range
+  vmalloc_to_page
+  vmap
+  vm_get_page_prot
+  vm_insert_mixed
+  vm_insert_pfn
+  vunmap
+  wait_for_completion
+  wait_for_completion_killable
+  wait_woken
+  __wake_up
+  wake_up_process
+  __warn_printk
+  wiphy_free
+  wiphy_new_nm
+  wiphy_register
+  wiphy_unregister
+  woken_wake_function
+  ww_mutex_lock
+  ww_mutex_lock_interruptible
+  ww_mutex_unlock
+  xdp_do_flush_map
+  xdp_do_redirect
+  xdp_return_frame
+  xdp_return_frame_rx_napi
+  xdp_rxq_info_reg
+  xdp_rxq_info_reg_mem_model
+  xdp_rxq_info_unreg
\ No newline at end of file
diff --git a/arch/Kconfig b/arch/Kconfig
index a336548..6b6c827 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -475,6 +475,118 @@
 	  about 20% of all kernel functions, which increases the kernel code
 	  size by about 2%.
 
+config LTO
+	def_bool n
+
+config ARCH_SUPPORTS_LTO_CLANG
+	bool
+	help
+	  An architecture should select this option if it supports:
+	  - compiling with clang,
+	  - compiling inline assembly with clang's integrated assembler,
+	  - and linking with LLD.
+
+config ARCH_SUPPORTS_THINLTO
+	bool
+	help
+	  An architecture should select this if it supports clang's ThinLTO.
+
+config THINLTO
+	bool "Use clang ThinLTO (EXPERIMENTAL)"
+	depends on LTO_CLANG && ARCH_SUPPORTS_THINLTO
+	default y
+	help
+	  Use ThinLTO to speed up Link Time Optimization.
+
+choice
+	prompt "Link-Time Optimization (LTO) (EXPERIMENTAL)"
+	default LTO_NONE
+	help
+	  This option turns on Link-Time Optimization (LTO).
+
+config LTO_NONE
+	bool "None"
+
+config LTO_CLANG
+	bool "Use clang Link Time Optimization (LTO) (EXPERIMENTAL)"
+	depends on ARCH_SUPPORTS_LTO_CLANG
+	depends on !FTRACE_MCOUNT_RECORD || HAVE_C_RECORDMCOUNT
+	depends on !KASAN
+	depends on CC_IS_CLANG && LD_IS_LLD
+	select LTO
+	help
+          This option enables clang's Link Time Optimization (LTO), which allows
+          the compiler to optimize the kernel globally at link time. If you
+          enable this option, the compiler generates LLVM IR instead of object
+          files, and the actual compilation from IR occurs at the LTO link step,
+          which may take several minutes.
+
+          If you select this option, you must compile the kernel with clang and
+	  LLD.
+
+endchoice
+
+config CFI
+	bool
+
+config CFI_PERMISSIVE
+	bool "Use CFI in permissive mode"
+	depends on CFI
+	help
+	  When selected, Control Flow Integrity (CFI) violations result in a
+	  warning instead of a kernel panic. This option is useful for finding
+	  CFI violations in drivers during development.
+
+config CFI_CLANG
+	bool "Use clang Control Flow Integrity (CFI) (EXPERIMENTAL)"
+	depends on LTO_CLANG
+	depends on KALLSYMS
+	select CFI
+	help
+	  This option enables clang Control Flow Integrity (CFI), which adds
+	  runtime checking for indirect function calls.
+
+config CFI_CLANG_SHADOW
+	bool "Use CFI shadow to speed up cross-module checks"
+	default y
+	depends on CFI_CLANG
+	help
+	  If you select this option, the kernel builds a fast look-up table of
+	  CFI check functions in loaded modules to reduce overhead.
+
+config ARCH_SUPPORTS_SHADOW_CALL_STACK
+	bool
+	help
+	  An architecture should select this if it supports Clang's Shadow
+	  Call Stack, has asm/scs.h, and implements runtime support for shadow
+	  stack switching.
+
+config SHADOW_CALL_STACK
+	bool "Clang Shadow Call Stack"
+	depends on ARCH_SUPPORTS_SHADOW_CALL_STACK
+	help
+	  This option enables Clang's Shadow Call Stack, which uses a
+	  shadow stack to protect function return addresses from being
+	  overwritten by an attacker. More information can be found from
+	  Clang's documentation:
+
+	    https://clang.llvm.org/docs/ShadowCallStack.html
+
+	  Note that security guarantees in the kernel differ from the ones
+	  documented for user space. The kernel must store addresses of shadow
+	  stacks used by other tasks and interrupt handlers in memory, which
+	  means an attacker capable reading and writing arbitrary memory may
+	  be able to locate them and hijack control flow by modifying shadow
+	  stacks that are not currently in use.
+
+config SHADOW_CALL_STACK_VMAP
+	bool "Use virtually mapped shadow call stacks"
+	depends on SHADOW_CALL_STACK
+	help
+	  Use virtually mapped shadow call stacks. Selecting this option
+	  provides better stack exhaustion protection, but increases per-thread
+	  memory consumption as a full page is allocated for each shadow stack.
+
 config HAVE_ARCH_WITHIN_STACK_FRAMES
 	bool
 	help
@@ -863,6 +975,20 @@
 	  architectures, and don't require runtime relocation on relocatable
 	  kernels.
 
+# Select if the architecture has support for applying RELR relocations.
+config ARCH_HAS_RELR
+	bool
+
+config RELR
+	bool "Use RELR relocation packing"
+	depends on ARCH_HAS_RELR && TOOLS_SUPPORT_RELR
+	default y
+	help
+	  Store the kernel's dynamic relocations in the RELR relocation packing
+	  format. Requires a compatible linker (LLD supports this feature), as
+	  well as compatible NM and OBJCOPY utilities (llvm-nm and llvm-objcopy
+	  are compatible).
+
 source "kernel/gcov/Kconfig"
 
 source "scripts/gcc-plugins/Kconfig"
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 185e552..2c41a94 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -69,7 +69,7 @@
 	select HAVE_EXIT_THREAD
 	select HAVE_FTRACE_MCOUNT_RECORD if (!XIP_KERNEL)
 	select HAVE_FUNCTION_GRAPH_TRACER if (!THUMB2_KERNEL)
-	select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
+	select HAVE_FUNCTION_TRACER if (!XIP_KERNEL) && (CC_IS_GCC || CLANG_VERSION >= 100000)
 	select HAVE_GCC_PLUGINS
 	select HAVE_GENERIC_DMA_COHERENT
 	select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7))
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index d1516f8..62c789d 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -36,7 +36,10 @@
 endif
 
 ifeq ($(CONFIG_FRAME_POINTER),y)
-KBUILD_CFLAGS	+=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
+KBUILD_CFLAGS	+=-fno-omit-frame-pointer
+ifeq ($(CONFIG_CC_IS_GCC),y)
+KBUILD_CFLAGS += -mapcs -mno-sched-prolog
+endif
 endif
 
 ifeq ($(CONFIG_CPU_BIG_ENDIAN),y)
@@ -112,6 +115,10 @@
 CFLAGS_ABI	+=-funwind-tables
 endif
 
+ifeq ($(CONFIG_CC_IS_CLANG),y)
+CFLAGS_ABI	+= -meabi gnu
+endif
+
 # Accept old syntax despite ".syntax unified"
 AFLAGS_NOWARN	:=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W)
 
diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
index ac6b90e..75663ed 100644
--- a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
+++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
@@ -42,6 +42,7 @@
 			cci-control-port = <&cci_control1>;
 			cpu-idle-states = <&CLUSTER_SLEEP_BIG>;
 			capacity-dmips-mhz = <1024>;
+			dynamic-power-coefficient = <990>;
 		};
 
 		cpu1: cpu@1 {
@@ -51,6 +52,7 @@
 			cci-control-port = <&cci_control1>;
 			cpu-idle-states = <&CLUSTER_SLEEP_BIG>;
 			capacity-dmips-mhz = <1024>;
+			dynamic-power-coefficient = <990>;
 		};
 
 		cpu2: cpu@2 {
@@ -60,6 +62,7 @@
 			cci-control-port = <&cci_control2>;
 			cpu-idle-states = <&CLUSTER_SLEEP_LITTLE>;
 			capacity-dmips-mhz = <516>;
+			dynamic-power-coefficient = <133>;
 		};
 
 		cpu3: cpu@3 {
@@ -69,6 +72,7 @@
 			cci-control-port = <&cci_control2>;
 			cpu-idle-states = <&CLUSTER_SLEEP_LITTLE>;
 			capacity-dmips-mhz = <516>;
+			dynamic-power-coefficient = <133>;
 		};
 
 		cpu4: cpu@4 {
@@ -78,6 +82,7 @@
 			cci-control-port = <&cci_control2>;
 			cpu-idle-states = <&CLUSTER_SLEEP_LITTLE>;
 			capacity-dmips-mhz = <516>;
+			dynamic-power-coefficient = <133>;
 		};
 
 		idle-states {
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
index fc33444..2721877 100644
--- a/arch/arm/configs/multi_v7_defconfig
+++ b/arch/arm/configs/multi_v7_defconfig
@@ -2,6 +2,12 @@
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_CGROUPS=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CPUSETS=y
+CONFIG_PROC_PID_CPUSET=y
+CONFIG_SCHED_AUTOGROUP=y
 CONFIG_BLK_DEV_INITRD=y
 CONFIG_EMBEDDED=y
 CONFIG_PERF_EVENTS=y
@@ -116,6 +122,7 @@
 CONFIG_PCI_ENDPOINT_CONFIGFS=y
 CONFIG_PCI_EPF_TEST=m
 CONFIG_SMP=y
+CONFIG_SCHED_MC=y
 CONFIG_NR_CPUS=16
 CONFIG_SECCOMP=y
 CONFIG_ARM_APPENDED_DTB=y
@@ -124,10 +131,10 @@
 CONFIG_EFI=y
 CONFIG_CPU_FREQ=y
 CONFIG_CPU_FREQ_STAT=y
-CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=m
-CONFIG_CPU_FREQ_GOV_USERSPACE=m
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
 CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
 CONFIG_CPUFREQ_DT=y
 CONFIG_ARM_IMX6Q_CPUFREQ=y
@@ -137,6 +144,7 @@
 CONFIG_ARM_ZYNQ_CPUIDLE=y
 CONFIG_ARM_EXYNOS_CPUIDLE=y
 CONFIG_KERNEL_MODE_NEON=y
+CONFIG_ENERGY_MODEL=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
diff --git a/arch/arm/crypto/Kconfig b/arch/arm/crypto/Kconfig
index b8e69fe..5c278a8 100644
--- a/arch/arm/crypto/Kconfig
+++ b/arch/arm/crypto/Kconfig
@@ -69,6 +69,15 @@
 	help
 	  Use optimized AES assembler routines for ARM platforms.
 
+	  On ARM processors without the Crypto Extensions, this is the
+	  fastest AES implementation for single blocks.  For multiple
+	  blocks, the NEON bit-sliced implementation is usually faster.
+
+	  This implementation may be vulnerable to cache timing attacks,
+	  since it uses lookup tables.  However, as countermeasures it
+	  disables IRQs and preloads the tables; it is hoped this makes
+	  such attacks very difficult.
+
 config CRYPTO_AES_ARM_BS
 	tristate "Bit sliced AES using NEON instructions"
 	depends on KERNEL_MODE_NEON
@@ -116,9 +125,14 @@
 	select CRYPTO_HASH
 
 config CRYPTO_CHACHA20_NEON
-	tristate "NEON accelerated ChaCha20 symmetric cipher"
+	tristate "NEON accelerated ChaCha stream cipher algorithms"
 	depends on KERNEL_MODE_NEON
 	select CRYPTO_BLKCIPHER
 	select CRYPTO_CHACHA20
 
+config CRYPTO_NHPOLY1305_NEON
+	tristate "NEON accelerated NHPoly1305 hash function (for Adiantum)"
+	depends on KERNEL_MODE_NEON
+	select CRYPTO_NHPOLY1305
+
 endif
diff --git a/arch/arm/crypto/Makefile b/arch/arm/crypto/Makefile
index bd5bcee..b65d6bf 100644
--- a/arch/arm/crypto/Makefile
+++ b/arch/arm/crypto/Makefile
@@ -9,7 +9,8 @@
 obj-$(CONFIG_CRYPTO_SHA1_ARM_NEON) += sha1-arm-neon.o
 obj-$(CONFIG_CRYPTO_SHA256_ARM) += sha256-arm.o
 obj-$(CONFIG_CRYPTO_SHA512_ARM) += sha512-arm.o
-obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha20-neon.o
+obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
+obj-$(CONFIG_CRYPTO_NHPOLY1305_NEON) += nhpoly1305-neon.o
 
 ce-obj-$(CONFIG_CRYPTO_AES_ARM_CE) += aes-arm-ce.o
 ce-obj-$(CONFIG_CRYPTO_SHA1_ARM_CE) += sha1-arm-ce.o
@@ -52,7 +53,8 @@
 ghash-arm-ce-y	:= ghash-ce-core.o ghash-ce-glue.o
 crct10dif-arm-ce-y	:= crct10dif-ce-core.o crct10dif-ce-glue.o
 crc32-arm-ce-y:= crc32-ce-core.o crc32-ce-glue.o
-chacha20-neon-y := chacha20-neon-core.o chacha20-neon-glue.o
+chacha-neon-y := chacha-neon-core.o chacha-neon-glue.o
+nhpoly1305-neon-y := nh-neon-core.o nhpoly1305-neon-glue.o
 
 ifdef REGENERATE_ARM_CRYPTO
 quiet_cmd_perl = PERL    $@
diff --git a/arch/arm/crypto/aes-cipher-core.S b/arch/arm/crypto/aes-cipher-core.S
index 184d6c2..f2d67c0 100644
--- a/arch/arm/crypto/aes-cipher-core.S
+++ b/arch/arm/crypto/aes-cipher-core.S
@@ -10,6 +10,7 @@
  */
 
 #include <linux/linkage.h>
+#include <asm/assembler.h>
 #include <asm/cache.h>
 
 	.text
@@ -41,7 +42,7 @@
 	.endif
 	.endm
 
-	.macro		__hround, out0, out1, in0, in1, in2, in3, t3, t4, enc, sz, op
+	.macro		__hround, out0, out1, in0, in1, in2, in3, t3, t4, enc, sz, op, oldcpsr
 	__select	\out0, \in0, 0
 	__select	t0, \in1, 1
 	__load		\out0, \out0, 0, \sz, \op
@@ -73,6 +74,14 @@
 	__load		t0, t0, 3, \sz, \op
 	__load		\t4, \t4, 3, \sz, \op
 
+	.ifnb		\oldcpsr
+	/*
+	 * This is the final round and we're done with all data-dependent table
+	 * lookups, so we can safely re-enable interrupts.
+	 */
+	restore_irqs	\oldcpsr
+	.endif
+
 	eor		\out1, \out1, t1, ror #24
 	eor		\out0, \out0, t2, ror #16
 	ldm		rk!, {t1, t2}
@@ -83,14 +92,14 @@
 	eor		\out1, \out1, t2
 	.endm
 
-	.macro		fround, out0, out1, out2, out3, in0, in1, in2, in3, sz=2, op
+	.macro		fround, out0, out1, out2, out3, in0, in1, in2, in3, sz=2, op, oldcpsr
 	__hround	\out0, \out1, \in0, \in1, \in2, \in3, \out2, \out3, 1, \sz, \op
-	__hround	\out2, \out3, \in2, \in3, \in0, \in1, \in1, \in2, 1, \sz, \op
+	__hround	\out2, \out3, \in2, \in3, \in0, \in1, \in1, \in2, 1, \sz, \op, \oldcpsr
 	.endm
 
-	.macro		iround, out0, out1, out2, out3, in0, in1, in2, in3, sz=2, op
+	.macro		iround, out0, out1, out2, out3, in0, in1, in2, in3, sz=2, op, oldcpsr
 	__hround	\out0, \out1, \in0, \in3, \in2, \in1, \out2, \out3, 0, \sz, \op
-	__hround	\out2, \out3, \in2, \in1, \in0, \in3, \in1, \in0, 0, \sz, \op
+	__hround	\out2, \out3, \in2, \in1, \in0, \in3, \in1, \in0, 0, \sz, \op, \oldcpsr
 	.endm
 
 	.macro		__rev, out, in
@@ -118,13 +127,14 @@
 	.macro		do_crypt, round, ttab, ltab, bsz
 	push		{r3-r11, lr}
 
+	// Load keys first, to reduce latency in case they're not cached yet.
+	ldm		rk!, {r8-r11}
+
 	ldr		r4, [in]
 	ldr		r5, [in, #4]
 	ldr		r6, [in, #8]
 	ldr		r7, [in, #12]
 
-	ldm		rk!, {r8-r11}
-
 #ifdef CONFIG_CPU_BIG_ENDIAN
 	__rev		r4, r4
 	__rev		r5, r5
@@ -138,6 +148,25 @@
 	eor		r7, r7, r11
 
 	__adrl		ttab, \ttab
+	/*
+	 * Disable interrupts and prefetch the 1024-byte 'ft' or 'it' table into
+	 * L1 cache, assuming cacheline size >= 32.  This is a hardening measure
+	 * intended to make cache-timing attacks more difficult.  They may not
+	 * be fully prevented, however; see the paper
+	 * https://cr.yp.to/antiforgery/cachetiming-20050414.pdf
+	 * ("Cache-timing attacks on AES") for a discussion of the many
+	 * difficulties involved in writing truly constant-time AES software.
+	 */
+	 save_and_disable_irqs	t0
+	.set		i, 0
+	.rept		1024 / 128
+	ldr		r8, [ttab, #i + 0]
+	ldr		r9, [ttab, #i + 32]
+	ldr		r10, [ttab, #i + 64]
+	ldr		r11, [ttab, #i + 96]
+	.set		i, i + 128
+	.endr
+	push		{t0}		// oldcpsr
 
 	tst		rounds, #2
 	bne		1f
@@ -151,8 +180,21 @@
 	\round		r4, r5, r6, r7, r8, r9, r10, r11
 	b		0b
 
-2:	__adrl		ttab, \ltab
-	\round		r4, r5, r6, r7, r8, r9, r10, r11, \bsz, b
+2:	.ifb		\ltab
+	add		ttab, ttab, #1
+	.else
+	__adrl		ttab, \ltab
+	// Prefetch inverse S-box for final round; see explanation above
+	.set		i, 0
+	.rept		256 / 64
+	ldr		t0, [ttab, #i + 0]
+	ldr		t1, [ttab, #i + 32]
+	.set		i, i + 64
+	.endr
+	.endif
+
+	pop		{rounds}	// oldcpsr
+	\round		r4, r5, r6, r7, r8, r9, r10, r11, \bsz, b, rounds
 
 #ifdef CONFIG_CPU_BIG_ENDIAN
 	__rev		r4, r4
@@ -175,7 +217,7 @@
 	.endm
 
 ENTRY(__aes_arm_encrypt)
-	do_crypt	fround, crypto_ft_tab, crypto_ft_tab + 1, 2
+	do_crypt	fround, crypto_ft_tab,, 2
 ENDPROC(__aes_arm_encrypt)
 
 	.align		5
diff --git a/arch/arm/crypto/chacha-neon-core.S b/arch/arm/crypto/chacha-neon-core.S
new file mode 100644
index 0000000..eb22926
--- /dev/null
+++ b/arch/arm/crypto/chacha-neon-core.S
@@ -0,0 +1,560 @@
+/*
+ * ChaCha/XChaCha NEON helper functions
+ *
+ * Copyright (C) 2016 Linaro, Ltd. <ard.biesheuvel@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Based on:
+ * ChaCha20 256-bit cipher algorithm, RFC7539, x64 SSE3 functions
+ *
+ * Copyright (C) 2015 Martin Willi
+ *
+ * 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.
+ */
+
+ /*
+  * NEON doesn't have a rotate instruction.  The alternatives are, more or less:
+  *
+  * (a)  vshl.u32 + vsri.u32		(needs temporary register)
+  * (b)  vshl.u32 + vshr.u32 + vorr	(needs temporary register)
+  * (c)  vrev32.16			(16-bit rotations only)
+  * (d)  vtbl.8 + vtbl.8		(multiple of 8 bits rotations only,
+  *					 needs index vector)
+  *
+  * ChaCha has 16, 12, 8, and 7-bit rotations.  For the 12 and 7-bit rotations,
+  * the only choices are (a) and (b).  We use (a) since it takes two-thirds the
+  * cycles of (b) on both Cortex-A7 and Cortex-A53.
+  *
+  * For the 16-bit rotation, we use vrev32.16 since it's consistently fastest
+  * and doesn't need a temporary register.
+  *
+  * For the 8-bit rotation, we use vtbl.8 + vtbl.8.  On Cortex-A7, this sequence
+  * is twice as fast as (a), even when doing (a) on multiple registers
+  * simultaneously to eliminate the stall between vshl and vsri.  Also, it
+  * parallelizes better when temporary registers are scarce.
+  *
+  * A disadvantage is that on Cortex-A53, the vtbl sequence is the same speed as
+  * (a), so the need to load the rotation table actually makes the vtbl method
+  * slightly slower overall on that CPU (~1.3% slower ChaCha20).  Still, it
+  * seems to be a good compromise to get a more significant speed boost on some
+  * CPUs, e.g. ~4.8% faster ChaCha20 on Cortex-A7.
+  */
+
+#include <linux/linkage.h>
+
+	.text
+	.fpu		neon
+	.align		5
+
+/*
+ * chacha_permute - permute one block
+ *
+ * Permute one 64-byte block where the state matrix is stored in the four NEON
+ * registers q0-q3.  It performs matrix operations on four words in parallel,
+ * but requires shuffling to rearrange the words after each round.
+ *
+ * The round count is given in r3.
+ *
+ * Clobbers: r3, ip, q4-q5
+ */
+chacha_permute:
+
+	adr		ip, .Lrol8_table
+	vld1.8		{d10}, [ip, :64]
+
+.Ldoubleround:
+	// x0 += x1, x3 = rotl32(x3 ^ x0, 16)
+	vadd.i32	q0, q0, q1
+	veor		q3, q3, q0
+	vrev32.16	q3, q3
+
+	// x2 += x3, x1 = rotl32(x1 ^ x2, 12)
+	vadd.i32	q2, q2, q3
+	veor		q4, q1, q2
+	vshl.u32	q1, q4, #12
+	vsri.u32	q1, q4, #20
+
+	// x0 += x1, x3 = rotl32(x3 ^ x0, 8)
+	vadd.i32	q0, q0, q1
+	veor		q3, q3, q0
+	vtbl.8		d6, {d6}, d10
+	vtbl.8		d7, {d7}, d10
+
+	// x2 += x3, x1 = rotl32(x1 ^ x2, 7)
+	vadd.i32	q2, q2, q3
+	veor		q4, q1, q2
+	vshl.u32	q1, q4, #7
+	vsri.u32	q1, q4, #25
+
+	// x1 = shuffle32(x1, MASK(0, 3, 2, 1))
+	vext.8		q1, q1, q1, #4
+	// x2 = shuffle32(x2, MASK(1, 0, 3, 2))
+	vext.8		q2, q2, q2, #8
+	// x3 = shuffle32(x3, MASK(2, 1, 0, 3))
+	vext.8		q3, q3, q3, #12
+
+	// x0 += x1, x3 = rotl32(x3 ^ x0, 16)
+	vadd.i32	q0, q0, q1
+	veor		q3, q3, q0
+	vrev32.16	q3, q3
+
+	// x2 += x3, x1 = rotl32(x1 ^ x2, 12)
+	vadd.i32	q2, q2, q3
+	veor		q4, q1, q2
+	vshl.u32	q1, q4, #12
+	vsri.u32	q1, q4, #20
+
+	// x0 += x1, x3 = rotl32(x3 ^ x0, 8)
+	vadd.i32	q0, q0, q1
+	veor		q3, q3, q0
+	vtbl.8		d6, {d6}, d10
+	vtbl.8		d7, {d7}, d10
+
+	// x2 += x3, x1 = rotl32(x1 ^ x2, 7)
+	vadd.i32	q2, q2, q3
+	veor		q4, q1, q2
+	vshl.u32	q1, q4, #7
+	vsri.u32	q1, q4, #25
+
+	// x1 = shuffle32(x1, MASK(2, 1, 0, 3))
+	vext.8		q1, q1, q1, #12
+	// x2 = shuffle32(x2, MASK(1, 0, 3, 2))
+	vext.8		q2, q2, q2, #8
+	// x3 = shuffle32(x3, MASK(0, 3, 2, 1))
+	vext.8		q3, q3, q3, #4
+
+	subs		r3, r3, #2
+	bne		.Ldoubleround
+
+	bx		lr
+ENDPROC(chacha_permute)
+
+ENTRY(chacha_block_xor_neon)
+	// r0: Input state matrix, s
+	// r1: 1 data block output, o
+	// r2: 1 data block input, i
+	// r3: nrounds
+	push		{lr}
+
+	// x0..3 = s0..3
+	add		ip, r0, #0x20
+	vld1.32		{q0-q1}, [r0]
+	vld1.32		{q2-q3}, [ip]
+
+	vmov		q8, q0
+	vmov		q9, q1
+	vmov		q10, q2
+	vmov		q11, q3
+
+	bl		chacha_permute
+
+	add		ip, r2, #0x20
+	vld1.8		{q4-q5}, [r2]
+	vld1.8		{q6-q7}, [ip]
+
+	// o0 = i0 ^ (x0 + s0)
+	vadd.i32	q0, q0, q8
+	veor		q0, q0, q4
+
+	// o1 = i1 ^ (x1 + s1)
+	vadd.i32	q1, q1, q9
+	veor		q1, q1, q5
+
+	// o2 = i2 ^ (x2 + s2)
+	vadd.i32	q2, q2, q10
+	veor		q2, q2, q6
+
+	// o3 = i3 ^ (x3 + s3)
+	vadd.i32	q3, q3, q11
+	veor		q3, q3, q7
+
+	add		ip, r1, #0x20
+	vst1.8		{q0-q1}, [r1]
+	vst1.8		{q2-q3}, [ip]
+
+	pop		{pc}
+ENDPROC(chacha_block_xor_neon)
+
+ENTRY(hchacha_block_neon)
+	// r0: Input state matrix, s
+	// r1: output (8 32-bit words)
+	// r2: nrounds
+	push		{lr}
+
+	vld1.32		{q0-q1}, [r0]!
+	vld1.32		{q2-q3}, [r0]
+
+	mov		r3, r2
+	bl		chacha_permute
+
+	vst1.32		{q0}, [r1]!
+	vst1.32		{q3}, [r1]
+
+	pop		{pc}
+ENDPROC(hchacha_block_neon)
+
+	.align		4
+.Lctrinc:	.word	0, 1, 2, 3
+.Lrol8_table:	.byte	3, 0, 1, 2, 7, 4, 5, 6
+
+	.align		5
+ENTRY(chacha_4block_xor_neon)
+	push		{r4-r5}
+	mov		r4, sp			// preserve the stack pointer
+	sub		ip, sp, #0x20		// allocate a 32 byte buffer
+	bic		ip, ip, #0x1f		// aligned to 32 bytes
+	mov		sp, ip
+
+	// r0: Input state matrix, s
+	// r1: 4 data blocks output, o
+	// r2: 4 data blocks input, i
+	// r3: nrounds
+
+	//
+	// This function encrypts four consecutive ChaCha blocks by loading
+	// the state matrix in NEON registers four times. The algorithm performs
+	// each operation on the corresponding word of each state matrix, hence
+	// requires no word shuffling. The words are re-interleaved before the
+	// final addition of the original state and the XORing step.
+	//
+
+	// x0..15[0-3] = s0..15[0-3]
+	add		ip, r0, #0x20
+	vld1.32		{q0-q1}, [r0]
+	vld1.32		{q2-q3}, [ip]
+
+	adr		r5, .Lctrinc
+	vdup.32		q15, d7[1]
+	vdup.32		q14, d7[0]
+	vld1.32		{q4}, [r5, :128]
+	vdup.32		q13, d6[1]
+	vdup.32		q12, d6[0]
+	vdup.32		q11, d5[1]
+	vdup.32		q10, d5[0]
+	vadd.u32	q12, q12, q4		// x12 += counter values 0-3
+	vdup.32		q9, d4[1]
+	vdup.32		q8, d4[0]
+	vdup.32		q7, d3[1]
+	vdup.32		q6, d3[0]
+	vdup.32		q5, d2[1]
+	vdup.32		q4, d2[0]
+	vdup.32		q3, d1[1]
+	vdup.32		q2, d1[0]
+	vdup.32		q1, d0[1]
+	vdup.32		q0, d0[0]
+
+	adr		ip, .Lrol8_table
+	b		1f
+
+.Ldoubleround4:
+	vld1.32		{q8-q9}, [sp, :256]
+1:
+	// x0 += x4, x12 = rotl32(x12 ^ x0, 16)
+	// x1 += x5, x13 = rotl32(x13 ^ x1, 16)
+	// x2 += x6, x14 = rotl32(x14 ^ x2, 16)
+	// x3 += x7, x15 = rotl32(x15 ^ x3, 16)
+	vadd.i32	q0, q0, q4
+	vadd.i32	q1, q1, q5
+	vadd.i32	q2, q2, q6
+	vadd.i32	q3, q3, q7
+
+	veor		q12, q12, q0
+	veor		q13, q13, q1
+	veor		q14, q14, q2
+	veor		q15, q15, q3
+
+	vrev32.16	q12, q12
+	vrev32.16	q13, q13
+	vrev32.16	q14, q14
+	vrev32.16	q15, q15
+
+	// x8 += x12, x4 = rotl32(x4 ^ x8, 12)
+	// x9 += x13, x5 = rotl32(x5 ^ x9, 12)
+	// x10 += x14, x6 = rotl32(x6 ^ x10, 12)
+	// x11 += x15, x7 = rotl32(x7 ^ x11, 12)
+	vadd.i32	q8, q8, q12
+	vadd.i32	q9, q9, q13
+	vadd.i32	q10, q10, q14
+	vadd.i32	q11, q11, q15
+
+	vst1.32		{q8-q9}, [sp, :256]
+
+	veor		q8, q4, q8
+	veor		q9, q5, q9
+	vshl.u32	q4, q8, #12
+	vshl.u32	q5, q9, #12
+	vsri.u32	q4, q8, #20
+	vsri.u32	q5, q9, #20
+
+	veor		q8, q6, q10
+	veor		q9, q7, q11
+	vshl.u32	q6, q8, #12
+	vshl.u32	q7, q9, #12
+	vsri.u32	q6, q8, #20
+	vsri.u32	q7, q9, #20
+
+	// x0 += x4, x12 = rotl32(x12 ^ x0, 8)
+	// x1 += x5, x13 = rotl32(x13 ^ x1, 8)
+	// x2 += x6, x14 = rotl32(x14 ^ x2, 8)
+	// x3 += x7, x15 = rotl32(x15 ^ x3, 8)
+	vld1.8		{d16}, [ip, :64]
+	vadd.i32	q0, q0, q4
+	vadd.i32	q1, q1, q5
+	vadd.i32	q2, q2, q6
+	vadd.i32	q3, q3, q7
+
+	veor		q12, q12, q0
+	veor		q13, q13, q1
+	veor		q14, q14, q2
+	veor		q15, q15, q3
+
+	vtbl.8		d24, {d24}, d16
+	vtbl.8		d25, {d25}, d16
+	vtbl.8		d26, {d26}, d16
+	vtbl.8		d27, {d27}, d16
+	vtbl.8		d28, {d28}, d16
+	vtbl.8		d29, {d29}, d16
+	vtbl.8		d30, {d30}, d16
+	vtbl.8		d31, {d31}, d16
+
+	vld1.32		{q8-q9}, [sp, :256]
+
+	// x8 += x12, x4 = rotl32(x4 ^ x8, 7)
+	// x9 += x13, x5 = rotl32(x5 ^ x9, 7)
+	// x10 += x14, x6 = rotl32(x6 ^ x10, 7)
+	// x11 += x15, x7 = rotl32(x7 ^ x11, 7)
+	vadd.i32	q8, q8, q12
+	vadd.i32	q9, q9, q13
+	vadd.i32	q10, q10, q14
+	vadd.i32	q11, q11, q15
+
+	vst1.32		{q8-q9}, [sp, :256]
+
+	veor		q8, q4, q8
+	veor		q9, q5, q9
+	vshl.u32	q4, q8, #7
+	vshl.u32	q5, q9, #7
+	vsri.u32	q4, q8, #25
+	vsri.u32	q5, q9, #25
+
+	veor		q8, q6, q10
+	veor		q9, q7, q11
+	vshl.u32	q6, q8, #7
+	vshl.u32	q7, q9, #7
+	vsri.u32	q6, q8, #25
+	vsri.u32	q7, q9, #25
+
+	vld1.32		{q8-q9}, [sp, :256]
+
+	// x0 += x5, x15 = rotl32(x15 ^ x0, 16)
+	// x1 += x6, x12 = rotl32(x12 ^ x1, 16)
+	// x2 += x7, x13 = rotl32(x13 ^ x2, 16)
+	// x3 += x4, x14 = rotl32(x14 ^ x3, 16)
+	vadd.i32	q0, q0, q5
+	vadd.i32	q1, q1, q6
+	vadd.i32	q2, q2, q7
+	vadd.i32	q3, q3, q4
+
+	veor		q15, q15, q0
+	veor		q12, q12, q1
+	veor		q13, q13, q2
+	veor		q14, q14, q3
+
+	vrev32.16	q15, q15
+	vrev32.16	q12, q12
+	vrev32.16	q13, q13
+	vrev32.16	q14, q14
+
+	// x10 += x15, x5 = rotl32(x5 ^ x10, 12)
+	// x11 += x12, x6 = rotl32(x6 ^ x11, 12)
+	// x8 += x13, x7 = rotl32(x7 ^ x8, 12)
+	// x9 += x14, x4 = rotl32(x4 ^ x9, 12)
+	vadd.i32	q10, q10, q15
+	vadd.i32	q11, q11, q12
+	vadd.i32	q8, q8, q13
+	vadd.i32	q9, q9, q14
+
+	vst1.32		{q8-q9}, [sp, :256]
+
+	veor		q8, q7, q8
+	veor		q9, q4, q9
+	vshl.u32	q7, q8, #12
+	vshl.u32	q4, q9, #12
+	vsri.u32	q7, q8, #20
+	vsri.u32	q4, q9, #20
+
+	veor		q8, q5, q10
+	veor		q9, q6, q11
+	vshl.u32	q5, q8, #12
+	vshl.u32	q6, q9, #12
+	vsri.u32	q5, q8, #20
+	vsri.u32	q6, q9, #20
+
+	// x0 += x5, x15 = rotl32(x15 ^ x0, 8)
+	// x1 += x6, x12 = rotl32(x12 ^ x1, 8)
+	// x2 += x7, x13 = rotl32(x13 ^ x2, 8)
+	// x3 += x4, x14 = rotl32(x14 ^ x3, 8)
+	vld1.8		{d16}, [ip, :64]
+	vadd.i32	q0, q0, q5
+	vadd.i32	q1, q1, q6
+	vadd.i32	q2, q2, q7
+	vadd.i32	q3, q3, q4
+
+	veor		q15, q15, q0
+	veor		q12, q12, q1
+	veor		q13, q13, q2
+	veor		q14, q14, q3
+
+	vtbl.8		d30, {d30}, d16
+	vtbl.8		d31, {d31}, d16
+	vtbl.8		d24, {d24}, d16
+	vtbl.8		d25, {d25}, d16
+	vtbl.8		d26, {d26}, d16
+	vtbl.8		d27, {d27}, d16
+	vtbl.8		d28, {d28}, d16
+	vtbl.8		d29, {d29}, d16
+
+	vld1.32		{q8-q9}, [sp, :256]
+
+	// x10 += x15, x5 = rotl32(x5 ^ x10, 7)
+	// x11 += x12, x6 = rotl32(x6 ^ x11, 7)
+	// x8 += x13, x7 = rotl32(x7 ^ x8, 7)
+	// x9 += x14, x4 = rotl32(x4 ^ x9, 7)
+	vadd.i32	q10, q10, q15
+	vadd.i32	q11, q11, q12
+	vadd.i32	q8, q8, q13
+	vadd.i32	q9, q9, q14
+
+	vst1.32		{q8-q9}, [sp, :256]
+
+	veor		q8, q7, q8
+	veor		q9, q4, q9
+	vshl.u32	q7, q8, #7
+	vshl.u32	q4, q9, #7
+	vsri.u32	q7, q8, #25
+	vsri.u32	q4, q9, #25
+
+	veor		q8, q5, q10
+	veor		q9, q6, q11
+	vshl.u32	q5, q8, #7
+	vshl.u32	q6, q9, #7
+	vsri.u32	q5, q8, #25
+	vsri.u32	q6, q9, #25
+
+	subs		r3, r3, #2
+	bne		.Ldoubleround4
+
+	// x0..7[0-3] are in q0-q7, x10..15[0-3] are in q10-q15.
+	// x8..9[0-3] are on the stack.
+
+	// Re-interleave the words in the first two rows of each block (x0..7).
+	// Also add the counter values 0-3 to x12[0-3].
+	  vld1.32	{q8}, [r5, :128]	// load counter values 0-3
+	vzip.32		q0, q1			// => (0 1 0 1) (0 1 0 1)
+	vzip.32		q2, q3			// => (2 3 2 3) (2 3 2 3)
+	vzip.32		q4, q5			// => (4 5 4 5) (4 5 4 5)
+	vzip.32		q6, q7			// => (6 7 6 7) (6 7 6 7)
+	  vadd.u32	q12, q8			// x12 += counter values 0-3
+	vswp		d1, d4
+	vswp		d3, d6
+	  vld1.32	{q8-q9}, [r0]!		// load s0..7
+	vswp		d9, d12
+	vswp		d11, d14
+
+	// Swap q1 and q4 so that we'll free up consecutive registers (q0-q1)
+	// after XORing the first 32 bytes.
+	vswp		q1, q4
+
+	// First two rows of each block are (q0 q1) (q2 q6) (q4 q5) (q3 q7)
+
+	// x0..3[0-3] += s0..3[0-3]	(add orig state to 1st row of each block)
+	vadd.u32	q0, q0, q8
+	vadd.u32	q2, q2, q8
+	vadd.u32	q4, q4, q8
+	vadd.u32	q3, q3, q8
+
+	// x4..7[0-3] += s4..7[0-3]	(add orig state to 2nd row of each block)
+	vadd.u32	q1, q1, q9
+	vadd.u32	q6, q6, q9
+	vadd.u32	q5, q5, q9
+	vadd.u32	q7, q7, q9
+
+	// XOR first 32 bytes using keystream from first two rows of first block
+	vld1.8		{q8-q9}, [r2]!
+	veor		q8, q8, q0
+	veor		q9, q9, q1
+	vst1.8		{q8-q9}, [r1]!
+
+	// Re-interleave the words in the last two rows of each block (x8..15).
+	vld1.32		{q8-q9}, [sp, :256]
+	vzip.32		q12, q13	// => (12 13 12 13) (12 13 12 13)
+	vzip.32		q14, q15	// => (14 15 14 15) (14 15 14 15)
+	vzip.32		q8, q9		// => (8 9 8 9) (8 9 8 9)
+	vzip.32		q10, q11	// => (10 11 10 11) (10 11 10 11)
+	  vld1.32	{q0-q1}, [r0]	// load s8..15
+	vswp		d25, d28
+	vswp		d27, d30
+	vswp		d17, d20
+	vswp		d19, d22
+
+	// Last two rows of each block are (q8 q12) (q10 q14) (q9 q13) (q11 q15)
+
+	// x8..11[0-3] += s8..11[0-3]	(add orig state to 3rd row of each block)
+	vadd.u32	q8,  q8,  q0
+	vadd.u32	q10, q10, q0
+	vadd.u32	q9,  q9,  q0
+	vadd.u32	q11, q11, q0
+
+	// x12..15[0-3] += s12..15[0-3] (add orig state to 4th row of each block)
+	vadd.u32	q12, q12, q1
+	vadd.u32	q14, q14, q1
+	vadd.u32	q13, q13, q1
+	vadd.u32	q15, q15, q1
+
+	// XOR the rest of the data with the keystream
+
+	vld1.8		{q0-q1}, [r2]!
+	veor		q0, q0, q8
+	veor		q1, q1, q12
+	vst1.8		{q0-q1}, [r1]!
+
+	vld1.8		{q0-q1}, [r2]!
+	veor		q0, q0, q2
+	veor		q1, q1, q6
+	vst1.8		{q0-q1}, [r1]!
+
+	vld1.8		{q0-q1}, [r2]!
+	veor		q0, q0, q10
+	veor		q1, q1, q14
+	vst1.8		{q0-q1}, [r1]!
+
+	vld1.8		{q0-q1}, [r2]!
+	veor		q0, q0, q4
+	veor		q1, q1, q5
+	vst1.8		{q0-q1}, [r1]!
+
+	vld1.8		{q0-q1}, [r2]!
+	veor		q0, q0, q9
+	veor		q1, q1, q13
+	vst1.8		{q0-q1}, [r1]!
+
+	vld1.8		{q0-q1}, [r2]!
+	veor		q0, q0, q3
+	veor		q1, q1, q7
+	vst1.8		{q0-q1}, [r1]!
+
+	vld1.8		{q0-q1}, [r2]
+	  mov		sp, r4		// restore original stack pointer
+	veor		q0, q0, q11
+	veor		q1, q1, q15
+	vst1.8		{q0-q1}, [r1]
+
+	pop		{r4-r5}
+	bx		lr
+ENDPROC(chacha_4block_xor_neon)
diff --git a/arch/arm/crypto/chacha-neon-glue.c b/arch/arm/crypto/chacha-neon-glue.c
new file mode 100644
index 0000000..9d6fda8
--- /dev/null
+++ b/arch/arm/crypto/chacha-neon-glue.c
@@ -0,0 +1,201 @@
+/*
+ * ARM NEON accelerated ChaCha and XChaCha stream ciphers,
+ * including ChaCha20 (RFC7539)
+ *
+ * Copyright (C) 2016 Linaro, Ltd. <ard.biesheuvel@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Based on:
+ * ChaCha20 256-bit cipher algorithm, RFC7539, SIMD glue code
+ *
+ * Copyright (C) 2015 Martin Willi
+ *
+ * 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.
+ */
+
+#include <crypto/algapi.h>
+#include <crypto/chacha.h>
+#include <crypto/internal/skcipher.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+#include <asm/hwcap.h>
+#include <asm/neon.h>
+#include <asm/simd.h>
+
+asmlinkage void chacha_block_xor_neon(const u32 *state, u8 *dst, const u8 *src,
+				      int nrounds);
+asmlinkage void chacha_4block_xor_neon(const u32 *state, u8 *dst, const u8 *src,
+				       int nrounds);
+asmlinkage void hchacha_block_neon(const u32 *state, u32 *out, int nrounds);
+
+static void chacha_doneon(u32 *state, u8 *dst, const u8 *src,
+			  unsigned int bytes, int nrounds)
+{
+	u8 buf[CHACHA_BLOCK_SIZE];
+
+	while (bytes >= CHACHA_BLOCK_SIZE * 4) {
+		chacha_4block_xor_neon(state, dst, src, nrounds);
+		bytes -= CHACHA_BLOCK_SIZE * 4;
+		src += CHACHA_BLOCK_SIZE * 4;
+		dst += CHACHA_BLOCK_SIZE * 4;
+		state[12] += 4;
+	}
+	while (bytes >= CHACHA_BLOCK_SIZE) {
+		chacha_block_xor_neon(state, dst, src, nrounds);
+		bytes -= CHACHA_BLOCK_SIZE;
+		src += CHACHA_BLOCK_SIZE;
+		dst += CHACHA_BLOCK_SIZE;
+		state[12]++;
+	}
+	if (bytes) {
+		memcpy(buf, src, bytes);
+		chacha_block_xor_neon(state, buf, buf, nrounds);
+		memcpy(dst, buf, bytes);
+	}
+}
+
+static int chacha_neon_stream_xor(struct skcipher_request *req,
+				  struct chacha_ctx *ctx, u8 *iv)
+{
+	struct skcipher_walk walk;
+	u32 state[16];
+	int err;
+
+	err = skcipher_walk_virt(&walk, req, false);
+
+	crypto_chacha_init(state, ctx, iv);
+
+	while (walk.nbytes > 0) {
+		unsigned int nbytes = walk.nbytes;
+
+		if (nbytes < walk.total)
+			nbytes = round_down(nbytes, walk.stride);
+
+		kernel_neon_begin();
+		chacha_doneon(state, walk.dst.virt.addr, walk.src.virt.addr,
+			      nbytes, ctx->nrounds);
+		kernel_neon_end();
+		err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
+	}
+
+	return err;
+}
+
+static int chacha_neon(struct skcipher_request *req)
+{
+	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+	struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
+
+	if (req->cryptlen <= CHACHA_BLOCK_SIZE || !may_use_simd())
+		return crypto_chacha_crypt(req);
+
+	return chacha_neon_stream_xor(req, ctx, req->iv);
+}
+
+static int xchacha_neon(struct skcipher_request *req)
+{
+	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+	struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
+	struct chacha_ctx subctx;
+	u32 state[16];
+	u8 real_iv[16];
+
+	if (req->cryptlen <= CHACHA_BLOCK_SIZE || !may_use_simd())
+		return crypto_xchacha_crypt(req);
+
+	crypto_chacha_init(state, ctx, req->iv);
+
+	kernel_neon_begin();
+	hchacha_block_neon(state, subctx.key, ctx->nrounds);
+	kernel_neon_end();
+	subctx.nrounds = ctx->nrounds;
+
+	memcpy(&real_iv[0], req->iv + 24, 8);
+	memcpy(&real_iv[8], req->iv + 16, 8);
+	return chacha_neon_stream_xor(req, &subctx, real_iv);
+}
+
+static struct skcipher_alg algs[] = {
+	{
+		.base.cra_name		= "chacha20",
+		.base.cra_driver_name	= "chacha20-neon",
+		.base.cra_priority	= 300,
+		.base.cra_blocksize	= 1,
+		.base.cra_ctxsize	= sizeof(struct chacha_ctx),
+		.base.cra_module	= THIS_MODULE,
+
+		.min_keysize		= CHACHA_KEY_SIZE,
+		.max_keysize		= CHACHA_KEY_SIZE,
+		.ivsize			= CHACHA_IV_SIZE,
+		.chunksize		= CHACHA_BLOCK_SIZE,
+		.walksize		= 4 * CHACHA_BLOCK_SIZE,
+		.setkey			= crypto_chacha20_setkey,
+		.encrypt		= chacha_neon,
+		.decrypt		= chacha_neon,
+	}, {
+		.base.cra_name		= "xchacha20",
+		.base.cra_driver_name	= "xchacha20-neon",
+		.base.cra_priority	= 300,
+		.base.cra_blocksize	= 1,
+		.base.cra_ctxsize	= sizeof(struct chacha_ctx),
+		.base.cra_module	= THIS_MODULE,
+
+		.min_keysize		= CHACHA_KEY_SIZE,
+		.max_keysize		= CHACHA_KEY_SIZE,
+		.ivsize			= XCHACHA_IV_SIZE,
+		.chunksize		= CHACHA_BLOCK_SIZE,
+		.walksize		= 4 * CHACHA_BLOCK_SIZE,
+		.setkey			= crypto_chacha20_setkey,
+		.encrypt		= xchacha_neon,
+		.decrypt		= xchacha_neon,
+	}, {
+		.base.cra_name		= "xchacha12",
+		.base.cra_driver_name	= "xchacha12-neon",
+		.base.cra_priority	= 300,
+		.base.cra_blocksize	= 1,
+		.base.cra_ctxsize	= sizeof(struct chacha_ctx),
+		.base.cra_module	= THIS_MODULE,
+
+		.min_keysize		= CHACHA_KEY_SIZE,
+		.max_keysize		= CHACHA_KEY_SIZE,
+		.ivsize			= XCHACHA_IV_SIZE,
+		.chunksize		= CHACHA_BLOCK_SIZE,
+		.walksize		= 4 * CHACHA_BLOCK_SIZE,
+		.setkey			= crypto_chacha12_setkey,
+		.encrypt		= xchacha_neon,
+		.decrypt		= xchacha_neon,
+	}
+};
+
+static int __init chacha_simd_mod_init(void)
+{
+	if (!(elf_hwcap & HWCAP_NEON))
+		return -ENODEV;
+
+	return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
+}
+
+static void __exit chacha_simd_mod_fini(void)
+{
+	crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
+}
+
+module_init(chacha_simd_mod_init);
+module_exit(chacha_simd_mod_fini);
+
+MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (NEON accelerated)");
+MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS_CRYPTO("chacha20");
+MODULE_ALIAS_CRYPTO("chacha20-neon");
+MODULE_ALIAS_CRYPTO("xchacha20");
+MODULE_ALIAS_CRYPTO("xchacha20-neon");
+MODULE_ALIAS_CRYPTO("xchacha12");
+MODULE_ALIAS_CRYPTO("xchacha12-neon");
diff --git a/arch/arm/crypto/chacha20-neon-core.S b/arch/arm/crypto/chacha20-neon-core.S
deleted file mode 100644
index 451a849..0000000
--- a/arch/arm/crypto/chacha20-neon-core.S
+++ /dev/null
@@ -1,521 +0,0 @@
-/*
- * ChaCha20 256-bit cipher algorithm, RFC7539, ARM NEON functions
- *
- * Copyright (C) 2016 Linaro, Ltd. <ard.biesheuvel@linaro.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Based on:
- * ChaCha20 256-bit cipher algorithm, RFC7539, x64 SSE3 functions
- *
- * Copyright (C) 2015 Martin Willi
- *
- * 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.
- */
-
-#include <linux/linkage.h>
-
-	.text
-	.fpu		neon
-	.align		5
-
-ENTRY(chacha20_block_xor_neon)
-	// r0: Input state matrix, s
-	// r1: 1 data block output, o
-	// r2: 1 data block input, i
-
-	//
-	// This function encrypts one ChaCha20 block by loading the state matrix
-	// in four NEON registers. It performs matrix operation on four words in
-	// parallel, but requireds shuffling to rearrange the words after each
-	// round.
-	//
-
-	// x0..3 = s0..3
-	add		ip, r0, #0x20
-	vld1.32		{q0-q1}, [r0]
-	vld1.32		{q2-q3}, [ip]
-
-	vmov		q8, q0
-	vmov		q9, q1
-	vmov		q10, q2
-	vmov		q11, q3
-
-	mov		r3, #10
-
-.Ldoubleround:
-	// x0 += x1, x3 = rotl32(x3 ^ x0, 16)
-	vadd.i32	q0, q0, q1
-	veor		q3, q3, q0
-	vrev32.16	q3, q3
-
-	// x2 += x3, x1 = rotl32(x1 ^ x2, 12)
-	vadd.i32	q2, q2, q3
-	veor		q4, q1, q2
-	vshl.u32	q1, q4, #12
-	vsri.u32	q1, q4, #20
-
-	// x0 += x1, x3 = rotl32(x3 ^ x0, 8)
-	vadd.i32	q0, q0, q1
-	veor		q4, q3, q0
-	vshl.u32	q3, q4, #8
-	vsri.u32	q3, q4, #24
-
-	// x2 += x3, x1 = rotl32(x1 ^ x2, 7)
-	vadd.i32	q2, q2, q3
-	veor		q4, q1, q2
-	vshl.u32	q1, q4, #7
-	vsri.u32	q1, q4, #25
-
-	// x1 = shuffle32(x1, MASK(0, 3, 2, 1))
-	vext.8		q1, q1, q1, #4
-	// x2 = shuffle32(x2, MASK(1, 0, 3, 2))
-	vext.8		q2, q2, q2, #8
-	// x3 = shuffle32(x3, MASK(2, 1, 0, 3))
-	vext.8		q3, q3, q3, #12
-
-	// x0 += x1, x3 = rotl32(x3 ^ x0, 16)
-	vadd.i32	q0, q0, q1
-	veor		q3, q3, q0
-	vrev32.16	q3, q3
-
-	// x2 += x3, x1 = rotl32(x1 ^ x2, 12)
-	vadd.i32	q2, q2, q3
-	veor		q4, q1, q2
-	vshl.u32	q1, q4, #12
-	vsri.u32	q1, q4, #20
-
-	// x0 += x1, x3 = rotl32(x3 ^ x0, 8)
-	vadd.i32	q0, q0, q1
-	veor		q4, q3, q0
-	vshl.u32	q3, q4, #8
-	vsri.u32	q3, q4, #24
-
-	// x2 += x3, x1 = rotl32(x1 ^ x2, 7)
-	vadd.i32	q2, q2, q3
-	veor		q4, q1, q2
-	vshl.u32	q1, q4, #7
-	vsri.u32	q1, q4, #25
-
-	// x1 = shuffle32(x1, MASK(2, 1, 0, 3))
-	vext.8		q1, q1, q1, #12
-	// x2 = shuffle32(x2, MASK(1, 0, 3, 2))
-	vext.8		q2, q2, q2, #8
-	// x3 = shuffle32(x3, MASK(0, 3, 2, 1))
-	vext.8		q3, q3, q3, #4
-
-	subs		r3, r3, #1
-	bne		.Ldoubleround
-
-	add		ip, r2, #0x20
-	vld1.8		{q4-q5}, [r2]
-	vld1.8		{q6-q7}, [ip]
-
-	// o0 = i0 ^ (x0 + s0)
-	vadd.i32	q0, q0, q8
-	veor		q0, q0, q4
-
-	// o1 = i1 ^ (x1 + s1)
-	vadd.i32	q1, q1, q9
-	veor		q1, q1, q5
-
-	// o2 = i2 ^ (x2 + s2)
-	vadd.i32	q2, q2, q10
-	veor		q2, q2, q6
-
-	// o3 = i3 ^ (x3 + s3)
-	vadd.i32	q3, q3, q11
-	veor		q3, q3, q7
-
-	add		ip, r1, #0x20
-	vst1.8		{q0-q1}, [r1]
-	vst1.8		{q2-q3}, [ip]
-
-	bx		lr
-ENDPROC(chacha20_block_xor_neon)
-
-	.align		5
-ENTRY(chacha20_4block_xor_neon)
-	push		{r4-r6, lr}
-	mov		ip, sp			// preserve the stack pointer
-	sub		r3, sp, #0x20		// allocate a 32 byte buffer
-	bic		r3, r3, #0x1f		// aligned to 32 bytes
-	mov		sp, r3
-
-	// r0: Input state matrix, s
-	// r1: 4 data blocks output, o
-	// r2: 4 data blocks input, i
-
-	//
-	// This function encrypts four consecutive ChaCha20 blocks by loading
-	// the state matrix in NEON registers four times. The algorithm performs
-	// each operation on the corresponding word of each state matrix, hence
-	// requires no word shuffling. For final XORing step we transpose the
-	// matrix by interleaving 32- and then 64-bit words, which allows us to
-	// do XOR in NEON registers.
-	//
-
-	// x0..15[0-3] = s0..3[0..3]
-	add		r3, r0, #0x20
-	vld1.32		{q0-q1}, [r0]
-	vld1.32		{q2-q3}, [r3]
-
-	adr		r3, CTRINC
-	vdup.32		q15, d7[1]
-	vdup.32		q14, d7[0]
-	vld1.32		{q11}, [r3, :128]
-	vdup.32		q13, d6[1]
-	vdup.32		q12, d6[0]
-	vadd.i32	q12, q12, q11		// x12 += counter values 0-3
-	vdup.32		q11, d5[1]
-	vdup.32		q10, d5[0]
-	vdup.32		q9, d4[1]
-	vdup.32		q8, d4[0]
-	vdup.32		q7, d3[1]
-	vdup.32		q6, d3[0]
-	vdup.32		q5, d2[1]
-	vdup.32		q4, d2[0]
-	vdup.32		q3, d1[1]
-	vdup.32		q2, d1[0]
-	vdup.32		q1, d0[1]
-	vdup.32		q0, d0[0]
-
-	mov		r3, #10
-
-.Ldoubleround4:
-	// x0 += x4, x12 = rotl32(x12 ^ x0, 16)
-	// x1 += x5, x13 = rotl32(x13 ^ x1, 16)
-	// x2 += x6, x14 = rotl32(x14 ^ x2, 16)
-	// x3 += x7, x15 = rotl32(x15 ^ x3, 16)
-	vadd.i32	q0, q0, q4
-	vadd.i32	q1, q1, q5
-	vadd.i32	q2, q2, q6
-	vadd.i32	q3, q3, q7
-
-	veor		q12, q12, q0
-	veor		q13, q13, q1
-	veor		q14, q14, q2
-	veor		q15, q15, q3
-
-	vrev32.16	q12, q12
-	vrev32.16	q13, q13
-	vrev32.16	q14, q14
-	vrev32.16	q15, q15
-
-	// x8 += x12, x4 = rotl32(x4 ^ x8, 12)
-	// x9 += x13, x5 = rotl32(x5 ^ x9, 12)
-	// x10 += x14, x6 = rotl32(x6 ^ x10, 12)
-	// x11 += x15, x7 = rotl32(x7 ^ x11, 12)
-	vadd.i32	q8, q8, q12
-	vadd.i32	q9, q9, q13
-	vadd.i32	q10, q10, q14
-	vadd.i32	q11, q11, q15
-
-	vst1.32		{q8-q9}, [sp, :256]
-
-	veor		q8, q4, q8
-	veor		q9, q5, q9
-	vshl.u32	q4, q8, #12
-	vshl.u32	q5, q9, #12
-	vsri.u32	q4, q8, #20
-	vsri.u32	q5, q9, #20
-
-	veor		q8, q6, q10
-	veor		q9, q7, q11
-	vshl.u32	q6, q8, #12
-	vshl.u32	q7, q9, #12
-	vsri.u32	q6, q8, #20
-	vsri.u32	q7, q9, #20
-
-	// x0 += x4, x12 = rotl32(x12 ^ x0, 8)
-	// x1 += x5, x13 = rotl32(x13 ^ x1, 8)
-	// x2 += x6, x14 = rotl32(x14 ^ x2, 8)
-	// x3 += x7, x15 = rotl32(x15 ^ x3, 8)
-	vadd.i32	q0, q0, q4
-	vadd.i32	q1, q1, q5
-	vadd.i32	q2, q2, q6
-	vadd.i32	q3, q3, q7
-
-	veor		q8, q12, q0
-	veor		q9, q13, q1
-	vshl.u32	q12, q8, #8
-	vshl.u32	q13, q9, #8
-	vsri.u32	q12, q8, #24
-	vsri.u32	q13, q9, #24
-
-	veor		q8, q14, q2
-	veor		q9, q15, q3
-	vshl.u32	q14, q8, #8
-	vshl.u32	q15, q9, #8
-	vsri.u32	q14, q8, #24
-	vsri.u32	q15, q9, #24
-
-	vld1.32		{q8-q9}, [sp, :256]
-
-	// x8 += x12, x4 = rotl32(x4 ^ x8, 7)
-	// x9 += x13, x5 = rotl32(x5 ^ x9, 7)
-	// x10 += x14, x6 = rotl32(x6 ^ x10, 7)
-	// x11 += x15, x7 = rotl32(x7 ^ x11, 7)
-	vadd.i32	q8, q8, q12
-	vadd.i32	q9, q9, q13
-	vadd.i32	q10, q10, q14
-	vadd.i32	q11, q11, q15
-
-	vst1.32		{q8-q9}, [sp, :256]
-
-	veor		q8, q4, q8
-	veor		q9, q5, q9
-	vshl.u32	q4, q8, #7
-	vshl.u32	q5, q9, #7
-	vsri.u32	q4, q8, #25
-	vsri.u32	q5, q9, #25
-
-	veor		q8, q6, q10
-	veor		q9, q7, q11
-	vshl.u32	q6, q8, #7
-	vshl.u32	q7, q9, #7
-	vsri.u32	q6, q8, #25
-	vsri.u32	q7, q9, #25
-
-	vld1.32		{q8-q9}, [sp, :256]
-
-	// x0 += x5, x15 = rotl32(x15 ^ x0, 16)
-	// x1 += x6, x12 = rotl32(x12 ^ x1, 16)
-	// x2 += x7, x13 = rotl32(x13 ^ x2, 16)
-	// x3 += x4, x14 = rotl32(x14 ^ x3, 16)
-	vadd.i32	q0, q0, q5
-	vadd.i32	q1, q1, q6
-	vadd.i32	q2, q2, q7
-	vadd.i32	q3, q3, q4
-
-	veor		q15, q15, q0
-	veor		q12, q12, q1
-	veor		q13, q13, q2
-	veor		q14, q14, q3
-
-	vrev32.16	q15, q15
-	vrev32.16	q12, q12
-	vrev32.16	q13, q13
-	vrev32.16	q14, q14
-
-	// x10 += x15, x5 = rotl32(x5 ^ x10, 12)
-	// x11 += x12, x6 = rotl32(x6 ^ x11, 12)
-	// x8 += x13, x7 = rotl32(x7 ^ x8, 12)
-	// x9 += x14, x4 = rotl32(x4 ^ x9, 12)
-	vadd.i32	q10, q10, q15
-	vadd.i32	q11, q11, q12
-	vadd.i32	q8, q8, q13
-	vadd.i32	q9, q9, q14
-
-	vst1.32		{q8-q9}, [sp, :256]
-
-	veor		q8, q7, q8
-	veor		q9, q4, q9
-	vshl.u32	q7, q8, #12
-	vshl.u32	q4, q9, #12
-	vsri.u32	q7, q8, #20
-	vsri.u32	q4, q9, #20
-
-	veor		q8, q5, q10
-	veor		q9, q6, q11
-	vshl.u32	q5, q8, #12
-	vshl.u32	q6, q9, #12
-	vsri.u32	q5, q8, #20
-	vsri.u32	q6, q9, #20
-
-	// x0 += x5, x15 = rotl32(x15 ^ x0, 8)
-	// x1 += x6, x12 = rotl32(x12 ^ x1, 8)
-	// x2 += x7, x13 = rotl32(x13 ^ x2, 8)
-	// x3 += x4, x14 = rotl32(x14 ^ x3, 8)
-	vadd.i32	q0, q0, q5
-	vadd.i32	q1, q1, q6
-	vadd.i32	q2, q2, q7
-	vadd.i32	q3, q3, q4
-
-	veor		q8, q15, q0
-	veor		q9, q12, q1
-	vshl.u32	q15, q8, #8
-	vshl.u32	q12, q9, #8
-	vsri.u32	q15, q8, #24
-	vsri.u32	q12, q9, #24
-
-	veor		q8, q13, q2
-	veor		q9, q14, q3
-	vshl.u32	q13, q8, #8
-	vshl.u32	q14, q9, #8
-	vsri.u32	q13, q8, #24
-	vsri.u32	q14, q9, #24
-
-	vld1.32		{q8-q9}, [sp, :256]
-
-	// x10 += x15, x5 = rotl32(x5 ^ x10, 7)
-	// x11 += x12, x6 = rotl32(x6 ^ x11, 7)
-	// x8 += x13, x7 = rotl32(x7 ^ x8, 7)
-	// x9 += x14, x4 = rotl32(x4 ^ x9, 7)
-	vadd.i32	q10, q10, q15
-	vadd.i32	q11, q11, q12
-	vadd.i32	q8, q8, q13
-	vadd.i32	q9, q9, q14
-
-	vst1.32		{q8-q9}, [sp, :256]
-
-	veor		q8, q7, q8
-	veor		q9, q4, q9
-	vshl.u32	q7, q8, #7
-	vshl.u32	q4, q9, #7
-	vsri.u32	q7, q8, #25
-	vsri.u32	q4, q9, #25
-
-	veor		q8, q5, q10
-	veor		q9, q6, q11
-	vshl.u32	q5, q8, #7
-	vshl.u32	q6, q9, #7
-	vsri.u32	q5, q8, #25
-	vsri.u32	q6, q9, #25
-
-	subs		r3, r3, #1
-	beq		0f
-
-	vld1.32		{q8-q9}, [sp, :256]
-	b		.Ldoubleround4
-
-	// x0[0-3] += s0[0]
-	// x1[0-3] += s0[1]
-	// x2[0-3] += s0[2]
-	// x3[0-3] += s0[3]
-0:	ldmia		r0!, {r3-r6}
-	vdup.32		q8, r3
-	vdup.32		q9, r4
-	vadd.i32	q0, q0, q8
-	vadd.i32	q1, q1, q9
-	vdup.32		q8, r5
-	vdup.32		q9, r6
-	vadd.i32	q2, q2, q8
-	vadd.i32	q3, q3, q9
-
-	// x4[0-3] += s1[0]
-	// x5[0-3] += s1[1]
-	// x6[0-3] += s1[2]
-	// x7[0-3] += s1[3]
-	ldmia		r0!, {r3-r6}
-	vdup.32		q8, r3
-	vdup.32		q9, r4
-	vadd.i32	q4, q4, q8
-	vadd.i32	q5, q5, q9
-	vdup.32		q8, r5
-	vdup.32		q9, r6
-	vadd.i32	q6, q6, q8
-	vadd.i32	q7, q7, q9
-
-	// interleave 32-bit words in state n, n+1
-	vzip.32		q0, q1
-	vzip.32		q2, q3
-	vzip.32		q4, q5
-	vzip.32		q6, q7
-
-	// interleave 64-bit words in state n, n+2
-	vswp		d1, d4
-	vswp		d3, d6
-	vswp		d9, d12
-	vswp		d11, d14
-
-	// xor with corresponding input, write to output
-	vld1.8		{q8-q9}, [r2]!
-	veor		q8, q8, q0
-	veor		q9, q9, q4
-	vst1.8		{q8-q9}, [r1]!
-
-	vld1.32		{q8-q9}, [sp, :256]
-
-	// x8[0-3] += s2[0]
-	// x9[0-3] += s2[1]
-	// x10[0-3] += s2[2]
-	// x11[0-3] += s2[3]
-	ldmia		r0!, {r3-r6}
-	vdup.32		q0, r3
-	vdup.32		q4, r4
-	vadd.i32	q8, q8, q0
-	vadd.i32	q9, q9, q4
-	vdup.32		q0, r5
-	vdup.32		q4, r6
-	vadd.i32	q10, q10, q0
-	vadd.i32	q11, q11, q4
-
-	// x12[0-3] += s3[0]
-	// x13[0-3] += s3[1]
-	// x14[0-3] += s3[2]
-	// x15[0-3] += s3[3]
-	ldmia		r0!, {r3-r6}
-	vdup.32		q0, r3
-	vdup.32		q4, r4
-	adr		r3, CTRINC
-	vadd.i32	q12, q12, q0
-	vld1.32		{q0}, [r3, :128]
-	vadd.i32	q13, q13, q4
-	vadd.i32	q12, q12, q0		// x12 += counter values 0-3
-
-	vdup.32		q0, r5
-	vdup.32		q4, r6
-	vadd.i32	q14, q14, q0
-	vadd.i32	q15, q15, q4
-
-	// interleave 32-bit words in state n, n+1
-	vzip.32		q8, q9
-	vzip.32		q10, q11
-	vzip.32		q12, q13
-	vzip.32		q14, q15
-
-	// interleave 64-bit words in state n, n+2
-	vswp		d17, d20
-	vswp		d19, d22
-	vswp		d25, d28
-	vswp		d27, d30
-
-	vmov		q4, q1
-
-	vld1.8		{q0-q1}, [r2]!
-	veor		q0, q0, q8
-	veor		q1, q1, q12
-	vst1.8		{q0-q1}, [r1]!
-
-	vld1.8		{q0-q1}, [r2]!
-	veor		q0, q0, q2
-	veor		q1, q1, q6
-	vst1.8		{q0-q1}, [r1]!
-
-	vld1.8		{q0-q1}, [r2]!
-	veor		q0, q0, q10
-	veor		q1, q1, q14
-	vst1.8		{q0-q1}, [r1]!
-
-	vld1.8		{q0-q1}, [r2]!
-	veor		q0, q0, q4
-	veor		q1, q1, q5
-	vst1.8		{q0-q1}, [r1]!
-
-	vld1.8		{q0-q1}, [r2]!
-	veor		q0, q0, q9
-	veor		q1, q1, q13
-	vst1.8		{q0-q1}, [r1]!
-
-	vld1.8		{q0-q1}, [r2]!
-	veor		q0, q0, q3
-	veor		q1, q1, q7
-	vst1.8		{q0-q1}, [r1]!
-
-	vld1.8		{q0-q1}, [r2]
-	veor		q0, q0, q11
-	veor		q1, q1, q15
-	vst1.8		{q0-q1}, [r1]
-
-	mov		sp, ip
-	pop		{r4-r6, pc}
-ENDPROC(chacha20_4block_xor_neon)
-
-	.align		4
-CTRINC:	.word		0, 1, 2, 3
diff --git a/arch/arm/crypto/chacha20-neon-glue.c b/arch/arm/crypto/chacha20-neon-glue.c
deleted file mode 100644
index 59a7be0..0000000
--- a/arch/arm/crypto/chacha20-neon-glue.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * ChaCha20 256-bit cipher algorithm, RFC7539, ARM NEON functions
- *
- * Copyright (C) 2016 Linaro, Ltd. <ard.biesheuvel@linaro.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Based on:
- * ChaCha20 256-bit cipher algorithm, RFC7539, SIMD glue code
- *
- * Copyright (C) 2015 Martin Willi
- *
- * 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.
- */
-
-#include <crypto/algapi.h>
-#include <crypto/chacha20.h>
-#include <crypto/internal/skcipher.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-
-#include <asm/hwcap.h>
-#include <asm/neon.h>
-#include <asm/simd.h>
-
-asmlinkage void chacha20_block_xor_neon(u32 *state, u8 *dst, const u8 *src);
-asmlinkage void chacha20_4block_xor_neon(u32 *state, u8 *dst, const u8 *src);
-
-static void chacha20_doneon(u32 *state, u8 *dst, const u8 *src,
-			    unsigned int bytes)
-{
-	u8 buf[CHACHA20_BLOCK_SIZE];
-
-	while (bytes >= CHACHA20_BLOCK_SIZE * 4) {
-		chacha20_4block_xor_neon(state, dst, src);
-		bytes -= CHACHA20_BLOCK_SIZE * 4;
-		src += CHACHA20_BLOCK_SIZE * 4;
-		dst += CHACHA20_BLOCK_SIZE * 4;
-		state[12] += 4;
-	}
-	while (bytes >= CHACHA20_BLOCK_SIZE) {
-		chacha20_block_xor_neon(state, dst, src);
-		bytes -= CHACHA20_BLOCK_SIZE;
-		src += CHACHA20_BLOCK_SIZE;
-		dst += CHACHA20_BLOCK_SIZE;
-		state[12]++;
-	}
-	if (bytes) {
-		memcpy(buf, src, bytes);
-		chacha20_block_xor_neon(state, buf, buf);
-		memcpy(dst, buf, bytes);
-	}
-}
-
-static int chacha20_neon(struct skcipher_request *req)
-{
-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-	struct chacha20_ctx *ctx = crypto_skcipher_ctx(tfm);
-	struct skcipher_walk walk;
-	u32 state[16];
-	int err;
-
-	if (req->cryptlen <= CHACHA20_BLOCK_SIZE || !may_use_simd())
-		return crypto_chacha20_crypt(req);
-
-	err = skcipher_walk_virt(&walk, req, true);
-
-	crypto_chacha20_init(state, ctx, walk.iv);
-
-	kernel_neon_begin();
-	while (walk.nbytes > 0) {
-		unsigned int nbytes = walk.nbytes;
-
-		if (nbytes < walk.total)
-			nbytes = round_down(nbytes, walk.stride);
-
-		chacha20_doneon(state, walk.dst.virt.addr, walk.src.virt.addr,
-				nbytes);
-		err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
-	}
-	kernel_neon_end();
-
-	return err;
-}
-
-static struct skcipher_alg alg = {
-	.base.cra_name		= "chacha20",
-	.base.cra_driver_name	= "chacha20-neon",
-	.base.cra_priority	= 300,
-	.base.cra_blocksize	= 1,
-	.base.cra_ctxsize	= sizeof(struct chacha20_ctx),
-	.base.cra_module	= THIS_MODULE,
-
-	.min_keysize		= CHACHA20_KEY_SIZE,
-	.max_keysize		= CHACHA20_KEY_SIZE,
-	.ivsize			= CHACHA20_IV_SIZE,
-	.chunksize		= CHACHA20_BLOCK_SIZE,
-	.walksize		= 4 * CHACHA20_BLOCK_SIZE,
-	.setkey			= crypto_chacha20_setkey,
-	.encrypt		= chacha20_neon,
-	.decrypt		= chacha20_neon,
-};
-
-static int __init chacha20_simd_mod_init(void)
-{
-	if (!(elf_hwcap & HWCAP_NEON))
-		return -ENODEV;
-
-	return crypto_register_skcipher(&alg);
-}
-
-static void __exit chacha20_simd_mod_fini(void)
-{
-	crypto_unregister_skcipher(&alg);
-}
-
-module_init(chacha20_simd_mod_init);
-module_exit(chacha20_simd_mod_fini);
-
-MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
-MODULE_LICENSE("GPL v2");
-MODULE_ALIAS_CRYPTO("chacha20");
diff --git a/arch/arm/crypto/nh-neon-core.S b/arch/arm/crypto/nh-neon-core.S
new file mode 100644
index 0000000..434d80a
--- /dev/null
+++ b/arch/arm/crypto/nh-neon-core.S
@@ -0,0 +1,116 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * NH - ε-almost-universal hash function, NEON accelerated version
+ *
+ * Copyright 2018 Google LLC
+ *
+ * Author: Eric Biggers <ebiggers@google.com>
+ */
+
+#include <linux/linkage.h>
+
+	.text
+	.fpu		neon
+
+	KEY		.req	r0
+	MESSAGE		.req	r1
+	MESSAGE_LEN	.req	r2
+	HASH		.req	r3
+
+	PASS0_SUMS	.req	q0
+	PASS0_SUM_A	.req	d0
+	PASS0_SUM_B	.req	d1
+	PASS1_SUMS	.req	q1
+	PASS1_SUM_A	.req	d2
+	PASS1_SUM_B	.req	d3
+	PASS2_SUMS	.req	q2
+	PASS2_SUM_A	.req	d4
+	PASS2_SUM_B	.req	d5
+	PASS3_SUMS	.req	q3
+	PASS3_SUM_A	.req	d6
+	PASS3_SUM_B	.req	d7
+	K0		.req	q4
+	K1		.req	q5
+	K2		.req	q6
+	K3		.req	q7
+	T0		.req	q8
+	T0_L		.req	d16
+	T0_H		.req	d17
+	T1		.req	q9
+	T1_L		.req	d18
+	T1_H		.req	d19
+	T2		.req	q10
+	T2_L		.req	d20
+	T2_H		.req	d21
+	T3		.req	q11
+	T3_L		.req	d22
+	T3_H		.req	d23
+
+.macro _nh_stride	k0, k1, k2, k3
+
+	// Load next message stride
+	vld1.8		{T3}, [MESSAGE]!
+
+	// Load next key stride
+	vld1.32		{\k3}, [KEY]!
+
+	// Add message words to key words
+	vadd.u32	T0, T3, \k0
+	vadd.u32	T1, T3, \k1
+	vadd.u32	T2, T3, \k2
+	vadd.u32	T3, T3, \k3
+
+	// Multiply 32x32 => 64 and accumulate
+	vmlal.u32	PASS0_SUMS, T0_L, T0_H
+	vmlal.u32	PASS1_SUMS, T1_L, T1_H
+	vmlal.u32	PASS2_SUMS, T2_L, T2_H
+	vmlal.u32	PASS3_SUMS, T3_L, T3_H
+.endm
+
+/*
+ * void nh_neon(const u32 *key, const u8 *message, size_t message_len,
+ *		u8 hash[NH_HASH_BYTES])
+ *
+ * It's guaranteed that message_len % 16 == 0.
+ */
+ENTRY(nh_neon)
+
+	vld1.32		{K0,K1}, [KEY]!
+	  vmov.u64	PASS0_SUMS, #0
+	  vmov.u64	PASS1_SUMS, #0
+	vld1.32		{K2}, [KEY]!
+	  vmov.u64	PASS2_SUMS, #0
+	  vmov.u64	PASS3_SUMS, #0
+
+	subs		MESSAGE_LEN, MESSAGE_LEN, #64
+	blt		.Lloop4_done
+.Lloop4:
+	_nh_stride	K0, K1, K2, K3
+	_nh_stride	K1, K2, K3, K0
+	_nh_stride	K2, K3, K0, K1
+	_nh_stride	K3, K0, K1, K2
+	subs		MESSAGE_LEN, MESSAGE_LEN, #64
+	bge		.Lloop4
+
+.Lloop4_done:
+	ands		MESSAGE_LEN, MESSAGE_LEN, #63
+	beq		.Ldone
+	_nh_stride	K0, K1, K2, K3
+
+	subs		MESSAGE_LEN, MESSAGE_LEN, #16
+	beq		.Ldone
+	_nh_stride	K1, K2, K3, K0
+
+	subs		MESSAGE_LEN, MESSAGE_LEN, #16
+	beq		.Ldone
+	_nh_stride	K2, K3, K0, K1
+
+.Ldone:
+	// Sum the accumulators for each pass, then store the sums to 'hash'
+	vadd.u64	T0_L, PASS0_SUM_A, PASS0_SUM_B
+	vadd.u64	T0_H, PASS1_SUM_A, PASS1_SUM_B
+	vadd.u64	T1_L, PASS2_SUM_A, PASS2_SUM_B
+	vadd.u64	T1_H, PASS3_SUM_A, PASS3_SUM_B
+	vst1.8		{T0-T1}, [HASH]
+	bx		lr
+ENDPROC(nh_neon)
diff --git a/arch/arm/crypto/nhpoly1305-neon-glue.c b/arch/arm/crypto/nhpoly1305-neon-glue.c
new file mode 100644
index 0000000..49aae87
--- /dev/null
+++ b/arch/arm/crypto/nhpoly1305-neon-glue.c
@@ -0,0 +1,77 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * NHPoly1305 - ε-almost-∆-universal hash function for Adiantum
+ * (NEON accelerated version)
+ *
+ * Copyright 2018 Google LLC
+ */
+
+#include <asm/neon.h>
+#include <asm/simd.h>
+#include <crypto/internal/hash.h>
+#include <crypto/nhpoly1305.h>
+#include <linux/module.h>
+
+asmlinkage void nh_neon(const u32 *key, const u8 *message, size_t message_len,
+			u8 hash[NH_HASH_BYTES]);
+
+/* wrapper to avoid indirect call to assembly, which doesn't work with CFI */
+static void _nh_neon(const u32 *key, const u8 *message, size_t message_len,
+		     __le64 hash[NH_NUM_PASSES])
+{
+	nh_neon(key, message, message_len, (u8 *)hash);
+}
+
+static int nhpoly1305_neon_update(struct shash_desc *desc,
+				  const u8 *src, unsigned int srclen)
+{
+	if (srclen < 64 || !may_use_simd())
+		return crypto_nhpoly1305_update(desc, src, srclen);
+
+	do {
+		unsigned int n = min_t(unsigned int, srclen, PAGE_SIZE);
+
+		kernel_neon_begin();
+		crypto_nhpoly1305_update_helper(desc, src, n, _nh_neon);
+		kernel_neon_end();
+		src += n;
+		srclen -= n;
+	} while (srclen);
+	return 0;
+}
+
+static struct shash_alg nhpoly1305_alg = {
+	.base.cra_name		= "nhpoly1305",
+	.base.cra_driver_name	= "nhpoly1305-neon",
+	.base.cra_priority	= 200,
+	.base.cra_ctxsize	= sizeof(struct nhpoly1305_key),
+	.base.cra_module	= THIS_MODULE,
+	.digestsize		= POLY1305_DIGEST_SIZE,
+	.init			= crypto_nhpoly1305_init,
+	.update			= nhpoly1305_neon_update,
+	.final			= crypto_nhpoly1305_final,
+	.setkey			= crypto_nhpoly1305_setkey,
+	.descsize		= sizeof(struct nhpoly1305_state),
+};
+
+static int __init nhpoly1305_mod_init(void)
+{
+	if (!(elf_hwcap & HWCAP_NEON))
+		return -ENODEV;
+
+	return crypto_register_shash(&nhpoly1305_alg);
+}
+
+static void __exit nhpoly1305_mod_exit(void)
+{
+	crypto_unregister_shash(&nhpoly1305_alg);
+}
+
+module_init(nhpoly1305_mod_init);
+module_exit(nhpoly1305_mod_exit);
+
+MODULE_DESCRIPTION("NHPoly1305 ε-almost-∆-universal hash function (NEON-accelerated)");
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Eric Biggers <ebiggers@google.com>");
+MODULE_ALIAS_CRYPTO("nhpoly1305");
+MODULE_ALIAS_CRYPTO("nhpoly1305-neon");
diff --git a/arch/arm/include/asm/topology.h b/arch/arm/include/asm/topology.h
index 5d88d2f..201dc20 100644
--- a/arch/arm/include/asm/topology.h
+++ b/arch/arm/include/asm/topology.h
@@ -30,9 +30,15 @@
 /* Replace task scheduler's default frequency-invariant accounting */
 #define arch_scale_freq_capacity topology_get_freq_scale
 
+/* Replace task scheduler's default max-frequency-invariant accounting */
+#define arch_scale_max_freq_capacity topology_get_max_freq_scale
+
 /* Replace task scheduler's default cpu-invariant accounting */
 #define arch_scale_cpu_capacity topology_get_cpu_scale
 
+/* Enable topology flag updates */
+#define arch_update_cpu_topology topology_update_cpu_topology
+
 #else
 
 static inline void init_cpu_topology(void) { }
diff --git a/arch/arm/kvm/Kconfig b/arch/arm/kvm/Kconfig
index e2bd35b..c09fcc0 100644
--- a/arch/arm/kvm/Kconfig
+++ b/arch/arm/kvm/Kconfig
@@ -22,7 +22,6 @@
 	bool "Kernel-based Virtual Machine (KVM) support"
 	depends on MMU && OF
 	select PREEMPT_NOTIFIERS
-	select ANON_INODES
 	select ARM_GIC
 	select ARM_GIC_V3
 	select ARM_GIC_V3_ITS
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
index 0bff017..93fcf1a 100644
--- a/arch/arm/lib/Makefile
+++ b/arch/arm/lib/Makefile
@@ -5,7 +5,7 @@
 # Copyright (C) 1995-2000 Russell King
 #
 
-lib-y		:= backtrace.o changebit.o csumipv6.o csumpartial.o   \
+lib-y		:= changebit.o csumipv6.o csumpartial.o               \
 		   csumpartialcopy.o csumpartialcopyuser.o clearbit.o \
 		   delay.o delay-loop.o findbit.o memchr.o memcpy.o   \
 		   memmove.o memset.o setbit.o                        \
@@ -19,6 +19,12 @@
 mmu-y		:= clear_user.o copy_page.o getuser.o putuser.o       \
 		   copy_from_user.o copy_to_user.o
 
+ifdef CONFIG_CC_IS_CLANG
+  lib-y	+= backtrace-clang.o
+else
+  lib-y	+= backtrace.o
+endif
+
 # using lib_ here won't override already available weak symbols
 obj-$(CONFIG_UACCESS_WITH_MEMCPY) += uaccess_with_memcpy.o
 
diff --git a/arch/arm/lib/backtrace-clang.S b/arch/arm/lib/backtrace-clang.S
new file mode 100644
index 0000000..2ff3751
--- /dev/null
+++ b/arch/arm/lib/backtrace-clang.S
@@ -0,0 +1,217 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ *  linux/arch/arm/lib/backtrace-clang.S
+ *
+ *  Copyright (C) 2019 Nathan Huckleberry
+ *
+ */
+#include <linux/kern_levels.h>
+#include <linux/linkage.h>
+#include <asm/assembler.h>
+		.text
+
+/* fp is 0 or stack frame */
+
+#define frame	r4
+#define sv_fp	r5
+#define sv_pc	r6
+#define mask	r7
+#define sv_lr	r8
+
+ENTRY(c_backtrace)
+
+#if !defined(CONFIG_FRAME_POINTER) || !defined(CONFIG_PRINTK)
+		ret	lr
+ENDPROC(c_backtrace)
+#else
+
+
+/*
+ * Clang does not store pc or sp in function prologues so we don't know exactly
+ * where the function starts.
+ *
+ * We can treat the current frame's lr as the saved pc and the preceding
+ * frame's lr as the current frame's lr, but we can't trace the most recent
+ * call.  Inserting a false stack frame allows us to reference the function
+ * called last in the stacktrace.
+ *
+ * If the call instruction was a bl we can look at the callers branch
+ * instruction to calculate the saved pc.  We can recover the pc in most cases,
+ * but in cases such as calling function pointers we cannot. In this case,
+ * default to using the lr. This will be some address in the function, but will
+ * not be the function start.
+ *
+ * Unfortunately due to the stack frame layout we can't dump r0 - r3, but these
+ * are less frequently saved.
+ *
+ * Stack frame layout:
+ * 		<larger addresses>
+ * 		saved lr
+ * 	frame=> saved fp
+ * 		optionally saved caller registers (r4 - r10)
+ * 		optionally saved arguments (r0 - r3)
+ * 		<top of stack frame>
+ * 		<smaller addresses>
+ *
+ * Functions start with the following code sequence:
+ * corrected pc =>  stmfd sp!, {..., fp, lr}
+ *		add fp, sp, #x
+ *		stmfd sp!, {r0 - r3} (optional)
+ *
+ *
+ *
+ *
+ *
+ *
+ * The diagram below shows an example stack setup for dump_stack.
+ *
+ * The frame for c_backtrace has pointers to the code of dump_stack. This is
+ * why the frame of c_backtrace is used to for the pc calculation of
+ * dump_stack. This is why we must move back a frame to print dump_stack.
+ *
+ * The stored locals for dump_stack are in dump_stack's frame. This means that
+ * to fully print dump_stack's frame we need both the frame for dump_stack (for
+ * locals) and the frame that was called by dump_stack (for pc).
+ *
+ * To print locals we must know where the function start is. If we read the
+ * function prologue opcodes we can determine which variables are stored in the
+ * stack frame.
+ *
+ * To find the function start of dump_stack we can look at the stored LR of
+ * show_stack. It points at the instruction directly after the bl dump_stack.
+ * We can then read the offset from the bl opcode to determine where the branch
+ * takes us.  The address calculated must be the start of dump_stack.
+ *
+ * c_backtrace frame           dump_stack:
+ * {[LR]    }  ============|   ...
+ * {[FP]    }  =======|    |   bl c_backtrace
+ *                    |    |=> ...
+ * {[R4-R10]}         |
+ * {[R0-R3] }         |        show_stack:
+ * dump_stack frame   |        ...
+ * {[LR]    } =============|   bl dump_stack
+ * {[FP]    } <=======|    |=> ...
+ * {[R4-R10]}
+ * {[R0-R3] }
+ */
+
+		stmfd	sp!, {r4 - r9, fp, lr}	@ Save an extra register
+						@ to ensure 8 byte alignment
+		movs	frame, r0		@ if frame pointer is zero
+		beq	no_frame		@ we have no stack frames
+		tst	r1, #0x10		@ 26 or 32-bit mode?
+		moveq	mask, #0xfc000003
+		movne	mask, #0		@ mask for 32-bit
+
+/*
+ * Switches the current frame to be the frame for dump_stack.
+ */
+		add	frame, sp, #24		@ switch to false frame
+for_each_frame:	tst	frame, mask		@ Check for address exceptions
+		bne	no_frame
+
+/*
+ * sv_fp is the stack frame with the locals for the current considered
+ * function.
+ *
+ * sv_pc is the saved lr frame the frame above. This is a pointer to a code
+ * address within the current considered function, but it is not the function
+ * start. This value gets updated to be the function start later if it is
+ * possible.
+ */
+1001:		ldr	sv_pc, [frame, #4]	@ get saved 'pc'
+1002:		ldr	sv_fp, [frame, #0]	@ get saved fp
+
+		teq	sv_fp, mask		@ make sure next frame exists
+		beq	no_frame
+
+/*
+ * sv_lr is the lr from the function that called the current function. This is
+ * a pointer to a code address in the current function's caller.  sv_lr-4 is
+ * the instruction used to call the current function.
+ *
+ * This sv_lr can be used to calculate the function start if the function was
+ * called using a bl instruction. If the function start can be recovered sv_pc
+ * is overwritten with the function start.
+ *
+ * If the current function was called using a function pointer we cannot
+ * recover the function start and instead continue with sv_pc as an arbitrary
+ * value within the current function. If this is the case we cannot print
+ * registers for the current function, but the stacktrace is still printed
+ * properly.
+ */
+1003:		ldr	sv_lr, [sv_fp, #4]	@ get saved lr from next frame
+
+		ldr	r0, [sv_lr, #-4]	@ get call instruction
+		ldr	r3, .Lopcode+4
+		and	r2, r3, r0		@ is this a bl call
+		teq	r2, r3
+		bne	finished_setup		@ give up if it's not
+		and	r0, #0xffffff		@ get call offset 24-bit int
+		lsl	r0, r0, #8		@ sign extend offset
+		asr	r0, r0, #8
+		ldr	sv_pc, [sv_fp, #4]	@ get lr address
+		add	sv_pc, sv_pc, #-4	@ get call instruction address
+		add	sv_pc, sv_pc, #8	@ take care of prefetch
+		add	sv_pc, sv_pc, r0, lsl #2@ find function start
+
+finished_setup:
+
+		bic	sv_pc, sv_pc, mask	@ mask PC/LR for the mode
+
+/*
+ * Print the function (sv_pc) and where it was called from (sv_lr).
+ */
+1004:		mov	r0, sv_pc
+
+		mov	r1, sv_lr
+		mov	r2, frame
+		bic	r1, r1, mask		@ mask PC/LR for the mode
+		bl	dump_backtrace_entry
+
+/*
+ * Test if the function start is a stmfd instruction to determine which
+ * registers were stored in the function prologue.
+ *
+ * If we could not recover the sv_pc because we were called through a function
+ * pointer the comparison will fail and no registers will print. Unwinding will
+ * continue as if there had been no registers stored in this frame.
+ */
+1005:		ldr	r1, [sv_pc, #0]		@ if stmfd sp!, {..., fp, lr}
+		ldr	r3, .Lopcode		@ instruction exists,
+		teq	r3, r1, lsr #11
+		ldr	r0, [frame]		@ locals are stored in
+						@ the preceding frame
+		subeq	r0, r0, #4
+		bleq	dump_backtrace_stm	@ dump saved registers
+
+/*
+ * If we are out of frames or if the next frame is invalid.
+ */
+		teq	sv_fp, #0		@ zero saved fp means
+		beq	no_frame		@ no further frames
+
+		cmp	sv_fp, frame		@ next frame must be
+		mov	frame, sv_fp		@ above the current frame
+		bhi	for_each_frame
+
+1006:		adr	r0, .Lbad
+		mov	r1, frame
+		bl	printk
+no_frame:	ldmfd	sp!, {r4 - r9, fp, pc}
+ENDPROC(c_backtrace)
+		.pushsection __ex_table,"a"
+		.align	3
+		.long	1001b, 1006b
+		.long	1002b, 1006b
+		.long	1003b, 1006b
+		.long	1004b, 1006b
+		.long   1005b, 1006b
+		.popsection
+
+.Lbad:		.asciz	"Backtrace aborted due to bad frame pointer <%p>\n"
+		.align
+.Lopcode:	.word	0xe92d4800 >> 11	@ stmfd sp!, {... fp, lr}
+		.word	0x0b000000		@ bl if these bits are set
+
+#endif
diff --git a/arch/arm/tools/syscall.tbl b/arch/arm/tools/syscall.tbl
index 8edf93b..717426d 100644
--- a/arch/arm/tools/syscall.tbl
+++ b/arch/arm/tools/syscall.tbl
@@ -414,3 +414,5 @@
 397	common	statx			sys_statx
 398	common	rseq			sys_rseq
 399	common	io_pgetevents		sys_io_pgetevents
+424	common  pidfd_send_signal	sys_pidfd_send_signal
+434	common	pidfd_open		sys_pidfd_open
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 51fe21f..105283b 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -57,6 +57,9 @@
 	select ARCH_USE_QUEUED_RWLOCKS
 	select ARCH_USE_QUEUED_SPINLOCKS
 	select ARCH_SUPPORTS_MEMORY_FAILURE
+	select ARCH_SUPPORTS_LTO_CLANG
+	select ARCH_SUPPORTS_THINLTO
+	select ARCH_SUPPORTS_SHADOW_CALL_STACK if CC_HAVE_SHADOW_CALL_STACK
 	select ARCH_SUPPORTS_ATOMIC_RMW
 	select ARCH_SUPPORTS_INT128 if GCC_VERSION >= 50000 || CC_IS_CLANG
 	select ARCH_SUPPORTS_NUMA_BALANCING
@@ -106,10 +109,11 @@
 	select HAVE_ARCH_HUGE_VMAP
 	select HAVE_ARCH_JUMP_LABEL
 	select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48)
+	select HAVE_ARCH_KASAN_SW_TAGS if HAVE_ARCH_KASAN
 	select HAVE_ARCH_KGDB
 	select HAVE_ARCH_MMAP_RND_BITS
 	select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT
-	select HAVE_ARCH_PREL32_RELOCATIONS
+	select HAVE_ARCH_PREL32_RELOCATIONS if !LTO_CLANG
 	select HAVE_ARCH_SECCOMP_FILTER
 	select HAVE_ARCH_STACKLEAK
 	select HAVE_ARCH_THREAD_STRUCT_WHITELIST
@@ -129,7 +133,7 @@
 	select HAVE_EFFICIENT_UNALIGNED_ACCESS
 	select HAVE_FTRACE_MCOUNT_RECORD
 	select HAVE_FUNCTION_TRACER
-	select HAVE_FUNCTION_GRAPH_TRACER
+	select HAVE_FUNCTION_GRAPH_TRACER if !SHADOW_CALL_STACK
 	select HAVE_GCC_PLUGINS
 	select HAVE_GENERIC_DMA_COHERENT
 	select HAVE_HW_BREAKPOINT if PERF_EVENTS
@@ -821,6 +825,11 @@
 config ARCH_HAS_CACHE_LINE_SIZE
 	def_bool y
 
+
+# Supported by clang >= 7.0
+config CC_HAVE_SHADOW_CALL_STACK
+	def_bool $(cc-option, -fsanitize=shadow-call-stack -ffixed-x18)
+
 config SECCOMP
 	bool "Enable seccomp to safely compute untrusted bytecode"
 	---help---
@@ -963,6 +972,15 @@
 
 	  If unsure, say Y.
 
+config ARM64_TAGGED_ADDR_ABI
+	bool "Enable the tagged user addresses syscall ABI"
+	default y
+	help
+	  When this option is enabled, user applications can opt in to a
+	  relaxed ABI via prctl() allowing tagged addresses to be passed
+	  to system calls as pointer arguments. For details, see
+	  Documentation/arm64/tagged-address-abi.rst.
+
 menuconfig ARMV8_DEPRECATED
 	bool "Emulate deprecated/obsolete ARMv8 instructions"
 	depends on COMPAT
@@ -1195,6 +1213,7 @@
 
 config RELOCATABLE
 	bool
+	select ARCH_HAS_RELR
 	help
 	  This builds the kernel as a Position Independent Executable (PIE),
 	  which retains all relocation metadata required to relocate the
@@ -1259,6 +1278,23 @@
 	  entering them here. As a minimum, you should specify the the
 	  root device (e.g. root=/dev/nfs).
 
+choice
+	prompt "Kernel command line type" if CMDLINE != ""
+	default CMDLINE_FROM_BOOTLOADER
+
+config CMDLINE_FROM_BOOTLOADER
+	bool "Use bootloader kernel arguments if available"
+	help
+	  Uses the command-line options passed by the boot loader. If
+	  the boot loader doesn't provide any, the default kernel command
+	  string provided in CMDLINE will be used.
+
+config CMDLINE_EXTEND
+	bool "Extend bootloader kernel arguments"
+	help
+	  The command-line arguments provided by the boot loader will be
+	  appended to the default kernel command string.
+
 config CMDLINE_FORCE
 	bool "Always use the default kernel command string"
 	help
@@ -1266,6 +1302,7 @@
 	  loader passes other arguments to the kernel.
 	  This is useful if you cannot or don't want to change the
 	  command-line options your boot loader passes to the kernel.
+endchoice
 
 config EFI_STUB
 	bool
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index 9a5e281..49c699c 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -57,6 +57,10 @@
 KBUILD_CFLAGS	+= $(call cc-option,-mabi=lp64)
 KBUILD_AFLAGS	+= $(call cc-option,-mabi=lp64)
 
+ifeq ($(CONFIG_SHADOW_CALL_STACK), y)
+KBUILD_CFLAGS	+= -ffixed-x18
+endif
+
 ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
 KBUILD_CPPFLAGS	+= -mbig-endian
 CHECKFLAGS	+= -D__AARCH64EB__
@@ -92,10 +96,19 @@
 TEXT_OFFSET := 0x00080000
 endif
 
+ifeq ($(CONFIG_KASAN_SW_TAGS), y)
+KASAN_SHADOW_SCALE_SHIFT := 4
+else
+KASAN_SHADOW_SCALE_SHIFT := 3
+endif
+
+KBUILD_CFLAGS += -DKASAN_SHADOW_SCALE_SHIFT=$(KASAN_SHADOW_SCALE_SHIFT)
+KBUILD_CPPFLAGS += -DKASAN_SHADOW_SCALE_SHIFT=$(KASAN_SHADOW_SCALE_SHIFT)
+KBUILD_AFLAGS += -DKASAN_SHADOW_SCALE_SHIFT=$(KASAN_SHADOW_SCALE_SHIFT)
+
 # KASAN_SHADOW_OFFSET = VA_START + (1 << (VA_BITS - KASAN_SHADOW_SCALE_SHIFT))
 #				 - (1 << (64 - KASAN_SHADOW_SCALE_SHIFT))
 # in 32-bit arithmetic
-KASAN_SHADOW_SCALE_SHIFT := 3
 KASAN_SHADOW_OFFSET := $(shell printf "0x%08x00000000\n" $$(( \
 	(0xffffffff & (-1 << ($(CONFIG_ARM64_VA_BITS) - 32))) \
 	+ (1 << ($(CONFIG_ARM64_VA_BITS) - 32 - $(KASAN_SHADOW_SCALE_SHIFT))) \
diff --git a/arch/arm64/boot/dts/arm/juno-r2.dts b/arch/arm64/boot/dts/arm/juno-r2.dts
index ab77adb..66f0ec7 100644
--- a/arch/arm64/boot/dts/arm/juno-r2.dts
+++ b/arch/arm64/boot/dts/arm/juno-r2.dts
@@ -99,6 +99,7 @@
 			clocks = <&scpi_dvfs 0>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <1024>;
+			dynamic-power-coefficient = <450>;
 		};
 
 		A72_1: cpu@1 {
@@ -116,6 +117,7 @@
 			clocks = <&scpi_dvfs 0>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <1024>;
+			dynamic-power-coefficient = <450>;
 		};
 
 		A53_0: cpu@100 {
@@ -133,6 +135,7 @@
 			clocks = <&scpi_dvfs 1>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <485>;
+			dynamic-power-coefficient = <140>;
 		};
 
 		A53_1: cpu@101 {
@@ -150,6 +153,7 @@
 			clocks = <&scpi_dvfs 1>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <485>;
+			dynamic-power-coefficient = <140>;
 		};
 
 		A53_2: cpu@102 {
@@ -167,6 +171,7 @@
 			clocks = <&scpi_dvfs 1>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <485>;
+			dynamic-power-coefficient = <140>;
 		};
 
 		A53_3: cpu@103 {
@@ -184,6 +189,7 @@
 			clocks = <&scpi_dvfs 1>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <485>;
+			dynamic-power-coefficient = <140>;
 		};
 
 		A72_L2: l2-cache0 {
diff --git a/arch/arm64/boot/dts/arm/juno.dts b/arch/arm64/boot/dts/arm/juno.dts
index 1fb5c5a..e3069e2 100644
--- a/arch/arm64/boot/dts/arm/juno.dts
+++ b/arch/arm64/boot/dts/arm/juno.dts
@@ -98,6 +98,7 @@
 			clocks = <&scpi_dvfs 0>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <1024>;
+			dynamic-power-coefficient = <530>;
 		};
 
 		A57_1: cpu@1 {
@@ -115,6 +116,7 @@
 			clocks = <&scpi_dvfs 0>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <1024>;
+			dynamic-power-coefficient = <530>;
 		};
 
 		A53_0: cpu@100 {
@@ -132,6 +134,7 @@
 			clocks = <&scpi_dvfs 1>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <578>;
+			dynamic-power-coefficient = <140>;
 		};
 
 		A53_1: cpu@101 {
@@ -149,6 +152,7 @@
 			clocks = <&scpi_dvfs 1>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <578>;
+			dynamic-power-coefficient = <140>;
 		};
 
 		A53_2: cpu@102 {
@@ -166,6 +170,7 @@
 			clocks = <&scpi_dvfs 1>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <578>;
+			dynamic-power-coefficient = <140>;
 		};
 
 		A53_3: cpu@103 {
@@ -183,6 +188,7 @@
 			clocks = <&scpi_dvfs 1>;
 			cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>;
 			capacity-dmips-mhz = <578>;
+			dynamic-power-coefficient = <140>;
 		};
 
 		A57_L2: l2-cache0 {
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index db8d364..2fc45d5 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -19,9 +19,13 @@
 CONFIG_CGROUP_PIDS=y
 CONFIG_CGROUP_HUGETLB=y
 CONFIG_CPUSETS=y
+CONFIG_CGROUPS=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_CGROUP_SCHED=y
 CONFIG_CGROUP_DEVICE=y
 CONFIG_CGROUP_CPUACCT=y
 CONFIG_CGROUP_PERF=y
+CONFIG_CGROUP_FREEZER=y
 CONFIG_USER_NS=y
 CONFIG_SCHED_AUTOGROUP=y
 CONFIG_BLK_DEV_INITRD=y
@@ -101,13 +105,16 @@
 CONFIG_COMPAT=y
 CONFIG_HIBERNATION=y
 CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y
+CONFIG_ENERGY_MODEL=y
+CONFIG_SCHED_TUNE=y
 CONFIG_ARM_CPUIDLE=y
 CONFIG_CPU_FREQ=y
 CONFIG_CPU_FREQ_STAT=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
 CONFIG_CPU_FREQ_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
 CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
 CONFIG_CPUFREQ_DT=y
 CONFIG_ACPI_CPPC_CPUFREQ=m
diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig
new file mode 100644
index 0000000..b4b41a3
--- /dev/null
+++ b/arch/arm64/configs/gki_defconfig
@@ -0,0 +1,488 @@
+CONFIG_AUDIT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_PREEMPT=y
+CONFIG_TASKSTATS=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+CONFIG_PSI=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_IKHEADERS=m
+CONFIG_MEMCG=y
+CONFIG_MEMCG_SWAP=y
+CONFIG_BLK_CGROUP=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_BPF=y
+CONFIG_SCHED_AUTOGROUP=y
+CONFIG_SCHED_TUNE=y
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_RD_BZIP2 is not set
+# CONFIG_RD_LZMA is not set
+# CONFIG_RD_XZ is not set
+# CONFIG_RD_LZO is not set
+# CONFIG_RD_LZ4 is not set
+# CONFIG_SYSFS_SYSCALL is not set
+# CONFIG_FHANDLE is not set
+CONFIG_KALLSYMS_ALL=y
+CONFIG_BPF_SYSCALL=y
+CONFIG_BPF_JIT_ALWAYS_ON=y
+# CONFIG_RSEQ is not set
+CONFIG_EMBEDDED=y
+# CONFIG_VM_EVENT_COUNTERS is not set
+# CONFIG_COMPAT_BRK is not set
+# CONFIG_SLAB_MERGE_DEFAULT is not set
+CONFIG_SLAB_FREELIST_RANDOM=y
+CONFIG_SLAB_FREELIST_HARDENED=y
+CONFIG_PROFILING=y
+CONFIG_ARCH_HISI=y
+CONFIG_ARCH_QCOM=y
+CONFIG_PCI=y
+CONFIG_PCI_HOST_GENERIC=y
+CONFIG_PCIE_KIRIN=y
+CONFIG_SCHED_MC=y
+CONFIG_NR_CPUS=32
+CONFIG_SECCOMP=y
+CONFIG_PARAVIRT=y
+CONFIG_ARMV8_DEPRECATED=y
+CONFIG_SWP_EMULATION=y
+CONFIG_CP15_BARRIER_EMULATION=y
+CONFIG_SETEND_EMULATION=y
+CONFIG_ARM64_SW_TTBR0_PAN=y
+CONFIG_RANDOMIZE_BASE=y
+# CONFIG_DMI is not set
+CONFIG_COMPAT=y
+CONFIG_ENERGY_MODEL=y
+CONFIG_CPU_IDLE=y
+CONFIG_ARM_CPUIDLE=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TIMES=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPUFREQ_DUMMY=m
+CONFIG_ARM_SCPI_CPUFREQ=y
+CONFIG_ARM_SCMI_CPUFREQ=y
+CONFIG_ARM_SCMI_PROTOCOL=y
+# CONFIG_ARM_SCMI_POWER_DOMAIN is not set
+CONFIG_ARM_SCPI_PROTOCOL=y
+# CONFIG_ARM_SCPI_POWER_DOMAIN is not set
+# CONFIG_EFI_ARMSTUB_DTB_LOADER is not set
+CONFIG_ARM64_CRYPTO=y
+CONFIG_CRYPTO_SHA2_ARM64_CE=y
+CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
+CONFIG_KPROBES=y
+CONFIG_LTO_CLANG=y
+CONFIG_CFI_CLANG=y
+CONFIG_SHADOW_CALL_STACK=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+CONFIG_BLK_INLINE_ENCRYPTION=y
+CONFIG_GKI_HACKS_TO_FIX=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_MISC=m
+CONFIG_CMA=y
+CONFIG_CMA_AREAS=16
+CONFIG_ZSMALLOC=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=y
+CONFIG_XFRM_INTERFACE=y
+CONFIG_XFRM_STATISTICS=y
+CONFIG_NET_KEY=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_NET_IPGRE_DEMUX=y
+CONFIG_NET_IPVTI=y
+CONFIG_INET_ESP=y
+CONFIG_INET_UDP_DIAG=y
+CONFIG_INET_DIAG_DESTROY=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_INET6_ESP=y
+CONFIG_INET6_IPCOMP=y
+CONFIG_IPV6_MIP6=y
+CONFIG_IPV6_VTI=y
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_NETFILTER=y
+# CONFIG_BRIDGE_NETFILTER is not set
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CONNTRACK_AMANDA=y
+CONFIG_NF_CONNTRACK_FTP=y
+CONFIG_NF_CONNTRACK_H323=y
+CONFIG_NF_CONNTRACK_IRC=y
+CONFIG_NF_CONNTRACK_NETBIOS_NS=y
+CONFIG_NF_CONNTRACK_PPTP=y
+CONFIG_NF_CONNTRACK_SANE=y
+CONFIG_NF_CONNTRACK_TFTP=y
+CONFIG_NF_CT_NETLINK=y
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
+CONFIG_NETFILTER_XT_TARGET_CT=y
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
+CONFIG_NETFILTER_XT_TARGET_MARK=y
+CONFIG_NETFILTER_XT_TARGET_NFLOG=y
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
+CONFIG_NETFILTER_XT_TARGET_TPROXY=y
+CONFIG_NETFILTER_XT_TARGET_TRACE=y
+CONFIG_NETFILTER_XT_TARGET_SECMARK=y
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
+CONFIG_NETFILTER_XT_MATCH_BPF=y
+CONFIG_NETFILTER_XT_MATCH_COMMENT=y
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_HELPER=y
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
+CONFIG_NETFILTER_XT_MATCH_LENGTH=y
+CONFIG_NETFILTER_XT_MATCH_LIMIT=y
+CONFIG_NETFILTER_XT_MATCH_MAC=y
+CONFIG_NETFILTER_XT_MATCH_MARK=y
+CONFIG_NETFILTER_XT_MATCH_OWNER=y
+CONFIG_NETFILTER_XT_MATCH_POLICY=y
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA2=y
+CONFIG_NETFILTER_XT_MATCH_SOCKET=y
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=y
+CONFIG_NETFILTER_XT_MATCH_STRING=y
+CONFIG_NETFILTER_XT_MATCH_TIME=y
+CONFIG_NETFILTER_XT_MATCH_U32=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MATCH_ECN=y
+CONFIG_IP_NF_MATCH_TTL=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_IP_NF_NAT=y
+CONFIG_IP_NF_TARGET_MASQUERADE=y
+CONFIG_IP_NF_TARGET_NETMAP=y
+CONFIG_IP_NF_TARGET_REDIRECT=y
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_RAW=y
+CONFIG_IP_NF_SECURITY=y
+CONFIG_IP_NF_ARPTABLES=y
+CONFIG_IP_NF_ARPFILTER=y
+CONFIG_IP_NF_ARP_MANGLE=y
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MATCH_RPFILTER=y
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_TARGET_REJECT=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
+CONFIG_TIPC=y
+CONFIG_L2TP=y
+CONFIG_BRIDGE=y
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_HTB=y
+CONFIG_NET_SCH_INGRESS=y
+CONFIG_NET_CLS_U32=y
+CONFIG_NET_CLS_BPF=y
+CONFIG_NET_EMATCH=y
+CONFIG_NET_EMATCH_U32=y
+CONFIG_NET_CLS_ACT=y
+CONFIG_VSOCKETS=m
+CONFIG_VIRTIO_VSOCKETS=m
+CONFIG_BPF_JIT=y
+CONFIG_CAN=m
+CONFIG_CAN_VCAN=m
+CONFIG_BT=y
+CONFIG_CFG80211=y
+# CONFIG_CFG80211_DEFAULT_PS is not set
+# CONFIG_CFG80211_CRDA_SUPPORT is not set
+CONFIG_MAC80211=y
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_RFKILL=y
+# CONFIG_UEVENT_HELPER is not set
+# CONFIG_FW_CACHE is not set
+# CONFIG_ALLOW_DEV_COREDUMP is not set
+CONFIG_DEBUG_DEVRES=y
+CONFIG_DMA_CMA=y
+CONFIG_GNSS=y
+CONFIG_GNSS_CMDLINE_SERIAL=m
+CONFIG_ZRAM=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_VIRTIO_BLK=m
+CONFIG_UID_SYS_STATS=y
+CONFIG_SCSI=y
+# CONFIG_SCSI_PROC_FS is not set
+CONFIG_BLK_DEV_SD=y
+CONFIG_SCSI_UFSHCD=y
+CONFIG_SCSI_UFSHCD_PLATFORM=y
+CONFIG_SCSI_UFS_CRYPTO=y
+CONFIG_MD=y
+CONFIG_BLK_DEV_DM=y
+CONFIG_DM_CRYPT=y
+CONFIG_DM_SNAPSHOT=y
+CONFIG_DM_UEVENT=y
+CONFIG_DM_VERITY=y
+CONFIG_DM_VERITY_AVB=y
+CONFIG_DM_VERITY_FEC=y
+CONFIG_DM_BOW=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=y
+CONFIG_VIRTIO_NET=m
+# CONFIG_ETHERNET is not set
+CONFIG_PHYLIB=y
+CONFIG_PPP=y
+CONFIG_PPP_BSDCOMP=y
+CONFIG_PPP_DEFLATE=y
+CONFIG_PPP_MPPE=y
+CONFIG_PPTP=y
+CONFIG_PPPOL2TP=y
+CONFIG_USB_RTL8152=y
+CONFIG_USB_USBNET=y
+# CONFIG_USB_NET_AX8817X is not set
+# CONFIG_USB_NET_AX88179_178A is not set
+# CONFIG_USB_NET_CDCETHER is not set
+# CONFIG_USB_NET_CDC_NCM is not set
+# CONFIG_USB_NET_NET1080 is not set
+# CONFIG_USB_NET_CDC_SUBSET is not set
+# CONFIG_USB_NET_ZAURUS is not set
+# CONFIG_WLAN_VENDOR_ADMTEK is not set
+# CONFIG_WLAN_VENDOR_ATH is not set
+# CONFIG_WLAN_VENDOR_ATMEL is not set
+# CONFIG_WLAN_VENDOR_BROADCOM is not set
+# CONFIG_WLAN_VENDOR_CISCO is not set
+# CONFIG_WLAN_VENDOR_INTEL is not set
+# CONFIG_WLAN_VENDOR_INTERSIL is not set
+# CONFIG_WLAN_VENDOR_MARVELL is not set
+# CONFIG_WLAN_VENDOR_MEDIATEK is not set
+# CONFIG_WLAN_VENDOR_RALINK is not set
+# CONFIG_WLAN_VENDOR_REALTEK is not set
+# CONFIG_WLAN_VENDOR_RSI is not set
+# CONFIG_WLAN_VENDOR_ST is not set
+# CONFIG_WLAN_VENDOR_TI is not set
+# CONFIG_WLAN_VENDOR_ZYDAS is not set
+# CONFIG_WLAN_VENDOR_QUANTENNA is not set
+CONFIG_VIRT_WIFI=m
+CONFIG_INPUT_FF_MEMLESS=y
+CONFIG_INPUT_EVDEV=y
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_JOYSTICK=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=y
+# CONFIG_VT is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_DEVMEM is not set
+CONFIG_SERIAL_8250=y
+# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_EXAR is not set
+CONFIG_SERIAL_OF_PLATFORM=m
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_SERIAL_DEV_BUS=y
+CONFIG_VIRTIO_CONSOLE=m
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_VIRTIO=m
+# CONFIG_HW_RANDOM_CAVIUM is not set
+# CONFIG_DEVPORT is not set
+# CONFIG_I2C_COMPAT is not set
+# CONFIG_I2C_HELPER_AUTO is not set
+CONFIG_SPI=y
+CONFIG_SPMI=y
+CONFIG_PINCTRL_AMD=y
+CONFIG_POWER_AVS=y
+CONFIG_POWER_RESET_HISI=y
+# CONFIG_HWMON is not set
+CONFIG_THERMAL=y
+CONFIG_THERMAL_GOV_USER_SPACE=y
+CONFIG_CPU_THERMAL=y
+CONFIG_DEVFREQ_THERMAL=y
+CONFIG_WATCHDOG=y
+CONFIG_MFD_ACT8945A=y
+CONFIG_MFD_SYSCON=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_MEDIA_CAMERA_SUPPORT=y
+CONFIG_MEDIA_CONTROLLER=y
+# CONFIG_VGA_ARB is not set
+CONFIG_DRM=y
+# CONFIG_DRM_FBDEV_EMULATION is not set
+CONFIG_DRM_VIRTIO_GPU=m
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_HRTIMER=y
+CONFIG_SND_DYNAMIC_MINORS=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_DRIVERS is not set
+CONFIG_SND_INTEL8X0=y
+CONFIG_SND_USB_AUDIO=y
+CONFIG_SND_SOC=y
+CONFIG_HIDRAW=y
+CONFIG_UHID=y
+CONFIG_HID_APPLE=y
+CONFIG_HID_ELECOM=y
+CONFIG_HID_MAGICMOUSE=y
+CONFIG_HID_MICROSOFT=y
+CONFIG_HID_MULTITOUCH=y
+CONFIG_USB_HIDDEV=y
+CONFIG_USB=y
+CONFIG_USB_OTG=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_DUMMY_HCD=m
+CONFIG_USB_CONFIGFS=y
+CONFIG_USB_CONFIGFS_UEVENT=y
+CONFIG_USB_CONFIGFS_F_FS=y
+CONFIG_USB_CONFIGFS_F_ACC=y
+CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
+CONFIG_USB_CONFIGFS_F_MIDI=y
+CONFIG_MMC=m
+# CONFIG_PWRSEQ_EMMC is not set
+# CONFIG_PWRSEQ_SIMPLE is not set
+CONFIG_MMC_SDHCI=m
+CONFIG_MMC_SDHCI_PLTFM=m
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_EDAC=y
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_SYSTOHC is not set
+CONFIG_RTC_DRV_TEST=m
+CONFIG_RTC_DRV_PL030=y
+CONFIG_RTC_DRV_PL031=y
+CONFIG_DMADEVICES=y
+CONFIG_UIO=y
+CONFIG_VIRTIO_PCI=m
+# CONFIG_VIRTIO_PCI_LEGACY is not set
+CONFIG_VIRTIO_INPUT=m
+CONFIG_VIRTIO_MMIO=m
+CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
+CONFIG_STAGING=y
+CONFIG_ASHMEM=y
+CONFIG_ANDROID_VSOC=y
+CONFIG_ION=y
+CONFIG_ION_SYSTEM_HEAP=y
+CONFIG_COMMON_CLK_SCPI=y
+# CONFIG_COMMON_CLK_XGENE is not set
+CONFIG_HWSPINLOCK=y
+CONFIG_MAILBOX=y
+CONFIG_ARM_SMMU=y
+CONFIG_QCOM_COMMAND_DB=y
+CONFIG_QCOM_RPMH=y
+CONFIG_DEVFREQ_GOV_PERFORMANCE=y
+CONFIG_DEVFREQ_GOV_POWERSAVE=y
+CONFIG_DEVFREQ_GOV_USERSPACE=y
+CONFIG_DEVFREQ_GOV_PASSIVE=y
+CONFIG_EXTCON=y
+CONFIG_IIO=y
+CONFIG_PWM=y
+CONFIG_QCOM_PDC=y
+CONFIG_GENERIC_PHY=y
+CONFIG_RAS=y
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_F2FS_FS=y
+CONFIG_F2FS_FS_SECURITY=y
+CONFIG_FS_ENCRYPTION=y
+CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
+CONFIG_FS_VERITY=y
+CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
+# CONFIG_DNOTIFY is not set
+CONFIG_QUOTA=y
+CONFIG_QFMT_V2=y
+CONFIG_FUSE_FS=y
+CONFIG_OVERLAY_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS_POSIX_ACL=y
+# CONFIG_EFIVAR_FS is not set
+CONFIG_SDCARD_FS=y
+CONFIG_PSTORE=y
+CONFIG_PSTORE_CONSOLE=y
+CONFIG_PSTORE_RAM=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=y
+CONFIG_NLS_CODEPAGE_775=y
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_CODEPAGE_852=y
+CONFIG_NLS_CODEPAGE_855=y
+CONFIG_NLS_CODEPAGE_857=y
+CONFIG_NLS_CODEPAGE_860=y
+CONFIG_NLS_CODEPAGE_861=y
+CONFIG_NLS_CODEPAGE_862=y
+CONFIG_NLS_CODEPAGE_863=y
+CONFIG_NLS_CODEPAGE_864=y
+CONFIG_NLS_CODEPAGE_865=y
+CONFIG_NLS_CODEPAGE_866=y
+CONFIG_NLS_CODEPAGE_869=y
+CONFIG_NLS_CODEPAGE_936=y
+CONFIG_NLS_CODEPAGE_950=y
+CONFIG_NLS_CODEPAGE_932=y
+CONFIG_NLS_CODEPAGE_949=y
+CONFIG_NLS_CODEPAGE_874=y
+CONFIG_NLS_ISO8859_8=y
+CONFIG_NLS_CODEPAGE_1250=y
+CONFIG_NLS_CODEPAGE_1251=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=y
+CONFIG_NLS_ISO8859_3=y
+CONFIG_NLS_ISO8859_4=y
+CONFIG_NLS_ISO8859_5=y
+CONFIG_NLS_ISO8859_6=y
+CONFIG_NLS_ISO8859_7=y
+CONFIG_NLS_ISO8859_9=y
+CONFIG_NLS_ISO8859_13=y
+CONFIG_NLS_ISO8859_14=y
+CONFIG_NLS_ISO8859_15=y
+CONFIG_NLS_KOI8_R=y
+CONFIG_NLS_KOI8_U=y
+CONFIG_NLS_MAC_ROMAN=y
+CONFIG_NLS_MAC_CELTIC=y
+CONFIG_NLS_MAC_CENTEURO=y
+CONFIG_NLS_MAC_CROATIAN=y
+CONFIG_NLS_MAC_CYRILLIC=y
+CONFIG_NLS_MAC_GAELIC=y
+CONFIG_NLS_MAC_GREEK=y
+CONFIG_NLS_MAC_ICELAND=y
+CONFIG_NLS_MAC_INUIT=y
+CONFIG_NLS_MAC_ROMANIAN=y
+CONFIG_NLS_MAC_TURKISH=y
+CONFIG_NLS_UTF8=y
+CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_HARDENED_USERCOPY=y
+CONFIG_SECURITY_SELINUX=y
+CONFIG_CRYPTO_ADIANTUM=y
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_LZ4=y
+CONFIG_CRYPTO_ZSTD=y
+CONFIG_CRYPTO_ANSI_CPRNG=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC8=y
+CONFIG_XZ_DEC=y
+CONFIG_PRINTK_TIME=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_ENABLE_MUST_CHECK is not set
+# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_STACK_USAGE=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_SOFTLOCKUP_DETECTOR=y
+# CONFIG_DETECT_HUNG_TASK is not set
+CONFIG_PANIC_TIMEOUT=5
+CONFIG_SCHEDSTATS=y
+# CONFIG_RUNTIME_TESTING_MENU is not set
+CONFIG_CORESIGHT=y
+CONFIG_CORESIGHT_STM=y
diff --git a/arch/arm64/crypto/chacha20-neon-glue.c b/arch/arm64/crypto/chacha20-neon-glue.c
index 727579c..96e0cfb 100644
--- a/arch/arm64/crypto/chacha20-neon-glue.c
+++ b/arch/arm64/crypto/chacha20-neon-glue.c
@@ -19,7 +19,7 @@
  */
 
 #include <crypto/algapi.h>
-#include <crypto/chacha20.h>
+#include <crypto/chacha.h>
 #include <crypto/internal/skcipher.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -34,15 +34,15 @@
 static void chacha20_doneon(u32 *state, u8 *dst, const u8 *src,
 			    unsigned int bytes)
 {
-	u8 buf[CHACHA20_BLOCK_SIZE];
+	u8 buf[CHACHA_BLOCK_SIZE];
 
-	while (bytes >= CHACHA20_BLOCK_SIZE * 4) {
+	while (bytes >= CHACHA_BLOCK_SIZE * 4) {
 		kernel_neon_begin();
 		chacha20_4block_xor_neon(state, dst, src);
 		kernel_neon_end();
-		bytes -= CHACHA20_BLOCK_SIZE * 4;
-		src += CHACHA20_BLOCK_SIZE * 4;
-		dst += CHACHA20_BLOCK_SIZE * 4;
+		bytes -= CHACHA_BLOCK_SIZE * 4;
+		src += CHACHA_BLOCK_SIZE * 4;
+		dst += CHACHA_BLOCK_SIZE * 4;
 		state[12] += 4;
 	}
 
@@ -50,11 +50,11 @@
 		return;
 
 	kernel_neon_begin();
-	while (bytes >= CHACHA20_BLOCK_SIZE) {
+	while (bytes >= CHACHA_BLOCK_SIZE) {
 		chacha20_block_xor_neon(state, dst, src);
-		bytes -= CHACHA20_BLOCK_SIZE;
-		src += CHACHA20_BLOCK_SIZE;
-		dst += CHACHA20_BLOCK_SIZE;
+		bytes -= CHACHA_BLOCK_SIZE;
+		src += CHACHA_BLOCK_SIZE;
+		dst += CHACHA_BLOCK_SIZE;
 		state[12]++;
 	}
 	if (bytes) {
@@ -68,17 +68,17 @@
 static int chacha20_neon(struct skcipher_request *req)
 {
 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-	struct chacha20_ctx *ctx = crypto_skcipher_ctx(tfm);
+	struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
 	struct skcipher_walk walk;
 	u32 state[16];
 	int err;
 
-	if (!may_use_simd() || req->cryptlen <= CHACHA20_BLOCK_SIZE)
-		return crypto_chacha20_crypt(req);
+	if (!may_use_simd() || req->cryptlen <= CHACHA_BLOCK_SIZE)
+		return crypto_chacha_crypt(req);
 
 	err = skcipher_walk_virt(&walk, req, false);
 
-	crypto_chacha20_init(state, ctx, walk.iv);
+	crypto_chacha_init(state, ctx, walk.iv);
 
 	while (walk.nbytes > 0) {
 		unsigned int nbytes = walk.nbytes;
@@ -99,14 +99,14 @@
 	.base.cra_driver_name	= "chacha20-neon",
 	.base.cra_priority	= 300,
 	.base.cra_blocksize	= 1,
-	.base.cra_ctxsize	= sizeof(struct chacha20_ctx),
+	.base.cra_ctxsize	= sizeof(struct chacha_ctx),
 	.base.cra_module	= THIS_MODULE,
 
-	.min_keysize		= CHACHA20_KEY_SIZE,
-	.max_keysize		= CHACHA20_KEY_SIZE,
-	.ivsize			= CHACHA20_IV_SIZE,
-	.chunksize		= CHACHA20_BLOCK_SIZE,
-	.walksize		= 4 * CHACHA20_BLOCK_SIZE,
+	.min_keysize		= CHACHA_KEY_SIZE,
+	.max_keysize		= CHACHA_KEY_SIZE,
+	.ivsize			= CHACHA_IV_SIZE,
+	.chunksize		= CHACHA_BLOCK_SIZE,
+	.walksize		= 4 * CHACHA_BLOCK_SIZE,
 	.setkey			= crypto_chacha20_setkey,
 	.encrypt		= chacha20_neon,
 	.decrypt		= chacha20_neon,
diff --git a/arch/arm64/crypto/ghash-ce-glue.c b/arch/arm64/crypto/ghash-ce-glue.c
index 1ed227b..bee3027 100644
--- a/arch/arm64/crypto/ghash-ce-glue.c
+++ b/arch/arm64/crypto/ghash-ce-glue.c
@@ -60,6 +60,22 @@
 				      struct ghash_key const *k,
 				      const char *head);
 
+#ifdef CONFIG_CFI_CLANG
+static inline void __cfi_pmull_ghash_update_p64(int blocks, u64 dg[],
+                const char *src, struct ghash_key const *k, const char *head)
+{
+        return pmull_ghash_update_p64(blocks, dg, src, k, head);
+}
+#define pmull_ghash_update_p64 __cfi_pmull_ghash_update_p64
+
+static inline void __cfi_pmull_ghash_update_p8(int blocks, u64 dg[],
+                const char *src, struct ghash_key const *k, const char *head)
+{
+        return pmull_ghash_update_p8(blocks, dg, src, k, head);
+}
+#define pmull_ghash_update_p8 __cfi_pmull_ghash_update_p8
+#endif
+
 static void (*pmull_ghash_update)(int blocks, u64 dg[], const char *src,
 				  struct ghash_key const *k,
 				  const char *head);
diff --git a/arch/arm64/crypto/sha1-ce-glue.c b/arch/arm64/crypto/sha1-ce-glue.c
index d8c521c..c320030 100644
--- a/arch/arm64/crypto/sha1-ce-glue.c
+++ b/arch/arm64/crypto/sha1-ce-glue.c
@@ -29,6 +29,14 @@
 
 asmlinkage void sha1_ce_transform(struct sha1_ce_state *sst, u8 const *src,
 				  int blocks);
+#ifdef CONFIG_CFI_CLANG
+static inline void __cfi_sha1_ce_transform(struct sha1_state *sst,
+					   u8 const *src, int blocks)
+{
+	sha1_ce_transform((struct sha1_ce_state *)sst, src, blocks);
+}
+#define sha1_ce_transform __cfi_sha1_ce_transform
+#endif
 
 const u32 sha1_ce_offsetof_count = offsetof(struct sha1_ce_state, sst.count);
 const u32 sha1_ce_offsetof_finalize = offsetof(struct sha1_ce_state, finalize);
diff --git a/arch/arm64/crypto/sha2-ce-glue.c b/arch/arm64/crypto/sha2-ce-glue.c
index c47d1a2..ddc56fa 100644
--- a/arch/arm64/crypto/sha2-ce-glue.c
+++ b/arch/arm64/crypto/sha2-ce-glue.c
@@ -29,6 +29,14 @@
 
 asmlinkage void sha2_ce_transform(struct sha256_ce_state *sst, u8 const *src,
 				  int blocks);
+#ifdef CONFIG_CFI_CLANG
+static inline void __cfi_sha2_ce_transform(struct sha256_state *sst,
+					   u8 const *src, int blocks)
+{
+	sha2_ce_transform((struct sha256_ce_state *)sst, src, blocks);
+}
+#define sha2_ce_transform __cfi_sha2_ce_transform
+#endif
 
 const u32 sha256_ce_offsetof_count = offsetof(struct sha256_ce_state,
 					      sst.count);
diff --git a/arch/arm64/include/asm/alternative.h b/arch/arm64/include/asm/alternative.h
index 4b650ec..c3a08d6 100644
--- a/arch/arm64/include/asm/alternative.h
+++ b/arch/arm64/include/asm/alternative.h
@@ -35,13 +35,16 @@
 static inline void apply_alternatives_module(void *start, size_t length) { }
 #endif
 
-#define ALTINSTR_ENTRY(feature,cb)					      \
+#define ALTINSTR_ENTRY(feature)					              \
 	" .word 661b - .\n"				/* label           */ \
-	" .if " __stringify(cb) " == 0\n"				      \
 	" .word 663f - .\n"				/* new instruction */ \
-	" .else\n"							      \
+	" .hword " __stringify(feature) "\n"		/* feature bit     */ \
+	" .byte 662b-661b\n"				/* source len      */ \
+	" .byte 664f-663f\n"				/* replacement len */
+
+#define ALTINSTR_ENTRY_CB(feature,cb)					      \
+	" .word 661b - .\n"				/* label           */ \
 	" .word " __stringify(cb) "- .\n"		/* callback */	      \
-	" .endif\n"							      \
 	" .hword " __stringify(feature) "\n"		/* feature bit     */ \
 	" .byte 662b-661b\n"				/* source len      */ \
 	" .byte 664f-663f\n"				/* replacement len */
@@ -62,15 +65,14 @@
  *
  * Alternatives with callbacks do not generate replacement instructions.
  */
-#define __ALTERNATIVE_CFG(oldinstr, newinstr, feature, cfg_enabled, cb)	\
+#define __ALTERNATIVE_CFG(oldinstr, newinstr, feature, cfg_enabled)	\
 	".if "__stringify(cfg_enabled)" == 1\n"				\
 	"661:\n\t"							\
 	oldinstr "\n"							\
 	"662:\n"							\
 	".pushsection .altinstructions,\"a\"\n"				\
-	ALTINSTR_ENTRY(feature,cb)					\
+	ALTINSTR_ENTRY(feature)						\
 	".popsection\n"							\
-	" .if " __stringify(cb) " == 0\n"				\
 	".pushsection .altinstr_replacement, \"a\"\n"			\
 	"663:\n\t"							\
 	newinstr "\n"							\
@@ -78,17 +80,25 @@
 	".popsection\n\t"						\
 	".org	. - (664b-663b) + (662b-661b)\n\t"			\
 	".org	. - (662b-661b) + (664b-663b)\n"			\
-	".else\n\t"							\
+	".endif\n"
+
+#define __ALTERNATIVE_CFG_CB(oldinstr, feature, cfg_enabled, cb)	\
+	".if "__stringify(cfg_enabled)" == 1\n"				\
+	"661:\n\t"							\
+	oldinstr "\n"							\
+	"662:\n"							\
+	".pushsection .altinstructions,\"a\"\n"				\
+	ALTINSTR_ENTRY_CB(feature,cb)					\
+	".popsection\n"							\
 	"663:\n\t"							\
 	"664:\n\t"							\
-	".endif\n"							\
 	".endif\n"
 
 #define _ALTERNATIVE_CFG(oldinstr, newinstr, feature, cfg, ...)	\
-	__ALTERNATIVE_CFG(oldinstr, newinstr, feature, IS_ENABLED(cfg), 0)
+	__ALTERNATIVE_CFG(oldinstr, newinstr, feature, IS_ENABLED(cfg))
 
 #define ALTERNATIVE_CB(oldinstr, cb) \
-	__ALTERNATIVE_CFG(oldinstr, "NOT_AN_INSTRUCTION", ARM64_CB_PATCH, 1, cb)
+	__ALTERNATIVE_CFG_CB(oldinstr, ARM64_CB_PATCH, 1, cb)
 #else
 
 #include <asm/assembler.h>
diff --git a/arch/arm64/include/asm/asm-uaccess.h b/arch/arm64/include/asm/asm-uaccess.h
index 4128bec..d8b2ce5 100644
--- a/arch/arm64/include/asm/asm-uaccess.h
+++ b/arch/arm64/include/asm/asm-uaccess.h
@@ -78,10 +78,9 @@
 /*
  * Remove the address tag from a virtual address, if present.
  */
-	.macro	clear_address_tag, dst, addr
-	tst	\addr, #(1 << 55)
-	bic	\dst, \addr, #(0xff << 56)
-	csel	\dst, \dst, \addr, eq
+	.macro	untagged_addr, dst, addr
+	sbfx	\dst, \addr, #0, #56
+	and	\dst, \dst, \addr
 	.endm
 
 #endif
diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h
index 5a97ac8..4963d6f 100644
--- a/arch/arm64/include/asm/assembler.h
+++ b/arch/arm64/include/asm/assembler.h
@@ -23,6 +23,8 @@
 #ifndef __ASM_ASSEMBLER_H
 #define __ASM_ASSEMBLER_H
 
+#include <asm-generic/export.h>
+
 #include <asm/asm-offsets.h>
 #include <asm/cpufeature.h>
 #include <asm/debug-monitors.h>
@@ -488,6 +490,13 @@
 #else
 #define NOKPROBE(x)
 #endif
+
+#ifdef CONFIG_KASAN
+#define EXPORT_SYMBOL_NOKASAN(name)
+#else
+#define EXPORT_SYMBOL_NOKASAN(name)	EXPORT_SYMBOL(name)
+#endif
+
 	/*
 	 * Emit a 64-bit absolute little endian symbol reference in a way that
 	 * ensures that it will be resolved at build time, even when building a
diff --git a/arch/arm64/include/asm/brk-imm.h b/arch/arm64/include/asm/brk-imm.h
index ed693c5..2945fe6 100644
--- a/arch/arm64/include/asm/brk-imm.h
+++ b/arch/arm64/include/asm/brk-imm.h
@@ -16,10 +16,12 @@
  * 0x400: for dynamic BRK instruction
  * 0x401: for compile time BRK instruction
  * 0x800: kernel-mode BUG() and WARN() traps
+ * 0x9xx: tag-based KASAN trap (allowed values 0x900 - 0x9ff)
  */
 #define FAULT_BRK_IMM			0x100
 #define KGDB_DYN_DBG_BRK_IMM		0x400
 #define KGDB_COMPILED_DBG_BRK_IMM	0x401
 #define BUG_BRK_IMM			0x800
+#define KASAN_BRK_IMM			0x900
 
 #endif
diff --git a/arch/arm64/include/asm/cache.h b/arch/arm64/include/asm/cache.h
index 5ee5bca..88dab0d 100644
--- a/arch/arm64/include/asm/cache.h
+++ b/arch/arm64/include/asm/cache.h
@@ -49,6 +49,10 @@
  */
 #define ARCH_DMA_MINALIGN	(128)
 
+#ifdef CONFIG_KASAN_SW_TAGS
+#define ARCH_SLAB_MINALIGN	(1ULL << KASAN_SHADOW_SCALE_SHIFT)
+#endif
+
 #ifndef __ASSEMBLY__
 
 #include <linux/bitops.h>
diff --git a/arch/arm64/include/asm/kasan.h b/arch/arm64/include/asm/kasan.h
index 8758bb0..b52aacd 100644
--- a/arch/arm64/include/asm/kasan.h
+++ b/arch/arm64/include/asm/kasan.h
@@ -4,12 +4,16 @@
 
 #ifndef __ASSEMBLY__
 
-#ifdef CONFIG_KASAN
-
 #include <linux/linkage.h>
 #include <asm/memory.h>
 #include <asm/pgtable-types.h>
 
+#define arch_kasan_set_tag(addr, tag)	__tag_set(addr, tag)
+#define arch_kasan_reset_tag(addr)	__tag_reset(addr)
+#define arch_kasan_get_tag(addr)	__tag_get(addr)
+
+#ifdef CONFIG_KASAN
+
 /*
  * KASAN_SHADOW_START: beginning of the kernel virtual addresses.
  * KASAN_SHADOW_END: KASAN_SHADOW_START + 1/N of kernel virtual addresses,
diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h
index 384c343..f150c0f 100644
--- a/arch/arm64/include/asm/kvm_hyp.h
+++ b/arch/arm64/include/asm/kvm_hyp.h
@@ -28,7 +28,7 @@
 	({								\
 		u64 reg;						\
 		asm volatile(ALTERNATIVE("mrs %0, " __stringify(r##nvh),\
-					 "mrs_s %0, " __stringify(r##vh),\
+					 __mrs_s("%0", r##vh),		\
 					 ARM64_HAS_VIRT_HOST_EXTN)	\
 			     : "=r" (reg));				\
 		reg;							\
@@ -38,7 +38,7 @@
 	do {								\
 		u64 __val = (u64)(v);					\
 		asm volatile(ALTERNATIVE("msr " __stringify(r##nvh) ", %x0",\
-					 "msr_s " __stringify(r##vh) ", %x0",\
+					 __msr_s(r##vh, "%x0"),		\
 					 ARM64_HAS_VIRT_HOST_EXTN)	\
 					 : : "rZ" (__val));		\
 	} while (0)
diff --git a/arch/arm64/include/asm/lse.h b/arch/arm64/include/asm/lse.h
index 8262325..8be3b0f 100644
--- a/arch/arm64/include/asm/lse.h
+++ b/arch/arm64/include/asm/lse.h
@@ -20,7 +20,12 @@
 
 #else	/* __ASSEMBLER__ */
 
+#ifdef CONFIG_LTO_CLANG
+#define __LSE_PREAMBLE	".arch armv8-a+lse\n"
+#else
 __asm__(".arch_extension	lse");
+#define __LSE_PREAMBLE
+#endif
 
 /* Move the ll/sc atomics out-of-line */
 #define __LL_SC_INLINE		notrace
@@ -33,7 +38,7 @@
 
 /* In-line patching at runtime */
 #define ARM64_LSE_ATOMIC_INSN(llsc, lse)				\
-	ALTERNATIVE(llsc, lse, ARM64_HAS_LSE_ATOMICS)
+	ALTERNATIVE(llsc, __LSE_PREAMBLE lse, ARM64_HAS_LSE_ATOMICS)
 
 #endif	/* __ASSEMBLER__ */
 #else	/* CONFIG_AS_LSE && CONFIG_ARM64_LSE_ATOMICS */
diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h
index 56562ff..9711fb8 100644
--- a/arch/arm64/include/asm/memory.h
+++ b/arch/arm64/include/asm/memory.h
@@ -74,19 +74,13 @@
 #define KERNEL_END        _end
 
 /*
- * KASAN requires 1/8th of the kernel virtual address space for the shadow
- * region. KASAN can bloat the stack significantly, so double the (minimum)
- * stack size when KASAN is in use, and then double it again if KASAN_EXTRA is
- * on.
+ * Generic and tag-based KASAN require 1/8th and 1/16th of the kernel virtual
+ * address space for the shadow region respectively. They can bloat the stack
+ * significantly, so double the (minimum) stack size when they are in use.
  */
 #ifdef CONFIG_KASAN
-#define KASAN_SHADOW_SCALE_SHIFT 3
 #define KASAN_SHADOW_SIZE	(UL(1) << (VA_BITS - KASAN_SHADOW_SCALE_SHIFT))
-#ifdef CONFIG_KASAN_EXTRA
-#define KASAN_THREAD_SHIFT	2
-#else
 #define KASAN_THREAD_SHIFT	1
-#endif /* CONFIG_KASAN_EXTRA */
 #else
 #define KASAN_SHADOW_SIZE	(0)
 #define KASAN_THREAD_SHIFT	0
@@ -218,6 +212,36 @@
 #define PHYS_PFN_OFFSET	(PHYS_OFFSET >> PAGE_SHIFT)
 
 /*
+ * When dealing with data aborts, watchpoints, or instruction traps we may end
+ * up with a tagged userland pointer. Clear the tag to get a sane pointer to
+ * pass on to access_ok(), for instance.
+ */
+#define __untagged_addr(addr)	\
+	((__force __typeof__(addr))sign_extend64((__force u64)(addr), 55))
+
+#define untagged_addr(addr)	({					\
+	u64 __addr = (__force u64)addr;					\
+	__addr &= __untagged_addr(__addr);				\
+	(__force __typeof__(addr))__addr;				\
+})
+
+#ifdef CONFIG_KASAN_SW_TAGS
+#define __tag_shifted(tag)	((u64)(tag) << 56)
+#define __tag_reset(addr)	__untagged_addr(addr)
+#define __tag_get(addr)		(__u8)((u64)(addr) >> 56)
+#else
+#define __tag_shifted(tag)	0UL
+#define __tag_reset(addr)	(addr)
+#define __tag_get(addr)		0
+#endif
+
+static inline const void *__tag_set(const void *addr, u8 tag)
+{
+	u64 __addr = (u64)addr & ~__tag_shifted(0xff);
+	return (const void *)(__addr | __tag_shifted(tag));
+}
+
+/*
  * Physical vs virtual RAM address space conversion.  These are
  * private definitions which should NOT be used outside memory.h
  * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
@@ -288,6 +312,22 @@
 #define sym_to_pfn(x)	    __phys_to_pfn(__pa_symbol(x))
 
 /*
+ * With non-canonical CFI jump tables, the compiler replaces function
+ * address references with the address of the function's CFI jump
+ * table entry. This results in __pa_symbol(function) returning the
+ * physical address of the jump table entry, which can lead to address
+ * space confusion since the jump table points to the function's
+ * virtual address. Therefore, use inline assembly to ensure we are
+ * always taking the address of the actual function.
+ */
+#define __pa_function(x) ({						\
+	unsigned long addr;						\
+	asm("adrp %0, " __stringify(x) "\n\t"				\
+	    "add  %0, %0, :lo12:" __stringify(x) : "=r" (addr));	\
+	__pa_symbol(addr);						\
+})
+
+/*
  *  virt_to_page(k)	convert a _valid_ virtual address to struct page *
  *  virt_addr_valid(k)	indicates whether a virtual address is valid
  */
@@ -300,7 +340,14 @@
 #define __virt_to_pgoff(kaddr)	(((u64)(kaddr) & ~PAGE_OFFSET) / PAGE_SIZE * sizeof(struct page))
 #define __page_to_voff(kaddr)	(((u64)(kaddr) & ~VMEMMAP_START) * PAGE_SIZE / sizeof(struct page))
 
-#define page_to_virt(page)	((void *)((__page_to_voff(page)) | PAGE_OFFSET))
+#define page_to_virt(page)	({					\
+	unsigned long __addr =						\
+		((__page_to_voff(page)) | PAGE_OFFSET);			\
+	const void *__addr_tag =					\
+		__tag_set((void *)__addr, page_kasan_tag(page));	\
+	((void *)__addr_tag);						\
+})
+
 #define virt_to_page(vaddr)	((struct page *)((__virt_to_pgoff(vaddr)) | VMEMMAP_START))
 
 #define _virt_addr_valid(kaddr)	pfn_valid((((u64)(kaddr) & ~PAGE_OFFSET) \
@@ -308,9 +355,10 @@
 #endif
 #endif
 
-#define _virt_addr_is_linear(kaddr)	(((u64)(kaddr)) >= PAGE_OFFSET)
-#define virt_addr_valid(kaddr)		(_virt_addr_is_linear(kaddr) && \
-					 _virt_addr_valid(kaddr))
+#define _virt_addr_is_linear(kaddr)	\
+	(__tag_reset((u64)(kaddr)) >= PAGE_OFFSET)
+#define virt_addr_valid(kaddr)		\
+	(_virt_addr_is_linear(kaddr) && _virt_addr_valid(kaddr))
 
 #include <asm-generic/memory_model.h>
 
diff --git a/arch/arm64/include/asm/mmu_context.h b/arch/arm64/include/asm/mmu_context.h
index 39ec0b8..95d5d75 100644
--- a/arch/arm64/include/asm/mmu_context.h
+++ b/arch/arm64/include/asm/mmu_context.h
@@ -141,7 +141,7 @@
  * Atomically replaces the active TTBR1_EL1 PGD with a new VA-compatible PGD,
  * avoiding the possibility of conflicting TLB entries being allocated.
  */
-static inline void cpu_replace_ttbr1(pgd_t *pgdp)
+static inline void __nocfi cpu_replace_ttbr1(pgd_t *pgdp)
 {
 	typedef void (ttbr_replace_func)(phys_addr_t);
 	extern ttbr_replace_func idmap_cpu_replace_ttbr1;
@@ -149,7 +149,7 @@
 
 	phys_addr_t pgd_phys = virt_to_phys(pgdp);
 
-	replace_phys = (void *)__pa_symbol(idmap_cpu_replace_ttbr1);
+	replace_phys = (void *)__pa_function(idmap_cpu_replace_ttbr1);
 
 	cpu_install_idmap();
 	replace_phys(pgd_phys);
diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h
index fd208ea..483acee 100644
--- a/arch/arm64/include/asm/pgtable-hwdef.h
+++ b/arch/arm64/include/asm/pgtable-hwdef.h
@@ -289,6 +289,7 @@
 #define TCR_A1			(UL(1) << 22)
 #define TCR_ASID16		(UL(1) << 36)
 #define TCR_TBI0		(UL(1) << 37)
+#define TCR_TBI1		(UL(1) << 38)
 #define TCR_HA			(UL(1) << 39)
 #define TCR_HD			(UL(1) << 40)
 #define TCR_NFD1		(UL(1) << 54)
diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h
index 773ea8e..bfb6d67 100644
--- a/arch/arm64/include/asm/processor.h
+++ b/arch/arm64/include/asm/processor.h
@@ -291,6 +291,14 @@
 #define SVE_SET_VL(arg)	sve_set_current_vl(arg)
 #define SVE_GET_VL()	sve_get_current_vl()
 
+#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
+/* PR_{SET,GET}_TAGGED_ADDR_CTRL prctl */
+long set_tagged_addr_ctrl(unsigned long arg);
+long get_tagged_addr_ctrl(void);
+#define SET_TAGGED_ADDR_CTRL(arg)	set_tagged_addr_ctrl(arg)
+#define GET_TAGGED_ADDR_CTRL()		get_tagged_addr_ctrl()
+#endif
+
 /*
  * For CONFIG_GCC_PLUGIN_STACKLEAK
  *
diff --git a/arch/arm64/include/asm/scs.h b/arch/arm64/include/asm/scs.h
new file mode 100644
index 0000000..c50d2b0
--- /dev/null
+++ b/arch/arm64/include/asm/scs.h
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_SCS_H
+#define _ASM_SCS_H
+
+#ifndef __ASSEMBLY__
+
+#include <linux/scs.h>
+
+#ifdef CONFIG_SHADOW_CALL_STACK
+
+extern void scs_init_irq(void);
+
+static __always_inline void scs_save(struct task_struct *tsk)
+{
+	void *s;
+
+	asm volatile("mov %0, x18" : "=r" (s));
+	task_set_scs(tsk, s);
+}
+
+static inline void scs_overflow_check(struct task_struct *tsk)
+{
+	if (unlikely(scs_corrupted(tsk)))
+		panic("corrupted shadow stack detected inside scheduler\n");
+}
+
+#else /* CONFIG_SHADOW_CALL_STACK */
+
+static inline void scs_init_irq(void) {}
+static inline void scs_save(struct task_struct *tsk) {}
+static inline void scs_overflow_check(struct task_struct *tsk) {}
+
+#endif /* CONFIG_SHADOW_CALL_STACK */
+
+#endif /* __ASSEMBLY __ */
+
+#endif /* _ASM_SCS_H */
diff --git a/arch/arm64/include/asm/stacktrace.h b/arch/arm64/include/asm/stacktrace.h
index e86737b..8910f18 100644
--- a/arch/arm64/include/asm/stacktrace.h
+++ b/arch/arm64/include/asm/stacktrace.h
@@ -54,6 +54,10 @@
 
 DECLARE_PER_CPU(unsigned long *, irq_stack_ptr);
 
+#ifdef CONFIG_SHADOW_CALL_STACK
+DECLARE_PER_CPU(unsigned long *, irq_shadow_call_stack_ptr);
+#endif
+
 static inline bool on_irq_stack(unsigned long sp,
 				struct stack_info *info)
 {
diff --git a/arch/arm64/include/asm/suspend.h b/arch/arm64/include/asm/suspend.h
index 8939c87..0cde2f4 100644
--- a/arch/arm64/include/asm/suspend.h
+++ b/arch/arm64/include/asm/suspend.h
@@ -2,7 +2,7 @@
 #ifndef __ASM_SUSPEND_H
 #define __ASM_SUSPEND_H
 
-#define NR_CTX_REGS 12
+#define NR_CTX_REGS 13
 #define NR_CALLEE_SAVED_REGS 12
 
 /*
diff --git a/arch/arm64/include/asm/syscall_wrapper.h b/arch/arm64/include/asm/syscall_wrapper.h
index 507d0ee..e9330f8 100644
--- a/arch/arm64/include/asm/syscall_wrapper.h
+++ b/arch/arm64/include/asm/syscall_wrapper.h
@@ -8,6 +8,8 @@
 #ifndef __ASM_SYSCALL_WRAPPER_H
 #define __ASM_SYSCALL_WRAPPER_H
 
+struct pt_regs;
+
 #define SC_ARM64_REGS_TO_ARGS(x, ...)				\
 	__MAP(x,__SC_ARGS					\
 	      ,,regs->regs[0],,regs->regs[1],,regs->regs[2]	\
@@ -35,8 +37,11 @@
 	ALLOW_ERROR_INJECTION(__arm64_compat_sys_##sname, ERRNO);			\
 	asmlinkage long __arm64_compat_sys_##sname(const struct pt_regs *__unused)
 
-#define COND_SYSCALL_COMPAT(name) \
-	cond_syscall(__arm64_compat_sys_##name);
+#define COND_SYSCALL_COMPAT(name) 							\
+	asmlinkage __weak long __arm64_compat_sys_##name(const struct pt_regs *__unused)\
+	{										\
+		return sys_ni_syscall();						\
+	}
 
 #define COMPAT_SYS_NI(name) \
 	SYSCALL_ALIAS(__arm64_compat_sys_##name, sys_ni_posix_timers);
@@ -70,7 +75,11 @@
 #endif
 
 #ifndef COND_SYSCALL
-#define COND_SYSCALL(name) cond_syscall(__arm64_sys_##name)
+#define COND_SYSCALL(name)							\
+	asmlinkage __weak long __arm64_sys_##name(const struct pt_regs *regs)	\
+	{									\
+		return sys_ni_syscall();					\
+	}
 #endif
 
 #ifndef SYS_NI
diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
index 3091ae5..9d9461f 100644
--- a/arch/arm64/include/asm/sysreg.h
+++ b/arch/arm64/include/asm/sysreg.h
@@ -695,20 +695,39 @@
 #include <linux/build_bug.h>
 #include <linux/types.h>
 
-asm(
-"	.irp	num,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\n"
-"	.equ	.L__reg_num_x\\num, \\num\n"
-"	.endr\n"
+#define __DEFINE_MRS_MSR_S_REGNUM				\
+"	.irp	num,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\n" \
+"	.equ	.L__reg_num_x\\num, \\num\n"			\
+"	.endr\n"						\
 "	.equ	.L__reg_num_xzr, 31\n"
-"\n"
-"	.macro	mrs_s, rt, sreg\n"
-	__emit_inst(0xd5200000|(\\sreg)|(.L__reg_num_\\rt))
+
+#define DEFINE_MRS_S						\
+	__DEFINE_MRS_MSR_S_REGNUM				\
+"	.macro	mrs_s, rt, sreg\n"				\
+	__emit_inst(0xd5200000|(\\sreg)|(.L__reg_num_\\rt))	\
 "	.endm\n"
-"\n"
-"	.macro	msr_s, sreg, rt\n"
-	__emit_inst(0xd5000000|(\\sreg)|(.L__reg_num_\\rt))
+
+#define DEFINE_MSR_S						\
+	__DEFINE_MRS_MSR_S_REGNUM				\
+"	.macro	msr_s, sreg, rt\n"				\
+	__emit_inst(0xd5000000|(\\sreg)|(.L__reg_num_\\rt))	\
 "	.endm\n"
-);
+
+#define UNDEFINE_MRS_S						\
+"	.purgem	mrs_s\n"
+
+#define UNDEFINE_MSR_S						\
+"	.purgem	msr_s\n"
+
+#define __mrs_s(v, r)						\
+	DEFINE_MRS_S						\
+"	mrs_s " v ", " __stringify(r) "\n"			\
+	UNDEFINE_MRS_S
+
+#define __msr_s(r, v)						\
+	DEFINE_MSR_S						\
+"	msr_s " __stringify(r) ", " v "\n"			\
+	UNDEFINE_MSR_S
 
 /*
  * Unlike read_cpuid, calls to read_sysreg are never expected to be
@@ -736,13 +755,13 @@
  */
 #define read_sysreg_s(r) ({						\
 	u64 __val;							\
-	asm volatile("mrs_s %0, " __stringify(r) : "=r" (__val));	\
+	asm volatile(__mrs_s("%0", r) : "=r" (__val));			\
 	__val;								\
 })
 
 #define write_sysreg_s(v, r) do {					\
 	u64 __val = (u64)(v);						\
-	asm volatile("msr_s " __stringify(r) ", %x0" : : "rZ" (__val));	\
+	asm volatile(__msr_s(r, "%x0") : : "rZ" (__val));		\
 } while (0)
 
 /*
diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h
index cb2c10a..1b37333 100644
--- a/arch/arm64/include/asm/thread_info.h
+++ b/arch/arm64/include/asm/thread_info.h
@@ -43,6 +43,9 @@
 	u64			ttbr0;		/* saved TTBR0_EL1 */
 #endif
 	int			preempt_count;	/* 0 => preemptable, <0 => bug */
+#ifdef CONFIG_SHADOW_CALL_STACK
+	void			*shadow_call_stack;
+#endif
 };
 
 #define thread_saved_pc(tsk)	\
@@ -89,6 +92,7 @@
 #define TIF_SVE			23	/* Scalable Vector Extension in use */
 #define TIF_SVE_VL_INHERIT	24	/* Inherit sve_vl_onexec across exec */
 #define TIF_SSBD		25	/* Wants SSB mitigation */
+#define TIF_TAGGED_ADDR		26	/* Allow tagged user addresses */
 
 #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED)
diff --git a/arch/arm64/include/asm/topology.h b/arch/arm64/include/asm/topology.h
index 49a0fee..8e0a96d 100644
--- a/arch/arm64/include/asm/topology.h
+++ b/arch/arm64/include/asm/topology.h
@@ -42,9 +42,15 @@
 /* Replace task scheduler's default frequency-invariant accounting */
 #define arch_scale_freq_capacity topology_get_freq_scale
 
+/* Replace task scheduler's default max-frequency-invariant accounting */
+#define arch_scale_max_freq_capacity topology_get_max_freq_scale
+
 /* Replace task scheduler's default cpu-invariant accounting */
 #define arch_scale_cpu_capacity topology_get_cpu_scale
 
+/* Enable topology flag updates */
+#define arch_update_cpu_topology topology_update_cpu_topology
+
 #include <asm-generic/topology.h>
 
 #endif /* _ASM_ARM_TOPOLOGY_H */
diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h
index e66b0fc..16969bc 100644
--- a/arch/arm64/include/asm/uaccess.h
+++ b/arch/arm64/include/asm/uaccess.h
@@ -76,6 +76,15 @@
 {
 	unsigned long ret, limit = current_thread_info()->addr_limit;
 
+	/*
+	 * Asynchronous I/O running in a kernel thread does not have the
+	 * TIF_TAGGED_ADDR flag of the process owning the mm, so always untag
+	 * the user address before checking.
+	 */
+	if (IS_ENABLED(CONFIG_ARM64_TAGGED_ADDR_ABI) &&
+	    (current->flags & PF_KTHREAD || test_thread_flag(TIF_TAGGED_ADDR)))
+		addr = untagged_addr(addr);
+
 	__chk_user_ptr(addr);
 	asm volatile(
 	// A + B <= C + 1 for all A,B,C, in four easy steps:
@@ -97,13 +106,6 @@
 	return ret;
 }
 
-/*
- * When dealing with data aborts, watchpoints, or instruction traps we may end
- * up with a tagged userland pointer. Clear the tag to get a sane pointer to
- * pass on to access_ok(), for instance.
- */
-#define untagged_addr(addr)		sign_extend64(addr, 55)
-
 #define access_ok(type, addr, size)	__range_ok(addr, size)
 #define user_addr_max			get_fs
 
@@ -236,7 +238,8 @@
 
 /*
  * Sanitise a uaccess pointer such that it becomes NULL if above the
- * current addr_limit.
+ * current addr_limit. In case the pointer is tagged (has the top byte set),
+ * untag the pointer before checking.
  */
 #define uaccess_mask_ptr(ptr) (__typeof__(ptr))__uaccess_mask_ptr(ptr)
 static inline void __user *__uaccess_mask_ptr(const void __user *ptr)
@@ -244,10 +247,11 @@
 	void __user *safe_ptr;
 
 	asm volatile(
-	"	bics	xzr, %1, %2\n"
+	"	bics	xzr, %3, %2\n"
 	"	csel	%0, %1, xzr, eq\n"
 	: "=&r" (safe_ptr)
-	: "r" (ptr), "r" (current_thread_info()->addr_limit)
+	: "r" (ptr), "r" (current_thread_info()->addr_limit),
+	  "r" (untagged_addr(ptr))
 	: "cc");
 
 	csdb();
diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h
index d520518..47b822e 100644
--- a/arch/arm64/include/asm/unistd.h
+++ b/arch/arm64/include/asm/unistd.h
@@ -44,7 +44,7 @@
 #define __ARM_NR_compat_set_tls		(__ARM_NR_COMPAT_BASE + 5)
 #define __ARM_NR_COMPAT_END		(__ARM_NR_COMPAT_BASE + 0x800)
 
-#define __NR_compat_syscalls		399
+#define __NR_compat_syscalls		435
 #endif
 
 #define __ARCH_WANT_SYS_CLONE
diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h
index 2cd6dcf..d27ae61 100644
--- a/arch/arm64/include/asm/unistd32.h
+++ b/arch/arm64/include/asm/unistd32.h
@@ -819,6 +819,10 @@
 __SYSCALL(__NR_statx, sys_statx)
 #define __NR_rseq 398
 __SYSCALL(__NR_rseq, sys_rseq)
+#define __NR_pidfd_send_signal 424
+__SYSCALL(__NR_pidfd_send_signal, sys_pidfd_send_signal)
+#define __NR_pidfd_open 434
+__SYSCALL(__NR_pidfd_open, sys_pidfd_open)
 
 /*
  * Please add new compat syscalls above this comment and update
diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
index 4c8b13b..17408dc 100644
--- a/arch/arm64/kernel/Makefile
+++ b/arch/arm64/kernel/Makefile
@@ -57,6 +57,7 @@
 arm64-obj-$(CONFIG_CRASH_CORE)		+= crash_core.o
 arm64-obj-$(CONFIG_ARM_SDE_INTERFACE)	+= sdei.o
 arm64-obj-$(CONFIG_ARM64_SSBD)		+= ssbd.o
+arm64-obj-$(CONFIG_SHADOW_CALL_STACK)	+= scs.o
 
 obj-y					+= $(arm64-obj-y) vdso/ probes/
 obj-m					+= $(arm64-obj-m)
diff --git a/arch/arm64/kernel/alternative.c b/arch/arm64/kernel/alternative.c
index b5d6039..845f9bd 100644
--- a/arch/arm64/kernel/alternative.c
+++ b/arch/arm64/kernel/alternative.c
@@ -145,7 +145,7 @@
 	} while (cur += d_size, cur < end);
 }
 
-static void __apply_alternatives(void *alt_region, bool is_module)
+static void __nocfi __apply_alternatives(void *alt_region, bool is_module)
 {
 	struct alt_instr *alt;
 	struct alt_region *region = alt_region;
diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c
index 92fba85..87c3d49 100644
--- a/arch/arm64/kernel/asm-offsets.c
+++ b/arch/arm64/kernel/asm-offsets.c
@@ -45,6 +45,9 @@
 #ifdef CONFIG_ARM64_SW_TTBR0_PAN
   DEFINE(TSK_TI_TTBR0,		offsetof(struct task_struct, thread_info.ttbr0));
 #endif
+#ifdef CONFIG_SHADOW_CALL_STACK
+  DEFINE(TSK_TI_SCS,		offsetof(struct task_struct, thread_info.shadow_call_stack));
+#endif
   DEFINE(TSK_STACK,		offsetof(struct task_struct, stack));
   BLANK();
   DEFINE(THREAD_CPU_CONTEXT,	offsetof(struct task_struct, thread.cpu_context));
diff --git a/arch/arm64/kernel/cpu-reset.S b/arch/arm64/kernel/cpu-reset.S
index 8021b46..63ccd07 100644
--- a/arch/arm64/kernel/cpu-reset.S
+++ b/arch/arm64/kernel/cpu-reset.S
@@ -45,11 +45,11 @@
 	mov	x0, #HVC_SOFT_RESTART
 	hvc	#0				// no return
 
-1:	mov	x18, x1				// entry
+1:	mov	x8, x1				// entry
 	mov	x0, x2				// arg0
 	mov	x1, x3				// arg1
 	mov	x2, x4				// arg2
-	br	x18
+	br	x8
 ENDPROC(__cpu_soft_restart)
 
 .popsection
diff --git a/arch/arm64/kernel/cpu-reset.h b/arch/arm64/kernel/cpu-reset.h
index fad90e49..f300e757 100644
--- a/arch/arm64/kernel/cpu-reset.h
+++ b/arch/arm64/kernel/cpu-reset.h
@@ -25,7 +25,7 @@
 
 	unsigned long el2_switch = !is_kernel_in_hyp_mode() &&
 		is_hyp_mode_available();
-	restart = (void *)__pa_symbol(__cpu_soft_restart);
+	restart = (void *)__pa_function(__cpu_soft_restart);
 
 	cpu_install_idmap();
 	restart(el2_switch, entry, arg0, arg1, arg2);
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
index 220ebfa..eb18d9a 100644
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@ -960,7 +960,7 @@
 }
 
 #ifdef CONFIG_UNMAP_KERNEL_AT_EL0
-static void
+static void __nocfi
 kpti_install_ng_mappings(const struct arm64_cpu_capabilities *__unused)
 {
 	typedef void (kpti_remap_fn)(int, int, phys_addr_t);
@@ -973,7 +973,7 @@
 	if (kpti_applied)
 		return;
 
-	remap_fn = (void *)__pa_symbol(idmap_kpti_install_ng_mappings);
+	remap_fn = (void *)__pa_function(idmap_kpti_install_ng_mappings);
 
 	cpu_install_idmap();
 	remap_fn(cpu, num_online_cpus(), __pa_symbol(swapper_pg_dir));
diff --git a/arch/arm64/kernel/efi-rt-wrapper.S b/arch/arm64/kernel/efi-rt-wrapper.S
index 05235eb..f5cea7b 100644
--- a/arch/arm64/kernel/efi-rt-wrapper.S
+++ b/arch/arm64/kernel/efi-rt-wrapper.S
@@ -37,5 +37,14 @@
 	ldp	x29, x30, [sp], #32
 	b.ne	0f
 	ret
-0:	b	efi_handle_corrupted_x18	// tail call
+0:
+#ifdef CONFIG_SHADOW_CALL_STACK
+	/*
+	 * Restore x18 before returning to instrumented code. This is
+	 * safe because the wrapper is called with preemption disabled and
+	 * a separate shadow stack is used for interrupts.
+	 */
+	mov	x18, x2
+#endif
+	b	efi_handle_corrupted_x18	// tail call
 ENDPROC(__efi_rt_asm_wrapper)
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
index 5f80038..82f5ee8 100644
--- a/arch/arm64/kernel/entry.S
+++ b/arch/arm64/kernel/entry.S
@@ -183,6 +183,10 @@
 
 	apply_ssbd 1, x22, x23
 
+#ifdef CONFIG_SHADOW_CALL_STACK
+	ldr	x18, [tsk, #TSK_TI_SCS]		// Restore shadow call stack
+	str	xzr, [tsk, #TSK_TI_SCS]		// Limit visibility of saved SCS
+#endif
 	.else
 	add	x21, sp, #S_FRAME_SIZE
 	get_thread_info tsk
@@ -274,6 +278,12 @@
 	ct_user_enter
 	.endif
 
+#ifdef CONFIG_SHADOW_CALL_STACK
+	.if	\el == 0
+	str	x18, [tsk, #TSK_TI_SCS]		// Save shadow call stack
+	.endif
+#endif
+
 #ifdef CONFIG_ARM64_SW_TTBR0_PAN
 	/*
 	 * Restore access to TTBR0_EL1. If returning to EL0, no need for SPSR
@@ -367,6 +377,9 @@
 
 	.macro	irq_stack_entry
 	mov	x19, sp			// preserve the original sp
+#ifdef CONFIG_SHADOW_CALL_STACK
+	mov	x20, x18		// preserve the original shadow stack
+#endif
 
 	/*
 	 * Compare sp with the base of the task stack.
@@ -384,15 +397,24 @@
 
 	/* switch to the irq stack */
 	mov	sp, x26
+
+#ifdef CONFIG_SHADOW_CALL_STACK
+	/* also switch to the irq shadow stack */
+	ldr_this_cpu x18, irq_shadow_call_stack_ptr, x26
+#endif
+
 9998:
 	.endm
 
 	/*
-	 * x19 should be preserved between irq_stack_entry and
-	 * irq_stack_exit.
+	 * The callee-saved regs (x19-x29) should be preserved between
+	 * irq_stack_entry and irq_stack_exit.
 	 */
 	.macro	irq_stack_exit
 	mov	sp, x19
+#ifdef CONFIG_SHADOW_CALL_STACK
+	mov	x18, x20
+#endif
 	.endm
 
 /*
@@ -568,7 +590,7 @@
 	 */
 	mrs	x3, far_el1
 	inherit_daif	pstate=x23, tmp=x2
-	clear_address_tag x0, x3
+	untagged_addr x0, x3
 	mov	x2, sp				// struct pt_regs
 	bl	do_mem_abort
 
@@ -731,7 +753,7 @@
 	mrs	x26, far_el1
 	enable_daif
 	ct_user_exit
-	clear_address_tag x0, x26
+	untagged_addr x0, x26
 	mov	x1, x25
 	mov	x2, sp
 	bl	do_mem_abort
@@ -1060,6 +1082,11 @@
 	ldr	lr, [x8]
 	mov	sp, x9
 	msr	sp_el0, x1
+#ifdef CONFIG_SHADOW_CALL_STACK
+	str	x18, [x0, #TSK_TI_SCS]
+	ldr	x18, [x1, #TSK_TI_SCS]
+	str	xzr, [x1, #TSK_TI_SCS]		// limit visibility of saved SCS
+#endif
 	ret
 ENDPROC(cpu_switch_to)
 NOKPROBE(cpu_switch_to)
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index 06058fb..fac664c 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -37,6 +37,7 @@
 #include <asm/pgtable-hwdef.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
+#include <asm/scs.h>
 #include <asm/smp.h>
 #include <asm/sysreg.h>
 #include <asm/thread_info.h>
@@ -112,6 +113,8 @@
 	 *  x23        stext() .. start_kernel()  physical misalignment/KASLR offset
 	 *  x28        __create_page_tables()     callee preserved temp register
 	 *  x19/x20    __primary_switch()         callee preserved temp registers
+	 *  x24        __primary_switch() .. relocate_kernel()
+	 *                                        current RELR displacement
 	 */
 ENTRY(stext)
 	bl	preserve_boot_args
@@ -417,6 +420,10 @@
 	stp	xzr, x30, [sp, #-16]!
 	mov	x29, sp
 
+#ifdef CONFIG_SHADOW_CALL_STACK
+	adr_l	x18, init_shadow_call_stack	// Set shadow call stack
+#endif
+
 	str_l	x21, __fdt_pointer, x5		// Save FDT pointer
 
 	ldr_l	x4, kimage_vaddr		// Save the offset between
@@ -720,6 +727,10 @@
 	mov	sp, x1
 	ldr	x2, [x0, #CPU_BOOT_TASK]
 	msr	sp_el0, x2
+#ifdef CONFIG_SHADOW_CALL_STACK
+	ldr	x18, [x2, #TSK_TI_SCS]		// set shadow call stack
+	str	xzr, [x2, #TSK_TI_SCS]		// limit visibility of saved SCS
+#endif
 	mov	x29, #0
 	mov	x30, #0
 	b	secondary_start_kernel
@@ -830,14 +841,93 @@
 
 0:	cmp	x9, x10
 	b.hs	1f
-	ldp	x11, x12, [x9], #24
-	ldr	x13, [x9, #-8]
-	cmp	w12, #R_AARCH64_RELATIVE
+	ldp	x12, x13, [x9], #24
+	ldr	x14, [x9, #-8]
+	cmp	w13, #R_AARCH64_RELATIVE
 	b.ne	0b
-	add	x13, x13, x23			// relocate
-	str	x13, [x11, x23]
+	add	x14, x14, x23			// relocate
+	str	x14, [x12, x23]
 	b	0b
-1:	ret
+
+1:
+#ifdef CONFIG_RELR
+	/*
+	 * Apply RELR relocations.
+	 *
+	 * RELR is a compressed format for storing relative relocations. The
+	 * encoded sequence of entries looks like:
+	 * [ AAAAAAAA BBBBBBB1 BBBBBBB1 ... AAAAAAAA BBBBBB1 ... ]
+	 *
+	 * i.e. start with an address, followed by any number of bitmaps. The
+	 * address entry encodes 1 relocation. The subsequent bitmap entries
+	 * encode up to 63 relocations each, at subsequent offsets following
+	 * the last address entry.
+	 *
+	 * The bitmap entries must have 1 in the least significant bit. The
+	 * assumption here is that an address cannot have 1 in lsb. Odd
+	 * addresses are not supported. Any odd addresses are stored in the RELA
+	 * section, which is handled above.
+	 *
+	 * Excluding the least significant bit in the bitmap, each non-zero
+	 * bit in the bitmap represents a relocation to be applied to
+	 * a corresponding machine word that follows the base address
+	 * word. The second least significant bit represents the machine
+	 * word immediately following the initial address, and each bit
+	 * that follows represents the next word, in linear order. As such,
+	 * a single bitmap can encode up to 63 relocations in a 64-bit object.
+	 *
+	 * In this implementation we store the address of the next RELR table
+	 * entry in x9, the address being relocated by the current address or
+	 * bitmap entry in x13 and the address being relocated by the current
+	 * bit in x14.
+	 *
+	 * Because addends are stored in place in the binary, RELR relocations
+	 * cannot be applied idempotently. We use x24 to keep track of the
+	 * currently applied displacement so that we can correctly relocate if
+	 * __relocate_kernel is called twice with non-zero displacements (i.e.
+	 * if there is both a physical misalignment and a KASLR displacement).
+	 */
+	ldr	w9, =__relr_offset		// offset to reloc table
+	ldr	w10, =__relr_size		// size of reloc table
+	add	x9, x9, x11			// __va(.relr)
+	add	x10, x9, x10			// __va(.relr) + sizeof(.relr)
+
+	sub	x15, x23, x24			// delta from previous offset
+	cbz	x15, 7f				// nothing to do if unchanged
+	mov	x24, x23			// save new offset
+
+2:	cmp	x9, x10
+	b.hs	7f
+	ldr	x11, [x9], #8
+	tbnz	x11, #0, 3f			// branch to handle bitmaps
+	add	x13, x11, x23
+	ldr	x12, [x13]			// relocate address entry
+	add	x12, x12, x15
+	str	x12, [x13], #8			// adjust to start of bitmap
+	b	2b
+
+3:	mov	x14, x13
+4:	lsr	x11, x11, #1
+	cbz	x11, 6f
+	tbz	x11, #0, 5f			// skip bit if not set
+	ldr	x12, [x14]			// relocate bit
+	add	x12, x12, x15
+	str	x12, [x14]
+
+5:	add	x14, x14, #8			// move to next bit's address
+	b	4b
+
+6:	/*
+	 * Move to the next bitmap's address. 8 is the word size, and 63 is the
+	 * number of significant bits in a bitmap entry.
+	 */
+	add	x13, x13, #(8 * 63)
+	b	2b
+
+7:
+#endif
+	ret
+
 ENDPROC(__relocate_kernel)
 #endif
 
@@ -849,6 +939,9 @@
 
 	bl	__enable_mmu
 #ifdef CONFIG_RELOCATABLE
+#ifdef CONFIG_RELR
+	mov	x24, #0				// no RELR displacement yet
+#endif
 	bl	__relocate_kernel
 #ifdef CONFIG_RANDOMIZE_BASE
 	ldr	x8, =__primary_switched
diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c
index 92fa817..c4ac832 100644
--- a/arch/arm64/kernel/irq.c
+++ b/arch/arm64/kernel/irq.c
@@ -30,6 +30,7 @@
 #include <linux/seq_file.h>
 #include <linux/vmalloc.h>
 #include <asm/vmap_stack.h>
+#include <asm/scs.h>
 
 unsigned long irq_err_count;
 
@@ -72,6 +73,7 @@
 void __init init_IRQ(void)
 {
 	init_irq_stacks();
+	scs_init_irq();
 	irqchip_init();
 	if (!handle_arch_irq)
 		panic("No interrupt controller found.");
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index d668c13..195042e 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -30,6 +30,7 @@
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/stddef.h>
+#include <linux/sysctl.h>
 #include <linux/unistd.h>
 #include <linux/user.h>
 #include <linux/delay.h>
@@ -49,6 +50,7 @@
 #include <trace/events/power.h>
 #include <linux/percpu.h>
 #include <linux/thread_info.h>
+#include <linux/prctl.h>
 
 #include <asm/alternative.h>
 #include <asm/compat.h>
@@ -57,6 +59,7 @@
 #include <asm/fpsimd.h>
 #include <asm/mmu_context.h>
 #include <asm/processor.h>
+#include <asm/scs.h>
 #include <asm/stacktrace.h>
 
 #ifdef CONFIG_STACKPROTECTOR
@@ -269,11 +272,18 @@
 	}
 }
 
+static void flush_tagged_addr_state(void)
+{
+	if (IS_ENABLED(CONFIG_ARM64_TAGGED_ADDR_ABI))
+		clear_thread_flag(TIF_TAGGED_ADDR);
+}
+
 void flush_thread(void)
 {
 	fpsimd_flush_thread();
 	tls_thread_flush();
 	flush_ptrace_hw_breakpoint(current);
+	flush_tagged_addr_state();
 }
 
 void release_thread(struct task_struct *dead_task)
@@ -454,6 +464,7 @@
 	entry_task_switch(next);
 	uao_thread_switch(next);
 	ssbs_thread_switch(next);
+	scs_overflow_check(next);
 
 	/*
 	 * Complete any pending TLB or cache maintenance on this CPU in case
@@ -544,3 +555,70 @@
 }
 EXPORT_SYMBOL(stackleak_check_alloca);
 #endif
+
+#ifdef CONFIG_ARM64_TAGGED_ADDR_ABI
+/*
+ * Control the relaxed ABI allowing tagged user addresses into the kernel.
+ */
+static unsigned int tagged_addr_disabled;
+
+long set_tagged_addr_ctrl(unsigned long arg)
+{
+	if (is_compat_task())
+		return -EINVAL;
+	if (arg & ~PR_TAGGED_ADDR_ENABLE)
+		return -EINVAL;
+
+	/*
+	 * Do not allow the enabling of the tagged address ABI if globally
+	 * disabled via sysctl abi.tagged_addr_disabled.
+	 */
+	if (arg & PR_TAGGED_ADDR_ENABLE && tagged_addr_disabled)
+		return -EINVAL;
+
+	update_thread_flag(TIF_TAGGED_ADDR, arg & PR_TAGGED_ADDR_ENABLE);
+
+	return 0;
+}
+
+long get_tagged_addr_ctrl(void)
+{
+	if (is_compat_task())
+		return -EINVAL;
+
+	if (test_thread_flag(TIF_TAGGED_ADDR))
+		return PR_TAGGED_ADDR_ENABLE;
+
+	return 0;
+}
+
+/*
+ * Global sysctl to disable the tagged user addresses support. This control
+ * only prevents the tagged address ABI enabling via prctl() and does not
+ * disable it for tasks that already opted in to the relaxed ABI.
+ */
+static int zero;
+static int one = 1;
+
+static struct ctl_table tagged_addr_sysctl_table[] = {
+	{
+		.procname	= "tagged_addr_disabled",
+		.mode		= 0644,
+		.data		= &tagged_addr_disabled,
+		.maxlen		= sizeof(int),
+		.proc_handler	= proc_dointvec_minmax,
+		.extra1		= &zero,
+		.extra2		= &one,
+	},
+	{ }
+};
+
+static int __init tagged_addr_init(void)
+{
+	if (!register_sysctl("abi", tagged_addr_sysctl_table))
+		return -EINVAL;
+	return 0;
+}
+
+core_initcall(tagged_addr_init);
+#endif	/* CONFIG_ARM64_TAGGED_ADDR_ABI */
diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index 3856d51..73d5ac3 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -46,7 +46,8 @@
 
 static int cpu_psci_cpu_boot(unsigned int cpu)
 {
-	int err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa_symbol(secondary_entry));
+	int err = psci_ops.cpu_on(cpu_logical_map(cpu),
+				  __pa_function(secondary_entry));
 	if (err)
 		pr_err("failed to boot CPU%d (%d)\n", cpu, err);
 
diff --git a/arch/arm64/kernel/scs.c b/arch/arm64/kernel/scs.c
new file mode 100644
index 0000000..eaadf54
--- /dev/null
+++ b/arch/arm64/kernel/scs.c
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Shadow Call Stack support.
+ *
+ * Copyright (C) 2019 Google LLC
+ */
+
+#include <linux/percpu.h>
+#include <linux/vmalloc.h>
+#include <asm/pgtable.h>
+#include <asm/scs.h>
+
+DEFINE_PER_CPU(unsigned long *, irq_shadow_call_stack_ptr);
+
+#ifndef CONFIG_SHADOW_CALL_STACK_VMAP
+DEFINE_PER_CPU(unsigned long [SCS_SIZE/sizeof(long)], irq_shadow_call_stack)
+	__aligned(SCS_SIZE);
+#endif
+
+void scs_init_irq(void)
+{
+	int cpu;
+
+	for_each_possible_cpu(cpu) {
+#ifdef CONFIG_SHADOW_CALL_STACK_VMAP
+		unsigned long *p;
+
+		p = __vmalloc_node_range(PAGE_SIZE, SCS_SIZE,
+					 VMALLOC_START, VMALLOC_END,
+					 GFP_SCS, PAGE_KERNEL,
+					 0, cpu_to_node(cpu),
+					 __builtin_return_address(0));
+
+		per_cpu(irq_shadow_call_stack_ptr, cpu) = p;
+#else
+		per_cpu(irq_shadow_call_stack_ptr, cpu) =
+			per_cpu(irq_shadow_call_stack, cpu);
+#endif /* CONFIG_SHADOW_CALL_STACK_VMAP */
+	}
+}
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index b3354ff..61d3bdb0 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -293,6 +293,11 @@
 
 	setup_machine_fdt(__fdt_pointer);
 
+	/*
+	 * Initialise the static keys early as they may be enabled by the
+	 * cpufeature code and early parameters.
+	 */
+	jump_label_init();
 	parse_early_param();
 
 	/*
@@ -339,6 +344,9 @@
 	smp_init_cpus();
 	smp_build_mpidr_hash();
 
+	/* Init percpu seeds for random tags after cpus are set up. */
+	kasan_init_tags();
+
 #ifdef CONFIG_ARM64_SW_TTBR0_PAN
 	/*
 	 * Make sure init_thread_info.ttbr0 always generates translation
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index 52aa51f..16356bc 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -54,6 +54,7 @@
 #include <asm/pgtable.h>
 #include <asm/pgalloc.h>
 #include <asm/processor.h>
+#include <asm/scs.h>
 #include <asm/smp_plat.h>
 #include <asm/sections.h>
 #include <asm/tlbflush.h>
@@ -349,6 +350,9 @@
 {
 	unsigned int cpu = smp_processor_id();
 
+	/* Save the shadow stack pointer before exiting the idle task */
+	scs_save(current);
+
 	idle_task_exit();
 
 	local_daif_mask();
@@ -414,11 +418,6 @@
 void __init smp_prepare_boot_cpu(void)
 {
 	set_my_cpu_offset(per_cpu_offset(smp_processor_id()));
-	/*
-	 * Initialise the static keys early as they may be enabled by the
-	 * cpufeature code.
-	 */
-	jump_label_init();
 	cpuinfo_store_boot_cpu();
 }
 
diff --git a/arch/arm64/kernel/smp_spin_table.c b/arch/arm64/kernel/smp_spin_table.c
index 9303465..1ba281d 100644
--- a/arch/arm64/kernel/smp_spin_table.c
+++ b/arch/arm64/kernel/smp_spin_table.c
@@ -99,7 +99,7 @@
 	 * boot-loader's endianess before jumping. This is mandated by
 	 * the boot protocol.
 	 */
-	writeq_relaxed(__pa_symbol(secondary_holding_pen), release_addr);
+	writeq_relaxed(__pa_function(secondary_holding_pen), release_addr);
 	__flush_dcache_area((__force void *)release_addr,
 			    sizeof(*release_addr));
 
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index c8dc3a3..178b901 100644
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -35,6 +35,7 @@
 #include <linux/sizes.h>
 #include <linux/syscalls.h>
 #include <linux/mm_types.h>
+#include <linux/kasan.h>
 
 #include <asm/atomic.h>
 #include <asm/bug.h>
@@ -790,6 +791,58 @@
 	.fn = bug_handler,
 };
 
+#ifdef CONFIG_KASAN_SW_TAGS
+
+#define KASAN_ESR_RECOVER	0x20
+#define KASAN_ESR_WRITE	0x10
+#define KASAN_ESR_SIZE_MASK	0x0f
+#define KASAN_ESR_SIZE(esr)	(1 << ((esr) & KASAN_ESR_SIZE_MASK))
+
+static int kasan_handler(struct pt_regs *regs, unsigned int esr)
+{
+	bool recover = esr & KASAN_ESR_RECOVER;
+	bool write = esr & KASAN_ESR_WRITE;
+	size_t size = KASAN_ESR_SIZE(esr);
+	u64 addr = regs->regs[0];
+	u64 pc = regs->pc;
+
+	if (user_mode(regs))
+		return DBG_HOOK_ERROR;
+
+	kasan_report(addr, size, write, pc);
+
+	/*
+	 * The instrumentation allows to control whether we can proceed after
+	 * a crash was detected. This is done by passing the -recover flag to
+	 * the compiler. Disabling recovery allows to generate more compact
+	 * code.
+	 *
+	 * Unfortunately disabling recovery doesn't work for the kernel right
+	 * now. KASAN reporting is disabled in some contexts (for example when
+	 * the allocator accesses slab object metadata; this is controlled by
+	 * current->kasan_depth). All these accesses are detected by the tool,
+	 * even though the reports for them are not printed.
+	 *
+	 * This is something that might be fixed at some point in the future.
+	 */
+	if (!recover)
+		die("Oops - KASAN", regs, 0);
+
+	/* If thread survives, skip over the brk instruction and continue: */
+	arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
+	return DBG_HOOK_HANDLED;
+}
+
+#define KASAN_ESR_VAL (0xf2000000 | KASAN_BRK_IMM)
+#define KASAN_ESR_MASK 0xffffff00
+
+static struct break_hook kasan_break_hook = {
+	.esr_val = KASAN_ESR_VAL,
+	.esr_mask = KASAN_ESR_MASK,
+	.fn = kasan_handler,
+};
+#endif
+
 /*
  * Initial handler for AArch64 BRK exceptions
  * This handler only used until debug_traps_init().
@@ -797,6 +850,10 @@
 int __init early_brk64(unsigned long addr, unsigned int esr,
 		struct pt_regs *regs)
 {
+#ifdef CONFIG_KASAN_SW_TAGS
+	if ((esr & KASAN_ESR_MASK) == KASAN_ESR_VAL)
+		return kasan_handler(regs, esr) != DBG_HOOK_HANDLED;
+#endif
 	return bug_handler(regs, esr) != DBG_HOOK_HANDLED;
 }
 
@@ -804,4 +861,7 @@
 void __init trap_init(void)
 {
 	register_break_hook(&bug_break_hook);
+#ifdef CONFIG_KASAN_SW_TAGS
+	register_break_hook(&kasan_break_hook);
+#endif
 }
diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makefile
index b215c71..f7620d3 100644
--- a/arch/arm64/kernel/vdso/Makefile
+++ b/arch/arm64/kernel/vdso/Makefile
@@ -15,6 +15,9 @@
 ccflags-y := -shared -fno-common -fno-builtin
 ccflags-y += -nostdlib -Wl,-soname=linux-vdso.so.1 \
 		$(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
+ccflags-y += $(DISABLE_LTO)
+
+CFLAGS_REMOVE_vgettimeofday.o += $(CC_FLAGS_SCS)
 
 # Disable gcov profiling for VDSO code
 GCOV_PROFILE := n
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
index 74e469f..78b2fec 100644
--- a/arch/arm64/kernel/vmlinux.lds.S
+++ b/arch/arm64/kernel/vmlinux.lds.S
@@ -184,6 +184,15 @@
 	__rela_offset	= ABSOLUTE(ADDR(.rela.dyn) - KIMAGE_VADDR);
 	__rela_size	= SIZEOF(.rela.dyn);
 
+#ifdef CONFIG_RELR
+	.relr.dyn : ALIGN(8) {
+		*(.relr.dyn)
+	}
+
+	__relr_offset	= ABSOLUTE(ADDR(.relr.dyn) - KIMAGE_VADDR);
+	__relr_size	= SIZEOF(.relr.dyn);
+#endif
+
 	. = ALIGN(SEGMENT_ALIGN);
 	__initdata_end = .;
 	__init_end = .;
diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig
index 47b23bf..86fe9b3 100644
--- a/arch/arm64/kvm/Kconfig
+++ b/arch/arm64/kvm/Kconfig
@@ -23,7 +23,6 @@
 	depends on OF
 	select MMU_NOTIFIER
 	select PREEMPT_NOTIFIERS
-	select ANON_INODES
 	select HAVE_KVM_CPU_RELAX_INTERCEPT
 	select HAVE_KVM_ARCH_TLB_FLUSH_ALL
 	select KVM_MMIO
diff --git a/arch/arm64/kvm/hyp/Makefile b/arch/arm64/kvm/hyp/Makefile
index feef06f..1f1282b 100644
--- a/arch/arm64/kvm/hyp/Makefile
+++ b/arch/arm64/kvm/hyp/Makefile
@@ -4,7 +4,12 @@
 #
 
 ccflags-y += -fno-stack-protector -DDISABLE_BRANCH_PROFILING \
-		$(DISABLE_STACKLEAK_PLUGIN)
+		$(DISABLE_STACKLEAK_PLUGIN) \
+		$(DISABLE_CFI)
+
+ifeq ($(cc-name),clang)
+ccflags-y += -fno-jump-tables
+endif
 
 KVM=../../../../virt/kvm
 
@@ -29,3 +34,6 @@
 KASAN_SANITIZE	:= n
 UBSAN_SANITIZE	:= n
 KCOV_INSTRUMENT	:= n
+
+# remove the SCS flags from all objects in this directory
+KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_SCS), $(KBUILD_CFLAGS))
diff --git a/arch/arm64/kvm/hyp/entry.S b/arch/arm64/kvm/hyp/entry.S
index fad1e16..2cee0c3 100644
--- a/arch/arm64/kvm/hyp/entry.S
+++ b/arch/arm64/kvm/hyp/entry.S
@@ -31,7 +31,12 @@
 	.text
 	.pushsection	.hyp.text, "ax"
 
+/*
+ * We treat x18 as callee-saved as the host may use it as a platform
+ * register (e.g. for shadow call stack).
+ */
 .macro save_callee_saved_regs ctxt
+	str	x18,      [\ctxt, #CPU_XREG_OFFSET(18)]
 	stp	x19, x20, [\ctxt, #CPU_XREG_OFFSET(19)]
 	stp	x21, x22, [\ctxt, #CPU_XREG_OFFSET(21)]
 	stp	x23, x24, [\ctxt, #CPU_XREG_OFFSET(23)]
@@ -41,6 +46,8 @@
 .endm
 
 .macro restore_callee_saved_regs ctxt
+	// We require \ctxt is not x18-x28
+	ldr	x18,      [\ctxt, #CPU_XREG_OFFSET(18)]
 	ldp	x19, x20, [\ctxt, #CPU_XREG_OFFSET(19)]
 	ldp	x21, x22, [\ctxt, #CPU_XREG_OFFSET(21)]
 	ldp	x23, x24, [\ctxt, #CPU_XREG_OFFSET(23)]
@@ -57,29 +64,26 @@
 	// x0: vcpu
 	// x1: host context
 	// x2-x17: clobbered by macros
-	// x18: guest context
+	// x29: guest context
 
 	// Store the host regs
 	save_callee_saved_regs x1
 
-	add	x18, x0, #VCPU_CONTEXT
+	add	x29, x0, #VCPU_CONTEXT
 
 	// Restore guest regs x0-x17
-	ldp	x0, x1,   [x18, #CPU_XREG_OFFSET(0)]
-	ldp	x2, x3,   [x18, #CPU_XREG_OFFSET(2)]
-	ldp	x4, x5,   [x18, #CPU_XREG_OFFSET(4)]
-	ldp	x6, x7,   [x18, #CPU_XREG_OFFSET(6)]
-	ldp	x8, x9,   [x18, #CPU_XREG_OFFSET(8)]
-	ldp	x10, x11, [x18, #CPU_XREG_OFFSET(10)]
-	ldp	x12, x13, [x18, #CPU_XREG_OFFSET(12)]
-	ldp	x14, x15, [x18, #CPU_XREG_OFFSET(14)]
-	ldp	x16, x17, [x18, #CPU_XREG_OFFSET(16)]
+	ldp	x0, x1,   [x29, #CPU_XREG_OFFSET(0)]
+	ldp	x2, x3,   [x29, #CPU_XREG_OFFSET(2)]
+	ldp	x4, x5,   [x29, #CPU_XREG_OFFSET(4)]
+	ldp	x6, x7,   [x29, #CPU_XREG_OFFSET(6)]
+	ldp	x8, x9,   [x29, #CPU_XREG_OFFSET(8)]
+	ldp	x10, x11, [x29, #CPU_XREG_OFFSET(10)]
+	ldp	x12, x13, [x29, #CPU_XREG_OFFSET(12)]
+	ldp	x14, x15, [x29, #CPU_XREG_OFFSET(14)]
+	ldp	x16, x17, [x29, #CPU_XREG_OFFSET(16)]
 
-	// Restore guest regs x19-x29, lr
-	restore_callee_saved_regs x18
-
-	// Restore guest reg x18
-	ldr	x18,      [x18, #CPU_XREG_OFFSET(18)]
+	// Restore guest regs x18-x29, lr
+	restore_callee_saved_regs x29
 
 	// Do not touch any register after this!
 	eret
@@ -101,7 +105,7 @@
 	// Retrieve the guest regs x0-x1 from the stack
 	ldp	x2, x3, [sp], #16	// x0, x1
 
-	// Store the guest regs x0-x1 and x4-x18
+	// Store the guest regs x0-x1 and x4-x17
 	stp	x2, x3,   [x1, #CPU_XREG_OFFSET(0)]
 	stp	x4, x5,   [x1, #CPU_XREG_OFFSET(4)]
 	stp	x6, x7,   [x1, #CPU_XREG_OFFSET(6)]
@@ -110,9 +114,8 @@
 	stp	x12, x13, [x1, #CPU_XREG_OFFSET(12)]
 	stp	x14, x15, [x1, #CPU_XREG_OFFSET(14)]
 	stp	x16, x17, [x1, #CPU_XREG_OFFSET(16)]
-	str	x18,      [x1, #CPU_XREG_OFFSET(18)]
 
-	// Store the guest regs x19-x29, lr
+	// Store the guest regs x18-x29, lr
 	save_callee_saved_regs x1
 
 	get_host_ctxt	x2, x3
diff --git a/arch/arm64/lib/Makefile b/arch/arm64/lib/Makefile
index 5df2d61..33ce9a5 100644
--- a/arch/arm64/lib/Makefile
+++ b/arch/arm64/lib/Makefile
@@ -11,7 +11,12 @@
 # patching of the bl instruction in the caller with an atomic instruction
 # when supported by the CPU. Result and argument registers are handled
 # correctly, based on the function prototype.
+ifeq ($(CONFIG_LD_IS_LLD), y)
+# https://bugs.llvm.org/show_bug.cgi?id=35841
+obj-$(CONFIG_ARM64_LSE_ATOMICS) += atomic_ll_sc.o
+else
 lib-$(CONFIG_ARM64_LSE_ATOMICS) += atomic_ll_sc.o
+endif
 CFLAGS_atomic_ll_sc.o	:= -ffixed-x1 -ffixed-x2        		\
 		   -ffixed-x3 -ffixed-x4 -ffixed-x5 -ffixed-x6		\
 		   -ffixed-x7 -fcall-saved-x8 -fcall-saved-x9		\
diff --git a/arch/arm64/lib/copy_page.S b/arch/arm64/lib/copy_page.S
index 076c437..30f9316 100644
--- a/arch/arm64/lib/copy_page.S
+++ b/arch/arm64/lib/copy_page.S
@@ -45,45 +45,45 @@
 	ldp	x14, x15, [x1, #96]
 	ldp	x16, x17, [x1, #112]
 
-	mov	x18, #(PAGE_SIZE - 128)
+	add	x0, x0, #256
 	add	x1, x1, #128
 1:
-	subs	x18, x18, #128
+	tst	x0, #(PAGE_SIZE - 1)
 
 alternative_if ARM64_HAS_NO_HW_PREFETCH
 	prfm	pldl1strm, [x1, #384]
 alternative_else_nop_endif
 
-	stnp	x2, x3, [x0]
+	stnp	x2, x3, [x0, #-256]
 	ldp	x2, x3, [x1]
-	stnp	x4, x5, [x0, #16]
+	stnp	x4, x5, [x0, #16 - 256]
 	ldp	x4, x5, [x1, #16]
-	stnp	x6, x7, [x0, #32]
+	stnp	x6, x7, [x0, #32 - 256]
 	ldp	x6, x7, [x1, #32]
-	stnp	x8, x9, [x0, #48]
+	stnp	x8, x9, [x0, #48 - 256]
 	ldp	x8, x9, [x1, #48]
-	stnp	x10, x11, [x0, #64]
+	stnp	x10, x11, [x0, #64 - 256]
 	ldp	x10, x11, [x1, #64]
-	stnp	x12, x13, [x0, #80]
+	stnp	x12, x13, [x0, #80 - 256]
 	ldp	x12, x13, [x1, #80]
-	stnp	x14, x15, [x0, #96]
+	stnp	x14, x15, [x0, #96 - 256]
 	ldp	x14, x15, [x1, #96]
-	stnp	x16, x17, [x0, #112]
+	stnp	x16, x17, [x0, #112 - 256]
 	ldp	x16, x17, [x1, #112]
 
 	add	x0, x0, #128
 	add	x1, x1, #128
 
-	b.gt	1b
+	b.ne	1b
 
-	stnp	x2, x3, [x0]
-	stnp	x4, x5, [x0, #16]
-	stnp	x6, x7, [x0, #32]
-	stnp	x8, x9, [x0, #48]
-	stnp	x10, x11, [x0, #64]
-	stnp	x12, x13, [x0, #80]
-	stnp	x14, x15, [x0, #96]
-	stnp	x16, x17, [x0, #112]
+	stnp	x2, x3, [x0, #-256]
+	stnp	x4, x5, [x0, #16 - 256]
+	stnp	x6, x7, [x0, #32 - 256]
+	stnp	x8, x9, [x0, #48 - 256]
+	stnp	x10, x11, [x0, #64 - 256]
+	stnp	x12, x13, [x0, #80 - 256]
+	stnp	x14, x15, [x0, #96 - 256]
+	stnp	x16, x17, [x0, #112 - 256]
 
 	ret
 ENDPROC(copy_page)
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 88cf0a0..6e8a24f 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -39,6 +39,7 @@
 #include <asm/exception.h>
 #include <asm/debug-monitors.h>
 #include <asm/esr.h>
+#include <asm/kasan.h>
 #include <asm/sysreg.h>
 #include <asm/system_misc.h>
 #include <asm/pgtable.h>
@@ -125,6 +126,18 @@
 		data_abort_decode(esr);
 }
 
+static inline bool is_ttbr0_addr(unsigned long addr)
+{
+	/* entry assembly clears tags for TTBR0 addrs */
+	return addr < TASK_SIZE;
+}
+
+static inline bool is_ttbr1_addr(unsigned long addr)
+{
+	/* TTBR1 addresses may have a tag if KASAN_SW_TAGS is in use */
+	return arch_kasan_reset_tag(addr) >= VA_START;
+}
+
 /*
  * Dump out the page tables associated with 'addr' in the currently active mm.
  */
@@ -134,7 +147,7 @@
 	pgd_t *pgdp;
 	pgd_t pgd;
 
-	if (addr < TASK_SIZE) {
+	if (is_ttbr0_addr(addr)) {
 		/* TTBR0 */
 		mm = current->active_mm;
 		if (mm == &init_mm) {
@@ -142,7 +155,7 @@
 				 addr);
 			return;
 		}
-	} else if (addr >= VA_START) {
+	} else if (is_ttbr1_addr(addr)) {
 		/* TTBR1 */
 		mm = &init_mm;
 	} else {
@@ -248,7 +261,7 @@
 	if (fsc_type == ESR_ELx_FSC_PERM)
 		return true;
 
-	if (addr < TASK_SIZE && system_uses_ttbr0_pan())
+	if (is_ttbr0_addr(addr) && system_uses_ttbr0_pan())
 		return fsc_type == ESR_ELx_FSC_FAULT &&
 			(regs->pstate & PSR_PAN_BIT);
 
@@ -313,7 +326,7 @@
 	 * type", so we ignore this wrinkle and just return the translation
 	 * fault.)
 	 */
-	if (current->thread.fault_address >= TASK_SIZE) {
+	if (!is_ttbr0_addr(current->thread.fault_address)) {
 		switch (ESR_ELx_EC(esr)) {
 		case ESR_ELx_EC_DABT_LOW:
 			/*
@@ -454,7 +467,7 @@
 		mm_flags |= FAULT_FLAG_WRITE;
 	}
 
-	if (addr < TASK_SIZE && is_el1_permission_fault(esr, regs, addr)) {
+	if (is_ttbr0_addr(addr) && is_el1_permission_fault(esr, regs, addr)) {
 		/* regs->orig_addr_limit may be 0 if we entered from EL0 */
 		if (regs->orig_addr_limit == KERNEL_DS)
 			die_kernel_fault("access to user memory with fs=KERNEL_DS",
@@ -604,7 +617,7 @@
 					  unsigned int esr,
 					  struct pt_regs *regs)
 {
-	if (addr < TASK_SIZE)
+	if (is_ttbr0_addr(addr))
 		return do_page_fault(addr, esr, regs);
 
 	do_bad_area(addr, esr, regs);
@@ -768,7 +781,7 @@
 	 * re-enabled IRQs. If the address is a kernel address, apply
 	 * BP hardening prior to enabling IRQs and pre-emption.
 	 */
-	if (addr > TASK_SIZE)
+	if (!is_ttbr0_addr(addr))
 		arm64_apply_bp_hardening();
 
 	local_irq_enable();
@@ -783,7 +796,7 @@
 	struct siginfo info;
 
 	if (user_mode(regs)) {
-		if (instruction_pointer(regs) > TASK_SIZE)
+		if (!is_ttbr0_addr(instruction_pointer(regs)))
 			arm64_apply_bp_hardening();
 		local_irq_enable();
 	}
@@ -875,7 +888,7 @@
 	if (interrupts_enabled(regs))
 		trace_hardirqs_off();
 
-	if (user_mode(regs) && pc > TASK_SIZE)
+	if (user_mode(regs) && !is_ttbr0_addr(pc))
 		arm64_apply_bp_hardening();
 
 	if (!inf->fn(addr_if_watchpoint, esr, regs)) {
diff --git a/arch/arm64/mm/kasan_init.c b/arch/arm64/mm/kasan_init.c
index 1214587..5ef034a 100644
--- a/arch/arm64/mm/kasan_init.c
+++ b/arch/arm64/mm/kasan_init.c
@@ -40,7 +40,7 @@
 {
 	void *p = memblock_virt_alloc_try_nid(PAGE_SIZE, PAGE_SIZE,
 					      __pa(MAX_DMA_ADDRESS),
-					      MEMBLOCK_ALLOC_ACCESSIBLE, node);
+					      MEMBLOCK_ALLOC_KASAN, node);
 	return __pa(p);
 }
 
@@ -48,8 +48,9 @@
 				      bool early)
 {
 	if (pmd_none(READ_ONCE(*pmdp))) {
-		phys_addr_t pte_phys = early ? __pa_symbol(kasan_zero_pte)
-					     : kasan_alloc_zeroed_page(node);
+		phys_addr_t pte_phys = early ?
+				__pa_symbol(kasan_early_shadow_pte)
+					: kasan_alloc_zeroed_page(node);
 		__pmd_populate(pmdp, pte_phys, PMD_TYPE_TABLE);
 	}
 
@@ -61,8 +62,9 @@
 				      bool early)
 {
 	if (pud_none(READ_ONCE(*pudp))) {
-		phys_addr_t pmd_phys = early ? __pa_symbol(kasan_zero_pmd)
-					     : kasan_alloc_zeroed_page(node);
+		phys_addr_t pmd_phys = early ?
+				__pa_symbol(kasan_early_shadow_pmd)
+					: kasan_alloc_zeroed_page(node);
 		__pud_populate(pudp, pmd_phys, PMD_TYPE_TABLE);
 	}
 
@@ -73,8 +75,9 @@
 				      bool early)
 {
 	if (pgd_none(READ_ONCE(*pgdp))) {
-		phys_addr_t pud_phys = early ? __pa_symbol(kasan_zero_pud)
-					     : kasan_alloc_zeroed_page(node);
+		phys_addr_t pud_phys = early ?
+				__pa_symbol(kasan_early_shadow_pud)
+					: kasan_alloc_zeroed_page(node);
 		__pgd_populate(pgdp, pud_phys, PMD_TYPE_TABLE);
 	}
 
@@ -88,8 +91,11 @@
 	pte_t *ptep = kasan_pte_offset(pmdp, addr, node, early);
 
 	do {
-		phys_addr_t page_phys = early ? __pa_symbol(kasan_zero_page)
-					      : kasan_alloc_zeroed_page(node);
+		phys_addr_t page_phys = early ?
+				__pa_symbol(kasan_early_shadow_page)
+					: kasan_alloc_zeroed_page(node);
+		if (!early)
+			memset(__va(page_phys), KASAN_SHADOW_INIT, PAGE_SIZE);
 		next = addr + PAGE_SIZE;
 		set_pte(ptep, pfn_pte(__phys_to_pfn(page_phys), PAGE_KERNEL));
 	} while (ptep++, addr = next, addr != end && pte_none(READ_ONCE(*ptep)));
@@ -192,7 +198,7 @@
 
 	/*
 	 * We are going to perform proper setup of shadow memory.
-	 * At first we should unmap early shadow (clear_pgds() call bellow).
+	 * At first we should unmap early shadow (clear_pgds() call below).
 	 * However, instrumented code couldn't execute without shadow memory.
 	 * tmp_pg_dir used to keep early shadow mapped until full shadow
 	 * setup will be finished.
@@ -206,14 +212,14 @@
 	kasan_map_populate(kimg_shadow_start, kimg_shadow_end,
 			   early_pfn_to_nid(virt_to_pfn(lm_alias(_text))));
 
-	kasan_populate_zero_shadow((void *)KASAN_SHADOW_START,
-				   (void *)mod_shadow_start);
-	kasan_populate_zero_shadow((void *)kimg_shadow_end,
-				   kasan_mem_to_shadow((void *)PAGE_OFFSET));
+	kasan_populate_early_shadow((void *)KASAN_SHADOW_START,
+				    (void *)mod_shadow_start);
+	kasan_populate_early_shadow((void *)kimg_shadow_end,
+				    kasan_mem_to_shadow((void *)PAGE_OFFSET));
 
 	if (kimg_shadow_start > mod_shadow_end)
-		kasan_populate_zero_shadow((void *)mod_shadow_end,
-					   (void *)kimg_shadow_start);
+		kasan_populate_early_shadow((void *)mod_shadow_end,
+					    (void *)kimg_shadow_start);
 
 	for_each_memblock(memory, reg) {
 		void *start = (void *)__phys_to_virt(reg->base);
@@ -228,14 +234,15 @@
 	}
 
 	/*
-	 * KAsan may reuse the contents of kasan_zero_pte directly, so we
-	 * should make sure that it maps the zero page read-only.
+	 * KAsan may reuse the contents of kasan_early_shadow_pte directly,
+	 * so we should make sure that it maps the zero page read-only.
 	 */
 	for (i = 0; i < PTRS_PER_PTE; i++)
-		set_pte(&kasan_zero_pte[i],
-			pfn_pte(sym_to_pfn(kasan_zero_page), PAGE_KERNEL_RO));
+		set_pte(&kasan_early_shadow_pte[i],
+			pfn_pte(sym_to_pfn(kasan_early_shadow_page),
+				PAGE_KERNEL_RO));
 
-	memset(kasan_zero_page, 0, PAGE_SIZE);
+	memset(kasan_early_shadow_page, KASAN_SHADOW_INIT, PAGE_SIZE);
 	cpu_replace_ttbr1(lm_alias(swapper_pg_dir));
 
 	/* At this point kasan is fully initialized. Enable error messages */
diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S
index ec6aa18..9c9d739 100644
--- a/arch/arm64/mm/proc.S
+++ b/arch/arm64/mm/proc.S
@@ -47,6 +47,12 @@
 /* PTWs cacheable, inner/outer WBWA */
 #define TCR_CACHE_FLAGS	TCR_IRGN_WBWA | TCR_ORGN_WBWA
 
+#ifdef CONFIG_KASAN_SW_TAGS
+#define TCR_KASAN_FLAGS TCR_TBI1
+#else
+#define TCR_KASAN_FLAGS 0
+#endif
+
 #define MAIR(attr, mt)	((attr) << ((mt) * 8))
 
 /*
@@ -65,6 +71,8 @@
  * cpu_do_suspend - save CPU registers context
  *
  * x0: virtual address of context pointer
+ *
+ * This must be kept in sync with struct cpu_suspend_ctx in <asm/suspend.h>.
  */
 ENTRY(cpu_do_suspend)
 	mrs	x2, tpidr_el0
@@ -89,6 +97,11 @@
 	stp	x8, x9, [x0, #48]
 	stp	x10, x11, [x0, #64]
 	stp	x12, x13, [x0, #80]
+	/*
+	 * Save x18 as it may be used as a platform register, e.g. by shadow
+	 * call stack.
+	 */
+	str	x18, [x0, #96]
 	ret
 ENDPROC(cpu_do_suspend)
 
@@ -105,6 +118,13 @@
 	ldp	x9, x10, [x0, #48]
 	ldp	x11, x12, [x0, #64]
 	ldp	x13, x14, [x0, #80]
+	/*
+	 * Restore x18, as it may be used as a platform register, and clear
+	 * the buffer to minimize the risk of exposure when used for shadow
+	 * call stack.
+	 */
+	ldr	x18, [x0, #96]
+	str	xzr, [x0, #96]
 	msr	tpidr_el0, x2
 	msr	tpidrro_el0, x3
 	msr	contextidr_el1, x4
@@ -258,15 +278,15 @@
 	/* We're the boot CPU. Wait for the others to catch up */
 	sevl
 1:	wfe
-	ldaxr	w18, [flag_ptr]
-	eor	w18, w18, num_cpus
-	cbnz	w18, 1b
+	ldaxr	w17, [flag_ptr]
+	eor	w17, w17, num_cpus
+	cbnz	w17, 1b
 
 	/* We need to walk swapper, so turn off the MMU. */
 	pre_disable_mmu_workaround
-	mrs	x18, sctlr_el1
-	bic	x18, x18, #SCTLR_ELx_M
-	msr	sctlr_el1, x18
+	mrs	x17, sctlr_el1
+	bic	x17, x17, #SCTLR_ELx_M
+	msr	sctlr_el1, x17
 	isb
 
 	/* Everybody is enjoying the idmap, so we can rewrite swapper. */
@@ -289,9 +309,9 @@
 	isb
 
 	/* We're done: fire up the MMU again */
-	mrs	x18, sctlr_el1
-	orr	x18, x18, #SCTLR_ELx_M
-	msr	sctlr_el1, x18
+	mrs	x17, sctlr_el1
+	orr	x17, x17, #SCTLR_ELx_M
+	msr	sctlr_el1, x17
 	isb
 
 	/*
@@ -361,33 +381,9 @@
 	b.ne	do_pte
 	b	next_pmd
 
-	/* Secondary CPUs end up here */
-__idmap_kpti_secondary:
-	/* Uninstall swapper before surgery begins */
-	__idmap_cpu_set_reserved_ttbr1 x18, x17
-
-	/* Increment the flag to let the boot CPU we're ready */
-1:	ldxr	w18, [flag_ptr]
-	add	w18, w18, #1
-	stxr	w17, w18, [flag_ptr]
-	cbnz	w17, 1b
-
-	/* Wait for the boot CPU to finish messing around with swapper */
-	sevl
-1:	wfe
-	ldxr	w18, [flag_ptr]
-	cbnz	w18, 1b
-
-	/* All done, act like nothing happened */
-	msr	ttbr1_el1, swapper_ttb
-	isb
-	ret
-
 	.unreq	cpu
 	.unreq	num_cpus
 	.unreq	swapper_pa
-	.unreq	swapper_ttb
-	.unreq	flag_ptr
 	.unreq	cur_pgdp
 	.unreq	end_pgdp
 	.unreq	pgd
@@ -400,6 +396,31 @@
 	.unreq	cur_ptep
 	.unreq	end_ptep
 	.unreq	pte
+
+	/* Secondary CPUs end up here */
+__idmap_kpti_secondary:
+	/* Uninstall swapper before surgery begins */
+	__idmap_cpu_set_reserved_ttbr1 x16, x17
+
+	/* Increment the flag to let the boot CPU we're ready */
+1:	ldxr	w16, [flag_ptr]
+	add	w16, w16, #1
+	stxr	w17, w16, [flag_ptr]
+	cbnz	w17, 1b
+
+	/* Wait for the boot CPU to finish messing around with swapper */
+	sevl
+1:	wfe
+	ldxr	w16, [flag_ptr]
+	cbnz	w16, 1b
+
+	/* All done, act like nothing happened */
+	msr	ttbr1_el1, swapper_ttb
+	isb
+	ret
+
+	.unreq	swapper_ttb
+	.unreq	flag_ptr
 ENDPROC(idmap_kpti_install_ng_mappings)
 	.popsection
 #endif
@@ -451,7 +472,7 @@
 	 */
 	ldr	x10, =TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SMP_FLAGS | \
 			TCR_TG_FLAGS | TCR_KASLR_FLAGS | TCR_ASID16 | \
-			TCR_TBI0 | TCR_A1
+			TCR_TBI0 | TCR_A1 | TCR_KASAN_FLAGS
 	tcr_set_idmap_t0sz	x10, x9
 
 	/*
diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c
index 7f0258e..dd6b600 100644
--- a/arch/arm64/net/bpf_jit_comp.c
+++ b/arch/arm64/net/bpf_jit_comp.c
@@ -949,3 +949,25 @@
 					   tmp : orig_prog);
 	return prog;
 }
+
+#ifdef CONFIG_CFI_CLANG
+bool arch_bpf_jit_check_func(const struct bpf_prog *prog)
+{
+	const uintptr_t func = (const uintptr_t)prog->bpf_func;
+
+	/*
+	 * bpf_func must be correctly aligned and within the correct region.
+	 * module_alloc places JIT code in the module region, unless
+	 * ARM64_MODULE_PLTS is enabled, in which case we might end up using
+	 * the vmalloc region too.
+	 */
+	if (unlikely(!IS_ALIGNED(func, sizeof(u32))))
+		return false;
+
+	if (IS_ENABLED(CONFIG_ARM64_MODULE_PLTS) &&
+			is_vmalloc_addr(prog->bpf_func))
+		return true;
+
+	return (func >= MODULES_VADDR && func < MODULES_END);
+}
+#endif
diff --git a/arch/mips/configs/generic_defconfig b/arch/mips/configs/generic_defconfig
index 684c9dc..b8a21b9 100644
--- a/arch/mips/configs/generic_defconfig
+++ b/arch/mips/configs/generic_defconfig
@@ -63,7 +63,7 @@
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y
-CONFIG_EXT4_ENCRYPTION=y
+CONFIG_FS_ENCRYPTION=y
 CONFIG_FANOTIFY=y
 CONFIG_FUSE_FS=y
 CONFIG_CUSE=y
diff --git a/arch/mips/kvm/Kconfig b/arch/mips/kvm/Kconfig
index 76b93a9..4d06a29 100644
--- a/arch/mips/kvm/Kconfig
+++ b/arch/mips/kvm/Kconfig
@@ -20,7 +20,6 @@
 	depends on HAVE_KVM
 	select EXPORT_UASM
 	select PREEMPT_NOTIFIERS
-	select ANON_INODES
 	select KVM_GENERIC_DIRTYLOG_READ_PROTECT
 	select HAVE_KVM_VCPU_ASYNC_IOCTL
 	select KVM_MMIO
diff --git a/arch/nds32/configs/defconfig b/arch/nds32/configs/defconfig
index 2546d87..65ce925 100644
--- a/arch/nds32/configs/defconfig
+++ b/arch/nds32/configs/defconfig
@@ -74,7 +74,7 @@
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y
-CONFIG_EXT4_ENCRYPTION=y
+CONFIG_FS_ENCRYPTION=y
 CONFIG_FUSE_FS=y
 CONFIG_MSDOS_FS=y
 CONFIG_VFAT_FS=y
diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig
index 68a0e9d..e058d02 100644
--- a/arch/powerpc/kvm/Kconfig
+++ b/arch/powerpc/kvm/Kconfig
@@ -20,7 +20,6 @@
 config KVM
 	bool
 	select PREEMPT_NOTIFIERS
-	select ANON_INODES
 	select HAVE_KVM_EVENTFD
 	select HAVE_KVM_VCPU_ASYNC_IOCTL
 	select SRCU
diff --git a/arch/powerpc/platforms/cell/cpufreq_spudemand.c b/arch/powerpc/platforms/cell/cpufreq_spudemand.c
index 882944c..5d8e8b6 100644
--- a/arch/powerpc/platforms/cell/cpufreq_spudemand.c
+++ b/arch/powerpc/platforms/cell/cpufreq_spudemand.c
@@ -49,7 +49,7 @@
 	cpu = info->policy->cpu;
 	busy_spus = atomic_read(&cbe_spu_info[cpu_to_node(cpu)].busy_spus);
 
-	CALC_LOAD(info->busy_spus, EXP, busy_spus * FIXED_1);
+	info->busy_spus = calc_load(info->busy_spus, EXP, busy_spus * FIXED_1);
 	pr_debug("cpu %d: busy_spus=%d, info->busy_spus=%ld\n",
 			cpu, busy_spus, info->busy_spus);
 
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c
index c9ef3c5..9fcccb4 100644
--- a/arch/powerpc/platforms/cell/spufs/sched.c
+++ b/arch/powerpc/platforms/cell/spufs/sched.c
@@ -987,9 +987,9 @@
 	unsigned long active_tasks; /* fixed-point */
 
 	active_tasks = count_active_contexts() * FIXED_1;
-	CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks);
-	CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks);
-	CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks);
+	spu_avenrun[0] = calc_load(spu_avenrun[0], EXP_1, active_tasks);
+	spu_avenrun[1] = calc_load(spu_avenrun[1], EXP_5, active_tasks);
+	spu_avenrun[2] = calc_load(spu_avenrun[2], EXP_15, active_tasks);
 }
 
 static void spusched_wake(struct timer_list *unused)
@@ -1071,9 +1071,6 @@
 	}
 }
 
-#define LOAD_INT(x) ((x) >> FSHIFT)
-#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
-
 static int show_spu_loadavg(struct seq_file *s, void *private)
 {
 	int a, b, c;
diff --git a/arch/s390/appldata/appldata_os.c b/arch/s390/appldata/appldata_os.c
index 433a994..54f3756 100644
--- a/arch/s390/appldata/appldata_os.c
+++ b/arch/s390/appldata/appldata_os.c
@@ -25,10 +25,6 @@
 
 #include "appldata.h"
 
-
-#define LOAD_INT(x) ((x) >> FSHIFT)
-#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
-
 /*
  * OS data
  *
diff --git a/arch/s390/configs/debug_defconfig b/arch/s390/configs/debug_defconfig
index 941d8cc..15cdad2 100644
--- a/arch/s390/configs/debug_defconfig
+++ b/arch/s390/configs/debug_defconfig
@@ -492,7 +492,6 @@
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y
-CONFIG_EXT4_ENCRYPTION=y
 CONFIG_JBD2_DEBUG=y
 CONFIG_JFS_FS=m
 CONFIG_JFS_POSIX_ACL=y
@@ -512,6 +511,7 @@
 CONFIG_NILFS2_FS=m
 CONFIG_FS_DAX=y
 CONFIG_EXPORTFS_BLOCK_OPS=y
+CONFIG_FS_ENCRYPTION=y
 CONFIG_FANOTIFY=y
 CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
 CONFIG_QUOTA_NETLINK_INTERFACE=y
diff --git a/arch/s390/configs/performance_defconfig b/arch/s390/configs/performance_defconfig
index eb6f75f..e670d99 100644
--- a/arch/s390/configs/performance_defconfig
+++ b/arch/s390/configs/performance_defconfig
@@ -489,7 +489,6 @@
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y
-CONFIG_EXT4_ENCRYPTION=y
 CONFIG_JBD2_DEBUG=y
 CONFIG_JFS_FS=m
 CONFIG_JFS_POSIX_ACL=y
@@ -507,6 +506,7 @@
 CONFIG_NILFS2_FS=m
 CONFIG_FS_DAX=y
 CONFIG_EXPORTFS_BLOCK_OPS=y
+CONFIG_FS_ENCRYPTION=y
 CONFIG_FANOTIFY=y
 CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
 CONFIG_QUOTA_NETLINK_INTERFACE=y
diff --git a/arch/s390/kernel/syscalls/syscall.tbl b/arch/s390/kernel/syscalls/syscall.tbl
index 022fc09..8caf42a 100644
--- a/arch/s390/kernel/syscalls/syscall.tbl
+++ b/arch/s390/kernel/syscalls/syscall.tbl
@@ -391,3 +391,5 @@
 381  common	kexec_file_load		sys_kexec_file_load		compat_sys_kexec_file_load
 382  common	io_pgetevents		sys_io_pgetevents		compat_sys_io_pgetevents
 383  common	rseq			sys_rseq			compat_sys_rseq
+424  common	pidfd_send_signal	sys_pidfd_send_signal		sys_pidfd_send_signal
+434  common	pidfd_open		sys_pidfd_open			sys_pidfd_open
diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig
index a3dbd45..600e4fd1 100644
--- a/arch/s390/kvm/Kconfig
+++ b/arch/s390/kvm/Kconfig
@@ -21,7 +21,6 @@
 	prompt "Kernel-based Virtual Machine (KVM) support"
 	depends on HAVE_KVM
 	select PREEMPT_NOTIFIERS
-	select ANON_INODES
 	select HAVE_KVM_CPU_RELAX_INTERCEPT
 	select HAVE_KVM_VCPU_ASYNC_IOCTL
 	select HAVE_KVM_EVENTFD
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index af35f5c..2b08204 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -46,7 +46,6 @@
 	#
 	select ACPI_LEGACY_TABLES_LOOKUP	if ACPI
 	select ACPI_SYSTEM_POWER_STATES_SUPPORT	if ACPI
-	select ANON_INODES
 	select ARCH_CLOCKSOURCE_DATA
 	select ARCH_DISCARD_MEMBLOCK
 	select ARCH_HAS_ACPI_TABLE_UPGRADE	if ACPI
@@ -78,6 +77,7 @@
 	select ARCH_SUPPORTS_ACPI
 	select ARCH_SUPPORTS_ATOMIC_RMW
 	select ARCH_SUPPORTS_NUMA_BALANCING	if X86_64
+	select ARCH_SUPPORTS_LTO_CLANG		if X86_64
 	select ARCH_USE_BUILTIN_BSWAP
 	select ARCH_USE_QUEUED_RWLOCKS
 	select ARCH_USE_QUEUED_SPINLOCKS
@@ -124,7 +124,7 @@
 	select HAVE_ARCH_MMAP_RND_BITS		if MMU
 	select HAVE_ARCH_MMAP_RND_COMPAT_BITS	if MMU && COMPAT
 	select HAVE_ARCH_COMPAT_MMAP_BASES	if MMU && COMPAT
-	select HAVE_ARCH_PREL32_RELOCATIONS
+	select HAVE_ARCH_PREL32_RELOCATIONS	if !LTO_CLANG
 	select HAVE_ARCH_SECCOMP_FILTER
 	select HAVE_ARCH_THREAD_STRUCT_WHITELIST
 	select HAVE_ARCH_TRACEHOOK
@@ -185,7 +185,7 @@
 	select HAVE_REGS_AND_STACK_ACCESS_API
 	select HAVE_RELIABLE_STACKTRACE		if X86_64 && (UNWINDER_FRAME_POINTER || UNWINDER_ORC) && STACK_VALIDATION
 	select HAVE_STACKPROTECTOR		if CC_HAS_SANE_STACKPROTECTOR
-	select HAVE_STACK_VALIDATION		if X86_64
+	select HAVE_STACK_VALIDATION		if X86_64 && !LTO_CLANG
 	select HAVE_RSEQ
 	select HAVE_SYSCALL_TRACEPOINTS
 	select HAVE_UNSTABLE_SCHED_CLOCK
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 4833dd7..5e400c7 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -215,6 +215,11 @@
 KBUILD_LDFLAGS += $(call ld-option, -z max-page-size=0x200000)
 endif
 
+ifdef CONFIG_LTO_CLANG
+KBUILD_LDFLAGS	+= -plugin-opt=-code-model=kernel \
+		   -plugin-opt=-stack-alignment=$(if $(CONFIG_X86_32),4,8)
+endif
+
 # Speed up the build
 KBUILD_CFLAGS += -pipe
 # Workaround for a gcc prelease that unfortunately was shipped in a suse release
@@ -306,10 +311,6 @@
 
 archprepare: checkbin
 checkbin:
-ifndef CONFIG_CC_HAS_ASM_GOTO
-	@echo Compiler lacks asm-goto support.
-	@exit 1
-endif
 ifdef CONFIG_RETPOLINE
 ifeq ($(RETPOLINE_CFLAGS),)
 	@echo "You are building kernel with non-retpoline compiler." >&2
diff --git a/arch/x86/boot/compressed/string.c b/arch/x86/boot/compressed/string.c
index 19dbbcd..81fc1ea 100644
--- a/arch/x86/boot/compressed/string.c
+++ b/arch/x86/boot/compressed/string.c
@@ -11,7 +11,7 @@
 #include "../string.c"
 
 #ifdef CONFIG_X86_32
-static void *__memcpy(void *dest, const void *src, size_t n)
+static void *____memcpy(void *dest, const void *src, size_t n)
 {
 	int d0, d1, d2;
 	asm volatile(
@@ -25,7 +25,7 @@
 	return dest;
 }
 #else
-static void *__memcpy(void *dest, const void *src, size_t n)
+static void *____memcpy(void *dest, const void *src, size_t n)
 {
 	long d0, d1, d2;
 	asm volatile(
@@ -56,7 +56,7 @@
 	const unsigned char *s = src;
 
 	if (d <= s || d - s >= n)
-		return __memcpy(dest, src, n);
+		return ____memcpy(dest, src, n);
 
 	while (n-- > 0)
 		d[n] = s[n];
@@ -71,5 +71,11 @@
 		warn("Avoiding potentially unsafe overlapping memcpy()!");
 		return memmove(dest, src, n);
 	}
-	return __memcpy(dest, src, n);
+	return ____memcpy(dest, src, n);
 }
+
+#ifdef CONFIG_KASAN
+extern void *__memset(void *s, int c, size_t n) __alias(memset);
+extern void *__memmove(void *dest, const void *src, size_t n) __alias(memmove);
+extern void *__memcpy(void *dest, const void *src, size_t n) __alias(memcpy);
+#endif
diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig
new file mode 100644
index 0000000..f2e9c4a
--- /dev/null
+++ b/arch/x86/configs/gki_defconfig
@@ -0,0 +1,424 @@
+# CONFIG_USELIB is not set
+CONFIG_AUDIT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_PREEMPT=y
+CONFIG_TASKSTATS=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+CONFIG_PSI=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_IKHEADERS=m
+CONFIG_MEMCG=y
+CONFIG_MEMCG_SWAP=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_BPF=y
+CONFIG_SCHED_AUTOGROUP=y
+CONFIG_SCHED_TUNE=y
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_RD_BZIP2 is not set
+# CONFIG_RD_LZMA is not set
+# CONFIG_RD_XZ is not set
+# CONFIG_RD_LZO is not set
+# CONFIG_RD_LZ4 is not set
+# CONFIG_SYSFS_SYSCALL is not set
+# CONFIG_FHANDLE is not set
+CONFIG_KALLSYMS_ALL=y
+CONFIG_BPF_SYSCALL=y
+CONFIG_BPF_JIT_ALWAYS_ON=y
+# CONFIG_RSEQ is not set
+CONFIG_EMBEDDED=y
+# CONFIG_VM_EVENT_COUNTERS is not set
+# CONFIG_COMPAT_BRK is not set
+# CONFIG_SLAB_MERGE_DEFAULT is not set
+CONFIG_PROFILING=y
+CONFIG_SMP=y
+CONFIG_HYPERVISOR_GUEST=y
+CONFIG_PARAVIRT=y
+CONFIG_NR_CPUS=32
+CONFIG_EFI=y
+CONFIG_CPU_FREQ_TIMES=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPUFREQ_DUMMY=m
+CONFIG_IA32_EMULATION=y
+CONFIG_KPROBES=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+CONFIG_BLK_INLINE_ENCRYPTION=y
+CONFIG_GKI_HACKS_TO_FIX=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_MISC=m
+CONFIG_ZSMALLOC=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=y
+CONFIG_XFRM_INTERFACE=y
+CONFIG_XFRM_STATISTICS=y
+CONFIG_NET_KEY=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_NET_IPGRE_DEMUX=y
+CONFIG_NET_IPVTI=y
+CONFIG_INET_ESP=y
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_UDP_DIAG=y
+CONFIG_INET_DIAG_DESTROY=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_INET6_ESP=y
+CONFIG_INET6_IPCOMP=y
+CONFIG_IPV6_MIP6=y
+CONFIG_IPV6_VTI=y
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CONNTRACK_AMANDA=y
+CONFIG_NF_CONNTRACK_FTP=y
+CONFIG_NF_CONNTRACK_H323=y
+CONFIG_NF_CONNTRACK_IRC=y
+CONFIG_NF_CONNTRACK_NETBIOS_NS=y
+CONFIG_NF_CONNTRACK_PPTP=y
+CONFIG_NF_CONNTRACK_SANE=y
+CONFIG_NF_CONNTRACK_TFTP=y
+CONFIG_NF_CT_NETLINK=y
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
+CONFIG_NETFILTER_XT_TARGET_CT=y
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
+CONFIG_NETFILTER_XT_TARGET_MARK=y
+CONFIG_NETFILTER_XT_TARGET_NFLOG=y
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
+CONFIG_NETFILTER_XT_TARGET_TPROXY=y
+CONFIG_NETFILTER_XT_TARGET_TRACE=y
+CONFIG_NETFILTER_XT_TARGET_SECMARK=y
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
+CONFIG_NETFILTER_XT_MATCH_BPF=y
+CONFIG_NETFILTER_XT_MATCH_COMMENT=y
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_HELPER=y
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
+CONFIG_NETFILTER_XT_MATCH_LENGTH=y
+CONFIG_NETFILTER_XT_MATCH_LIMIT=y
+CONFIG_NETFILTER_XT_MATCH_MAC=y
+CONFIG_NETFILTER_XT_MATCH_MARK=y
+CONFIG_NETFILTER_XT_MATCH_OWNER=y
+CONFIG_NETFILTER_XT_MATCH_POLICY=y
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA2=y
+CONFIG_NETFILTER_XT_MATCH_SOCKET=y
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=y
+CONFIG_NETFILTER_XT_MATCH_STRING=y
+CONFIG_NETFILTER_XT_MATCH_TIME=y
+CONFIG_NETFILTER_XT_MATCH_U32=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MATCH_ECN=y
+CONFIG_IP_NF_MATCH_TTL=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_IP_NF_NAT=y
+CONFIG_IP_NF_TARGET_MASQUERADE=y
+CONFIG_IP_NF_TARGET_NETMAP=y
+CONFIG_IP_NF_TARGET_REDIRECT=y
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_RAW=y
+CONFIG_IP_NF_SECURITY=y
+CONFIG_IP_NF_ARPTABLES=y
+CONFIG_IP_NF_ARPFILTER=y
+CONFIG_IP_NF_ARP_MANGLE=y
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MATCH_RPFILTER=y
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_TARGET_REJECT=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
+CONFIG_TIPC=y
+CONFIG_L2TP=y
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_HTB=y
+CONFIG_NET_SCH_INGRESS=y
+CONFIG_NET_CLS_U32=y
+CONFIG_NET_CLS_BPF=y
+CONFIG_NET_EMATCH=y
+CONFIG_NET_EMATCH_U32=y
+CONFIG_NET_CLS_ACT=y
+CONFIG_VSOCKETS=m
+CONFIG_VIRTIO_VSOCKETS=m
+CONFIG_BPF_JIT=y
+CONFIG_CAN=m
+# CONFIG_CAN_BCM is not set
+# CONFIG_CAN_GW is not set
+CONFIG_CAN_VCAN=m
+CONFIG_CFG80211=y
+# CONFIG_CFG80211_DEFAULT_PS is not set
+# CONFIG_CFG80211_CRDA_SUPPORT is not set
+CONFIG_MAC80211=y
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_RFKILL=y
+# CONFIG_UEVENT_HELPER is not set
+# CONFIG_FW_CACHE is not set
+# CONFIG_ALLOW_DEV_COREDUMP is not set
+CONFIG_DEBUG_DEVRES=y
+CONFIG_GNSS=y
+CONFIG_GNSS_CMDLINE_SERIAL=m
+CONFIG_OF=y
+CONFIG_ZRAM=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_VIRTIO_BLK=m
+CONFIG_UID_SYS_STATS=y
+CONFIG_SCSI=y
+# CONFIG_SCSI_MQ_DEFAULT is not set
+# CONFIG_SCSI_PROC_FS is not set
+CONFIG_BLK_DEV_SD=y
+CONFIG_MD=y
+CONFIG_BLK_DEV_DM=y
+CONFIG_DM_CRYPT=y
+CONFIG_DM_SNAPSHOT=y
+CONFIG_DM_UEVENT=y
+CONFIG_DM_VERITY=y
+CONFIG_DM_VERITY_AVB=y
+CONFIG_DM_VERITY_FEC=y
+CONFIG_DM_BOW=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=y
+CONFIG_VIRTIO_NET=m
+# CONFIG_ETHERNET is not set
+CONFIG_PHYLIB=y
+CONFIG_PPP=y
+CONFIG_PPP_BSDCOMP=y
+CONFIG_PPP_DEFLATE=y
+CONFIG_PPP_MPPE=y
+CONFIG_PPTP=y
+CONFIG_PPPOL2TP=y
+CONFIG_USB_RTL8152=y
+CONFIG_USB_USBNET=y
+# CONFIG_USB_NET_AX8817X is not set
+# CONFIG_USB_NET_AX88179_178A is not set
+# CONFIG_USB_NET_CDCETHER is not set
+# CONFIG_USB_NET_CDC_NCM is not set
+# CONFIG_USB_NET_NET1080 is not set
+# CONFIG_USB_NET_CDC_SUBSET is not set
+# CONFIG_USB_NET_ZAURUS is not set
+# CONFIG_WLAN_VENDOR_ADMTEK is not set
+# CONFIG_WLAN_VENDOR_ATH is not set
+# CONFIG_WLAN_VENDOR_ATMEL is not set
+# CONFIG_WLAN_VENDOR_BROADCOM is not set
+# CONFIG_WLAN_VENDOR_CISCO is not set
+# CONFIG_WLAN_VENDOR_INTEL is not set
+# CONFIG_WLAN_VENDOR_INTERSIL is not set
+# CONFIG_WLAN_VENDOR_MARVELL is not set
+# CONFIG_WLAN_VENDOR_MEDIATEK is not set
+# CONFIG_WLAN_VENDOR_RALINK is not set
+# CONFIG_WLAN_VENDOR_REALTEK is not set
+# CONFIG_WLAN_VENDOR_RSI is not set
+# CONFIG_WLAN_VENDOR_ST is not set
+# CONFIG_WLAN_VENDOR_TI is not set
+# CONFIG_WLAN_VENDOR_ZYDAS is not set
+# CONFIG_WLAN_VENDOR_QUANTENNA is not set
+CONFIG_VIRT_WIFI=m
+CONFIG_INPUT_EVDEV=y
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_JOYSTICK=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=y
+# CONFIG_VT is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_DEVMEM is not set
+CONFIG_SERIAL_8250=y
+# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_EXAR is not set
+CONFIG_SERIAL_OF_PLATFORM=m
+CONFIG_SERIAL_DEV_BUS=y
+CONFIG_VIRTIO_CONSOLE=m
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_VIRTIO=m
+# CONFIG_DEVPORT is not set
+# CONFIG_I2C_COMPAT is not set
+# CONFIG_I2C_HELPER_AUTO is not set
+CONFIG_SPI=y
+CONFIG_GPIOLIB=y
+# CONFIG_HWMON is not set
+CONFIG_DEVFREQ_THERMAL=y
+# CONFIG_X86_PKG_TEMP_THERMAL is not set
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_MEDIA_CAMERA_SUPPORT=y
+# CONFIG_VGA_ARB is not set
+CONFIG_DRM=y
+# CONFIG_DRM_FBDEV_EMULATION is not set
+CONFIG_DRM_VIRTIO_GPU=m
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_HRTIMER=y
+CONFIG_SND_DYNAMIC_MINORS=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_DRIVERS is not set
+CONFIG_SND_INTEL8X0=m
+# CONFIG_SND_USB is not set
+CONFIG_HIDRAW=y
+CONFIG_UHID=y
+CONFIG_HID_APPLE=y
+CONFIG_HID_ELECOM=y
+CONFIG_HID_MAGICMOUSE=y
+CONFIG_HID_MICROSOFT=y
+CONFIG_HID_MULTITOUCH=y
+CONFIG_USB_HIDDEV=y
+CONFIG_USB=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_DUMMY_HCD=m
+CONFIG_USB_CONFIGFS=y
+CONFIG_USB_CONFIGFS_UEVENT=y
+CONFIG_USB_CONFIGFS_F_FS=y
+CONFIG_USB_CONFIGFS_F_ACC=y
+CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
+CONFIG_USB_CONFIGFS_F_MIDI=y
+CONFIG_MMC=m
+# CONFIG_PWRSEQ_EMMC is not set
+# CONFIG_PWRSEQ_SIMPLE is not set
+CONFIG_MMC_SDHCI=m
+CONFIG_MMC_SDHCI_PLTFM=m
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_SYSTOHC is not set
+CONFIG_RTC_DRV_TEST=m
+CONFIG_UIO=y
+CONFIG_VIRTIO_PCI=m
+# CONFIG_VIRTIO_PCI_LEGACY is not set
+CONFIG_VIRTIO_BALLOON=m
+CONFIG_VIRTIO_INPUT=m
+CONFIG_VIRTIO_MMIO=m
+CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
+CONFIG_STAGING=y
+CONFIG_ASHMEM=y
+CONFIG_ION=y
+CONFIG_ION_SYSTEM_HEAP=y
+CONFIG_PM_DEVFREQ=y
+CONFIG_IIO=y
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_EXT4_ENCRYPTION=y
+CONFIG_F2FS_FS=y
+CONFIG_F2FS_FS_SECURITY=y
+CONFIG_F2FS_FS_ENCRYPTION=y
+CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
+CONFIG_FS_VERITY=y
+CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
+# CONFIG_DNOTIFY is not set
+CONFIG_QUOTA=y
+CONFIG_QFMT_V2=y
+CONFIG_FUSE_FS=y
+CONFIG_OVERLAY_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+# CONFIG_EFIVAR_FS is not set
+CONFIG_SDCARD_FS=y
+CONFIG_PSTORE=y
+CONFIG_PSTORE_CONSOLE=y
+CONFIG_PSTORE_RAM=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=y
+CONFIG_NLS_CODEPAGE_775=y
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_CODEPAGE_852=y
+CONFIG_NLS_CODEPAGE_855=y
+CONFIG_NLS_CODEPAGE_857=y
+CONFIG_NLS_CODEPAGE_860=y
+CONFIG_NLS_CODEPAGE_861=y
+CONFIG_NLS_CODEPAGE_862=y
+CONFIG_NLS_CODEPAGE_863=y
+CONFIG_NLS_CODEPAGE_864=y
+CONFIG_NLS_CODEPAGE_865=y
+CONFIG_NLS_CODEPAGE_866=y
+CONFIG_NLS_CODEPAGE_869=y
+CONFIG_NLS_CODEPAGE_936=y
+CONFIG_NLS_CODEPAGE_950=y
+CONFIG_NLS_CODEPAGE_932=y
+CONFIG_NLS_CODEPAGE_949=y
+CONFIG_NLS_CODEPAGE_874=y
+CONFIG_NLS_ISO8859_8=y
+CONFIG_NLS_CODEPAGE_1250=y
+CONFIG_NLS_CODEPAGE_1251=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=y
+CONFIG_NLS_ISO8859_3=y
+CONFIG_NLS_ISO8859_4=y
+CONFIG_NLS_ISO8859_5=y
+CONFIG_NLS_ISO8859_6=y
+CONFIG_NLS_ISO8859_7=y
+CONFIG_NLS_ISO8859_9=y
+CONFIG_NLS_ISO8859_13=y
+CONFIG_NLS_ISO8859_14=y
+CONFIG_NLS_ISO8859_15=y
+CONFIG_NLS_KOI8_R=y
+CONFIG_NLS_KOI8_U=y
+CONFIG_NLS_MAC_ROMAN=y
+CONFIG_NLS_MAC_CELTIC=y
+CONFIG_NLS_MAC_CENTEURO=y
+CONFIG_NLS_MAC_CROATIAN=y
+CONFIG_NLS_MAC_CYRILLIC=y
+CONFIG_NLS_MAC_GAELIC=y
+CONFIG_NLS_MAC_GREEK=y
+CONFIG_NLS_MAC_ICELAND=y
+CONFIG_NLS_MAC_INUIT=y
+CONFIG_NLS_MAC_ROMANIAN=y
+CONFIG_NLS_MAC_TURKISH=y
+CONFIG_NLS_UTF8=y
+CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_HARDENED_USERCOPY=y
+CONFIG_SECURITY_SELINUX=y
+CONFIG_CRYPTO_ADIANTUM=y
+CONFIG_CRYPTO_SHA256_SSSE3=y
+CONFIG_CRYPTO_AES_NI_INTEL=y
+CONFIG_CRYPTO_LZ4=y
+CONFIG_CRYPTO_ZSTD=y
+CONFIG_CRYPTO_ANSI_CPRNG=y
+CONFIG_CRC8=y
+CONFIG_XZ_DEC=y
+CONFIG_PRINTK_TIME=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_ENABLE_MUST_CHECK is not set
+# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_STACK_USAGE=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_SOFTLOCKUP_DETECTOR=y
+# CONFIG_DETECT_HUNG_TASK is not set
+CONFIG_PANIC_TIMEOUT=5
+CONFIG_SCHEDSTATS=y
+# CONFIG_RUNTIME_TESTING_MENU is not set
+CONFIG_UNWINDER_FRAME_POINTER=y
diff --git a/arch/x86/crypto/chacha20_glue.c b/arch/x86/crypto/chacha20_glue.c
index dce7c5d..bd249f0 100644
--- a/arch/x86/crypto/chacha20_glue.c
+++ b/arch/x86/crypto/chacha20_glue.c
@@ -10,7 +10,7 @@
  */
 
 #include <crypto/algapi.h>
-#include <crypto/chacha20.h>
+#include <crypto/chacha.h>
 #include <crypto/internal/skcipher.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -29,31 +29,31 @@
 static void chacha20_dosimd(u32 *state, u8 *dst, const u8 *src,
 			    unsigned int bytes)
 {
-	u8 buf[CHACHA20_BLOCK_SIZE];
+	u8 buf[CHACHA_BLOCK_SIZE];
 
 #ifdef CONFIG_AS_AVX2
 	if (chacha20_use_avx2) {
-		while (bytes >= CHACHA20_BLOCK_SIZE * 8) {
+		while (bytes >= CHACHA_BLOCK_SIZE * 8) {
 			chacha20_8block_xor_avx2(state, dst, src);
-			bytes -= CHACHA20_BLOCK_SIZE * 8;
-			src += CHACHA20_BLOCK_SIZE * 8;
-			dst += CHACHA20_BLOCK_SIZE * 8;
+			bytes -= CHACHA_BLOCK_SIZE * 8;
+			src += CHACHA_BLOCK_SIZE * 8;
+			dst += CHACHA_BLOCK_SIZE * 8;
 			state[12] += 8;
 		}
 	}
 #endif
-	while (bytes >= CHACHA20_BLOCK_SIZE * 4) {
+	while (bytes >= CHACHA_BLOCK_SIZE * 4) {
 		chacha20_4block_xor_ssse3(state, dst, src);
-		bytes -= CHACHA20_BLOCK_SIZE * 4;
-		src += CHACHA20_BLOCK_SIZE * 4;
-		dst += CHACHA20_BLOCK_SIZE * 4;
+		bytes -= CHACHA_BLOCK_SIZE * 4;
+		src += CHACHA_BLOCK_SIZE * 4;
+		dst += CHACHA_BLOCK_SIZE * 4;
 		state[12] += 4;
 	}
-	while (bytes >= CHACHA20_BLOCK_SIZE) {
+	while (bytes >= CHACHA_BLOCK_SIZE) {
 		chacha20_block_xor_ssse3(state, dst, src);
-		bytes -= CHACHA20_BLOCK_SIZE;
-		src += CHACHA20_BLOCK_SIZE;
-		dst += CHACHA20_BLOCK_SIZE;
+		bytes -= CHACHA_BLOCK_SIZE;
+		src += CHACHA_BLOCK_SIZE;
+		dst += CHACHA_BLOCK_SIZE;
 		state[12]++;
 	}
 	if (bytes) {
@@ -66,7 +66,7 @@
 static int chacha20_simd(struct skcipher_request *req)
 {
 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-	struct chacha20_ctx *ctx = crypto_skcipher_ctx(tfm);
+	struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
 	u32 *state, state_buf[16 + 2] __aligned(8);
 	struct skcipher_walk walk;
 	int err;
@@ -74,20 +74,20 @@
 	BUILD_BUG_ON(CHACHA20_STATE_ALIGN != 16);
 	state = PTR_ALIGN(state_buf + 0, CHACHA20_STATE_ALIGN);
 
-	if (req->cryptlen <= CHACHA20_BLOCK_SIZE || !may_use_simd())
-		return crypto_chacha20_crypt(req);
+	if (req->cryptlen <= CHACHA_BLOCK_SIZE || !may_use_simd())
+		return crypto_chacha_crypt(req);
 
 	err = skcipher_walk_virt(&walk, req, true);
 
-	crypto_chacha20_init(state, ctx, walk.iv);
+	crypto_chacha_init(state, ctx, walk.iv);
 
 	kernel_fpu_begin();
 
-	while (walk.nbytes >= CHACHA20_BLOCK_SIZE) {
+	while (walk.nbytes >= CHACHA_BLOCK_SIZE) {
 		chacha20_dosimd(state, walk.dst.virt.addr, walk.src.virt.addr,
-				rounddown(walk.nbytes, CHACHA20_BLOCK_SIZE));
+				rounddown(walk.nbytes, CHACHA_BLOCK_SIZE));
 		err = skcipher_walk_done(&walk,
-					 walk.nbytes % CHACHA20_BLOCK_SIZE);
+					 walk.nbytes % CHACHA_BLOCK_SIZE);
 	}
 
 	if (walk.nbytes) {
@@ -106,13 +106,13 @@
 	.base.cra_driver_name	= "chacha20-simd",
 	.base.cra_priority	= 300,
 	.base.cra_blocksize	= 1,
-	.base.cra_ctxsize	= sizeof(struct chacha20_ctx),
+	.base.cra_ctxsize	= sizeof(struct chacha_ctx),
 	.base.cra_module	= THIS_MODULE,
 
-	.min_keysize		= CHACHA20_KEY_SIZE,
-	.max_keysize		= CHACHA20_KEY_SIZE,
-	.ivsize			= CHACHA20_IV_SIZE,
-	.chunksize		= CHACHA20_BLOCK_SIZE,
+	.min_keysize		= CHACHA_KEY_SIZE,
+	.max_keysize		= CHACHA_KEY_SIZE,
+	.ivsize			= CHACHA_IV_SIZE,
+	.chunksize		= CHACHA_BLOCK_SIZE,
 	.setkey			= crypto_chacha20_setkey,
 	.encrypt		= chacha20_simd,
 	.decrypt		= chacha20_simd,
diff --git a/arch/x86/crypto/poly1305_glue.c b/arch/x86/crypto/poly1305_glue.c
index f012b7e..88cc015 100644
--- a/arch/x86/crypto/poly1305_glue.c
+++ b/arch/x86/crypto/poly1305_glue.c
@@ -83,35 +83,37 @@
 	if (poly1305_use_avx2 && srclen >= POLY1305_BLOCK_SIZE * 4) {
 		if (unlikely(!sctx->wset)) {
 			if (!sctx->uset) {
-				memcpy(sctx->u, dctx->r, sizeof(sctx->u));
-				poly1305_simd_mult(sctx->u, dctx->r);
+				memcpy(sctx->u, dctx->r.r, sizeof(sctx->u));
+				poly1305_simd_mult(sctx->u, dctx->r.r);
 				sctx->uset = true;
 			}
 			memcpy(sctx->u + 5, sctx->u, sizeof(sctx->u));
-			poly1305_simd_mult(sctx->u + 5, dctx->r);
+			poly1305_simd_mult(sctx->u + 5, dctx->r.r);
 			memcpy(sctx->u + 10, sctx->u + 5, sizeof(sctx->u));
-			poly1305_simd_mult(sctx->u + 10, dctx->r);
+			poly1305_simd_mult(sctx->u + 10, dctx->r.r);
 			sctx->wset = true;
 		}
 		blocks = srclen / (POLY1305_BLOCK_SIZE * 4);
-		poly1305_4block_avx2(dctx->h, src, dctx->r, blocks, sctx->u);
+		poly1305_4block_avx2(dctx->h.h, src, dctx->r.r, blocks,
+				     sctx->u);
 		src += POLY1305_BLOCK_SIZE * 4 * blocks;
 		srclen -= POLY1305_BLOCK_SIZE * 4 * blocks;
 	}
 #endif
 	if (likely(srclen >= POLY1305_BLOCK_SIZE * 2)) {
 		if (unlikely(!sctx->uset)) {
-			memcpy(sctx->u, dctx->r, sizeof(sctx->u));
-			poly1305_simd_mult(sctx->u, dctx->r);
+			memcpy(sctx->u, dctx->r.r, sizeof(sctx->u));
+			poly1305_simd_mult(sctx->u, dctx->r.r);
 			sctx->uset = true;
 		}
 		blocks = srclen / (POLY1305_BLOCK_SIZE * 2);
-		poly1305_2block_sse2(dctx->h, src, dctx->r, blocks, sctx->u);
+		poly1305_2block_sse2(dctx->h.h, src, dctx->r.r, blocks,
+				     sctx->u);
 		src += POLY1305_BLOCK_SIZE * 2 * blocks;
 		srclen -= POLY1305_BLOCK_SIZE * 2 * blocks;
 	}
 	if (srclen >= POLY1305_BLOCK_SIZE) {
-		poly1305_block_sse2(dctx->h, src, dctx->r, 1);
+		poly1305_block_sse2(dctx->h.h, src, dctx->r.r, 1);
 		srclen -= POLY1305_BLOCK_SIZE;
 	}
 	return srclen;
diff --git a/arch/x86/entry/syscall_32.c b/arch/x86/entry/syscall_32.c
index aa3336a..7d17b3a 100644
--- a/arch/x86/entry/syscall_32.c
+++ b/arch/x86/entry/syscall_32.c
@@ -10,13 +10,11 @@
 #ifdef CONFIG_IA32_EMULATION
 /* On X86_64, we use struct pt_regs * to pass parameters to syscalls */
 #define __SYSCALL_I386(nr, sym, qual) extern asmlinkage long sym(const struct pt_regs *);
-
-/* this is a lie, but it does not hurt as sys_ni_syscall just returns -EINVAL */
-extern asmlinkage long sys_ni_syscall(const struct pt_regs *);
-
+#define __sys_ni_syscall __ia32_sys_ni_syscall
 #else /* CONFIG_IA32_EMULATION */
 #define __SYSCALL_I386(nr, sym, qual) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
 extern asmlinkage long sys_ni_syscall(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
+#define __sys_ni_syscall sys_ni_syscall
 #endif /* CONFIG_IA32_EMULATION */
 
 #include <asm/syscalls_32.h>
@@ -29,6 +27,6 @@
 	 * Smells like a compiler bug -- it doesn't work
 	 * when the & below is removed.
 	 */
-	[0 ... __NR_syscall_compat_max] = &sys_ni_syscall,
+	[0 ... __NR_syscall_compat_max] = &__sys_ni_syscall,
 #include <asm/syscalls_32.h>
 };
diff --git a/arch/x86/entry/syscall_64.c b/arch/x86/entry/syscall_64.c
index d5252bc..eb82ad9 100644
--- a/arch/x86/entry/syscall_64.c
+++ b/arch/x86/entry/syscall_64.c
@@ -4,11 +4,17 @@
 #include <linux/linkage.h>
 #include <linux/sys.h>
 #include <linux/cache.h>
+#include <linux/syscalls.h>
 #include <asm/asm-offsets.h>
 #include <asm/syscall.h>
 
-/* this is a lie, but it does not hurt as sys_ni_syscall just returns -EINVAL */
-extern asmlinkage long sys_ni_syscall(const struct pt_regs *);
+extern asmlinkage long sys_ni_syscall(void);
+
+SYSCALL_DEFINE0(ni_syscall)
+{
+	return sys_ni_syscall();
+}
+
 #define __SYSCALL_64(nr, sym, qual) extern asmlinkage long sym(const struct pt_regs *);
 #include <asm/syscalls_64.h>
 #undef __SYSCALL_64
@@ -20,6 +26,6 @@
 	 * Smells like a compiler bug -- it doesn't work
 	 * when the & below is removed.
 	 */
-	[0 ... __NR_syscall_max] = &sys_ni_syscall,
+	[0 ... __NR_syscall_max] = &__x64_sys_ni_syscall,
 #include <asm/syscalls_64.h>
 };
diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl
index 3cf7b53..300e801 100644
--- a/arch/x86/entry/syscalls/syscall_32.tbl
+++ b/arch/x86/entry/syscalls/syscall_32.tbl
@@ -124,7 +124,7 @@
 110	i386	iopl			sys_iopl			__ia32_sys_iopl
 111	i386	vhangup			sys_vhangup			__ia32_sys_vhangup
 112	i386	idle
-113	i386	vm86old			sys_vm86old			sys_ni_syscall
+113	i386	vm86old			sys_vm86old			__ia32_sys_ni_syscall
 114	i386	wait4			sys_wait4			__ia32_compat_sys_wait4
 115	i386	swapoff			sys_swapoff			__ia32_sys_swapoff
 116	i386	sysinfo			sys_sysinfo			__ia32_compat_sys_sysinfo
@@ -177,7 +177,7 @@
 163	i386	mremap			sys_mremap			__ia32_sys_mremap
 164	i386	setresuid		sys_setresuid16			__ia32_sys_setresuid16
 165	i386	getresuid		sys_getresuid16			__ia32_sys_getresuid16
-166	i386	vm86			sys_vm86			sys_ni_syscall
+166	i386	vm86			sys_vm86			__ia32_sys_ni_syscall
 167	i386	query_module
 168	i386	poll			sys_poll			__ia32_sys_poll
 169	i386	nfsservctl
@@ -398,3 +398,5 @@
 384	i386	arch_prctl		sys_arch_prctl			__ia32_compat_sys_arch_prctl
 385	i386	io_pgetevents		sys_io_pgetevents		__ia32_compat_sys_io_pgetevents
 386	i386	rseq			sys_rseq			__ia32_sys_rseq
+424	i386	pidfd_send_signal	sys_pidfd_send_signal		__ia32_sys_pidfd_send_signal
+434	i386	pidfd_open		sys_pidfd_open			__ia32_sys_pidfd_open
diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl
index f0b1709..bbfc6d4 100644
--- a/arch/x86/entry/syscalls/syscall_64.tbl
+++ b/arch/x86/entry/syscalls/syscall_64.tbl
@@ -343,6 +343,8 @@
 332	common	statx			__x64_sys_statx
 333	common	io_pgetevents		__x64_sys_io_pgetevents
 334	common	rseq			__x64_sys_rseq
+424	common	pidfd_send_signal	__x64_sys_pidfd_send_signal
+434	common	pidfd_open		__x64_sys_pidfd_open
 
 #
 # x32-specific system call numbers start at 512 to avoid cache impact
diff --git a/arch/x86/entry/vdso/Makefile b/arch/x86/entry/vdso/Makefile
index 5bfe224..c66b333 100644
--- a/arch/x86/entry/vdso/Makefile
+++ b/arch/x86/entry/vdso/Makefile
@@ -3,7 +3,6 @@
 # Building vDSO images for x86.
 #
 
-KBUILD_CFLAGS += $(DISABLE_LTO)
 KASAN_SANITIZE			:= n
 UBSAN_SANITIZE			:= n
 OBJECT_FILES_NON_STANDARD	:= y
@@ -68,7 +67,7 @@
 CFL := $(PROFILING) -mcmodel=small -fPIC -O2 -fasynchronous-unwind-tables -m64 \
        $(filter -g%,$(KBUILD_CFLAGS)) $(call cc-option, -fno-stack-protector) \
        -fno-omit-frame-pointer -foptimize-sibling-calls \
-       -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO
+       -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO $(DISABLE_LTO)
 
 ifdef CONFIG_RETPOLINE
 ifneq ($(RETPOLINE_VDSO_CFLAGS),)
@@ -139,6 +138,8 @@
 KBUILD_CFLAGS_32 := $(filter-out -mfentry,$(KBUILD_CFLAGS_32))
 KBUILD_CFLAGS_32 := $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS_32))
 KBUILD_CFLAGS_32 := $(filter-out $(RETPOLINE_CFLAGS),$(KBUILD_CFLAGS_32))
+KBUILD_CFLAGS_32 := $(filter-out $(LTO_CFLAGS),$(KBUILD_CFLAGS_32))
+KBUILD_CFLAGS_32 := $(filter-out $(CFI_CFLAGS),$(KBUILD_CFLAGS_32))
 KBUILD_CFLAGS_32 += -m32 -msoft-float -mregparm=0 -fpic
 KBUILD_CFLAGS_32 += $(call cc-option, -fno-stack-protector)
 KBUILD_CFLAGS_32 += $(call cc-option, -foptimize-sibling-calls)
diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c
index 8f4c98f..f03100b 100644
--- a/arch/x86/events/intel/pt.c
+++ b/arch/x86/events/intel/pt.c
@@ -1213,7 +1213,8 @@
 static void pt_event_addr_filters_sync(struct perf_event *event)
 {
 	struct perf_addr_filters_head *head = perf_event_addr_filters(event);
-	unsigned long msr_a, msr_b, *offs = event->addr_filters_offs;
+	unsigned long msr_a, msr_b;
+	struct perf_addr_filter_range *fr = event->addr_filter_ranges;
 	struct pt_filters *filters = event->hw.addr_filters;
 	struct perf_addr_filter *filter;
 	int range = 0;
@@ -1222,12 +1223,12 @@
 		return;
 
 	list_for_each_entry(filter, &head->list, entry) {
-		if (filter->path.dentry && !offs[range]) {
+		if (filter->path.dentry && !fr[range].start) {
 			msr_a = msr_b = 0;
 		} else {
 			/* apply the offset */
-			msr_a = filter->offset + offs[range];
-			msr_b = filter->size + msr_a - 1;
+			msr_a = fr[range].start;
+			msr_b = msr_a + fr[range].size - 1;
 		}
 
 		filters->filter[range].msr_a  = msr_a;
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index 513ba49..d8b7398 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -118,7 +118,7 @@
 	return err;
 }
 
-asmlinkage long sys32_sigreturn(void)
+asmlinkage long sys32_sigreturn(const struct pt_regs *__unused)
 {
 	struct pt_regs *regs = current_pt_regs();
 	struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8);
@@ -144,7 +144,7 @@
 	return 0;
 }
 
-asmlinkage long sys32_rt_sigreturn(void)
+asmlinkage long sys32_rt_sigreturn(const struct pt_regs *__unused)
 {
 	struct pt_regs *regs = current_pt_regs();
 	struct rt_sigframe_ia32 __user *frame;
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index 68889ac..5694825 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -146,9 +146,6 @@
  * Workaround for the sake of BPF compilation which utilizes kernel
  * headers, but clang does not support ASM GOTO and fails the build.
  */
-#ifndef __BPF_TRACING__
-#warning "Compiler lacks ASM_GOTO support. Add -D __BPF_TRACING__ to your compiler arguments"
-#endif
 
 #define static_cpu_has(bit)            boot_cpu_has(bit)
 
diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h
index 0b6352a..b99d497 100644
--- a/arch/x86/include/asm/page_64_types.h
+++ b/arch/x86/include/asm/page_64_types.h
@@ -7,11 +7,7 @@
 #endif
 
 #ifdef CONFIG_KASAN
-#ifdef CONFIG_KASAN_EXTRA
-#define KASAN_STACK_ORDER 2
-#else
 #define KASAN_STACK_ORDER 1
-#endif
 #else
 #define KASAN_STACK_ORDER 0
 #endif
diff --git a/arch/x86/include/asm/smap.h b/arch/x86/include/asm/smap.h
index db33330..6cfe431 100644
--- a/arch/x86/include/asm/smap.h
+++ b/arch/x86/include/asm/smap.h
@@ -58,6 +58,23 @@
 	alternative("", __stringify(__ASM_STAC), X86_FEATURE_SMAP);
 }
 
+static __always_inline unsigned long smap_save(void)
+{
+	unsigned long flags;
+
+	asm volatile (ALTERNATIVE("", "pushf; pop %0; " __stringify(__ASM_CLAC),
+				  X86_FEATURE_SMAP)
+		      : "=rm" (flags) : : "memory", "cc");
+
+	return flags;
+}
+
+static __always_inline void smap_restore(unsigned long flags)
+{
+	asm volatile (ALTERNATIVE("", "push %0; popf", X86_FEATURE_SMAP)
+		      : : "g" (flags) : "memory", "cc");
+}
+
 /* These macros can be used in asm() statements */
 #define ASM_CLAC \
 	ALTERNATIVE("", __stringify(__ASM_CLAC), X86_FEATURE_SMAP)
@@ -69,6 +86,9 @@
 static inline void clac(void) { }
 static inline void stac(void) { }
 
+static inline unsigned long smap_save(void) { return 0; }
+static inline void smap_restore(unsigned long flags) { }
+
 #define ASM_CLAC
 #define ASM_STAC
 
diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
index 90eb70d..4656eb0 100644
--- a/arch/x86/include/asm/syscall_wrapper.h
+++ b/arch/x86/include/asm/syscall_wrapper.h
@@ -6,6 +6,8 @@
 #ifndef _ASM_X86_SYSCALL_WRAPPER_H
 #define _ASM_X86_SYSCALL_WRAPPER_H
 
+struct pt_regs;
+
 /* Mapping of registers to parameters for syscalls on x86-64 and x32 */
 #define SC_X86_64_REGS_TO_ARGS(x, ...)					\
 	__MAP(x,__SC_ARGS						\
@@ -56,9 +58,15 @@
 	SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname);		\
 	asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)
 
-#define COND_SYSCALL(name)						\
-	cond_syscall(__x64_sys_##name);					\
-	cond_syscall(__ia32_sys_##name)
+#define COND_SYSCALL(name)							\
+	asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused)	\
+	{									\
+		return sys_ni_syscall();					\
+	}									\
+	asmlinkage __weak long __ia32_sys_##name(const struct pt_regs *__unused)\
+	{									\
+		return sys_ni_syscall();					\
+	}
 
 #define SYS_NI(name)							\
 	SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers);		\
@@ -182,15 +190,19 @@
  * macros to work correctly.
  */
 #ifndef SYSCALL_DEFINE0
-#define SYSCALL_DEFINE0(sname)						\
-	SYSCALL_METADATA(_##sname, 0);					\
+#define SYSCALL_DEFINE0(sname)					\
+	SYSCALL_METADATA(_##sname, 0);				\
 	asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\
-	ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO);		\
+	ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO);	\
 	asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)
 #endif
 
 #ifndef COND_SYSCALL
-#define COND_SYSCALL(name) cond_syscall(__x64_sys_##name)
+#define COND_SYSCALL(name) 							\
+	asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused)	\
+	{									\
+		return sys_ni_syscall();					\
+	}
 #endif
 
 #ifndef SYS_NI
@@ -202,7 +214,6 @@
  * For VSYSCALLS, we need to declare these three syscalls with the new
  * pt_regs-based calling convention for in-kernel use.
  */
-struct pt_regs;
 asmlinkage long __x64_sys_getcpu(const struct pt_regs *regs);
 asmlinkage long __x64_sys_gettimeofday(const struct pt_regs *regs);
 asmlinkage long __x64_sys_time(const struct pt_regs *regs);
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
index 9718303..d34e354 100644
--- a/arch/x86/include/asm/uaccess.h
+++ b/arch/x86/include/asm/uaccess.h
@@ -711,9 +711,22 @@
  * checking before using them, but you have to surround them with the
  * user_access_begin/end() pair.
  */
-#define user_access_begin()	__uaccess_begin()
+static __must_check inline bool user_access_begin(int type,
+						  const void __user *ptr,
+						  size_t len)
+{
+	if (unlikely(!access_ok(type, ptr, len)))
+		return 0;
+	__uaccess_begin();
+	return 1;
+}
+
+#define user_access_begin(a, b, c)	user_access_begin(a, b, c)
 #define user_access_end()	__uaccess_end()
 
+#define user_access_save()	smap_save()
+#define user_access_restore(x)	smap_restore(x)
+
 #define unsafe_put_user(x, ptr, err_label)					\
 do {										\
 	int __pu_err;								\
diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
index d805202..917840e 100644
--- a/arch/x86/kernel/cpu/vmware.c
+++ b/arch/x86/kernel/cpu/vmware.c
@@ -45,7 +45,7 @@
 #define VMWARE_PORT_CMD_VCPU_RESERVED	31
 
 #define VMWARE_PORT(cmd, eax, ebx, ecx, edx)				\
-	__asm__("inl (%%dx)" :						\
+	__asm__("inl (%%dx), %%eax" :					\
 			"=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) :	\
 			"0"(VMWARE_HYPERVISOR_MAGIC),			\
 			"1"(VMWARE_PORT_CMD_##cmd),			\
diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig
index 1bbec38..f3f2e54 100644
--- a/arch/x86/kvm/Kconfig
+++ b/arch/x86/kvm/Kconfig
@@ -27,7 +27,6 @@
 	depends on X86_LOCAL_APIC
 	select PREEMPT_NOTIFIERS
 	select MMU_NOTIFIER
-	select ANON_INODES
 	select HAVE_KVM_IRQCHIP
 	select HAVE_KVM_IRQFD
 	select IRQ_BYPASS_MANAGER
diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c
index abcb8d0..e3cdc85 100644
--- a/arch/x86/mm/dump_pagetables.c
+++ b/arch/x86/mm/dump_pagetables.c
@@ -377,7 +377,7 @@
 
 /*
  * This is an optimization for KASAN=y case. Since all kasan page tables
- * eventually point to the kasan_zero_page we could call note_page()
+ * eventually point to the kasan_early_shadow_page we could call note_page()
  * right away without walking through lower level page tables. This saves
  * us dozens of seconds (minutes for 5-level config) while checking for
  * W+X mapping or reading kernel_page_tables debugfs file.
@@ -385,10 +385,11 @@
 static inline bool kasan_page_table(struct seq_file *m, struct pg_state *st,
 				void *pt)
 {
-	if (__pa(pt) == __pa(kasan_zero_pmd) ||
-	    (pgtable_l5_enabled() && __pa(pt) == __pa(kasan_zero_p4d)) ||
-	    __pa(pt) == __pa(kasan_zero_pud)) {
-		pgprotval_t prot = pte_flags(kasan_zero_pte[0]);
+	if (__pa(pt) == __pa(kasan_early_shadow_pmd) ||
+	    (pgtable_l5_enabled() &&
+			__pa(pt) == __pa(kasan_early_shadow_p4d)) ||
+	    __pa(pt) == __pa(kasan_early_shadow_pud)) {
+		pgprotval_t prot = pte_flags(kasan_early_shadow_pte[0]);
 		note_page(m, st, __pgprot(prot), 0, 5);
 		return true;
 	}
diff --git a/arch/x86/mm/kasan_init_64.c b/arch/x86/mm/kasan_init_64.c
index 4bfd14d..d6f8f87 100644
--- a/arch/x86/mm/kasan_init_64.c
+++ b/arch/x86/mm/kasan_init_64.c
@@ -212,7 +212,8 @@
 	unsigned long next;
 
 	if (pgd_none(*pgd)) {
-		pgd_entry = __pgd(_KERNPG_TABLE | __pa_nodebug(kasan_zero_p4d));
+		pgd_entry = __pgd(_KERNPG_TABLE |
+					__pa_nodebug(kasan_early_shadow_p4d));
 		set_pgd(pgd, pgd_entry);
 	}
 
@@ -223,7 +224,8 @@
 		if (!p4d_none(*p4d))
 			continue;
 
-		p4d_entry = __p4d(_KERNPG_TABLE | __pa_nodebug(kasan_zero_pud));
+		p4d_entry = __p4d(_KERNPG_TABLE |
+					__pa_nodebug(kasan_early_shadow_pud));
 		set_p4d(p4d, p4d_entry);
 	} while (p4d++, addr = next, addr != end && p4d_none(*p4d));
 }
@@ -262,10 +264,11 @@
 void __init kasan_early_init(void)
 {
 	int i;
-	pteval_t pte_val = __pa_nodebug(kasan_zero_page) | __PAGE_KERNEL | _PAGE_ENC;
-	pmdval_t pmd_val = __pa_nodebug(kasan_zero_pte) | _KERNPG_TABLE;
-	pudval_t pud_val = __pa_nodebug(kasan_zero_pmd) | _KERNPG_TABLE;
-	p4dval_t p4d_val = __pa_nodebug(kasan_zero_pud) | _KERNPG_TABLE;
+	pteval_t pte_val = __pa_nodebug(kasan_early_shadow_page) |
+				__PAGE_KERNEL | _PAGE_ENC;
+	pmdval_t pmd_val = __pa_nodebug(kasan_early_shadow_pte) | _KERNPG_TABLE;
+	pudval_t pud_val = __pa_nodebug(kasan_early_shadow_pmd) | _KERNPG_TABLE;
+	p4dval_t p4d_val = __pa_nodebug(kasan_early_shadow_pud) | _KERNPG_TABLE;
 
 	/* Mask out unsupported __PAGE_KERNEL bits: */
 	pte_val &= __default_kernel_pte_mask;
@@ -274,16 +277,16 @@
 	p4d_val &= __default_kernel_pte_mask;
 
 	for (i = 0; i < PTRS_PER_PTE; i++)
-		kasan_zero_pte[i] = __pte(pte_val);
+		kasan_early_shadow_pte[i] = __pte(pte_val);
 
 	for (i = 0; i < PTRS_PER_PMD; i++)
-		kasan_zero_pmd[i] = __pmd(pmd_val);
+		kasan_early_shadow_pmd[i] = __pmd(pmd_val);
 
 	for (i = 0; i < PTRS_PER_PUD; i++)
-		kasan_zero_pud[i] = __pud(pud_val);
+		kasan_early_shadow_pud[i] = __pud(pud_val);
 
 	for (i = 0; pgtable_l5_enabled() && i < PTRS_PER_P4D; i++)
-		kasan_zero_p4d[i] = __p4d(p4d_val);
+		kasan_early_shadow_p4d[i] = __p4d(p4d_val);
 
 	kasan_map_early_shadow(early_top_pgt);
 	kasan_map_early_shadow(init_top_pgt);
@@ -327,7 +330,7 @@
 
 	clear_pgds(KASAN_SHADOW_START & PGDIR_MASK, KASAN_SHADOW_END);
 
-	kasan_populate_zero_shadow((void *)(KASAN_SHADOW_START & PGDIR_MASK),
+	kasan_populate_early_shadow((void *)(KASAN_SHADOW_START & PGDIR_MASK),
 			kasan_mem_to_shadow((void *)PAGE_OFFSET));
 
 	for (i = 0; i < E820_MAX_ENTRIES; i++) {
@@ -339,41 +342,41 @@
 
 	shadow_cpu_entry_begin = (void *)CPU_ENTRY_AREA_BASE;
 	shadow_cpu_entry_begin = kasan_mem_to_shadow(shadow_cpu_entry_begin);
-	shadow_cpu_entry_begin = (void *)round_down((unsigned long)shadow_cpu_entry_begin,
-						PAGE_SIZE);
+	shadow_cpu_entry_begin = (void *)round_down(
+			(unsigned long)shadow_cpu_entry_begin, PAGE_SIZE);
 
 	shadow_cpu_entry_end = (void *)(CPU_ENTRY_AREA_BASE +
 					CPU_ENTRY_AREA_MAP_SIZE);
 	shadow_cpu_entry_end = kasan_mem_to_shadow(shadow_cpu_entry_end);
-	shadow_cpu_entry_end = (void *)round_up((unsigned long)shadow_cpu_entry_end,
-					PAGE_SIZE);
+	shadow_cpu_entry_end = (void *)round_up(
+			(unsigned long)shadow_cpu_entry_end, PAGE_SIZE);
 
-	kasan_populate_zero_shadow(
+	kasan_populate_early_shadow(
 		kasan_mem_to_shadow((void *)PAGE_OFFSET + MAXMEM),
 		shadow_cpu_entry_begin);
 
 	kasan_populate_shadow((unsigned long)shadow_cpu_entry_begin,
 			      (unsigned long)shadow_cpu_entry_end, 0);
 
-	kasan_populate_zero_shadow(shadow_cpu_entry_end,
-				kasan_mem_to_shadow((void *)__START_KERNEL_map));
+	kasan_populate_early_shadow(shadow_cpu_entry_end,
+			kasan_mem_to_shadow((void *)__START_KERNEL_map));
 
 	kasan_populate_shadow((unsigned long)kasan_mem_to_shadow(_stext),
 			      (unsigned long)kasan_mem_to_shadow(_end),
 			      early_pfn_to_nid(__pa(_stext)));
 
-	kasan_populate_zero_shadow(kasan_mem_to_shadow((void *)MODULES_END),
-				(void *)KASAN_SHADOW_END);
+	kasan_populate_early_shadow(kasan_mem_to_shadow((void *)MODULES_END),
+					(void *)KASAN_SHADOW_END);
 
 	load_cr3(init_top_pgt);
 	__flush_tlb_all();
 
 	/*
-	 * kasan_zero_page has been used as early shadow memory, thus it may
-	 * contain some garbage. Now we can clear and write protect it, since
-	 * after the TLB flush no one should write to it.
+	 * kasan_early_shadow_page has been used as early shadow memory, thus
+	 * it may contain some garbage. Now we can clear and write protect it,
+	 * since after the TLB flush no one should write to it.
 	 */
-	memset(kasan_zero_page, 0, PAGE_SIZE);
+	memset(kasan_early_shadow_page, 0, PAGE_SIZE);
 	for (i = 0; i < PTRS_PER_PTE; i++) {
 		pte_t pte;
 		pgprot_t prot;
@@ -381,8 +384,8 @@
 		prot = __pgprot(__PAGE_KERNEL_RO | _PAGE_ENC);
 		pgprot_val(prot) &= __default_kernel_pte_mask;
 
-		pte = __pte(__pa(kasan_zero_page) | pgprot_val(prot));
-		set_pte(&kasan_zero_pte[i], pte);
+		pte = __pte(__pa(kasan_early_shadow_page) | pgprot_val(prot));
+		set_pte(&kasan_early_shadow_pte[i], pte);
 	}
 	/* Flush TLBs again to be sure that write protection applied. */
 	__flush_tlb_all();
diff --git a/arch/xtensa/mm/kasan_init.c b/arch/xtensa/mm/kasan_init.c
index 6b532b6..38ecdbf 100644
--- a/arch/xtensa/mm/kasan_init.c
+++ b/arch/xtensa/mm/kasan_init.c
@@ -25,12 +25,13 @@
 	int i;
 
 	for (i = 0; i < PTRS_PER_PTE; ++i)
-		set_pte(kasan_zero_pte + i,
-			mk_pte(virt_to_page(kasan_zero_page), PAGE_KERNEL));
+		set_pte(kasan_early_shadow_pte + i,
+			mk_pte(virt_to_page(kasan_early_shadow_page),
+				PAGE_KERNEL));
 
 	for (vaddr = 0; vaddr < KASAN_SHADOW_SIZE; vaddr += PMD_SIZE, ++pmd) {
 		BUG_ON(!pmd_none(*pmd));
-		set_pmd(pmd, __pmd((unsigned long)kasan_zero_pte));
+		set_pmd(pmd, __pmd((unsigned long)kasan_early_shadow_pte));
 	}
 	early_trap_init();
 }
@@ -81,13 +82,16 @@
 	populate(kasan_mem_to_shadow((void *)VMALLOC_START),
 		 kasan_mem_to_shadow((void *)XCHAL_KSEG_BYPASS_VADDR));
 
-	/* Write protect kasan_zero_page and zero-initialize it again. */
+	/*
+	 * Write protect kasan_early_shadow_page and zero-initialize it again.
+	 */
 	for (i = 0; i < PTRS_PER_PTE; ++i)
-		set_pte(kasan_zero_pte + i,
-			mk_pte(virt_to_page(kasan_zero_page), PAGE_KERNEL_RO));
+		set_pte(kasan_early_shadow_pte + i,
+			mk_pte(virt_to_page(kasan_early_shadow_page),
+				PAGE_KERNEL_RO));
 
 	local_flush_tlb_all();
-	memset(kasan_zero_page, 0, PAGE_SIZE);
+	memset(kasan_early_shadow_page, 0, PAGE_SIZE);
 
 	/* At this point kasan is fully initialized. Enable error messages. */
 	current->kasan_depth = 0;
diff --git a/block/Kconfig b/block/Kconfig
index 1f2469a..f854303 100644
--- a/block/Kconfig
+++ b/block/Kconfig
@@ -200,6 +200,16 @@
 	Enabling this option enables users to setup/unlock/lock
 	Locking ranges for SED devices using the Opal protocol.
 
+config BLK_INLINE_ENCRYPTION
+	bool "Enable inline encryption support in block layer"
+	select CRYPTO
+	select CRYPTO_BLKCIPHER
+	help
+	  Build the blk-crypto subsystem.
+	  Enabling this lets the block layer handle encryption,
+	  so users can take advantage of inline encryption
+	  hardware if present.
+
 menu "Partition Types"
 
 source "block/partitions/Kconfig"
diff --git a/block/Makefile b/block/Makefile
index 572b33f..550f616 100644
--- a/block/Makefile
+++ b/block/Makefile
@@ -37,3 +37,5 @@
 obj-$(CONFIG_BLK_DEBUG_FS)	+= blk-mq-debugfs.o
 obj-$(CONFIG_BLK_DEBUG_FS_ZONED)+= blk-mq-debugfs-zoned.o
 obj-$(CONFIG_BLK_SED_OPAL)	+= sed-opal.o
+obj-$(CONFIG_BLK_INLINE_ENCRYPTION)	+= keyslot-manager.o bio-crypt-ctx.o \
+					   blk-crypto.o
diff --git a/block/bio-crypt-ctx.c b/block/bio-crypt-ctx.c
new file mode 100644
index 0000000..0f7641b
--- /dev/null
+++ b/block/bio-crypt-ctx.c
@@ -0,0 +1,145 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2019 Google LLC
+ */
+
+#include <linux/bio.h>
+#include <linux/blkdev.h>
+#include <linux/slab.h>
+#include <linux/keyslot-manager.h>
+
+static int num_prealloc_crypt_ctxs = 128;
+static struct kmem_cache *bio_crypt_ctx_cache;
+static mempool_t *bio_crypt_ctx_pool;
+
+int bio_crypt_ctx_init(void)
+{
+	bio_crypt_ctx_cache = KMEM_CACHE(bio_crypt_ctx, 0);
+	if (!bio_crypt_ctx_cache)
+		return -ENOMEM;
+
+	bio_crypt_ctx_pool = mempool_create_slab_pool(
+					num_prealloc_crypt_ctxs,
+					bio_crypt_ctx_cache);
+
+	if (!bio_crypt_ctx_pool)
+		return -ENOMEM;
+
+	return 0;
+}
+
+struct bio_crypt_ctx *bio_crypt_alloc_ctx(gfp_t gfp_mask)
+{
+	return mempool_alloc(bio_crypt_ctx_pool, gfp_mask);
+}
+EXPORT_SYMBOL(bio_crypt_alloc_ctx);
+
+void bio_crypt_free_ctx(struct bio *bio)
+{
+	mempool_free(bio->bi_crypt_context, bio_crypt_ctx_pool);
+	bio->bi_crypt_context = NULL;
+}
+EXPORT_SYMBOL(bio_crypt_free_ctx);
+
+int bio_crypt_clone(struct bio *dst, struct bio *src, gfp_t gfp_mask)
+{
+	/*
+	 * If a bio is swhandled, then it will be decrypted when bio_endio
+	 * is called. As we only want the data to be decrypted once, copies
+	 * of the bio must not have have a crypt context.
+	 */
+	if (!bio_has_crypt_ctx(src) || bio_crypt_swhandled(src))
+		return 0;
+
+	dst->bi_crypt_context = bio_crypt_alloc_ctx(gfp_mask);
+	if (!dst->bi_crypt_context)
+		return -ENOMEM;
+
+	*dst->bi_crypt_context = *src->bi_crypt_context;
+
+	if (bio_crypt_has_keyslot(src))
+		keyslot_manager_get_slot(src->bi_crypt_context->processing_ksm,
+					 src->bi_crypt_context->keyslot);
+
+	return 0;
+}
+EXPORT_SYMBOL(bio_crypt_clone);
+
+bool bio_crypt_should_process(struct bio *bio, struct request_queue *q)
+{
+	if (!bio_has_crypt_ctx(bio))
+		return false;
+
+	if (q->ksm != bio->bi_crypt_context->processing_ksm)
+		return false;
+
+	WARN_ON(!bio_crypt_has_keyslot(bio));
+	return true;
+}
+EXPORT_SYMBOL(bio_crypt_should_process);
+
+/*
+ * Checks that two bio crypt contexts are compatible - i.e. that
+ * they are mergeable except for data_unit_num continuity.
+ */
+bool bio_crypt_ctx_compatible(struct bio *b_1, struct bio *b_2)
+{
+	struct bio_crypt_ctx *bc1 = b_1->bi_crypt_context;
+	struct bio_crypt_ctx *bc2 = b_2->bi_crypt_context;
+
+	if (bio_has_crypt_ctx(b_1) != bio_has_crypt_ctx(b_2))
+		return false;
+
+	if (!bio_has_crypt_ctx(b_1))
+		return true;
+
+	return bc1->keyslot == bc2->keyslot &&
+	       bc1->data_unit_size_bits == bc2->data_unit_size_bits;
+}
+
+/*
+ * Checks that two bio crypt contexts are compatible, and also
+ * that their data_unit_nums are continuous (and can hence be merged)
+ */
+bool bio_crypt_ctx_back_mergeable(struct bio *b_1,
+				  unsigned int b1_sectors,
+				  struct bio *b_2)
+{
+	struct bio_crypt_ctx *bc1 = b_1->bi_crypt_context;
+	struct bio_crypt_ctx *bc2 = b_2->bi_crypt_context;
+
+	if (!bio_crypt_ctx_compatible(b_1, b_2))
+		return false;
+
+	return !bio_has_crypt_ctx(b_1) ||
+		(bc1->data_unit_num +
+		(b1_sectors >> (bc1->data_unit_size_bits - 9)) ==
+		bc2->data_unit_num);
+}
+
+void bio_crypt_ctx_release_keyslot(struct bio *bio)
+{
+	struct bio_crypt_ctx *crypt_ctx = bio->bi_crypt_context;
+
+	keyslot_manager_put_slot(crypt_ctx->processing_ksm, crypt_ctx->keyslot);
+	bio->bi_crypt_context->processing_ksm = NULL;
+	bio->bi_crypt_context->keyslot = -1;
+}
+
+int bio_crypt_ctx_acquire_keyslot(struct bio *bio, struct keyslot_manager *ksm)
+{
+	int slot;
+	enum blk_crypto_mode_num crypto_mode = bio_crypto_mode(bio);
+
+	if (!ksm)
+		return -ENOMEM;
+
+	slot = keyslot_manager_get_slot_for_key(ksm,
+			bio_crypt_raw_key(bio), crypto_mode,
+			1 << bio->bi_crypt_context->data_unit_size_bits);
+	if (slot < 0)
+		return slot;
+
+	bio_crypt_set_keyslot(bio, slot, ksm);
+	return 0;
+}
diff --git a/block/bio.c b/block/bio.c
index 3d75705..62a293b 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -29,6 +29,7 @@
 #include <linux/workqueue.h>
 #include <linux/cgroup.h>
 #include <linux/blk-cgroup.h>
+#include <linux/blk-crypto.h>
 
 #include <trace/events/block.h>
 #include "blk.h"
@@ -253,6 +254,7 @@
 	struct bio_set *bs = bio->bi_pool;
 	void *p;
 
+	bio_crypt_free_ctx(bio);
 	bio_uninit(bio);
 
 	if (bs) {
@@ -632,15 +634,15 @@
 
 	__bio_clone_fast(b, bio);
 
-	if (bio_integrity(bio)) {
-		int ret;
+	if (bio_crypt_clone(b, bio, gfp_mask) < 0) {
+		bio_put(b);
+		return NULL;
+	}
 
-		ret = bio_integrity_clone(b, bio, gfp_mask);
-
-		if (ret < 0) {
-			bio_put(b);
-			return NULL;
-		}
+	if (bio_integrity(bio) &&
+	    bio_integrity_clone(b, bio, gfp_mask) < 0) {
+		bio_put(b);
+		return NULL;
 	}
 
 	return b;
@@ -803,6 +805,9 @@
 
 	bio->bi_iter.bi_size += len;
 	bio->bi_vcnt++;
+
+	if (!bio_flagged(bio, BIO_WORKINGSET) && unlikely(PageWorkingset(page)))
+		bio_set_flag(bio, BIO_WORKINGSET);
 }
 EXPORT_SYMBOL_GPL(__bio_add_page);
 
@@ -950,6 +955,7 @@
 	if (bio_integrity(bio))
 		bio_integrity_advance(bio, bytes);
 
+	bio_crypt_advance(bio, bytes);
 	bio_advance_iter(bio, &bio->bi_iter, bytes);
 }
 EXPORT_SYMBOL(bio_advance);
@@ -1748,6 +1754,10 @@
 again:
 	if (!bio_remaining_done(bio))
 		return;
+
+	if (!blk_crypto_endio(bio))
+		return;
+
 	if (!bio_integrity_endio(bio))
 		return;
 
diff --git a/block/blk-core.c b/block/blk-core.c
index ea33d6a..4a9730f 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -35,6 +35,8 @@
 #include <linux/blk-cgroup.h>
 #include <linux/debugfs.h>
 #include <linux/bpf.h>
+#include <linux/psi.h>
+#include <linux/blk-crypto.h>
 
 #define CREATE_TRACE_POINTS
 #include <trace/events/block.h>
@@ -2461,7 +2463,9 @@
 			/* Create a fresh bio_list for all subordinate requests */
 			bio_list_on_stack[1] = bio_list_on_stack[0];
 			bio_list_init(&bio_list_on_stack[0]);
-			ret = q->make_request_fn(q, bio);
+
+			if (!blk_crypto_submit_bio(&bio))
+				ret = q->make_request_fn(q, bio);
 
 			/* sort new bios into those for a lower level
 			 * and those for the same level
@@ -2515,6 +2519,9 @@
 	if (!generic_make_request_checks(bio))
 		return BLK_QC_T_NONE;
 
+	if (blk_crypto_submit_bio(&bio))
+		return BLK_QC_T_NONE;
+
 	if (unlikely(blk_queue_enter(q, nowait ? BLK_MQ_REQ_NOWAIT : 0))) {
 		if (nowait && !blk_queue_dying(q))
 			bio->bi_status = BLK_STS_AGAIN;
@@ -2541,6 +2548,10 @@
  */
 blk_qc_t submit_bio(struct bio *bio)
 {
+	bool workingset_read = false;
+	unsigned long pflags;
+	blk_qc_t ret;
+
 	/*
 	 * If it's a regular read/write or a barrier with data attached,
 	 * go through the normal accounting stuff before submission.
@@ -2556,6 +2567,8 @@
 		if (op_is_write(bio_op(bio))) {
 			count_vm_events(PGPGOUT, count);
 		} else {
+			if (bio_flagged(bio, BIO_WORKINGSET))
+				workingset_read = true;
 			task_io_account_read(bio->bi_iter.bi_size);
 			count_vm_events(PGPGIN, count);
 		}
@@ -2570,7 +2583,21 @@
 		}
 	}
 
-	return generic_make_request(bio);
+	/*
+	 * If we're reading data that is part of the userspace
+	 * workingset, count submission time as memory stall. When the
+	 * device is congested, or the submitting cgroup IO-throttled,
+	 * submission can be a significant part of overall IO time.
+	 */
+	if (workingset_read)
+		psi_memstall_enter(&pflags);
+
+	ret = generic_make_request(bio);
+
+	if (workingset_read)
+		psi_memstall_leave(&pflags);
+
+	return ret;
 }
 EXPORT_SYMBOL(submit_bio);
 
@@ -3971,5 +3998,11 @@
 	blk_debugfs_root = debugfs_create_dir("block", NULL);
 #endif
 
+	if (bio_crypt_ctx_init() < 0)
+		panic("Failed to allocate mem for bio crypt ctxs\n");
+
+	if (blk_crypto_init() < 0)
+		panic("Failed to init blk-crypto\n");
+
 	return 0;
 }
diff --git a/block/blk-crypto.c b/block/blk-crypto.c
new file mode 100644
index 0000000..3cb3412
--- /dev/null
+++ b/block/blk-crypto.c
@@ -0,0 +1,797 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2019 Google LLC
+ */
+
+/*
+ * Refer to Documentation/block/inline-encryption.rst for detailed explanation.
+ */
+
+#define pr_fmt(fmt) "blk-crypto: " fmt
+
+#include <linux/blk-crypto.h>
+#include <linux/keyslot-manager.h>
+#include <linux/mempool.h>
+#include <linux/blk-cgroup.h>
+#include <linux/crypto.h>
+#include <crypto/skcipher.h>
+#include <crypto/algapi.h>
+#include <linux/module.h>
+#include <linux/sched/mm.h>
+
+/* Represents a crypto mode supported by blk-crypto  */
+struct blk_crypto_mode {
+	const char *cipher_str; /* crypto API name (for fallback case) */
+	size_t keysize; /* key size in bytes */
+};
+
+static const struct blk_crypto_mode blk_crypto_modes[] = {
+	[BLK_ENCRYPTION_MODE_AES_256_XTS] = {
+		.cipher_str = "xts(aes)",
+		.keysize = 64,
+	},
+};
+
+static unsigned int num_prealloc_bounce_pg = 32;
+module_param(num_prealloc_bounce_pg, uint, 0);
+MODULE_PARM_DESC(num_prealloc_bounce_pg,
+	"Number of preallocated bounce pages for blk-crypto to use during crypto API fallback encryption");
+
+#define BLK_CRYPTO_MAX_KEY_SIZE 64
+static int blk_crypto_num_keyslots = 100;
+module_param_named(num_keyslots, blk_crypto_num_keyslots, int, 0);
+MODULE_PARM_DESC(num_keyslots,
+		 "Number of keyslots for crypto API fallback in blk-crypto.");
+
+static struct blk_crypto_keyslot {
+	struct crypto_skcipher *tfm;
+	enum blk_crypto_mode_num crypto_mode;
+	u8 key[BLK_CRYPTO_MAX_KEY_SIZE];
+	struct crypto_skcipher *tfms[ARRAY_SIZE(blk_crypto_modes)];
+} *blk_crypto_keyslots;
+
+/*
+ * Allocating a crypto tfm during I/O can deadlock, so we have to preallocate
+ * all of a mode's tfms when that mode starts being used. Since each mode may
+ * need all the keyslots at some point, each mode needs its own tfm for each
+ * keyslot; thus, a keyslot may contain tfms for multiple modes.  However, to
+ * match the behavior of real inline encryption hardware (which only supports a
+ * single encryption context per keyslot), we only allow one tfm per keyslot to
+ * be used at a time - the rest of the unused tfms have their keys cleared.
+ */
+static struct mutex tfms_lock[ARRAY_SIZE(blk_crypto_modes)];
+static bool tfms_inited[ARRAY_SIZE(blk_crypto_modes)];
+
+struct work_mem {
+	struct work_struct crypto_work;
+	struct bio *bio;
+};
+
+/* The following few vars are only used during the crypto API fallback */
+static struct keyslot_manager *blk_crypto_ksm;
+static struct workqueue_struct *blk_crypto_wq;
+static mempool_t *blk_crypto_page_pool;
+static struct kmem_cache *blk_crypto_work_mem_cache;
+
+bool bio_crypt_swhandled(struct bio *bio)
+{
+	return bio_has_crypt_ctx(bio) &&
+	       bio->bi_crypt_context->processing_ksm == blk_crypto_ksm;
+}
+
+static u8 blank_key[BLK_CRYPTO_MAX_KEY_SIZE];
+static void evict_keyslot(unsigned int slot)
+{
+	struct blk_crypto_keyslot *slotp = &blk_crypto_keyslots[slot];
+	enum blk_crypto_mode_num crypto_mode = slotp->crypto_mode;
+	int err;
+
+	WARN_ON(slotp->crypto_mode == BLK_ENCRYPTION_MODE_INVALID);
+
+	/* Clear the key in the skcipher */
+	err = crypto_skcipher_setkey(slotp->tfms[crypto_mode], blank_key,
+				     blk_crypto_modes[crypto_mode].keysize);
+	WARN_ON(err);
+	memzero_explicit(slotp->key, BLK_CRYPTO_MAX_KEY_SIZE);
+	slotp->crypto_mode = BLK_ENCRYPTION_MODE_INVALID;
+}
+
+static int blk_crypto_keyslot_program(void *priv, const u8 *key,
+				      enum blk_crypto_mode_num crypto_mode,
+				      unsigned int data_unit_size,
+				      unsigned int slot)
+{
+	struct blk_crypto_keyslot *slotp = &blk_crypto_keyslots[slot];
+	const struct blk_crypto_mode *mode = &blk_crypto_modes[crypto_mode];
+	size_t keysize = mode->keysize;
+	int err;
+
+	if (crypto_mode != slotp->crypto_mode &&
+	    slotp->crypto_mode != BLK_ENCRYPTION_MODE_INVALID) {
+		evict_keyslot(slot);
+	}
+
+	if (!slotp->tfms[crypto_mode])
+		return -ENOMEM;
+	slotp->crypto_mode = crypto_mode;
+	err = crypto_skcipher_setkey(slotp->tfms[crypto_mode], key, keysize);
+
+	if (err) {
+		evict_keyslot(slot);
+		return err;
+	}
+
+	memcpy(slotp->key, key, keysize);
+
+	return 0;
+}
+
+static int blk_crypto_keyslot_evict(void *priv, const u8 *key,
+				    enum blk_crypto_mode_num crypto_mode,
+				    unsigned int data_unit_size,
+				    unsigned int slot)
+{
+	evict_keyslot(slot);
+	return 0;
+}
+
+static int blk_crypto_keyslot_find(void *priv,
+				   const u8 *key,
+				   enum blk_crypto_mode_num crypto_mode,
+				   unsigned int data_unit_size_bytes)
+{
+	int slot;
+	const size_t keysize = blk_crypto_modes[crypto_mode].keysize;
+
+	for (slot = 0; slot < blk_crypto_num_keyslots; slot++) {
+		if (blk_crypto_keyslots[slot].crypto_mode == crypto_mode &&
+		    !crypto_memneq(blk_crypto_keyslots[slot].key, key, keysize))
+			return slot;
+	}
+
+	return -ENOKEY;
+}
+
+static bool blk_crypto_mode_supported(void *priv,
+				      enum blk_crypto_mode_num crypt_mode,
+				      unsigned int data_unit_size)
+{
+	/* All blk_crypto_modes are required to have a crypto API fallback. */
+	return true;
+}
+
+/*
+ * The crypto API fallback KSM ops - only used for a bio when it specifies a
+ * blk_crypto_mode for which we failed to get a keyslot in the device's inline
+ * encryption hardware (which probably means the device doesn't have inline
+ * encryption hardware that supports that crypto mode).
+ */
+static const struct keyslot_mgmt_ll_ops blk_crypto_ksm_ll_ops = {
+	.keyslot_program	= blk_crypto_keyslot_program,
+	.keyslot_evict		= blk_crypto_keyslot_evict,
+	.keyslot_find		= blk_crypto_keyslot_find,
+	.crypto_mode_supported	= blk_crypto_mode_supported,
+};
+
+static void blk_crypto_encrypt_endio(struct bio *enc_bio)
+{
+	struct bio *src_bio = enc_bio->bi_private;
+	int i;
+
+	for (i = 0; i < enc_bio->bi_vcnt; i++)
+		mempool_free(enc_bio->bi_io_vec[i].bv_page,
+			     blk_crypto_page_pool);
+
+	src_bio->bi_status = enc_bio->bi_status;
+
+	bio_put(enc_bio);
+	bio_endio(src_bio);
+}
+
+static struct bio *blk_crypto_clone_bio(struct bio *bio_src)
+{
+	struct bvec_iter iter;
+	struct bio_vec bv;
+	struct bio *bio;
+
+	bio = bio_alloc_bioset(GFP_NOIO, bio_segments(bio_src), NULL);
+	if (!bio)
+		return NULL;
+	bio->bi_disk		= bio_src->bi_disk;
+	bio->bi_opf		= bio_src->bi_opf;
+	bio->bi_ioprio		= bio_src->bi_ioprio;
+	bio->bi_write_hint	= bio_src->bi_write_hint;
+	bio->bi_iter.bi_sector	= bio_src->bi_iter.bi_sector;
+	bio->bi_iter.bi_size	= bio_src->bi_iter.bi_size;
+
+	bio_for_each_segment(bv, bio_src, iter)
+		bio->bi_io_vec[bio->bi_vcnt++] = bv;
+
+	if (bio_integrity(bio_src) &&
+	    bio_integrity_clone(bio, bio_src, GFP_NOIO) < 0) {
+		bio_put(bio);
+		return NULL;
+	}
+
+	bio_clone_blkcg_association(bio, bio_src);
+
+	return bio;
+}
+
+/* Check that all I/O segments are data unit aligned */
+static int bio_crypt_check_alignment(struct bio *bio)
+{
+	int data_unit_size = 1 << bio->bi_crypt_context->data_unit_size_bits;
+	struct bvec_iter iter;
+	struct bio_vec bv;
+
+	bio_for_each_segment(bv, bio, iter) {
+		if (!IS_ALIGNED(bv.bv_len | bv.bv_offset, data_unit_size))
+			return -EIO;
+	}
+	return 0;
+}
+
+static int blk_crypto_alloc_cipher_req(struct bio *src_bio,
+				       struct skcipher_request **ciph_req_ptr,
+				       struct crypto_wait *wait)
+{
+	int slot;
+	struct skcipher_request *ciph_req;
+	struct blk_crypto_keyslot *slotp;
+
+	slot = bio_crypt_get_keyslot(src_bio);
+	slotp = &blk_crypto_keyslots[slot];
+	ciph_req = skcipher_request_alloc(slotp->tfms[slotp->crypto_mode],
+					  GFP_NOIO);
+	if (!ciph_req) {
+		src_bio->bi_status = BLK_STS_RESOURCE;
+		return -ENOMEM;
+	}
+
+	skcipher_request_set_callback(ciph_req,
+				      CRYPTO_TFM_REQ_MAY_BACKLOG |
+				      CRYPTO_TFM_REQ_MAY_SLEEP,
+				      crypto_req_done, wait);
+	*ciph_req_ptr = ciph_req;
+	return 0;
+}
+
+static int blk_crypto_split_bio_if_needed(struct bio **bio_ptr)
+{
+	struct bio *bio = *bio_ptr;
+	unsigned int i = 0;
+	unsigned int num_sectors = 0;
+	struct bio_vec bv;
+	struct bvec_iter iter;
+
+	bio_for_each_segment(bv, bio, iter) {
+		num_sectors += bv.bv_len >> SECTOR_SHIFT;
+		if (++i == BIO_MAX_PAGES)
+			break;
+	}
+	if (num_sectors < bio_sectors(bio)) {
+		struct bio *split_bio;
+
+		split_bio = bio_split(bio, num_sectors, GFP_NOIO, NULL);
+		if (!split_bio) {
+			bio->bi_status = BLK_STS_RESOURCE;
+			return -ENOMEM;
+		}
+		bio_chain(split_bio, bio);
+		generic_make_request(bio);
+		*bio_ptr = split_bio;
+	}
+	return 0;
+}
+
+/*
+ * The crypto API fallback's encryption routine.
+ * Allocate a bounce bio for encryption, encrypt the input bio using
+ * crypto API, and replace *bio_ptr with the bounce bio. May split input
+ * bio if it's too large.
+ */
+static int blk_crypto_encrypt_bio(struct bio **bio_ptr)
+{
+	struct bio *src_bio;
+	struct skcipher_request *ciph_req = NULL;
+	DECLARE_CRYPTO_WAIT(wait);
+	int err = 0;
+	u64 curr_dun;
+	union {
+		__le64 dun;
+		u8 bytes[16];
+	} iv;
+	struct scatterlist src, dst;
+	struct bio *enc_bio;
+	struct bio_vec *enc_bvec;
+	int i, j;
+	int data_unit_size;
+
+	/* Split the bio if it's too big for single page bvec */
+	err = blk_crypto_split_bio_if_needed(bio_ptr);
+	if (err)
+		return err;
+
+	src_bio = *bio_ptr;
+	data_unit_size = 1 << src_bio->bi_crypt_context->data_unit_size_bits;
+
+	/* Allocate bounce bio for encryption */
+	enc_bio = blk_crypto_clone_bio(src_bio);
+	if (!enc_bio) {
+		src_bio->bi_status = BLK_STS_RESOURCE;
+		return -ENOMEM;
+	}
+
+	/*
+	 * Use the crypto API fallback keyslot manager to get a crypto_skcipher
+	 * for the algorithm and key specified for this bio.
+	 */
+	err = bio_crypt_ctx_acquire_keyslot(src_bio, blk_crypto_ksm);
+	if (err) {
+		src_bio->bi_status = BLK_STS_IOERR;
+		goto out_put_enc_bio;
+	}
+
+	/* and then allocate an skcipher_request for it */
+	err = blk_crypto_alloc_cipher_req(src_bio, &ciph_req, &wait);
+	if (err)
+		goto out_release_keyslot;
+
+	curr_dun = bio_crypt_data_unit_num(src_bio);
+	sg_init_table(&src, 1);
+	sg_init_table(&dst, 1);
+
+	skcipher_request_set_crypt(ciph_req, &src, &dst,
+				   data_unit_size, iv.bytes);
+
+	/* Encrypt each page in the bounce bio */
+	for (i = 0, enc_bvec = enc_bio->bi_io_vec; i < enc_bio->bi_vcnt;
+	     enc_bvec++, i++) {
+		struct page *plaintext_page = enc_bvec->bv_page;
+		struct page *ciphertext_page =
+			mempool_alloc(blk_crypto_page_pool, GFP_NOIO);
+
+		enc_bvec->bv_page = ciphertext_page;
+
+		if (!ciphertext_page) {
+			src_bio->bi_status = BLK_STS_RESOURCE;
+			err = -ENOMEM;
+			goto out_free_bounce_pages;
+		}
+
+		sg_set_page(&src, plaintext_page, data_unit_size,
+			    enc_bvec->bv_offset);
+		sg_set_page(&dst, ciphertext_page, data_unit_size,
+			    enc_bvec->bv_offset);
+
+		/* Encrypt each data unit in this page */
+		for (j = 0; j < enc_bvec->bv_len; j += data_unit_size) {
+			memset(&iv, 0, sizeof(iv));
+			iv.dun = cpu_to_le64(curr_dun);
+
+			err = crypto_wait_req(crypto_skcipher_encrypt(ciph_req),
+					      &wait);
+			if (err) {
+				i++;
+				src_bio->bi_status = BLK_STS_RESOURCE;
+				goto out_free_bounce_pages;
+			}
+			curr_dun++;
+			src.offset += data_unit_size;
+			dst.offset += data_unit_size;
+		}
+	}
+
+	enc_bio->bi_private = src_bio;
+	enc_bio->bi_end_io = blk_crypto_encrypt_endio;
+	*bio_ptr = enc_bio;
+
+	enc_bio = NULL;
+	err = 0;
+	goto out_free_ciph_req;
+
+out_free_bounce_pages:
+	while (i > 0)
+		mempool_free(enc_bio->bi_io_vec[--i].bv_page,
+			     blk_crypto_page_pool);
+out_free_ciph_req:
+	skcipher_request_free(ciph_req);
+out_release_keyslot:
+	bio_crypt_ctx_release_keyslot(src_bio);
+out_put_enc_bio:
+	if (enc_bio)
+		bio_put(enc_bio);
+
+	return err;
+}
+
+/*
+ * The crypto API fallback's main decryption routine.
+ * Decrypts input bio in place.
+ */
+static void blk_crypto_decrypt_bio(struct work_struct *w)
+{
+	struct work_mem *work_mem =
+		container_of(w, struct work_mem, crypto_work);
+	struct bio *bio = work_mem->bio;
+	struct skcipher_request *ciph_req = NULL;
+	DECLARE_CRYPTO_WAIT(wait);
+	struct bio_vec bv;
+	struct bvec_iter iter;
+	u64 curr_dun;
+	union {
+		__le64 dun;
+		u8 bytes[16];
+	} iv;
+	struct scatterlist sg;
+	int data_unit_size = 1 << bio->bi_crypt_context->data_unit_size_bits;
+	int i;
+	int err;
+
+	/*
+	 * Use the crypto API fallback keyslot manager to get a crypto_skcipher
+	 * for the algorithm and key specified for this bio.
+	 */
+	if (bio_crypt_ctx_acquire_keyslot(bio, blk_crypto_ksm)) {
+		bio->bi_status = BLK_STS_RESOURCE;
+		goto out_no_keyslot;
+	}
+
+	/* and then allocate an skcipher_request for it */
+	err = blk_crypto_alloc_cipher_req(bio, &ciph_req, &wait);
+	if (err)
+		goto out;
+
+	curr_dun = bio_crypt_sw_data_unit_num(bio);
+	sg_init_table(&sg, 1);
+	skcipher_request_set_crypt(ciph_req, &sg, &sg, data_unit_size,
+				   iv.bytes);
+
+	/* Decrypt each segment in the bio */
+	__bio_for_each_segment(bv, bio, iter,
+			       bio->bi_crypt_context->crypt_iter) {
+		struct page *page = bv.bv_page;
+
+		sg_set_page(&sg, page, data_unit_size, bv.bv_offset);
+
+		/* Decrypt each data unit in the segment */
+		for (i = 0; i < bv.bv_len; i += data_unit_size) {
+			memset(&iv, 0, sizeof(iv));
+			iv.dun = cpu_to_le64(curr_dun);
+			if (crypto_wait_req(crypto_skcipher_decrypt(ciph_req),
+					    &wait)) {
+				bio->bi_status = BLK_STS_IOERR;
+				goto out;
+			}
+			curr_dun++;
+			sg.offset += data_unit_size;
+		}
+	}
+
+out:
+	skcipher_request_free(ciph_req);
+	bio_crypt_ctx_release_keyslot(bio);
+out_no_keyslot:
+	kmem_cache_free(blk_crypto_work_mem_cache, work_mem);
+	bio_endio(bio);
+}
+
+/* Queue bio for decryption */
+static void blk_crypto_queue_decrypt_bio(struct bio *bio)
+{
+	struct work_mem *work_mem =
+		kmem_cache_zalloc(blk_crypto_work_mem_cache, GFP_ATOMIC);
+
+	if (!work_mem) {
+		bio->bi_status = BLK_STS_RESOURCE;
+		bio_endio(bio);
+		return;
+	}
+
+	INIT_WORK(&work_mem->crypto_work, blk_crypto_decrypt_bio);
+	work_mem->bio = bio;
+	queue_work(blk_crypto_wq, &work_mem->crypto_work);
+}
+
+/**
+ * blk_crypto_submit_bio - handle submitting bio for inline encryption
+ *
+ * @bio_ptr: pointer to original bio pointer
+ *
+ * If the bio doesn't have inline encryption enabled or the submitter already
+ * specified a keyslot for the target device, do nothing.  Else, a raw key must
+ * have been provided, so acquire a device keyslot for it if supported.  Else,
+ * use the crypto API fallback.
+ *
+ * When the crypto API fallback is used for encryption, blk-crypto may choose to
+ * split the bio into 2 - the first one that will continue to be processed and
+ * the second one that will be resubmitted via generic_make_request.
+ * A bounce bio will be allocated to encrypt the contents of the aforementioned
+ * "first one", and *bio_ptr will be updated to this bounce bio.
+ *
+ * Return: 0 if bio submission should continue; nonzero if bio_endio() was
+ *	   already called so bio submission should abort.
+ */
+int blk_crypto_submit_bio(struct bio **bio_ptr)
+{
+	struct bio *bio = *bio_ptr;
+	struct request_queue *q;
+	int err;
+	struct bio_crypt_ctx *crypt_ctx;
+
+	if (!bio_has_crypt_ctx(bio) || !bio_has_data(bio))
+		return 0;
+
+	/*
+	 * When a read bio is marked for sw decryption, its bi_iter is saved
+	 * so that when we decrypt the bio later, we know what part of it was
+	 * marked for sw decryption (when the bio is passed down after
+	 * blk_crypto_submit bio, it may be split or advanced so we cannot rely
+	 * on the bi_iter while decrypting in blk_crypto_endio)
+	 */
+	if (bio_crypt_swhandled(bio))
+		return 0;
+
+	err = bio_crypt_check_alignment(bio);
+	if (err) {
+		bio->bi_status = BLK_STS_IOERR;
+		goto out;
+	}
+
+	crypt_ctx = bio->bi_crypt_context;
+	q = bio->bi_disk->queue;
+
+	if (bio_crypt_has_keyslot(bio)) {
+		/* Key already programmed into device? */
+		if (q->ksm == crypt_ctx->processing_ksm)
+			return 0;
+
+		/* Nope, release the existing keyslot. */
+		bio_crypt_ctx_release_keyslot(bio);
+	}
+
+	/* Get device keyslot if supported */
+	if (q->ksm) {
+		err = bio_crypt_ctx_acquire_keyslot(bio, q->ksm);
+		if (!err)
+			return 0;
+
+		pr_warn_once("Failed to acquire keyslot for %s (err=%d).  Falling back to crypto API.\n",
+			     bio->bi_disk->disk_name, err);
+	}
+
+	/* Fallback to crypto API */
+	if (!READ_ONCE(tfms_inited[bio->bi_crypt_context->crypto_mode])) {
+		err = -EIO;
+		bio->bi_status = BLK_STS_IOERR;
+		goto out;
+	}
+
+	if (bio_data_dir(bio) == WRITE) {
+		/* Encrypt the data now */
+		err = blk_crypto_encrypt_bio(bio_ptr);
+		if (err)
+			goto out;
+	} else {
+		/* Mark bio as swhandled */
+		bio->bi_crypt_context->processing_ksm = blk_crypto_ksm;
+		bio->bi_crypt_context->crypt_iter = bio->bi_iter;
+		bio->bi_crypt_context->sw_data_unit_num =
+				bio->bi_crypt_context->data_unit_num;
+	}
+	return 0;
+out:
+	bio_endio(*bio_ptr);
+	return err;
+}
+
+/**
+ * blk_crypto_endio - clean up bio w.r.t inline encryption during bio_endio
+ *
+ * @bio - the bio to clean up
+ *
+ * If blk_crypto_submit_bio decided to fallback to crypto API for this
+ * bio, we queue the bio for decryption into a workqueue and return false,
+ * and call bio_endio(bio) at a later time (after the bio has been decrypted).
+ *
+ * If the bio is not to be decrypted by the crypto API, this function releases
+ * the reference to the keyslot that blk_crypto_submit_bio got.
+ *
+ * Return: true if bio_endio should continue; false otherwise (bio_endio will
+ * be called again when bio has been decrypted).
+ */
+bool blk_crypto_endio(struct bio *bio)
+{
+	if (!bio_has_crypt_ctx(bio))
+		return true;
+
+	if (bio_crypt_swhandled(bio)) {
+		/*
+		 * The only bios that are swhandled when they reach here
+		 * are those with bio_data_dir(bio) == READ, since WRITE
+		 * bios that are encrypted by the crypto API fallback are
+		 * handled by blk_crypto_encrypt_endio.
+		 */
+
+		/* If there was an IO error, don't decrypt. */
+		if (bio->bi_status)
+			return true;
+
+		blk_crypto_queue_decrypt_bio(bio);
+		return false;
+	}
+
+	if (bio_crypt_has_keyslot(bio))
+		bio_crypt_ctx_release_keyslot(bio);
+
+	return true;
+}
+
+/**
+ * blk_crypto_start_using_mode() - Allocate skciphers for a
+ *				   mode_num for all keyslots
+ * @mode_num - the blk_crypto_mode we want to allocate ciphers for.
+ *
+ * Upper layers (filesystems) should call this function to ensure that a
+ * the crypto API fallback has transforms for this algorithm, if they become
+ * necessary.
+ *
+ * Return: 0 on success and -err on error.
+ */
+int blk_crypto_start_using_mode(enum blk_crypto_mode_num mode_num,
+				unsigned int data_unit_size,
+				struct request_queue *q)
+{
+	struct blk_crypto_keyslot *slotp;
+	int err = 0;
+	int i;
+
+	/*
+	 * Fast path
+	 * Ensure that updates to blk_crypto_keyslots[i].tfms[mode_num]
+	 * for each i are visible before we try to access them.
+	 */
+	if (likely(smp_load_acquire(&tfms_inited[mode_num])))
+		return 0;
+
+	/*
+	 * If the keyslot manager of the request queue supports this
+	 * crypto mode, then we don't need to allocate this mode.
+	 */
+	if (keyslot_manager_crypto_mode_supported(q->ksm, mode_num,
+						  data_unit_size)) {
+		return 0;
+	}
+
+	mutex_lock(&tfms_lock[mode_num]);
+	if (likely(tfms_inited[mode_num]))
+		goto out;
+
+	for (i = 0; i < blk_crypto_num_keyslots; i++) {
+		slotp = &blk_crypto_keyslots[i];
+		slotp->tfms[mode_num] = crypto_alloc_skcipher(
+					blk_crypto_modes[mode_num].cipher_str,
+					0, 0);
+		if (IS_ERR(slotp->tfms[mode_num])) {
+			err = PTR_ERR(slotp->tfms[mode_num]);
+			slotp->tfms[mode_num] = NULL;
+			goto out_free_tfms;
+		}
+
+		crypto_skcipher_set_flags(slotp->tfms[mode_num],
+					  CRYPTO_TFM_REQ_WEAK_KEY);
+	}
+
+	/*
+	 * Ensure that updates to blk_crypto_keyslots[i].tfms[mode_num]
+	 * for each i are visible before we set tfms_inited[mode_num].
+	 */
+	smp_store_release(&tfms_inited[mode_num], true);
+	goto out;
+
+out_free_tfms:
+	for (i = 0; i < blk_crypto_num_keyslots; i++) {
+		slotp = &blk_crypto_keyslots[i];
+		crypto_free_skcipher(slotp->tfms[mode_num]);
+		slotp->tfms[mode_num] = NULL;
+	}
+out:
+	mutex_unlock(&tfms_lock[mode_num]);
+	return err;
+}
+EXPORT_SYMBOL(blk_crypto_start_using_mode);
+
+/**
+ * blk_crypto_evict_key() - Evict a key from any inline encryption hardware
+ *			    it may have been programmed into
+ * @q - The request queue who's keyslot manager this key might have been
+ *	programmed into
+ * @key - The key to evict
+ * @mode - The blk_crypto_mode_num used with this key
+ * @data_unit_size - The data unit size used with this key
+ *
+ * Upper layers (filesystems) should call this function to ensure that a key
+ * is evicted from hardware that it might have been programmed into. This
+ * will call keyslot_manager_evict_key on the queue's keyslot manager, if one
+ * exists, and supports the crypto algorithm with the specified data unit size.
+ * Otherwise, it will evict the key from the blk_crypto_ksm.
+ *
+ * Return: 0 on success, -err on error.
+ */
+int blk_crypto_evict_key(struct request_queue *q, const u8 *key,
+			 enum blk_crypto_mode_num mode,
+			 unsigned int data_unit_size)
+{
+	struct keyslot_manager *ksm = blk_crypto_ksm;
+
+	if (q && q->ksm && keyslot_manager_crypto_mode_supported(q->ksm, mode,
+							    data_unit_size)) {
+		ksm = q->ksm;
+	}
+
+	return keyslot_manager_evict_key(ksm, key, mode, data_unit_size);
+}
+EXPORT_SYMBOL(blk_crypto_evict_key);
+
+int __init blk_crypto_init(void)
+{
+	int i;
+	int err = -ENOMEM;
+
+	prandom_bytes(blank_key, BLK_CRYPTO_MAX_KEY_SIZE);
+
+	blk_crypto_ksm = keyslot_manager_create(blk_crypto_num_keyslots,
+						&blk_crypto_ksm_ll_ops,
+						NULL);
+	if (!blk_crypto_ksm)
+		goto out;
+
+	blk_crypto_wq = alloc_workqueue("blk_crypto_wq",
+					WQ_UNBOUND | WQ_HIGHPRI |
+					WQ_MEM_RECLAIM,
+					num_online_cpus());
+	if (!blk_crypto_wq)
+		goto out_free_ksm;
+
+	blk_crypto_keyslots = kcalloc(blk_crypto_num_keyslots,
+				      sizeof(*blk_crypto_keyslots),
+				      GFP_KERNEL);
+	if (!blk_crypto_keyslots)
+		goto out_free_workqueue;
+
+	for (i = 0; i < blk_crypto_num_keyslots; i++) {
+		blk_crypto_keyslots[i].crypto_mode =
+						BLK_ENCRYPTION_MODE_INVALID;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(blk_crypto_modes); i++)
+		mutex_init(&tfms_lock[i]);
+
+	blk_crypto_page_pool =
+		mempool_create_page_pool(num_prealloc_bounce_pg, 0);
+	if (!blk_crypto_page_pool)
+		goto out_free_keyslots;
+
+	blk_crypto_work_mem_cache = KMEM_CACHE(work_mem, SLAB_RECLAIM_ACCOUNT);
+	if (!blk_crypto_work_mem_cache)
+		goto out_free_page_pool;
+
+	return 0;
+
+out_free_page_pool:
+	mempool_destroy(blk_crypto_page_pool);
+	blk_crypto_page_pool = NULL;
+out_free_keyslots:
+	kzfree(blk_crypto_keyslots);
+	blk_crypto_keyslots = NULL;
+out_free_workqueue:
+	destroy_workqueue(blk_crypto_wq);
+	blk_crypto_wq = NULL;
+out_free_ksm:
+	keyslot_manager_destroy(blk_crypto_ksm);
+	blk_crypto_ksm = NULL;
+out:
+	pr_warn("No memory for blk-crypto crypto API fallback.");
+	return err;
+}
diff --git a/block/blk-iolatency.c b/block/blk-iolatency.c
index 0529e94..c6529f2 100644
--- a/block/blk-iolatency.c
+++ b/block/blk-iolatency.c
@@ -141,7 +141,7 @@
 #define BLKIOLATENCY_MAX_WIN_SIZE NSEC_PER_SEC
 /*
  * These are the constants used to fake the fixed-point moving average
- * calculation just like load average.  The call to CALC_LOAD folds
+ * calculation just like load average.  The call to calc_load() folds
  * (FIXED_1 (2048) - exp_factor) * new_sample into lat_avg.  The sampling
  * window size is bucketed to try to approximately calculate average
  * latency such that 1/exp (decay rate) is [1 min, 2.5 min) when windows
@@ -505,7 +505,7 @@
 	lat_info = &parent->child_lat;
 
 	/*
-	 * CALC_LOAD takes in a number stored in fixed point representation.
+	 * calc_load() takes in a number stored in fixed point representation.
 	 * Because we are using this for IO time in ns, the values stored
 	 * are significantly larger than the FIXED_1 denominator (2048).
 	 * Therefore, rounding errors in the calculation are negligible and
@@ -514,7 +514,9 @@
 	exp_idx = min_t(int, BLKIOLATENCY_NR_EXP_FACTORS - 1,
 			div64_u64(iolat->cur_win_nsec,
 				  BLKIOLATENCY_EXP_BUCKET_SIZE));
-	CALC_LOAD(iolat->lat_avg, iolatency_exp_factors[exp_idx], stat.mean);
+	iolat->lat_avg = calc_load(iolat->lat_avg,
+				   iolatency_exp_factors[exp_idx],
+				   stat.mean);
 
 	/* Everything is ok and we don't need to adjust the scale. */
 	if (stat.mean <= iolat->min_lat_nsec &&
diff --git a/block/blk-merge.c b/block/blk-merge.c
index 2776ee6..9703519 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -495,6 +495,9 @@
 	if (blk_integrity_merge_bio(q, req, bio) == false)
 		goto no_merge;
 
+	if (WARN_ON_ONCE(!bio_crypt_ctx_compatible(bio, req->bio)))
+		goto no_merge;
+
 	/*
 	 * This will form the start of a new hw segment.  Bump both
 	 * counters.
@@ -727,6 +730,11 @@
 	if (req->write_hint != next->write_hint)
 		return NULL;
 
+	if (!bio_crypt_ctx_back_mergeable(req->bio, blk_rq_sectors(req),
+					  next->bio)) {
+		return NULL;
+	}
+
 	/*
 	 * If we are allowed to merge, then append bio list
 	 * from next to rq and release next. merge_requests_fn
@@ -865,16 +873,31 @@
 	if (rq->write_hint != bio->bi_write_hint)
 		return false;
 
+	/* Only merge if the crypt contexts are compatible */
+	if (!bio_crypt_ctx_compatible(bio, rq->bio))
+		return false;
+
 	return true;
 }
 
 enum elv_merge blk_try_merge(struct request *rq, struct bio *bio)
 {
-	if (blk_discard_mergable(rq))
+	if (blk_discard_mergable(rq)) {
 		return ELEVATOR_DISCARD_MERGE;
-	else if (blk_rq_pos(rq) + blk_rq_sectors(rq) == bio->bi_iter.bi_sector)
+	} else if (blk_rq_pos(rq) + blk_rq_sectors(rq) ==
+		   bio->bi_iter.bi_sector) {
+		if (!bio_crypt_ctx_back_mergeable(rq->bio,
+						  blk_rq_sectors(rq), bio)) {
+			return ELEVATOR_NO_MERGE;
+		}
 		return ELEVATOR_BACK_MERGE;
-	else if (blk_rq_pos(rq) - bio_sectors(bio) == bio->bi_iter.bi_sector)
+	} else if (blk_rq_pos(rq) - bio_sectors(bio) ==
+		   bio->bi_iter.bi_sector) {
+		if (!bio_crypt_ctx_back_mergeable(bio,
+						  bio_sectors(bio), rq->bio)) {
+			return ELEVATOR_NO_MERGE;
+		}
 		return ELEVATOR_FRONT_MERGE;
+	}
 	return ELEVATOR_NO_MERGE;
 }
diff --git a/block/bounce.c b/block/bounce.c
index abb50e7..40a3856 100644
--- a/block/bounce.c
+++ b/block/bounce.c
@@ -267,14 +267,15 @@
 		break;
 	}
 
-	if (bio_integrity(bio_src)) {
-		int ret;
+	if (bio_crypt_clone(bio, bio_src, gfp_mask) < 0) {
+		bio_put(bio);
+		return NULL;
+	}
 
-		ret = bio_integrity_clone(bio, bio_src, gfp_mask);
-		if (ret < 0) {
-			bio_put(bio);
-			return NULL;
-		}
+	if (bio_integrity(bio_src) &&
+	    bio_integrity_clone(bio, bio_src, gfp_mask) < 0) {
+		bio_put(bio);
+		return NULL;
 	}
 
 	bio_clone_blkcg_association(bio, bio_src);
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 2eb8744..9ad5211 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -225,6 +225,7 @@
 
 	unsigned int weight;
 	unsigned int leaf_weight;
+	u64 group_idle;
 };
 
 /* This is per cgroup per device grouping structure */
@@ -310,6 +311,7 @@
 	struct cfq_queue *async_cfqq[2][IOPRIO_BE_NR];
 	struct cfq_queue *async_idle_cfqq;
 
+	u64 group_idle;
 };
 
 struct cfq_io_cq {
@@ -805,6 +807,17 @@
 
 #endif	/* CONFIG_CFQ_GROUP_IOSCHED */
 
+static inline u64 get_group_idle(struct cfq_data *cfqd)
+{
+#ifdef CONFIG_CFQ_GROUP_IOSCHED
+	struct cfq_queue *cfqq = cfqd->active_queue;
+
+	if (cfqq && cfqq->cfqg)
+		return cfqq->cfqg->group_idle;
+#endif
+	return cfqd->cfq_group_idle;
+}
+
 #define cfq_log(cfqd, fmt, args...)	\
 	blk_add_trace_msg((cfqd)->queue, "cfq " fmt, ##args)
 
@@ -825,7 +838,7 @@
 	if (!sample_valid(ttime->ttime_samples))
 		return false;
 	if (group_idle)
-		slice = cfqd->cfq_group_idle;
+		slice = get_group_idle(cfqd);
 	else
 		slice = cfqd->cfq_slice_idle;
 	return ttime->ttime_mean > slice;
@@ -1592,6 +1605,7 @@
 
 	cgd->weight = weight;
 	cgd->leaf_weight = weight;
+	cgd->group_idle = cfq_group_idle;
 }
 
 static void cfq_cpd_free(struct blkcg_policy_data *cpd)
@@ -1636,6 +1650,7 @@
 
 	cfqg->weight = cgd->weight;
 	cfqg->leaf_weight = cgd->leaf_weight;
+	cfqg->group_idle = cgd->group_idle;
 }
 
 static void cfq_pd_offline(struct blkg_policy_data *pd)
@@ -1757,6 +1772,19 @@
 	return 0;
 }
 
+static int cfq_print_group_idle(struct seq_file *sf, void *v)
+{
+	struct blkcg *blkcg = css_to_blkcg(seq_css(sf));
+	struct cfq_group_data *cgd = blkcg_to_cfqgd(blkcg);
+	u64 val = 0;
+
+	if (cgd)
+		val = cgd->group_idle;
+
+	seq_printf(sf, "%llu\n", div_u64(val, NSEC_PER_USEC));
+	return 0;
+}
+
 static ssize_t __cfqg_set_weight_device(struct kernfs_open_file *of,
 					char *buf, size_t nbytes, loff_t off,
 					bool on_dfl, bool is_leaf_weight)
@@ -1878,6 +1906,37 @@
 	return __cfq_set_weight(css, val, false, false, true);
 }
 
+static int cfq_set_group_idle(struct cgroup_subsys_state *css,
+			       struct cftype *cft, u64 val)
+{
+	struct blkcg *blkcg = css_to_blkcg(css);
+	struct cfq_group_data *cfqgd;
+	struct blkcg_gq *blkg;
+	int ret = 0;
+
+	spin_lock_irq(&blkcg->lock);
+	cfqgd = blkcg_to_cfqgd(blkcg);
+	if (!cfqgd) {
+		ret = -EINVAL;
+		goto out;
+	}
+
+	cfqgd->group_idle = val * NSEC_PER_USEC;
+
+	hlist_for_each_entry(blkg, &blkcg->blkg_list, blkcg_node) {
+		struct cfq_group *cfqg = blkg_to_cfqg(blkg);
+
+		if (!cfqg)
+			continue;
+
+		cfqg->group_idle = cfqgd->group_idle;
+	}
+
+out:
+	spin_unlock_irq(&blkcg->lock);
+	return ret;
+}
+
 static int cfqg_print_stat(struct seq_file *sf, void *v)
 {
 	blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)), blkg_prfill_stat,
@@ -2023,6 +2082,11 @@
 		.seq_show = cfq_print_leaf_weight,
 		.write_u64 = cfq_set_leaf_weight,
 	},
+	{
+		.name = "group_idle",
+		.seq_show = cfq_print_group_idle,
+		.write_u64 = cfq_set_group_idle,
+	},
 
 	/* statistics, covers only the tasks in the cfqg */
 	{
@@ -2917,7 +2981,7 @@
 	 * with sync vs async workloads.
 	 */
 	if (blk_queue_nonrot(cfqd->queue) && cfqd->hw_tag &&
-		!cfqd->cfq_group_idle)
+		!get_group_idle(cfqd))
 		return;
 
 	WARN_ON(!RB_EMPTY_ROOT(&cfqq->sort_list));
@@ -2928,9 +2992,8 @@
 	 */
 	if (!cfq_should_idle(cfqd, cfqq)) {
 		/* no queue idling. Check for group idling */
-		if (cfqd->cfq_group_idle)
-			group_idle = cfqd->cfq_group_idle;
-		else
+		group_idle = get_group_idle(cfqd);
+		if (!group_idle)
 			return;
 	}
 
@@ -2971,7 +3034,7 @@
 	cfq_mark_cfqq_wait_request(cfqq);
 
 	if (group_idle)
-		sl = cfqd->cfq_group_idle;
+		sl = group_idle;
 	else
 		sl = cfqd->cfq_slice_idle;
 
@@ -3320,7 +3383,7 @@
 	 * this group, wait for requests to complete.
 	 */
 check_group_idle:
-	if (cfqd->cfq_group_idle && cfqq->cfqg->nr_cfqq == 1 &&
+	if (get_group_idle(cfqd) && cfqq->cfqg->nr_cfqq == 1 &&
 	    cfqq->cfqg->dispatched &&
 	    !cfq_io_thinktime_big(cfqd, &cfqq->cfqg->ttime, true)) {
 		cfqq = NULL;
@@ -3884,7 +3947,7 @@
 			cfqd->cfq_slice_idle);
 	}
 #ifdef CONFIG_CFQ_GROUP_IOSCHED
-	__cfq_update_io_thinktime(&cfqq->cfqg->ttime, cfqd->cfq_group_idle);
+	__cfq_update_io_thinktime(&cfqq->cfqg->ttime, get_group_idle(cfqd));
 #endif
 }
 
@@ -4273,7 +4336,7 @@
 		if (cfq_should_wait_busy(cfqd, cfqq)) {
 			u64 extend_sl = cfqd->cfq_slice_idle;
 			if (!cfqd->cfq_slice_idle)
-				extend_sl = cfqd->cfq_group_idle;
+				extend_sl = get_group_idle(cfqd);
 			cfqq->slice_end = now + extend_sl;
 			cfq_mark_cfqq_wait_busy(cfqq);
 			cfq_log_cfqq(cfqd, cfqq, "will busy wait");
diff --git a/block/keyslot-manager.c b/block/keyslot-manager.c
new file mode 100644
index 0000000..020931f
--- /dev/null
+++ b/block/keyslot-manager.c
@@ -0,0 +1,352 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * keyslot-manager.c
+ *
+ * Copyright 2019 Google LLC
+ */
+
+/**
+ * DOC: The Keyslot Manager
+ *
+ * Many devices with inline encryption support have a limited number of "slots"
+ * into which encryption contexts may be programmed, and requests can be tagged
+ * with a slot number to specify the key to use for en/decryption.
+ *
+ * As the number of slots are limited, and programming keys is expensive on
+ * many inline encryption hardware, we don't want to program the same key into
+ * multiple slots - if multiple requests are using the same key, we want to
+ * program just one slot with that key and use that slot for all requests.
+ *
+ * The keyslot manager manages these keyslots appropriately, and also acts as
+ * an abstraction between the inline encryption hardware and the upper layers.
+ *
+ * Lower layer devices will set up a keyslot manager in their request queue
+ * and tell it how to perform device specific operations like programming/
+ * evicting keys from keyslots.
+ *
+ * Upper layers will call keyslot_manager_get_slot_for_key() to program a
+ * key into some slot in the inline encryption hardware.
+ */
+#include <linux/keyslot-manager.h>
+#include <linux/atomic.h>
+#include <linux/mutex.h>
+#include <linux/wait.h>
+#include <linux/blkdev.h>
+
+struct keyslot {
+	atomic_t slot_refs;
+	struct list_head idle_slot_node;
+};
+
+struct keyslot_manager {
+	unsigned int num_slots;
+	atomic_t num_idle_slots;
+	struct keyslot_mgmt_ll_ops ksm_ll_ops;
+	void *ll_priv_data;
+
+	/* Protects programming and evicting keys from the device */
+	struct rw_semaphore lock;
+
+	/* List of idle slots, with least recently used slot at front */
+	wait_queue_head_t idle_slots_wait_queue;
+	struct list_head idle_slots;
+	spinlock_t idle_slots_lock;
+
+	/* Per-keyslot data */
+	struct keyslot slots[];
+};
+
+/**
+ * keyslot_manager_create() - Create a keyslot manager
+ * @num_slots: The number of key slots to manage.
+ * @ksm_ll_ops: The struct keyslot_mgmt_ll_ops for the device that this keyslot
+ *		manager will use to perform operations like programming and
+ *		evicting keys.
+ * @ll_priv_data: Private data passed as is to the functions in ksm_ll_ops.
+ *
+ * Allocate memory for and initialize a keyslot manager. Called by e.g.
+ * storage drivers to set up a keyslot manager in their request_queue.
+ *
+ * Context: May sleep
+ * Return: Pointer to constructed keyslot manager or NULL on error.
+ */
+struct keyslot_manager *keyslot_manager_create(unsigned int num_slots,
+				const struct keyslot_mgmt_ll_ops *ksm_ll_ops,
+				void *ll_priv_data)
+{
+	struct keyslot_manager *ksm;
+	int slot;
+
+	if (num_slots == 0)
+		return NULL;
+
+	/* Check that all ops are specified */
+	if (ksm_ll_ops->keyslot_program == NULL ||
+	    ksm_ll_ops->keyslot_evict == NULL ||
+	    ksm_ll_ops->crypto_mode_supported == NULL ||
+	    ksm_ll_ops->keyslot_find == NULL)
+		return NULL;
+
+	ksm = kvzalloc(struct_size(ksm, slots, num_slots), GFP_KERNEL);
+	if (!ksm)
+		return NULL;
+
+	ksm->num_slots = num_slots;
+	atomic_set(&ksm->num_idle_slots, num_slots);
+	ksm->ksm_ll_ops = *ksm_ll_ops;
+	ksm->ll_priv_data = ll_priv_data;
+
+	init_rwsem(&ksm->lock);
+
+	init_waitqueue_head(&ksm->idle_slots_wait_queue);
+	INIT_LIST_HEAD(&ksm->idle_slots);
+
+	for (slot = 0; slot < num_slots; slot++) {
+		list_add_tail(&ksm->slots[slot].idle_slot_node,
+			      &ksm->idle_slots);
+	}
+
+	spin_lock_init(&ksm->idle_slots_lock);
+
+	return ksm;
+}
+EXPORT_SYMBOL(keyslot_manager_create);
+
+static void remove_slot_from_lru_list(struct keyslot_manager *ksm, int slot)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&ksm->idle_slots_lock, flags);
+	list_del(&ksm->slots[slot].idle_slot_node);
+	spin_unlock_irqrestore(&ksm->idle_slots_lock, flags);
+
+	atomic_dec(&ksm->num_idle_slots);
+}
+
+static int find_and_grab_keyslot(struct keyslot_manager *ksm, const u8 *key,
+				 enum blk_crypto_mode_num crypto_mode,
+				 unsigned int data_unit_size)
+{
+	int slot;
+
+	slot = ksm->ksm_ll_ops.keyslot_find(ksm->ll_priv_data, key,
+					    crypto_mode, data_unit_size);
+	if (slot < 0)
+		return slot;
+	if (WARN_ON(slot >= ksm->num_slots))
+		return -EINVAL;
+	if (atomic_inc_return(&ksm->slots[slot].slot_refs) == 1) {
+		/* Took first reference to this slot; remove it from LRU list */
+		remove_slot_from_lru_list(ksm, slot);
+	}
+	return slot;
+}
+
+/**
+ * keyslot_manager_get_slot_for_key() - Program a key into a keyslot.
+ * @ksm: The keyslot manager to program the key into.
+ * @key: Pointer to the bytes of the key to program. Must be the correct length
+ *      for the chosen @crypto_mode; see blk_crypto_modes in blk-crypto.c.
+ * @crypto_mode: Identifier for the encryption algorithm to use.
+ * @data_unit_size: The data unit size to use for en/decryption.
+ *
+ * Get a keyslot that's been programmed with the specified key, crypto_mode, and
+ * data_unit_size.  If one already exists, return it with incremented refcount.
+ * Otherwise, wait for a keyslot to become idle and program it.
+ *
+ * Context: Process context. Takes and releases ksm->lock.
+ * Return: The keyslot on success, else a -errno value.
+ */
+int keyslot_manager_get_slot_for_key(struct keyslot_manager *ksm,
+				     const u8 *key,
+				     enum blk_crypto_mode_num crypto_mode,
+				     unsigned int data_unit_size)
+{
+	int slot;
+	int err;
+	struct keyslot *idle_slot;
+
+	down_read(&ksm->lock);
+	slot = find_and_grab_keyslot(ksm, key, crypto_mode, data_unit_size);
+	up_read(&ksm->lock);
+	if (slot != -ENOKEY)
+		return slot;
+
+	for (;;) {
+		down_write(&ksm->lock);
+		slot = find_and_grab_keyslot(ksm, key, crypto_mode,
+					     data_unit_size);
+		if (slot != -ENOKEY) {
+			up_write(&ksm->lock);
+			return slot;
+		}
+
+		/*
+		 * If we're here, that means there wasn't a slot that was
+		 * already programmed with the key. So try to program it.
+		 */
+		if (atomic_read(&ksm->num_idle_slots) > 0)
+			break;
+
+		up_write(&ksm->lock);
+		wait_event(ksm->idle_slots_wait_queue,
+			(atomic_read(&ksm->num_idle_slots) > 0));
+	}
+
+	idle_slot = list_first_entry(&ksm->idle_slots, struct keyslot,
+					     idle_slot_node);
+	slot = idle_slot - ksm->slots;
+
+	err = ksm->ksm_ll_ops.keyslot_program(ksm->ll_priv_data, key,
+					      crypto_mode,
+					      data_unit_size,
+					      slot);
+
+	if (err) {
+		wake_up(&ksm->idle_slots_wait_queue);
+		up_write(&ksm->lock);
+		return err;
+	}
+
+	atomic_set(&ksm->slots[slot].slot_refs, 1);
+	remove_slot_from_lru_list(ksm, slot);
+
+	up_write(&ksm->lock);
+	return slot;
+
+}
+EXPORT_SYMBOL(keyslot_manager_get_slot_for_key);
+
+/**
+ * keyslot_manager_get_slot() - Increment the refcount on the specified slot.
+ * @ksm - The keyslot manager that we want to modify.
+ * @slot - The slot to increment the refcount of.
+ *
+ * This function assumes that there is already an active reference to that slot
+ * and simply increments the refcount. This is useful when cloning a bio that
+ * already has a reference to a keyslot, and we want the cloned bio to also have
+ * its own reference.
+ *
+ * Context: Any context.
+ */
+void keyslot_manager_get_slot(struct keyslot_manager *ksm, unsigned int slot)
+{
+	if (WARN_ON(slot >= ksm->num_slots))
+		return;
+
+	WARN_ON(atomic_inc_return(&ksm->slots[slot].slot_refs) < 2);
+}
+EXPORT_SYMBOL(keyslot_manager_get_slot);
+
+/**
+ * keyslot_manager_put_slot() - Release a reference to a slot
+ * @ksm: The keyslot manager to release the reference from.
+ * @slot: The slot to release the reference from.
+ *
+ * Context: Any context.
+ */
+void keyslot_manager_put_slot(struct keyslot_manager *ksm, unsigned int slot)
+{
+	unsigned long flags;
+
+	if (WARN_ON(slot >= ksm->num_slots))
+		return;
+
+	if (atomic_dec_and_lock_irqsave(&ksm->slots[slot].slot_refs,
+					&ksm->idle_slots_lock, flags)) {
+		list_add_tail(&ksm->slots[slot].idle_slot_node,
+			      &ksm->idle_slots);
+		spin_unlock_irqrestore(&ksm->idle_slots_lock, flags);
+		atomic_inc(&ksm->num_idle_slots);
+		wake_up(&ksm->idle_slots_wait_queue);
+	}
+}
+EXPORT_SYMBOL(keyslot_manager_put_slot);
+
+/**
+ * keyslot_manager_crypto_mode_supported() - Find out if a crypto_mode/data
+ *					     unit size combination is supported
+ *					     by a ksm.
+ * @ksm - The keyslot manager to check
+ * @crypto_mode - The crypto mode to check for.
+ * @data_unit_size - The data_unit_size for the mode.
+ *
+ * Calls and returns the result of the crypto_mode_supported function specified
+ * by the ksm.
+ *
+ * Context: Process context.
+ * Return: Whether or not this ksm supports the specified crypto_mode/
+ *	   data_unit_size combo.
+ */
+bool keyslot_manager_crypto_mode_supported(struct keyslot_manager *ksm,
+					   enum blk_crypto_mode_num crypto_mode,
+					   unsigned int data_unit_size)
+{
+	if (!ksm)
+		return false;
+	return ksm->ksm_ll_ops.crypto_mode_supported(ksm->ll_priv_data,
+						     crypto_mode,
+						     data_unit_size);
+}
+EXPORT_SYMBOL(keyslot_manager_crypto_mode_supported);
+
+bool keyslot_manager_rq_crypto_mode_supported(struct request_queue *q,
+					enum blk_crypto_mode_num crypto_mode,
+					unsigned int data_unit_size)
+{
+	return keyslot_manager_crypto_mode_supported(q->ksm, crypto_mode,
+						     data_unit_size);
+}
+EXPORT_SYMBOL(keyslot_manager_rq_crypto_mode_supported);
+
+/**
+ * keyslot_manager_evict_key() - Evict a key from the lower layer device.
+ * @ksm - The keyslot manager to evict from
+ * @key - The key to evict
+ * @crypto_mode - The crypto algorithm the key was programmed with.
+ * @data_unit_size - The data_unit_size the key was programmed with.
+ *
+ * Finds the slot that the specified key, crypto_mode, data_unit_size combo
+ * was programmed into, and evicts that slot from the lower layer device if
+ * the refcount on the slot is 0. Returns -EBUSY if the refcount is not 0, and
+ * -errno on error.
+ *
+ * Context: Process context. Takes and releases ksm->lock.
+ */
+int keyslot_manager_evict_key(struct keyslot_manager *ksm,
+			      const u8 *key,
+			      enum blk_crypto_mode_num crypto_mode,
+			      unsigned int data_unit_size)
+{
+	int slot;
+	int err = 0;
+
+	down_write(&ksm->lock);
+	slot = ksm->ksm_ll_ops.keyslot_find(ksm->ll_priv_data, key,
+					    crypto_mode,
+					    data_unit_size);
+
+	if (slot < 0) {
+		up_write(&ksm->lock);
+		return slot;
+	}
+
+	if (atomic_read(&ksm->slots[slot].slot_refs) == 0) {
+		err = ksm->ksm_ll_ops.keyslot_evict(ksm->ll_priv_data, key,
+						    crypto_mode,
+						    data_unit_size,
+						    slot);
+	} else {
+		err = -EBUSY;
+	}
+
+	up_write(&ksm->lock);
+	return err;
+}
+EXPORT_SYMBOL(keyslot_manager_evict_key);
+
+void keyslot_manager_destroy(struct keyslot_manager *ksm)
+{
+	kvfree(ksm);
+}
+EXPORT_SYMBOL(keyslot_manager_destroy);
diff --git a/build.config.aarch64 b/build.config.aarch64
new file mode 100644
index 0000000..523bbc0
--- /dev/null
+++ b/build.config.aarch64
@@ -0,0 +1,11 @@
+ARCH=arm64
+
+CLANG_TRIPLE=aarch64-linux-gnu-
+CROSS_COMPILE=aarch64-linux-androidkernel-
+LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
+
+FILES="
+arch/arm64/boot/Image.gz
+vmlinux
+System.map
+"
diff --git a/build.config.allmodconfig b/build.config.allmodconfig
new file mode 100644
index 0000000..f4da6b2
--- /dev/null
+++ b/build.config.allmodconfig
@@ -0,0 +1,16 @@
+DEFCONFIG=allmodconfig
+
+# XFS_FS is currently broken on this branch with clang-9
+POST_DEFCONFIG_CMDS="update_config"
+function update_config() {
+    ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
+         -d TEST_KMOD  \
+         -d XFS_FS \
+         -d CPU_BIG_ENDIAN \
+         -d STM \
+         -d TEST_MEMCAT_P \
+         -e UNWINDER_FRAME_POINTER \
+
+    (cd ${OUT_DIR} && \
+     make O=${OUT_DIR} $archsubarch CC=${CC} CROSS_COMPILE=${CROSS_COMPILE} olddefconfig)
+}
diff --git a/build.config.allmodconfig.aarch64 b/build.config.allmodconfig.aarch64
new file mode 100644
index 0000000..863ab1c
--- /dev/null
+++ b/build.config.allmodconfig.aarch64
@@ -0,0 +1,4 @@
+. ${ROOT_DIR}/common/build.config.common
+. ${ROOT_DIR}/common/build.config.aarch64
+. ${ROOT_DIR}/common/build.config.allmodconfig
+
diff --git a/build.config.allmodconfig.x86_64 b/build.config.allmodconfig.x86_64
new file mode 100644
index 0000000..bedb386
--- /dev/null
+++ b/build.config.allmodconfig.x86_64
@@ -0,0 +1,4 @@
+. ${ROOT_DIR}/common/build.config.common
+. ${ROOT_DIR}/common/build.config.x86_64
+. ${ROOT_DIR}/common/build.config.allmodconfig
+
diff --git a/build.config.common b/build.config.common
new file mode 100644
index 0000000..d75e565
--- /dev/null
+++ b/build.config.common
@@ -0,0 +1,13 @@
+BRANCH=android-4.19
+KERNEL_DIR=common
+
+CC=clang
+LD=ld.lld
+NM=llvm-nm
+OBJCOPY=llvm-objcopy
+CLANG_PREBUILT_BIN=prebuilts-master/clang/host/linux-x86/clang-r370808/bin
+
+EXTRA_CMDS=''
+STOP_SHIP_TRACEPRINTK=1
+IN_KERNEL_MODULES=1
+DO_NOT_STRIP_MODULES=1
diff --git a/build.config.gki b/build.config.gki
new file mode 100644
index 0000000..66f6eb8
--- /dev/null
+++ b/build.config.gki
@@ -0,0 +1,4 @@
+DEFCONFIG=gki_defconfig
+POST_DEFCONFIG_CMDS="check_defconfig"
+BUILD_INITRAMFS=1
+
diff --git a/build.config.gki.aarch64 b/build.config.gki.aarch64
new file mode 100644
index 0000000..dade440
--- /dev/null
+++ b/build.config.gki.aarch64
@@ -0,0 +1,6 @@
+. ${ROOT_DIR}/common/build.config.common
+. ${ROOT_DIR}/common/build.config.aarch64
+. ${ROOT_DIR}/common/build.config.gki
+
+ABI_DEFINITION=abi_gki_aarch64.xml
+KMI_WHITELIST=abi_gki_aarch64_whitelist
diff --git a/build.config.gki.x86_64 b/build.config.gki.x86_64
new file mode 100644
index 0000000..627d1e1
--- /dev/null
+++ b/build.config.gki.x86_64
@@ -0,0 +1,4 @@
+. ${ROOT_DIR}/common/build.config.common
+. ${ROOT_DIR}/common/build.config.x86_64
+. ${ROOT_DIR}/common/build.config.gki
+
diff --git a/build.config.x86_64 b/build.config.x86_64
new file mode 100644
index 0000000..df73a47
--- /dev/null
+++ b/build.config.x86_64
@@ -0,0 +1,11 @@
+ARCH=x86_64
+
+CLANG_TRIPLE=x86_64-linux-gnu-
+CROSS_COMPILE=x86_64-linux-androidkernel-
+LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9/bin
+
+FILES="
+arch/x86/boot/bzImage
+vmlinux
+System.map
+"
diff --git a/crypto/Kconfig b/crypto/Kconfig
index 0fb9586..fdaa0dc 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -495,6 +495,34 @@
 	  Support for key wrapping (NIST SP800-38F / RFC3394) without
 	  padding.
 
+config CRYPTO_NHPOLY1305
+	tristate
+	select CRYPTO_HASH
+	select CRYPTO_POLY1305
+
+config CRYPTO_ADIANTUM
+	tristate "Adiantum support"
+	select CRYPTO_CHACHA20
+	select CRYPTO_POLY1305
+	select CRYPTO_NHPOLY1305
+	help
+	  Adiantum is a tweakable, length-preserving encryption mode
+	  designed for fast and secure disk encryption, especially on
+	  CPUs without dedicated crypto instructions.  It encrypts
+	  each sector using the XChaCha12 stream cipher, two passes of
+	  an ε-almost-∆-universal hash function, and an invocation of
+	  the AES-256 block cipher on a single 16-byte block.  On CPUs
+	  without AES instructions, Adiantum is much faster than
+	  AES-XTS.
+
+	  Adiantum's security is provably reducible to that of its
+	  underlying stream and block ciphers, subject to a security
+	  bound.  Unlike XTS, Adiantum is a true wide-block encryption
+	  mode, so it actually provides an even stronger notion of
+	  security than XTS, subject to the security bound.
+
+	  If unsure, say N.
+
 comment "Hash modes"
 
 config CRYPTO_CMAC
@@ -1438,18 +1466,26 @@
 	  Bernstein <djb@cr.yp.to>. See <http://cr.yp.to/snuffle.html>
 
 config CRYPTO_CHACHA20
-	tristate "ChaCha20 cipher algorithm"
+	tristate "ChaCha stream cipher algorithms"
 	select CRYPTO_BLKCIPHER
 	help
-	  ChaCha20 cipher algorithm, RFC7539.
+	  The ChaCha20, XChaCha20, and XChaCha12 stream cipher algorithms.
 
 	  ChaCha20 is a 256-bit high-speed stream cipher designed by Daniel J.
 	  Bernstein and further specified in RFC7539 for use in IETF protocols.
-	  This is the portable C implementation of ChaCha20.
-
-	  See also:
+	  This is the portable C implementation of ChaCha20.  See also:
 	  <http://cr.yp.to/chacha/chacha-20080128.pdf>
 
+	  XChaCha20 is the application of the XSalsa20 construction to ChaCha20
+	  rather than to Salsa20.  XChaCha20 extends ChaCha20's nonce length
+	  from 64 bits (or 96 bits using the RFC7539 convention) to 192 bits,
+	  while provably retaining ChaCha20's security.  See also:
+	  <https://cr.yp.to/snuffle/xsalsa-20081128.pdf>
+
+	  XChaCha12 is XChaCha20 reduced to 12 rounds, with correspondingly
+	  reduced security margin but increased performance.  It can be needed
+	  in some performance-sensitive scenarios.
+
 config CRYPTO_CHACHA20_X86_64
 	tristate "ChaCha20 cipher algorithm (x86_64/SSSE3/AVX2)"
 	depends on X86 && 64BIT
diff --git a/crypto/Makefile b/crypto/Makefile
index f6a234d..a56514c 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -83,6 +83,8 @@
 obj-$(CONFIG_CRYPTO_XTS) += xts.o
 obj-$(CONFIG_CRYPTO_CTR) += ctr.o
 obj-$(CONFIG_CRYPTO_KEYWRAP) += keywrap.o
+obj-$(CONFIG_CRYPTO_ADIANTUM) += adiantum.o
+obj-$(CONFIG_CRYPTO_NHPOLY1305) += nhpoly1305.o
 obj-$(CONFIG_CRYPTO_GCM) += gcm.o
 obj-$(CONFIG_CRYPTO_CCM) += ccm.o
 obj-$(CONFIG_CRYPTO_CHACHA20POLY1305) += chacha20poly1305.o
@@ -116,7 +118,7 @@
 obj-$(CONFIG_CRYPTO_ANUBIS) += anubis.o
 obj-$(CONFIG_CRYPTO_SEED) += seed.o
 obj-$(CONFIG_CRYPTO_SALSA20) += salsa20_generic.o
-obj-$(CONFIG_CRYPTO_CHACHA20) += chacha20_generic.o
+obj-$(CONFIG_CRYPTO_CHACHA20) += chacha_generic.o
 obj-$(CONFIG_CRYPTO_POLY1305) += poly1305_generic.o
 obj-$(CONFIG_CRYPTO_DEFLATE) += deflate.o
 obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o
diff --git a/crypto/adiantum.c b/crypto/adiantum.c
new file mode 100644
index 0000000..5564e73
--- /dev/null
+++ b/crypto/adiantum.c
@@ -0,0 +1,668 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Adiantum length-preserving encryption mode
+ *
+ * Copyright 2018 Google LLC
+ */
+
+/*
+ * Adiantum is a tweakable, length-preserving encryption mode designed for fast
+ * and secure disk encryption, especially on CPUs without dedicated crypto
+ * instructions.  Adiantum encrypts each sector using the XChaCha12 stream
+ * cipher, two passes of an ε-almost-∆-universal (ε-∆U) hash function based on
+ * NH and Poly1305, and an invocation of the AES-256 block cipher on a single
+ * 16-byte block.  See the paper for details:
+ *
+ *	Adiantum: length-preserving encryption for entry-level processors
+ *      (https://eprint.iacr.org/2018/720.pdf)
+ *
+ * For flexibility, this implementation also allows other ciphers:
+ *
+ *	- Stream cipher: XChaCha12 or XChaCha20
+ *	- Block cipher: any with a 128-bit block size and 256-bit key
+ *
+ * This implementation doesn't currently allow other ε-∆U hash functions, i.e.
+ * HPolyC is not supported.  This is because Adiantum is ~20% faster than HPolyC
+ * but still provably as secure, and also the ε-∆U hash function of HBSH is
+ * formally defined to take two inputs (tweak, message) which makes it difficult
+ * to wrap with the crypto_shash API.  Rather, some details need to be handled
+ * here.  Nevertheless, if needed in the future, support for other ε-∆U hash
+ * functions could be added here.
+ */
+
+#include <crypto/b128ops.h>
+#include <crypto/chacha.h>
+#include <crypto/internal/hash.h>
+#include <crypto/internal/skcipher.h>
+#include <crypto/nhpoly1305.h>
+#include <crypto/scatterwalk.h>
+#include <linux/module.h>
+
+#include "internal.h"
+
+/*
+ * Size of right-hand part of input data, in bytes; also the size of the block
+ * cipher's block size and the hash function's output.
+ */
+#define BLOCKCIPHER_BLOCK_SIZE		16
+
+/* Size of the block cipher key (K_E) in bytes */
+#define BLOCKCIPHER_KEY_SIZE		32
+
+/* Size of the hash key (K_H) in bytes */
+#define HASH_KEY_SIZE		(POLY1305_BLOCK_SIZE + NHPOLY1305_KEY_SIZE)
+
+/*
+ * The specification allows variable-length tweaks, but Linux's crypto API
+ * currently only allows algorithms to support a single length.  The "natural"
+ * tweak length for Adiantum is 16, since that fits into one Poly1305 block for
+ * the best performance.  But longer tweaks are useful for fscrypt, to avoid
+ * needing to derive per-file keys.  So instead we use two blocks, or 32 bytes.
+ */
+#define TWEAK_SIZE		32
+
+struct adiantum_instance_ctx {
+	struct crypto_skcipher_spawn streamcipher_spawn;
+	struct crypto_spawn blockcipher_spawn;
+	struct crypto_shash_spawn hash_spawn;
+};
+
+struct adiantum_tfm_ctx {
+	struct crypto_skcipher *streamcipher;
+	struct crypto_cipher *blockcipher;
+	struct crypto_shash *hash;
+	struct poly1305_key header_hash_key;
+};
+
+struct adiantum_request_ctx {
+
+	/*
+	 * Buffer for right-hand part of data, i.e.
+	 *
+	 *    P_L => P_M => C_M => C_R when encrypting, or
+	 *    C_R => C_M => P_M => P_L when decrypting.
+	 *
+	 * Also used to build the IV for the stream cipher.
+	 */
+	union {
+		u8 bytes[XCHACHA_IV_SIZE];
+		__le32 words[XCHACHA_IV_SIZE / sizeof(__le32)];
+		le128 bignum;	/* interpret as element of Z/(2^{128}Z) */
+	} rbuf;
+
+	bool enc; /* true if encrypting, false if decrypting */
+
+	/*
+	 * The result of the Poly1305 ε-∆U hash function applied to
+	 * (bulk length, tweak)
+	 */
+	le128 header_hash;
+
+	/* Sub-requests, must be last */
+	union {
+		struct shash_desc hash_desc;
+		struct skcipher_request streamcipher_req;
+	} u;
+};
+
+/*
+ * Given the XChaCha stream key K_S, derive the block cipher key K_E and the
+ * hash key K_H as follows:
+ *
+ *     K_E || K_H || ... = XChaCha(key=K_S, nonce=1||0^191)
+ *
+ * Note that this denotes using bits from the XChaCha keystream, which here we
+ * get indirectly by encrypting a buffer containing all 0's.
+ */
+static int adiantum_setkey(struct crypto_skcipher *tfm, const u8 *key,
+			   unsigned int keylen)
+{
+	struct adiantum_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
+	struct {
+		u8 iv[XCHACHA_IV_SIZE];
+		u8 derived_keys[BLOCKCIPHER_KEY_SIZE + HASH_KEY_SIZE];
+		struct scatterlist sg;
+		struct crypto_wait wait;
+		struct skcipher_request req; /* must be last */
+	} *data;
+	u8 *keyp;
+	int err;
+
+	/* Set the stream cipher key (K_S) */
+	crypto_skcipher_clear_flags(tctx->streamcipher, CRYPTO_TFM_REQ_MASK);
+	crypto_skcipher_set_flags(tctx->streamcipher,
+				  crypto_skcipher_get_flags(tfm) &
+				  CRYPTO_TFM_REQ_MASK);
+	err = crypto_skcipher_setkey(tctx->streamcipher, key, keylen);
+	crypto_skcipher_set_flags(tfm,
+				crypto_skcipher_get_flags(tctx->streamcipher) &
+				CRYPTO_TFM_RES_MASK);
+	if (err)
+		return err;
+
+	/* Derive the subkeys */
+	data = kzalloc(sizeof(*data) +
+		       crypto_skcipher_reqsize(tctx->streamcipher), GFP_KERNEL);
+	if (!data)
+		return -ENOMEM;
+	data->iv[0] = 1;
+	sg_init_one(&data->sg, data->derived_keys, sizeof(data->derived_keys));
+	crypto_init_wait(&data->wait);
+	skcipher_request_set_tfm(&data->req, tctx->streamcipher);
+	skcipher_request_set_callback(&data->req, CRYPTO_TFM_REQ_MAY_SLEEP |
+						  CRYPTO_TFM_REQ_MAY_BACKLOG,
+				      crypto_req_done, &data->wait);
+	skcipher_request_set_crypt(&data->req, &data->sg, &data->sg,
+				   sizeof(data->derived_keys), data->iv);
+	err = crypto_wait_req(crypto_skcipher_encrypt(&data->req), &data->wait);
+	if (err)
+		goto out;
+	keyp = data->derived_keys;
+
+	/* Set the block cipher key (K_E) */
+	crypto_cipher_clear_flags(tctx->blockcipher, CRYPTO_TFM_REQ_MASK);
+	crypto_cipher_set_flags(tctx->blockcipher,
+				crypto_skcipher_get_flags(tfm) &
+				CRYPTO_TFM_REQ_MASK);
+	err = crypto_cipher_setkey(tctx->blockcipher, keyp,
+				   BLOCKCIPHER_KEY_SIZE);
+	crypto_skcipher_set_flags(tfm,
+				  crypto_cipher_get_flags(tctx->blockcipher) &
+				  CRYPTO_TFM_RES_MASK);
+	if (err)
+		goto out;
+	keyp += BLOCKCIPHER_KEY_SIZE;
+
+	/* Set the hash key (K_H) */
+	poly1305_core_setkey(&tctx->header_hash_key, keyp);
+	keyp += POLY1305_BLOCK_SIZE;
+
+	crypto_shash_clear_flags(tctx->hash, CRYPTO_TFM_REQ_MASK);
+	crypto_shash_set_flags(tctx->hash, crypto_skcipher_get_flags(tfm) &
+					   CRYPTO_TFM_REQ_MASK);
+	err = crypto_shash_setkey(tctx->hash, keyp, NHPOLY1305_KEY_SIZE);
+	crypto_skcipher_set_flags(tfm, crypto_shash_get_flags(tctx->hash) &
+				       CRYPTO_TFM_RES_MASK);
+	keyp += NHPOLY1305_KEY_SIZE;
+	WARN_ON(keyp != &data->derived_keys[ARRAY_SIZE(data->derived_keys)]);
+out:
+	kzfree(data);
+	return err;
+}
+
+/* Addition in Z/(2^{128}Z) */
+static inline void le128_add(le128 *r, const le128 *v1, const le128 *v2)
+{
+	u64 x = le64_to_cpu(v1->b);
+	u64 y = le64_to_cpu(v2->b);
+
+	r->b = cpu_to_le64(x + y);
+	r->a = cpu_to_le64(le64_to_cpu(v1->a) + le64_to_cpu(v2->a) +
+			   (x + y < x));
+}
+
+/* Subtraction in Z/(2^{128}Z) */
+static inline void le128_sub(le128 *r, const le128 *v1, const le128 *v2)
+{
+	u64 x = le64_to_cpu(v1->b);
+	u64 y = le64_to_cpu(v2->b);
+
+	r->b = cpu_to_le64(x - y);
+	r->a = cpu_to_le64(le64_to_cpu(v1->a) - le64_to_cpu(v2->a) -
+			   (x - y > x));
+}
+
+/*
+ * Apply the Poly1305 ε-∆U hash function to (bulk length, tweak) and save the
+ * result to rctx->header_hash.  This is the calculation
+ *
+ *	H_T ← Poly1305_{K_T}(bin_{128}(|L|) || T)
+ *
+ * from the procedure in section 6.4 of the Adiantum paper.  The resulting value
+ * is reused in both the first and second hash steps.  Specifically, it's added
+ * to the result of an independently keyed ε-∆U hash function (for equal length
+ * inputs only) taken over the left-hand part (the "bulk") of the message, to
+ * give the overall Adiantum hash of the (tweak, left-hand part) pair.
+ */
+static void adiantum_hash_header(struct skcipher_request *req)
+{
+	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+	const struct adiantum_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
+	struct adiantum_request_ctx *rctx = skcipher_request_ctx(req);
+	const unsigned int bulk_len = req->cryptlen - BLOCKCIPHER_BLOCK_SIZE;
+	struct {
+		__le64 message_bits;
+		__le64 padding;
+	} header = {
+		.message_bits = cpu_to_le64((u64)bulk_len * 8)
+	};
+	struct poly1305_state state;
+
+	poly1305_core_init(&state);
+
+	BUILD_BUG_ON(sizeof(header) % POLY1305_BLOCK_SIZE != 0);
+	poly1305_core_blocks(&state, &tctx->header_hash_key,
+			     &header, sizeof(header) / POLY1305_BLOCK_SIZE);
+
+	BUILD_BUG_ON(TWEAK_SIZE % POLY1305_BLOCK_SIZE != 0);
+	poly1305_core_blocks(&state, &tctx->header_hash_key, req->iv,
+			     TWEAK_SIZE / POLY1305_BLOCK_SIZE);
+
+	poly1305_core_emit(&state, &rctx->header_hash);
+}
+
+/* Hash the left-hand part (the "bulk") of the message using NHPoly1305 */
+static int adiantum_hash_message(struct skcipher_request *req,
+				 struct scatterlist *sgl, le128 *digest)
+{
+	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+	const struct adiantum_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
+	struct adiantum_request_ctx *rctx = skcipher_request_ctx(req);
+	const unsigned int bulk_len = req->cryptlen - BLOCKCIPHER_BLOCK_SIZE;
+	struct shash_desc *hash_desc = &rctx->u.hash_desc;
+	struct sg_mapping_iter miter;
+	unsigned int i, n;
+	int err;
+
+	hash_desc->tfm = tctx->hash;
+	hash_desc->flags = 0;
+
+	err = crypto_shash_init(hash_desc);
+	if (err)
+		return err;
+
+	sg_miter_start(&miter, sgl, sg_nents(sgl),
+		       SG_MITER_FROM_SG | SG_MITER_ATOMIC);
+	for (i = 0; i < bulk_len; i += n) {
+		sg_miter_next(&miter);
+		n = min_t(unsigned int, miter.length, bulk_len - i);
+		err = crypto_shash_update(hash_desc, miter.addr, n);
+		if (err)
+			break;
+	}
+	sg_miter_stop(&miter);
+	if (err)
+		return err;
+
+	return crypto_shash_final(hash_desc, (u8 *)digest);
+}
+
+/* Continue Adiantum encryption/decryption after the stream cipher step */
+static int adiantum_finish(struct skcipher_request *req)
+{
+	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+	const struct adiantum_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
+	struct adiantum_request_ctx *rctx = skcipher_request_ctx(req);
+	const unsigned int bulk_len = req->cryptlen - BLOCKCIPHER_BLOCK_SIZE;
+	le128 digest;
+	int err;
+
+	/* If decrypting, decrypt C_M with the block cipher to get P_M */
+	if (!rctx->enc)
+		crypto_cipher_decrypt_one(tctx->blockcipher, rctx->rbuf.bytes,
+					  rctx->rbuf.bytes);
+
+	/*
+	 * Second hash step
+	 *	enc: C_R = C_M - H_{K_H}(T, C_L)
+	 *	dec: P_R = P_M - H_{K_H}(T, P_L)
+	 */
+	err = adiantum_hash_message(req, req->dst, &digest);
+	if (err)
+		return err;
+	le128_add(&digest, &digest, &rctx->header_hash);
+	le128_sub(&rctx->rbuf.bignum, &rctx->rbuf.bignum, &digest);
+	scatterwalk_map_and_copy(&rctx->rbuf.bignum, req->dst,
+				 bulk_len, BLOCKCIPHER_BLOCK_SIZE, 1);
+	return 0;
+}
+
+static void adiantum_streamcipher_done(struct crypto_async_request *areq,
+				       int err)
+{
+	struct skcipher_request *req = areq->data;
+
+	if (!err)
+		err = adiantum_finish(req);
+
+	skcipher_request_complete(req, err);
+}
+
+static int adiantum_crypt(struct skcipher_request *req, bool enc)
+{
+	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+	const struct adiantum_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
+	struct adiantum_request_ctx *rctx = skcipher_request_ctx(req);
+	const unsigned int bulk_len = req->cryptlen - BLOCKCIPHER_BLOCK_SIZE;
+	unsigned int stream_len;
+	le128 digest;
+	int err;
+
+	if (req->cryptlen < BLOCKCIPHER_BLOCK_SIZE)
+		return -EINVAL;
+
+	rctx->enc = enc;
+
+	/*
+	 * First hash step
+	 *	enc: P_M = P_R + H_{K_H}(T, P_L)
+	 *	dec: C_M = C_R + H_{K_H}(T, C_L)
+	 */
+	adiantum_hash_header(req);
+	err = adiantum_hash_message(req, req->src, &digest);
+	if (err)
+		return err;
+	le128_add(&digest, &digest, &rctx->header_hash);
+	scatterwalk_map_and_copy(&rctx->rbuf.bignum, req->src,
+				 bulk_len, BLOCKCIPHER_BLOCK_SIZE, 0);
+	le128_add(&rctx->rbuf.bignum, &rctx->rbuf.bignum, &digest);
+
+	/* If encrypting, encrypt P_M with the block cipher to get C_M */
+	if (enc)
+		crypto_cipher_encrypt_one(tctx->blockcipher, rctx->rbuf.bytes,
+					  rctx->rbuf.bytes);
+
+	/* Initialize the rest of the XChaCha IV (first part is C_M) */
+	BUILD_BUG_ON(BLOCKCIPHER_BLOCK_SIZE != 16);
+	BUILD_BUG_ON(XCHACHA_IV_SIZE != 32);	/* nonce || stream position */
+	rctx->rbuf.words[4] = cpu_to_le32(1);
+	rctx->rbuf.words[5] = 0;
+	rctx->rbuf.words[6] = 0;
+	rctx->rbuf.words[7] = 0;
+
+	/*
+	 * XChaCha needs to be done on all the data except the last 16 bytes;
+	 * for disk encryption that usually means 4080 or 496 bytes.  But ChaCha
+	 * implementations tend to be most efficient when passed a whole number
+	 * of 64-byte ChaCha blocks, or sometimes even a multiple of 256 bytes.
+	 * And here it doesn't matter whether the last 16 bytes are written to,
+	 * as the second hash step will overwrite them.  Thus, round the XChaCha
+	 * length up to the next 64-byte boundary if possible.
+	 */
+	stream_len = bulk_len;
+	if (round_up(stream_len, CHACHA_BLOCK_SIZE) <= req->cryptlen)
+		stream_len = round_up(stream_len, CHACHA_BLOCK_SIZE);
+
+	skcipher_request_set_tfm(&rctx->u.streamcipher_req, tctx->streamcipher);
+	skcipher_request_set_crypt(&rctx->u.streamcipher_req, req->src,
+				   req->dst, stream_len, &rctx->rbuf);
+	skcipher_request_set_callback(&rctx->u.streamcipher_req,
+				      req->base.flags,
+				      adiantum_streamcipher_done, req);
+	return crypto_skcipher_encrypt(&rctx->u.streamcipher_req) ?:
+		adiantum_finish(req);
+}
+
+static int adiantum_encrypt(struct skcipher_request *req)
+{
+	return adiantum_crypt(req, true);
+}
+
+static int adiantum_decrypt(struct skcipher_request *req)
+{
+	return adiantum_crypt(req, false);
+}
+
+static int adiantum_init_tfm(struct crypto_skcipher *tfm)
+{
+	struct skcipher_instance *inst = skcipher_alg_instance(tfm);
+	struct adiantum_instance_ctx *ictx = skcipher_instance_ctx(inst);
+	struct adiantum_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
+	struct crypto_skcipher *streamcipher;
+	struct crypto_cipher *blockcipher;
+	struct crypto_shash *hash;
+	unsigned int subreq_size;
+	int err;
+
+	streamcipher = crypto_spawn_skcipher(&ictx->streamcipher_spawn);
+	if (IS_ERR(streamcipher))
+		return PTR_ERR(streamcipher);
+
+	blockcipher = crypto_spawn_cipher(&ictx->blockcipher_spawn);
+	if (IS_ERR(blockcipher)) {
+		err = PTR_ERR(blockcipher);
+		goto err_free_streamcipher;
+	}
+
+	hash = crypto_spawn_shash(&ictx->hash_spawn);
+	if (IS_ERR(hash)) {
+		err = PTR_ERR(hash);
+		goto err_free_blockcipher;
+	}
+
+	tctx->streamcipher = streamcipher;
+	tctx->blockcipher = blockcipher;
+	tctx->hash = hash;
+
+	BUILD_BUG_ON(offsetofend(struct adiantum_request_ctx, u) !=
+		     sizeof(struct adiantum_request_ctx));
+	subreq_size = max(FIELD_SIZEOF(struct adiantum_request_ctx,
+				       u.hash_desc) +
+			  crypto_shash_descsize(hash),
+			  FIELD_SIZEOF(struct adiantum_request_ctx,
+				       u.streamcipher_req) +
+			  crypto_skcipher_reqsize(streamcipher));
+
+	crypto_skcipher_set_reqsize(tfm,
+				    offsetof(struct adiantum_request_ctx, u) +
+				    subreq_size);
+	return 0;
+
+err_free_blockcipher:
+	crypto_free_cipher(blockcipher);
+err_free_streamcipher:
+	crypto_free_skcipher(streamcipher);
+	return err;
+}
+
+static void adiantum_exit_tfm(struct crypto_skcipher *tfm)
+{
+	struct adiantum_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
+
+	crypto_free_skcipher(tctx->streamcipher);
+	crypto_free_cipher(tctx->blockcipher);
+	crypto_free_shash(tctx->hash);
+}
+
+static void adiantum_free_instance(struct skcipher_instance *inst)
+{
+	struct adiantum_instance_ctx *ictx = skcipher_instance_ctx(inst);
+
+	crypto_drop_skcipher(&ictx->streamcipher_spawn);
+	crypto_drop_spawn(&ictx->blockcipher_spawn);
+	crypto_drop_shash(&ictx->hash_spawn);
+	kfree(inst);
+}
+
+/*
+ * Check for a supported set of inner algorithms.
+ * See the comment at the beginning of this file.
+ */
+static bool adiantum_supported_algorithms(struct skcipher_alg *streamcipher_alg,
+					  struct crypto_alg *blockcipher_alg,
+					  struct shash_alg *hash_alg)
+{
+	if (strcmp(streamcipher_alg->base.cra_name, "xchacha12") != 0 &&
+	    strcmp(streamcipher_alg->base.cra_name, "xchacha20") != 0)
+		return false;
+
+	if (blockcipher_alg->cra_cipher.cia_min_keysize > BLOCKCIPHER_KEY_SIZE ||
+	    blockcipher_alg->cra_cipher.cia_max_keysize < BLOCKCIPHER_KEY_SIZE)
+		return false;
+	if (blockcipher_alg->cra_blocksize != BLOCKCIPHER_BLOCK_SIZE)
+		return false;
+
+	if (strcmp(hash_alg->base.cra_name, "nhpoly1305") != 0)
+		return false;
+
+	return true;
+}
+
+static int adiantum_create(struct crypto_template *tmpl, struct rtattr **tb)
+{
+	struct crypto_attr_type *algt;
+	const char *streamcipher_name;
+	const char *blockcipher_name;
+	const char *nhpoly1305_name;
+	struct skcipher_instance *inst;
+	struct adiantum_instance_ctx *ictx;
+	struct skcipher_alg *streamcipher_alg;
+	struct crypto_alg *blockcipher_alg;
+	struct crypto_alg *_hash_alg;
+	struct shash_alg *hash_alg;
+	int err;
+
+	algt = crypto_get_attr_type(tb);
+	if (IS_ERR(algt))
+		return PTR_ERR(algt);
+
+	if ((algt->type ^ CRYPTO_ALG_TYPE_SKCIPHER) & algt->mask)
+		return -EINVAL;
+
+	streamcipher_name = crypto_attr_alg_name(tb[1]);
+	if (IS_ERR(streamcipher_name))
+		return PTR_ERR(streamcipher_name);
+
+	blockcipher_name = crypto_attr_alg_name(tb[2]);
+	if (IS_ERR(blockcipher_name))
+		return PTR_ERR(blockcipher_name);
+
+	nhpoly1305_name = crypto_attr_alg_name(tb[3]);
+	if (nhpoly1305_name == ERR_PTR(-ENOENT))
+		nhpoly1305_name = "nhpoly1305";
+	if (IS_ERR(nhpoly1305_name))
+		return PTR_ERR(nhpoly1305_name);
+
+	inst = kzalloc(sizeof(*inst) + sizeof(*ictx), GFP_KERNEL);
+	if (!inst)
+		return -ENOMEM;
+	ictx = skcipher_instance_ctx(inst);
+
+	/* Stream cipher, e.g. "xchacha12" */
+	crypto_set_skcipher_spawn(&ictx->streamcipher_spawn,
+				  skcipher_crypto_instance(inst));
+	err = crypto_grab_skcipher(&ictx->streamcipher_spawn, streamcipher_name,
+				   0, crypto_requires_sync(algt->type,
+							   algt->mask));
+	if (err)
+		goto out_free_inst;
+	streamcipher_alg = crypto_spawn_skcipher_alg(&ictx->streamcipher_spawn);
+
+	/* Block cipher, e.g. "aes" */
+	crypto_set_spawn(&ictx->blockcipher_spawn,
+			 skcipher_crypto_instance(inst));
+	err = crypto_grab_spawn(&ictx->blockcipher_spawn, blockcipher_name,
+				CRYPTO_ALG_TYPE_CIPHER, CRYPTO_ALG_TYPE_MASK);
+	if (err)
+		goto out_drop_streamcipher;
+	blockcipher_alg = ictx->blockcipher_spawn.alg;
+
+	/* NHPoly1305 ε-∆U hash function */
+	_hash_alg = crypto_alg_mod_lookup(nhpoly1305_name,
+					  CRYPTO_ALG_TYPE_SHASH,
+					  CRYPTO_ALG_TYPE_MASK);
+	if (IS_ERR(_hash_alg)) {
+		err = PTR_ERR(_hash_alg);
+		goto out_drop_blockcipher;
+	}
+	hash_alg = __crypto_shash_alg(_hash_alg);
+	err = crypto_init_shash_spawn(&ictx->hash_spawn, hash_alg,
+				      skcipher_crypto_instance(inst));
+	if (err)
+		goto out_put_hash;
+
+	/* Check the set of algorithms */
+	if (!adiantum_supported_algorithms(streamcipher_alg, blockcipher_alg,
+					   hash_alg)) {
+		pr_warn("Unsupported Adiantum instantiation: (%s,%s,%s)\n",
+			streamcipher_alg->base.cra_name,
+			blockcipher_alg->cra_name, hash_alg->base.cra_name);
+		err = -EINVAL;
+		goto out_drop_hash;
+	}
+
+	/* Instance fields */
+
+	err = -ENAMETOOLONG;
+	if (snprintf(inst->alg.base.cra_name, CRYPTO_MAX_ALG_NAME,
+		     "adiantum(%s,%s)", streamcipher_alg->base.cra_name,
+		     blockcipher_alg->cra_name) >= CRYPTO_MAX_ALG_NAME)
+		goto out_drop_hash;
+	if (snprintf(inst->alg.base.cra_driver_name, CRYPTO_MAX_ALG_NAME,
+		     "adiantum(%s,%s,%s)",
+		     streamcipher_alg->base.cra_driver_name,
+		     blockcipher_alg->cra_driver_name,
+		     hash_alg->base.cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
+		goto out_drop_hash;
+
+	inst->alg.base.cra_flags = streamcipher_alg->base.cra_flags &
+				   CRYPTO_ALG_ASYNC;
+	inst->alg.base.cra_blocksize = BLOCKCIPHER_BLOCK_SIZE;
+	inst->alg.base.cra_ctxsize = sizeof(struct adiantum_tfm_ctx);
+	inst->alg.base.cra_alignmask = streamcipher_alg->base.cra_alignmask |
+				       hash_alg->base.cra_alignmask;
+	/*
+	 * The block cipher is only invoked once per message, so for long
+	 * messages (e.g. sectors for disk encryption) its performance doesn't
+	 * matter as much as that of the stream cipher and hash function.  Thus,
+	 * weigh the block cipher's ->cra_priority less.
+	 */
+	inst->alg.base.cra_priority = (4 * streamcipher_alg->base.cra_priority +
+				       2 * hash_alg->base.cra_priority +
+				       blockcipher_alg->cra_priority) / 7;
+
+	inst->alg.setkey = adiantum_setkey;
+	inst->alg.encrypt = adiantum_encrypt;
+	inst->alg.decrypt = adiantum_decrypt;
+	inst->alg.init = adiantum_init_tfm;
+	inst->alg.exit = adiantum_exit_tfm;
+	inst->alg.min_keysize = crypto_skcipher_alg_min_keysize(streamcipher_alg);
+	inst->alg.max_keysize = crypto_skcipher_alg_max_keysize(streamcipher_alg);
+	inst->alg.ivsize = TWEAK_SIZE;
+
+	inst->free = adiantum_free_instance;
+
+	err = skcipher_register_instance(tmpl, inst);
+	if (err)
+		goto out_drop_hash;
+
+	crypto_mod_put(_hash_alg);
+	return 0;
+
+out_drop_hash:
+	crypto_drop_shash(&ictx->hash_spawn);
+out_put_hash:
+	crypto_mod_put(_hash_alg);
+out_drop_blockcipher:
+	crypto_drop_spawn(&ictx->blockcipher_spawn);
+out_drop_streamcipher:
+	crypto_drop_skcipher(&ictx->streamcipher_spawn);
+out_free_inst:
+	kfree(inst);
+	return err;
+}
+
+/* adiantum(streamcipher_name, blockcipher_name [, nhpoly1305_name]) */
+static struct crypto_template adiantum_tmpl = {
+	.name = "adiantum",
+	.create = adiantum_create,
+	.module = THIS_MODULE,
+};
+
+static int __init adiantum_module_init(void)
+{
+	return crypto_register_template(&adiantum_tmpl);
+}
+
+static void __exit adiantum_module_exit(void)
+{
+	crypto_unregister_template(&adiantum_tmpl);
+}
+
+module_init(adiantum_module_init);
+module_exit(adiantum_module_exit);
+
+MODULE_DESCRIPTION("Adiantum length-preserving encryption mode");
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Eric Biggers <ebiggers@google.com>");
+MODULE_ALIAS_CRYPTO("adiantum");
diff --git a/crypto/aes_generic.c b/crypto/aes_generic.c
index ca554d5..13df33a 100644
--- a/crypto/aes_generic.c
+++ b/crypto/aes_generic.c
@@ -63,7 +63,8 @@
 
 static const u32 rco_tab[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 };
 
-__visible const u32 crypto_ft_tab[4][256] = {
+/* cacheline-aligned to facilitate prefetching into cache */
+__visible const u32 crypto_ft_tab[4][256] __cacheline_aligned = {
 	{
 		0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6,
 		0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591,
@@ -327,7 +328,7 @@
 	}
 };
 
-__visible const u32 crypto_fl_tab[4][256] = {
+__visible const u32 crypto_fl_tab[4][256] __cacheline_aligned = {
 	{
 		0x00000063, 0x0000007c, 0x00000077, 0x0000007b,
 		0x000000f2, 0x0000006b, 0x0000006f, 0x000000c5,
@@ -591,7 +592,7 @@
 	}
 };
 
-__visible const u32 crypto_it_tab[4][256] = {
+__visible const u32 crypto_it_tab[4][256] __cacheline_aligned = {
 	{
 		0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a,
 		0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b,
@@ -855,7 +856,7 @@
 	}
 };
 
-__visible const u32 crypto_il_tab[4][256] = {
+__visible const u32 crypto_il_tab[4][256] __cacheline_aligned = {
 	{
 		0x00000052, 0x00000009, 0x0000006a, 0x000000d5,
 		0x00000030, 0x00000036, 0x000000a5, 0x00000038,
diff --git a/crypto/chacha20_generic.c b/crypto/chacha20_generic.c
deleted file mode 100644
index 3ae9658..0000000
--- a/crypto/chacha20_generic.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * ChaCha20 256-bit cipher algorithm, RFC7539
- *
- * Copyright (C) 2015 Martin Willi
- *
- * 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.
- */
-
-#include <asm/unaligned.h>
-#include <crypto/algapi.h>
-#include <crypto/chacha20.h>
-#include <crypto/internal/skcipher.h>
-#include <linux/module.h>
-
-static void chacha20_docrypt(u32 *state, u8 *dst, const u8 *src,
-			     unsigned int bytes)
-{
-	/* aligned to potentially speed up crypto_xor() */
-	u8 stream[CHACHA20_BLOCK_SIZE] __aligned(sizeof(long));
-
-	if (dst != src)
-		memcpy(dst, src, bytes);
-
-	while (bytes >= CHACHA20_BLOCK_SIZE) {
-		chacha20_block(state, stream);
-		crypto_xor(dst, stream, CHACHA20_BLOCK_SIZE);
-		bytes -= CHACHA20_BLOCK_SIZE;
-		dst += CHACHA20_BLOCK_SIZE;
-	}
-	if (bytes) {
-		chacha20_block(state, stream);
-		crypto_xor(dst, stream, bytes);
-	}
-}
-
-void crypto_chacha20_init(u32 *state, struct chacha20_ctx *ctx, u8 *iv)
-{
-	state[0]  = 0x61707865; /* "expa" */
-	state[1]  = 0x3320646e; /* "nd 3" */
-	state[2]  = 0x79622d32; /* "2-by" */
-	state[3]  = 0x6b206574; /* "te k" */
-	state[4]  = ctx->key[0];
-	state[5]  = ctx->key[1];
-	state[6]  = ctx->key[2];
-	state[7]  = ctx->key[3];
-	state[8]  = ctx->key[4];
-	state[9]  = ctx->key[5];
-	state[10] = ctx->key[6];
-	state[11] = ctx->key[7];
-	state[12] = get_unaligned_le32(iv +  0);
-	state[13] = get_unaligned_le32(iv +  4);
-	state[14] = get_unaligned_le32(iv +  8);
-	state[15] = get_unaligned_le32(iv + 12);
-}
-EXPORT_SYMBOL_GPL(crypto_chacha20_init);
-
-int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
-			   unsigned int keysize)
-{
-	struct chacha20_ctx *ctx = crypto_skcipher_ctx(tfm);
-	int i;
-
-	if (keysize != CHACHA20_KEY_SIZE)
-		return -EINVAL;
-
-	for (i = 0; i < ARRAY_SIZE(ctx->key); i++)
-		ctx->key[i] = get_unaligned_le32(key + i * sizeof(u32));
-
-	return 0;
-}
-EXPORT_SYMBOL_GPL(crypto_chacha20_setkey);
-
-int crypto_chacha20_crypt(struct skcipher_request *req)
-{
-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-	struct chacha20_ctx *ctx = crypto_skcipher_ctx(tfm);
-	struct skcipher_walk walk;
-	u32 state[16];
-	int err;
-
-	err = skcipher_walk_virt(&walk, req, true);
-
-	crypto_chacha20_init(state, ctx, walk.iv);
-
-	while (walk.nbytes > 0) {
-		unsigned int nbytes = walk.nbytes;
-
-		if (nbytes < walk.total)
-			nbytes = round_down(nbytes, walk.stride);
-
-		chacha20_docrypt(state, walk.dst.virt.addr, walk.src.virt.addr,
-				 nbytes);
-		err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
-	}
-
-	return err;
-}
-EXPORT_SYMBOL_GPL(crypto_chacha20_crypt);
-
-static struct skcipher_alg alg = {
-	.base.cra_name		= "chacha20",
-	.base.cra_driver_name	= "chacha20-generic",
-	.base.cra_priority	= 100,
-	.base.cra_blocksize	= 1,
-	.base.cra_ctxsize	= sizeof(struct chacha20_ctx),
-	.base.cra_module	= THIS_MODULE,
-
-	.min_keysize		= CHACHA20_KEY_SIZE,
-	.max_keysize		= CHACHA20_KEY_SIZE,
-	.ivsize			= CHACHA20_IV_SIZE,
-	.chunksize		= CHACHA20_BLOCK_SIZE,
-	.setkey			= crypto_chacha20_setkey,
-	.encrypt		= crypto_chacha20_crypt,
-	.decrypt		= crypto_chacha20_crypt,
-};
-
-static int __init chacha20_generic_mod_init(void)
-{
-	return crypto_register_skcipher(&alg);
-}
-
-static void __exit chacha20_generic_mod_fini(void)
-{
-	crypto_unregister_skcipher(&alg);
-}
-
-module_init(chacha20_generic_mod_init);
-module_exit(chacha20_generic_mod_fini);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Martin Willi <martin@strongswan.org>");
-MODULE_DESCRIPTION("chacha20 cipher algorithm");
-MODULE_ALIAS_CRYPTO("chacha20");
-MODULE_ALIAS_CRYPTO("chacha20-generic");
diff --git a/crypto/chacha20poly1305.c b/crypto/chacha20poly1305.c
index af8afe5..dce194c 100644
--- a/crypto/chacha20poly1305.c
+++ b/crypto/chacha20poly1305.c
@@ -13,7 +13,7 @@
 #include <crypto/internal/hash.h>
 #include <crypto/internal/skcipher.h>
 #include <crypto/scatterwalk.h>
-#include <crypto/chacha20.h>
+#include <crypto/chacha.h>
 #include <crypto/poly1305.h>
 #include <linux/err.h>
 #include <linux/init.h>
@@ -51,7 +51,7 @@
 };
 
 struct chacha_req {
-	u8 iv[CHACHA20_IV_SIZE];
+	u8 iv[CHACHA_IV_SIZE];
 	struct scatterlist src[1];
 	struct skcipher_request req; /* must be last member */
 };
@@ -97,7 +97,7 @@
 	memcpy(iv, &leicb, sizeof(leicb));
 	memcpy(iv + sizeof(leicb), ctx->salt, ctx->saltlen);
 	memcpy(iv + sizeof(leicb) + ctx->saltlen, req->iv,
-	       CHACHA20_IV_SIZE - sizeof(leicb) - ctx->saltlen);
+	       CHACHA_IV_SIZE - sizeof(leicb) - ctx->saltlen);
 }
 
 static int poly_verify_tag(struct aead_request *req)
@@ -502,7 +502,7 @@
 	struct chachapoly_ctx *ctx = crypto_aead_ctx(aead);
 	int err;
 
-	if (keylen != ctx->saltlen + CHACHA20_KEY_SIZE)
+	if (keylen != ctx->saltlen + CHACHA_KEY_SIZE)
 		return -EINVAL;
 
 	keylen -= ctx->saltlen;
@@ -647,7 +647,7 @@
 
 	err = -EINVAL;
 	/* Need 16-byte IV size, including Initial Block Counter value */
-	if (crypto_skcipher_alg_ivsize(chacha) != CHACHA20_IV_SIZE)
+	if (crypto_skcipher_alg_ivsize(chacha) != CHACHA_IV_SIZE)
 		goto out_drop_chacha;
 	/* Not a stream cipher? */
 	if (chacha->base.cra_blocksize != 1)
diff --git a/crypto/chacha_generic.c b/crypto/chacha_generic.c
new file mode 100644
index 0000000..35b5831
--- /dev/null
+++ b/crypto/chacha_generic.c
@@ -0,0 +1,217 @@
+/*
+ * ChaCha and XChaCha stream ciphers, including ChaCha20 (RFC7539)
+ *
+ * Copyright (C) 2015 Martin Willi
+ * Copyright (C) 2018 Google LLC
+ *
+ * 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.
+ */
+
+#include <asm/unaligned.h>
+#include <crypto/algapi.h>
+#include <crypto/chacha.h>
+#include <crypto/internal/skcipher.h>
+#include <linux/module.h>
+
+static void chacha_docrypt(u32 *state, u8 *dst, const u8 *src,
+			   unsigned int bytes, int nrounds)
+{
+	/* aligned to potentially speed up crypto_xor() */
+	u8 stream[CHACHA_BLOCK_SIZE] __aligned(sizeof(long));
+
+	if (dst != src)
+		memcpy(dst, src, bytes);
+
+	while (bytes >= CHACHA_BLOCK_SIZE) {
+		chacha_block(state, stream, nrounds);
+		crypto_xor(dst, stream, CHACHA_BLOCK_SIZE);
+		bytes -= CHACHA_BLOCK_SIZE;
+		dst += CHACHA_BLOCK_SIZE;
+	}
+	if (bytes) {
+		chacha_block(state, stream, nrounds);
+		crypto_xor(dst, stream, bytes);
+	}
+}
+
+static int chacha_stream_xor(struct skcipher_request *req,
+			     struct chacha_ctx *ctx, u8 *iv)
+{
+	struct skcipher_walk walk;
+	u32 state[16];
+	int err;
+
+	err = skcipher_walk_virt(&walk, req, false);
+
+	crypto_chacha_init(state, ctx, iv);
+
+	while (walk.nbytes > 0) {
+		unsigned int nbytes = walk.nbytes;
+
+		if (nbytes < walk.total)
+			nbytes = round_down(nbytes, walk.stride);
+
+		chacha_docrypt(state, walk.dst.virt.addr, walk.src.virt.addr,
+			       nbytes, ctx->nrounds);
+		err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
+	}
+
+	return err;
+}
+
+void crypto_chacha_init(u32 *state, struct chacha_ctx *ctx, u8 *iv)
+{
+	state[0]  = 0x61707865; /* "expa" */
+	state[1]  = 0x3320646e; /* "nd 3" */
+	state[2]  = 0x79622d32; /* "2-by" */
+	state[3]  = 0x6b206574; /* "te k" */
+	state[4]  = ctx->key[0];
+	state[5]  = ctx->key[1];
+	state[6]  = ctx->key[2];
+	state[7]  = ctx->key[3];
+	state[8]  = ctx->key[4];
+	state[9]  = ctx->key[5];
+	state[10] = ctx->key[6];
+	state[11] = ctx->key[7];
+	state[12] = get_unaligned_le32(iv +  0);
+	state[13] = get_unaligned_le32(iv +  4);
+	state[14] = get_unaligned_le32(iv +  8);
+	state[15] = get_unaligned_le32(iv + 12);
+}
+EXPORT_SYMBOL_GPL(crypto_chacha_init);
+
+static int chacha_setkey(struct crypto_skcipher *tfm, const u8 *key,
+			 unsigned int keysize, int nrounds)
+{
+	struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
+	int i;
+
+	if (keysize != CHACHA_KEY_SIZE)
+		return -EINVAL;
+
+	for (i = 0; i < ARRAY_SIZE(ctx->key); i++)
+		ctx->key[i] = get_unaligned_le32(key + i * sizeof(u32));
+
+	ctx->nrounds = nrounds;
+	return 0;
+}
+
+int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
+			   unsigned int keysize)
+{
+	return chacha_setkey(tfm, key, keysize, 20);
+}
+EXPORT_SYMBOL_GPL(crypto_chacha20_setkey);
+
+int crypto_chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
+			   unsigned int keysize)
+{
+	return chacha_setkey(tfm, key, keysize, 12);
+}
+EXPORT_SYMBOL_GPL(crypto_chacha12_setkey);
+
+int crypto_chacha_crypt(struct skcipher_request *req)
+{
+	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+	struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
+
+	return chacha_stream_xor(req, ctx, req->iv);
+}
+EXPORT_SYMBOL_GPL(crypto_chacha_crypt);
+
+int crypto_xchacha_crypt(struct skcipher_request *req)
+{
+	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+	struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
+	struct chacha_ctx subctx;
+	u32 state[16];
+	u8 real_iv[16];
+
+	/* Compute the subkey given the original key and first 128 nonce bits */
+	crypto_chacha_init(state, ctx, req->iv);
+	hchacha_block(state, subctx.key, ctx->nrounds);
+	subctx.nrounds = ctx->nrounds;
+
+	/* Build the real IV */
+	memcpy(&real_iv[0], req->iv + 24, 8); /* stream position */
+	memcpy(&real_iv[8], req->iv + 16, 8); /* remaining 64 nonce bits */
+
+	/* Generate the stream and XOR it with the data */
+	return chacha_stream_xor(req, &subctx, real_iv);
+}
+EXPORT_SYMBOL_GPL(crypto_xchacha_crypt);
+
+static struct skcipher_alg algs[] = {
+	{
+		.base.cra_name		= "chacha20",
+		.base.cra_driver_name	= "chacha20-generic",
+		.base.cra_priority	= 100,
+		.base.cra_blocksize	= 1,
+		.base.cra_ctxsize	= sizeof(struct chacha_ctx),
+		.base.cra_module	= THIS_MODULE,
+
+		.min_keysize		= CHACHA_KEY_SIZE,
+		.max_keysize		= CHACHA_KEY_SIZE,
+		.ivsize			= CHACHA_IV_SIZE,
+		.chunksize		= CHACHA_BLOCK_SIZE,
+		.setkey			= crypto_chacha20_setkey,
+		.encrypt		= crypto_chacha_crypt,
+		.decrypt		= crypto_chacha_crypt,
+	}, {
+		.base.cra_name		= "xchacha20",
+		.base.cra_driver_name	= "xchacha20-generic",
+		.base.cra_priority	= 100,
+		.base.cra_blocksize	= 1,
+		.base.cra_ctxsize	= sizeof(struct chacha_ctx),
+		.base.cra_module	= THIS_MODULE,
+
+		.min_keysize		= CHACHA_KEY_SIZE,
+		.max_keysize		= CHACHA_KEY_SIZE,
+		.ivsize			= XCHACHA_IV_SIZE,
+		.chunksize		= CHACHA_BLOCK_SIZE,
+		.setkey			= crypto_chacha20_setkey,
+		.encrypt		= crypto_xchacha_crypt,
+		.decrypt		= crypto_xchacha_crypt,
+	}, {
+		.base.cra_name		= "xchacha12",
+		.base.cra_driver_name	= "xchacha12-generic",
+		.base.cra_priority	= 100,
+		.base.cra_blocksize	= 1,
+		.base.cra_ctxsize	= sizeof(struct chacha_ctx),
+		.base.cra_module	= THIS_MODULE,
+
+		.min_keysize		= CHACHA_KEY_SIZE,
+		.max_keysize		= CHACHA_KEY_SIZE,
+		.ivsize			= XCHACHA_IV_SIZE,
+		.chunksize		= CHACHA_BLOCK_SIZE,
+		.setkey			= crypto_chacha12_setkey,
+		.encrypt		= crypto_xchacha_crypt,
+		.decrypt		= crypto_xchacha_crypt,
+	}
+};
+
+static int __init chacha_generic_mod_init(void)
+{
+	return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
+}
+
+static void __exit chacha_generic_mod_fini(void)
+{
+	crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
+}
+
+module_init(chacha_generic_mod_init);
+module_exit(chacha_generic_mod_fini);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Martin Willi <martin@strongswan.org>");
+MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (generic)");
+MODULE_ALIAS_CRYPTO("chacha20");
+MODULE_ALIAS_CRYPTO("chacha20-generic");
+MODULE_ALIAS_CRYPTO("xchacha20");
+MODULE_ALIAS_CRYPTO("xchacha20-generic");
+MODULE_ALIAS_CRYPTO("xchacha12");
+MODULE_ALIAS_CRYPTO("xchacha12-generic");
diff --git a/crypto/nhpoly1305.c b/crypto/nhpoly1305.c
new file mode 100644
index 0000000..ec831a5
--- /dev/null
+++ b/crypto/nhpoly1305.c
@@ -0,0 +1,254 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * NHPoly1305 - ε-almost-∆-universal hash function for Adiantum
+ *
+ * Copyright 2018 Google LLC
+ */
+
+/*
+ * "NHPoly1305" is the main component of Adiantum hashing.
+ * Specifically, it is the calculation
+ *
+ *	H_L ← Poly1305_{K_L}(NH_{K_N}(pad_{128}(L)))
+ *
+ * from the procedure in section 6.4 of the Adiantum paper [1].  It is an
+ * ε-almost-∆-universal (ε-∆U) hash function for equal-length inputs over
+ * Z/(2^{128}Z), where the "∆" operation is addition.  It hashes 1024-byte
+ * chunks of the input with the NH hash function [2], reducing the input length
+ * by 32x.  The resulting NH digests are evaluated as a polynomial in
+ * GF(2^{130}-5), like in the Poly1305 MAC [3].  Note that the polynomial
+ * evaluation by itself would suffice to achieve the ε-∆U property; NH is used
+ * for performance since it's over twice as fast as Poly1305.
+ *
+ * This is *not* a cryptographic hash function; do not use it as such!
+ *
+ * [1] Adiantum: length-preserving encryption for entry-level processors
+ *     (https://eprint.iacr.org/2018/720.pdf)
+ * [2] UMAC: Fast and Secure Message Authentication
+ *     (https://fastcrypto.org/umac/umac_proc.pdf)
+ * [3] The Poly1305-AES message-authentication code
+ *     (https://cr.yp.to/mac/poly1305-20050329.pdf)
+ */
+
+#include <asm/unaligned.h>
+#include <crypto/algapi.h>
+#include <crypto/internal/hash.h>
+#include <crypto/nhpoly1305.h>
+#include <linux/crypto.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+static void nh_generic(const u32 *key, const u8 *message, size_t message_len,
+		       __le64 hash[NH_NUM_PASSES])
+{
+	u64 sums[4] = { 0, 0, 0, 0 };
+
+	BUILD_BUG_ON(NH_PAIR_STRIDE != 2);
+	BUILD_BUG_ON(NH_NUM_PASSES != 4);
+
+	while (message_len) {
+		u32 m0 = get_unaligned_le32(message + 0);
+		u32 m1 = get_unaligned_le32(message + 4);
+		u32 m2 = get_unaligned_le32(message + 8);
+		u32 m3 = get_unaligned_le32(message + 12);
+
+		sums[0] += (u64)(u32)(m0 + key[ 0]) * (u32)(m2 + key[ 2]);
+		sums[1] += (u64)(u32)(m0 + key[ 4]) * (u32)(m2 + key[ 6]);
+		sums[2] += (u64)(u32)(m0 + key[ 8]) * (u32)(m2 + key[10]);
+		sums[3] += (u64)(u32)(m0 + key[12]) * (u32)(m2 + key[14]);
+		sums[0] += (u64)(u32)(m1 + key[ 1]) * (u32)(m3 + key[ 3]);
+		sums[1] += (u64)(u32)(m1 + key[ 5]) * (u32)(m3 + key[ 7]);
+		sums[2] += (u64)(u32)(m1 + key[ 9]) * (u32)(m3 + key[11]);
+		sums[3] += (u64)(u32)(m1 + key[13]) * (u32)(m3 + key[15]);
+		key += NH_MESSAGE_UNIT / sizeof(key[0]);
+		message += NH_MESSAGE_UNIT;
+		message_len -= NH_MESSAGE_UNIT;
+	}
+
+	hash[0] = cpu_to_le64(sums[0]);
+	hash[1] = cpu_to_le64(sums[1]);
+	hash[2] = cpu_to_le64(sums[2]);
+	hash[3] = cpu_to_le64(sums[3]);
+}
+
+/* Pass the next NH hash value through Poly1305 */
+static void process_nh_hash_value(struct nhpoly1305_state *state,
+				  const struct nhpoly1305_key *key)
+{
+	BUILD_BUG_ON(NH_HASH_BYTES % POLY1305_BLOCK_SIZE != 0);
+
+	poly1305_core_blocks(&state->poly_state, &key->poly_key, state->nh_hash,
+			     NH_HASH_BYTES / POLY1305_BLOCK_SIZE);
+}
+
+/*
+ * Feed the next portion of the source data, as a whole number of 16-byte
+ * "NH message units", through NH and Poly1305.  Each NH hash is taken over
+ * 1024 bytes, except possibly the final one which is taken over a multiple of
+ * 16 bytes up to 1024.  Also, in the case where data is passed in misaligned
+ * chunks, we combine partial hashes; the end result is the same either way.
+ */
+static void nhpoly1305_units(struct nhpoly1305_state *state,
+			     const struct nhpoly1305_key *key,
+			     const u8 *src, unsigned int srclen, nh_t nh_fn)
+{
+	do {
+		unsigned int bytes;
+
+		if (state->nh_remaining == 0) {
+			/* Starting a new NH message */
+			bytes = min_t(unsigned int, srclen, NH_MESSAGE_BYTES);
+			nh_fn(key->nh_key, src, bytes, state->nh_hash);
+			state->nh_remaining = NH_MESSAGE_BYTES - bytes;
+		} else {
+			/* Continuing a previous NH message */
+			__le64 tmp_hash[NH_NUM_PASSES];
+			unsigned int pos;
+			int i;
+
+			pos = NH_MESSAGE_BYTES - state->nh_remaining;
+			bytes = min(srclen, state->nh_remaining);
+			nh_fn(&key->nh_key[pos / 4], src, bytes, tmp_hash);
+			for (i = 0; i < NH_NUM_PASSES; i++)
+				le64_add_cpu(&state->nh_hash[i],
+					     le64_to_cpu(tmp_hash[i]));
+			state->nh_remaining -= bytes;
+		}
+		if (state->nh_remaining == 0)
+			process_nh_hash_value(state, key);
+		src += bytes;
+		srclen -= bytes;
+	} while (srclen);
+}
+
+int crypto_nhpoly1305_setkey(struct crypto_shash *tfm,
+			     const u8 *key, unsigned int keylen)
+{
+	struct nhpoly1305_key *ctx = crypto_shash_ctx(tfm);
+	int i;
+
+	if (keylen != NHPOLY1305_KEY_SIZE)
+		return -EINVAL;
+
+	poly1305_core_setkey(&ctx->poly_key, key);
+	key += POLY1305_BLOCK_SIZE;
+
+	for (i = 0; i < NH_KEY_WORDS; i++)
+		ctx->nh_key[i] = get_unaligned_le32(key + i * sizeof(u32));
+
+	return 0;
+}
+EXPORT_SYMBOL(crypto_nhpoly1305_setkey);
+
+int crypto_nhpoly1305_init(struct shash_desc *desc)
+{
+	struct nhpoly1305_state *state = shash_desc_ctx(desc);
+
+	poly1305_core_init(&state->poly_state);
+	state->buflen = 0;
+	state->nh_remaining = 0;
+	return 0;
+}
+EXPORT_SYMBOL(crypto_nhpoly1305_init);
+
+int crypto_nhpoly1305_update_helper(struct shash_desc *desc,
+				    const u8 *src, unsigned int srclen,
+				    nh_t nh_fn)
+{
+	struct nhpoly1305_state *state = shash_desc_ctx(desc);
+	const struct nhpoly1305_key *key = crypto_shash_ctx(desc->tfm);
+	unsigned int bytes;
+
+	if (state->buflen) {
+		bytes = min(srclen, (int)NH_MESSAGE_UNIT - state->buflen);
+		memcpy(&state->buffer[state->buflen], src, bytes);
+		state->buflen += bytes;
+		if (state->buflen < NH_MESSAGE_UNIT)
+			return 0;
+		nhpoly1305_units(state, key, state->buffer, NH_MESSAGE_UNIT,
+				 nh_fn);
+		state->buflen = 0;
+		src += bytes;
+		srclen -= bytes;
+	}
+
+	if (srclen >= NH_MESSAGE_UNIT) {
+		bytes = round_down(srclen, NH_MESSAGE_UNIT);
+		nhpoly1305_units(state, key, src, bytes, nh_fn);
+		src += bytes;
+		srclen -= bytes;
+	}
+
+	if (srclen) {
+		memcpy(state->buffer, src, srclen);
+		state->buflen = srclen;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(crypto_nhpoly1305_update_helper);
+
+int crypto_nhpoly1305_update(struct shash_desc *desc,
+			     const u8 *src, unsigned int srclen)
+{
+	return crypto_nhpoly1305_update_helper(desc, src, srclen, nh_generic);
+}
+EXPORT_SYMBOL(crypto_nhpoly1305_update);
+
+int crypto_nhpoly1305_final_helper(struct shash_desc *desc, u8 *dst, nh_t nh_fn)
+{
+	struct nhpoly1305_state *state = shash_desc_ctx(desc);
+	const struct nhpoly1305_key *key = crypto_shash_ctx(desc->tfm);
+
+	if (state->buflen) {
+		memset(&state->buffer[state->buflen], 0,
+		       NH_MESSAGE_UNIT - state->buflen);
+		nhpoly1305_units(state, key, state->buffer, NH_MESSAGE_UNIT,
+				 nh_fn);
+	}
+
+	if (state->nh_remaining)
+		process_nh_hash_value(state, key);
+
+	poly1305_core_emit(&state->poly_state, dst);
+	return 0;
+}
+EXPORT_SYMBOL(crypto_nhpoly1305_final_helper);
+
+int crypto_nhpoly1305_final(struct shash_desc *desc, u8 *dst)
+{
+	return crypto_nhpoly1305_final_helper(desc, dst, nh_generic);
+}
+EXPORT_SYMBOL(crypto_nhpoly1305_final);
+
+static struct shash_alg nhpoly1305_alg = {
+	.base.cra_name		= "nhpoly1305",
+	.base.cra_driver_name	= "nhpoly1305-generic",
+	.base.cra_priority	= 100,
+	.base.cra_ctxsize	= sizeof(struct nhpoly1305_key),
+	.base.cra_module	= THIS_MODULE,
+	.digestsize		= POLY1305_DIGEST_SIZE,
+	.init			= crypto_nhpoly1305_init,
+	.update			= crypto_nhpoly1305_update,
+	.final			= crypto_nhpoly1305_final,
+	.setkey			= crypto_nhpoly1305_setkey,
+	.descsize		= sizeof(struct nhpoly1305_state),
+};
+
+static int __init nhpoly1305_mod_init(void)
+{
+	return crypto_register_shash(&nhpoly1305_alg);
+}
+
+static void __exit nhpoly1305_mod_exit(void)
+{
+	crypto_unregister_shash(&nhpoly1305_alg);
+}
+
+module_init(nhpoly1305_mod_init);
+module_exit(nhpoly1305_mod_exit);
+
+MODULE_DESCRIPTION("NHPoly1305 ε-almost-∆-universal hash function");
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Eric Biggers <ebiggers@google.com>");
+MODULE_ALIAS_CRYPTO("nhpoly1305");
+MODULE_ALIAS_CRYPTO("nhpoly1305-generic");
diff --git a/crypto/poly1305_generic.c b/crypto/poly1305_generic.c
index 47d3a6b..2a06874 100644
--- a/crypto/poly1305_generic.c
+++ b/crypto/poly1305_generic.c
@@ -38,7 +38,7 @@
 {
 	struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
 
-	memset(dctx->h, 0, sizeof(dctx->h));
+	poly1305_core_init(&dctx->h);
 	dctx->buflen = 0;
 	dctx->rset = false;
 	dctx->sset = false;
@@ -47,23 +47,16 @@
 }
 EXPORT_SYMBOL_GPL(crypto_poly1305_init);
 
-static void poly1305_setrkey(struct poly1305_desc_ctx *dctx, const u8 *key)
+void poly1305_core_setkey(struct poly1305_key *key, const u8 *raw_key)
 {
 	/* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
-	dctx->r[0] = (get_unaligned_le32(key +  0) >> 0) & 0x3ffffff;
-	dctx->r[1] = (get_unaligned_le32(key +  3) >> 2) & 0x3ffff03;
-	dctx->r[2] = (get_unaligned_le32(key +  6) >> 4) & 0x3ffc0ff;
-	dctx->r[3] = (get_unaligned_le32(key +  9) >> 6) & 0x3f03fff;
-	dctx->r[4] = (get_unaligned_le32(key + 12) >> 8) & 0x00fffff;
+	key->r[0] = (get_unaligned_le32(raw_key +  0) >> 0) & 0x3ffffff;
+	key->r[1] = (get_unaligned_le32(raw_key +  3) >> 2) & 0x3ffff03;
+	key->r[2] = (get_unaligned_le32(raw_key +  6) >> 4) & 0x3ffc0ff;
+	key->r[3] = (get_unaligned_le32(raw_key +  9) >> 6) & 0x3f03fff;
+	key->r[4] = (get_unaligned_le32(raw_key + 12) >> 8) & 0x00fffff;
 }
-
-static void poly1305_setskey(struct poly1305_desc_ctx *dctx, const u8 *key)
-{
-	dctx->s[0] = get_unaligned_le32(key +  0);
-	dctx->s[1] = get_unaligned_le32(key +  4);
-	dctx->s[2] = get_unaligned_le32(key +  8);
-	dctx->s[3] = get_unaligned_le32(key + 12);
-}
+EXPORT_SYMBOL_GPL(poly1305_core_setkey);
 
 /*
  * Poly1305 requires a unique key for each tag, which implies that we can't set
@@ -75,13 +68,16 @@
 {
 	if (!dctx->sset) {
 		if (!dctx->rset && srclen >= POLY1305_BLOCK_SIZE) {
-			poly1305_setrkey(dctx, src);
+			poly1305_core_setkey(&dctx->r, src);
 			src += POLY1305_BLOCK_SIZE;
 			srclen -= POLY1305_BLOCK_SIZE;
 			dctx->rset = true;
 		}
 		if (srclen >= POLY1305_BLOCK_SIZE) {
-			poly1305_setskey(dctx, src);
+			dctx->s[0] = get_unaligned_le32(src +  0);
+			dctx->s[1] = get_unaligned_le32(src +  4);
+			dctx->s[2] = get_unaligned_le32(src +  8);
+			dctx->s[3] = get_unaligned_le32(src + 12);
 			src += POLY1305_BLOCK_SIZE;
 			srclen -= POLY1305_BLOCK_SIZE;
 			dctx->sset = true;
@@ -91,41 +87,37 @@
 }
 EXPORT_SYMBOL_GPL(crypto_poly1305_setdesckey);
 
-static unsigned int poly1305_blocks(struct poly1305_desc_ctx *dctx,
-				    const u8 *src, unsigned int srclen,
-				    u32 hibit)
+static void poly1305_blocks_internal(struct poly1305_state *state,
+				     const struct poly1305_key *key,
+				     const void *src, unsigned int nblocks,
+				     u32 hibit)
 {
 	u32 r0, r1, r2, r3, r4;
 	u32 s1, s2, s3, s4;
 	u32 h0, h1, h2, h3, h4;
 	u64 d0, d1, d2, d3, d4;
-	unsigned int datalen;
 
-	if (unlikely(!dctx->sset)) {
-		datalen = crypto_poly1305_setdesckey(dctx, src, srclen);
-		src += srclen - datalen;
-		srclen = datalen;
-	}
+	if (!nblocks)
+		return;
 
-	r0 = dctx->r[0];
-	r1 = dctx->r[1];
-	r2 = dctx->r[2];
-	r3 = dctx->r[3];
-	r4 = dctx->r[4];
+	r0 = key->r[0];
+	r1 = key->r[1];
+	r2 = key->r[2];
+	r3 = key->r[3];
+	r4 = key->r[4];
 
 	s1 = r1 * 5;
 	s2 = r2 * 5;
 	s3 = r3 * 5;
 	s4 = r4 * 5;
 
-	h0 = dctx->h[0];
-	h1 = dctx->h[1];
-	h2 = dctx->h[2];
-	h3 = dctx->h[3];
-	h4 = dctx->h[4];
+	h0 = state->h[0];
+	h1 = state->h[1];
+	h2 = state->h[2];
+	h3 = state->h[3];
+	h4 = state->h[4];
 
-	while (likely(srclen >= POLY1305_BLOCK_SIZE)) {
-
+	do {
 		/* h += m[i] */
 		h0 += (get_unaligned_le32(src +  0) >> 0) & 0x3ffffff;
 		h1 += (get_unaligned_le32(src +  3) >> 2) & 0x3ffffff;
@@ -154,16 +146,36 @@
 		h1 += h0 >> 26;       h0 = h0 & 0x3ffffff;
 
 		src += POLY1305_BLOCK_SIZE;
-		srclen -= POLY1305_BLOCK_SIZE;
+	} while (--nblocks);
+
+	state->h[0] = h0;
+	state->h[1] = h1;
+	state->h[2] = h2;
+	state->h[3] = h3;
+	state->h[4] = h4;
+}
+
+void poly1305_core_blocks(struct poly1305_state *state,
+			  const struct poly1305_key *key,
+			  const void *src, unsigned int nblocks)
+{
+	poly1305_blocks_internal(state, key, src, nblocks, 1 << 24);
+}
+EXPORT_SYMBOL_GPL(poly1305_core_blocks);
+
+static void poly1305_blocks(struct poly1305_desc_ctx *dctx,
+			    const u8 *src, unsigned int srclen, u32 hibit)
+{
+	unsigned int datalen;
+
+	if (unlikely(!dctx->sset)) {
+		datalen = crypto_poly1305_setdesckey(dctx, src, srclen);
+		src += srclen - datalen;
+		srclen = datalen;
 	}
 
-	dctx->h[0] = h0;
-	dctx->h[1] = h1;
-	dctx->h[2] = h2;
-	dctx->h[3] = h3;
-	dctx->h[4] = h4;
-
-	return srclen;
+	poly1305_blocks_internal(&dctx->h, &dctx->r,
+				 src, srclen / POLY1305_BLOCK_SIZE, hibit);
 }
 
 int crypto_poly1305_update(struct shash_desc *desc,
@@ -187,9 +199,9 @@
 	}
 
 	if (likely(srclen >= POLY1305_BLOCK_SIZE)) {
-		bytes = poly1305_blocks(dctx, src, srclen, 1 << 24);
-		src += srclen - bytes;
-		srclen = bytes;
+		poly1305_blocks(dctx, src, srclen, 1 << 24);
+		src += srclen - (srclen % POLY1305_BLOCK_SIZE);
+		srclen %= POLY1305_BLOCK_SIZE;
 	}
 
 	if (unlikely(srclen)) {
@@ -201,30 +213,18 @@
 }
 EXPORT_SYMBOL_GPL(crypto_poly1305_update);
 
-int crypto_poly1305_final(struct shash_desc *desc, u8 *dst)
+void poly1305_core_emit(const struct poly1305_state *state, void *dst)
 {
-	struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
 	u32 h0, h1, h2, h3, h4;
 	u32 g0, g1, g2, g3, g4;
 	u32 mask;
-	u64 f = 0;
-
-	if (unlikely(!dctx->sset))
-		return -ENOKEY;
-
-	if (unlikely(dctx->buflen)) {
-		dctx->buf[dctx->buflen++] = 1;
-		memset(dctx->buf + dctx->buflen, 0,
-		       POLY1305_BLOCK_SIZE - dctx->buflen);
-		poly1305_blocks(dctx, dctx->buf, POLY1305_BLOCK_SIZE, 0);
-	}
 
 	/* fully carry h */
-	h0 = dctx->h[0];
-	h1 = dctx->h[1];
-	h2 = dctx->h[2];
-	h3 = dctx->h[3];
-	h4 = dctx->h[4];
+	h0 = state->h[0];
+	h1 = state->h[1];
+	h2 = state->h[2];
+	h3 = state->h[3];
+	h4 = state->h[4];
 
 	h2 += (h1 >> 26);     h1 = h1 & 0x3ffffff;
 	h3 += (h2 >> 26);     h2 = h2 & 0x3ffffff;
@@ -254,16 +254,40 @@
 	h4 = (h4 & mask) | g4;
 
 	/* h = h % (2^128) */
-	h0 = (h0 >>  0) | (h1 << 26);
-	h1 = (h1 >>  6) | (h2 << 20);
-	h2 = (h2 >> 12) | (h3 << 14);
-	h3 = (h3 >> 18) | (h4 <<  8);
+	put_unaligned_le32((h0 >>  0) | (h1 << 26), dst +  0);
+	put_unaligned_le32((h1 >>  6) | (h2 << 20), dst +  4);
+	put_unaligned_le32((h2 >> 12) | (h3 << 14), dst +  8);
+	put_unaligned_le32((h3 >> 18) | (h4 <<  8), dst + 12);
+}
+EXPORT_SYMBOL_GPL(poly1305_core_emit);
+
+int crypto_poly1305_final(struct shash_desc *desc, u8 *dst)
+{
+	struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
+	__le32 digest[4];
+	u64 f = 0;
+
+	if (unlikely(!dctx->sset))
+		return -ENOKEY;
+
+	if (unlikely(dctx->buflen)) {
+		dctx->buf[dctx->buflen++] = 1;
+		memset(dctx->buf + dctx->buflen, 0,
+		       POLY1305_BLOCK_SIZE - dctx->buflen);
+		poly1305_blocks(dctx, dctx->buf, POLY1305_BLOCK_SIZE, 0);
+	}
+
+	poly1305_core_emit(&dctx->h, digest);
 
 	/* mac = (h + s) % (2^128) */
-	f = (f >> 32) + h0 + dctx->s[0]; put_unaligned_le32(f, dst +  0);
-	f = (f >> 32) + h1 + dctx->s[1]; put_unaligned_le32(f, dst +  4);
-	f = (f >> 32) + h2 + dctx->s[2]; put_unaligned_le32(f, dst +  8);
-	f = (f >> 32) + h3 + dctx->s[3]; put_unaligned_le32(f, dst + 12);
+	f = (f >> 32) + le32_to_cpu(digest[0]) + dctx->s[0];
+	put_unaligned_le32(f, dst + 0);
+	f = (f >> 32) + le32_to_cpu(digest[1]) + dctx->s[1];
+	put_unaligned_le32(f, dst + 4);
+	f = (f >> 32) + le32_to_cpu(digest[2]) + dctx->s[2];
+	put_unaligned_le32(f, dst + 8);
+	f = (f >> 32) + le32_to_cpu(digest[3]) + dctx->s[3];
+	put_unaligned_le32(f, dst + 12);
 
 	return 0;
 }
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c
index d332988..740ef57 100644
--- a/crypto/tcrypt.c
+++ b/crypto/tcrypt.c
@@ -2290,6 +2290,17 @@
 				   num_mb);
 		break;
 
+	case 219:
+		test_cipher_speed("adiantum(xchacha12,aes)", ENCRYPT, sec, NULL,
+				  0, speed_template_32);
+		test_cipher_speed("adiantum(xchacha12,aes)", DECRYPT, sec, NULL,
+				  0, speed_template_32);
+		test_cipher_speed("adiantum(xchacha20,aes)", ENCRYPT, sec, NULL,
+				  0, speed_template_32);
+		test_cipher_speed("adiantum(xchacha20,aes)", DECRYPT, sec, NULL,
+				  0, speed_template_32);
+		break;
+
 	case 300:
 		if (alg) {
 			test_hash_speed(alg, sec, generic_hash_speed_template);
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index 13cb2ea..8cc4cf8 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -2410,6 +2410,18 @@
 /* Please keep this list sorted by algorithm name. */
 static const struct alg_test_desc alg_test_descs[] = {
 	{
+		.alg = "adiantum(xchacha12,aes)",
+		.test = alg_test_skcipher,
+		.suite = {
+			.cipher = __VECS(adiantum_xchacha12_aes_tv_template)
+		},
+	}, {
+		.alg = "adiantum(xchacha20,aes)",
+		.test = alg_test_skcipher,
+		.suite = {
+			.cipher = __VECS(adiantum_xchacha20_aes_tv_template)
+		},
+	}, {
 		.alg = "aegis128",
 		.test = alg_test_aead,
 		.suite = {
@@ -3293,6 +3305,12 @@
 			}
 		}
 	}, {
+		.alg = "nhpoly1305",
+		.test = alg_test_hash,
+		.suite = {
+			.hash = __VECS(nhpoly1305_tv_template)
+		}
+	}, {
 		.alg = "ofb(aes)",
 		.test = alg_test_skcipher,
 		.fips_allowed = 1,
@@ -3546,6 +3564,18 @@
 			.hash = __VECS(aes_xcbc128_tv_template)
 		}
 	}, {
+		.alg = "xchacha12",
+		.test = alg_test_skcipher,
+		.suite = {
+			.cipher = __VECS(xchacha12_tv_template)
+		},
+	}, {
+		.alg = "xchacha20",
+		.test = alg_test_skcipher,
+		.suite = {
+			.cipher = __VECS(xchacha20_tv_template)
+		},
+	}, {
 		.alg = "xts(aes)",
 		.test = alg_test_skcipher,
 		.fips_allowed = 1,
diff --git a/crypto/testmgr.h b/crypto/testmgr.h
index 74e1454..39652cd 100644
--- a/crypto/testmgr.h
+++ b/crypto/testmgr.h
@@ -29,7 +29,7 @@
 #define MAX_DIGEST_SIZE		64
 #define MAX_TAP			8
 
-#define MAX_KEYLEN		160
+#define MAX_KEYLEN		1088
 #define MAX_IVLEN		32
 
 struct hash_testvec {
@@ -37,10 +37,10 @@
 	const char *key;
 	const char *plaintext;
 	const char *digest;
-	unsigned char tap[MAX_TAP];
+	unsigned short tap[MAX_TAP];
+	unsigned short np;
 	unsigned short psize;
-	unsigned char np;
-	unsigned char ksize;
+	unsigned short ksize;
 };
 
 /*
@@ -5637,6 +5637,1238 @@
 	}
 };
 
+/* NHPoly1305 test vectors from https://github.com/google/adiantum */
+static const struct hash_testvec nhpoly1305_tv_template[] = {
+	{
+		.key	= "\xd2\x5d\x4c\xdd\x8d\x2b\x7f\x7a"
+			  "\xd9\xbe\x71\xec\xd1\x83\x52\xe3"
+			  "\xe1\xad\xd7\x5c\x0a\x75\x9d\xec"
+			  "\x1d\x13\x7e\x5d\x71\x07\xc9\xe4"
+			  "\x57\x2d\x44\x68\xcf\xd8\xd6\xc5"
+			  "\x39\x69\x7d\x32\x75\x51\x4f\x7e"
+			  "\xb2\x4c\xc6\x90\x51\x6e\xd9\xd6"
+			  "\xa5\x8b\x2d\xf1\x94\xf9\xf7\x5e"
+			  "\x2c\x84\x7b\x41\x0f\x88\x50\x89"
+			  "\x30\xd9\xa1\x38\x46\x6c\xc0\x4f"
+			  "\xe8\xdf\xdc\x66\xab\x24\x43\x41"
+			  "\x91\x55\x29\x65\x86\x28\x5e\x45"
+			  "\xd5\x2d\xb7\x80\x08\x9a\xc3\xd4"
+			  "\x9a\x77\x0a\xd4\xef\x3e\xe6\x3f"
+			  "\x6f\x2f\x9b\x3a\x7d\x12\x1e\x80"
+			  "\x6c\x44\xa2\x25\xe1\xf6\x60\xe9"
+			  "\x0d\xaf\xc5\x3c\xa5\x79\xae\x64"
+			  "\xbc\xa0\x39\xa3\x4d\x10\xe5\x4d"
+			  "\xd5\xe7\x89\x7a\x13\xee\x06\x78"
+			  "\xdc\xa4\xdc\x14\x27\xe6\x49\x38"
+			  "\xd0\xe0\x45\x25\x36\xc5\xf4\x79"
+			  "\x2e\x9a\x98\x04\xe4\x2b\x46\x52"
+			  "\x7c\x33\xca\xe2\x56\x51\x50\xe2"
+			  "\xa5\x9a\xae\x18\x6a\x13\xf8\xd2"
+			  "\x21\x31\x66\x02\xe2\xda\x8d\x7e"
+			  "\x41\x19\xb2\x61\xee\x48\x8f\xf1"
+			  "\x65\x24\x2e\x1e\x68\xce\x05\xd9"
+			  "\x2a\xcf\xa5\x3a\x57\xdd\x35\x91"
+			  "\x93\x01\xca\x95\xfc\x2b\x36\x04"
+			  "\xe6\x96\x97\x28\xf6\x31\xfe\xa3"
+			  "\x9d\xf6\x6a\x1e\x80\x8d\xdc\xec"
+			  "\xaf\x66\x11\x13\x02\x88\xd5\x27"
+			  "\x33\xb4\x1a\xcd\xa3\xf6\xde\x31"
+			  "\x8e\xc0\x0e\x6c\xd8\x5a\x97\x5e"
+			  "\xdd\xfd\x60\x69\x38\x46\x3f\x90"
+			  "\x5e\x97\xd3\x32\x76\xc7\x82\x49"
+			  "\xfe\xba\x06\x5f\x2f\xa2\xfd\xff"
+			  "\x80\x05\x40\xe4\x33\x03\xfb\x10"
+			  "\xc0\xde\x65\x8c\xc9\x8d\x3a\x9d"
+			  "\xb5\x7b\x36\x4b\xb5\x0c\xcf\x00"
+			  "\x9c\x87\xe4\x49\xad\x90\xda\x4a"
+			  "\xdd\xbd\xff\xe2\x32\x57\xd6\x78"
+			  "\x36\x39\x6c\xd3\x5b\x9b\x88\x59"
+			  "\x2d\xf0\x46\xe4\x13\x0e\x2b\x35"
+			  "\x0d\x0f\x73\x8a\x4f\x26\x84\x75"
+			  "\x88\x3c\xc5\x58\x66\x18\x1a\xb4"
+			  "\x64\x51\x34\x27\x1b\xa4\x11\xc9"
+			  "\x6d\x91\x8a\xfa\x32\x60\x9d\xd7"
+			  "\x87\xe5\xaa\x43\x72\xf8\xda\xd1"
+			  "\x48\x44\x13\x61\xdc\x8c\x76\x17"
+			  "\x0c\x85\x4e\xf3\xdd\xa2\x42\xd2"
+			  "\x74\xc1\x30\x1b\xeb\x35\x31\x29"
+			  "\x5b\xd7\x4c\x94\x46\x35\xa1\x23"
+			  "\x50\xf2\xa2\x8e\x7e\x4f\x23\x4f"
+			  "\x51\xff\xe2\xc9\xa3\x7d\x56\x8b"
+			  "\x41\xf2\xd0\xc5\x57\x7e\x59\xac"
+			  "\xbb\x65\xf3\xfe\xf7\x17\xef\x63"
+			  "\x7c\x6f\x23\xdd\x22\x8e\xed\x84"
+			  "\x0e\x3b\x09\xb3\xf3\xf4\x8f\xcd"
+			  "\x37\xa8\xe1\xa7\x30\xdb\xb1\xa2"
+			  "\x9c\xa2\xdf\x34\x17\x3e\x68\x44"
+			  "\xd0\xde\x03\x50\xd1\x48\x6b\x20"
+			  "\xe2\x63\x45\xa5\xea\x87\xc2\x42"
+			  "\x95\x03\x49\x05\xed\xe0\x90\x29"
+			  "\x1a\xb8\xcf\x9b\x43\xcf\x29\x7a"
+			  "\x63\x17\x41\x9f\xe0\xc9\x10\xfd"
+			  "\x2c\x56\x8c\x08\x55\xb4\xa9\x27"
+			  "\x0f\x23\xb1\x05\x6a\x12\x46\xc7"
+			  "\xe1\xfe\x28\x93\x93\xd7\x2f\xdc"
+			  "\x98\x30\xdb\x75\x8a\xbe\x97\x7a"
+			  "\x02\xfb\x8c\xba\xbe\x25\x09\xbe"
+			  "\xce\xcb\xa2\xef\x79\x4d\x0e\x9d"
+			  "\x1b\x9d\xb6\x39\x34\x38\xfa\x07"
+			  "\xec\xe8\xfc\x32\x85\x1d\xf7\x85"
+			  "\x63\xc3\x3c\xc0\x02\x75\xd7\x3f"
+			  "\xb2\x68\x60\x66\x65\x81\xc6\xb1"
+			  "\x42\x65\x4b\x4b\x28\xd7\xc7\xaa"
+			  "\x9b\xd2\xdc\x1b\x01\xe0\x26\x39"
+			  "\x01\xc1\x52\x14\xd1\x3f\xb7\xe6"
+			  "\x61\x41\xc7\x93\xd2\xa2\x67\xc6"
+			  "\xf7\x11\xb5\xf5\xea\xdd\x19\xfb"
+			  "\x4d\x21\x12\xd6\x7d\xf1\x10\xb0"
+			  "\x89\x07\xc7\x5a\x52\x73\x70\x2f"
+			  "\x32\xef\x65\x2b\x12\xb2\xf0\xf5"
+			  "\x20\xe0\x90\x59\x7e\x64\xf1\x4c"
+			  "\x41\xb3\xa5\x91\x08\xe6\x5e\x5f"
+			  "\x05\x56\x76\xb4\xb0\xcd\x70\x53"
+			  "\x10\x48\x9c\xff\xc2\x69\x55\x24"
+			  "\x87\xef\x84\xea\xfb\xa7\xbf\xa0"
+			  "\x91\x04\xad\x4f\x8b\x57\x54\x4b"
+			  "\xb6\xe9\xd1\xac\x37\x2f\x1d\x2e"
+			  "\xab\xa5\xa4\xe8\xff\xfb\xd9\x39"
+			  "\x2f\xb7\xac\xd1\xfe\x0b\x9a\x80"
+			  "\x0f\xb6\xf4\x36\x39\x90\x51\xe3"
+			  "\x0a\x2f\xb6\x45\x76\x89\xcd\x61"
+			  "\xfe\x48\x5f\x75\x1d\x13\x00\x62"
+			  "\x80\x24\x47\xe7\xbc\x37\xd7\xe3"
+			  "\x15\xe8\x68\x22\xaf\x80\x6f\x4b"
+			  "\xa8\x9f\x01\x10\x48\x14\xc3\x02"
+			  "\x52\xd2\xc7\x75\x9b\x52\x6d\x30"
+			  "\xac\x13\x85\xc8\xf7\xa3\x58\x4b"
+			  "\x49\xf7\x1c\x45\x55\x8c\x39\x9a"
+			  "\x99\x6d\x97\x27\x27\xe6\xab\xdd"
+			  "\x2c\x42\x1b\x35\xdd\x9d\x73\xbb"
+			  "\x6c\xf3\x64\xf1\xfb\xb9\xf7\xe6"
+			  "\x4a\x3c\xc0\x92\xc0\x2e\xb7\x1a"
+			  "\xbe\xab\xb3\x5a\xe5\xea\xb1\x48"
+			  "\x58\x13\x53\x90\xfd\xc3\x8e\x54"
+			  "\xf9\x18\x16\x73\xe8\xcb\x6d\x39"
+			  "\x0e\xd7\xe0\xfe\xb6\x9f\x43\x97"
+			  "\xe8\xd0\x85\x56\x83\x3e\x98\x68"
+			  "\x7f\xbd\x95\xa8\x9a\x61\x21\x8f"
+			  "\x06\x98\x34\xa6\xc8\xd6\x1d\xf3"
+			  "\x3d\x43\xa4\x9a\x8c\xe5\xd3\x5a"
+			  "\x32\xa2\x04\x22\xa4\x19\x1a\x46"
+			  "\x42\x7e\x4d\xe5\xe0\xe6\x0e\xca"
+			  "\xd5\x58\x9d\x2c\xaf\xda\x33\x5c"
+			  "\xb0\x79\x9e\xc9\xfc\xca\xf0\x2f"
+			  "\xa8\xb2\x77\xeb\x7a\xa2\xdd\x37"
+			  "\x35\x83\x07\xd6\x02\x1a\xb6\x6c"
+			  "\x24\xe2\x59\x08\x0e\xfd\x3e\x46"
+			  "\xec\x40\x93\xf4\x00\x26\x4f\x2a"
+			  "\xff\x47\x2f\xeb\x02\x92\x26\x5b"
+			  "\x53\x17\xc2\x8d\x2a\xc7\xa3\x1b"
+			  "\xcd\xbc\xa7\xe8\xd1\x76\xe3\x80"
+			  "\x21\xca\x5d\x3b\xe4\x9c\x8f\xa9"
+			  "\x5b\x7f\x29\x7f\x7c\xd8\xed\x6d"
+			  "\x8c\xb2\x86\x85\xe7\x77\xf2\x85"
+			  "\xab\x38\xa9\x9d\xc1\x4e\xc5\x64"
+			  "\x33\x73\x8b\x59\x03\xad\x05\xdf"
+			  "\x25\x98\x31\xde\xef\x13\xf1\x9b"
+			  "\x3c\x91\x9d\x7b\xb1\xfa\xe6\xbf"
+			  "\x5b\xed\xa5\x55\xe6\xea\x6c\x74"
+			  "\xf4\xb9\xe4\x45\x64\x72\x81\xc2"
+			  "\x4c\x28\xd4\xcd\xac\xe2\xde\xf9"
+			  "\xeb\x5c\xeb\x61\x60\x5a\xe5\x28",
+		.ksize	= 1088,
+		.plaintext	= "",
+		.psize	= 0,
+		.digest	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+	}, {
+		.key	= "\x29\x21\x43\xcb\xcb\x13\x07\xde"
+			  "\xbf\x48\xdf\x8a\x7f\xa2\x84\xde"
+			  "\x72\x23\x9d\xf5\xf0\x07\xf2\x4c"
+			  "\x20\x3a\x93\xb9\xcd\x5d\xfe\xcb"
+			  "\x99\x2c\x2b\x58\xc6\x50\x5f\x94"
+			  "\x56\xc3\x7c\x0d\x02\x3f\xb8\x5e"
+			  "\x7b\xc0\x6c\x51\x34\x76\xc0\x0e"
+			  "\xc6\x22\xc8\x9e\x92\xa0\x21\xc9"
+			  "\x85\x5c\x7c\xf8\xe2\x64\x47\xc9"
+			  "\xe4\xa2\x57\x93\xf8\xa2\x69\xcd"
+			  "\x62\x98\x99\xf4\xd7\x7b\x14\xb1"
+			  "\xd8\x05\xff\x04\x15\xc9\xe1\x6e"
+			  "\x9b\xe6\x50\x6b\x0b\x3f\x22\x1f"
+			  "\x08\xde\x0c\x5b\x08\x7e\xc6\x2f"
+			  "\x6c\xed\xd6\xb2\x15\xa4\xb3\xf9"
+			  "\xa7\x46\x38\x2a\xea\x69\xa5\xde"
+			  "\x02\xc3\x96\x89\x4d\x55\x3b\xed"
+			  "\x3d\x3a\x85\x77\xbf\x97\x45\x5c"
+			  "\x9e\x02\x69\xe2\x1b\x68\xbe\x96"
+			  "\xfb\x64\x6f\x0f\xf6\x06\x40\x67"
+			  "\xfa\x04\xe3\x55\xfa\xbe\xa4\x60"
+			  "\xef\x21\x66\x97\xe6\x9d\x5c\x1f"
+			  "\x62\x37\xaa\x31\xde\xe4\x9c\x28"
+			  "\x95\xe0\x22\x86\xf4\x4d\xf3\x07"
+			  "\xfd\x5f\x3a\x54\x2c\x51\x80\x71"
+			  "\xba\x78\x69\x5b\x65\xab\x1f\x81"
+			  "\xed\x3b\xff\x34\xa3\xfb\xbc\x73"
+			  "\x66\x7d\x13\x7f\xdf\x6e\xe2\xe2"
+			  "\xeb\x4f\x6c\xda\x7d\x33\x57\xd0"
+			  "\xd3\x7c\x95\x4f\x33\x58\x21\xc7"
+			  "\xc0\xe5\x6f\x42\x26\xc6\x1f\x5e"
+			  "\x85\x1b\x98\x9a\xa2\x1e\x55\x77"
+			  "\x23\xdf\x81\x5e\x79\x55\x05\xfc"
+			  "\xfb\xda\xee\xba\x5a\xba\xf7\x77"
+			  "\x7f\x0e\xd3\xe1\x37\xfe\x8d\x2b"
+			  "\xd5\x3f\xfb\xd0\xc0\x3c\x0b\x3f"
+			  "\xcf\x3c\x14\xcf\xfb\x46\x72\x4c"
+			  "\x1f\x39\xe2\xda\x03\x71\x6d\x23"
+			  "\xef\x93\xcd\x39\xd9\x37\x80\x4d"
+			  "\x65\x61\xd1\x2c\x03\xa9\x47\x72"
+			  "\x4d\x1e\x0e\x16\x33\x0f\x21\x17"
+			  "\xec\x92\xea\x6f\x37\x22\xa4\xd8"
+			  "\x03\x33\x9e\xd8\x03\x69\x9a\xe8"
+			  "\xb2\x57\xaf\x78\x99\x05\x12\xab"
+			  "\x48\x90\x80\xf0\x12\x9b\x20\x64"
+			  "\x7a\x1d\x47\x5f\xba\x3c\xf9\xc3"
+			  "\x0a\x0d\x8d\xa1\xf9\x1b\x82\x13"
+			  "\x3e\x0d\xec\x0a\x83\xc0\x65\xe1"
+			  "\xe9\x95\xff\x97\xd6\xf2\xe4\xd5"
+			  "\x86\xc0\x1f\x29\x27\x63\xd7\xde"
+			  "\xb7\x0a\x07\x99\x04\x2d\xa3\x89"
+			  "\xa2\x43\xcf\xf3\xe1\x43\xac\x4a"
+			  "\x06\x97\xd0\x05\x4f\x87\xfa\xf9"
+			  "\x9b\xbf\x52\x70\xbd\xbc\x6c\xf3"
+			  "\x03\x13\x60\x41\x28\x09\xec\xcc"
+			  "\xb1\x1a\xec\xd6\xfb\x6f\x2a\x89"
+			  "\x5d\x0b\x53\x9c\x59\xc1\x84\x21"
+			  "\x33\x51\x47\x19\x31\x9c\xd4\x0a"
+			  "\x4d\x04\xec\x50\x90\x61\xbd\xbc"
+			  "\x7e\xc8\xd9\x6c\x98\x1d\x45\x41"
+			  "\x17\x5e\x97\x1c\xc5\xa8\xe8\xea"
+			  "\x46\x58\x53\xf7\x17\xd5\xad\x11"
+			  "\xc8\x54\xf5\x7a\x33\x90\xf5\x19"
+			  "\xba\x36\xb4\xfc\x52\xa5\x72\x3d"
+			  "\x14\xbb\x55\xa7\xe9\xe3\x12\xf7"
+			  "\x1c\x30\xa2\x82\x03\xbf\x53\x91"
+			  "\x2e\x60\x41\x9f\x5b\x69\x39\xf6"
+			  "\x4d\xc8\xf8\x46\x7a\x7f\xa4\x98"
+			  "\x36\xff\x06\xcb\xca\xe7\x33\xf2"
+			  "\xc0\x4a\xf4\x3c\x14\x44\x5f\x6b"
+			  "\x75\xef\x02\x36\x75\x08\x14\xfd"
+			  "\x10\x8e\xa5\x58\xd0\x30\x46\x49"
+			  "\xaf\x3a\xf8\x40\x3d\x35\xdb\x84"
+			  "\x11\x2e\x97\x6a\xb7\x87\x7f\xad"
+			  "\xf1\xfa\xa5\x63\x60\xd8\x5e\xbf"
+			  "\x41\x78\x49\xcf\x77\xbb\x56\xbb"
+			  "\x7d\x01\x67\x05\x22\xc8\x8f\x41"
+			  "\xba\x81\xd2\xca\x2c\x38\xac\x76"
+			  "\x06\xc1\x1a\xc2\xce\xac\x90\x67"
+			  "\x57\x3e\x20\x12\x5b\xd9\x97\x58"
+			  "\x65\x05\xb7\x04\x61\x7e\xd8\x3a"
+			  "\xbf\x55\x3b\x13\xe9\x34\x5a\x37"
+			  "\x36\xcb\x94\x45\xc5\x32\xb3\xa0"
+			  "\x0c\x3e\x49\xc5\xd3\xed\xa7\xf0"
+			  "\x1c\x69\xcc\xea\xcc\x83\xc9\x16"
+			  "\x95\x72\x4b\xf4\x89\xd5\xb9\x10"
+			  "\xf6\x2d\x60\x15\xea\x3c\x06\x66"
+			  "\x9f\x82\xad\x17\xce\xd2\xa4\x48"
+			  "\x7c\x65\xd9\xf8\x02\x4d\x9b\x4c"
+			  "\x89\x06\x3a\x34\x85\x48\x89\x86"
+			  "\xf9\x24\xa9\x54\x72\xdb\x44\x95"
+			  "\xc7\x44\x1c\x19\x11\x4c\x04\xdc"
+			  "\x13\xb9\x67\xc8\xc3\x3a\x6a\x50"
+			  "\xfa\xd1\xfb\xe1\x88\xb6\xf1\xa3"
+			  "\xc5\x3b\xdc\x38\x45\x16\x26\x02"
+			  "\x3b\xb8\x8f\x8b\x58\x7d\x23\x04"
+			  "\x50\x6b\x81\x9f\xae\x66\xac\x6f"
+			  "\xcf\x2a\x9d\xf1\xfd\x1d\x57\x07"
+			  "\xbe\x58\xeb\x77\x0c\xe3\xc2\x19"
+			  "\x14\x74\x1b\x51\x1c\x4f\x41\xf3"
+			  "\x32\x89\xb3\xe7\xde\x62\xf6\x5f"
+			  "\xc7\x6a\x4a\x2a\x5b\x0f\x5f\x87"
+			  "\x9c\x08\xb9\x02\x88\xc8\x29\xb7"
+			  "\x94\x52\xfa\x52\xfe\xaa\x50\x10"
+			  "\xba\x48\x75\x5e\x11\x1b\xe6\x39"
+			  "\xd7\x82\x2c\x87\xf1\x1e\xa4\x38"
+			  "\x72\x3e\x51\xe7\xd8\x3e\x5b\x7b"
+			  "\x31\x16\x89\xba\xd6\xad\x18\x5e"
+			  "\xba\xf8\x12\xb3\xf4\x6c\x47\x30"
+			  "\xc0\x38\x58\xb3\x10\x8d\x58\x5d"
+			  "\xb4\xfb\x19\x7e\x41\xc3\x66\xb8"
+			  "\xd6\x72\x84\xe1\x1a\xc2\x71\x4c"
+			  "\x0d\x4a\x21\x7a\xab\xa2\xc0\x36"
+			  "\x15\xc5\xe9\x46\xd7\x29\x17\x76"
+			  "\x5e\x47\x36\x7f\x72\x05\xa7\xcc"
+			  "\x36\x63\xf9\x47\x7d\xe6\x07\x3c"
+			  "\x8b\x79\x1d\x96\x61\x8d\x90\x65"
+			  "\x7c\xf5\xeb\x4e\x6e\x09\x59\x6d"
+			  "\x62\x50\x1b\x0f\xe0\xdc\x78\xf2"
+			  "\x5b\x83\x1a\xa1\x11\x75\xfd\x18"
+			  "\xd7\xe2\x8d\x65\x14\x21\xce\xbe"
+			  "\xb5\x87\xe3\x0a\xda\x24\x0a\x64"
+			  "\xa9\x9f\x03\x8d\x46\x5d\x24\x1a"
+			  "\x8a\x0c\x42\x01\xca\xb1\x5f\x7c"
+			  "\xa5\xac\x32\x4a\xb8\x07\x91\x18"
+			  "\x6f\xb0\x71\x3c\xc9\xb1\xa8\xf8"
+			  "\x5f\x69\xa5\xa1\xca\x9e\x7a\xaa"
+			  "\xac\xe9\xc7\x47\x41\x75\x25\xc3"
+			  "\x73\xe2\x0b\xdd\x6d\x52\x71\xbe"
+			  "\xc5\xdc\xb4\xe7\x01\x26\x53\x77"
+			  "\x86\x90\x85\x68\x6b\x7b\x03\x53"
+			  "\xda\x52\x52\x51\x68\xc8\xf3\xec"
+			  "\x6c\xd5\x03\x7a\xa3\x0e\xb4\x02"
+			  "\x5f\x1a\xab\xee\xca\x67\x29\x7b"
+			  "\xbd\x96\x59\xb3\x8b\x32\x7a\x92"
+			  "\x9f\xd8\x25\x2b\xdf\xc0\x4c\xda",
+		.ksize	= 1088,
+		.plaintext	= "\xbc\xda\x81\xa8\x78\x79\x1c\xbf"
+			  "\x77\x53\xba\x4c\x30\x5b\xb8\x33",
+		.psize	= 16,
+		.digest	= "\x04\xbf\x7f\x6a\xce\x72\xea\x6a"
+			  "\x79\xdb\xb0\xc9\x60\xf6\x12\xcc",
+		.np	= 6,
+		.tap	= { 4, 4, 1, 1, 1, 5 },
+	}, {
+		.key	= "\x65\x4d\xe3\xf8\xd2\x4c\xac\x28"
+			  "\x68\xf5\xb3\x81\x71\x4b\xa1\xfa"
+			  "\x04\x0e\xd3\x81\x36\xbe\x0c\x81"
+			  "\x5e\xaf\xbc\x3a\xa4\xc0\x8e\x8b"
+			  "\x55\x63\xd3\x52\x97\x88\xd6\x19"
+			  "\xbc\x96\xdf\x49\xff\x04\x63\xf5"
+			  "\x0c\x11\x13\xaa\x9e\x1f\x5a\xf7"
+			  "\xdd\xbd\x37\x80\xc3\xd0\xbe\xa7"
+			  "\x05\xc8\x3c\x98\x1e\x05\x3c\x84"
+			  "\x39\x61\xc4\xed\xed\x71\x1b\xc4"
+			  "\x74\x45\x2c\xa1\x56\x70\x97\xfd"
+			  "\x44\x18\x07\x7d\xca\x60\x1f\x73"
+			  "\x3b\x6d\x21\xcb\x61\x87\x70\x25"
+			  "\x46\x21\xf1\x1f\x21\x91\x31\x2d"
+			  "\x5d\xcc\xb7\xd1\x84\x3e\x3d\xdb"
+			  "\x03\x53\x2a\x82\xa6\x9a\x95\xbc"
+			  "\x1a\x1e\x0a\x5e\x07\x43\xab\x43"
+			  "\xaf\x92\x82\x06\x91\x04\x09\xf4"
+			  "\x17\x0a\x9a\x2c\x54\xdb\xb8\xf4"
+			  "\xd0\xf0\x10\x66\x24\x8d\xcd\xda"
+			  "\xfe\x0e\x45\x9d\x6f\xc4\x4e\xf4"
+			  "\x96\xaf\x13\xdc\xa9\xd4\x8c\xc4"
+			  "\xc8\x57\x39\x3c\xc2\xd3\x0a\x76"
+			  "\x4a\x1f\x75\x83\x44\xc7\xd1\x39"
+			  "\xd8\xb5\x41\xba\x73\x87\xfa\x96"
+			  "\xc7\x18\x53\xfb\x9b\xda\xa0\x97"
+			  "\x1d\xee\x60\x85\x9e\x14\xc3\xce"
+			  "\xc4\x05\x29\x3b\x95\x30\xa3\xd1"
+			  "\x9f\x82\x6a\x04\xf5\xa7\x75\x57"
+			  "\x82\x04\xfe\x71\x51\x71\xb1\x49"
+			  "\x50\xf8\xe0\x96\xf1\xfa\xa8\x88"
+			  "\x3f\xa0\x86\x20\xd4\x60\x79\x59"
+			  "\x17\x2d\xd1\x09\xf4\xec\x05\x57"
+			  "\xcf\x62\x7e\x0e\x7e\x60\x78\xe6"
+			  "\x08\x60\x29\xd8\xd5\x08\x1a\x24"
+			  "\xc4\x6c\x24\xe7\x92\x08\x3d\x8a"
+			  "\x98\x7a\xcf\x99\x0a\x65\x0e\xdc"
+			  "\x8c\x8a\xbe\x92\x82\x91\xcc\x62"
+			  "\x30\xb6\xf4\x3f\xc6\x8a\x7f\x12"
+			  "\x4a\x8a\x49\xfa\x3f\x5c\xd4\x5a"
+			  "\xa6\x82\xa3\xe6\xaa\x34\x76\xb2"
+			  "\xab\x0a\x30\xef\x6c\x77\x58\x3f"
+			  "\x05\x6b\xcc\x5c\xae\xdc\xd7\xb9"
+			  "\x51\x7e\x8d\x32\x5b\x24\x25\xbe"
+			  "\x2b\x24\x01\xcf\x80\xda\x16\xd8"
+			  "\x90\x72\x2c\xad\x34\x8d\x0c\x74"
+			  "\x02\xcb\xfd\xcf\x6e\xef\x97\xb5"
+			  "\x4c\xf2\x68\xca\xde\x43\x9e\x8a"
+			  "\xc5\x5f\x31\x7f\x14\x71\x38\xec"
+			  "\xbd\x98\xe5\x71\xc4\xb5\xdb\xef"
+			  "\x59\xd2\xca\xc0\xc1\x86\x75\x01"
+			  "\xd4\x15\x0d\x6f\xa4\xf7\x7b\x37"
+			  "\x47\xda\x18\x93\x63\xda\xbe\x9e"
+			  "\x07\xfb\xb2\x83\xd5\xc4\x34\x55"
+			  "\xee\x73\xa1\x42\x96\xf9\x66\x41"
+			  "\xa4\xcc\xd2\x93\x6e\xe1\x0a\xbb"
+			  "\xd2\xdd\x18\x23\xe6\x6b\x98\x0b"
+			  "\x8a\x83\x59\x2c\xc3\xa6\x59\x5b"
+			  "\x01\x22\x59\xf7\xdc\xb0\x87\x7e"
+			  "\xdb\x7d\xf4\x71\x41\xab\xbd\xee"
+			  "\x79\xbe\x3c\x01\x76\x0b\x2d\x0a"
+			  "\x42\xc9\x77\x8c\xbb\x54\x95\x60"
+			  "\x43\x2e\xe0\x17\x52\xbd\x90\xc9"
+			  "\xc2\x2c\xdd\x90\x24\x22\x76\x40"
+			  "\x5c\xb9\x41\xc9\xa1\xd5\xbd\xe3"
+			  "\x44\xe0\xa4\xab\xcc\xb8\xe2\x32"
+			  "\x02\x15\x04\x1f\x8c\xec\x5d\x14"
+			  "\xac\x18\xaa\xef\x6e\x33\x19\x6e"
+			  "\xde\xfe\x19\xdb\xeb\x61\xca\x18"
+			  "\xad\xd8\x3d\xbf\x09\x11\xc7\xa5"
+			  "\x86\x0b\x0f\xe5\x3e\xde\xe8\xd9"
+			  "\x0a\x69\x9e\x4c\x20\xff\xf9\xc5"
+			  "\xfa\xf8\xf3\x7f\xa5\x01\x4b\x5e"
+			  "\x0f\xf0\x3b\x68\xf0\x46\x8c\x2a"
+			  "\x7a\xc1\x8f\xa0\xfe\x6a\x5b\x44"
+			  "\x70\x5c\xcc\x92\x2c\x6f\x0f\xbd"
+			  "\x25\x3e\xb7\x8e\x73\x58\xda\xc9"
+			  "\xa5\xaa\x9e\xf3\x9b\xfd\x37\x3e"
+			  "\xe2\x88\xa4\x7b\xc8\x5c\xa8\x93"
+			  "\x0e\xe7\x9a\x9c\x2e\x95\x18\x9f"
+			  "\xc8\x45\x0c\x88\x9e\x53\x4f\x3a"
+			  "\x76\xc1\x35\xfa\x17\xd8\xac\xa0"
+			  "\x0c\x2d\x47\x2e\x4f\x69\x9b\xf7"
+			  "\xd0\xb6\x96\x0c\x19\xb3\x08\x01"
+			  "\x65\x7a\x1f\xc7\x31\x86\xdb\xc8"
+			  "\xc1\x99\x8f\xf8\x08\x4a\x9d\x23"
+			  "\x22\xa8\xcf\x27\x01\x01\x88\x93"
+			  "\x9c\x86\x45\xbd\xe0\x51\xca\x52"
+			  "\x84\xba\xfe\x03\xf7\xda\xc5\xce"
+			  "\x3e\x77\x75\x86\xaf\x84\xc8\x05"
+			  "\x44\x01\x0f\x02\xf3\x58\xb0\x06"
+			  "\x5a\xd7\x12\x30\x8d\xdf\x1f\x1f"
+			  "\x0a\xe6\xd2\xea\xf6\x3a\x7a\x99"
+			  "\x63\xe8\xd2\xc1\x4a\x45\x8b\x40"
+			  "\x4d\x0a\xa9\x76\x92\xb3\xda\x87"
+			  "\x36\x33\xf0\x78\xc3\x2f\x5f\x02"
+			  "\x1a\x6a\x2c\x32\xcd\x76\xbf\xbd"
+			  "\x5a\x26\x20\x28\x8c\x8c\xbc\x52"
+			  "\x3d\x0a\xc9\xcb\xab\xa4\x21\xb0"
+			  "\x54\x40\x81\x44\xc7\xd6\x1c\x11"
+			  "\x44\xc6\x02\x92\x14\x5a\xbf\x1a"
+			  "\x09\x8a\x18\xad\xcd\x64\x3d\x53"
+			  "\x4a\xb6\xa5\x1b\x57\x0e\xef\xe0"
+			  "\x8c\x44\x5f\x7d\xbd\x6c\xfd\x60"
+			  "\xae\x02\x24\xb6\x99\xdd\x8c\xaf"
+			  "\x59\x39\x75\x3c\xd1\x54\x7b\x86"
+			  "\xcc\x99\xd9\x28\x0c\xb0\x94\x62"
+			  "\xf9\x51\xd1\x19\x96\x2d\x66\xf5"
+			  "\x55\xcf\x9e\x59\xe2\x6b\x2c\x08"
+			  "\xc0\x54\x48\x24\x45\xc3\x8c\x73"
+			  "\xea\x27\x6e\x66\x7d\x1d\x0e\x6e"
+			  "\x13\xe8\x56\x65\x3a\xb0\x81\x5c"
+			  "\xf0\xe8\xd8\x00\x6b\xcd\x8f\xad"
+			  "\xdd\x53\xf3\xa4\x6c\x43\xd6\x31"
+			  "\xaf\xd2\x76\x1e\x91\x12\xdb\x3c"
+			  "\x8c\xc2\x81\xf0\x49\xdb\xe2\x6b"
+			  "\x76\x62\x0a\x04\xe4\xaa\x8a\x7c"
+			  "\x08\x0b\x5d\xd0\xee\x1d\xfb\xc4"
+			  "\x02\x75\x42\xd6\xba\xa7\x22\xa8"
+			  "\x47\x29\xb7\x85\x6d\x93\x3a\xdb"
+			  "\x00\x53\x0b\xa2\xeb\xf8\xfe\x01"
+			  "\x6f\x8a\x31\xd6\x17\x05\x6f\x67"
+			  "\x88\x95\x32\xfe\x4f\xa6\x4b\xf8"
+			  "\x03\xe4\xcd\x9a\x18\xe8\x4e\x2d"
+			  "\xf7\x97\x9a\x0c\x7d\x9f\x7e\x44"
+			  "\x69\x51\xe0\x32\x6b\x62\x86\x8f"
+			  "\xa6\x8e\x0b\x21\x96\xe5\xaf\x77"
+			  "\xc0\x83\xdf\xa5\x0e\xd0\xa1\x04"
+			  "\xaf\xc1\x10\xcb\x5a\x40\xe4\xe3"
+			  "\x38\x7e\x07\xe8\x4d\xfa\xed\xc5"
+			  "\xf0\x37\xdf\xbb\x8a\xcf\x3d\xdc"
+			  "\x61\xd2\xc6\x2b\xff\x07\xc9\x2f"
+			  "\x0c\x2d\x5c\x07\xa8\x35\x6a\xfc"
+			  "\xae\x09\x03\x45\x74\x51\x4d\xc4"
+			  "\xb8\x23\x87\x4a\x99\x27\x20\x87"
+			  "\x62\x44\x0a\x4a\xce\x78\x47\x22",
+		.ksize	= 1088,
+		.plaintext	= "\x8e\xb0\x4c\xde\x9c\x4a\x04\x5a"
+			  "\xf6\xa9\x7f\x45\x25\xa5\x7b\x3a"
+			  "\xbc\x4d\x73\x39\x81\xb5\xbd\x3d"
+			  "\x21\x6f\xd7\x37\x50\x3c\x7b\x28"
+			  "\xd1\x03\x3a\x17\xed\x7b\x7c\x2a"
+			  "\x16\xbc\xdf\x19\x89\x52\x71\x31"
+			  "\xb6\xc0\xfd\xb5\xd3\xba\x96\x99"
+			  "\xb6\x34\x0b\xd0\x99\x93\xfc\x1a"
+			  "\x01\x3c\x85\xc6\x9b\x78\x5c\x8b"
+			  "\xfe\xae\xd2\xbf\xb2\x6f\xf9\xed"
+			  "\xc8\x25\x17\xfe\x10\x3b\x7d\xda"
+			  "\xf4\x8d\x35\x4b\x7c\x7b\x82\xe7"
+			  "\xc2\xb3\xee\x60\x4a\x03\x86\xc9"
+			  "\x4e\xb5\xc4\xbe\xd2\xbd\x66\xf1"
+			  "\x13\xf1\x09\xab\x5d\xca\x63\x1f"
+			  "\xfc\xfb\x57\x2a\xfc\xca\x66\xd8"
+			  "\x77\x84\x38\x23\x1d\xac\xd3\xb3"
+			  "\x7a\xad\x4c\x70\xfa\x9c\xc9\x61"
+			  "\xa6\x1b\xba\x33\x4b\x4e\x33\xec"
+			  "\xa0\xa1\x64\x39\x40\x05\x1c\xc2"
+			  "\x3f\x49\x9d\xae\xf2\xc5\xf2\xc5"
+			  "\xfe\xe8\xf4\xc2\xf9\x96\x2d\x28"
+			  "\x92\x30\x44\xbc\xd2\x7f\xe1\x6e"
+			  "\x62\x02\x8f\x3d\x1c\x80\xda\x0e"
+			  "\x6a\x90\x7e\x75\xff\xec\x3e\xc4"
+			  "\xcd\x16\x34\x3b\x05\x6d\x4d\x20"
+			  "\x1c\x7b\xf5\x57\x4f\xfa\x3d\xac"
+			  "\xd0\x13\x55\xe8\xb3\xe1\x1b\x78"
+			  "\x30\xe6\x9f\x84\xd4\x69\xd1\x08"
+			  "\x12\x77\xa7\x4a\xbd\xc0\xf2\xd2"
+			  "\x78\xdd\xa3\x81\x12\xcb\x6c\x14"
+			  "\x90\x61\xe2\x84\xc6\x2b\x16\xcc"
+			  "\x40\x99\x50\x88\x01\x09\x64\x4f"
+			  "\x0a\x80\xbe\x61\xae\x46\xc9\x0a"
+			  "\x5d\xe0\xfb\x72\x7a\x1a\xdd\x61"
+			  "\x63\x20\x05\xa0\x4a\xf0\x60\x69"
+			  "\x7f\x92\xbc\xbf\x4e\x39\x4d\xdd"
+			  "\x74\xd1\xb7\xc0\x5a\x34\xb7\xae"
+			  "\x76\x65\x2e\xbc\x36\xb9\x04\x95"
+			  "\x42\xe9\x6f\xca\x78\xb3\x72\x07"
+			  "\xa3\xba\x02\x94\x67\x4c\xb1\xd7"
+			  "\xe9\x30\x0d\xf0\x3b\xb8\x10\x6d"
+			  "\xea\x2b\x21\xbf\x74\x59\x82\x97"
+			  "\x85\xaa\xf1\xd7\x54\x39\xeb\x05"
+			  "\xbd\xf3\x40\xa0\x97\xe6\x74\xfe"
+			  "\xb4\x82\x5b\xb1\x36\xcb\xe8\x0d"
+			  "\xce\x14\xd9\xdf\xf1\x94\x22\xcd"
+			  "\xd6\x00\xba\x04\x4c\x05\x0c\xc0"
+			  "\xd1\x5a\xeb\x52\xd5\xa8\x8e\xc8"
+			  "\x97\xa1\xaa\xc1\xea\xc1\xbe\x7c"
+			  "\x36\xb3\x36\xa0\xc6\x76\x66\xc5"
+			  "\xe2\xaf\xd6\x5c\xe2\xdb\x2c\xb3"
+			  "\x6c\xb9\x99\x7f\xff\x9f\x03\x24"
+			  "\xe1\x51\x44\x66\xd8\x0c\x5d\x7f"
+			  "\x5c\x85\x22\x2a\xcf\x6d\x79\x28"
+			  "\xab\x98\x01\x72\xfe\x80\x87\x5f"
+			  "\x46\xba\xef\x81\x24\xee\xbf\xb0"
+			  "\x24\x74\xa3\x65\x97\x12\xc4\xaf"
+			  "\x8b\xa0\x39\xda\x8a\x7e\x74\x6e"
+			  "\x1b\x42\xb4\x44\x37\xfc\x59\xfd"
+			  "\x86\xed\xfb\x8c\x66\x33\xda\x63"
+			  "\x75\xeb\xe1\xa4\x85\x4f\x50\x8f"
+			  "\x83\x66\x0d\xd3\x37\xfa\xe6\x9c"
+			  "\x4f\x30\x87\x35\x18\xe3\x0b\xb7"
+			  "\x6e\x64\x54\xcd\x70\xb3\xde\x54"
+			  "\xb7\x1d\xe6\x4c\x4d\x55\x12\x12"
+			  "\xaf\x5f\x7f\x5e\xee\x9d\xe8\x8e"
+			  "\x32\x9d\x4e\x75\xeb\xc6\xdd\xaa"
+			  "\x48\x82\xa4\x3f\x3c\xd7\xd3\xa8"
+			  "\x63\x9e\x64\xfe\xe3\x97\x00\x62"
+			  "\xe5\x40\x5d\xc3\xad\x72\xe1\x28"
+			  "\x18\x50\xb7\x75\xef\xcd\x23\xbf"
+			  "\x3f\xc0\x51\x36\xf8\x41\xc3\x08"
+			  "\xcb\xf1\x8d\x38\x34\xbd\x48\x45"
+			  "\x75\xed\xbc\x65\x7b\xb5\x0c\x9b"
+			  "\xd7\x67\x7d\x27\xb4\xc4\x80\xd7"
+			  "\xa9\xb9\xc7\x4a\x97\xaa\xda\xc8"
+			  "\x3c\x74\xcf\x36\x8f\xe4\x41\xe3"
+			  "\xd4\xd3\x26\xa7\xf3\x23\x9d\x8f"
+			  "\x6c\x20\x05\x32\x3e\xe0\xc3\xc8"
+			  "\x56\x3f\xa7\x09\xb7\xfb\xc7\xf7"
+			  "\xbe\x2a\xdd\x0f\x06\x7b\x0d\xdd"
+			  "\xb0\xb4\x86\x17\xfd\xb9\x04\xe5"
+			  "\xc0\x64\x5d\xad\x2a\x36\x38\xdb"
+			  "\x24\xaf\x5b\xff\xca\xf9\x41\xe8"
+			  "\xf9\x2f\x1e\x5e\xf9\xf5\xd5\xf2"
+			  "\xb2\x88\xca\xc9\xa1\x31\xe2\xe8"
+			  "\x10\x95\x65\xbf\xf1\x11\x61\x7a"
+			  "\x30\x1a\x54\x90\xea\xd2\x30\xf6"
+			  "\xa5\xad\x60\xf9\x4d\x84\x21\x1b"
+			  "\xe4\x42\x22\xc8\x12\x4b\xb0\x58"
+			  "\x3e\x9c\x2d\x32\x95\x0a\x8e\xb0"
+			  "\x0a\x7e\x77\x2f\xe8\x97\x31\x6a"
+			  "\xf5\x59\xb4\x26\xe6\x37\x12\xc9"
+			  "\xcb\xa0\x58\x33\x6f\xd5\x55\x55"
+			  "\x3c\xa1\x33\xb1\x0b\x7e\x2e\xb4"
+			  "\x43\x2a\x84\x39\xf0\x9c\xf4\x69"
+			  "\x4f\x1e\x79\xa6\x15\x1b\x87\xbb"
+			  "\xdb\x9b\xe0\xf1\x0b\xba\xe3\x6e"
+			  "\xcc\x2f\x49\x19\x22\x29\xfc\x71"
+			  "\xbb\x77\x38\x18\x61\xaf\x85\x76"
+			  "\xeb\xd1\x09\xcc\x86\x04\x20\x9a"
+			  "\x66\x53\x2f\x44\x8b\xc6\xa3\xd2"
+			  "\x5f\xc7\x79\x82\x66\xa8\x6e\x75"
+			  "\x7d\x94\xd1\x86\x75\x0f\xa5\x4f"
+			  "\x3c\x7a\x33\xce\xd1\x6e\x9d\x7b"
+			  "\x1f\x91\x37\xb8\x37\x80\xfb\xe0"
+			  "\x52\x26\xd0\x9a\xd4\x48\x02\x41"
+			  "\x05\xe3\x5a\x94\xf1\x65\x61\x19"
+			  "\xb8\x88\x4e\x2b\xea\xba\x8b\x58"
+			  "\x8b\x42\x01\x00\xa8\xfe\x00\x5c"
+			  "\xfe\x1c\xee\x31\x15\x69\xfa\xb3"
+			  "\x9b\x5f\x22\x8e\x0d\x2c\xe3\xa5"
+			  "\x21\xb9\x99\x8a\x8e\x94\x5a\xef"
+			  "\x13\x3e\x99\x96\x79\x6e\xd5\x42"
+			  "\x36\x03\xa9\xe2\xca\x65\x4e\x8a"
+			  "\x8a\x30\xd2\x7d\x74\xe7\xf0\xaa"
+			  "\x23\x26\xdd\xcb\x82\x39\xfc\x9d"
+			  "\x51\x76\x21\x80\xa2\xbe\x93\x03"
+			  "\x47\xb0\xc1\xb6\xdc\x63\xfd\x9f"
+			  "\xca\x9d\xa5\xca\x27\x85\xe2\xd8"
+			  "\x15\x5b\x7e\x14\x7a\xc4\x89\xcc"
+			  "\x74\x14\x4b\x46\xd2\xce\xac\x39"
+			  "\x6b\x6a\x5a\xa4\x0e\xe3\x7b\x15"
+			  "\x94\x4b\x0f\x74\xcb\x0c\x7f\xa9"
+			  "\xbe\x09\x39\xa3\xdd\x56\x5c\xc7"
+			  "\x99\x56\x65\x39\xf4\x0b\x7d\x87"
+			  "\xec\xaa\xe3\x4d\x22\x65\x39\x4e",
+		.psize	= 1024,
+		.digest	= "\x64\x3a\xbc\xc3\x3f\x74\x40\x51"
+			  "\x6e\x56\x01\x1a\x51\xec\x36\xde",
+		.np	= 8,
+		.tap	= { 64, 203, 267, 28, 263, 62, 54, 83 },
+	}, {
+		.key	= "\x1b\x82\x2e\x1b\x17\x23\xb9\x6d"
+			  "\xdc\x9c\xda\x99\x07\xe3\x5f\xd8"
+			  "\xd2\xf8\x43\x80\x8d\x86\x7d\x80"
+			  "\x1a\xd0\xcc\x13\xb9\x11\x05\x3f"
+			  "\x7e\xcf\x7e\x80\x0e\xd8\x25\x48"
+			  "\x8b\xaa\x63\x83\x92\xd0\x72\xf5"
+			  "\x4f\x67\x7e\x50\x18\x25\xa4\xd1"
+			  "\xe0\x7e\x1e\xba\xd8\xa7\x6e\xdb"
+			  "\x1a\xcc\x0d\xfe\x9f\x6d\x22\x35"
+			  "\xe1\xe6\xe0\xa8\x7b\x9c\xb1\x66"
+			  "\xa3\xf8\xff\x4d\x90\x84\x28\xbc"
+			  "\xdc\x19\xc7\x91\x49\xfc\xf6\x33"
+			  "\xc9\x6e\x65\x7f\x28\x6f\x68\x2e"
+			  "\xdf\x1a\x75\xe9\xc2\x0c\x96\xb9"
+			  "\x31\x22\xc4\x07\xc6\x0a\x2f\xfd"
+			  "\x36\x06\x5f\x5c\xc5\xb1\x3a\xf4"
+			  "\x5e\x48\xa4\x45\x2b\x88\xa7\xee"
+			  "\xa9\x8b\x52\xcc\x99\xd9\x2f\xb8"
+			  "\xa4\x58\x0a\x13\xeb\x71\x5a\xfa"
+			  "\xe5\x5e\xbe\xf2\x64\xad\x75\xbc"
+			  "\x0b\x5b\x34\x13\x3b\x23\x13\x9a"
+			  "\x69\x30\x1e\x9a\xb8\x03\xb8\x8b"
+			  "\x3e\x46\x18\x6d\x38\xd9\xb3\xd8"
+			  "\xbf\xf1\xd0\x28\xe6\x51\x57\x80"
+			  "\x5e\x99\xfb\xd0\xce\x1e\x83\xf7"
+			  "\xe9\x07\x5a\x63\xa9\xef\xce\xa5"
+			  "\xfb\x3f\x37\x17\xfc\x0b\x37\x0e"
+			  "\xbb\x4b\x21\x62\xb7\x83\x0e\xa9"
+			  "\x9e\xb0\xc4\xad\x47\xbe\x35\xe7"
+			  "\x51\xb2\xf2\xac\x2b\x65\x7b\x48"
+			  "\xe3\x3f\x5f\xb6\x09\x04\x0c\x58"
+			  "\xce\x99\xa9\x15\x2f\x4e\xc1\xf2"
+			  "\x24\x48\xc0\xd8\x6c\xd3\x76\x17"
+			  "\x83\x5d\xe6\xe3\xfd\x01\x8e\xf7"
+			  "\x42\xa5\x04\x29\x30\xdf\xf9\x00"
+			  "\x4a\xdc\x71\x22\x1a\x33\x15\xb6"
+			  "\xd7\x72\xfb\x9a\xb8\xeb\x2b\x38"
+			  "\xea\xa8\x61\xa8\x90\x11\x9d\x73"
+			  "\x2e\x6c\xce\x81\x54\x5a\x9f\xcd"
+			  "\xcf\xd5\xbd\x26\x5d\x66\xdb\xfb"
+			  "\xdc\x1e\x7c\x10\xfe\x58\x82\x10"
+			  "\x16\x24\x01\xce\x67\x55\x51\xd1"
+			  "\xdd\x6b\x44\xa3\x20\x8e\xa9\xa6"
+			  "\x06\xa8\x29\x77\x6e\x00\x38\x5b"
+			  "\xde\x4d\x58\xd8\x1f\x34\xdf\xf9"
+			  "\x2c\xac\x3e\xad\xfb\x92\x0d\x72"
+			  "\x39\xa4\xac\x44\x10\xc0\x43\xc4"
+			  "\xa4\x77\x3b\xfc\xc4\x0d\x37\xd3"
+			  "\x05\x84\xda\x53\x71\xf8\x80\xd3"
+			  "\x34\x44\xdb\x09\xb4\x2b\x8e\xe3"
+			  "\x00\x75\x50\x9e\x43\x22\x00\x0b"
+			  "\x7c\x70\xab\xd4\x41\xf1\x93\xcd"
+			  "\x25\x2d\x84\x74\xb5\xf2\x92\xcd"
+			  "\x0a\x28\xea\x9a\x49\x02\x96\xcb"
+			  "\x85\x9e\x2f\x33\x03\x86\x1d\xdc"
+			  "\x1d\x31\xd5\xfc\x9d\xaa\xc5\xe9"
+			  "\x9a\xc4\x57\xf5\x35\xed\xf4\x4b"
+			  "\x3d\x34\xc2\x29\x13\x86\x36\x42"
+			  "\x5d\xbf\x90\x86\x13\x77\xe5\xc3"
+			  "\x62\xb4\xfe\x0b\x70\x39\x35\x65"
+			  "\x02\xea\xf6\xce\x57\x0c\xbb\x74"
+			  "\x29\xe3\xfd\x60\x90\xfd\x10\x38"
+			  "\xd5\x4e\x86\xbd\x37\x70\xf0\x97"
+			  "\xa6\xab\x3b\x83\x64\x52\xca\x66"
+			  "\x2f\xf9\xa4\xca\x3a\x55\x6b\xb0"
+			  "\xe8\x3a\x34\xdb\x9e\x48\x50\x2f"
+			  "\x3b\xef\xfd\x08\x2d\x5f\xc1\x37"
+			  "\x5d\xbe\x73\xe4\xd8\xe9\xac\xca"
+			  "\x8a\xaa\x48\x7c\x5c\xf4\xa6\x96"
+			  "\x5f\xfa\x70\xa6\xb7\x8b\x50\xcb"
+			  "\xa6\xf5\xa9\xbd\x7b\x75\x4c\x22"
+			  "\x0b\x19\x40\x2e\xc9\x39\x39\x32"
+			  "\x83\x03\xa8\xa4\x98\xe6\x8e\x16"
+			  "\xb9\xde\x08\xc5\xfc\xbf\xad\x39"
+			  "\xa8\xc7\x93\x6c\x6f\x23\xaf\xc1"
+			  "\xab\xe1\xdf\xbb\x39\xae\x93\x29"
+			  "\x0e\x7d\x80\x8d\x3e\x65\xf3\xfd"
+			  "\x96\x06\x65\x90\xa1\x28\x64\x4b"
+			  "\x69\xf9\xa8\x84\x27\x50\xfc\x87"
+			  "\xf7\xbf\x55\x8e\x56\x13\x58\x7b"
+			  "\x85\xb4\x6a\x72\x0f\x40\xf1\x4f"
+			  "\x83\x81\x1f\x76\xde\x15\x64\x7a"
+			  "\x7a\x80\xe4\xc7\x5e\x63\x01\x91"
+			  "\xd7\x6b\xea\x0b\x9b\xa2\x99\x3b"
+			  "\x6c\x88\xd8\xfd\x59\x3c\x8d\x22"
+			  "\x86\x56\xbe\xab\xa1\x37\x08\x01"
+			  "\x50\x85\x69\x29\xee\x9f\xdf\x21"
+			  "\x3e\x20\x20\xf5\xb0\xbb\x6b\xd0"
+			  "\x9c\x41\x38\xec\x54\x6f\x2d\xbd"
+			  "\x0f\xe1\xbd\xf1\x2b\x6e\x60\x56"
+			  "\x29\xe5\x7a\x70\x1c\xe2\xfc\x97"
+			  "\x82\x68\x67\xd9\x3d\x1f\xfb\xd8"
+			  "\x07\x9f\xbf\x96\x74\xba\x6a\x0e"
+			  "\x10\x48\x20\xd8\x13\x1e\xb5\x44"
+			  "\xf2\xcc\xb1\x8b\xfb\xbb\xec\xd7"
+			  "\x37\x70\x1f\x7c\x55\xd2\x4b\xb9"
+			  "\xfd\x70\x5e\xa3\x91\x73\x63\x52"
+			  "\x13\x47\x5a\x06\xfb\x01\x67\xa5"
+			  "\xc0\xd0\x49\x19\x56\x66\x9a\x77"
+			  "\x64\xaf\x8c\x25\x91\x52\x87\x0e"
+			  "\x18\xf3\x5f\x97\xfd\x71\x13\xf8"
+			  "\x05\xa5\x39\xcc\x65\xd3\xcc\x63"
+			  "\x5b\xdb\x5f\x7e\x5f\x6e\xad\xc4"
+			  "\xf4\xa0\xc5\xc2\x2b\x4d\x97\x38"
+			  "\x4f\xbc\xfa\x33\x17\xb4\x47\xb9"
+			  "\x43\x24\x15\x8d\xd2\xed\x80\x68"
+			  "\x84\xdb\x04\x80\xca\x5e\x6a\x35"
+			  "\x2c\x2c\xe7\xc5\x03\x5f\x54\xb0"
+			  "\x5e\x4f\x1d\x40\x54\x3d\x78\x9a"
+			  "\xac\xda\x80\x27\x4d\x15\x4c\x1a"
+			  "\x6e\x80\xc9\xc4\x3b\x84\x0e\xd9"
+			  "\x2e\x93\x01\x8c\xc3\xc8\x91\x4b"
+			  "\xb3\xaa\x07\x04\x68\x5b\x93\xa5"
+			  "\xe7\xc4\x9d\xe7\x07\xee\xf5\x3b"
+			  "\x40\x89\xcc\x60\x34\x9d\xb4\x06"
+			  "\x1b\xef\x92\xe6\xc1\x2a\x7d\x0f"
+			  "\x81\xaa\x56\xe3\xd7\xed\xa7\xd4"
+			  "\xa7\x3a\x49\xc4\xad\x81\x5c\x83"
+			  "\x55\x8e\x91\x54\xb7\x7d\x65\xa5"
+			  "\x06\x16\xd5\x9a\x16\xc1\xb0\xa2"
+			  "\x06\xd8\x98\x47\x73\x7e\x73\xa0"
+			  "\xb8\x23\xb1\x52\xbf\x68\x74\x5d"
+			  "\x0b\xcb\xfa\x8c\x46\xe3\x24\xe6"
+			  "\xab\xd4\x69\x8d\x8c\xf2\x8a\x59"
+			  "\xbe\x48\x46\x50\x8c\x9a\xe8\xe3"
+			  "\x31\x55\x0a\x06\xed\x4f\xf8\xb7"
+			  "\x4f\xe3\x85\x17\x30\xbd\xd5\x20"
+			  "\xe7\x5b\xb2\x32\xcf\x6b\x16\x44"
+			  "\xd2\xf5\x7e\xd7\xd1\x2f\xee\x64"
+			  "\x3e\x9d\x10\xef\x27\x35\x43\x64"
+			  "\x67\xfb\x7a\x7b\xe0\x62\x31\x9a"
+			  "\x4d\xdf\xa5\xab\xc0\x20\xbb\x01"
+			  "\xe9\x7b\x54\xf1\xde\xb2\x79\x50"
+			  "\x6c\x4b\x91\xdb\x7f\xbb\x50\xc1"
+			  "\x55\x44\x38\x9a\xe0\x9f\xe8\x29"
+			  "\x6f\x15\xf8\x4e\xa6\xec\xa0\x60",
+		.ksize	= 1088,
+		.plaintext	= "\x15\x68\x9e\x2f\xad\x15\x52\xdf"
+			  "\xf0\x42\x62\x24\x2a\x2d\xea\xbf"
+			  "\xc7\xf3\xb4\x1a\xf5\xed\xb2\x08"
+			  "\x15\x60\x1c\x00\x77\xbf\x0b\x0e"
+			  "\xb7\x2c\xcf\x32\x3a\xc7\x01\x77"
+			  "\xef\xa6\x75\xd0\x29\xc7\x68\x20"
+			  "\xb2\x92\x25\xbf\x12\x34\xe9\xa4"
+			  "\xfd\x32\x7b\x3f\x7c\xbd\xa5\x02"
+			  "\x38\x41\xde\xc9\xc1\x09\xd9\xfc"
+			  "\x6e\x78\x22\x83\x18\xf7\x50\x8d"
+			  "\x8f\x9c\x2d\x02\xa5\x30\xac\xff"
+			  "\xea\x63\x2e\x80\x37\x83\xb0\x58"
+			  "\xda\x2f\xef\x21\x55\xba\x7b\xb1"
+			  "\xb6\xed\xf5\xd2\x4d\xaa\x8c\xa9"
+			  "\xdd\xdb\x0f\xb4\xce\xc1\x9a\xb1"
+			  "\xc1\xdc\xbd\xab\x86\xc2\xdf\x0b"
+			  "\xe1\x2c\xf9\xbe\xf6\xd8\xda\x62"
+			  "\x72\xdd\x98\x09\x52\xc0\xc4\xb6"
+			  "\x7b\x17\x5c\xf5\xd8\x4b\x88\xd6"
+			  "\x6b\xbf\x84\x4a\x3f\xf5\x4d\xd2"
+			  "\x94\xe2\x9c\xff\xc7\x3c\xd9\xc8"
+			  "\x37\x38\xbc\x8c\xf3\xe7\xb7\xd0"
+			  "\x1d\x78\xc4\x39\x07\xc8\x5e\x79"
+			  "\xb6\x5a\x90\x5b\x6e\x97\xc9\xd4"
+			  "\x82\x9c\xf3\x83\x7a\xe7\x97\xfc"
+			  "\x1d\xbb\xef\xdb\xce\xe0\x82\xad"
+			  "\xca\x07\x6c\x54\x62\x6f\x81\xe6"
+			  "\x7a\x5a\x96\x6e\x80\x3a\xa2\x37"
+			  "\x6f\xc6\xa4\x29\xc3\x9e\x19\x94"
+			  "\x9f\xb0\x3e\x38\xfb\x3c\x2b\x7d"
+			  "\xaa\xb8\x74\xda\x54\x23\x51\x12"
+			  "\x4b\x96\x36\x8f\x91\x4f\x19\x37"
+			  "\x83\xc9\xdd\xc7\x1a\x32\x2d\xab"
+			  "\xc7\x89\xe2\x07\x47\x6c\xe8\xa6"
+			  "\x70\x6b\x8e\x0c\xda\x5c\x6a\x59"
+			  "\x27\x33\x0e\xe1\xe1\x20\xe8\xc8"
+			  "\xae\xdc\xd0\xe3\x6d\xa8\xa6\x06"
+			  "\x41\xb4\xd4\xd4\xcf\x91\x3e\x06"
+			  "\xb0\x9a\xf7\xf1\xaa\xa6\x23\x92"
+			  "\x10\x86\xf0\x94\xd1\x7c\x2e\x07"
+			  "\x30\xfb\xc5\xd8\xf3\x12\xa9\xe8"
+			  "\x22\x1c\x97\x1a\xad\x96\xb0\xa1"
+			  "\x72\x6a\x6b\xb4\xfd\xf7\xe8\xfa"
+			  "\xe2\x74\xd8\x65\x8d\x35\x17\x4b"
+			  "\x00\x23\x5c\x8c\x70\xad\x71\xa2"
+			  "\xca\xc5\x6c\x59\xbf\xb4\xc0\x6d"
+			  "\x86\x98\x3e\x19\x5a\x90\x92\xb1"
+			  "\x66\x57\x6a\x91\x68\x7c\xbc\xf3"
+			  "\xf1\xdb\x94\xf8\x48\xf1\x36\xd8"
+			  "\x78\xac\x1c\xa9\xcc\xd6\x27\xba"
+			  "\x91\x54\x22\xf5\xe6\x05\x3f\xcc"
+			  "\xc2\x8f\x2c\x3b\x2b\xc3\x2b\x2b"
+			  "\x3b\xb8\xb6\x29\xb7\x2f\x94\xb6"
+			  "\x7b\xfc\x94\x3e\xd0\x7a\x41\x59"
+			  "\x7b\x1f\x9a\x09\xa6\xed\x4a\x82"
+			  "\x9d\x34\x1c\xbd\x4e\x1c\x3a\x66"
+			  "\x80\x74\x0e\x9a\x4f\x55\x54\x47"
+			  "\x16\xba\x2a\x0a\x03\x35\x99\xa3"
+			  "\x5c\x63\x8d\xa2\x72\x8b\x17\x15"
+			  "\x68\x39\x73\xeb\xec\xf2\xe8\xf5"
+			  "\x95\x32\x27\xd6\xc4\xfe\xb0\x51"
+			  "\xd5\x0c\x50\xc5\xcd\x6d\x16\xb3"
+			  "\xa3\x1e\x95\x69\xad\x78\x95\x06"
+			  "\xb9\x46\xf2\x6d\x24\x5a\x99\x76"
+			  "\x73\x6a\x91\xa6\xac\x12\xe1\x28"
+			  "\x79\xbc\x08\x4e\x97\x00\x98\x63"
+			  "\x07\x1c\x4e\xd1\x68\xf3\xb3\x81"
+			  "\xa8\xa6\x5f\xf1\x01\xc9\xc1\xaf"
+			  "\x3a\x96\xf9\x9d\xb5\x5a\x5f\x8f"
+			  "\x7e\xc1\x7e\x77\x0a\x40\xc8\x8e"
+			  "\xfc\x0e\xed\xe1\x0d\xb0\xe5\x5e"
+			  "\x5e\x6f\xf5\x7f\xab\x33\x7d\xcd"
+			  "\xf0\x09\x4b\xb2\x11\x37\xdc\x65"
+			  "\x97\x32\x62\x71\x3a\x29\x54\xb9"
+			  "\xc7\xa4\xbf\x75\x0f\xf9\x40\xa9"
+			  "\x8d\xd7\x8b\xa7\xe0\x9a\xbe\x15"
+			  "\xc6\xda\xd8\x00\x14\x69\x1a\xaf"
+			  "\x5f\x79\xc3\xf5\xbb\x6c\x2a\x9d"
+			  "\xdd\x3c\x5f\x97\x21\xe1\x3a\x03"
+			  "\x84\x6a\xe9\x76\x11\x1f\xd3\xd5"
+			  "\xf0\x54\x20\x4d\xc2\x91\xc3\xa4"
+			  "\x36\x25\xbe\x1b\x2a\x06\xb7\xf3"
+			  "\xd1\xd0\x55\x29\x81\x4c\x83\xa3"
+			  "\xa6\x84\x1e\x5c\xd1\xd0\x6c\x90"
+			  "\xa4\x11\xf0\xd7\x63\x6a\x48\x05"
+			  "\xbc\x48\x18\x53\xcd\xb0\x8d\xdb"
+			  "\xdc\xfe\x55\x11\x5c\x51\xb3\xab"
+			  "\xab\x63\x3e\x31\x5a\x8b\x93\x63"
+			  "\x34\xa9\xba\x2b\x69\x1a\xc0\xe3"
+			  "\xcb\x41\xbc\xd7\xf5\x7f\x82\x3e"
+			  "\x01\xa3\x3c\x72\xf4\xfe\xdf\xbe"
+			  "\xb1\x67\x17\x2b\x37\x60\x0d\xca"
+			  "\x6f\xc3\x94\x2c\xd2\x92\x6d\x9d"
+			  "\x75\x18\x77\xaa\x29\x38\x96\xed"
+			  "\x0e\x20\x70\x92\xd5\xd0\xb4\x00"
+			  "\xc0\x31\xf2\xc9\x43\x0e\x75\x1d"
+			  "\x4b\x64\xf2\x1f\xf2\x29\x6c\x7b"
+			  "\x7f\xec\x59\x7d\x8c\x0d\xd4\xd3"
+			  "\xac\x53\x4c\xa3\xde\x42\x92\x95"
+			  "\x6d\xa3\x4f\xd0\xe6\x3d\xe7\xec"
+			  "\x7a\x4d\x68\xf1\xfe\x67\x66\x09"
+			  "\x83\x22\xb1\x98\x43\x8c\xab\xb8"
+			  "\x45\xe6\x6d\xdf\x5e\x50\x71\xce"
+			  "\xf5\x4e\x40\x93\x2b\xfa\x86\x0e"
+			  "\xe8\x30\xbd\x82\xcc\x1c\x9c\x5f"
+			  "\xad\xfd\x08\x31\xbe\x52\xe7\xe6"
+			  "\xf2\x06\x01\x62\x25\x15\x99\x74"
+			  "\x33\x51\x52\x57\x3f\x57\x87\x61"
+			  "\xb9\x7f\x29\x3d\xcd\x92\x5e\xa6"
+			  "\x5c\x3b\xf1\xed\x5f\xeb\x82\xed"
+			  "\x56\x7b\x61\xe7\xfd\x02\x47\x0e"
+			  "\x2a\x15\xa4\xce\x43\x86\x9b\xe1"
+			  "\x2b\x4c\x2a\xd9\x42\x97\xf7\x9a"
+			  "\xe5\x47\x46\x48\xd3\x55\x6f\x4d"
+			  "\xd9\xeb\x4b\xdd\x7b\x21\x2f\xb3"
+			  "\xa8\x36\x28\xdf\xca\xf1\xf6\xd9"
+			  "\x10\xf6\x1c\xfd\x2e\x0c\x27\xe0"
+			  "\x01\xb3\xff\x6d\x47\x08\x4d\xd4"
+			  "\x00\x25\xee\x55\x4a\xe9\xe8\x5b"
+			  "\xd8\xf7\x56\x12\xd4\x50\xb2\xe5"
+			  "\x51\x6f\x34\x63\x69\xd2\x4e\x96"
+			  "\x4e\xbc\x79\xbf\x18\xae\xc6\x13"
+			  "\x80\x92\x77\xb0\xb4\x0f\x29\x94"
+			  "\x6f\x4c\xbb\x53\x11\x36\xc3\x9f"
+			  "\x42\x8e\x96\x8a\x91\xc8\xe9\xfc"
+			  "\xfe\xbf\x7c\x2d\x6f\xf9\xb8\x44"
+			  "\x89\x1b\x09\x53\x0a\x2a\x92\xc3"
+			  "\x54\x7a\x3a\xf9\xe2\xe4\x75\x87"
+			  "\xa0\x5e\x4b\x03\x7a\x0d\x8a\xf4"
+			  "\x55\x59\x94\x2b\x63\x96\x0e\xf5",
+		.psize	= 1040,
+		.digest	= "\xb5\xb9\x08\xb3\x24\x3e\x03\xf0"
+			  "\xd6\x0b\x57\xbc\x0a\x6d\x89\x59",
+	}, {
+		.key	= "\xf6\x34\x42\x71\x35\x52\x8b\x58"
+			  "\x02\x3a\x8e\x4a\x8d\x41\x13\xe9"
+			  "\x7f\xba\xb9\x55\x9d\x73\x4d\xf8"
+			  "\x3f\x5d\x73\x15\xff\xd3\x9e\x7f"
+			  "\x20\x2a\x6a\xa8\xd1\xf0\x8f\x12"
+			  "\x6b\x02\xd8\x6c\xde\xba\x80\x22"
+			  "\x19\x37\xc8\xd0\x4e\x89\x17\x7c"
+			  "\x7c\xdd\x88\xfd\x41\xc0\x04\xb7"
+			  "\x1d\xac\x19\xe3\x20\xc7\x16\xcf"
+			  "\x58\xee\x1d\x7a\x61\x69\xa9\x12"
+			  "\x4b\xef\x4f\xb6\x38\xdd\x78\xf8"
+			  "\x28\xee\x70\x08\xc7\x7c\xcc\xc8"
+			  "\x1e\x41\xf5\x80\x86\x70\xd0\xf0"
+			  "\xa3\x87\x6b\x0a\x00\xd2\x41\x28"
+			  "\x74\x26\xf1\x24\xf3\xd0\x28\x77"
+			  "\xd7\xcd\xf6\x2d\x61\xf4\xa2\x13"
+			  "\x77\xb4\x6f\xa0\xf4\xfb\xd6\xb5"
+			  "\x38\x9d\x5a\x0c\x51\xaf\xad\x63"
+			  "\x27\x67\x8c\x01\xea\x42\x1a\x66"
+			  "\xda\x16\x7c\x3c\x30\x0c\x66\x53"
+			  "\x1c\x88\xa4\x5c\xb2\xe3\x78\x0a"
+			  "\x13\x05\x6d\xe2\xaf\xb3\xe4\x75"
+			  "\x00\x99\x58\xee\x76\x09\x64\xaa"
+			  "\xbb\x2e\xb1\x81\xec\xd8\x0e\xd3"
+			  "\x0c\x33\x5d\xb7\x98\xef\x36\xb6"
+			  "\xd2\x65\x69\x41\x70\x12\xdc\x25"
+			  "\x41\x03\x99\x81\x41\x19\x62\x13"
+			  "\xd1\x0a\x29\xc5\x8c\xe0\x4c\xf3"
+			  "\xd6\xef\x4c\xf4\x1d\x83\x2e\x6d"
+			  "\x8e\x14\x87\xed\x80\xe0\xaa\xd3"
+			  "\x08\x04\x73\x1a\x84\x40\xf5\x64"
+			  "\xbd\x61\x32\x65\x40\x42\xfb\xb0"
+			  "\x40\xf6\x40\x8d\xc7\x7f\x14\xd0"
+			  "\x83\x99\xaa\x36\x7e\x60\xc6\xbf"
+			  "\x13\x8a\xf9\x21\xe4\x7e\x68\x87"
+			  "\xf3\x33\x86\xb4\xe0\x23\x7e\x0a"
+			  "\x21\xb1\xf5\xad\x67\x3c\x9c\x9d"
+			  "\x09\xab\xaf\x5f\xba\xe0\xd0\x82"
+			  "\x48\x22\x70\xb5\x6d\x53\xd6\x0e"
+			  "\xde\x64\x92\x41\xb0\xd3\xfb\xda"
+			  "\x21\xfe\xab\xea\x20\xc4\x03\x58"
+			  "\x18\x2e\x7d\x2f\x03\xa9\x47\x66"
+			  "\xdf\x7b\xa4\x6b\x34\x6b\x55\x9c"
+			  "\x4f\xd7\x9c\x47\xfb\xa9\x42\xec"
+			  "\x5a\x12\xfd\xfe\x76\xa0\x92\x9d"
+			  "\xfe\x1e\x16\xdd\x24\x2a\xe4\x27"
+			  "\xd5\xa9\xf2\x05\x4f\x83\xa2\xaf"
+			  "\xfe\xee\x83\x7a\xad\xde\xdf\x9a"
+			  "\x80\xd5\x81\x14\x93\x16\x7e\x46"
+			  "\x47\xc2\x14\xef\x49\x6e\xb9\xdb"
+			  "\x40\xe8\x06\x6f\x9c\x2a\xfd\x62"
+			  "\x06\x46\xfd\x15\x1d\x36\x61\x6f"
+			  "\x77\x77\x5e\x64\xce\x78\x1b\x85"
+			  "\xbf\x50\x9a\xfd\x67\xa6\x1a\x65"
+			  "\xad\x5b\x33\x30\xf1\x71\xaa\xd9"
+			  "\x23\x0d\x92\x24\x5f\xae\x57\xb0"
+			  "\x24\x37\x0a\x94\x12\xfb\xb5\xb1"
+			  "\xd3\xb8\x1d\x12\x29\xb0\x80\x24"
+			  "\x2d\x47\x9f\x96\x1f\x95\xf1\xb1"
+			  "\xda\x35\xf6\x29\xe0\xe1\x23\x96"
+			  "\xc7\xe8\x22\x9b\x7c\xac\xf9\x41"
+			  "\x39\x01\xe5\x73\x15\x5e\x99\xec"
+			  "\xb4\xc1\xf4\xe7\xa7\x97\x6a\xd5"
+			  "\x90\x9a\xa0\x1d\xf3\x5a\x8b\x5f"
+			  "\xdf\x01\x52\xa4\x93\x31\x97\xb0"
+			  "\x93\x24\xb5\xbc\xb2\x14\x24\x98"
+			  "\x4a\x8f\x19\x85\xc3\x2d\x0f\x74"
+			  "\x9d\x16\x13\x80\x5e\x59\x62\x62"
+			  "\x25\xe0\xd1\x2f\x64\xef\xba\xac"
+			  "\xcd\x09\x07\x15\x8a\xcf\x73\xb5"
+			  "\x8b\xc9\xd8\x24\xb0\x53\xd5\x6f"
+			  "\xe1\x2b\x77\xb1\xc5\xe4\xa7\x0e"
+			  "\x18\x45\xab\x36\x03\x59\xa8\xbd"
+			  "\x43\xf0\xd8\x2c\x1a\x69\x96\xbb"
+			  "\x13\xdf\x6c\x33\x77\xdf\x25\x34"
+			  "\x5b\xa5\x5b\x8c\xf9\x51\x05\xd4"
+			  "\x8b\x8b\x44\x87\x49\xfc\xa0\x8f"
+			  "\x45\x15\x5b\x40\x42\xc4\x09\x92"
+			  "\x98\x0c\x4d\xf4\x26\x37\x1b\x13"
+			  "\x76\x01\x93\x8d\x4f\xe6\xed\x18"
+			  "\xd0\x79\x7b\x3f\x44\x50\xcb\xee"
+			  "\xf7\x4a\xc9\x9e\xe0\x96\x74\xa7"
+			  "\xe6\x93\xb2\x53\xca\x55\xa8\xdc"
+			  "\x1e\x68\x07\x87\xb7\x2e\xc1\x08"
+			  "\xb2\xa4\x5b\xaf\xc6\xdb\x5c\x66"
+			  "\x41\x1c\x51\xd9\xb0\x07\x00\x0d"
+			  "\xf0\x4c\xdc\x93\xde\xa9\x1e\x8e"
+			  "\xd3\x22\x62\xd8\x8b\x88\x2c\xea"
+			  "\x5e\xf1\x6e\x14\x40\xc7\xbe\xaa"
+			  "\x42\x28\xd0\x26\x30\x78\x01\x9b"
+			  "\x83\x07\xbc\x94\xc7\x57\xa2\x9f"
+			  "\x03\x07\xff\x16\xff\x3c\x6e\x48"
+			  "\x0a\xd0\xdd\x4c\xf6\x64\x9a\xf1"
+			  "\xcd\x30\x12\x82\x2c\x38\xd3\x26"
+			  "\x83\xdb\xab\x3e\xc6\xf8\xe6\xfa"
+			  "\x77\x0a\x78\x82\x75\xf8\x63\x51"
+			  "\x59\xd0\x8d\x24\x9f\x25\xe6\xa3"
+			  "\x4c\xbc\x34\xfc\xe3\x10\xc7\x62"
+			  "\xd4\x23\xc8\x3d\xa7\xc6\xa6\x0a"
+			  "\x4f\x7e\x29\x9d\x6d\xbe\xb5\xf1"
+			  "\xdf\xa4\x53\xfa\xc0\x23\x0f\x37"
+			  "\x84\x68\xd0\xb5\xc8\xc6\xae\xf8"
+			  "\xb7\x8d\xb3\x16\xfe\x8f\x87\xad"
+			  "\xd0\xc1\x08\xee\x12\x1c\x9b\x1d"
+			  "\x90\xf8\xd1\x63\xa4\x92\x3c\xf0"
+			  "\xc7\x34\xd8\xf1\x14\xed\xa3\xbc"
+			  "\x17\x7e\xd4\x62\x42\x54\x57\x2c"
+			  "\x3e\x7a\x35\x35\x17\x0f\x0b\x7f"
+			  "\x81\xa1\x3f\xd0\xcd\xc8\x3b\x96"
+			  "\xe9\xe0\x4a\x04\xe1\xb6\x3c\xa1"
+			  "\xd6\xca\xc4\xbd\xb6\xb5\x95\x34"
+			  "\x12\x9d\xc5\x96\xf2\xdf\xba\x54"
+			  "\x76\xd1\xb2\x6b\x3b\x39\xe0\xb9"
+			  "\x18\x62\xfb\xf7\xfc\x12\xf1\x5f"
+			  "\x7e\xc7\xe3\x59\x4c\xa6\xc2\x3d"
+			  "\x40\x15\xf9\xa3\x95\x64\x4c\x74"
+			  "\x8b\x73\x77\x33\x07\xa7\x04\x1d"
+			  "\x33\x5a\x7e\x8f\xbd\x86\x01\x4f"
+			  "\x3e\xb9\x27\x6f\xe2\x41\xf7\x09"
+			  "\x67\xfd\x29\x28\xc5\xe4\xf6\x18"
+			  "\x4c\x1b\x49\xb2\x9c\x5b\xf6\x81"
+			  "\x4f\xbb\x5c\xcc\x0b\xdf\x84\x23"
+			  "\x58\xd6\x28\x34\x93\x3a\x25\x97"
+			  "\xdf\xb2\xc3\x9e\x97\x38\x0b\x7d"
+			  "\x10\xb3\x54\x35\x23\x8c\x64\xee"
+			  "\xf0\xd8\x66\xff\x8b\x22\xd2\x5b"
+			  "\x05\x16\x3c\x89\xf7\xb1\x75\xaf"
+			  "\xc0\xae\x6a\x4f\x3f\xaf\x9a\xf4"
+			  "\xf4\x9a\x24\xd9\x80\x82\xc0\x12"
+			  "\xde\x96\xd1\xbe\x15\x0b\x8d\x6a"
+			  "\xd7\x12\xe4\x85\x9f\x83\xc9\xc3"
+			  "\xff\x0b\xb5\xaf\x3b\xd8\x6d\x67"
+			  "\x81\x45\xe6\xac\xec\xc1\x7b\x16"
+			  "\x18\x0a\xce\x4b\xc0\x2e\x76\xbc"
+			  "\x1b\xfa\xb4\x34\xb8\xfc\x3e\xc8"
+			  "\x5d\x90\x71\x6d\x7a\x79\xef\x06",
+		.ksize	= 1088,
+		.plaintext	= "\xaa\x5d\x54\xcb\xea\x1e\x46\x0f"
+			  "\x45\x87\x70\x51\x8a\x66\x7a\x33"
+			  "\xb4\x18\xff\xa9\x82\xf9\x45\x4b"
+			  "\x93\xae\x2e\x7f\xab\x98\xfe\xbf"
+			  "\x01\xee\xe5\xa0\x37\x8f\x57\xa6"
+			  "\xb0\x76\x0d\xa4\xd6\x28\x2b\x5d"
+			  "\xe1\x03\xd6\x1c\x6f\x34\x0d\xe7"
+			  "\x61\x2d\x2e\xe5\xae\x5d\x47\xc7"
+			  "\x80\x4b\x18\x8f\xa8\x99\xbc\x28"
+			  "\xed\x1d\x9d\x86\x7d\xd7\x41\xd1"
+			  "\xe0\x2b\xe1\x8c\x93\x2a\xa7\x80"
+			  "\xe1\x07\xa0\xa9\x9f\x8c\x8d\x1a"
+			  "\x55\xfc\x6b\x24\x7a\xbd\x3e\x51"
+			  "\x68\x4b\x26\x59\xc8\xa7\x16\xd9"
+			  "\xb9\x61\x13\xde\x8b\x63\x1c\xf6"
+			  "\x60\x01\xfb\x08\xb3\x5b\x0a\xbf"
+			  "\x34\x73\xda\x87\x87\x3d\x6f\x97"
+			  "\x4a\x0c\xa3\x58\x20\xa2\xc0\x81"
+			  "\x5b\x8c\xef\xa9\xc2\x01\x1e\x64"
+			  "\x83\x8c\xbc\x03\xb6\xd0\x29\x9f"
+			  "\x54\xe2\xce\x8b\xc2\x07\x85\x78"
+			  "\x25\x38\x96\x4c\xb4\xbe\x17\x4a"
+			  "\x65\xa6\xfa\x52\x9d\x66\x9d\x65"
+			  "\x4a\xd1\x01\x01\xf0\xcb\x13\xcc"
+			  "\xa5\x82\xf3\xf2\x66\xcd\x3f\x9d"
+			  "\xd1\xaa\xe4\x67\xea\xf2\xad\x88"
+			  "\x56\x76\xa7\x9b\x59\x3c\xb1\x5d"
+			  "\x78\xfd\x69\x79\x74\x78\x43\x26"
+			  "\x7b\xde\x3f\xf1\xf5\x4e\x14\xd9"
+			  "\x15\xf5\x75\xb5\x2e\x19\xf3\x0c"
+			  "\x48\x72\xd6\x71\x6d\x03\x6e\xaa"
+			  "\xa7\x08\xf9\xaa\x70\xa3\x0f\x4d"
+			  "\x12\x8a\xdd\xe3\x39\x73\x7e\xa7"
+			  "\xea\x1f\x6d\x06\x26\x2a\xf2\xc5"
+			  "\x52\xb4\xbf\xfd\x52\x0c\x06\x60"
+			  "\x90\xd1\xb2\x7b\x56\xae\xac\x58"
+			  "\x5a\x6b\x50\x2a\xf5\xe0\x30\x3c"
+			  "\x2a\x98\x0f\x1b\x5b\x0a\x84\x6c"
+			  "\x31\xae\x92\xe2\xd4\xbb\x7f\x59"
+			  "\x26\x10\xb9\x89\x37\x68\x26\xbf"
+			  "\x41\xc8\x49\xc4\x70\x35\x7d\xff"
+			  "\x2d\x7f\xf6\x8a\x93\x68\x8c\x78"
+			  "\x0d\x53\xce\x7d\xff\x7d\xfb\xae"
+			  "\x13\x1b\x75\xc4\x78\xd7\x71\xd8"
+			  "\xea\xd3\xf4\x9d\x95\x64\x8e\xb4"
+			  "\xde\xb8\xe4\xa6\x68\xc8\xae\x73"
+			  "\x58\xaf\xa8\xb0\x5a\x20\xde\x87"
+			  "\x43\xb9\x0f\xe3\xad\x41\x4b\xd5"
+			  "\xb7\xad\x16\x00\xa6\xff\xf6\x74"
+			  "\xbf\x8c\x9f\xb3\x58\x1b\xb6\x55"
+			  "\xa9\x90\x56\x28\xf0\xb5\x13\x4e"
+			  "\x9e\xf7\x25\x86\xe0\x07\x7b\x98"
+			  "\xd8\x60\x5d\x38\x95\x3c\xe4\x22"
+			  "\x16\x2f\xb2\xa2\xaf\xe8\x90\x17"
+			  "\xec\x11\x83\x1a\xf4\xa9\x26\xda"
+			  "\x39\x72\xf5\x94\x61\x05\x51\xec"
+			  "\xa8\x30\x8b\x2c\x13\xd0\x72\xac"
+			  "\xb9\xd2\xa0\x4c\x4b\x78\xe8\x6e"
+			  "\x04\x85\xe9\x04\x49\x82\x91\xff"
+			  "\x89\xe5\xab\x4c\xaa\x37\x03\x12"
+			  "\xca\x8b\x74\x10\xfd\x9e\xd9\x7b"
+			  "\xcb\xdb\x82\x6e\xce\x2e\x33\x39"
+			  "\xce\xd2\x84\x6e\x34\x71\x51\x6e"
+			  "\x0d\xd6\x01\x87\xc7\xfa\x0a\xd3"
+			  "\xad\x36\xf3\x4c\x9f\x96\x5e\x62"
+			  "\x62\x54\xc3\x03\x78\xd6\xab\xdd"
+			  "\x89\x73\x55\x25\x30\xf8\xa7\xe6"
+			  "\x4f\x11\x0c\x7c\x0a\xa1\x2b\x7b"
+			  "\x3d\x0d\xde\x81\xd4\x9d\x0b\xae"
+			  "\xdf\x00\xf9\x4c\xb6\x90\x8e\x16"
+			  "\xcb\x11\xc8\xd1\x2e\x73\x13\x75"
+			  "\x75\x3e\xaa\xf5\xee\x02\xb3\x18"
+			  "\xa6\x2d\xf5\x3b\x51\xd1\x1f\x47"
+			  "\x6b\x2c\xdb\xc4\x10\xe0\xc8\xba"
+			  "\x9d\xac\xb1\x9d\x75\xd5\x41\x0e"
+			  "\x7e\xbe\x18\x5b\xa4\x1f\xf8\x22"
+			  "\x4c\xc1\x68\xda\x6d\x51\x34\x6c"
+			  "\x19\x59\xec\xb5\xb1\xec\xa7\x03"
+			  "\xca\x54\x99\x63\x05\x6c\xb1\xac"
+			  "\x9c\x31\xd6\xdb\xba\x7b\x14\x12"
+			  "\x7a\xc3\x2f\xbf\x8d\xdc\x37\x46"
+			  "\xdb\xd2\xbc\xd4\x2f\xab\x30\xd5"
+			  "\xed\x34\x99\x8e\x83\x3e\xbe\x4c"
+			  "\x86\x79\x58\xe0\x33\x8d\x9a\xb8"
+			  "\xa9\xa6\x90\x46\xa2\x02\xb8\xdd"
+			  "\xf5\xf9\x1a\x5c\x8c\x01\xaa\x6e"
+			  "\xb4\x22\x12\xf5\x0c\x1b\x9b\x7a"
+			  "\xc3\x80\xf3\x06\x00\x5f\x30\xd5"
+			  "\x06\xdb\x7d\x82\xc2\xd4\x0b\x4c"
+			  "\x5f\xe9\xc5\xf5\xdf\x97\x12\xbf"
+			  "\x56\xaf\x9b\x69\xcd\xee\x30\xb4"
+			  "\xa8\x71\xff\x3e\x7d\x73\x7a\xb4"
+			  "\x0d\xa5\x46\x7a\xf3\xf4\x15\x87"
+			  "\x5d\x93\x2b\x8c\x37\x64\xb5\xdd"
+			  "\x48\xd1\xe5\x8c\xae\xd4\xf1\x76"
+			  "\xda\xf4\xba\x9e\x25\x0e\xad\xa3"
+			  "\x0d\x08\x7c\xa8\x82\x16\x8d\x90"
+			  "\x56\x40\x16\x84\xe7\x22\x53\x3a"
+			  "\x58\xbc\xb9\x8f\x33\xc8\xc2\x84"
+			  "\x22\xe6\x0d\xe7\xb3\xdc\x5d\xdf"
+			  "\xd7\x2a\x36\xe4\x16\x06\x07\xd2"
+			  "\x97\x60\xb2\xf5\x5e\x14\xc9\xfd"
+			  "\x8b\x05\xd1\xce\xee\x9a\x65\x99"
+			  "\xb7\xae\x19\xb7\xc8\xbc\xd5\xa2"
+			  "\x7b\x95\xe1\xcc\xba\x0d\xdc\x8a"
+			  "\x1d\x59\x52\x50\xaa\x16\x02\x82"
+			  "\xdf\x61\x33\x2e\x44\xce\x49\xc7"
+			  "\xe5\xc6\x2e\x76\xcf\x80\x52\xf0"
+			  "\x3d\x17\x34\x47\x3f\xd3\x80\x48"
+			  "\xa2\xba\xd5\xc7\x7b\x02\x28\xdb"
+			  "\xac\x44\xc7\x6e\x05\x5c\xc2\x79"
+			  "\xb3\x7d\x6a\x47\x77\x66\xf1\x38"
+			  "\xf0\xf5\x4f\x27\x1a\x31\xca\x6c"
+			  "\x72\x95\x92\x8e\x3f\xb0\xec\x1d"
+			  "\xc7\x2a\xff\x73\xee\xdf\x55\x80"
+			  "\x93\xd2\xbd\x34\xd3\x9f\x00\x51"
+			  "\xfb\x2e\x41\xba\x6c\x5a\x7c\x17"
+			  "\x7f\xe6\x70\xac\x8d\x39\x3f\x77"
+			  "\xe2\x23\xac\x8f\x72\x4e\xe4\x53"
+			  "\xcc\xf1\x1b\xf1\x35\xfe\x52\xa4"
+			  "\xd6\xb8\x40\x6b\xc1\xfd\xa0\xa1"
+			  "\xf5\x46\x65\xc2\x50\xbb\x43\xe2"
+			  "\xd1\x43\x28\x34\x74\xf5\x87\xa0"
+			  "\xf2\x5e\x27\x3b\x59\x2b\x3e\x49"
+			  "\xdf\x46\xee\xaf\x71\xd7\x32\x36"
+			  "\xc7\x14\x0b\x58\x6e\x3e\x2d\x41"
+			  "\xfa\x75\x66\x3a\x54\xe0\xb2\xb9"
+			  "\xaf\xdd\x04\x80\x15\x19\x3f\x6f"
+			  "\xce\x12\xb4\xd8\xe8\x89\x3c\x05"
+			  "\x30\xeb\xf3\x3d\xcd\x27\xec\xdc"
+			  "\x56\x70\x12\xcf\x78\x2b\x77\xbf"
+			  "\x22\xf0\x1b\x17\x9c\xcc\xd6\x1b"
+			  "\x2d\x3d\xa0\x3b\xd8\xc9\x70\xa4"
+			  "\x7a\x3e\x07\xb9\x06\xc3\xfa\xb0"
+			  "\x33\xee\xc1\xd8\xf6\xe0\xf0\xb2"
+			  "\x61\x12\x69\xb0\x5f\x28\x99\xda"
+			  "\xc3\x61\x48\xfa\x07\x16\x03\xc4"
+			  "\xa8\xe1\x3c\xe8\x0e\x64\x15\x30"
+			  "\xc1\x9d\x84\x2f\x73\x98\x0e\x3a"
+			  "\xf2\x86\x21\xa4\x9e\x1d\xb5\x86"
+			  "\x16\xdb\x2b\x9a\x06\x64\x8e\x79"
+			  "\x8d\x76\x3e\xc3\xc2\x64\x44\xe3"
+			  "\xda\xbc\x1a\x52\xd7\x61\x03\x65"
+			  "\x54\x32\x77\x01\xed\x9d\x8a\x43"
+			  "\x25\x24\xe3\xc1\xbe\xb8\x2f\xcb"
+			  "\x89\x14\x64\xab\xf6\xa0\x6e\x02"
+			  "\x57\xe4\x7d\xa9\x4e\x9a\x03\x36"
+			  "\xad\xf1\xb1\xfc\x0b\xe6\x79\x51"
+			  "\x9f\x81\x77\xc4\x14\x78\x9d\xbf"
+			  "\xb6\xd6\xa3\x8c\xba\x0b\x26\xe7"
+			  "\xc8\xb9\x5c\xcc\xe1\x5f\xd5\xc6"
+			  "\xc4\xca\xc2\xa3\x45\xba\x94\x13"
+			  "\xb2\x8f\xc3\x54\x01\x09\xe7\x8b"
+			  "\xda\x2a\x0a\x11\x02\x43\xcb\x57"
+			  "\xc9\xcc\xb5\x5c\xab\xc4\xec\x54"
+			  "\x00\x06\x34\xe1\x6e\x03\x89\x7c"
+			  "\xc6\xfb\x6a\xc7\x60\x43\xd6\xc5"
+			  "\xb5\x68\x72\x89\x8f\x42\xc3\x74"
+			  "\xbd\x25\xaa\x9f\x67\xb5\xdf\x26"
+			  "\x20\xe8\xb7\x01\x3c\xe4\x77\xce"
+			  "\xc4\x65\xa7\x23\x79\xea\x33\xc7"
+			  "\x82\x14\x5c\x82\xf2\x4e\x3d\xf6"
+			  "\xc6\x4a\x0e\x29\xbb\xec\x44\xcd"
+			  "\x2f\xd1\x4f\x21\x71\xa9\xce\x0f"
+			  "\x5c\xf2\x72\x5c\x08\x2e\x21\xd2"
+			  "\xc3\x29\x13\xd8\xac\xc3\xda\x13"
+			  "\x1a\x9d\xa7\x71\x1d\x27\x1d\x27"
+			  "\x1d\xea\xab\x44\x79\xad\xe5\xeb"
+			  "\xef\x1f\x22\x0a\x44\x4f\xcb\x87"
+			  "\xa7\x58\x71\x0e\x66\xf8\x60\xbf"
+			  "\x60\x74\x4a\xb4\xec\x2e\xfe\xd3"
+			  "\xf5\xb8\xfe\x46\x08\x50\x99\x6c"
+			  "\x66\xa5\xa8\x34\x44\xb5\xe5\xf0"
+			  "\xdd\x2c\x67\x4e\x35\x96\x8e\x67"
+			  "\x48\x3f\x5f\x37\x44\x60\x51\x2e"
+			  "\x14\x91\x5e\x57\xc3\x0e\x79\x77"
+			  "\x2f\x03\xf4\xe2\x1c\x72\xbf\x85"
+			  "\x5d\xd3\x17\xdf\x6c\xc5\x70\x24"
+			  "\x42\xdf\x51\x4e\x2a\xb2\xd2\x5b"
+			  "\x9e\x69\x83\x41\x11\xfe\x73\x22"
+			  "\xde\x8a\x9e\xd8\x8a\xfb\x20\x38"
+			  "\xd8\x47\x6f\xd5\xed\x8f\x41\xfd"
+			  "\x13\x7a\x18\x03\x7d\x0f\xcd\x7d"
+			  "\xa6\x7d\x31\x9e\xf1\x8f\x30\xa3"
+			  "\x8b\x4c\x24\xb7\xf5\x48\xd7\xd9"
+			  "\x12\xe7\x84\x97\x5c\x31\x6d\xfb"
+			  "\xdf\xf3\xd3\xd1\xd5\x0c\x30\x06"
+			  "\x01\x6a\xbc\x6c\x78\x7b\xa6\x50"
+			  "\xfa\x0f\x3c\x42\x2d\xa5\xa3\x3b"
+			  "\xcf\x62\x50\xff\x71\x6d\xe7\xda"
+			  "\x27\xab\xc6\x67\x16\x65\x68\x64"
+			  "\xc7\xd5\x5f\x81\xa9\xf6\x65\xb3"
+			  "\x5e\x43\x91\x16\xcd\x3d\x55\x37"
+			  "\x55\xb3\xf0\x28\xc5\x54\x19\xc0"
+			  "\xe0\xd6\x2a\x61\xd4\xc8\x72\x51"
+			  "\xe9\xa1\x7b\x48\x21\xad\x44\x09"
+			  "\xe4\x01\x61\x3c\x8a\x5b\xf9\xa1"
+			  "\x6e\x1b\xdf\xc0\x04\xa8\x8b\xf2"
+			  "\x21\xbe\x34\x7b\xfc\xa1\xcd\xc9"
+			  "\xa9\x96\xf4\xa4\x4c\xf7\x4e\x8f"
+			  "\x84\xcc\xd3\xa8\x92\x77\x8f\x36"
+			  "\xe2\x2e\x8c\x33\xe8\x84\xa6\x0c"
+			  "\x6c\x8a\xda\x14\x32\xc2\x96\xff"
+			  "\xc6\x4a\xc2\x9b\x30\x7f\xd1\x29"
+			  "\xc0\xd5\x78\x41\x00\x80\x80\x03"
+			  "\x2a\xb1\xde\x26\x03\x48\x49\xee"
+			  "\x57\x14\x76\x51\x3c\x36\x5d\x0a"
+			  "\x5c\x9f\xe8\xd8\x53\xdb\x4f\xd4"
+			  "\x38\xbf\x66\xc9\x75\x12\x18\x75"
+			  "\x34\x2d\x93\x22\x96\x51\x24\x6e"
+			  "\x4e\xd9\x30\xea\x67\xff\x92\x1c"
+			  "\x16\x26\xe9\xb5\x33\xab\x8c\x22"
+			  "\x47\xdb\xa0\x2c\x08\xf0\x12\x69"
+			  "\x7e\x93\x52\xda\xa5\xe5\xca\xc1"
+			  "\x0f\x55\x2a\xbd\x09\x30\x88\x1b"
+			  "\x9c\xc6\x9f\xe6\xdb\xa6\x92\xeb"
+			  "\xf4\xbd\x5c\xc4\xdb\xc6\x71\x09"
+			  "\xab\x5e\x48\x0c\xed\x6f\xda\x8e"
+			  "\x8d\x0c\x98\x71\x7d\x10\xd0\x9c"
+			  "\x20\x9b\x79\x53\x26\x5d\xb9\x85"
+			  "\x8a\x31\xb8\xc5\x1c\x97\xde\x88"
+			  "\x61\x55\x7f\x7c\x21\x06\xea\xc4"
+			  "\x5f\xaf\xf2\xf0\xd5\x5e\x7d\xb4"
+			  "\x6e\xcf\xe9\xae\x1b\x0e\x11\x80"
+			  "\xc1\x9a\x74\x7e\x52\x6f\xa0\xb7"
+			  "\x24\xcd\x8d\x0a\x11\x40\x63\x72"
+			  "\xfa\xe2\xc5\xb3\x94\xef\x29\xa2"
+			  "\x1a\x23\x43\x04\x37\x55\x0d\xe9"
+			  "\x83\xb2\x29\x51\x49\x64\xa0\xbd"
+			  "\xde\x73\xfd\xa5\x7c\x95\x70\x62"
+			  "\x58\xdc\xe2\xd0\xbf\x98\xf5\x8a"
+			  "\x6a\xfd\xce\xa8\x0e\x42\x2a\xeb"
+			  "\xd2\xff\x83\x27\x53\x5c\xa0\x6e"
+			  "\x93\xef\xe2\xb9\x5d\x35\xd6\x98"
+			  "\xf6\x71\x19\x7a\x54\xa1\xa7\xe8"
+			  "\x09\xfe\xf6\x9e\xc7\xbd\x3e\x29"
+			  "\xbd\x6b\x17\xf4\xe7\x3e\x10\x5c"
+			  "\xc1\xd2\x59\x4f\x4b\x12\x1a\x5b"
+			  "\x50\x80\x59\xb9\xec\x13\x66\xa8"
+			  "\xd2\x31\x7b\x6a\x61\x22\xdd\x7d"
+			  "\x61\xee\x87\x16\x46\x9f\xf9\xc7"
+			  "\x41\xee\x74\xf8\xd0\x96\x2c\x76"
+			  "\x2a\xac\x7d\x6e\x9f\x0e\x7f\x95"
+			  "\xfe\x50\x16\xb2\x23\xca\x62\xd5"
+			  "\x68\xcf\x07\x3f\x3f\x97\x85\x2a"
+			  "\x0c\x25\x45\xba\xdb\x32\xcb\x83"
+			  "\x8c\x4f\xe0\x6d\x9a\x99\xf9\xc9"
+			  "\xda\xd4\x19\x31\xc1\x7c\x6d\xd9"
+			  "\x9c\x56\xd3\xec\xc1\x81\x4c\xed"
+			  "\x28\x9d\x87\xeb\x19\xd7\x1a\x4f"
+			  "\x04\x6a\xcb\x1f\xcf\x1f\xa2\x16"
+			  "\xfc\x2a\x0d\xa1\x14\x2d\xfa\xc5"
+			  "\x5a\xd2\xc5\xf9\x19\x7c\x20\x1f"
+			  "\x2d\x10\xc0\x66\x7c\xd9\x2d\xe5"
+			  "\x88\x70\x59\xa7\x85\xd5\x2e\x7c"
+			  "\x5c\xe3\xb7\x12\xd6\x97\x3f\x29",
+		.psize	= 2048,
+		.digest	= "\x37\x90\x92\xc2\xeb\x01\x87\xd9"
+			  "\x95\xc7\x91\xc3\x17\x8b\x38\x52",
+	}
+};
+
+
 /*
  * DES test vectors.
  */
@@ -30818,6 +32050,1622 @@
 	},
 };
 
+static const struct cipher_testvec xchacha20_tv_template[] = {
+	{ /* from libsodium test/default/xchacha20.c */
+		.key	= "\x79\xc9\x97\x98\xac\x67\x30\x0b"
+			  "\xbb\x27\x04\xc9\x5c\x34\x1e\x32"
+			  "\x45\xf3\xdc\xb2\x17\x61\xb9\x8e"
+			  "\x52\xff\x45\xb2\x4f\x30\x4f\xc4",
+		.klen	= 32,
+		.iv	= "\xb3\x3f\xfd\x30\x96\x47\x9b\xcf"
+			  "\xbc\x9a\xee\x49\x41\x76\x88\xa0"
+			  "\xa2\x55\x4f\x8d\x95\x38\x94\x19"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00",
+		.ctext	= "\xc6\xe9\x75\x81\x60\x08\x3a\xc6"
+			  "\x04\xef\x90\xe7\x12\xce\x6e\x75"
+			  "\xd7\x79\x75\x90\x74\x4e\x0c\xf0"
+			  "\x60\xf0\x13\x73\x9c",
+		.len	= 29,
+	}, { /* from libsodium test/default/xchacha20.c */
+		.key	= "\x9d\x23\xbd\x41\x49\xcb\x97\x9c"
+			  "\xcf\x3c\x5c\x94\xdd\x21\x7e\x98"
+			  "\x08\xcb\x0e\x50\xcd\x0f\x67\x81"
+			  "\x22\x35\xea\xaf\x60\x1d\x62\x32",
+		.klen	= 32,
+		.iv	= "\xc0\x47\x54\x82\x66\xb7\xc3\x70"
+			  "\xd3\x35\x66\xa2\x42\x5c\xbf\x30"
+			  "\xd8\x2d\x1e\xaf\x52\x94\x10\x9e"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00",
+		.ctext	= "\xa2\x12\x09\x09\x65\x94\xde\x8c"
+			  "\x56\x67\xb1\xd1\x3a\xd9\x3f\x74"
+			  "\x41\x06\xd0\x54\xdf\x21\x0e\x47"
+			  "\x82\xcd\x39\x6f\xec\x69\x2d\x35"
+			  "\x15\xa2\x0b\xf3\x51\xee\xc0\x11"
+			  "\xa9\x2c\x36\x78\x88\xbc\x46\x4c"
+			  "\x32\xf0\x80\x7a\xcd\x6c\x20\x3a"
+			  "\x24\x7e\x0d\xb8\x54\x14\x84\x68"
+			  "\xe9\xf9\x6b\xee\x4c\xf7\x18\xd6"
+			  "\x8d\x5f\x63\x7c\xbd\x5a\x37\x64"
+			  "\x57\x78\x8e\x6f\xae\x90\xfc\x31"
+			  "\x09\x7c\xfc",
+		.len	= 91,
+	}, { /* Taken from the ChaCha20 test vectors, appended 16 random bytes
+		to nonce, and recomputed the ciphertext with libsodium */
+		.key	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+		.klen	= 32,
+		.iv	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x67\xc6\x69\x73"
+			  "\x51\xff\x4a\xec\x29\xcd\xba\xab"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+		.ctext	= "\x9c\x49\x2a\xe7\x8a\x2f\x93\xc7"
+			  "\xb3\x33\x6f\x82\x17\xd8\xc4\x1e"
+			  "\xad\x80\x11\x11\x1d\x4c\x16\x18"
+			  "\x07\x73\x9b\x4f\xdb\x7c\xcb\x47"
+			  "\xfd\xef\x59\x74\xfa\x3f\xe5\x4c"
+			  "\x9b\xd0\xea\xbc\xba\x56\xad\x32"
+			  "\x03\xdc\xf8\x2b\xc1\xe1\x75\x67"
+			  "\x23\x7b\xe6\xfc\xd4\x03\x86\x54",
+		.len	= 64,
+	}, { /* Taken from the ChaCha20 test vectors, appended 16 random bytes
+		to nonce, and recomputed the ciphertext with libsodium */
+		.key	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x01",
+		.klen	= 32,
+		.iv	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x02\xf2\xfb\xe3\x46"
+			  "\x7c\xc2\x54\xf8\x1b\xe8\xe7\x8d"
+			  "\x01\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x41\x6e\x79\x20\x73\x75\x62\x6d"
+			  "\x69\x73\x73\x69\x6f\x6e\x20\x74"
+			  "\x6f\x20\x74\x68\x65\x20\x49\x45"
+			  "\x54\x46\x20\x69\x6e\x74\x65\x6e"
+			  "\x64\x65\x64\x20\x62\x79\x20\x74"
+			  "\x68\x65\x20\x43\x6f\x6e\x74\x72"
+			  "\x69\x62\x75\x74\x6f\x72\x20\x66"
+			  "\x6f\x72\x20\x70\x75\x62\x6c\x69"
+			  "\x63\x61\x74\x69\x6f\x6e\x20\x61"
+			  "\x73\x20\x61\x6c\x6c\x20\x6f\x72"
+			  "\x20\x70\x61\x72\x74\x20\x6f\x66"
+			  "\x20\x61\x6e\x20\x49\x45\x54\x46"
+			  "\x20\x49\x6e\x74\x65\x72\x6e\x65"
+			  "\x74\x2d\x44\x72\x61\x66\x74\x20"
+			  "\x6f\x72\x20\x52\x46\x43\x20\x61"
+			  "\x6e\x64\x20\x61\x6e\x79\x20\x73"
+			  "\x74\x61\x74\x65\x6d\x65\x6e\x74"
+			  "\x20\x6d\x61\x64\x65\x20\x77\x69"
+			  "\x74\x68\x69\x6e\x20\x74\x68\x65"
+			  "\x20\x63\x6f\x6e\x74\x65\x78\x74"
+			  "\x20\x6f\x66\x20\x61\x6e\x20\x49"
+			  "\x45\x54\x46\x20\x61\x63\x74\x69"
+			  "\x76\x69\x74\x79\x20\x69\x73\x20"
+			  "\x63\x6f\x6e\x73\x69\x64\x65\x72"
+			  "\x65\x64\x20\x61\x6e\x20\x22\x49"
+			  "\x45\x54\x46\x20\x43\x6f\x6e\x74"
+			  "\x72\x69\x62\x75\x74\x69\x6f\x6e"
+			  "\x22\x2e\x20\x53\x75\x63\x68\x20"
+			  "\x73\x74\x61\x74\x65\x6d\x65\x6e"
+			  "\x74\x73\x20\x69\x6e\x63\x6c\x75"
+			  "\x64\x65\x20\x6f\x72\x61\x6c\x20"
+			  "\x73\x74\x61\x74\x65\x6d\x65\x6e"
+			  "\x74\x73\x20\x69\x6e\x20\x49\x45"
+			  "\x54\x46\x20\x73\x65\x73\x73\x69"
+			  "\x6f\x6e\x73\x2c\x20\x61\x73\x20"
+			  "\x77\x65\x6c\x6c\x20\x61\x73\x20"
+			  "\x77\x72\x69\x74\x74\x65\x6e\x20"
+			  "\x61\x6e\x64\x20\x65\x6c\x65\x63"
+			  "\x74\x72\x6f\x6e\x69\x63\x20\x63"
+			  "\x6f\x6d\x6d\x75\x6e\x69\x63\x61"
+			  "\x74\x69\x6f\x6e\x73\x20\x6d\x61"
+			  "\x64\x65\x20\x61\x74\x20\x61\x6e"
+			  "\x79\x20\x74\x69\x6d\x65\x20\x6f"
+			  "\x72\x20\x70\x6c\x61\x63\x65\x2c"
+			  "\x20\x77\x68\x69\x63\x68\x20\x61"
+			  "\x72\x65\x20\x61\x64\x64\x72\x65"
+			  "\x73\x73\x65\x64\x20\x74\x6f",
+		.ctext	= "\xf9\xab\x7a\x4a\x60\xb8\x5f\xa0"
+			  "\x50\xbb\x57\xce\xef\x8c\xc1\xd9"
+			  "\x24\x15\xb3\x67\x5e\x7f\x01\xf6"
+			  "\x1c\x22\xf6\xe5\x71\xb1\x43\x64"
+			  "\x63\x05\xd5\xfc\x5c\x3d\xc0\x0e"
+			  "\x23\xef\xd3\x3b\xd9\xdc\x7f\xa8"
+			  "\x58\x26\xb3\xd0\xc2\xd5\x04\x3f"
+			  "\x0a\x0e\x8f\x17\xe4\xcd\xf7\x2a"
+			  "\xb4\x2c\x09\xe4\x47\xec\x8b\xfb"
+			  "\x59\x37\x7a\xa1\xd0\x04\x7e\xaa"
+			  "\xf1\x98\x5f\x24\x3d\x72\x9a\x43"
+			  "\xa4\x36\x51\x92\x22\x87\xff\x26"
+			  "\xce\x9d\xeb\x59\x78\x84\x5e\x74"
+			  "\x97\x2e\x63\xc0\xef\x29\xf7\x8a"
+			  "\xb9\xee\x35\x08\x77\x6a\x35\x9a"
+			  "\x3e\xe6\x4f\x06\x03\x74\x1b\xc1"
+			  "\x5b\xb3\x0b\x89\x11\x07\xd3\xb7"
+			  "\x53\xd6\x25\x04\xd9\x35\xb4\x5d"
+			  "\x4c\x33\x5a\xc2\x42\x4c\xe6\xa4"
+			  "\x97\x6e\x0e\xd2\xb2\x8b\x2f\x7f"
+			  "\x28\xe5\x9f\xac\x4b\x2e\x02\xab"
+			  "\x85\xfa\xa9\x0d\x7c\x2d\x10\xe6"
+			  "\x91\xab\x55\x63\xf0\xde\x3a\x94"
+			  "\x25\x08\x10\x03\xc2\x68\xd1\xf4"
+			  "\xaf\x7d\x9c\x99\xf7\x86\x96\x30"
+			  "\x60\xfc\x0b\xe6\xa8\x80\x15\xb0"
+			  "\x81\xb1\x0c\xbe\xb9\x12\x18\x25"
+			  "\xe9\x0e\xb1\xe7\x23\xb2\xef\x4a"
+			  "\x22\x8f\xc5\x61\x89\xd4\xe7\x0c"
+			  "\x64\x36\x35\x61\xb6\x34\x60\xf7"
+			  "\x7b\x61\x37\x37\x12\x10\xa2\xf6"
+			  "\x7e\xdb\x7f\x39\x3f\xb6\x8e\x89"
+			  "\x9e\xf3\xfe\x13\x98\xbb\x66\x5a"
+			  "\xec\xea\xab\x3f\x9c\x87\xc4\x8c"
+			  "\x8a\x04\x18\x49\xfc\x77\x11\x50"
+			  "\x16\xe6\x71\x2b\xee\xc0\x9c\xb6"
+			  "\x87\xfd\x80\xff\x0b\x1d\x73\x38"
+			  "\xa4\x1d\x6f\xae\xe4\x12\xd7\x93"
+			  "\x9d\xcd\x38\x26\x09\x40\x52\xcd"
+			  "\x67\x01\x67\x26\xe0\x3e\x98\xa8"
+			  "\xe8\x1a\x13\x41\xbb\x90\x4d\x87"
+			  "\xbb\x42\x82\x39\xce\x3a\xd0\x18"
+			  "\x6d\x7b\x71\x8f\xbb\x2c\x6a\xd1"
+			  "\xbd\xf5\xc7\x8a\x7e\xe1\x1e\x0f"
+			  "\x0d\x0d\x13\x7c\xd9\xd8\x3c\x91"
+			  "\xab\xff\x1f\x12\xc3\xee\xe5\x65"
+			  "\x12\x8d\x7b\x61\xe5\x1f\x98",
+		.len	= 375,
+		.also_non_np = 1,
+		.np	= 3,
+		.tap	= { 375 - 20, 4, 16 },
+
+	}, { /* Taken from the ChaCha20 test vectors, appended 16 random bytes
+		to nonce, and recomputed the ciphertext with libsodium */
+		.key	= "\x1c\x92\x40\xa5\xeb\x55\xd3\x8a"
+			  "\xf3\x33\x88\x86\x04\xf6\xb5\xf0"
+			  "\x47\x39\x17\xc1\x40\x2b\x80\x09"
+			  "\x9d\xca\x5c\xbc\x20\x70\x75\xc0",
+		.klen	= 32,
+		.iv	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x02\x76\x5a\x2e\x63"
+			  "\x33\x9f\xc9\x9a\x66\x32\x0d\xb7"
+			  "\x2a\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x27\x54\x77\x61\x73\x20\x62\x72"
+			  "\x69\x6c\x6c\x69\x67\x2c\x20\x61"
+			  "\x6e\x64\x20\x74\x68\x65\x20\x73"
+			  "\x6c\x69\x74\x68\x79\x20\x74\x6f"
+			  "\x76\x65\x73\x0a\x44\x69\x64\x20"
+			  "\x67\x79\x72\x65\x20\x61\x6e\x64"
+			  "\x20\x67\x69\x6d\x62\x6c\x65\x20"
+			  "\x69\x6e\x20\x74\x68\x65\x20\x77"
+			  "\x61\x62\x65\x3a\x0a\x41\x6c\x6c"
+			  "\x20\x6d\x69\x6d\x73\x79\x20\x77"
+			  "\x65\x72\x65\x20\x74\x68\x65\x20"
+			  "\x62\x6f\x72\x6f\x67\x6f\x76\x65"
+			  "\x73\x2c\x0a\x41\x6e\x64\x20\x74"
+			  "\x68\x65\x20\x6d\x6f\x6d\x65\x20"
+			  "\x72\x61\x74\x68\x73\x20\x6f\x75"
+			  "\x74\x67\x72\x61\x62\x65\x2e",
+		.ctext	= "\x95\xb9\x51\xe7\x8f\xb4\xa4\x03"
+			  "\xca\x37\xcc\xde\x60\x1d\x8c\xe2"
+			  "\xf1\xbb\x8a\x13\x7f\x61\x85\xcc"
+			  "\xad\xf4\xf0\xdc\x86\xa6\x1e\x10"
+			  "\xbc\x8e\xcb\x38\x2b\xa5\xc8\x8f"
+			  "\xaa\x03\x3d\x53\x4a\x42\xb1\x33"
+			  "\xfc\xd3\xef\xf0\x8e\x7e\x10\x9c"
+			  "\x6f\x12\x5e\xd4\x96\xfe\x5b\x08"
+			  "\xb6\x48\xf0\x14\x74\x51\x18\x7c"
+			  "\x07\x92\xfc\xac\x9d\xf1\x94\xc0"
+			  "\xc1\x9d\xc5\x19\x43\x1f\x1d\xbb"
+			  "\x07\xf0\x1b\x14\x25\x45\xbb\xcb"
+			  "\x5c\xe2\x8b\x28\xf3\xcf\x47\x29"
+			  "\x27\x79\x67\x24\xa6\x87\xc2\x11"
+			  "\x65\x03\xfa\x45\xf7\x9e\x53\x7a"
+			  "\x99\xf1\x82\x25\x4f\x8d\x07",
+		.len	= 127,
+	}, { /* Taken from the ChaCha20 test vectors, appended 16 random bytes
+		to nonce, and recomputed the ciphertext with libsodium */
+		.key	= "\x1c\x92\x40\xa5\xeb\x55\xd3\x8a"
+			  "\xf3\x33\x88\x86\x04\xf6\xb5\xf0"
+			  "\x47\x39\x17\xc1\x40\x2b\x80\x09"
+			  "\x9d\xca\x5c\xbc\x20\x70\x75\xc0",
+		.klen	= 32,
+		.iv	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x01\x31\x58\xa3\x5a"
+			  "\x25\x5d\x05\x17\x58\xe9\x5e\xd4"
+			  "\x1c\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x49\xee\xe0\xdc\x24\x90\x40\xcd"
+			  "\xc5\x40\x8f\x47\x05\xbc\xdd\x81"
+			  "\x47\xc6\x8d\xe6\xb1\x8f\xd7\xcb"
+			  "\x09\x0e\x6e\x22\x48\x1f\xbf\xb8"
+			  "\x5c\xf7\x1e\x8a\xc1\x23\xf2\xd4"
+			  "\x19\x4b\x01\x0f\x4e\xa4\x43\xce"
+			  "\x01\xc6\x67\xda\x03\x91\x18\x90"
+			  "\xa5\xa4\x8e\x45\x03\xb3\x2d\xac"
+			  "\x74\x92\xd3\x53\x47\xc8\xdd\x25"
+			  "\x53\x6c\x02\x03\x87\x0d\x11\x0c"
+			  "\x58\xe3\x12\x18\xfd\x2a\x5b\x40"
+			  "\x0c\x30\xf0\xb8\x3f\x43\xce\xae"
+			  "\x65\x3a\x7d\x7c\xf4\x54\xaa\xcc"
+			  "\x33\x97\xc3\x77\xba\xc5\x70\xde"
+			  "\xd7\xd5\x13\xa5\x65\xc4\x5f\x0f"
+			  "\x46\x1a\x0d\x97\xb5\xf3\xbb\x3c"
+			  "\x84\x0f\x2b\xc5\xaa\xea\xf2\x6c"
+			  "\xc9\xb5\x0c\xee\x15\xf3\x7d\xbe"
+			  "\x9f\x7b\x5a\xa6\xae\x4f\x83\xb6"
+			  "\x79\x49\x41\xf4\x58\x18\xcb\x86"
+			  "\x7f\x30\x0e\xf8\x7d\x44\x36\xea"
+			  "\x75\xeb\x88\x84\x40\x3c\xad\x4f"
+			  "\x6f\x31\x6b\xaa\x5d\xe5\xa5\xc5"
+			  "\x21\x66\xe9\xa7\xe3\xb2\x15\x88"
+			  "\x78\xf6\x79\xa1\x59\x47\x12\x4e"
+			  "\x9f\x9f\x64\x1a\xa0\x22\x5b\x08"
+			  "\xbe\x7c\x36\xc2\x2b\x66\x33\x1b"
+			  "\xdd\x60\x71\xf7\x47\x8c\x61\xc3"
+			  "\xda\x8a\x78\x1e\x16\xfa\x1e\x86"
+			  "\x81\xa6\x17\x2a\xa7\xb5\xc2\xe7"
+			  "\xa4\xc7\x42\xf1\xcf\x6a\xca\xb4"
+			  "\x45\xcf\xf3\x93\xf0\xe7\xea\xf6"
+			  "\xf4\xe6\x33\x43\x84\x93\xa5\x67"
+			  "\x9b\x16\x58\x58\x80\x0f\x2b\x5c"
+			  "\x24\x74\x75\x7f\x95\x81\xb7\x30"
+			  "\x7a\x33\xa7\xf7\x94\x87\x32\x27"
+			  "\x10\x5d\x14\x4c\x43\x29\xdd\x26"
+			  "\xbd\x3e\x3c\x0e\xfe\x0e\xa5\x10"
+			  "\xea\x6b\x64\xfd\x73\xc6\xed\xec"
+			  "\xa8\xc9\xbf\xb3\xba\x0b\x4d\x07"
+			  "\x70\xfc\x16\xfd\x79\x1e\xd7\xc5"
+			  "\x49\x4e\x1c\x8b\x8d\x79\x1b\xb1"
+			  "\xec\xca\x60\x09\x4c\x6a\xd5\x09"
+			  "\x49\x46\x00\x88\x22\x8d\xce\xea"
+			  "\xb1\x17\x11\xde\x42\xd2\x23\xc1"
+			  "\x72\x11\xf5\x50\x73\x04\x40\x47"
+			  "\xf9\x5d\xe7\xa7\x26\xb1\x7e\xb0"
+			  "\x3f\x58\xc1\x52\xab\x12\x67\x9d"
+			  "\x3f\x43\x4b\x68\xd4\x9c\x68\x38"
+			  "\x07\x8a\x2d\x3e\xf3\xaf\x6a\x4b"
+			  "\xf9\xe5\x31\x69\x22\xf9\xa6\x69"
+			  "\xc6\x9c\x96\x9a\x12\x35\x95\x1d"
+			  "\x95\xd5\xdd\xbe\xbf\x93\x53\x24"
+			  "\xfd\xeb\xc2\x0a\x64\xb0\x77\x00"
+			  "\x6f\x88\xc4\x37\x18\x69\x7c\xd7"
+			  "\x41\x92\x55\x4c\x03\xa1\x9a\x4b"
+			  "\x15\xe5\xdf\x7f\x37\x33\x72\xc1"
+			  "\x8b\x10\x67\xa3\x01\x57\x94\x25"
+			  "\x7b\x38\x71\x7e\xdd\x1e\xcc\x73"
+			  "\x55\xd2\x8e\xeb\x07\xdd\xf1\xda"
+			  "\x58\xb1\x47\x90\xfe\x42\x21\x72"
+			  "\xa3\x54\x7a\xa0\x40\xec\x9f\xdd"
+			  "\xc6\x84\x6e\xca\xae\xe3\x68\xb4"
+			  "\x9d\xe4\x78\xff\x57\xf2\xf8\x1b"
+			  "\x03\xa1\x31\xd9\xde\x8d\xf5\x22"
+			  "\x9c\xdd\x20\xa4\x1e\x27\xb1\x76"
+			  "\x4f\x44\x55\xe2\x9b\xa1\x9c\xfe"
+			  "\x54\xf7\x27\x1b\xf4\xde\x02\xf5"
+			  "\x1b\x55\x48\x5c\xdc\x21\x4b\x9e"
+			  "\x4b\x6e\xed\x46\x23\xdc\x65\xb2"
+			  "\xcf\x79\x5f\x28\xe0\x9e\x8b\xe7"
+			  "\x4c\x9d\x8a\xff\xc1\xa6\x28\xb8"
+			  "\x65\x69\x8a\x45\x29\xef\x74\x85"
+			  "\xde\x79\xc7\x08\xae\x30\xb0\xf4"
+			  "\xa3\x1d\x51\x41\xab\xce\xcb\xf6"
+			  "\xb5\xd8\x6d\xe0\x85\xe1\x98\xb3"
+			  "\x43\xbb\x86\x83\x0a\xa0\xf5\xb7"
+			  "\x04\x0b\xfa\x71\x1f\xb0\xf6\xd9"
+			  "\x13\x00\x15\xf0\xc7\xeb\x0d\x5a"
+			  "\x9f\xd7\xb9\x6c\x65\x14\x22\x45"
+			  "\x6e\x45\x32\x3e\x7e\x60\x1a\x12"
+			  "\x97\x82\x14\xfb\xaa\x04\x22\xfa"
+			  "\xa0\xe5\x7e\x8c\x78\x02\x48\x5d"
+			  "\x78\x33\x5a\x7c\xad\xdb\x29\xce"
+			  "\xbb\x8b\x61\xa4\xb7\x42\xe2\xac"
+			  "\x8b\x1a\xd9\x2f\x0b\x8b\x62\x21"
+			  "\x83\x35\x7e\xad\x73\xc2\xb5\x6c"
+			  "\x10\x26\x38\x07\xe5\xc7\x36\x80"
+			  "\xe2\x23\x12\x61\xf5\x48\x4b\x2b"
+			  "\xc5\xdf\x15\xd9\x87\x01\xaa\xac"
+			  "\x1e\x7c\xad\x73\x78\x18\x63\xe0"
+			  "\x8b\x9f\x81\xd8\x12\x6a\x28\x10"
+			  "\xbe\x04\x68\x8a\x09\x7c\x1b\x1c"
+			  "\x83\x66\x80\x47\x80\xe8\xfd\x35"
+			  "\x1c\x97\x6f\xae\x49\x10\x66\xcc"
+			  "\xc6\xd8\xcc\x3a\x84\x91\x20\x77"
+			  "\x72\xe4\x24\xd2\x37\x9f\xc5\xc9"
+			  "\x25\x94\x10\x5f\x40\x00\x64\x99"
+			  "\xdc\xae\xd7\x21\x09\x78\x50\x15"
+			  "\xac\x5f\xc6\x2c\xa2\x0b\xa9\x39"
+			  "\x87\x6e\x6d\xab\xde\x08\x51\x16"
+			  "\xc7\x13\xe9\xea\xed\x06\x8e\x2c"
+			  "\xf8\x37\x8c\xf0\xa6\x96\x8d\x43"
+			  "\xb6\x98\x37\xb2\x43\xed\xde\xdf"
+			  "\x89\x1a\xe7\xeb\x9d\xa1\x7b\x0b"
+			  "\x77\xb0\xe2\x75\xc0\xf1\x98\xd9"
+			  "\x80\x55\xc9\x34\x91\xd1\x59\xe8"
+			  "\x4b\x0f\xc1\xa9\x4b\x7a\x84\x06"
+			  "\x20\xa8\x5d\xfa\xd1\xde\x70\x56"
+			  "\x2f\x9e\x91\x9c\x20\xb3\x24\xd8"
+			  "\x84\x3d\xe1\x8c\x7e\x62\x52\xe5"
+			  "\x44\x4b\x9f\xc2\x93\x03\xea\x2b"
+			  "\x59\xc5\xfa\x3f\x91\x2b\xbb\x23"
+			  "\xf5\xb2\x7b\xf5\x38\xaf\xb3\xee"
+			  "\x63\xdc\x7b\xd1\xff\xaa\x8b\xab"
+			  "\x82\x6b\x37\x04\xeb\x74\xbe\x79"
+			  "\xb9\x83\x90\xef\x20\x59\x46\xff"
+			  "\xe9\x97\x3e\x2f\xee\xb6\x64\x18"
+			  "\x38\x4c\x7a\x4a\xf9\x61\xe8\x9a"
+			  "\xa1\xb5\x01\xa6\x47\xd3\x11\xd4"
+			  "\xce\xd3\x91\x49\x88\xc7\xb8\x4d"
+			  "\xb1\xb9\x07\x6d\x16\x72\xae\x46"
+			  "\x5e\x03\xa1\x4b\xb6\x02\x30\xa8"
+			  "\x3d\xa9\x07\x2a\x7c\x19\xe7\x62"
+			  "\x87\xe3\x82\x2f\x6f\xe1\x09\xd9"
+			  "\x94\x97\xea\xdd\x58\x9e\xae\x76"
+			  "\x7e\x35\xe5\xb4\xda\x7e\xf4\xde"
+			  "\xf7\x32\x87\xcd\x93\xbf\x11\x56"
+			  "\x11\xbe\x08\x74\xe1\x69\xad\xe2"
+			  "\xd7\xf8\x86\x75\x8a\x3c\xa4\xbe"
+			  "\x70\xa7\x1b\xfc\x0b\x44\x2a\x76"
+			  "\x35\xea\x5d\x85\x81\xaf\x85\xeb"
+			  "\xa0\x1c\x61\xc2\xf7\x4f\xa5\xdc"
+			  "\x02\x7f\xf6\x95\x40\x6e\x8a\x9a"
+			  "\xf3\x5d\x25\x6e\x14\x3a\x22\xc9"
+			  "\x37\x1c\xeb\x46\x54\x3f\xa5\x91"
+			  "\xc2\xb5\x8c\xfe\x53\x08\x97\x32"
+			  "\x1b\xb2\x30\x27\xfe\x25\x5d\xdc"
+			  "\x08\x87\xd0\xe5\x94\x1a\xd4\xf1"
+			  "\xfe\xd6\xb4\xa3\xe6\x74\x81\x3c"
+			  "\x1b\xb7\x31\xa7\x22\xfd\xd4\xdd"
+			  "\x20\x4e\x7c\x51\xb0\x60\x73\xb8"
+			  "\x9c\xac\x91\x90\x7e\x01\xb0\xe1"
+			  "\x8a\x2f\x75\x1c\x53\x2a\x98\x2a"
+			  "\x06\x52\x95\x52\xb2\xe9\x25\x2e"
+			  "\x4c\xe2\x5a\x00\xb2\x13\x81\x03"
+			  "\x77\x66\x0d\xa5\x99\xda\x4e\x8c"
+			  "\xac\xf3\x13\x53\x27\x45\xaf\x64"
+			  "\x46\xdc\xea\x23\xda\x97\xd1\xab"
+			  "\x7d\x6c\x30\x96\x1f\xbc\x06\x34"
+			  "\x18\x0b\x5e\x21\x35\x11\x8d\x4c"
+			  "\xe0\x2d\xe9\x50\x16\x74\x81\xa8"
+			  "\xb4\x34\xb9\x72\x42\xa6\xcc\xbc"
+			  "\xca\x34\x83\x27\x10\x5b\x68\x45"
+			  "\x8f\x52\x22\x0c\x55\x3d\x29\x7c"
+			  "\xe3\xc0\x66\x05\x42\x91\x5f\x58"
+			  "\xfe\x4a\x62\xd9\x8c\xa9\x04\x19"
+			  "\x04\xa9\x08\x4b\x57\xfc\x67\x53"
+			  "\x08\x7c\xbc\x66\x8a\xb0\xb6\x9f"
+			  "\x92\xd6\x41\x7c\x5b\x2a\x00\x79"
+			  "\x72",
+		.ctext	= "\x3a\x92\xee\x53\x31\xaf\x2b\x60"
+			  "\x5f\x55\x8d\x00\x5d\xfc\x74\x97"
+			  "\x28\x54\xf4\xa5\x75\xf1\x9b\x25"
+			  "\x62\x1c\xc0\xe0\x13\xc8\x87\x53"
+			  "\xd0\xf3\xa7\x97\x1f\x3b\x1e\xea"
+			  "\xe0\xe5\x2a\xd1\xdd\xa4\x3b\x50"
+			  "\x45\xa3\x0d\x7e\x1b\xc9\xa0\xad"
+			  "\xb9\x2c\x54\xa6\xc7\x55\x16\xd0"
+			  "\xc5\x2e\x02\x44\x35\xd0\x7e\x67"
+			  "\xf2\xc4\x9b\xcd\x95\x10\xcc\x29"
+			  "\x4b\xfa\x86\x87\xbe\x40\x36\xbe"
+			  "\xe1\xa3\x52\x89\x55\x20\x9b\xc2"
+			  "\xab\xf2\x31\x34\x16\xad\xc8\x17"
+			  "\x65\x24\xc0\xff\x12\x37\xfe\x5a"
+			  "\x62\x3b\x59\x47\x6c\x5f\x3a\x8e"
+			  "\x3b\xd9\x30\xc8\x7f\x2f\x88\xda"
+			  "\x80\xfd\x02\xda\x7f\x9a\x7a\x73"
+			  "\x59\xc5\x34\x09\x9a\x11\xcb\xa7"
+			  "\xfc\xf6\xa1\xa0\x60\xfb\x43\xbb"
+			  "\xf1\xe9\xd7\xc6\x79\x27\x4e\xff"
+			  "\x22\xb4\x24\xbf\x76\xee\x47\xb9"
+			  "\x6d\x3f\x8b\xb0\x9c\x3c\x43\xdd"
+			  "\xff\x25\x2e\x6d\xa4\x2b\xfb\x5d"
+			  "\x1b\x97\x6c\x55\x0a\x82\x7a\x7b"
+			  "\x94\x34\xc2\xdb\x2f\x1f\xc1\xea"
+			  "\xd4\x4d\x17\x46\x3b\x51\x69\x09"
+			  "\xe4\x99\x32\x25\xfd\x94\xaf\xfb"
+			  "\x10\xf7\x4f\xdd\x0b\x3c\x8b\x41"
+			  "\xb3\x6a\xb7\xd1\x33\xa8\x0c\x2f"
+			  "\x62\x4c\x72\x11\xd7\x74\xe1\x3b"
+			  "\x38\x43\x66\x7b\x6c\x36\x48\xe7"
+			  "\xe3\xe7\x9d\xb9\x42\x73\x7a\x2a"
+			  "\x89\x20\x1a\x41\x80\x03\xf7\x8f"
+			  "\x61\x78\x13\xbf\xfe\x50\xf5\x04"
+			  "\x52\xf9\xac\x47\xf8\x62\x4b\xb2"
+			  "\x24\xa9\xbf\x64\xb0\x18\x69\xd2"
+			  "\xf5\xe4\xce\xc8\xb1\x87\x75\xd6"
+			  "\x2c\x24\x79\x00\x7d\x26\xfb\x44"
+			  "\xe7\x45\x7a\xee\x58\xa5\x83\xc1"
+			  "\xb4\x24\xab\x23\x2f\x4d\xd7\x4f"
+			  "\x1c\xc7\xaa\xa9\x50\xf4\xa3\x07"
+			  "\x12\x13\x89\x74\xdc\x31\x6a\xb2"
+			  "\xf5\x0f\x13\x8b\xb9\xdb\x85\x1f"
+			  "\xf5\xbc\x88\xd9\x95\xea\x31\x6c"
+			  "\x36\x60\xb6\x49\xdc\xc4\xf7\x55"
+			  "\x3f\x21\xc1\xb5\x92\x18\x5e\xbc"
+			  "\x9f\x87\x7f\xe7\x79\x25\x40\x33"
+			  "\xd6\xb9\x33\xd5\x50\xb3\xc7\x89"
+			  "\x1b\x12\xa0\x46\xdd\xa7\xd8\x3e"
+			  "\x71\xeb\x6f\x66\xa1\x26\x0c\x67"
+			  "\xab\xb2\x38\x58\x17\xd8\x44\x3b"
+			  "\x16\xf0\x8e\x62\x8d\x16\x10\x00"
+			  "\x32\x8b\xef\xb9\x28\xd3\xc5\xad"
+			  "\x0a\x19\xa2\xe4\x03\x27\x7d\x94"
+			  "\x06\x18\xcd\xd6\x27\x00\xf9\x1f"
+			  "\xb6\xb3\xfe\x96\x35\x5f\xc4\x1c"
+			  "\x07\x62\x10\x79\x68\x50\xf1\x7e"
+			  "\x29\xe7\xc4\xc4\xe7\xee\x54\xd6"
+			  "\x58\x76\x84\x6d\x8d\xe4\x59\x31"
+			  "\xe9\xf4\xdc\xa1\x1f\xe5\x1a\xd6"
+			  "\xe6\x64\x46\xf5\x77\x9c\x60\x7a"
+			  "\x5e\x62\xe3\x0a\xd4\x9f\x7a\x2d"
+			  "\x7a\xa5\x0a\x7b\x29\x86\x7a\x74"
+			  "\x74\x71\x6b\xca\x7d\x1d\xaa\xba"
+			  "\x39\x84\x43\x76\x35\xfe\x4f\x9b"
+			  "\xbb\xbb\xb5\x6a\x32\xb5\x5d\x41"
+			  "\x51\xf0\x5b\x68\x03\x47\x4b\x8a"
+			  "\xca\x88\xf6\x37\xbd\x73\x51\x70"
+			  "\x66\xfe\x9e\x5f\x21\x9c\xf3\xdd"
+			  "\xc3\xea\x27\xf9\x64\x94\xe1\x19"
+			  "\xa0\xa9\xab\x60\xe0\x0e\xf7\x78"
+			  "\x70\x86\xeb\xe0\xd1\x5c\x05\xd3"
+			  "\xd7\xca\xe0\xc0\x47\x47\x34\xee"
+			  "\x11\xa3\xa3\x54\x98\xb7\x49\x8e"
+			  "\x84\x28\x70\x2c\x9e\xfb\x55\x54"
+			  "\x4d\xf8\x86\xf7\x85\x7c\xbd\xf3"
+			  "\x17\xd8\x47\xcb\xac\xf4\x20\x85"
+			  "\x34\x66\xad\x37\x2d\x5e\x52\xda"
+			  "\x8a\xfe\x98\x55\x30\xe7\x2d\x2b"
+			  "\x19\x10\x8e\x7b\x66\x5e\xdc\xe0"
+			  "\x45\x1f\x7b\xb4\x08\xfb\x8f\xf6"
+			  "\x8c\x89\x21\x34\x55\x27\xb2\x76"
+			  "\xb2\x07\xd9\xd6\x68\x9b\xea\x6b"
+			  "\x2d\xb4\xc4\x35\xdd\xd2\x79\xae"
+			  "\xc7\xd6\x26\x7f\x12\x01\x8c\xa7"
+			  "\xe3\xdb\xa8\xf4\xf7\x2b\xec\x99"
+			  "\x11\x00\xf1\x35\x8c\xcf\xd5\xc9"
+			  "\xbd\x91\x36\x39\x70\xcf\x7d\x70"
+			  "\x47\x1a\xfc\x6b\x56\xe0\x3f\x9c"
+			  "\x60\x49\x01\x72\xa9\xaf\x2c\x9c"
+			  "\xe8\xab\xda\x8c\x14\x19\xf3\x75"
+			  "\x07\x17\x9d\x44\x67\x7a\x2e\xef"
+			  "\xb7\x83\x35\x4a\xd1\x3d\x1c\x84"
+			  "\x32\xdd\xaa\xea\xca\x1d\xdc\x72"
+			  "\x2c\xcc\x43\xcd\x5d\xe3\x21\xa4"
+			  "\xd0\x8a\x4b\x20\x12\xa3\xd5\x86"
+			  "\x76\x96\xff\x5f\x04\x57\x0f\xe6"
+			  "\xba\xe8\x76\x50\x0c\x64\x1d\x83"
+			  "\x9c\x9b\x9a\x9a\x58\x97\x9c\x5c"
+			  "\xb4\xa4\xa6\x3e\x19\xeb\x8f\x5a"
+			  "\x61\xb2\x03\x7b\x35\x19\xbe\xa7"
+			  "\x63\x0c\xfd\xdd\xf9\x90\x6c\x08"
+			  "\x19\x11\xd3\x65\x4a\xf5\x96\x92"
+			  "\x59\xaa\x9c\x61\x0c\x29\xa7\xf8"
+			  "\x14\x39\x37\xbf\x3c\xf2\x16\x72"
+			  "\x02\xfa\xa2\xf3\x18\x67\x5d\xcb"
+			  "\xdc\x4d\xbb\x96\xff\x70\x08\x2d"
+			  "\xc2\xa8\x52\xe1\x34\x5f\x72\xfe"
+			  "\x64\xbf\xca\xa7\x74\x38\xfb\x74"
+			  "\x55\x9c\xfa\x8a\xed\xfb\x98\xeb"
+			  "\x58\x2e\x6c\xe1\x52\x76\x86\xd7"
+			  "\xcf\xa1\xa4\xfc\xb2\x47\x41\x28"
+			  "\xa3\xc1\xe5\xfd\x53\x19\x28\x2b"
+			  "\x37\x04\x65\x96\x99\x7a\x28\x0f"
+			  "\x07\x68\x4b\xc7\x52\x0a\x55\x35"
+			  "\x40\x19\x95\x61\xe8\x59\x40\x1f"
+			  "\x9d\xbf\x78\x7d\x8f\x84\xff\x6f"
+			  "\xd0\xd5\x63\xd2\x22\xbd\xc8\x4e"
+			  "\xfb\xe7\x9f\x06\xe6\xe7\x39\x6d"
+			  "\x6a\x96\x9f\xf0\x74\x7e\xc9\x35"
+			  "\xb7\x26\xb8\x1c\x0a\xa6\x27\x2c"
+			  "\xa2\x2b\xfe\xbe\x0f\x07\x73\xae"
+			  "\x7f\x7f\x54\xf5\x7c\x6a\x0a\x56"
+			  "\x49\xd4\x81\xe5\x85\x53\x99\x1f"
+			  "\x95\x05\x13\x58\x8d\x0e\x1b\x90"
+			  "\xc3\x75\x48\x64\x58\x98\x67\x84"
+			  "\xae\xe2\x21\xa2\x8a\x04\x0a\x0b"
+			  "\x61\xaa\xb0\xd4\x28\x60\x7a\xf8"
+			  "\xbc\x52\xfb\x24\x7f\xed\x0d\x2a"
+			  "\x0a\xb2\xf9\xc6\x95\xb5\x11\xc9"
+			  "\xf4\x0f\x26\x11\xcf\x2a\x57\x87"
+			  "\x7a\xf3\xe7\x94\x65\xc2\xb5\xb3"
+			  "\xab\x98\xe3\xc1\x2b\x59\x19\x7c"
+			  "\xd6\xf3\xf9\xbf\xff\x6d\xc6\x82"
+			  "\x13\x2f\x4a\x2e\xcd\x26\xfe\x2d"
+			  "\x01\x70\xf4\xc2\x7f\x1f\x4c\xcb"
+			  "\x47\x77\x0c\xa0\xa3\x03\xec\xda"
+			  "\xa9\xbf\x0d\x2d\xae\xe4\xb8\x7b"
+			  "\xa9\xbc\x08\xb4\x68\x2e\xc5\x60"
+			  "\x8d\x87\x41\x2b\x0f\x69\xf0\xaf"
+			  "\x5f\xba\x72\x20\x0f\x33\xcd\x6d"
+			  "\x36\x7d\x7b\xd5\x05\xf1\x4b\x05"
+			  "\xc4\xfc\x7f\x80\xb9\x4d\xbd\xf7"
+			  "\x7c\x84\x07\x01\xc2\x40\x66\x5b"
+			  "\x98\xc7\x2c\xe3\x97\xfa\xdf\x87"
+			  "\xa0\x1f\xe9\x21\x42\x0f\x3b\xeb"
+			  "\x89\x1c\x3b\xca\x83\x61\x77\x68"
+			  "\x84\xbb\x60\x87\x38\x2e\x25\xd5"
+			  "\x9e\x04\x41\x70\xac\xda\xc0\x9c"
+			  "\x9c\x69\xea\x8d\x4e\x55\x2a\x29"
+			  "\xed\x05\x4b\x7b\x73\x71\x90\x59"
+			  "\x4d\xc8\xd8\x44\xf0\x4c\xe1\x5e"
+			  "\x84\x47\x55\xcc\x32\x3f\xe7\x97"
+			  "\x42\xc6\x32\xac\x40\xe5\xa5\xc7"
+			  "\x8b\xed\xdb\xf7\x83\xd6\xb1\xc2"
+			  "\x52\x5e\x34\xb7\xeb\x6e\xd9\xfc"
+			  "\xe5\x93\x9a\x97\x3e\xb0\xdc\xd9"
+			  "\xd7\x06\x10\xb6\x1d\x80\x59\xdd"
+			  "\x0d\xfe\x64\x35\xcd\x5d\xec\xf0"
+			  "\xba\xd0\x34\xc9\x2d\x91\xc5\x17"
+			  "\x11",
+		.len	= 1281,
+		.also_non_np = 1,
+		.np	= 3,
+		.tap	= { 1200, 1, 80 },
+	},
+};
+
+/*
+ * Same as XChaCha20 test vectors above, but recomputed the ciphertext with
+ * XChaCha12, using a modified libsodium.
+ */
+static const struct cipher_testvec xchacha12_tv_template[] = {
+	{
+		.key	= "\x79\xc9\x97\x98\xac\x67\x30\x0b"
+			  "\xbb\x27\x04\xc9\x5c\x34\x1e\x32"
+			  "\x45\xf3\xdc\xb2\x17\x61\xb9\x8e"
+			  "\x52\xff\x45\xb2\x4f\x30\x4f\xc4",
+		.klen	= 32,
+		.iv	= "\xb3\x3f\xfd\x30\x96\x47\x9b\xcf"
+			  "\xbc\x9a\xee\x49\x41\x76\x88\xa0"
+			  "\xa2\x55\x4f\x8d\x95\x38\x94\x19"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00",
+		.ctext	= "\x1b\x78\x7f\xd7\xa1\x41\x68\xab"
+			  "\x3d\x3f\xd1\x7b\x69\x56\xb2\xd5"
+			  "\x43\xce\xeb\xaf\x36\xf0\x29\x9d"
+			  "\x3a\xfb\x18\xae\x1b",
+		.len	= 29,
+	}, {
+		.key	= "\x9d\x23\xbd\x41\x49\xcb\x97\x9c"
+			  "\xcf\x3c\x5c\x94\xdd\x21\x7e\x98"
+			  "\x08\xcb\x0e\x50\xcd\x0f\x67\x81"
+			  "\x22\x35\xea\xaf\x60\x1d\x62\x32",
+		.klen	= 32,
+		.iv	= "\xc0\x47\x54\x82\x66\xb7\xc3\x70"
+			  "\xd3\x35\x66\xa2\x42\x5c\xbf\x30"
+			  "\xd8\x2d\x1e\xaf\x52\x94\x10\x9e"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00",
+		.ctext	= "\xfb\x32\x09\x1d\x83\x05\xae\x4c"
+			  "\x13\x1f\x12\x71\xf2\xca\xb2\xeb"
+			  "\x5b\x83\x14\x7d\x83\xf6\x57\x77"
+			  "\x2e\x40\x1f\x92\x2c\xf9\xec\x35"
+			  "\x34\x1f\x93\xdf\xfb\x30\xd7\x35"
+			  "\x03\x05\x78\xc1\x20\x3b\x7a\xe3"
+			  "\x62\xa3\x89\xdc\x11\x11\x45\xa8"
+			  "\x82\x89\xa0\xf1\x4e\xc7\x0f\x11"
+			  "\x69\xdd\x0c\x84\x2b\x89\x5c\xdc"
+			  "\xf0\xde\x01\xef\xc5\x65\x79\x23"
+			  "\x87\x67\xd6\x50\xd9\x8d\xd9\x92"
+			  "\x54\x5b\x0e",
+		.len	= 91,
+	}, {
+		.key	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+		.klen	= 32,
+		.iv	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x67\xc6\x69\x73"
+			  "\x51\xff\x4a\xec\x29\xcd\xba\xab"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00",
+		.ctext	= "\xdf\x2d\xc6\x21\x2a\x9d\xa1\xbb"
+			  "\xc2\x77\x66\x0c\x5c\x46\xef\xa7"
+			  "\x79\x1b\xb9\xdf\x55\xe2\xf9\x61"
+			  "\x4c\x7b\xa4\x52\x24\xaf\xa2\xda"
+			  "\xd1\x8f\x8f\xa2\x9e\x53\x4d\xc4"
+			  "\xb8\x55\x98\x08\x7c\x08\xd4\x18"
+			  "\x67\x8f\xef\x50\xb1\x5f\xa5\x77"
+			  "\x4c\x25\xe7\x86\x26\x42\xca\x44",
+		.len	= 64,
+	}, {
+		.key	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x00\x00\x00\x00\x01",
+		.klen	= 32,
+		.iv	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x02\xf2\xfb\xe3\x46"
+			  "\x7c\xc2\x54\xf8\x1b\xe8\xe7\x8d"
+			  "\x01\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x41\x6e\x79\x20\x73\x75\x62\x6d"
+			  "\x69\x73\x73\x69\x6f\x6e\x20\x74"
+			  "\x6f\x20\x74\x68\x65\x20\x49\x45"
+			  "\x54\x46\x20\x69\x6e\x74\x65\x6e"
+			  "\x64\x65\x64\x20\x62\x79\x20\x74"
+			  "\x68\x65\x20\x43\x6f\x6e\x74\x72"
+			  "\x69\x62\x75\x74\x6f\x72\x20\x66"
+			  "\x6f\x72\x20\x70\x75\x62\x6c\x69"
+			  "\x63\x61\x74\x69\x6f\x6e\x20\x61"
+			  "\x73\x20\x61\x6c\x6c\x20\x6f\x72"
+			  "\x20\x70\x61\x72\x74\x20\x6f\x66"
+			  "\x20\x61\x6e\x20\x49\x45\x54\x46"
+			  "\x20\x49\x6e\x74\x65\x72\x6e\x65"
+			  "\x74\x2d\x44\x72\x61\x66\x74\x20"
+			  "\x6f\x72\x20\x52\x46\x43\x20\x61"
+			  "\x6e\x64\x20\x61\x6e\x79\x20\x73"
+			  "\x74\x61\x74\x65\x6d\x65\x6e\x74"
+			  "\x20\x6d\x61\x64\x65\x20\x77\x69"
+			  "\x74\x68\x69\x6e\x20\x74\x68\x65"
+			  "\x20\x63\x6f\x6e\x74\x65\x78\x74"
+			  "\x20\x6f\x66\x20\x61\x6e\x20\x49"
+			  "\x45\x54\x46\x20\x61\x63\x74\x69"
+			  "\x76\x69\x74\x79\x20\x69\x73\x20"
+			  "\x63\x6f\x6e\x73\x69\x64\x65\x72"
+			  "\x65\x64\x20\x61\x6e\x20\x22\x49"
+			  "\x45\x54\x46\x20\x43\x6f\x6e\x74"
+			  "\x72\x69\x62\x75\x74\x69\x6f\x6e"
+			  "\x22\x2e\x20\x53\x75\x63\x68\x20"
+			  "\x73\x74\x61\x74\x65\x6d\x65\x6e"
+			  "\x74\x73\x20\x69\x6e\x63\x6c\x75"
+			  "\x64\x65\x20\x6f\x72\x61\x6c\x20"
+			  "\x73\x74\x61\x74\x65\x6d\x65\x6e"
+			  "\x74\x73\x20\x69\x6e\x20\x49\x45"
+			  "\x54\x46\x20\x73\x65\x73\x73\x69"
+			  "\x6f\x6e\x73\x2c\x20\x61\x73\x20"
+			  "\x77\x65\x6c\x6c\x20\x61\x73\x20"
+			  "\x77\x72\x69\x74\x74\x65\x6e\x20"
+			  "\x61\x6e\x64\x20\x65\x6c\x65\x63"
+			  "\x74\x72\x6f\x6e\x69\x63\x20\x63"
+			  "\x6f\x6d\x6d\x75\x6e\x69\x63\x61"
+			  "\x74\x69\x6f\x6e\x73\x20\x6d\x61"
+			  "\x64\x65\x20\x61\x74\x20\x61\x6e"
+			  "\x79\x20\x74\x69\x6d\x65\x20\x6f"
+			  "\x72\x20\x70\x6c\x61\x63\x65\x2c"
+			  "\x20\x77\x68\x69\x63\x68\x20\x61"
+			  "\x72\x65\x20\x61\x64\x64\x72\x65"
+			  "\x73\x73\x65\x64\x20\x74\x6f",
+		.ctext	= "\xe4\xa6\xc8\x30\xc4\x23\x13\xd6"
+			  "\x08\x4d\xc9\xb7\xa5\x64\x7c\xb9"
+			  "\x71\xe2\xab\x3e\xa8\x30\x8a\x1c"
+			  "\x4a\x94\x6d\x9b\xe0\xb3\x6f\xf1"
+			  "\xdc\xe3\x1b\xb3\xa9\x6d\x0d\xd6"
+			  "\xd0\xca\x12\xef\xe7\x5f\xd8\x61"
+			  "\x3c\x82\xd3\x99\x86\x3c\x6f\x66"
+			  "\x02\x06\xdc\x55\xf9\xed\xdf\x38"
+			  "\xb4\xa6\x17\x00\x7f\xef\xbf\x4f"
+			  "\xf8\x36\xf1\x60\x7e\x47\xaf\xdb"
+			  "\x55\x9b\x12\xcb\x56\x44\xa7\x1f"
+			  "\xd3\x1a\x07\x3b\x00\xec\xe6\x4c"
+			  "\xa2\x43\x27\xdf\x86\x19\x4f\x16"
+			  "\xed\xf9\x4a\xf3\x63\x6f\xfa\x7f"
+			  "\x78\x11\xf6\x7d\x97\x6f\xec\x6f"
+			  "\x85\x0f\x5c\x36\x13\x8d\x87\xe0"
+			  "\x80\xb1\x69\x0b\x98\x89\x9c\x4e"
+			  "\xf8\xdd\xee\x5c\x0a\x85\xce\xd4"
+			  "\xea\x1b\x48\xbe\x08\xf8\xe2\xa8"
+			  "\xa5\xb0\x3c\x79\xb1\x15\xb4\xb9"
+			  "\x75\x10\x95\x35\x81\x7e\x26\xe6"
+			  "\x78\xa4\x88\xcf\xdb\x91\x34\x18"
+			  "\xad\xd7\x8e\x07\x7d\xab\x39\xf9"
+			  "\xa3\x9e\xa5\x1d\xbb\xed\x61\xfd"
+			  "\xdc\xb7\x5a\x27\xfc\xb5\xc9\x10"
+			  "\xa8\xcc\x52\x7f\x14\x76\x90\xe7"
+			  "\x1b\x29\x60\x74\xc0\x98\x77\xbb"
+			  "\xe0\x54\xbb\x27\x49\x59\x1e\x62"
+			  "\x3d\xaf\x74\x06\xa4\x42\x6f\xc6"
+			  "\x52\x97\xc4\x1d\xc4\x9f\xe2\xe5"
+			  "\x38\x57\x91\xd1\xa2\x28\xcc\x40"
+			  "\xcc\x70\x59\x37\xfc\x9f\x4b\xda"
+			  "\xa0\xeb\x97\x9a\x7d\xed\x14\x5c"
+			  "\x9c\xb7\x93\x26\x41\xa8\x66\xdd"
+			  "\x87\x6a\xc0\xd3\xc2\xa9\x3e\xae"
+			  "\xe9\x72\xfe\xd1\xb3\xac\x38\xea"
+			  "\x4d\x15\xa9\xd5\x36\x61\xe9\x96"
+			  "\x6c\x23\xf8\x43\xe4\x92\x29\xd9"
+			  "\x8b\x78\xf7\x0a\x52\xe0\x19\x5b"
+			  "\x59\x69\x5b\x5d\xa1\x53\xc4\x68"
+			  "\xe1\xbb\xac\x89\x14\xe2\xe2\x85"
+			  "\x41\x18\xf5\xb3\xd1\xfa\x68\x19"
+			  "\x44\x78\xdc\xcf\xe7\x88\x2d\x52"
+			  "\x5f\x40\xb5\x7e\xf8\x88\xa2\xae"
+			  "\x4a\xb2\x07\x35\x9d\x9b\x07\x88"
+			  "\xb7\x00\xd0\x0c\xb6\xa0\x47\x59"
+			  "\xda\x4e\xc9\xab\x9b\x8a\x7b",
+
+		.len	= 375,
+		.also_non_np = 1,
+		.np	= 3,
+		.tap	= { 375 - 20, 4, 16 },
+
+	}, {
+		.key	= "\x1c\x92\x40\xa5\xeb\x55\xd3\x8a"
+			  "\xf3\x33\x88\x86\x04\xf6\xb5\xf0"
+			  "\x47\x39\x17\xc1\x40\x2b\x80\x09"
+			  "\x9d\xca\x5c\xbc\x20\x70\x75\xc0",
+		.klen	= 32,
+		.iv	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x02\x76\x5a\x2e\x63"
+			  "\x33\x9f\xc9\x9a\x66\x32\x0d\xb7"
+			  "\x2a\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x27\x54\x77\x61\x73\x20\x62\x72"
+			  "\x69\x6c\x6c\x69\x67\x2c\x20\x61"
+			  "\x6e\x64\x20\x74\x68\x65\x20\x73"
+			  "\x6c\x69\x74\x68\x79\x20\x74\x6f"
+			  "\x76\x65\x73\x0a\x44\x69\x64\x20"
+			  "\x67\x79\x72\x65\x20\x61\x6e\x64"
+			  "\x20\x67\x69\x6d\x62\x6c\x65\x20"
+			  "\x69\x6e\x20\x74\x68\x65\x20\x77"
+			  "\x61\x62\x65\x3a\x0a\x41\x6c\x6c"
+			  "\x20\x6d\x69\x6d\x73\x79\x20\x77"
+			  "\x65\x72\x65\x20\x74\x68\x65\x20"
+			  "\x62\x6f\x72\x6f\x67\x6f\x76\x65"
+			  "\x73\x2c\x0a\x41\x6e\x64\x20\x74"
+			  "\x68\x65\x20\x6d\x6f\x6d\x65\x20"
+			  "\x72\x61\x74\x68\x73\x20\x6f\x75"
+			  "\x74\x67\x72\x61\x62\x65\x2e",
+		.ctext	= "\xb9\x68\xbc\x6a\x24\xbc\xcc\xd8"
+			  "\x9b\x2a\x8d\x5b\x96\xaf\x56\xe3"
+			  "\x11\x61\xe7\xa7\x9b\xce\x4e\x7d"
+			  "\x60\x02\x48\xac\xeb\xd5\x3a\x26"
+			  "\x9d\x77\x3b\xb5\x32\x13\x86\x8e"
+			  "\x20\x82\x26\x72\xae\x64\x1b\x7e"
+			  "\x2e\x01\x68\xb4\x87\x45\xa1\x24"
+			  "\xe4\x48\x40\xf0\xaa\xac\xee\xa9"
+			  "\xfc\x31\xad\x9d\x89\xa3\xbb\xd2"
+			  "\xe4\x25\x13\xad\x0f\x5e\xdf\x3c"
+			  "\x27\xab\xb8\x62\x46\x22\x30\x48"
+			  "\x55\x2c\x4e\x84\x78\x1d\x0d\x34"
+			  "\x8d\x3c\x91\x0a\x7f\x5b\x19\x9f"
+			  "\x97\x05\x4c\xa7\x62\x47\x8b\xc5"
+			  "\x44\x2e\x20\x33\xdd\xa0\x82\xa9"
+			  "\x25\x76\x37\xe6\x3c\x67\x5b",
+		.len	= 127,
+	}, {
+		.key	= "\x1c\x92\x40\xa5\xeb\x55\xd3\x8a"
+			  "\xf3\x33\x88\x86\x04\xf6\xb5\xf0"
+			  "\x47\x39\x17\xc1\x40\x2b\x80\x09"
+			  "\x9d\xca\x5c\xbc\x20\x70\x75\xc0",
+		.klen	= 32,
+		.iv	= "\x00\x00\x00\x00\x00\x00\x00\x00"
+			  "\x00\x00\x00\x01\x31\x58\xa3\x5a"
+			  "\x25\x5d\x05\x17\x58\xe9\x5e\xd4"
+			  "\x1c\x00\x00\x00\x00\x00\x00\x00",
+		.ptext	= "\x49\xee\xe0\xdc\x24\x90\x40\xcd"
+			  "\xc5\x40\x8f\x47\x05\xbc\xdd\x81"
+			  "\x47\xc6\x8d\xe6\xb1\x8f\xd7\xcb"
+			  "\x09\x0e\x6e\x22\x48\x1f\xbf\xb8"
+			  "\x5c\xf7\x1e\x8a\xc1\x23\xf2\xd4"
+			  "\x19\x4b\x01\x0f\x4e\xa4\x43\xce"
+			  "\x01\xc6\x67\xda\x03\x91\x18\x90"
+			  "\xa5\xa4\x8e\x45\x03\xb3\x2d\xac"
+			  "\x74\x92\xd3\x53\x47\xc8\xdd\x25"
+			  "\x53\x6c\x02\x03\x87\x0d\x11\x0c"
+			  "\x58\xe3\x12\x18\xfd\x2a\x5b\x40"
+			  "\x0c\x30\xf0\xb8\x3f\x43\xce\xae"
+			  "\x65\x3a\x7d\x7c\xf4\x54\xaa\xcc"
+			  "\x33\x97\xc3\x77\xba\xc5\x70\xde"
+			  "\xd7\xd5\x13\xa5\x65\xc4\x5f\x0f"
+			  "\x46\x1a\x0d\x97\xb5\xf3\xbb\x3c"
+			  "\x84\x0f\x2b\xc5\xaa\xea\xf2\x6c"
+			  "\xc9\xb5\x0c\xee\x15\xf3\x7d\xbe"
+			  "\x9f\x7b\x5a\xa6\xae\x4f\x83\xb6"
+			  "\x79\x49\x41\xf4\x58\x18\xcb\x86"
+			  "\x7f\x30\x0e\xf8\x7d\x44\x36\xea"
+			  "\x75\xeb\x88\x84\x40\x3c\xad\x4f"
+			  "\x6f\x31\x6b\xaa\x5d\xe5\xa5\xc5"
+			  "\x21\x66\xe9\xa7\xe3\xb2\x15\x88"
+			  "\x78\xf6\x79\xa1\x59\x47\x12\x4e"
+			  "\x9f\x9f\x64\x1a\xa0\x22\x5b\x08"
+			  "\xbe\x7c\x36\xc2\x2b\x66\x33\x1b"
+			  "\xdd\x60\x71\xf7\x47\x8c\x61\xc3"
+			  "\xda\x8a\x78\x1e\x16\xfa\x1e\x86"
+			  "\x81\xa6\x17\x2a\xa7\xb5\xc2\xe7"
+			  "\xa4\xc7\x42\xf1\xcf\x6a\xca\xb4"
+			  "\x45\xcf\xf3\x93\xf0\xe7\xea\xf6"
+			  "\xf4\xe6\x33\x43\x84\x93\xa5\x67"
+			  "\x9b\x16\x58\x58\x80\x0f\x2b\x5c"
+			  "\x24\x74\x75\x7f\x95\x81\xb7\x30"
+			  "\x7a\x33\xa7\xf7\x94\x87\x32\x27"
+			  "\x10\x5d\x14\x4c\x43\x29\xdd\x26"
+			  "\xbd\x3e\x3c\x0e\xfe\x0e\xa5\x10"
+			  "\xea\x6b\x64\xfd\x73\xc6\xed\xec"
+			  "\xa8\xc9\xbf\xb3\xba\x0b\x4d\x07"
+			  "\x70\xfc\x16\xfd\x79\x1e\xd7\xc5"
+			  "\x49\x4e\x1c\x8b\x8d\x79\x1b\xb1"
+			  "\xec\xca\x60\x09\x4c\x6a\xd5\x09"
+			  "\x49\x46\x00\x88\x22\x8d\xce\xea"
+			  "\xb1\x17\x11\xde\x42\xd2\x23\xc1"
+			  "\x72\x11\xf5\x50\x73\x04\x40\x47"
+			  "\xf9\x5d\xe7\xa7\x26\xb1\x7e\xb0"
+			  "\x3f\x58\xc1\x52\xab\x12\x67\x9d"
+			  "\x3f\x43\x4b\x68\xd4\x9c\x68\x38"
+			  "\x07\x8a\x2d\x3e\xf3\xaf\x6a\x4b"
+			  "\xf9\xe5\x31\x69\x22\xf9\xa6\x69"
+			  "\xc6\x9c\x96\x9a\x12\x35\x95\x1d"
+			  "\x95\xd5\xdd\xbe\xbf\x93\x53\x24"
+			  "\xfd\xeb\xc2\x0a\x64\xb0\x77\x00"
+			  "\x6f\x88\xc4\x37\x18\x69\x7c\xd7"
+			  "\x41\x92\x55\x4c\x03\xa1\x9a\x4b"
+			  "\x15\xe5\xdf\x7f\x37\x33\x72\xc1"
+			  "\x8b\x10\x67\xa3\x01\x57\x94\x25"
+			  "\x7b\x38\x71\x7e\xdd\x1e\xcc\x73"
+			  "\x55\xd2\x8e\xeb\x07\xdd\xf1\xda"
+			  "\x58\xb1\x47\x90\xfe\x42\x21\x72"
+			  "\xa3\x54\x7a\xa0\x40\xec\x9f\xdd"
+			  "\xc6\x84\x6e\xca\xae\xe3\x68\xb4"
+			  "\x9d\xe4\x78\xff\x57\xf2\xf8\x1b"
+			  "\x03\xa1\x31\xd9\xde\x8d\xf5\x22"
+			  "\x9c\xdd\x20\xa4\x1e\x27\xb1\x76"
+			  "\x4f\x44\x55\xe2\x9b\xa1\x9c\xfe"
+			  "\x54\xf7\x27\x1b\xf4\xde\x02\xf5"
+			  "\x1b\x55\x48\x5c\xdc\x21\x4b\x9e"
+			  "\x4b\x6e\xed\x46\x23\xdc\x65\xb2"
+			  "\xcf\x79\x5f\x28\xe0\x9e\x8b\xe7"
+			  "\x4c\x9d\x8a\xff\xc1\xa6\x28\xb8"
+			  "\x65\x69\x8a\x45\x29\xef\x74\x85"
+			  "\xde\x79\xc7\x08\xae\x30\xb0\xf4"
+			  "\xa3\x1d\x51\x41\xab\xce\xcb\xf6"
+			  "\xb5\xd8\x6d\xe0\x85\xe1\x98\xb3"
+			  "\x43\xbb\x86\x83\x0a\xa0\xf5\xb7"
+			  "\x04\x0b\xfa\x71\x1f\xb0\xf6\xd9"
+			  "\x13\x00\x15\xf0\xc7\xeb\x0d\x5a"
+			  "\x9f\xd7\xb9\x6c\x65\x14\x22\x45"
+			  "\x6e\x45\x32\x3e\x7e\x60\x1a\x12"
+			  "\x97\x82\x14\xfb\xaa\x04\x22\xfa"
+			  "\xa0\xe5\x7e\x8c\x78\x02\x48\x5d"
+			  "\x78\x33\x5a\x7c\xad\xdb\x29\xce"
+			  "\xbb\x8b\x61\xa4\xb7\x42\xe2\xac"
+			  "\x8b\x1a\xd9\x2f\x0b\x8b\x62\x21"
+			  "\x83\x35\x7e\xad\x73\xc2\xb5\x6c"
+			  "\x10\x26\x38\x07\xe5\xc7\x36\x80"
+			  "\xe2\x23\x12\x61\xf5\x48\x4b\x2b"
+			  "\xc5\xdf\x15\xd9\x87\x01\xaa\xac"
+			  "\x1e\x7c\xad\x73\x78\x18\x63\xe0"
+			  "\x8b\x9f\x81\xd8\x12\x6a\x28\x10"
+			  "\xbe\x04\x68\x8a\x09\x7c\x1b\x1c"
+			  "\x83\x66\x80\x47\x80\xe8\xfd\x35"
+			  "\x1c\x97\x6f\xae\x49\x10\x66\xcc"
+			  "\xc6\xd8\xcc\x3a\x84\x91\x20\x77"
+			  "\x72\xe4\x24\xd2\x37\x9f\xc5\xc9"
+			  "\x25\x94\x10\x5f\x40\x00\x64\x99"
+			  "\xdc\xae\xd7\x21\x09\x78\x50\x15"
+			  "\xac\x5f\xc6\x2c\xa2\x0b\xa9\x39"
+			  "\x87\x6e\x6d\xab\xde\x08\x51\x16"
+			  "\xc7\x13\xe9\xea\xed\x06\x8e\x2c"
+			  "\xf8\x37\x8c\xf0\xa6\x96\x8d\x43"
+			  "\xb6\x98\x37\xb2\x43\xed\xde\xdf"
+			  "\x89\x1a\xe7\xeb\x9d\xa1\x7b\x0b"
+			  "\x77\xb0\xe2\x75\xc0\xf1\x98\xd9"
+			  "\x80\x55\xc9\x34\x91\xd1\x59\xe8"
+			  "\x4b\x0f\xc1\xa9\x4b\x7a\x84\x06"
+			  "\x20\xa8\x5d\xfa\xd1\xde\x70\x56"
+			  "\x2f\x9e\x91\x9c\x20\xb3\x24\xd8"
+			  "\x84\x3d\xe1\x8c\x7e\x62\x52\xe5"
+			  "\x44\x4b\x9f\xc2\x93\x03\xea\x2b"
+			  "\x59\xc5\xfa\x3f\x91\x2b\xbb\x23"
+			  "\xf5\xb2\x7b\xf5\x38\xaf\xb3\xee"
+			  "\x63\xdc\x7b\xd1\xff\xaa\x8b\xab"
+			  "\x82\x6b\x37\x04\xeb\x74\xbe\x79"
+			  "\xb9\x83\x90\xef\x20\x59\x46\xff"
+			  "\xe9\x97\x3e\x2f\xee\xb6\x64\x18"
+			  "\x38\x4c\x7a\x4a\xf9\x61\xe8\x9a"
+			  "\xa1\xb5\x01\xa6\x47\xd3\x11\xd4"
+			  "\xce\xd3\x91\x49\x88\xc7\xb8\x4d"
+			  "\xb1\xb9\x07\x6d\x16\x72\xae\x46"
+			  "\x5e\x03\xa1\x4b\xb6\x02\x30\xa8"
+			  "\x3d\xa9\x07\x2a\x7c\x19\xe7\x62"
+			  "\x87\xe3\x82\x2f\x6f\xe1\x09\xd9"
+			  "\x94\x97\xea\xdd\x58\x9e\xae\x76"
+			  "\x7e\x35\xe5\xb4\xda\x7e\xf4\xde"
+			  "\xf7\x32\x87\xcd\x93\xbf\x11\x56"
+			  "\x11\xbe\x08\x74\xe1\x69\xad\xe2"
+			  "\xd7\xf8\x86\x75\x8a\x3c\xa4\xbe"
+			  "\x70\xa7\x1b\xfc\x0b\x44\x2a\x76"
+			  "\x35\xea\x5d\x85\x81\xaf\x85\xeb"
+			  "\xa0\x1c\x61\xc2\xf7\x4f\xa5\xdc"
+			  "\x02\x7f\xf6\x95\x40\x6e\x8a\x9a"
+			  "\xf3\x5d\x25\x6e\x14\x3a\x22\xc9"
+			  "\x37\x1c\xeb\x46\x54\x3f\xa5\x91"
+			  "\xc2\xb5\x8c\xfe\x53\x08\x97\x32"
+			  "\x1b\xb2\x30\x27\xfe\x25\x5d\xdc"
+			  "\x08\x87\xd0\xe5\x94\x1a\xd4\xf1"
+			  "\xfe\xd6\xb4\xa3\xe6\x74\x81\x3c"
+			  "\x1b\xb7\x31\xa7\x22\xfd\xd4\xdd"
+			  "\x20\x4e\x7c\x51\xb0\x60\x73\xb8"
+			  "\x9c\xac\x91\x90\x7e\x01\xb0\xe1"
+			  "\x8a\x2f\x75\x1c\x53\x2a\x98\x2a"
+			  "\x06\x52\x95\x52\xb2\xe9\x25\x2e"
+			  "\x4c\xe2\x5a\x00\xb2\x13\x81\x03"
+			  "\x77\x66\x0d\xa5\x99\xda\x4e\x8c"
+			  "\xac\xf3\x13\x53\x27\x45\xaf\x64"
+			  "\x46\xdc\xea\x23\xda\x97\xd1\xab"
+			  "\x7d\x6c\x30\x96\x1f\xbc\x06\x34"
+			  "\x18\x0b\x5e\x21\x35\x11\x8d\x4c"
+			  "\xe0\x2d\xe9\x50\x16\x74\x81\xa8"
+			  "\xb4\x34\xb9\x72\x42\xa6\xcc\xbc"
+			  "\xca\x34\x83\x27\x10\x5b\x68\x45"
+			  "\x8f\x52\x22\x0c\x55\x3d\x29\x7c"
+			  "\xe3\xc0\x66\x05\x42\x91\x5f\x58"
+			  "\xfe\x4a\x62\xd9\x8c\xa9\x04\x19"
+			  "\x04\xa9\x08\x4b\x57\xfc\x67\x53"
+			  "\x08\x7c\xbc\x66\x8a\xb0\xb6\x9f"
+			  "\x92\xd6\x41\x7c\x5b\x2a\x00\x79"
+			  "\x72",
+		.ctext	= "\xe1\xb6\x8b\x5c\x80\xb8\xcc\x08"
+			  "\x1b\x84\xb2\xd1\xad\xa4\x70\xac"
+			  "\x67\xa9\x39\x27\xac\xb4\x5b\xb7"
+			  "\x4c\x26\x77\x23\x1d\xce\x0a\xbe"
+			  "\x18\x9e\x42\x8b\xbd\x7f\xd6\xf1"
+			  "\xf1\x6b\xe2\x6d\x7f\x92\x0e\xcb"
+			  "\xb8\x79\xba\xb4\xac\x7e\x2d\xc0"
+			  "\x9e\x83\x81\x91\xd5\xea\xc3\x12"
+			  "\x8d\xa4\x26\x70\xa4\xf9\x71\x0b"
+			  "\xbd\x2e\xe1\xb3\x80\x42\x25\xb3"
+			  "\x0b\x31\x99\xe1\x0d\xde\xa6\x90"
+			  "\xf2\xa3\x10\xf7\xe5\xf3\x83\x1e"
+			  "\x2c\xfb\x4d\xf0\x45\x3d\x28\x3c"
+			  "\xb8\xf1\xcb\xbf\x67\xd8\x43\x5a"
+			  "\x9d\x7b\x73\x29\x88\x0f\x13\x06"
+			  "\x37\x50\x0d\x7c\xe6\x9b\x07\xdd"
+			  "\x7e\x01\x1f\x81\x90\x10\x69\xdb"
+			  "\xa4\xad\x8a\x5e\xac\x30\x72\xf2"
+			  "\x36\xcd\xe3\x23\x49\x02\x93\xfa"
+			  "\x3d\xbb\xe2\x98\x83\xeb\xe9\x8d"
+			  "\xb3\x8f\x11\xaa\x53\xdb\xaf\x2e"
+			  "\x95\x13\x99\x3d\x71\xbd\x32\x92"
+			  "\xdd\xfc\x9d\x5e\x6f\x63\x2c\xee"
+			  "\x91\x1f\x4c\x64\x3d\x87\x55\x0f"
+			  "\xcc\x3d\x89\x61\x53\x02\x57\x8f"
+			  "\xe4\x77\x29\x32\xaf\xa6\x2f\x0a"
+			  "\xae\x3c\x3f\x3f\xf4\xfb\x65\x52"
+			  "\xc5\xc1\x78\x78\x53\x28\xad\xed"
+			  "\xd1\x67\x37\xc7\x59\x70\xcd\x0a"
+			  "\xb8\x0f\x80\x51\x9f\xc0\x12\x5e"
+			  "\x06\x0a\x7e\xec\x24\x5f\x73\x00"
+			  "\xb1\x0b\x31\x47\x4f\x73\x8d\xb4"
+			  "\xce\xf3\x55\x45\x6c\x84\x27\xba"
+			  "\xb9\x6f\x03\x4a\xeb\x98\x88\x6e"
+			  "\x53\xed\x25\x19\x0d\x8f\xfe\xca"
+			  "\x60\xe5\x00\x93\x6e\x3c\xff\x19"
+			  "\xae\x08\x3b\x8a\xa6\x84\x05\xfe"
+			  "\x9b\x59\xa0\x8c\xc8\x05\x45\xf5"
+			  "\x05\x37\xdc\x45\x6f\x8b\x95\x8c"
+			  "\x4e\x11\x45\x7a\xce\x21\xa5\xf7"
+			  "\x71\x67\xb9\xce\xd7\xf9\xe9\x5e"
+			  "\x60\xf5\x53\x7a\xa8\x85\x14\x03"
+			  "\xa0\x92\xec\xf3\x51\x80\x84\xc4"
+			  "\xdc\x11\x9e\x57\xce\x4b\x45\xcf"
+			  "\x90\x95\x85\x0b\x96\xe9\xee\x35"
+			  "\x10\xb8\x9b\xf2\x59\x4a\xc6\x7e"
+			  "\x85\xe5\x6f\x38\x51\x93\x40\x0c"
+			  "\x99\xd7\x7f\x32\xa8\x06\x27\xd1"
+			  "\x2b\xd5\xb5\x3a\x1a\xe1\x5e\xda"
+			  "\xcd\x5a\x50\x30\x3c\xc7\xe7\x65"
+			  "\xa6\x07\x0b\x98\x91\xc6\x20\x27"
+			  "\x2a\x03\x63\x1b\x1e\x3d\xaf\xc8"
+			  "\x71\x48\x46\x6a\x64\x28\xf9\x3d"
+			  "\xd1\x1d\xab\xc8\x40\x76\xc2\x39"
+			  "\x4e\x00\x75\xd2\x0e\x82\x58\x8c"
+			  "\xd3\x73\x5a\xea\x46\x89\xbe\xfd"
+			  "\x4e\x2c\x0d\x94\xaa\x9b\x68\xac"
+			  "\x86\x87\x30\x7e\xa9\x16\xcd\x59"
+			  "\xd2\xa6\xbe\x0a\xd8\xf5\xfd\x2d"
+			  "\x49\x69\xd2\x1a\x90\xd2\x1b\xed"
+			  "\xff\x71\x04\x87\x87\x21\xc4\xb8"
+			  "\x1f\x5b\x51\x33\xd0\xd6\x59\x9a"
+			  "\x03\x0e\xd3\x8b\xfb\x57\x73\xfd"
+			  "\x5a\x52\x63\x82\xc8\x85\x2f\xcb"
+			  "\x74\x6d\x4e\xd9\x68\x37\x85\x6a"
+			  "\xd4\xfb\x94\xed\x8d\xd1\x1a\xaf"
+			  "\x76\xa7\xb7\x88\xd0\x2b\x4e\xda"
+			  "\xec\x99\x94\x27\x6f\x87\x8c\xdf"
+			  "\x4b\x5e\xa6\x66\xdd\xcb\x33\x7b"
+			  "\x64\x94\x31\xa8\x37\xa6\x1d\xdb"
+			  "\x0d\x5c\x93\xa4\x40\xf9\x30\x53"
+			  "\x4b\x74\x8d\xdd\xf6\xde\x3c\xac"
+			  "\x5c\x80\x01\x3a\xef\xb1\x9a\x02"
+			  "\x0c\x22\x8e\xe7\x44\x09\x74\x4c"
+			  "\xf2\x9a\x27\x69\x7f\x12\x32\x36"
+			  "\xde\x92\xdf\xde\x8f\x5b\x31\xab"
+			  "\x4a\x01\x26\xe0\xb1\xda\xe8\x37"
+			  "\x21\x64\xe8\xff\x69\xfc\x9e\x41"
+			  "\xd2\x96\x2d\x18\x64\x98\x33\x78"
+			  "\x24\x61\x73\x9b\x47\x29\xf1\xa7"
+			  "\xcb\x27\x0f\xf0\x85\x6d\x8c\x9d"
+			  "\x2c\x95\x9e\xe5\xb2\x8e\x30\x29"
+			  "\x78\x8a\x9d\x65\xb4\x8e\xde\x7b"
+			  "\xd9\x00\x50\xf5\x7f\x81\xc3\x1b"
+			  "\x25\x85\xeb\xc2\x8c\x33\x22\x1e"
+			  "\x68\x38\x22\x30\xd8\x2e\x00\x98"
+			  "\x85\x16\x06\x56\xb4\x81\x74\x20"
+			  "\x95\xdb\x1c\x05\x19\xe8\x23\x4d"
+			  "\x65\x5d\xcc\xd8\x7f\xc4\x2d\x0f"
+			  "\x57\x26\x71\x07\xad\xaa\x71\x9f"
+			  "\x19\x76\x2f\x25\x51\x88\xe4\xc0"
+			  "\x82\x6e\x08\x05\x37\x04\xee\x25"
+			  "\x23\x90\xe9\x4e\xce\x9b\x16\xc1"
+			  "\x31\xe7\x6e\x2c\x1b\xe1\x85\x9a"
+			  "\x0c\x8c\xbb\x12\x1e\x68\x7b\x93"
+			  "\xa9\x3c\x39\x56\x23\x3e\x6e\xc7"
+			  "\x77\x84\xd3\xe0\x86\x59\xaa\xb9"
+			  "\xd5\x53\x58\xc9\x0a\x83\x5f\x85"
+			  "\xd8\x47\x14\x67\x8a\x3c\x17\xe0"
+			  "\xab\x02\x51\xea\xf1\xf0\x4f\x30"
+			  "\x7d\xe0\x92\xc2\x5f\xfb\x19\x5a"
+			  "\x3f\xbd\xf4\x39\xa4\x31\x0c\x39"
+			  "\xd1\xae\x4e\xf7\x65\x7f\x1f\xce"
+			  "\xc2\x39\xd1\x84\xd4\xe5\x02\xe0"
+			  "\x58\xaa\xf1\x5e\x81\xaf\x7f\x72"
+			  "\x0f\x08\x99\x43\xb9\xd8\xac\x41"
+			  "\x35\x55\xf2\xb2\xd4\x98\xb8\x3b"
+			  "\x2b\x3c\x3e\x16\x06\x31\xfc\x79"
+			  "\x47\x38\x63\x51\xc5\xd0\x26\xd7"
+			  "\x43\xb4\x2b\xd9\xc5\x05\xf2\x9d"
+			  "\x18\xc9\x26\x82\x56\xd2\x11\x05"
+			  "\xb6\x89\xb4\x43\x9c\xb5\x9d\x11"
+			  "\x6c\x83\x37\x71\x27\x1c\xae\xbf"
+			  "\xcd\x57\xd2\xee\x0d\x5a\x15\x26"
+			  "\x67\x88\x80\x80\x1b\xdc\xc1\x62"
+			  "\xdd\x4c\xff\x92\x5c\x6c\xe1\xa0"
+			  "\xe3\x79\xa9\x65\x8c\x8c\x14\x42"
+			  "\xe5\x11\xd2\x1a\xad\xa9\x56\x6f"
+			  "\x98\xfc\x8a\x7b\x56\x1f\xc6\xc1"
+			  "\x52\x12\x92\x9b\x41\x0f\x4b\xae"
+			  "\x1b\x4a\xbc\xfe\x23\xb6\x94\x70"
+			  "\x04\x30\x9e\x69\x47\xbe\xb8\x8f"
+			  "\xca\x45\xd7\x8a\xf4\x78\x3e\xaa"
+			  "\x71\x17\xd8\x1e\xb8\x11\x8f\xbc"
+			  "\xc8\x1a\x65\x7b\x41\x89\x72\xc7"
+			  "\x5f\xbe\xc5\x2a\xdb\x5c\x54\xf9"
+			  "\x25\xa3\x7a\x80\x56\x9c\x8c\xab"
+			  "\x26\x19\x10\x36\xa6\xf3\x14\x79"
+			  "\x40\x98\x70\x68\xb7\x35\xd9\xb9"
+			  "\x27\xd4\xe7\x74\x5b\x3d\x97\xb4"
+			  "\xd9\xaa\xd9\xf2\xb5\x14\x84\x1f"
+			  "\xa9\xde\x12\x44\x5b\x00\xc0\xbc"
+			  "\xc8\x11\x25\x1b\x67\x7a\x15\x72"
+			  "\xa6\x31\x6f\xf4\x68\x7a\x86\x9d"
+			  "\x43\x1c\x5f\x16\xd3\xad\x2e\x52"
+			  "\xf3\xb4\xc3\xfa\x27\x2e\x68\x6c"
+			  "\x06\xe7\x4c\x4f\xa2\xe0\xe4\x21"
+			  "\x5d\x9e\x33\x58\x8d\xbf\xd5\x70"
+			  "\xf8\x80\xa5\xdd\xe7\x18\x79\xfa"
+			  "\x7b\xfd\x09\x69\x2c\x37\x32\xa8"
+			  "\x65\xfa\x8d\x8b\x5c\xcc\xe8\xf3"
+			  "\x37\xf6\xa6\xc6\x5c\xa2\x66\x79"
+			  "\xfa\x8a\xa7\xd1\x0b\x2e\x1b\x5e"
+			  "\x95\x35\x00\x76\xae\x42\xf7\x50"
+			  "\x51\x78\xfb\xb4\x28\x24\xde\x1a"
+			  "\x70\x8b\xed\xca\x3c\x5e\xe4\xbd"
+			  "\x28\xb5\xf3\x76\x4f\x67\x5d\x81"
+			  "\xb2\x60\x87\xd9\x7b\x19\x1a\xa7"
+			  "\x79\xa2\xfa\x3f\x9e\xa9\xd7\x25"
+			  "\x61\xe1\x74\x31\xa2\x77\xa0\x1b"
+			  "\xf6\xf7\xcb\xc5\xaa\x9e\xce\xf9"
+			  "\x9b\x96\xef\x51\xc3\x1a\x44\x96"
+			  "\xae\x17\x50\xab\x29\x08\xda\xcc"
+			  "\x1a\xb3\x12\xd0\x24\xe4\xe2\xe0"
+			  "\xc6\xe3\xcc\x82\xd0\xba\x47\x4c"
+			  "\x3f\x49\xd7\xe8\xb6\x61\xaa\x65"
+			  "\x25\x18\x40\x2d\x62\x25\x02\x71"
+			  "\x61\xa2\xc1\xb2\x13\xd2\x71\x3f"
+			  "\x43\x1a\xc9\x09\x92\xff\xd5\x57"
+			  "\xf0\xfc\x5e\x1c\xf1\xf5\xf9\xf3"
+			  "\x5b",
+		.len	= 1281,
+		.also_non_np = 1,
+		.np	= 3,
+		.tap	= { 1200, 1, 80 },
+	},
+};
+
+/* Adiantum test vectors from https://github.com/google/adiantum */
+static const struct cipher_testvec adiantum_xchacha12_aes_tv_template[] = {
+	{
+		.key	= "\x9e\xeb\xb2\x49\x3c\x1c\xf5\xf4"
+			  "\x6a\x99\xc2\xc4\xdf\xb1\xf4\xdd"
+			  "\x75\x20\x57\xea\x2c\x4f\xcd\xb2"
+			  "\xa5\x3d\x7b\x49\x1e\xab\xfd\x0f",
+		.klen	= 32,
+		.iv	= "\xdf\x63\xd4\xab\xd2\x49\xf3\xd8"
+			  "\x33\x81\x37\x60\x7d\xfa\x73\x08"
+			  "\xd8\x49\x6d\x80\xe8\x2f\x62\x54"
+			  "\xeb\x0e\xa9\x39\x5b\x45\x7f\x8a",
+		.ptext	= "\x67\xc9\xf2\x30\x84\x41\x8e\x43"
+			  "\xfb\xf3\xb3\x3e\x79\x36\x7f\xe8",
+		.ctext	= "\x6d\x32\x86\x18\x67\x86\x0f\x3f"
+			  "\x96\x7c\x9d\x28\x0d\x53\xec\x9f",
+		.len	= 16,
+		.also_non_np = 1,
+		.np	= 2,
+		.tap	= { 14, 2 },
+	}, {
+		.key	= "\x36\x2b\x57\x97\xf8\x5d\xcd\x99"
+			  "\x5f\x1a\x5a\x44\x1d\x92\x0f\x27"
+			  "\xcc\x16\xd7\x2b\x85\x63\x99\xd3"
+			  "\xba\x96\xa1\xdb\xd2\x60\x68\xda",
+		.klen	= 32,
+		.iv	= "\xef\x58\x69\xb1\x2c\x5e\x9a\x47"
+			  "\x24\xc1\xb1\x69\xe1\x12\x93\x8f"
+			  "\x43\x3d\x6d\x00\xdb\x5e\xd8\xd9"
+			  "\x12\x9a\xfe\xd9\xff\x2d\xaa\xc4",
+		.ptext	= "\x5e\xa8\x68\x19\x85\x98\x12\x23"
+			  "\x26\x0a\xcc\xdb\x0a\x04\xb9\xdf"
+			  "\x4d\xb3\x48\x7b\xb0\xe3\xc8\x19"
+			  "\x43\x5a\x46\x06\x94\x2d\xf2",
+		.ctext	= "\xc7\xc6\xf1\x73\x8f\xc4\xff\x4a"
+			  "\x39\xbe\x78\xbe\x8d\x28\xc8\x89"
+			  "\x46\x63\xe7\x0c\x7d\x87\xe8\x4e"
+			  "\xc9\x18\x7b\xbe\x18\x60\x50",
+		.len	= 31,
+	}, {
+		.key	= "\xa5\x28\x24\x34\x1a\x3c\xd8\xf7"
+			  "\x05\x91\x8f\xee\x85\x1f\x35\x7f"
+			  "\x80\x3d\xfc\x9b\x94\xf6\xfc\x9e"
+			  "\x19\x09\x00\xa9\x04\x31\x4f\x11",
+		.klen	= 32,
+		.iv	= "\xa1\xba\x49\x95\xff\x34\x6d\xb8"
+			  "\xcd\x87\x5d\x5e\xfd\xea\x85\xdb"
+			  "\x8a\x7b\x5e\xb2\x5d\x57\xdd\x62"
+			  "\xac\xa9\x8c\x41\x42\x94\x75\xb7",
+		.ptext	= "\x69\xb4\xe8\x8c\x37\xe8\x67\x82"
+			  "\xf1\xec\x5d\x04\xe5\x14\x91\x13"
+			  "\xdf\xf2\x87\x1b\x69\x81\x1d\x71"
+			  "\x70\x9e\x9c\x3b\xde\x49\x70\x11"
+			  "\xa0\xa3\xdb\x0d\x54\x4f\x66\x69"
+			  "\xd7\xdb\x80\xa7\x70\x92\x68\xce"
+			  "\x81\x04\x2c\xc6\xab\xae\xe5\x60"
+			  "\x15\xe9\x6f\xef\xaa\x8f\xa7\xa7"
+			  "\x63\x8f\xf2\xf0\x77\xf1\xa8\xea"
+			  "\xe1\xb7\x1f\x9e\xab\x9e\x4b\x3f"
+			  "\x07\x87\x5b\x6f\xcd\xa8\xaf\xb9"
+			  "\xfa\x70\x0b\x52\xb8\xa8\xa7\x9e"
+			  "\x07\x5f\xa6\x0e\xb3\x9b\x79\x13"
+			  "\x79\xc3\x3e\x8d\x1c\x2c\x68\xc8"
+			  "\x51\x1d\x3c\x7b\x7d\x79\x77\x2a"
+			  "\x56\x65\xc5\x54\x23\x28\xb0\x03",
+		.ctext	= "\x9e\x16\xab\xed\x4b\xa7\x42\x5a"
+			  "\xc6\xfb\x4e\x76\xff\xbe\x03\xa0"
+			  "\x0f\xe3\xad\xba\xe4\x98\x2b\x0e"
+			  "\x21\x48\xa0\xb8\x65\x48\x27\x48"
+			  "\x84\x54\x54\xb2\x9a\x94\x7b\xe6"
+			  "\x4b\x29\xe9\xcf\x05\x91\x80\x1a"
+			  "\x3a\xf3\x41\x96\x85\x1d\x9f\x74"
+			  "\x51\x56\x63\xfa\x7c\x28\x85\x49"
+			  "\xf7\x2f\xf9\xf2\x18\x46\xf5\x33"
+			  "\x80\xa3\x3c\xce\xb2\x57\x93\xf5"
+			  "\xae\xbd\xa9\xf5\x7b\x30\xc4\x93"
+			  "\x66\xe0\x30\x77\x16\xe4\xa0\x31"
+			  "\xba\x70\xbc\x68\x13\xf5\xb0\x9a"
+			  "\xc1\xfc\x7e\xfe\x55\x80\x5c\x48"
+			  "\x74\xa6\xaa\xa3\xac\xdc\xc2\xf5"
+			  "\x8d\xde\x34\x86\x78\x60\x75\x8d",
+		.len	= 128,
+		.also_non_np = 1,
+		.np	= 4,
+		.tap	= { 104, 16, 4, 4 },
+	}, {
+		.key	= "\xd3\x81\x72\x18\x23\xff\x6f\x4a"
+			  "\x25\x74\x29\x0d\x51\x8a\x0e\x13"
+			  "\xc1\x53\x5d\x30\x8d\xee\x75\x0d"
+			  "\x14\xd6\x69\xc9\x15\xa9\x0c\x60",
+		.klen	= 32,
+		.iv	= "\x65\x9b\xd4\xa8\x7d\x29\x1d\xf4"
+			  "\xc4\xd6\x9b\x6a\x28\xab\x64\xe2"
+			  "\x62\x81\x97\xc5\x81\xaa\xf9\x44"
+			  "\xc1\x72\x59\x82\xaf\x16\xc8\x2c",
+		.ptext	= "\xc7\x6b\x52\x6a\x10\xf0\xcc\x09"
+			  "\xc1\x12\x1d\x6d\x21\xa6\x78\xf5"
+			  "\x05\xa3\x69\x60\x91\x36\x98\x57"
+			  "\xba\x0c\x14\xcc\xf3\x2d\x73\x03"
+			  "\xc6\xb2\x5f\xc8\x16\x27\x37\x5d"
+			  "\xd0\x0b\x87\xb2\x50\x94\x7b\x58"
+			  "\x04\xf4\xe0\x7f\x6e\x57\x8e\xc9"
+			  "\x41\x84\xc1\xb1\x7e\x4b\x91\x12"
+			  "\x3a\x8b\x5d\x50\x82\x7b\xcb\xd9"
+			  "\x9a\xd9\x4e\x18\x06\x23\x9e\xd4"
+			  "\xa5\x20\x98\xef\xb5\xda\xe5\xc0"
+			  "\x8a\x6a\x83\x77\x15\x84\x1e\xae"
+			  "\x78\x94\x9d\xdf\xb7\xd1\xea\x67"
+			  "\xaa\xb0\x14\x15\xfa\x67\x21\x84"
+			  "\xd3\x41\x2a\xce\xba\x4b\x4a\xe8"
+			  "\x95\x62\xa9\x55\xf0\x80\xad\xbd"
+			  "\xab\xaf\xdd\x4f\xa5\x7c\x13\x36"
+			  "\xed\x5e\x4f\x72\xad\x4b\xf1\xd0"
+			  "\x88\x4e\xec\x2c\x88\x10\x5e\xea"
+			  "\x12\xc0\x16\x01\x29\xa3\xa0\x55"
+			  "\xaa\x68\xf3\xe9\x9d\x3b\x0d\x3b"
+			  "\x6d\xec\xf8\xa0\x2d\xf0\x90\x8d"
+			  "\x1c\xe2\x88\xd4\x24\x71\xf9\xb3"
+			  "\xc1\x9f\xc5\xd6\x76\x70\xc5\x2e"
+			  "\x9c\xac\xdb\x90\xbd\x83\x72\xba"
+			  "\x6e\xb5\xa5\x53\x83\xa9\xa5\xbf"
+			  "\x7d\x06\x0e\x3c\x2a\xd2\x04\xb5"
+			  "\x1e\x19\x38\x09\x16\xd2\x82\x1f"
+			  "\x75\x18\x56\xb8\x96\x0b\xa6\xf9"
+			  "\xcf\x62\xd9\x32\x5d\xa9\xd7\x1d"
+			  "\xec\xe4\xdf\x1b\xbe\xf1\x36\xee"
+			  "\xe3\x7b\xb5\x2f\xee\xf8\x53\x3d"
+			  "\x6a\xb7\x70\xa9\xfc\x9c\x57\x25"
+			  "\xf2\x89\x10\xd3\xb8\xa8\x8c\x30"
+			  "\xae\x23\x4f\x0e\x13\x66\x4f\xe1"
+			  "\xb6\xc0\xe4\xf8\xef\x93\xbd\x6e"
+			  "\x15\x85\x6b\xe3\x60\x81\x1d\x68"
+			  "\xd7\x31\x87\x89\x09\xab\xd5\x96"
+			  "\x1d\xf3\x6d\x67\x80\xca\x07\x31"
+			  "\x5d\xa7\xe4\xfb\x3e\xf2\x9b\x33"
+			  "\x52\x18\xc8\x30\xfe\x2d\xca\x1e"
+			  "\x79\x92\x7a\x60\x5c\xb6\x58\x87"
+			  "\xa4\x36\xa2\x67\x92\x8b\xa4\xb7"
+			  "\xf1\x86\xdf\xdc\xc0\x7e\x8f\x63"
+			  "\xd2\xa2\xdc\x78\xeb\x4f\xd8\x96"
+			  "\x47\xca\xb8\x91\xf9\xf7\x94\x21"
+			  "\x5f\x9a\x9f\x5b\xb8\x40\x41\x4b"
+			  "\x66\x69\x6a\x72\xd0\xcb\x70\xb7"
+			  "\x93\xb5\x37\x96\x05\x37\x4f\xe5"
+			  "\x8c\xa7\x5a\x4e\x8b\xb7\x84\xea"
+			  "\xc7\xfc\x19\x6e\x1f\x5a\xa1\xac"
+			  "\x18\x7d\x52\x3b\xb3\x34\x62\x99"
+			  "\xe4\x9e\x31\x04\x3f\xc0\x8d\x84"
+			  "\x17\x7c\x25\x48\x52\x67\x11\x27"
+			  "\x67\xbb\x5a\x85\xca\x56\xb2\x5c"
+			  "\xe6\xec\xd5\x96\x3d\x15\xfc\xfb"
+			  "\x22\x25\xf4\x13\xe5\x93\x4b\x9a"
+			  "\x77\xf1\x52\x18\xfa\x16\x5e\x49"
+			  "\x03\x45\xa8\x08\xfa\xb3\x41\x92"
+			  "\x79\x50\x33\xca\xd0\xd7\x42\x55"
+			  "\xc3\x9a\x0c\x4e\xd9\xa4\x3c\x86"
+			  "\x80\x9f\x53\xd1\xa4\x2e\xd1\xbc"
+			  "\xf1\x54\x6e\x93\xa4\x65\x99\x8e"
+			  "\xdf\x29\xc0\x64\x63\x07\xbb\xea",
+		.ctext	= "\x15\x97\xd0\x86\x18\x03\x9c\x51"
+			  "\xc5\x11\x36\x62\x13\x92\xe6\x73"
+			  "\x29\x79\xde\xa1\x00\x3e\x08\x64"
+			  "\x17\x1a\xbc\xd5\xfe\x33\x0e\x0c"
+			  "\x7c\x94\xa7\xc6\x3c\xbe\xac\xa2"
+			  "\x89\xe6\xbc\xdf\x0c\x33\x27\x42"
+			  "\x46\x73\x2f\xba\x4e\xa6\x46\x8f"
+			  "\xe4\xee\x39\x63\x42\x65\xa3\x88"
+			  "\x7a\xad\x33\x23\xa9\xa7\x20\x7f"
+			  "\x0b\xe6\x6a\xc3\x60\xda\x9e\xb4"
+			  "\xd6\x07\x8a\x77\x26\xd1\xab\x44"
+			  "\x99\x55\x03\x5e\xed\x8d\x7b\xbd"
+			  "\xc8\x21\xb7\x21\x30\x3f\xc0\xb5"
+			  "\xc8\xec\x6c\x23\xa6\xa3\x6d\xf1"
+			  "\x30\x0a\xd0\xa6\xa9\x28\x69\xae"
+			  "\x2a\xe6\x54\xac\x82\x9d\x6a\x95"
+			  "\x6f\x06\x44\xc5\x5a\x77\x6e\xec"
+			  "\xf8\xf8\x63\xb2\xe6\xaa\xbd\x8e"
+			  "\x0e\x8a\x62\x00\x03\xc8\x84\xdd"
+			  "\x47\x4a\xc3\x55\xba\xb7\xe7\xdf"
+			  "\x08\xbf\x62\xf5\xe8\xbc\xb6\x11"
+			  "\xe4\xcb\xd0\x66\x74\x32\xcf\xd4"
+			  "\xf8\x51\x80\x39\x14\x05\x12\xdb"
+			  "\x87\x93\xe2\x26\x30\x9c\x3a\x21"
+			  "\xe5\xd0\x38\x57\x80\x15\xe4\x08"
+			  "\x58\x05\x49\x7d\xe6\x92\x77\x70"
+			  "\xfb\x1e\x2d\x6a\x84\x00\xc8\x68"
+			  "\xf7\x1a\xdd\xf0\x7b\x38\x1e\xd8"
+			  "\x2c\x78\x78\x61\xcf\xe3\xde\x69"
+			  "\x1f\xd5\x03\xd5\x1a\xb4\xcf\x03"
+			  "\xc8\x7a\x70\x68\x35\xb4\xf6\xbe"
+			  "\x90\x62\xb2\x28\x99\x86\xf5\x44"
+			  "\x99\xeb\x31\xcf\xca\xdf\xd0\x21"
+			  "\xd6\x60\xf7\x0f\x40\xb4\x80\xb7"
+			  "\xab\xe1\x9b\x45\xba\x66\xda\xee"
+			  "\xdd\x04\x12\x40\x98\xe1\x69\xe5"
+			  "\x2b\x9c\x59\x80\xe7\x7b\xcc\x63"
+			  "\xa6\xc0\x3a\xa9\xfe\x8a\xf9\x62"
+			  "\x11\x34\x61\x94\x35\xfe\xf2\x99"
+			  "\xfd\xee\x19\xea\x95\xb6\x12\xbf"
+			  "\x1b\xdf\x02\x1a\xcc\x3e\x7e\x65"
+			  "\x78\x74\x10\x50\x29\x63\x28\xea"
+			  "\x6b\xab\xd4\x06\x4d\x15\x24\x31"
+			  "\xc7\x0a\xc9\x16\xb6\x48\xf0\xbf"
+			  "\x49\xdb\x68\x71\x31\x8f\x87\xe2"
+			  "\x13\x05\x64\xd6\x22\x0c\xf8\x36"
+			  "\x84\x24\x3e\x69\x5e\xb8\x9e\x16"
+			  "\x73\x6c\x83\x1e\xe0\x9f\x9e\xba"
+			  "\xe5\x59\x21\x33\x1b\xa9\x26\xc2"
+			  "\xc7\xd9\x30\x73\xb6\xa6\x73\x82"
+			  "\x19\xfa\x44\x4d\x40\x8b\x69\x04"
+			  "\x94\x74\xea\x6e\xb3\x09\x47\x01"
+			  "\x2a\xb9\x78\x34\x43\x11\xed\xd6"
+			  "\x8c\x95\x65\x1b\x85\x67\xa5\x40"
+			  "\xac\x9c\x05\x4b\x57\x4a\xa9\x96"
+			  "\x0f\xdd\x4f\xa1\xe0\xcf\x6e\xc7"
+			  "\x1b\xed\xa2\xb4\x56\x8c\x09\x6e"
+			  "\xa6\x65\xd7\x55\x81\xb7\xed\x11"
+			  "\x9b\x40\x75\xa8\x6b\x56\xaf\x16"
+			  "\x8b\x3d\xf4\xcb\xfe\xd5\x1d\x3d"
+			  "\x85\xc2\xc0\xde\x43\x39\x4a\x96"
+			  "\xba\x88\x97\xc0\xd6\x00\x0e\x27"
+			  "\x21\xb0\x21\x52\xba\xa7\x37\xaa"
+			  "\xcc\xbf\x95\xa8\xf4\xd0\x91\xf6",
+		.len	= 512,
+		.also_non_np = 1,
+		.np	= 2,
+		.tap	= { 144, 368 },
+	}
+};
+
+/* Adiantum with XChaCha20 instead of XChaCha12 */
+/* Test vectors from https://github.com/google/adiantum */
+static const struct cipher_testvec adiantum_xchacha20_aes_tv_template[] = {
+	{
+		.key	= "\x9e\xeb\xb2\x49\x3c\x1c\xf5\xf4"
+			  "\x6a\x99\xc2\xc4\xdf\xb1\xf4\xdd"
+			  "\x75\x20\x57\xea\x2c\x4f\xcd\xb2"
+			  "\xa5\x3d\x7b\x49\x1e\xab\xfd\x0f",
+		.klen	= 32,
+		.iv	= "\xdf\x63\xd4\xab\xd2\x49\xf3\xd8"
+			  "\x33\x81\x37\x60\x7d\xfa\x73\x08"
+			  "\xd8\x49\x6d\x80\xe8\x2f\x62\x54"
+			  "\xeb\x0e\xa9\x39\x5b\x45\x7f\x8a",
+		.ptext	= "\x67\xc9\xf2\x30\x84\x41\x8e\x43"
+			  "\xfb\xf3\xb3\x3e\x79\x36\x7f\xe8",
+		.ctext	= "\xf6\x78\x97\xd6\xaa\x94\x01\x27"
+			  "\x2e\x4d\x83\xe0\x6e\x64\x9a\xdf",
+		.len	= 16,
+		.also_non_np = 1,
+		.np	= 3,
+		.tap	= { 5, 2, 9 },
+	}, {
+		.key	= "\x36\x2b\x57\x97\xf8\x5d\xcd\x99"
+			  "\x5f\x1a\x5a\x44\x1d\x92\x0f\x27"
+			  "\xcc\x16\xd7\x2b\x85\x63\x99\xd3"
+			  "\xba\x96\xa1\xdb\xd2\x60\x68\xda",
+		.klen	= 32,
+		.iv	= "\xef\x58\x69\xb1\x2c\x5e\x9a\x47"
+			  "\x24\xc1\xb1\x69\xe1\x12\x93\x8f"
+			  "\x43\x3d\x6d\x00\xdb\x5e\xd8\xd9"
+			  "\x12\x9a\xfe\xd9\xff\x2d\xaa\xc4",
+		.ptext	= "\x5e\xa8\x68\x19\x85\x98\x12\x23"
+			  "\x26\x0a\xcc\xdb\x0a\x04\xb9\xdf"
+			  "\x4d\xb3\x48\x7b\xb0\xe3\xc8\x19"
+			  "\x43\x5a\x46\x06\x94\x2d\xf2",
+		.ctext	= "\x4b\xb8\x90\x10\xdf\x7f\x64\x08"
+			  "\x0e\x14\x42\x5f\x00\x74\x09\x36"
+			  "\x57\x72\xb5\xfd\xb5\x5d\xb8\x28"
+			  "\x0c\x04\x91\x14\x91\xe9\x37",
+		.len	= 31,
+		.also_non_np = 1,
+		.np	= 2,
+		.tap	= { 16, 15 },
+	}, {
+		.key	= "\xa5\x28\x24\x34\x1a\x3c\xd8\xf7"
+			  "\x05\x91\x8f\xee\x85\x1f\x35\x7f"
+			  "\x80\x3d\xfc\x9b\x94\xf6\xfc\x9e"
+			  "\x19\x09\x00\xa9\x04\x31\x4f\x11",
+		.klen	= 32,
+		.iv	= "\xa1\xba\x49\x95\xff\x34\x6d\xb8"
+			  "\xcd\x87\x5d\x5e\xfd\xea\x85\xdb"
+			  "\x8a\x7b\x5e\xb2\x5d\x57\xdd\x62"
+			  "\xac\xa9\x8c\x41\x42\x94\x75\xb7",
+		.ptext	= "\x69\xb4\xe8\x8c\x37\xe8\x67\x82"
+			  "\xf1\xec\x5d\x04\xe5\x14\x91\x13"
+			  "\xdf\xf2\x87\x1b\x69\x81\x1d\x71"
+			  "\x70\x9e\x9c\x3b\xde\x49\x70\x11"
+			  "\xa0\xa3\xdb\x0d\x54\x4f\x66\x69"
+			  "\xd7\xdb\x80\xa7\x70\x92\x68\xce"
+			  "\x81\x04\x2c\xc6\xab\xae\xe5\x60"
+			  "\x15\xe9\x6f\xef\xaa\x8f\xa7\xa7"
+			  "\x63\x8f\xf2\xf0\x77\xf1\xa8\xea"
+			  "\xe1\xb7\x1f\x9e\xab\x9e\x4b\x3f"
+			  "\x07\x87\x5b\x6f\xcd\xa8\xaf\xb9"
+			  "\xfa\x70\x0b\x52\xb8\xa8\xa7\x9e"
+			  "\x07\x5f\xa6\x0e\xb3\x9b\x79\x13"
+			  "\x79\xc3\x3e\x8d\x1c\x2c\x68\xc8"
+			  "\x51\x1d\x3c\x7b\x7d\x79\x77\x2a"
+			  "\x56\x65\xc5\x54\x23\x28\xb0\x03",
+		.ctext	= "\xb1\x8b\xa0\x05\x77\xa8\x4d\x59"
+			  "\x1b\x8e\x21\xfc\x3a\x49\xfa\xd4"
+			  "\xeb\x36\xf3\xc4\xdf\xdc\xae\x67"
+			  "\x07\x3f\x70\x0e\xe9\x66\xf5\x0c"
+			  "\x30\x4d\x66\xc9\xa4\x2f\x73\x9c"
+			  "\x13\xc8\x49\x44\xcc\x0a\x90\x9d"
+			  "\x7c\xdd\x19\x3f\xea\x72\x8d\x58"
+			  "\xab\xe7\x09\x2c\xec\xb5\x44\xd2"
+			  "\xca\xa6\x2d\x7a\x5c\x9c\x2b\x15"
+			  "\xec\x2a\xa6\x69\x91\xf9\xf3\x13"
+			  "\xf7\x72\xc1\xc1\x40\xd5\xe1\x94"
+			  "\xf4\x29\xa1\x3e\x25\x02\xa8\x3e"
+			  "\x94\xc1\x91\x14\xa1\x14\xcb\xbe"
+			  "\x67\x4c\xb9\x38\xfe\xa7\xaa\x32"
+			  "\x29\x62\x0d\xb2\xf6\x3c\x58\x57"
+			  "\xc1\xd5\x5a\xbb\xd6\xa6\x2a\xe5",
+		.len	= 128,
+		.also_non_np = 1,
+		.np	= 4,
+		.tap	= { 112, 7, 8, 1 },
+	}, {
+		.key	= "\xd3\x81\x72\x18\x23\xff\x6f\x4a"
+			  "\x25\x74\x29\x0d\x51\x8a\x0e\x13"
+			  "\xc1\x53\x5d\x30\x8d\xee\x75\x0d"
+			  "\x14\xd6\x69\xc9\x15\xa9\x0c\x60",
+		.klen	= 32,
+		.iv	= "\x65\x9b\xd4\xa8\x7d\x29\x1d\xf4"
+			  "\xc4\xd6\x9b\x6a\x28\xab\x64\xe2"
+			  "\x62\x81\x97\xc5\x81\xaa\xf9\x44"
+			  "\xc1\x72\x59\x82\xaf\x16\xc8\x2c",
+		.ptext	= "\xc7\x6b\x52\x6a\x10\xf0\xcc\x09"
+			  "\xc1\x12\x1d\x6d\x21\xa6\x78\xf5"
+			  "\x05\xa3\x69\x60\x91\x36\x98\x57"
+			  "\xba\x0c\x14\xcc\xf3\x2d\x73\x03"
+			  "\xc6\xb2\x5f\xc8\x16\x27\x37\x5d"
+			  "\xd0\x0b\x87\xb2\x50\x94\x7b\x58"
+			  "\x04\xf4\xe0\x7f\x6e\x57\x8e\xc9"
+			  "\x41\x84\xc1\xb1\x7e\x4b\x91\x12"
+			  "\x3a\x8b\x5d\x50\x82\x7b\xcb\xd9"
+			  "\x9a\xd9\x4e\x18\x06\x23\x9e\xd4"
+			  "\xa5\x20\x98\xef\xb5\xda\xe5\xc0"
+			  "\x8a\x6a\x83\x77\x15\x84\x1e\xae"
+			  "\x78\x94\x9d\xdf\xb7\xd1\xea\x67"
+			  "\xaa\xb0\x14\x15\xfa\x67\x21\x84"
+			  "\xd3\x41\x2a\xce\xba\x4b\x4a\xe8"
+			  "\x95\x62\xa9\x55\xf0\x80\xad\xbd"
+			  "\xab\xaf\xdd\x4f\xa5\x7c\x13\x36"
+			  "\xed\x5e\x4f\x72\xad\x4b\xf1\xd0"
+			  "\x88\x4e\xec\x2c\x88\x10\x5e\xea"
+			  "\x12\xc0\x16\x01\x29\xa3\xa0\x55"
+			  "\xaa\x68\xf3\xe9\x9d\x3b\x0d\x3b"
+			  "\x6d\xec\xf8\xa0\x2d\xf0\x90\x8d"
+			  "\x1c\xe2\x88\xd4\x24\x71\xf9\xb3"
+			  "\xc1\x9f\xc5\xd6\x76\x70\xc5\x2e"
+			  "\x9c\xac\xdb\x90\xbd\x83\x72\xba"
+			  "\x6e\xb5\xa5\x53\x83\xa9\xa5\xbf"
+			  "\x7d\x06\x0e\x3c\x2a\xd2\x04\xb5"
+			  "\x1e\x19\x38\x09\x16\xd2\x82\x1f"
+			  "\x75\x18\x56\xb8\x96\x0b\xa6\xf9"
+			  "\xcf\x62\xd9\x32\x5d\xa9\xd7\x1d"
+			  "\xec\xe4\xdf\x1b\xbe\xf1\x36\xee"
+			  "\xe3\x7b\xb5\x2f\xee\xf8\x53\x3d"
+			  "\x6a\xb7\x70\xa9\xfc\x9c\x57\x25"
+			  "\xf2\x89\x10\xd3\xb8\xa8\x8c\x30"
+			  "\xae\x23\x4f\x0e\x13\x66\x4f\xe1"
+			  "\xb6\xc0\xe4\xf8\xef\x93\xbd\x6e"
+			  "\x15\x85\x6b\xe3\x60\x81\x1d\x68"
+			  "\xd7\x31\x87\x89\x09\xab\xd5\x96"
+			  "\x1d\xf3\x6d\x67\x80\xca\x07\x31"
+			  "\x5d\xa7\xe4\xfb\x3e\xf2\x9b\x33"
+			  "\x52\x18\xc8\x30\xfe\x2d\xca\x1e"
+			  "\x79\x92\x7a\x60\x5c\xb6\x58\x87"
+			  "\xa4\x36\xa2\x67\x92\x8b\xa4\xb7"
+			  "\xf1\x86\xdf\xdc\xc0\x7e\x8f\x63"
+			  "\xd2\xa2\xdc\x78\xeb\x4f\xd8\x96"
+			  "\x47\xca\xb8\x91\xf9\xf7\x94\x21"
+			  "\x5f\x9a\x9f\x5b\xb8\x40\x41\x4b"
+			  "\x66\x69\x6a\x72\xd0\xcb\x70\xb7"
+			  "\x93\xb5\x37\x96\x05\x37\x4f\xe5"
+			  "\x8c\xa7\x5a\x4e\x8b\xb7\x84\xea"
+			  "\xc7\xfc\x19\x6e\x1f\x5a\xa1\xac"
+			  "\x18\x7d\x52\x3b\xb3\x34\x62\x99"
+			  "\xe4\x9e\x31\x04\x3f\xc0\x8d\x84"
+			  "\x17\x7c\x25\x48\x52\x67\x11\x27"
+			  "\x67\xbb\x5a\x85\xca\x56\xb2\x5c"
+			  "\xe6\xec\xd5\x96\x3d\x15\xfc\xfb"
+			  "\x22\x25\xf4\x13\xe5\x93\x4b\x9a"
+			  "\x77\xf1\x52\x18\xfa\x16\x5e\x49"
+			  "\x03\x45\xa8\x08\xfa\xb3\x41\x92"
+			  "\x79\x50\x33\xca\xd0\xd7\x42\x55"
+			  "\xc3\x9a\x0c\x4e\xd9\xa4\x3c\x86"
+			  "\x80\x9f\x53\xd1\xa4\x2e\xd1\xbc"
+			  "\xf1\x54\x6e\x93\xa4\x65\x99\x8e"
+			  "\xdf\x29\xc0\x64\x63\x07\xbb\xea",
+		.ctext	= "\xe0\x33\xf6\xe0\xb4\xa5\xdd\x2b"
+			  "\xdd\xce\xfc\x12\x1e\xfc\x2d\xf2"
+			  "\x8b\xc7\xeb\xc1\xc4\x2a\xe8\x44"
+			  "\x0f\x3d\x97\x19\x2e\x6d\xa2\x38"
+			  "\x9d\xa6\xaa\xe1\x96\xb9\x08\xe8"
+			  "\x0b\x70\x48\x5c\xed\xb5\x9b\xcb"
+			  "\x8b\x40\x88\x7e\x69\x73\xf7\x16"
+			  "\x71\xbb\x5b\xfc\xa3\x47\x5d\xa6"
+			  "\xae\x3a\x64\xc4\xe7\xb8\xa8\xe7"
+			  "\xb1\x32\x19\xdb\xe3\x01\xb8\xf0"
+			  "\xa4\x86\xb4\x4c\xc2\xde\x5c\xd2"
+			  "\x6c\x77\xd2\xe8\x18\xb7\x0a\xc9"
+			  "\x3d\x53\xb5\xc4\x5c\xf0\x8c\x06"
+			  "\xdc\x90\xe0\x74\x47\x1b\x0b\xf6"
+			  "\xd2\x71\x6b\xc4\xf1\x97\x00\x2d"
+			  "\x63\x57\x44\x1f\x8c\xf4\xe6\x9b"
+			  "\xe0\x7a\xdd\xec\x32\x73\x42\x32"
+			  "\x7f\x35\x67\x60\x0d\xcf\x10\x52"
+			  "\x61\x22\x53\x8d\x8e\xbb\x33\x76"
+			  "\x59\xd9\x10\xce\xdf\xef\xc0\x41"
+			  "\xd5\x33\x29\x6a\xda\x46\xa4\x51"
+			  "\xf0\x99\x3d\x96\x31\xdd\xb5\xcb"
+			  "\x3e\x2a\x1f\xc7\x5c\x79\xd3\xc5"
+			  "\x20\xa1\xb1\x39\x1b\xc6\x0a\x70"
+			  "\x26\x39\x95\x07\xad\x7a\xc9\x69"
+			  "\xfe\x81\xc7\x88\x08\x38\xaf\xad"
+			  "\x9e\x8d\xfb\xe8\x24\x0d\x22\xb8"
+			  "\x0e\xed\xbe\x37\x53\x7c\xa6\xc6"
+			  "\x78\x62\xec\xa3\x59\xd9\xc6\x9d"
+			  "\xb8\x0e\x69\x77\x84\x2d\x6a\x4c"
+			  "\xc5\xd9\xb2\xa0\x2b\xa8\x80\xcc"
+			  "\xe9\x1e\x9c\x5a\xc4\xa1\xb2\x37"
+			  "\x06\x9b\x30\x32\x67\xf7\xe7\xd2"
+			  "\x42\xc7\xdf\x4e\xd4\xcb\xa0\x12"
+			  "\x94\xa1\x34\x85\x93\x50\x4b\x0a"
+			  "\x3c\x7d\x49\x25\x01\x41\x6b\x96"
+			  "\xa9\x12\xbb\x0b\xc0\xd7\xd0\x93"
+			  "\x1f\x70\x38\xb8\x21\xee\xf6\xa7"
+			  "\xee\xeb\xe7\x81\xa4\x13\xb4\x87"
+			  "\xfa\xc1\xb0\xb5\x37\x8b\x74\xa2"
+			  "\x4e\xc7\xc2\xad\x3d\x62\x3f\xf8"
+			  "\x34\x42\xe5\xae\x45\x13\x63\xfe"
+			  "\xfc\x2a\x17\x46\x61\xa9\xd3\x1c"
+			  "\x4c\xaf\xf0\x09\x62\x26\x66\x1e"
+			  "\x74\xcf\xd6\x68\x3d\x7d\xd8\xb7"
+			  "\xe7\xe6\xf8\xf0\x08\x20\xf7\x47"
+			  "\x1c\x52\xaa\x0f\x3e\x21\xa3\xf2"
+			  "\xbf\x2f\x95\x16\xa8\xc8\xc8\x8c"
+			  "\x99\x0f\x5d\xfb\xfa\x2b\x58\x8a"
+			  "\x7e\xd6\x74\x02\x60\xf0\xd0\x5b"
+			  "\x65\xa8\xac\xea\x8d\x68\x46\x34"
+			  "\x26\x9d\x4f\xb1\x9a\x8e\xc0\x1a"
+			  "\xf1\xed\xc6\x7a\x83\xfd\x8a\x57"
+			  "\xf2\xe6\xe4\xba\xfc\xc6\x3c\xad"
+			  "\x5b\x19\x50\x2f\x3a\xcc\x06\x46"
+			  "\x04\x51\x3f\x91\x97\xf0\xd2\x07"
+			  "\xe7\x93\x89\x7e\xb5\x32\x0f\x03"
+			  "\xe5\x58\x9e\x74\x72\xeb\xc2\x38"
+			  "\x00\x0c\x91\x72\x69\xed\x7d\x6d"
+			  "\xc8\x71\xf0\xec\xff\x80\xd9\x1c"
+			  "\x9e\xd2\xfa\x15\xfc\x6c\x4e\xbc"
+			  "\xb1\xa6\xbd\xbd\x70\x40\xca\x20"
+			  "\xb8\x78\xd2\xa3\xc6\xf3\x79\x9c"
+			  "\xc7\x27\xe1\x6a\x29\xad\xa4\x03",
+		.len	= 512,
+	}
+};
+
 /*
  * CTS (Cipher Text Stealing) mode tests
  */
diff --git a/drivers/Kconfig b/drivers/Kconfig
index ab4d439..681051a 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -219,4 +219,5 @@
 
 source "drivers/slimbus/Kconfig"
 
+source "drivers/energy_model/Kconfig"
 endmenu
diff --git a/drivers/Makefile b/drivers/Makefile
index 578f469..1e847e2 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -157,6 +157,8 @@
 obj-$(CONFIG_RPMSG)		+= rpmsg/
 obj-$(CONFIG_SOUNDWIRE)		+= soundwire/
 
+obj-$(CONFIG_ENERGY_MODEL)	+= energy_model/
+
 # Virtualization drivers
 obj-$(CONFIG_VIRT_DRIVERS)	+= virt/
 obj-$(CONFIG_HYPERV)		+= hv/
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
index e0927c5..ce07a3c 100644
--- a/drivers/acpi/device_pm.c
+++ b/drivers/acpi/device_pm.c
@@ -455,7 +455,8 @@
 		goto out;
 
 	mutex_lock(&acpi_pm_notifier_lock);
-	adev->wakeup.ws = wakeup_source_register(dev_name(&adev->dev));
+	adev->wakeup.ws = wakeup_source_register(&adev->dev,
+						 dev_name(&adev->dev));
 	adev->wakeup.context.dev = dev;
 	adev->wakeup.context.func = func;
 	adev->wakeup.flags.notifier_present = true;
diff --git a/drivers/android/Kconfig b/drivers/android/Kconfig
index 432e9ad..6fdf2ab 100644
--- a/drivers/android/Kconfig
+++ b/drivers/android/Kconfig
@@ -20,6 +20,18 @@
 	  Android process, using Binder to identify, invoke and pass arguments
 	  between said processes.
 
+config ANDROID_BINDERFS
+	bool "Android Binderfs filesystem"
+	depends on ANDROID_BINDER_IPC
+	default n
+	---help---
+	  Binderfs is a pseudo-filesystem for the Android Binder IPC driver
+	  which can be mounted per-ipc namespace allowing to run multiple
+	  instances of Android.
+	  Each binderfs mount initially only contains a binder-control device.
+	  It can be used to dynamically allocate new binder IPC devices via
+	  ioctls.
+
 config ANDROID_BINDER_DEVICES
 	string "Android Binder devices"
 	depends on ANDROID_BINDER_IPC
diff --git a/drivers/android/Makefile b/drivers/android/Makefile
index a01254c..c7856e3 100644
--- a/drivers/android/Makefile
+++ b/drivers/android/Makefile
@@ -1,4 +1,5 @@
 ccflags-y += -I$(src)			# needed for trace events
 
+obj-$(CONFIG_ANDROID_BINDERFS)		+= binderfs.o
 obj-$(CONFIG_ANDROID_BINDER_IPC)	+= binder.o binder_alloc.o
 obj-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o
diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index cf43671..4cdbd7b 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -73,10 +73,12 @@
 #include <linux/ratelimit.h>
 
 #include <uapi/linux/android/binder.h>
+#include <uapi/linux/sched/types.h>
 
 #include <asm/cacheflush.h>
 
 #include "binder_alloc.h"
+#include "binder_internal.h"
 #include "binder_trace.h"
 
 static HLIST_HEAD(binder_deferred_list);
@@ -93,22 +95,8 @@
 static struct dentry *binder_debugfs_dir_entry_proc;
 static atomic_t binder_last_id;
 
-#define BINDER_DEBUG_ENTRY(name) \
-static int binder_##name##_open(struct inode *inode, struct file *file) \
-{ \
-	return single_open(file, binder_##name##_show, inode->i_private); \
-} \
-\
-static const struct file_operations binder_##name##_fops = { \
-	.owner = THIS_MODULE, \
-	.open = binder_##name##_open, \
-	.read = seq_read, \
-	.llseek = seq_lseek, \
-	.release = single_release, \
-}
-
-static int binder_proc_show(struct seq_file *m, void *unused);
-BINDER_DEBUG_ENTRY(proc);
+static int proc_show(struct seq_file *m, void *unused);
+DEFINE_SHOW_ATTRIBUTE(proc);
 
 /* This is only defined in include/asm-arm/sizes.h */
 #ifndef SZ_1K
@@ -142,7 +130,7 @@
 	BINDER_DEBUG_FAILED_TRANSACTION | BINDER_DEBUG_DEAD_TRANSACTION;
 module_param_named(debug_mask, binder_debug_mask, uint, 0644);
 
-static char *binder_devices_param = CONFIG_ANDROID_BINDER_DEVICES;
+char *binder_devices_param = CONFIG_ANDROID_BINDER_DEVICES;
 module_param_named(devices, binder_devices_param, charp, 0444);
 
 static DECLARE_WAIT_QUEUE_HEAD(binder_user_error_wait);
@@ -216,30 +204,8 @@
 	atomic_inc(&binder_stats.obj_created[type]);
 }
 
-struct binder_transaction_log_entry {
-	int debug_id;
-	int debug_id_done;
-	int call_type;
-	int from_proc;
-	int from_thread;
-	int target_handle;
-	int to_proc;
-	int to_thread;
-	int to_node;
-	int data_size;
-	int offsets_size;
-	int return_error_line;
-	uint32_t return_error;
-	uint32_t return_error_param;
-	const char *context_name;
-};
-struct binder_transaction_log {
-	atomic_t cur;
-	bool full;
-	struct binder_transaction_log_entry entry[32];
-};
-static struct binder_transaction_log binder_transaction_log;
-static struct binder_transaction_log binder_transaction_log_failed;
+struct binder_transaction_log binder_transaction_log;
+struct binder_transaction_log binder_transaction_log_failed;
 
 static struct binder_transaction_log_entry *binder_transaction_log_add(
 	struct binder_transaction_log *log)
@@ -261,20 +227,6 @@
 	return e;
 }
 
-struct binder_context {
-	struct binder_node *binder_context_mgr_node;
-	struct mutex context_mgr_node_lock;
-
-	kuid_t binder_context_mgr_uid;
-	const char *name;
-};
-
-struct binder_device {
-	struct hlist_node hlist;
-	struct miscdevice miscdev;
-	struct binder_context context;
-};
-
 /**
  * struct binder_work - work enqueued on a worklist
  * @entry:             node enqueued on list
@@ -350,10 +302,15 @@
  *                        and by @lock)
  * @has_async_transaction: async transaction to node in progress
  *                        (protected by @lock)
+ * @sched_policy:         minimum scheduling policy for node
+ *                        (invariant after initialized)
  * @accept_fds:           file descriptor operations supported for node
  *                        (invariant after initialized)
  * @min_priority:         minimum scheduling priority
  *                        (invariant after initialized)
+ * @inherit_rt:           inherit RT scheduling policy from caller
+ * @txn_security_ctx:     require sender's security context
+ *                        (invariant after initialized)
  * @async_todo:           list of async work items
  *                        (protected by @proc->inner_lock)
  *
@@ -389,7 +346,10 @@
 		/*
 		 * invariant after initialization
 		 */
+		u8 sched_policy:2;
+		u8 inherit_rt:1;
 		u8 accept_fds:1;
+		u8 txn_security_ctx:1;
 		u8 min_priority;
 	};
 	bool has_async_transaction;
@@ -463,6 +423,22 @@
 };
 
 /**
+ * struct binder_priority - scheduler policy and priority
+ * @sched_policy            scheduler policy
+ * @prio                    [100..139] for SCHED_NORMAL, [0..99] for FIFO/RT
+ *
+ * The binder driver supports inheriting the following scheduler policies:
+ * SCHED_NORMAL
+ * SCHED_BATCH
+ * SCHED_FIFO
+ * SCHED_RR
+ */
+struct binder_priority {
+	unsigned int sched_policy;
+	int prio;
+};
+
+/**
  * struct binder_proc - binder process bookkeeping
  * @proc_node:            element for binder_procs list
  * @threads:              rbtree of binder_threads in this proc
@@ -515,6 +491,7 @@
  * @inner_lock:           can nest under outer_lock and/or node lock
  * @outer_lock:           no nesting under innor or node lock
  *                        Lock order: 1) outer, 2) node, 3) inner
+ * @binderfs_entry:       process-specific binderfs log file
  *
  * Bookkeeping structure for binder processes
  */
@@ -540,12 +517,13 @@
 	int requested_threads;
 	int requested_threads_started;
 	int tmp_ref;
-	long default_priority;
+	struct binder_priority default_priority;
 	struct dentry *debugfs_entry;
 	struct binder_alloc alloc;
 	struct binder_context *context;
 	spinlock_t inner_lock;
 	spinlock_t outer_lock;
+	struct dentry *binderfs_entry;
 };
 
 enum {
@@ -590,6 +568,7 @@
  * @is_dead:              thread is dead and awaiting free
  *                        when outstanding transactions are cleaned up
  *                        (protected by @proc->inner_lock)
+ * @task:                 struct task_struct for this thread
  *
  * Bookkeeping structure for binder threads.
  */
@@ -609,6 +588,7 @@
 	struct binder_stats stats;
 	atomic_t tmp_ref;
 	bool is_dead;
+	struct task_struct *task;
 };
 
 struct binder_transaction {
@@ -625,9 +605,11 @@
 	struct binder_buffer *buffer;
 	unsigned int	code;
 	unsigned int	flags;
-	long	priority;
-	long	saved_priority;
+	struct binder_priority	priority;
+	struct binder_priority	saved_priority;
+	bool    set_priority_called;
 	kuid_t	sender_euid;
+	binder_uintptr_t security_ctx;
 	/**
 	 * @lock:  protects @from, @to_proc, and @to_thread
 	 *
@@ -638,6 +620,26 @@
 };
 
 /**
+ * struct binder_object - union of flat binder object types
+ * @hdr:   generic object header
+ * @fbo:   binder object (nodes and refs)
+ * @fdo:   file descriptor object
+ * @bbo:   binder buffer pointer
+ * @fdao:  file descriptor array
+ *
+ * Used for type-independent object copies
+ */
+struct binder_object {
+	union {
+		struct binder_object_header hdr;
+		struct flat_binder_object fbo;
+		struct binder_fd_object fdo;
+		struct binder_buffer_object bbo;
+		struct binder_fd_array_object fdao;
+	};
+};
+
+/**
  * binder_proc_lock() - Acquire outer lock for given binder_proc
  * @proc:         struct binder_proc to acquire
  *
@@ -1109,22 +1111,145 @@
 	binder_wakeup_thread_ilocked(proc, thread, /* sync = */false);
 }
 
-static void binder_set_nice(long nice)
+static bool is_rt_policy(int policy)
 {
-	long min_nice;
+	return policy == SCHED_FIFO || policy == SCHED_RR;
+}
 
-	if (can_nice(current, nice)) {
-		set_user_nice(current, nice);
+static bool is_fair_policy(int policy)
+{
+	return policy == SCHED_NORMAL || policy == SCHED_BATCH;
+}
+
+static bool binder_supported_policy(int policy)
+{
+	return is_fair_policy(policy) || is_rt_policy(policy);
+}
+
+static int to_userspace_prio(int policy, int kernel_priority)
+{
+	if (is_fair_policy(policy))
+		return PRIO_TO_NICE(kernel_priority);
+	else
+		return MAX_USER_RT_PRIO - 1 - kernel_priority;
+}
+
+static int to_kernel_prio(int policy, int user_priority)
+{
+	if (is_fair_policy(policy))
+		return NICE_TO_PRIO(user_priority);
+	else
+		return MAX_USER_RT_PRIO - 1 - user_priority;
+}
+
+static void binder_do_set_priority(struct task_struct *task,
+				   struct binder_priority desired,
+				   bool verify)
+{
+	int priority; /* user-space prio value */
+	bool has_cap_nice;
+	unsigned int policy = desired.sched_policy;
+
+	if (task->policy == policy && task->normal_prio == desired.prio)
 		return;
+
+	has_cap_nice = has_capability_noaudit(task, CAP_SYS_NICE);
+
+	priority = to_userspace_prio(policy, desired.prio);
+
+	if (verify && is_rt_policy(policy) && !has_cap_nice) {
+		long max_rtprio = task_rlimit(task, RLIMIT_RTPRIO);
+
+		if (max_rtprio == 0) {
+			policy = SCHED_NORMAL;
+			priority = MIN_NICE;
+		} else if (priority > max_rtprio) {
+			priority = max_rtprio;
+		}
 	}
-	min_nice = rlimit_to_nice(rlimit(RLIMIT_NICE));
-	binder_debug(BINDER_DEBUG_PRIORITY_CAP,
-		     "%d: nice value %ld not allowed use %ld instead\n",
-		      current->pid, nice, min_nice);
-	set_user_nice(current, min_nice);
-	if (min_nice <= MAX_NICE)
+
+	if (verify && is_fair_policy(policy) && !has_cap_nice) {
+		long min_nice = rlimit_to_nice(task_rlimit(task, RLIMIT_NICE));
+
+		if (min_nice > MAX_NICE) {
+			binder_user_error("%d RLIMIT_NICE not set\n",
+					  task->pid);
+			return;
+		} else if (priority < min_nice) {
+			priority = min_nice;
+		}
+	}
+
+	if (policy != desired.sched_policy ||
+	    to_kernel_prio(policy, priority) != desired.prio)
+		binder_debug(BINDER_DEBUG_PRIORITY_CAP,
+			     "%d: priority %d not allowed, using %d instead\n",
+			      task->pid, desired.prio,
+			      to_kernel_prio(policy, priority));
+
+	trace_binder_set_priority(task->tgid, task->pid, task->normal_prio,
+				  to_kernel_prio(policy, priority),
+				  desired.prio);
+
+	/* Set the actual priority */
+	if (task->policy != policy || is_rt_policy(policy)) {
+		struct sched_param params;
+
+		params.sched_priority = is_rt_policy(policy) ? priority : 0;
+
+		sched_setscheduler_nocheck(task,
+					   policy | SCHED_RESET_ON_FORK,
+					   &params);
+	}
+	if (is_fair_policy(policy))
+		set_user_nice(task, priority);
+}
+
+static void binder_set_priority(struct task_struct *task,
+				struct binder_priority desired)
+{
+	binder_do_set_priority(task, desired, /* verify = */ true);
+}
+
+static void binder_restore_priority(struct task_struct *task,
+				    struct binder_priority desired)
+{
+	binder_do_set_priority(task, desired, /* verify = */ false);
+}
+
+static void binder_transaction_priority(struct task_struct *task,
+					struct binder_transaction *t,
+					struct binder_priority node_prio,
+					bool inherit_rt)
+{
+	struct binder_priority desired_prio = t->priority;
+
+	if (t->set_priority_called)
 		return;
-	binder_user_error("%d RLIMIT_NICE not set\n", current->pid);
+
+	t->set_priority_called = true;
+	t->saved_priority.sched_policy = task->policy;
+	t->saved_priority.prio = task->normal_prio;
+
+	if (!inherit_rt && is_rt_policy(desired_prio.sched_policy)) {
+		desired_prio.prio = NICE_TO_PRIO(0);
+		desired_prio.sched_policy = SCHED_NORMAL;
+	}
+
+	if (node_prio.prio < t->priority.prio ||
+	    (node_prio.prio == t->priority.prio &&
+	     node_prio.sched_policy == SCHED_FIFO)) {
+		/*
+		 * In case the minimum priority on the node is
+		 * higher (lower value), use that priority. If
+		 * the priority is the same, but the node uses
+		 * SCHED_FIFO, prefer SCHED_FIFO, since it can
+		 * run unbounded, unlike SCHED_RR.
+		 */
+		desired_prio = node_prio;
+	}
+
+	binder_set_priority(task, desired_prio);
 }
 
 static struct binder_node *binder_get_node_ilocked(struct binder_proc *proc,
@@ -1177,6 +1302,7 @@
 	binder_uintptr_t ptr = fp ? fp->binder : 0;
 	binder_uintptr_t cookie = fp ? fp->cookie : 0;
 	__u32 flags = fp ? fp->flags : 0;
+	s8 priority;
 
 	assert_spin_locked(&proc->inner_lock);
 
@@ -1209,8 +1335,13 @@
 	node->ptr = ptr;
 	node->cookie = cookie;
 	node->work.type = BINDER_WORK_NODE;
-	node->min_priority = flags & FLAT_BINDER_FLAG_PRIORITY_MASK;
+	priority = flags & FLAT_BINDER_FLAG_PRIORITY_MASK;
+	node->sched_policy = (flags & FLAT_BINDER_FLAG_SCHED_POLICY_MASK) >>
+		FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT;
+	node->min_priority = to_kernel_prio(node->sched_policy, priority);
 	node->accept_fds = !!(flags & FLAT_BINDER_FLAG_ACCEPTS_FDS);
+	node->inherit_rt = !!(flags & FLAT_BINDER_FLAG_INHERIT_RT);
+	node->txn_security_ctx = !!(flags & FLAT_BINDER_FLAG_TXN_SECURITY_CTX);
 	spin_lock_init(&node->lock);
 	INIT_LIST_HEAD(&node->work.entry);
 	INIT_LIST_HEAD(&node->async_todo);
@@ -2049,26 +2180,34 @@
 }
 
 /**
- * binder_validate_object() - checks for a valid metadata object in a buffer.
+ * binder_get_object() - gets object and checks for valid metadata
+ * @proc:	binder_proc owning the buffer
  * @buffer:	binder_buffer that we're parsing.
- * @offset:	offset in the buffer at which to validate an object.
+ * @offset:	offset in the @buffer at which to validate an object.
+ * @object:	struct binder_object to read into
  *
  * Return:	If there's a valid metadata object at @offset in @buffer, the
- *		size of that object. Otherwise, it returns zero.
+ *		size of that object. Otherwise, it returns zero. The object
+ *		is read into the struct binder_object pointed to by @object.
  */
-static size_t binder_validate_object(struct binder_buffer *buffer, u64 offset)
+static size_t binder_get_object(struct binder_proc *proc,
+				struct binder_buffer *buffer,
+				unsigned long offset,
+				struct binder_object *object)
 {
-	/* Check if we can read a header first */
+	size_t read_size;
 	struct binder_object_header *hdr;
 	size_t object_size = 0;
 
-	if (buffer->data_size < sizeof(*hdr) ||
-	    offset > buffer->data_size - sizeof(*hdr) ||
+	read_size = min_t(size_t, sizeof(*object), buffer->data_size - offset);
+	if (offset > buffer->data_size || read_size < sizeof(*hdr) ||
 	    !IS_ALIGNED(offset, sizeof(u32)))
 		return 0;
+	binder_alloc_copy_from_buffer(&proc->alloc, object, buffer,
+				      offset, read_size);
 
-	/* Ok, now see if we can read a complete object. */
-	hdr = (struct binder_object_header *)(buffer->data + offset);
+	/* Ok, now see if we read a complete object. */
+	hdr = &object->hdr;
 	switch (hdr->type) {
 	case BINDER_TYPE_BINDER:
 	case BINDER_TYPE_WEAK_BINDER:
@@ -2097,10 +2236,13 @@
 
 /**
  * binder_validate_ptr() - validates binder_buffer_object in a binder_buffer.
+ * @proc:	binder_proc owning the buffer
  * @b:		binder_buffer containing the object
+ * @object:	struct binder_object to read into
  * @index:	index in offset array at which the binder_buffer_object is
  *		located
- * @start:	points to the start of the offset array
+ * @start_offset: points to the start of the offset array
+ * @object_offsetp: offset of @object read from @b
  * @num_valid:	the number of valid offsets in the offset array
  *
  * Return:	If @index is within the valid range of the offset array
@@ -2111,34 +2253,46 @@
  *		Note that the offset found in index @index itself is not
  *		verified; this function assumes that @num_valid elements
  *		from @start were previously verified to have valid offsets.
+ *		If @object_offsetp is non-NULL, then the offset within
+ *		@b is written to it.
  */
-static struct binder_buffer_object *binder_validate_ptr(struct binder_buffer *b,
-							binder_size_t index,
-							binder_size_t *start,
-							binder_size_t num_valid)
+static struct binder_buffer_object *binder_validate_ptr(
+						struct binder_proc *proc,
+						struct binder_buffer *b,
+						struct binder_object *object,
+						binder_size_t index,
+						binder_size_t start_offset,
+						binder_size_t *object_offsetp,
+						binder_size_t num_valid)
 {
-	struct binder_buffer_object *buffer_obj;
-	binder_size_t *offp;
+	size_t object_size;
+	binder_size_t object_offset;
+	unsigned long buffer_offset;
 
 	if (index >= num_valid)
 		return NULL;
 
-	offp = start + index;
-	buffer_obj = (struct binder_buffer_object *)(b->data + *offp);
-	if (buffer_obj->hdr.type != BINDER_TYPE_PTR)
+	buffer_offset = start_offset + sizeof(binder_size_t) * index;
+	binder_alloc_copy_from_buffer(&proc->alloc, &object_offset,
+				      b, buffer_offset, sizeof(object_offset));
+	object_size = binder_get_object(proc, b, object_offset, object);
+	if (!object_size || object->hdr.type != BINDER_TYPE_PTR)
 		return NULL;
+	if (object_offsetp)
+		*object_offsetp = object_offset;
 
-	return buffer_obj;
+	return &object->bbo;
 }
 
 /**
  * binder_validate_fixup() - validates pointer/fd fixups happen in order.
+ * @proc:		binder_proc owning the buffer
  * @b:			transaction buffer
- * @objects_start	start of objects buffer
- * @buffer:		binder_buffer_object in which to fix up
- * @offset:		start offset in @buffer to fix up
- * @last_obj:		last binder_buffer_object that we fixed up in
- * @last_min_offset:	minimum fixup offset in @last_obj
+ * @objects_start_offset: offset to start of objects buffer
+ * @buffer_obj_offset:	offset to binder_buffer_object in which to fix up
+ * @fixup_offset:	start offset in @buffer to fix up
+ * @last_obj_offset:	offset to last binder_buffer_object that we fixed
+ * @last_min_offset:	minimum fixup offset in object at @last_obj_offset
  *
  * Return:		%true if a fixup in buffer @buffer at offset @offset is
  *			allowed.
@@ -2169,63 +2323,83 @@
  *   C (parent = A, offset = 16)
  *     D (parent = B, offset = 0) // B is not A or any of A's parents
  */
-static bool binder_validate_fixup(struct binder_buffer *b,
-				  binder_size_t *objects_start,
-				  struct binder_buffer_object *buffer,
+static bool binder_validate_fixup(struct binder_proc *proc,
+				  struct binder_buffer *b,
+				  binder_size_t objects_start_offset,
+				  binder_size_t buffer_obj_offset,
 				  binder_size_t fixup_offset,
-				  struct binder_buffer_object *last_obj,
+				  binder_size_t last_obj_offset,
 				  binder_size_t last_min_offset)
 {
-	if (!last_obj) {
+	if (!last_obj_offset) {
 		/* Nothing to fix up in */
 		return false;
 	}
 
-	while (last_obj != buffer) {
+	while (last_obj_offset != buffer_obj_offset) {
+		unsigned long buffer_offset;
+		struct binder_object last_object;
+		struct binder_buffer_object *last_bbo;
+		size_t object_size = binder_get_object(proc, b, last_obj_offset,
+						       &last_object);
+		if (object_size != sizeof(*last_bbo))
+			return false;
+
+		last_bbo = &last_object.bbo;
 		/*
 		 * Safe to retrieve the parent of last_obj, since it
 		 * was already previously verified by the driver.
 		 */
-		if ((last_obj->flags & BINDER_BUFFER_FLAG_HAS_PARENT) == 0)
+		if ((last_bbo->flags & BINDER_BUFFER_FLAG_HAS_PARENT) == 0)
 			return false;
-		last_min_offset = last_obj->parent_offset + sizeof(uintptr_t);
-		last_obj = (struct binder_buffer_object *)
-			(b->data + *(objects_start + last_obj->parent));
+		last_min_offset = last_bbo->parent_offset + sizeof(uintptr_t);
+		buffer_offset = objects_start_offset +
+			sizeof(binder_size_t) * last_bbo->parent,
+		binder_alloc_copy_from_buffer(&proc->alloc, &last_obj_offset,
+					      b, buffer_offset,
+					      sizeof(last_obj_offset));
 	}
 	return (fixup_offset >= last_min_offset);
 }
 
 static void binder_transaction_buffer_release(struct binder_proc *proc,
 					      struct binder_buffer *buffer,
-					      binder_size_t *failed_at)
+					      binder_size_t failed_at,
+					      bool is_failure)
 {
-	binder_size_t *offp, *off_start, *off_end;
 	int debug_id = buffer->debug_id;
+	binder_size_t off_start_offset, buffer_offset, off_end_offset;
 
 	binder_debug(BINDER_DEBUG_TRANSACTION,
-		     "%d buffer release %d, size %zd-%zd, failed at %pK\n",
+		     "%d buffer release %d, size %zd-%zd, failed at %llx\n",
 		     proc->pid, buffer->debug_id,
-		     buffer->data_size, buffer->offsets_size, failed_at);
+		     buffer->data_size, buffer->offsets_size,
+		     (unsigned long long)failed_at);
 
 	if (buffer->target_node)
 		binder_dec_node(buffer->target_node, 1, 0);
 
-	off_start = (binder_size_t *)(buffer->data +
-				      ALIGN(buffer->data_size, sizeof(void *)));
-	if (failed_at)
-		off_end = failed_at;
-	else
-		off_end = (void *)off_start + buffer->offsets_size;
-	for (offp = off_start; offp < off_end; offp++) {
+	off_start_offset = ALIGN(buffer->data_size, sizeof(void *));
+	off_end_offset = is_failure ? failed_at :
+				off_start_offset + buffer->offsets_size;
+	for (buffer_offset = off_start_offset; buffer_offset < off_end_offset;
+	     buffer_offset += sizeof(binder_size_t)) {
 		struct binder_object_header *hdr;
-		size_t object_size = binder_validate_object(buffer, *offp);
+		size_t object_size;
+		struct binder_object object;
+		binder_size_t object_offset;
 
+		binder_alloc_copy_from_buffer(&proc->alloc, &object_offset,
+					      buffer, buffer_offset,
+					      sizeof(object_offset));
+		object_size = binder_get_object(proc, buffer,
+						object_offset, &object);
 		if (object_size == 0) {
 			pr_err("transaction release %d bad object at offset %lld, size %zd\n",
-			       debug_id, (u64)*offp, buffer->data_size);
+			       debug_id, (u64)object_offset, buffer->data_size);
 			continue;
 		}
-		hdr = (struct binder_object_header *)(buffer->data + *offp);
+		hdr = &object.hdr;
 		switch (hdr->type) {
 		case BINDER_TYPE_BINDER:
 		case BINDER_TYPE_WEAK_BINDER: {
@@ -2283,28 +2457,25 @@
 		case BINDER_TYPE_FDA: {
 			struct binder_fd_array_object *fda;
 			struct binder_buffer_object *parent;
-			uintptr_t parent_buffer;
-			u32 *fd_array;
+			struct binder_object ptr_object;
+			binder_size_t fda_offset;
 			size_t fd_index;
 			binder_size_t fd_buf_size;
+			binder_size_t num_valid;
 
+			num_valid = (buffer_offset - off_start_offset) /
+						sizeof(binder_size_t);
 			fda = to_binder_fd_array_object(hdr);
-			parent = binder_validate_ptr(buffer, fda->parent,
-						     off_start,
-						     offp - off_start);
+			parent = binder_validate_ptr(proc, buffer, &ptr_object,
+						     fda->parent,
+						     off_start_offset,
+						     NULL,
+						     num_valid);
 			if (!parent) {
 				pr_err("transaction release %d bad parent offset\n",
 				       debug_id);
 				continue;
 			}
-			/*
-			 * Since the parent was already fixed up, convert it
-			 * back to kernel address space to access it
-			 */
-			parent_buffer = parent->buffer -
-				binder_alloc_get_user_buffer_offset(
-						&proc->alloc);
-
 			fd_buf_size = sizeof(u32) * fda->num_fds;
 			if (fda->num_fds >= SIZE_MAX / sizeof(u32)) {
 				pr_err("transaction release %d invalid number of fds (%lld)\n",
@@ -2318,9 +2489,29 @@
 				       debug_id, (u64)fda->num_fds);
 				continue;
 			}
-			fd_array = (u32 *)(parent_buffer + (uintptr_t)fda->parent_offset);
-			for (fd_index = 0; fd_index < fda->num_fds; fd_index++)
-				task_close_fd(proc, fd_array[fd_index]);
+			/*
+			 * the source data for binder_buffer_object is visible
+			 * to user-space and the @buffer element is the user
+			 * pointer to the buffer_object containing the fd_array.
+			 * Convert the address to an offset relative to
+			 * the base of the transaction buffer.
+			 */
+			fda_offset =
+			    (parent->buffer - (uintptr_t)buffer->user_data) +
+			    fda->parent_offset;
+			for (fd_index = 0; fd_index < fda->num_fds;
+			     fd_index++) {
+				u32 fd;
+				binder_size_t offset = fda_offset +
+					fd_index * sizeof(fd);
+
+				binder_alloc_copy_from_buffer(&proc->alloc,
+							      &fd,
+							      buffer,
+							      offset,
+							      sizeof(fd));
+				task_close_fd(proc, fd);
+			}
 		} break;
 		default:
 			pr_err("transaction release %d bad object type %x\n",
@@ -2517,9 +2708,8 @@
 				     struct binder_transaction *in_reply_to)
 {
 	binder_size_t fdi, fd_buf_size, num_installed_fds;
+	binder_size_t fda_offset;
 	int target_fd;
-	uintptr_t parent_buffer;
-	u32 *fd_array;
 	struct binder_proc *proc = thread->proc;
 	struct binder_proc *target_proc = t->to_proc;
 
@@ -2537,23 +2727,33 @@
 		return -EINVAL;
 	}
 	/*
-	 * Since the parent was already fixed up, convert it
-	 * back to the kernel address space to access it
+	 * the source data for binder_buffer_object is visible
+	 * to user-space and the @buffer element is the user
+	 * pointer to the buffer_object containing the fd_array.
+	 * Convert the address to an offset relative to
+	 * the base of the transaction buffer.
 	 */
-	parent_buffer = parent->buffer -
-		binder_alloc_get_user_buffer_offset(&target_proc->alloc);
-	fd_array = (u32 *)(parent_buffer + (uintptr_t)fda->parent_offset);
-	if (!IS_ALIGNED((unsigned long)fd_array, sizeof(u32))) {
+	fda_offset = (parent->buffer - (uintptr_t)t->buffer->user_data) +
+		fda->parent_offset;
+	if (!IS_ALIGNED((unsigned long)fda_offset, sizeof(u32))) {
 		binder_user_error("%d:%d parent offset not aligned correctly.\n",
 				  proc->pid, thread->pid);
 		return -EINVAL;
 	}
 	for (fdi = 0; fdi < fda->num_fds; fdi++) {
-		target_fd = binder_translate_fd(fd_array[fdi], t, thread,
-						in_reply_to);
+		u32 fd;
+
+		binder_size_t offset = fda_offset + fdi * sizeof(fd);
+
+		binder_alloc_copy_from_buffer(&target_proc->alloc,
+					      &fd, t->buffer,
+					      offset, sizeof(fd));
+		target_fd = binder_translate_fd(fd, t, thread, in_reply_to);
 		if (target_fd < 0)
 			goto err_translate_fd_failed;
-		fd_array[fdi] = target_fd;
+		binder_alloc_copy_to_buffer(&target_proc->alloc,
+					    t->buffer, offset,
+					    &target_fd, sizeof(fd));
 	}
 	return 0;
 
@@ -2563,38 +2763,48 @@
 	 * installed so far.
 	 */
 	num_installed_fds = fdi;
-	for (fdi = 0; fdi < num_installed_fds; fdi++)
-		task_close_fd(target_proc, fd_array[fdi]);
+	for (fdi = 0; fdi < num_installed_fds; fdi++) {
+		u32 fd;
+		binder_size_t offset = fda_offset + fdi * sizeof(fd);
+		binder_alloc_copy_from_buffer(&target_proc->alloc,
+					      &fd, t->buffer,
+					      offset, sizeof(fd));
+		task_close_fd(target_proc, fd);
+	}
 	return target_fd;
 }
 
 static int binder_fixup_parent(struct binder_transaction *t,
 			       struct binder_thread *thread,
 			       struct binder_buffer_object *bp,
-			       binder_size_t *off_start,
+			       binder_size_t off_start_offset,
 			       binder_size_t num_valid,
-			       struct binder_buffer_object *last_fixup_obj,
+			       binder_size_t last_fixup_obj_off,
 			       binder_size_t last_fixup_min_off)
 {
 	struct binder_buffer_object *parent;
-	u8 *parent_buffer;
 	struct binder_buffer *b = t->buffer;
 	struct binder_proc *proc = thread->proc;
 	struct binder_proc *target_proc = t->to_proc;
+	struct binder_object object;
+	binder_size_t buffer_offset;
+	binder_size_t parent_offset;
 
 	if (!(bp->flags & BINDER_BUFFER_FLAG_HAS_PARENT))
 		return 0;
 
-	parent = binder_validate_ptr(b, bp->parent, off_start, num_valid);
+	parent = binder_validate_ptr(target_proc, b, &object, bp->parent,
+				     off_start_offset, &parent_offset,
+				     num_valid);
 	if (!parent) {
 		binder_user_error("%d:%d got transaction with invalid parent offset or type\n",
 				  proc->pid, thread->pid);
 		return -EINVAL;
 	}
 
-	if (!binder_validate_fixup(b, off_start,
-				   parent, bp->parent_offset,
-				   last_fixup_obj,
+	if (!binder_validate_fixup(target_proc, b, off_start_offset,
+				   parent_offset, bp->parent_offset,
+				   last_fixup_obj_off,
 				   last_fixup_min_off)) {
 		binder_user_error("%d:%d got transaction with out-of-order buffer fixup\n",
 				  proc->pid, thread->pid);
@@ -2608,10 +2818,10 @@
 				  proc->pid, thread->pid);
 		return -EINVAL;
 	}
-	parent_buffer = (u8 *)((uintptr_t)parent->buffer -
-			binder_alloc_get_user_buffer_offset(
-				&target_proc->alloc));
-	*(binder_uintptr_t *)(parent_buffer + bp->parent_offset) = bp->buffer;
+	buffer_offset = bp->parent_offset +
+			(uintptr_t)parent->buffer - (uintptr_t)b->user_data;
+	binder_alloc_copy_to_buffer(&target_proc->alloc, b, buffer_offset,
+				    &bp->buffer, sizeof(bp->buffer));
 
 	return 0;
 }
@@ -2638,11 +2848,15 @@
 				    struct binder_thread *thread)
 {
 	struct binder_node *node = t->buffer->target_node;
+	struct binder_priority node_prio;
 	bool oneway = !!(t->flags & TF_ONE_WAY);
 	bool pending_async = false;
 
 	BUG_ON(!node);
 	binder_node_lock(node);
+	node_prio.prio = node->min_priority;
+	node_prio.sched_policy = node->sched_policy;
+
 	if (oneway) {
 		BUG_ON(thread);
 		if (node->has_async_transaction) {
@@ -2663,12 +2877,15 @@
 	if (!thread && !pending_async)
 		thread = binder_select_thread_ilocked(proc);
 
-	if (thread)
+	if (thread) {
+		binder_transaction_priority(thread->task, t, node_prio,
+					    node->inherit_rt);
 		binder_enqueue_thread_work_ilocked(thread, &t->work);
-	else if (!pending_async)
+	} else if (!pending_async) {
 		binder_enqueue_work_ilocked(&t->work, &proc->todo);
-	else
+	} else {
 		binder_enqueue_work_ilocked(&t->work, &node->async_todo);
+	}
 
 	if (!pending_async)
 		binder_wakeup_thread_ilocked(proc, thread, !oneway /* sync */);
@@ -2730,9 +2947,10 @@
 	struct binder_transaction *t;
 	struct binder_work *w;
 	struct binder_work *tcomplete;
-	binder_size_t *offp, *off_end, *off_start;
+	binder_size_t buffer_offset = 0;
+	binder_size_t off_start_offset, off_end_offset;
 	binder_size_t off_min;
-	u8 *sg_bufp, *sg_buf_end;
+	binder_size_t sg_buf_offset, sg_buf_end_offset;
 	struct binder_proc *target_proc = NULL;
 	struct binder_thread *target_thread = NULL;
 	struct binder_node *target_node = NULL;
@@ -2741,10 +2959,12 @@
 	uint32_t return_error = 0;
 	uint32_t return_error_param = 0;
 	uint32_t return_error_line = 0;
-	struct binder_buffer_object *last_fixup_obj = NULL;
+	binder_size_t last_fixup_obj_off = 0;
 	binder_size_t last_fixup_min_off = 0;
 	struct binder_context *context = proc->context;
 	int t_debug_id = atomic_inc_return(&binder_last_id);
+	char *secctx = NULL;
+	u32 secctx_sz = 0;
 
 	e = binder_transaction_log_add(&binder_transaction_log);
 	e->debug_id = t_debug_id;
@@ -2786,7 +3006,6 @@
 		}
 		thread->transaction_stack = in_reply_to->to_parent;
 		binder_inner_proc_unlock(proc);
-		binder_set_nice(in_reply_to->saved_priority);
 		target_thread = binder_get_txn_from_and_acq_inner(in_reply_to);
 		if (target_thread == NULL) {
 			return_error = BR_DEAD_REPLY;
@@ -2982,7 +3201,38 @@
 	t->to_thread = target_thread;
 	t->code = tr->code;
 	t->flags = tr->flags;
-	t->priority = task_nice(current);
+	if (!(t->flags & TF_ONE_WAY) &&
+	    binder_supported_policy(current->policy)) {
+		/* Inherit supported policies for synchronous transactions */
+		t->priority.sched_policy = current->policy;
+		t->priority.prio = current->normal_prio;
+	} else {
+		/* Otherwise, fall back to the default priority */
+		t->priority = target_proc->default_priority;
+	}
+
+	if (target_node && target_node->txn_security_ctx) {
+		u32 secid;
+		size_t added_size;
+
+		security_task_getsecid(proc->tsk, &secid);
+		ret = security_secid_to_secctx(secid, &secctx, &secctx_sz);
+		if (ret) {
+			return_error = BR_FAILED_REPLY;
+			return_error_param = ret;
+			return_error_line = __LINE__;
+			goto err_get_secctx_failed;
+		}
+		added_size = ALIGN(secctx_sz, sizeof(u64));
+		extra_buffers_size += added_size;
+		if (extra_buffers_size < added_size) {
+			/* integer overflow of extra_buffers_size */
+			return_error = BR_FAILED_REPLY;
+			return_error_param = EINVAL;
+			return_error_line = __LINE__;
+			goto err_bad_extra_size;
+		}
+	}
 
 	trace_binder_transaction(reply, t, target_node);
 
@@ -3000,16 +3250,30 @@
 		t->buffer = NULL;
 		goto err_binder_alloc_buf_failed;
 	}
+	if (secctx) {
+		size_t buf_offset = ALIGN(tr->data_size, sizeof(void *)) +
+				    ALIGN(tr->offsets_size, sizeof(void *)) +
+				    ALIGN(extra_buffers_size, sizeof(void *)) -
+				    ALIGN(secctx_sz, sizeof(u64));
+
+		t->security_ctx = (uintptr_t)t->buffer->user_data + buf_offset;
+		binder_alloc_copy_to_buffer(&target_proc->alloc,
+					    t->buffer, buf_offset,
+					    secctx, secctx_sz);
+		security_release_secctx(secctx, secctx_sz);
+		secctx = NULL;
+	}
 	t->buffer->debug_id = t->debug_id;
 	t->buffer->transaction = t;
 	t->buffer->target_node = target_node;
 	trace_binder_transaction_alloc_buf(t->buffer);
-	off_start = (binder_size_t *)(t->buffer->data +
-				      ALIGN(tr->data_size, sizeof(void *)));
-	offp = off_start;
 
-	if (copy_from_user(t->buffer->data, (const void __user *)(uintptr_t)
-			   tr->data.ptr.buffer, tr->data_size)) {
+	if (binder_alloc_copy_user_to_buffer(
+				&target_proc->alloc,
+				t->buffer, 0,
+				(const void __user *)
+					(uintptr_t)tr->data.ptr.buffer,
+				tr->data_size)) {
 		binder_user_error("%d:%d got transaction with invalid data ptr\n",
 				proc->pid, thread->pid);
 		return_error = BR_FAILED_REPLY;
@@ -3017,8 +3281,13 @@
 		return_error_line = __LINE__;
 		goto err_copy_data_failed;
 	}
-	if (copy_from_user(offp, (const void __user *)(uintptr_t)
-			   tr->data.ptr.offsets, tr->offsets_size)) {
+	if (binder_alloc_copy_user_to_buffer(
+				&target_proc->alloc,
+				t->buffer,
+				ALIGN(tr->data_size, sizeof(void *)),
+				(const void __user *)
+					(uintptr_t)tr->data.ptr.offsets,
+				tr->offsets_size)) {
 		binder_user_error("%d:%d got transaction with invalid offsets ptr\n",
 				proc->pid, thread->pid);
 		return_error = BR_FAILED_REPLY;
@@ -3043,17 +3312,31 @@
 		return_error_line = __LINE__;
 		goto err_bad_offset;
 	}
-	off_end = (void *)off_start + tr->offsets_size;
-	sg_bufp = (u8 *)(PTR_ALIGN(off_end, sizeof(void *)));
-	sg_buf_end = sg_bufp + extra_buffers_size;
+	off_start_offset = ALIGN(tr->data_size, sizeof(void *));
+	buffer_offset = off_start_offset;
+	off_end_offset = off_start_offset + tr->offsets_size;
+	sg_buf_offset = ALIGN(off_end_offset, sizeof(void *));
+	sg_buf_end_offset = sg_buf_offset + extra_buffers_size -
+		ALIGN(secctx_sz, sizeof(u64));
 	off_min = 0;
-	for (; offp < off_end; offp++) {
+	for (buffer_offset = off_start_offset; buffer_offset < off_end_offset;
+	     buffer_offset += sizeof(binder_size_t)) {
 		struct binder_object_header *hdr;
-		size_t object_size = binder_validate_object(t->buffer, *offp);
+		size_t object_size;
+		struct binder_object object;
+		binder_size_t object_offset;
 
-		if (object_size == 0 || *offp < off_min) {
+		binder_alloc_copy_from_buffer(&target_proc->alloc,
+					      &object_offset,
+					      t->buffer,
+					      buffer_offset,
+					      sizeof(object_offset));
+		object_size = binder_get_object(target_proc, t->buffer,
+						object_offset, &object);
+		if (object_size == 0 || object_offset < off_min) {
 			binder_user_error("%d:%d got transaction with invalid offset (%lld, min %lld max %lld) or object.\n",
-					  proc->pid, thread->pid, (u64)*offp,
+					  proc->pid, thread->pid,
+					  (u64)object_offset,
 					  (u64)off_min,
 					  (u64)t->buffer->data_size);
 			return_error = BR_FAILED_REPLY;
@@ -3062,8 +3345,8 @@
 			goto err_bad_offset;
 		}
 
-		hdr = (struct binder_object_header *)(t->buffer->data + *offp);
-		off_min = *offp + object_size;
+		hdr = &object.hdr;
+		off_min = object_offset + object_size;
 		switch (hdr->type) {
 		case BINDER_TYPE_BINDER:
 		case BINDER_TYPE_WEAK_BINDER: {
@@ -3077,6 +3360,9 @@
 				return_error_line = __LINE__;
 				goto err_translate_failed;
 			}
+			binder_alloc_copy_to_buffer(&target_proc->alloc,
+						    t->buffer, object_offset,
+						    fp, sizeof(*fp));
 		} break;
 		case BINDER_TYPE_HANDLE:
 		case BINDER_TYPE_WEAK_HANDLE: {
@@ -3090,6 +3376,9 @@
 				return_error_line = __LINE__;
 				goto err_translate_failed;
 			}
+			binder_alloc_copy_to_buffer(&target_proc->alloc,
+						    t->buffer, object_offset,
+						    fp, sizeof(*fp));
 		} break;
 
 		case BINDER_TYPE_FD: {
@@ -3105,14 +3394,23 @@
 			}
 			fp->pad_binder = 0;
 			fp->fd = target_fd;
+			binder_alloc_copy_to_buffer(&target_proc->alloc,
+						    t->buffer, object_offset,
+						    fp, sizeof(*fp));
 		} break;
 		case BINDER_TYPE_FDA: {
+			struct binder_object ptr_object;
+			binder_size_t parent_offset;
 			struct binder_fd_array_object *fda =
 				to_binder_fd_array_object(hdr);
+			size_t num_valid = (buffer_offset - off_start_offset) /
+						sizeof(binder_size_t);
 			struct binder_buffer_object *parent =
-				binder_validate_ptr(t->buffer, fda->parent,
-						    off_start,
-						    offp - off_start);
+				binder_validate_ptr(target_proc, t->buffer,
+						    &ptr_object, fda->parent,
+						    off_start_offset,
+						    &parent_offset,
+						    num_valid);
 			if (!parent) {
 				binder_user_error("%d:%d got transaction with invalid parent offset or type\n",
 						  proc->pid, thread->pid);
@@ -3121,9 +3419,11 @@
 				return_error_line = __LINE__;
 				goto err_bad_parent;
 			}
-			if (!binder_validate_fixup(t->buffer, off_start,
-						   parent, fda->parent_offset,
-						   last_fixup_obj,
+			if (!binder_validate_fixup(target_proc, t->buffer,
+						   off_start_offset,
+						   parent_offset,
+						   fda->parent_offset,
+						   last_fixup_obj_off,
 						   last_fixup_min_off)) {
 				binder_user_error("%d:%d got transaction with out-of-order buffer fixup\n",
 						  proc->pid, thread->pid);
@@ -3140,14 +3440,15 @@
 				return_error_line = __LINE__;
 				goto err_translate_failed;
 			}
-			last_fixup_obj = parent;
+			last_fixup_obj_off = parent_offset;
 			last_fixup_min_off =
 				fda->parent_offset + sizeof(u32) * fda->num_fds;
 		} break;
 		case BINDER_TYPE_PTR: {
 			struct binder_buffer_object *bp =
 				to_binder_buffer_object(hdr);
-			size_t buf_left = sg_buf_end - sg_bufp;
+			size_t buf_left = sg_buf_end_offset - sg_buf_offset;
+			size_t num_valid;
 
 			if (bp->length > buf_left) {
 				binder_user_error("%d:%d got transaction with too large buffer\n",
@@ -3157,9 +3458,13 @@
 				return_error_line = __LINE__;
 				goto err_bad_offset;
 			}
-			if (copy_from_user(sg_bufp,
-					   (const void __user *)(uintptr_t)
-					   bp->buffer, bp->length)) {
+			if (binder_alloc_copy_user_to_buffer(
+						&target_proc->alloc,
+						t->buffer,
+						sg_buf_offset,
+						(const void __user *)
+							(uintptr_t)bp->buffer,
+						bp->length)) {
 				binder_user_error("%d:%d got transaction with invalid offsets ptr\n",
 						  proc->pid, thread->pid);
 				return_error_param = -EFAULT;
@@ -3168,14 +3473,16 @@
 				goto err_copy_data_failed;
 			}
 			/* Fixup buffer pointer to target proc address space */
-			bp->buffer = (uintptr_t)sg_bufp +
-				binder_alloc_get_user_buffer_offset(
-						&target_proc->alloc);
-			sg_bufp += ALIGN(bp->length, sizeof(u64));
+			bp->buffer = (uintptr_t)
+				t->buffer->user_data + sg_buf_offset;
+			sg_buf_offset += ALIGN(bp->length, sizeof(u64));
 
-			ret = binder_fixup_parent(t, thread, bp, off_start,
-						  offp - off_start,
-						  last_fixup_obj,
+			num_valid = (buffer_offset - off_start_offset) /
+					sizeof(binder_size_t);
+			ret = binder_fixup_parent(t, thread, bp,
+						  off_start_offset,
+						  num_valid,
+						  last_fixup_obj_off,
 						  last_fixup_min_off);
 			if (ret < 0) {
 				return_error = BR_FAILED_REPLY;
@@ -3183,7 +3490,10 @@
 				return_error_line = __LINE__;
 				goto err_translate_failed;
 			}
-			last_fixup_obj = bp;
+			binder_alloc_copy_to_buffer(&target_proc->alloc,
+						    t->buffer, object_offset,
+						    bp, sizeof(*bp));
+			last_fixup_obj_off = object_offset;
 			last_fixup_min_off = 0;
 		} break;
 		default:
@@ -3210,6 +3520,7 @@
 		binder_enqueue_thread_work_ilocked(target_thread, &t->work);
 		binder_inner_proc_unlock(target_proc);
 		wake_up_interruptible_sync(&target_thread->wait);
+		binder_restore_priority(current, in_reply_to->saved_priority);
 		binder_free_transaction(in_reply_to);
 	} else if (!(t->flags & TF_ONE_WAY)) {
 		BUG_ON(t->buffer->async_transaction != 0);
@@ -3262,13 +3573,18 @@
 err_bad_parent:
 err_copy_data_failed:
 	trace_binder_transaction_failed_buffer_release(t->buffer);
-	binder_transaction_buffer_release(target_proc, t->buffer, offp);
+	binder_transaction_buffer_release(target_proc, t->buffer,
+					  buffer_offset, true);
 	if (target_node)
 		binder_dec_node_tmpref(target_node);
 	target_node = NULL;
 	t->buffer->transaction = NULL;
 	binder_alloc_free_buf(&target_proc->alloc, t->buffer);
 err_binder_alloc_buf_failed:
+err_bad_extra_size:
+	if (secctx)
+		security_release_secctx(secctx, secctx_sz);
+err_get_secctx_failed:
 	kfree(tcomplete);
 	binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);
 err_alloc_tcomplete_failed:
@@ -3314,6 +3630,7 @@
 
 	BUG_ON(thread->return_error.cmd != BR_OK);
 	if (in_reply_to) {
+		binder_restore_priority(current, in_reply_to->saved_priority);
 		thread->return_error.cmd = BR_TRANSACTION_COMPLETE;
 		binder_enqueue_thread_work(thread, &thread->return_error.work);
 		binder_send_failed_reply(in_reply_to, return_error);
@@ -3540,7 +3857,7 @@
 				binder_node_inner_unlock(buf_node);
 			}
 			trace_binder_transaction_buffer_release(buffer);
-			binder_transaction_buffer_release(proc, buffer, NULL);
+			binder_transaction_buffer_release(proc, buffer, 0, false);
 			binder_alloc_free_buf(&proc->alloc, buffer);
 			break;
 		}
@@ -3900,7 +4217,7 @@
 			wait_event_interruptible(binder_user_error_wait,
 						 binder_stop_on_user_error < 2);
 		}
-		binder_set_nice(proc->default_priority);
+		binder_restore_priority(current, proc->default_priority);
 	}
 
 	if (non_block) {
@@ -3917,11 +4234,13 @@
 
 	while (1) {
 		uint32_t cmd;
-		struct binder_transaction_data tr;
+		struct binder_transaction_data_secctx tr;
+		struct binder_transaction_data *trd = &tr.transaction_data;
 		struct binder_work *w = NULL;
 		struct list_head *list = NULL;
 		struct binder_transaction *t = NULL;
 		struct binder_thread *t_from;
+		size_t trsize = sizeof(*trd);
 
 		binder_inner_proc_lock(proc);
 		if (!binder_worklist_empty_ilocked(&thread->todo))
@@ -4115,45 +4434,47 @@
 		BUG_ON(t->buffer == NULL);
 		if (t->buffer->target_node) {
 			struct binder_node *target_node = t->buffer->target_node;
+			struct binder_priority node_prio;
 
-			tr.target.ptr = target_node->ptr;
-			tr.cookie =  target_node->cookie;
-			t->saved_priority = task_nice(current);
-			if (t->priority < target_node->min_priority &&
-			    !(t->flags & TF_ONE_WAY))
-				binder_set_nice(t->priority);
-			else if (!(t->flags & TF_ONE_WAY) ||
-				 t->saved_priority > target_node->min_priority)
-				binder_set_nice(target_node->min_priority);
+			trd->target.ptr = target_node->ptr;
+			trd->cookie =  target_node->cookie;
+			node_prio.sched_policy = target_node->sched_policy;
+			node_prio.prio = target_node->min_priority;
+			binder_transaction_priority(current, t, node_prio,
+						    target_node->inherit_rt);
 			cmd = BR_TRANSACTION;
 		} else {
-			tr.target.ptr = 0;
-			tr.cookie = 0;
+			trd->target.ptr = 0;
+			trd->cookie = 0;
 			cmd = BR_REPLY;
 		}
-		tr.code = t->code;
-		tr.flags = t->flags;
-		tr.sender_euid = from_kuid(current_user_ns(), t->sender_euid);
+		trd->code = t->code;
+		trd->flags = t->flags;
+		trd->sender_euid = from_kuid(current_user_ns(), t->sender_euid);
 
 		t_from = binder_get_txn_from(t);
 		if (t_from) {
 			struct task_struct *sender = t_from->proc->tsk;
 
-			tr.sender_pid = task_tgid_nr_ns(sender,
-							task_active_pid_ns(current));
+			trd->sender_pid =
+				task_tgid_nr_ns(sender,
+						task_active_pid_ns(current));
 		} else {
-			tr.sender_pid = 0;
+			trd->sender_pid = 0;
 		}
 
-		tr.data_size = t->buffer->data_size;
-		tr.offsets_size = t->buffer->offsets_size;
-		tr.data.ptr.buffer = (binder_uintptr_t)
-			((uintptr_t)t->buffer->data +
-			binder_alloc_get_user_buffer_offset(&proc->alloc));
-		tr.data.ptr.offsets = tr.data.ptr.buffer +
+		trd->data_size = t->buffer->data_size;
+		trd->offsets_size = t->buffer->offsets_size;
+		trd->data.ptr.buffer = (uintptr_t)t->buffer->user_data;
+		trd->data.ptr.offsets = trd->data.ptr.buffer +
 					ALIGN(t->buffer->data_size,
 					    sizeof(void *));
 
+		tr.secctx = t->security_ctx;
+		if (t->security_ctx) {
+			cmd = BR_TRANSACTION_SEC_CTX;
+			trsize = sizeof(tr);
+		}
 		if (put_user(cmd, (uint32_t __user *)ptr)) {
 			if (t_from)
 				binder_thread_dec_tmpref(t_from);
@@ -4164,7 +4485,7 @@
 			return -EFAULT;
 		}
 		ptr += sizeof(uint32_t);
-		if (copy_to_user(ptr, &tr, sizeof(tr))) {
+		if (copy_to_user(ptr, &tr, trsize)) {
 			if (t_from)
 				binder_thread_dec_tmpref(t_from);
 
@@ -4173,7 +4494,7 @@
 
 			return -EFAULT;
 		}
-		ptr += sizeof(tr);
+		ptr += trsize;
 
 		trace_binder_transaction_received(t);
 		binder_stat_br(proc, thread, cmd);
@@ -4181,16 +4502,18 @@
 			     "%d:%d %s %d %d:%d, cmd %d size %zd-%zd ptr %016llx-%016llx\n",
 			     proc->pid, thread->pid,
 			     (cmd == BR_TRANSACTION) ? "BR_TRANSACTION" :
-			     "BR_REPLY",
+				(cmd == BR_TRANSACTION_SEC_CTX) ?
+				     "BR_TRANSACTION_SEC_CTX" : "BR_REPLY",
 			     t->debug_id, t_from ? t_from->proc->pid : 0,
 			     t_from ? t_from->pid : 0, cmd,
 			     t->buffer->data_size, t->buffer->offsets_size,
-			     (u64)tr.data.ptr.buffer, (u64)tr.data.ptr.offsets);
+			     (u64)trd->data.ptr.buffer,
+			     (u64)trd->data.ptr.offsets);
 
 		if (t_from)
 			binder_thread_dec_tmpref(t_from);
 		t->buffer->allow_user_free = 1;
-		if (cmd == BR_TRANSACTION && !(t->flags & TF_ONE_WAY)) {
+		if (cmd != BR_REPLY && !(t->flags & TF_ONE_WAY)) {
 			binder_inner_proc_lock(thread->proc);
 			t->to_parent = thread->transaction_stack;
 			t->to_thread = thread;
@@ -4302,6 +4625,8 @@
 	binder_stats_created(BINDER_STAT_THREAD);
 	thread->proc = proc;
 	thread->pid = current->pid;
+	get_task_struct(current);
+	thread->task = current;
 	atomic_set(&thread->tmp_ref, 0);
 	init_waitqueue_head(&thread->wait);
 	INIT_LIST_HEAD(&thread->todo);
@@ -4352,6 +4677,7 @@
 	BUG_ON(!list_empty(&thread->todo));
 	binder_stats_deleted(BINDER_STAT_THREAD);
 	binder_proc_dec_tmpref(thread->proc);
+	put_task_struct(thread->task);
 	kfree(thread);
 }
 
@@ -4532,7 +4858,8 @@
 	return ret;
 }
 
-static int binder_ioctl_set_ctx_mgr(struct file *filp)
+static int binder_ioctl_set_ctx_mgr(struct file *filp,
+				    struct flat_binder_object *fbo)
 {
 	int ret = 0;
 	struct binder_proc *proc = filp->private_data;
@@ -4561,7 +4888,7 @@
 	} else {
 		context->binder_context_mgr_uid = curr_euid;
 	}
-	new_node = binder_new_node(proc, NULL);
+	new_node = binder_new_node(proc, fbo);
 	if (!new_node) {
 		ret = -ENOMEM;
 		goto out;
@@ -4579,6 +4906,42 @@
 	return ret;
 }
 
+static int binder_ioctl_get_node_info_for_ref(struct binder_proc *proc,
+		struct binder_node_info_for_ref *info)
+{
+	struct binder_node *node;
+	struct binder_context *context = proc->context;
+	__u32 handle = info->handle;
+
+	if (info->strong_count || info->weak_count || info->reserved1 ||
+	    info->reserved2 || info->reserved3) {
+		binder_user_error("%d BINDER_GET_NODE_INFO_FOR_REF: only handle may be non-zero.",
+				  proc->pid);
+		return -EINVAL;
+	}
+
+	/* This ioctl may only be used by the context manager */
+	mutex_lock(&context->context_mgr_node_lock);
+	if (!context->binder_context_mgr_node ||
+		context->binder_context_mgr_node->proc != proc) {
+		mutex_unlock(&context->context_mgr_node_lock);
+		return -EPERM;
+	}
+	mutex_unlock(&context->context_mgr_node_lock);
+
+	node = binder_get_node_from_ref(proc, handle, true, NULL);
+	if (!node)
+		return -EINVAL;
+
+	info->strong_count = node->local_strong_refs +
+		node->internal_strong_refs;
+	info->weak_count = node->local_weak_refs;
+
+	binder_put_node(node);
+
+	return 0;
+}
+
 static int binder_ioctl_get_node_debug_info(struct binder_proc *proc,
 				struct binder_node_debug_info *info)
 {
@@ -4648,8 +5011,20 @@
 		binder_inner_proc_unlock(proc);
 		break;
 	}
+	case BINDER_SET_CONTEXT_MGR_EXT: {
+		struct flat_binder_object fbo;
+
+		if (copy_from_user(&fbo, ubuf, sizeof(fbo))) {
+			ret = -EINVAL;
+			goto err;
+		}
+		ret = binder_ioctl_set_ctx_mgr(filp, &fbo);
+		if (ret)
+			goto err;
+		break;
+	}
 	case BINDER_SET_CONTEXT_MGR:
-		ret = binder_ioctl_set_ctx_mgr(filp);
+		ret = binder_ioctl_set_ctx_mgr(filp, NULL);
 		if (ret)
 			goto err;
 		break;
@@ -4673,6 +5048,25 @@
 		}
 		break;
 	}
+	case BINDER_GET_NODE_INFO_FOR_REF: {
+		struct binder_node_info_for_ref info;
+
+		if (copy_from_user(&info, ubuf, sizeof(info))) {
+			ret = -EFAULT;
+			goto err;
+		}
+
+		ret = binder_ioctl_get_node_info_for_ref(proc, &info);
+		if (ret < 0)
+			goto err;
+
+		if (copy_to_user(ubuf, &info, sizeof(info))) {
+			ret = -EFAULT;
+			goto err;
+		}
+
+		break;
+	}
 	case BINDER_GET_NODE_DEBUG_INFO: {
 		struct binder_node_debug_info info;
 
@@ -4789,6 +5183,8 @@
 {
 	struct binder_proc *proc;
 	struct binder_device *binder_dev;
+	struct binderfs_info *info;
+	struct dentry *binder_binderfs_dir_entry_proc = NULL;
 
 	binder_debug(BINDER_DEBUG_OPEN_CLOSE, "%s: %d:%d\n", __func__,
 		     current->group_leader->pid, current->pid);
@@ -4802,9 +5198,23 @@
 	proc->tsk = current->group_leader;
 	mutex_init(&proc->files_lock);
 	INIT_LIST_HEAD(&proc->todo);
-	proc->default_priority = task_nice(current);
-	binder_dev = container_of(filp->private_data, struct binder_device,
-				  miscdev);
+	if (binder_supported_policy(current->policy)) {
+		proc->default_priority.sched_policy = current->policy;
+		proc->default_priority.prio = current->normal_prio;
+	} else {
+		proc->default_priority.sched_policy = SCHED_NORMAL;
+		proc->default_priority.prio = NICE_TO_PRIO(0);
+	}
+
+	/* binderfs stashes devices in i_private */
+	if (is_binderfs_device(nodp)) {
+		binder_dev = nodp->i_private;
+		info = nodp->i_sb->s_fs_info;
+		binder_binderfs_dir_entry_proc = info->proc_log_dir;
+	} else {
+		binder_dev = container_of(filp->private_data,
+					  struct binder_device, miscdev);
+	}
 	proc->context = &binder_dev->context;
 	binder_alloc_init(&proc->alloc);
 
@@ -4832,7 +5242,36 @@
 		proc->debugfs_entry = debugfs_create_file(strbuf, 0444,
 			binder_debugfs_dir_entry_proc,
 			(void *)(unsigned long)proc->pid,
-			&binder_proc_fops);
+			&proc_fops);
+	}
+
+	if (binder_binderfs_dir_entry_proc) {
+		char strbuf[11];
+		struct dentry *binderfs_entry;
+
+		snprintf(strbuf, sizeof(strbuf), "%u", proc->pid);
+		/*
+		 * Similar to debugfs, the process specific log file is shared
+		 * between contexts. If the file has already been created for a
+		 * process, the following binderfs_create_file() call will
+		 * fail with error code EEXIST if another context of the same
+		 * process invoked binder_open(). This is ok since same as
+		 * debugfs, the log file will contain information on all
+		 * contexts of a given PID.
+		 */
+		binderfs_entry = binderfs_create_file(binder_binderfs_dir_entry_proc,
+			strbuf, &proc_fops, (void *)(unsigned long)proc->pid);
+		if (!IS_ERR(binderfs_entry)) {
+			proc->binderfs_entry = binderfs_entry;
+		} else {
+			int error;
+
+			error = PTR_ERR(binderfs_entry);
+			if (error != -EEXIST) {
+				pr_warn("Unable to create file %s in binderfs (error %d)\n",
+					strbuf, error);
+			}
+		}
 	}
 
 	return 0;
@@ -4874,6 +5313,12 @@
 	struct binder_proc *proc = filp->private_data;
 
 	debugfs_remove(proc->debugfs_entry);
+
+	if (proc->binderfs_entry) {
+		binderfs_remove_file(proc->binderfs_entry);
+		proc->binderfs_entry = NULL;
+	}
+
 	binder_defer_work(proc, BINDER_DEFERRED_RELEASE);
 
 	return 0;
@@ -5096,13 +5541,14 @@
 	spin_lock(&t->lock);
 	to_proc = t->to_proc;
 	seq_printf(m,
-		   "%s %d: %pK from %d:%d to %d:%d code %x flags %x pri %ld r%d",
+		   "%s %d: %pK from %d:%d to %d:%d code %x flags %x pri %d:%d r%d",
 		   prefix, t->debug_id, t,
 		   t->from ? t->from->proc->pid : 0,
 		   t->from ? t->from->pid : 0,
 		   to_proc ? to_proc->pid : 0,
 		   t->to_thread ? t->to_thread->pid : 0,
-		   t->code, t->flags, t->priority, t->need_reply);
+		   t->code, t->flags, t->priority.sched_policy,
+		   t->priority.prio, t->need_reply);
 	spin_unlock(&t->lock);
 
 	if (proc != to_proc) {
@@ -5122,7 +5568,7 @@
 		seq_printf(m, " node %d", buffer->target_node->debug_id);
 	seq_printf(m, " size %zd:%zd data %pK\n",
 		   buffer->data_size, buffer->offsets_size,
-		   buffer->data);
+		   buffer->user_data);
 }
 
 static void print_binder_work_ilocked(struct seq_file *m,
@@ -5220,8 +5666,9 @@
 	hlist_for_each_entry(ref, &node->refs, node_entry)
 		count++;
 
-	seq_printf(m, "  node %d: u%016llx c%016llx hs %d hw %d ls %d lw %d is %d iw %d tr %d",
+	seq_printf(m, "  node %d: u%016llx c%016llx pri %d:%d hs %d hw %d ls %d lw %d is %d iw %d tr %d",
 		   node->debug_id, (u64)node->ptr, (u64)node->cookie,
+		   node->sched_policy, node->min_priority,
 		   node->has_strong_ref, node->has_weak_ref,
 		   node->local_strong_refs, node->local_weak_refs,
 		   node->internal_strong_refs, count, node->tmp_refs);
@@ -5271,6 +5718,9 @@
 	for (n = rb_first(&proc->nodes); n != NULL; n = rb_next(n)) {
 		struct binder_node *node = rb_entry(n, struct binder_node,
 						    rb_node);
+		if (!print_all && !node->has_async_transaction)
+			continue;
+
 		/*
 		 * take a temporary reference on the node so it
 		 * survives and isn't removed from the tree
@@ -5475,7 +5925,7 @@
 }
 
 
-static int binder_state_show(struct seq_file *m, void *unused)
+int binder_state_show(struct seq_file *m, void *unused)
 {
 	struct binder_proc *proc;
 	struct binder_node *node;
@@ -5514,7 +5964,7 @@
 	return 0;
 }
 
-static int binder_stats_show(struct seq_file *m, void *unused)
+int binder_stats_show(struct seq_file *m, void *unused)
 {
 	struct binder_proc *proc;
 
@@ -5530,7 +5980,7 @@
 	return 0;
 }
 
-static int binder_transactions_show(struct seq_file *m, void *unused)
+int binder_transactions_show(struct seq_file *m, void *unused)
 {
 	struct binder_proc *proc;
 
@@ -5543,7 +5993,7 @@
 	return 0;
 }
 
-static int binder_proc_show(struct seq_file *m, void *unused)
+static int proc_show(struct seq_file *m, void *unused)
 {
 	struct binder_proc *itr;
 	int pid = (unsigned long)m->private;
@@ -5586,7 +6036,7 @@
 			"\n" : " (incomplete)\n");
 }
 
-static int binder_transaction_log_show(struct seq_file *m, void *unused)
+int binder_transaction_log_show(struct seq_file *m, void *unused)
 {
 	struct binder_transaction_log *log = m->private;
 	unsigned int log_cur = atomic_read(&log->cur);
@@ -5607,7 +6057,7 @@
 	return 0;
 }
 
-static const struct file_operations binder_fops = {
+const struct file_operations binder_fops = {
 	.owner = THIS_MODULE,
 	.poll = binder_poll,
 	.unlocked_ioctl = binder_ioctl,
@@ -5618,11 +6068,6 @@
 	.release = binder_release,
 };
 
-BINDER_DEBUG_ENTRY(state);
-BINDER_DEBUG_ENTRY(stats);
-BINDER_DEBUG_ENTRY(transactions);
-BINDER_DEBUG_ENTRY(transaction_log);
-
 static int __init init_binder_device(const char *name)
 {
 	int ret;
@@ -5654,9 +6099,10 @@
 static int __init binder_init(void)
 {
 	int ret;
-	char *device_name, *device_names, *device_tmp;
+	char *device_name, *device_tmp;
 	struct binder_device *device;
 	struct hlist_node *tmp;
+	char *device_names = NULL;
 
 	ret = binder_alloc_shrinker_init();
 	if (ret)
@@ -5698,24 +6144,30 @@
 				    &binder_transaction_log_fops);
 	}
 
-	/*
-	 * Copy the module_parameter string, because we don't want to
-	 * tokenize it in-place.
-	 */
-	device_names = kzalloc(strlen(binder_devices_param) + 1, GFP_KERNEL);
-	if (!device_names) {
-		ret = -ENOMEM;
-		goto err_alloc_device_names_failed;
-	}
-	strcpy(device_names, binder_devices_param);
+	if (!IS_ENABLED(CONFIG_ANDROID_BINDERFS) &&
+	    strcmp(binder_devices_param, "") != 0) {
+		/*
+		* Copy the module_parameter string, because we don't want to
+		* tokenize it in-place.
+		 */
+		device_names = kstrdup(binder_devices_param, GFP_KERNEL);
+		if (!device_names) {
+			ret = -ENOMEM;
+			goto err_alloc_device_names_failed;
+		}
 
-	device_tmp = device_names;
-	while ((device_name = strsep(&device_tmp, ","))) {
-		ret = init_binder_device(device_name);
-		if (ret)
-			goto err_init_binder_device_failed;
+		device_tmp = device_names;
+		while ((device_name = strsep(&device_tmp, ","))) {
+			ret = init_binder_device(device_name);
+			if (ret)
+				goto err_init_binder_device_failed;
+		}
 	}
 
+	ret = init_binderfs();
+	if (ret)
+		goto err_init_binder_device_failed;
+
 	return ret;
 
 err_init_binder_device_failed:
diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c
index c3fdd79..deb3797 100644
--- a/drivers/android/binder_alloc.c
+++ b/drivers/android/binder_alloc.c
@@ -29,6 +29,8 @@
 #include <linux/list_lru.h>
 #include <linux/ratelimit.h>
 #include <asm/cacheflush.h>
+#include <linux/uaccess.h>
+#include <linux/highmem.h>
 #include "binder_alloc.h"
 #include "binder_trace.h"
 
@@ -67,9 +69,8 @@
 				       struct binder_buffer *buffer)
 {
 	if (list_is_last(&buffer->entry, &alloc->buffers))
-		return (u8 *)alloc->buffer +
-			alloc->buffer_size - (u8 *)buffer->data;
-	return (u8 *)binder_buffer_next(buffer)->data - (u8 *)buffer->data;
+		return alloc->buffer + alloc->buffer_size - buffer->user_data;
+	return binder_buffer_next(buffer)->user_data - buffer->user_data;
 }
 
 static void binder_insert_free_buffer(struct binder_alloc *alloc,
@@ -119,9 +120,9 @@
 		buffer = rb_entry(parent, struct binder_buffer, rb_node);
 		BUG_ON(buffer->free);
 
-		if (new_buffer->data < buffer->data)
+		if (new_buffer->user_data < buffer->user_data)
 			p = &parent->rb_left;
-		else if (new_buffer->data > buffer->data)
+		else if (new_buffer->user_data > buffer->user_data)
 			p = &parent->rb_right;
 		else
 			BUG();
@@ -136,17 +137,17 @@
 {
 	struct rb_node *n = alloc->allocated_buffers.rb_node;
 	struct binder_buffer *buffer;
-	void *kern_ptr;
+	void __user *uptr;
 
-	kern_ptr = (void *)(user_ptr - alloc->user_buffer_offset);
+	uptr = (void __user *)user_ptr;
 
 	while (n) {
 		buffer = rb_entry(n, struct binder_buffer, rb_node);
 		BUG_ON(buffer->free);
 
-		if (kern_ptr < buffer->data)
+		if (uptr < buffer->user_data)
 			n = n->rb_left;
-		else if (kern_ptr > buffer->data)
+		else if (uptr > buffer->user_data)
 			n = n->rb_right;
 		else {
 			/*
@@ -186,9 +187,9 @@
 }
 
 static int binder_update_page_range(struct binder_alloc *alloc, int allocate,
-				    void *start, void *end)
+				    void __user *start, void __user *end)
 {
-	void *page_addr;
+	void __user *page_addr;
 	unsigned long user_page_addr;
 	struct binder_lru_page *page;
 	struct vm_area_struct *vma = NULL;
@@ -263,18 +264,7 @@
 		page->alloc = alloc;
 		INIT_LIST_HEAD(&page->lru);
 
-		ret = map_kernel_range_noflush((unsigned long)page_addr,
-					       PAGE_SIZE, PAGE_KERNEL,
-					       &page->page_ptr);
-		flush_cache_vmap((unsigned long)page_addr,
-				(unsigned long)page_addr + PAGE_SIZE);
-		if (ret != 1) {
-			pr_err("%d: binder_alloc_buf failed to map page at %pK in kernel\n",
-			       alloc->pid, page_addr);
-			goto err_map_kernel_failed;
-		}
-		user_page_addr =
-			(uintptr_t)page_addr + alloc->user_buffer_offset;
+		user_page_addr = (uintptr_t)page_addr;
 		ret = vm_insert_page(vma, user_page_addr, page[0].page_ptr);
 		if (ret) {
 			pr_err("%d: binder_alloc_buf failed to map page at %lx in userspace\n",
@@ -313,8 +303,6 @@
 		continue;
 
 err_vm_insert_page_failed:
-		unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE);
-err_map_kernel_failed:
 		__free_page(page->page_ptr);
 		page->page_ptr = NULL;
 err_alloc_page_failed:
@@ -370,8 +358,8 @@
 	struct binder_buffer *buffer;
 	size_t buffer_size;
 	struct rb_node *best_fit = NULL;
-	void *has_page_addr;
-	void *end_page_addr;
+	void __user *has_page_addr;
+	void __user *end_page_addr;
 	size_t size, data_offsets_size;
 	int ret;
 
@@ -469,15 +457,15 @@
 		     "%d: binder_alloc_buf size %zd got buffer %pK size %zd\n",
 		      alloc->pid, size, buffer, buffer_size);
 
-	has_page_addr =
-		(void *)(((uintptr_t)buffer->data + buffer_size) & PAGE_MASK);
+	has_page_addr = (void __user *)
+		(((uintptr_t)buffer->user_data + buffer_size) & PAGE_MASK);
 	WARN_ON(n && buffer_size != size);
 	end_page_addr =
-		(void *)PAGE_ALIGN((uintptr_t)buffer->data + size);
+		(void __user *)PAGE_ALIGN((uintptr_t)buffer->user_data + size);
 	if (end_page_addr > has_page_addr)
 		end_page_addr = has_page_addr;
-	ret = binder_update_page_range(alloc, 1,
-	    (void *)PAGE_ALIGN((uintptr_t)buffer->data), end_page_addr);
+	ret = binder_update_page_range(alloc, 1, (void __user *)
+		PAGE_ALIGN((uintptr_t)buffer->user_data), end_page_addr);
 	if (ret)
 		return ERR_PTR(ret);
 
@@ -490,7 +478,7 @@
 			       __func__, alloc->pid);
 			goto err_alloc_buf_struct_failed;
 		}
-		new_buffer->data = (u8 *)buffer->data + size;
+		new_buffer->user_data = (u8 __user *)buffer->user_data + size;
 		list_add(&new_buffer->entry, &buffer->entry);
 		new_buffer->free = 1;
 		binder_insert_free_buffer(alloc, new_buffer);
@@ -516,8 +504,8 @@
 	return buffer;
 
 err_alloc_buf_struct_failed:
-	binder_update_page_range(alloc, 0,
-				 (void *)PAGE_ALIGN((uintptr_t)buffer->data),
+	binder_update_page_range(alloc, 0, (void __user *)
+				 PAGE_ALIGN((uintptr_t)buffer->user_data),
 				 end_page_addr);
 	return ERR_PTR(-ENOMEM);
 }
@@ -552,14 +540,15 @@
 	return buffer;
 }
 
-static void *buffer_start_page(struct binder_buffer *buffer)
+static void __user *buffer_start_page(struct binder_buffer *buffer)
 {
-	return (void *)((uintptr_t)buffer->data & PAGE_MASK);
+	return (void __user *)((uintptr_t)buffer->user_data & PAGE_MASK);
 }
 
-static void *prev_buffer_end_page(struct binder_buffer *buffer)
+static void __user *prev_buffer_end_page(struct binder_buffer *buffer)
 {
-	return (void *)(((uintptr_t)(buffer->data) - 1) & PAGE_MASK);
+	return (void __user *)
+		(((uintptr_t)(buffer->user_data) - 1) & PAGE_MASK);
 }
 
 static void binder_delete_free_buffer(struct binder_alloc *alloc,
@@ -574,7 +563,8 @@
 		to_free = false;
 		binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
 				   "%d: merge free, buffer %pK share page with %pK\n",
-				   alloc->pid, buffer->data, prev->data);
+				   alloc->pid, buffer->user_data,
+				   prev->user_data);
 	}
 
 	if (!list_is_last(&buffer->entry, &alloc->buffers)) {
@@ -584,23 +574,24 @@
 			binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
 					   "%d: merge free, buffer %pK share page with %pK\n",
 					   alloc->pid,
-					   buffer->data,
-					   next->data);
+					   buffer->user_data,
+					   next->user_data);
 		}
 	}
 
-	if (PAGE_ALIGNED(buffer->data)) {
+	if (PAGE_ALIGNED(buffer->user_data)) {
 		binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
 				   "%d: merge free, buffer start %pK is page aligned\n",
-				   alloc->pid, buffer->data);
+				   alloc->pid, buffer->user_data);
 		to_free = false;
 	}
 
 	if (to_free) {
 		binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
 				   "%d: merge free, buffer %pK do not share page with %pK or %pK\n",
-				   alloc->pid, buffer->data,
-				   prev->data, next ? next->data : NULL);
+				   alloc->pid, buffer->user_data,
+				   prev->user_data,
+				   next ? next->user_data : NULL);
 		binder_update_page_range(alloc, 0, buffer_start_page(buffer),
 					 buffer_start_page(buffer) + PAGE_SIZE);
 	}
@@ -626,8 +617,8 @@
 	BUG_ON(buffer->free);
 	BUG_ON(size > buffer_size);
 	BUG_ON(buffer->transaction != NULL);
-	BUG_ON(buffer->data < alloc->buffer);
-	BUG_ON(buffer->data > alloc->buffer + alloc->buffer_size);
+	BUG_ON(buffer->user_data < alloc->buffer);
+	BUG_ON(buffer->user_data > alloc->buffer + alloc->buffer_size);
 
 	if (buffer->async_transaction) {
 		alloc->free_async_space += size + sizeof(struct binder_buffer);
@@ -638,8 +629,9 @@
 	}
 
 	binder_update_page_range(alloc, 0,
-		(void *)PAGE_ALIGN((uintptr_t)buffer->data),
-		(void *)(((uintptr_t)buffer->data + buffer_size) & PAGE_MASK));
+		(void __user *)PAGE_ALIGN((uintptr_t)buffer->user_data),
+		(void __user *)(((uintptr_t)
+			  buffer->user_data + buffer_size) & PAGE_MASK));
 
 	rb_erase(&buffer->rb_node, &alloc->allocated_buffers);
 	buffer->free = 1;
@@ -695,7 +687,6 @@
 			      struct vm_area_struct *vma)
 {
 	int ret;
-	struct vm_struct *area;
 	const char *failure_string;
 	struct binder_buffer *buffer;
 
@@ -706,28 +697,9 @@
 		goto err_already_mapped;
 	}
 
-	area = get_vm_area(vma->vm_end - vma->vm_start, VM_ALLOC);
-	if (area == NULL) {
-		ret = -ENOMEM;
-		failure_string = "get_vm_area";
-		goto err_get_vm_area_failed;
-	}
-	alloc->buffer = area->addr;
-	alloc->user_buffer_offset =
-		vma->vm_start - (uintptr_t)alloc->buffer;
+	alloc->buffer = (void __user *)vma->vm_start;
 	mutex_unlock(&binder_alloc_mmap_lock);
 
-#ifdef CONFIG_CPU_CACHE_VIPT
-	if (cache_is_vipt_aliasing()) {
-		while (CACHE_COLOUR(
-				(vma->vm_start ^ (uint32_t)alloc->buffer))) {
-			pr_info("%s: %d %lx-%lx maps %pK bad alignment\n",
-				__func__, alloc->pid, vma->vm_start,
-				vma->vm_end, alloc->buffer);
-			vma->vm_start += PAGE_SIZE;
-		}
-	}
-#endif
 	alloc->pages = kcalloc((vma->vm_end - vma->vm_start) / PAGE_SIZE,
 			       sizeof(alloc->pages[0]),
 			       GFP_KERNEL);
@@ -745,7 +717,7 @@
 		goto err_alloc_buf_struct_failed;
 	}
 
-	buffer->data = alloc->buffer;
+	buffer->user_data = alloc->buffer;
 	list_add(&buffer->entry, &alloc->buffers);
 	buffer->free = 1;
 	binder_insert_free_buffer(alloc, buffer);
@@ -760,9 +732,7 @@
 	alloc->pages = NULL;
 err_alloc_pages_failed:
 	mutex_lock(&binder_alloc_mmap_lock);
-	vfree(alloc->buffer);
 	alloc->buffer = NULL;
-err_get_vm_area_failed:
 err_already_mapped:
 	mutex_unlock(&binder_alloc_mmap_lock);
 	binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
@@ -808,7 +778,7 @@
 		int i;
 
 		for (i = 0; i < alloc->buffer_size / PAGE_SIZE; i++) {
-			void *page_addr;
+			void __user *page_addr;
 			bool on_lru;
 
 			if (!alloc->pages[i].page_ptr)
@@ -821,12 +791,10 @@
 				     "%s: %d: page %d at %pK %s\n",
 				     __func__, alloc->pid, i, page_addr,
 				     on_lru ? "on lru" : "active");
-			unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE);
 			__free_page(alloc->pages[i].page_ptr);
 			page_count++;
 		}
 		kfree(alloc->pages);
-		vfree(alloc->buffer);
 	}
 	mutex_unlock(&alloc->mutex);
 	if (alloc->vma_vm_mm)
@@ -841,7 +809,7 @@
 				struct binder_buffer *buffer)
 {
 	seq_printf(m, "%s %d: %pK size %zd:%zd:%zd %s\n",
-		   prefix, buffer->debug_id, buffer->data,
+		   prefix, buffer->debug_id, buffer->user_data,
 		   buffer->data_size, buffer->offsets_size,
 		   buffer->extra_buffers_size,
 		   buffer->transaction ? "active" : "delivered");
@@ -980,9 +948,7 @@
 	if (vma) {
 		trace_binder_unmap_user_start(alloc, index);
 
-		zap_page_range(vma,
-			       page_addr + alloc->user_buffer_offset,
-			       PAGE_SIZE);
+		zap_page_range(vma, page_addr, PAGE_SIZE);
 
 		trace_binder_unmap_user_end(alloc, index);
 	}
@@ -991,7 +957,6 @@
 
 	trace_binder_unmap_kernel_start(alloc, index);
 
-	unmap_kernel_range(page_addr, PAGE_SIZE);
 	__free_page(page->page_ptr);
 	page->page_ptr = NULL;
 
@@ -1058,3 +1023,173 @@
 	}
 	return ret;
 }
+
+/**
+ * check_buffer() - verify that buffer/offset is safe to access
+ * @alloc: binder_alloc for this proc
+ * @buffer: binder buffer to be accessed
+ * @offset: offset into @buffer data
+ * @bytes: bytes to access from offset
+ *
+ * Check that the @offset/@bytes are within the size of the given
+ * @buffer and that the buffer is currently active and not freeable.
+ * Offsets must also be multiples of sizeof(u32). The kernel is
+ * allowed to touch the buffer in two cases:
+ *
+ * 1) when the buffer is being created:
+ *     (buffer->free == 0 && buffer->allow_user_free == 0)
+ * 2) when the buffer is being torn down:
+ *     (buffer->free == 0 && buffer->transaction == NULL).
+ *
+ * Return: true if the buffer is safe to access
+ */
+static inline bool check_buffer(struct binder_alloc *alloc,
+				struct binder_buffer *buffer,
+				binder_size_t offset, size_t bytes)
+{
+	size_t buffer_size = binder_alloc_buffer_size(alloc, buffer);
+
+	return buffer_size >= bytes &&
+		offset <= buffer_size - bytes &&
+		IS_ALIGNED(offset, sizeof(u32)) &&
+		!buffer->free &&
+		(!buffer->allow_user_free || !buffer->transaction);
+}
+
+/**
+ * binder_alloc_get_page() - get kernel pointer for given buffer offset
+ * @alloc: binder_alloc for this proc
+ * @buffer: binder buffer to be accessed
+ * @buffer_offset: offset into @buffer data
+ * @pgoffp: address to copy final page offset to
+ *
+ * Lookup the struct page corresponding to the address
+ * at @buffer_offset into @buffer->user_data. If @pgoffp is not
+ * NULL, the byte-offset into the page is written there.
+ *
+ * The caller is responsible to ensure that the offset points
+ * to a valid address within the @buffer and that @buffer is
+ * not freeable by the user. Since it can't be freed, we are
+ * guaranteed that the corresponding elements of @alloc->pages[]
+ * cannot change.
+ *
+ * Return: struct page
+ */
+static struct page *binder_alloc_get_page(struct binder_alloc *alloc,
+					  struct binder_buffer *buffer,
+					  binder_size_t buffer_offset,
+					  pgoff_t *pgoffp)
+{
+	binder_size_t buffer_space_offset = buffer_offset +
+		(buffer->user_data - alloc->buffer);
+	pgoff_t pgoff = buffer_space_offset & ~PAGE_MASK;
+	size_t index = buffer_space_offset >> PAGE_SHIFT;
+	struct binder_lru_page *lru_page;
+
+	lru_page = &alloc->pages[index];
+	*pgoffp = pgoff;
+	return lru_page->page_ptr;
+}
+
+/**
+ * binder_alloc_copy_user_to_buffer() - copy src user to tgt user
+ * @alloc: binder_alloc for this proc
+ * @buffer: binder buffer to be accessed
+ * @buffer_offset: offset into @buffer data
+ * @from: userspace pointer to source buffer
+ * @bytes: bytes to copy
+ *
+ * Copy bytes from source userspace to target buffer.
+ *
+ * Return: bytes remaining to be copied
+ */
+unsigned long
+binder_alloc_copy_user_to_buffer(struct binder_alloc *alloc,
+				 struct binder_buffer *buffer,
+				 binder_size_t buffer_offset,
+				 const void __user *from,
+				 size_t bytes)
+{
+	if (!check_buffer(alloc, buffer, buffer_offset, bytes))
+		return bytes;
+
+	while (bytes) {
+		unsigned long size;
+		unsigned long ret;
+		struct page *page;
+		pgoff_t pgoff;
+		void *kptr;
+
+		page = binder_alloc_get_page(alloc, buffer,
+					     buffer_offset, &pgoff);
+		size = min_t(size_t, bytes, PAGE_SIZE - pgoff);
+		kptr = kmap(page) + pgoff;
+		ret = copy_from_user(kptr, from, size);
+		kunmap(page);
+		if (ret)
+			return bytes - size + ret;
+		bytes -= size;
+		from += size;
+		buffer_offset += size;
+	}
+	return 0;
+}
+
+static void binder_alloc_do_buffer_copy(struct binder_alloc *alloc,
+					bool to_buffer,
+					struct binder_buffer *buffer,
+					binder_size_t buffer_offset,
+					void *ptr,
+					size_t bytes)
+{
+	/* All copies must be 32-bit aligned and 32-bit size */
+	BUG_ON(!check_buffer(alloc, buffer, buffer_offset, bytes));
+
+	while (bytes) {
+		unsigned long size;
+		struct page *page;
+		pgoff_t pgoff;
+		void *tmpptr;
+		void *base_ptr;
+
+		page = binder_alloc_get_page(alloc, buffer,
+					     buffer_offset, &pgoff);
+		size = min_t(size_t, bytes, PAGE_SIZE - pgoff);
+		base_ptr = kmap_atomic(page);
+		tmpptr = base_ptr + pgoff;
+		if (to_buffer)
+			memcpy(tmpptr, ptr, size);
+		else
+			memcpy(ptr, tmpptr, size);
+		/*
+		 * kunmap_atomic() takes care of flushing the cache
+		 * if this device has VIVT cache arch
+		 */
+		kunmap_atomic(base_ptr);
+		bytes -= size;
+		pgoff = 0;
+		ptr = ptr + size;
+		buffer_offset += size;
+	}
+}
+
+void binder_alloc_copy_to_buffer(struct binder_alloc *alloc,
+				 struct binder_buffer *buffer,
+				 binder_size_t buffer_offset,
+				 void *src,
+				 size_t bytes)
+{
+	binder_alloc_do_buffer_copy(alloc, true, buffer, buffer_offset,
+				    src, bytes);
+}
+
+void binder_alloc_copy_from_buffer(struct binder_alloc *alloc,
+				   void *dest,
+				   struct binder_buffer *buffer,
+				   binder_size_t buffer_offset,
+				   size_t bytes)
+{
+	binder_alloc_do_buffer_copy(alloc, false, buffer, buffer_offset,
+				    dest, bytes);
+}
+
diff --git a/drivers/android/binder_alloc.h b/drivers/android/binder_alloc.h
index fb3238c..b60d161 100644
--- a/drivers/android/binder_alloc.h
+++ b/drivers/android/binder_alloc.h
@@ -22,6 +22,7 @@
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
 #include <linux/list_lru.h>
+#include <uapi/linux/android/binder.h>
 
 extern struct list_lru binder_alloc_lru;
 struct binder_transaction;
@@ -30,16 +31,16 @@
  * struct binder_buffer - buffer used for binder transactions
  * @entry:              entry alloc->buffers
  * @rb_node:            node for allocated_buffers/free_buffers rb trees
- * @free:               true if buffer is free
- * @allow_user_free:    describe the second member of struct blah,
- * @async_transaction:  describe the second member of struct blah,
- * @debug_id:           describe the second member of struct blah,
- * @transaction:        describe the second member of struct blah,
- * @target_node:        describe the second member of struct blah,
- * @data_size:          describe the second member of struct blah,
- * @offsets_size:       describe the second member of struct blah,
- * @extra_buffers_size: describe the second member of struct blah,
- * @data:i              describe the second member of struct blah,
+ * @free:               %true if buffer is free
+ * @allow_user_free:    %true if user is allowed to free buffer
+ * @async_transaction:  %true if buffer is in use for an async txn
+ * @debug_id:           unique ID for debugging
+ * @transaction:        pointer to associated struct binder_transaction
+ * @target_node:        struct binder_node associated with this buffer
+ * @data_size:          size of @transaction data
+ * @offsets_size:       size of array of offsets
+ * @extra_buffers_size: size of space for other objects (like sg lists)
+ * @user_data:          user pointer to base of buffer space
  *
  * Bookkeeping structure for binder transaction buffers
  */
@@ -58,7 +59,7 @@
 	size_t data_size;
 	size_t offsets_size;
 	size_t extra_buffers_size;
-	void *data;
+	void __user *user_data;
 };
 
 /**
@@ -81,7 +82,6 @@
  *                      (invariant after init)
  * @vma_vm_mm:          copy of vma->vm_mm (invarient after mmap)
  * @buffer:             base of per-proc address space mapped via mmap
- * @user_buffer_offset: offset between user and kernel VAs for buffer
  * @buffers:            list of all buffers for this proc
  * @free_buffers:       rb tree of buffers available for allocation
  *                      sorted by size
@@ -102,8 +102,7 @@
 	struct mutex mutex;
 	struct vm_area_struct *vma;
 	struct mm_struct *vma_vm_mm;
-	void *buffer;
-	ptrdiff_t user_buffer_offset;
+	void __user *buffer;
 	struct list_head buffers;
 	struct rb_root free_buffers;
 	struct rb_root allocated_buffers;
@@ -162,26 +161,24 @@
 	return free_async_space;
 }
 
-/**
- * binder_alloc_get_user_buffer_offset() - get offset between kernel/user addrs
- * @alloc:	binder_alloc for this proc
- *
- * Return:	the offset between kernel and user-space addresses to use for
- * virtual address conversion
- */
-static inline ptrdiff_t
-binder_alloc_get_user_buffer_offset(struct binder_alloc *alloc)
-{
-	/*
-	 * user_buffer_offset is constant if vma is set and
-	 * undefined if vma is not set. It is possible to
-	 * get here with !alloc->vma if the target process
-	 * is dying while a transaction is being initiated.
-	 * Returning the old value is ok in this case and
-	 * the transaction will fail.
-	 */
-	return alloc->user_buffer_offset;
-}
+unsigned long
+binder_alloc_copy_user_to_buffer(struct binder_alloc *alloc,
+				 struct binder_buffer *buffer,
+				 binder_size_t buffer_offset,
+				 const void __user *from,
+				 size_t bytes);
+
+void binder_alloc_copy_to_buffer(struct binder_alloc *alloc,
+				 struct binder_buffer *buffer,
+				 binder_size_t buffer_offset,
+				 void *src,
+				 size_t bytes);
+
+void binder_alloc_copy_from_buffer(struct binder_alloc *alloc,
+				   void *dest,
+				   struct binder_buffer *buffer,
+				   binder_size_t buffer_offset,
+				   size_t bytes);
 
 #endif /* _LINUX_BINDER_ALLOC_H */
 
diff --git a/drivers/android/binder_alloc_selftest.c b/drivers/android/binder_alloc_selftest.c
index 8bd7bce..b727089 100644
--- a/drivers/android/binder_alloc_selftest.c
+++ b/drivers/android/binder_alloc_selftest.c
@@ -102,11 +102,12 @@
 					 struct binder_buffer *buffer,
 					 size_t size)
 {
-	void *page_addr, *end;
+	void __user *page_addr;
+	void __user *end;
 	int page_index;
 
-	end = (void *)PAGE_ALIGN((uintptr_t)buffer->data + size);
-	page_addr = buffer->data;
+	end = (void __user *)PAGE_ALIGN((uintptr_t)buffer->user_data + size);
+	page_addr = buffer->user_data;
 	for (; page_addr < end; page_addr += PAGE_SIZE) {
 		page_index = (page_addr - alloc->buffer) / PAGE_SIZE;
 		if (!alloc->pages[page_index].page_ptr ||
diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_internal.h
new file mode 100644
index 0000000..bd47f7f
--- /dev/null
+++ b/drivers/android/binder_internal.h
@@ -0,0 +1,144 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef _LINUX_BINDER_INTERNAL_H
+#define _LINUX_BINDER_INTERNAL_H
+
+#include <linux/export.h>
+#include <linux/fs.h>
+#include <linux/list.h>
+#include <linux/miscdevice.h>
+#include <linux/mutex.h>
+#include <linux/stddef.h>
+#include <linux/types.h>
+#include <linux/uidgid.h>
+
+struct binder_context {
+	struct binder_node *binder_context_mgr_node;
+	struct mutex context_mgr_node_lock;
+	kuid_t binder_context_mgr_uid;
+	const char *name;
+};
+
+/**
+ * struct binder_device - information about a binder device node
+ * @hlist:          list of binder devices (only used for devices requested via
+ *                  CONFIG_ANDROID_BINDER_DEVICES)
+ * @miscdev:        information about a binder character device node
+ * @context:        binder context information
+ * @binderfs_inode: This is the inode of the root dentry of the super block
+ *                  belonging to a binderfs mount.
+ */
+struct binder_device {
+	struct hlist_node hlist;
+	struct miscdevice miscdev;
+	struct binder_context context;
+	struct inode *binderfs_inode;
+};
+
+/**
+ * binderfs_mount_opts - mount options for binderfs
+ * @max: maximum number of allocatable binderfs binder devices
+ * @stats_mode: enable binder stats in binderfs.
+ */
+struct binderfs_mount_opts {
+	int max;
+	int stats_mode;
+};
+
+/**
+ * binderfs_info - information about a binderfs mount
+ * @ipc_ns:         The ipc namespace the binderfs mount belongs to.
+ * @control_dentry: This records the dentry of this binderfs mount
+ *                  binder-control device.
+ * @root_uid:       uid that needs to be used when a new binder device is
+ *                  created.
+ * @root_gid:       gid that needs to be used when a new binder device is
+ *                  created.
+ * @mount_opts:     The mount options in use.
+ * @device_count:   The current number of allocated binder devices.
+ * @proc_log_dir:   Pointer to the directory dentry containing process-specific
+ *                  logs.
+ */
+struct binderfs_info {
+	struct ipc_namespace *ipc_ns;
+	struct dentry *control_dentry;
+	kuid_t root_uid;
+	kgid_t root_gid;
+	struct binderfs_mount_opts mount_opts;
+	int device_count;
+	struct dentry *proc_log_dir;
+};
+
+extern const struct file_operations binder_fops;
+
+extern char *binder_devices_param;
+
+#ifdef CONFIG_ANDROID_BINDERFS
+extern bool is_binderfs_device(const struct inode *inode);
+extern struct dentry *binderfs_create_file(struct dentry *dir, const char *name,
+					   const struct file_operations *fops,
+					   void *data);
+extern void binderfs_remove_file(struct dentry *dentry);
+#else
+static inline bool is_binderfs_device(const struct inode *inode)
+{
+	return false;
+}
+static inline struct dentry *binderfs_create_file(struct dentry *dir,
+					   const char *name,
+					   const struct file_operations *fops,
+					   void *data)
+{
+	return NULL;
+}
+static inline void binderfs_remove_file(struct dentry *dentry) {}
+#endif
+
+#ifdef CONFIG_ANDROID_BINDERFS
+extern int __init init_binderfs(void);
+#else
+static inline int __init init_binderfs(void)
+{
+	return 0;
+}
+#endif
+
+int binder_stats_show(struct seq_file *m, void *unused);
+DEFINE_SHOW_ATTRIBUTE(binder_stats);
+
+int binder_state_show(struct seq_file *m, void *unused);
+DEFINE_SHOW_ATTRIBUTE(binder_state);
+
+int binder_transactions_show(struct seq_file *m, void *unused);
+DEFINE_SHOW_ATTRIBUTE(binder_transactions);
+
+int binder_transaction_log_show(struct seq_file *m, void *unused);
+DEFINE_SHOW_ATTRIBUTE(binder_transaction_log);
+
+struct binder_transaction_log_entry {
+	int debug_id;
+	int debug_id_done;
+	int call_type;
+	int from_proc;
+	int from_thread;
+	int target_handle;
+	int to_proc;
+	int to_thread;
+	int to_node;
+	int data_size;
+	int offsets_size;
+	int return_error_line;
+	uint32_t return_error;
+	uint32_t return_error_param;
+	const char *context_name;
+};
+
+struct binder_transaction_log {
+	atomic_t cur;
+	bool full;
+	struct binder_transaction_log_entry entry[32];
+};
+
+extern struct binder_transaction_log binder_transaction_log;
+extern struct binder_transaction_log binder_transaction_log_failed;
+#endif /* _LINUX_BINDER_INTERNAL_H */
diff --git a/drivers/android/binder_trace.h b/drivers/android/binder_trace.h
index 588eb3e..7df1e94 100644
--- a/drivers/android/binder_trace.h
+++ b/drivers/android/binder_trace.h
@@ -85,6 +85,30 @@
 DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_write_done);
 DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_read_done);
 
+TRACE_EVENT(binder_set_priority,
+	TP_PROTO(int proc, int thread, unsigned int old_prio,
+		 unsigned int desired_prio, unsigned int new_prio),
+	TP_ARGS(proc, thread, old_prio, new_prio, desired_prio),
+
+	TP_STRUCT__entry(
+		__field(int, proc)
+		__field(int, thread)
+		__field(unsigned int, old_prio)
+		__field(unsigned int, new_prio)
+		__field(unsigned int, desired_prio)
+	),
+	TP_fast_assign(
+		__entry->proc = proc;
+		__entry->thread = thread;
+		__entry->old_prio = old_prio;
+		__entry->new_prio = new_prio;
+		__entry->desired_prio = desired_prio;
+	),
+	TP_printk("proc=%d thread=%d old=%d => new=%d desired=%d",
+		  __entry->proc, __entry->thread, __entry->old_prio,
+		  __entry->new_prio, __entry->desired_prio)
+);
+
 TRACE_EVENT(binder_wait_for_work,
 	TP_PROTO(bool proc_work, bool transaction_stack, bool thread_todo),
 	TP_ARGS(proc_work, transaction_stack, thread_todo),
@@ -275,7 +299,7 @@
 
 TRACE_EVENT(binder_update_page_range,
 	TP_PROTO(struct binder_alloc *alloc, bool allocate,
-		 void *start, void *end),
+		 void __user *start, void __user *end),
 	TP_ARGS(alloc, allocate, start, end),
 	TP_STRUCT__entry(
 		__field(int, proc)
diff --git a/drivers/android/binderfs.c b/drivers/android/binderfs.c
new file mode 100644
index 0000000..e2580e5
--- /dev/null
+++ b/drivers/android/binderfs.c
@@ -0,0 +1,790 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#include <linux/compiler_types.h>
+#include <linux/errno.h>
+#include <linux/fs.h>
+#include <linux/fsnotify.h>
+#include <linux/gfp.h>
+#include <linux/idr.h>
+#include <linux/init.h>
+#include <linux/ipc_namespace.h>
+#include <linux/kdev_t.h>
+#include <linux/kernel.h>
+#include <linux/list.h>
+#include <linux/namei.h>
+#include <linux/magic.h>
+#include <linux/major.h>
+#include <linux/miscdevice.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/mount.h>
+#include <linux/parser.h>
+#include <linux/radix-tree.h>
+#include <linux/sched.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include <linux/spinlock_types.h>
+#include <linux/stddef.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/uaccess.h>
+#include <linux/user_namespace.h>
+#include <linux/xarray.h>
+#include <uapi/asm-generic/errno-base.h>
+#include <uapi/linux/android/binder.h>
+#include <uapi/linux/android/binderfs.h>
+
+#include "binder_internal.h"
+
+#define FIRST_INODE 1
+#define SECOND_INODE 2
+#define INODE_OFFSET 3
+#define INTSTRLEN 21
+#define BINDERFS_MAX_MINOR (1U << MINORBITS)
+/* Ensure that the initial ipc namespace always has devices available. */
+#define BINDERFS_MAX_MINOR_CAPPED (BINDERFS_MAX_MINOR - 4)
+
+static dev_t binderfs_dev;
+static DEFINE_MUTEX(binderfs_minors_mutex);
+static DEFINE_IDA(binderfs_minors);
+
+enum {
+	Opt_max,
+	Opt_stats_mode,
+	Opt_err
+};
+
+enum binderfs_stats_mode {
+	STATS_NONE,
+	STATS_GLOBAL,
+};
+
+static const match_table_t tokens = {
+	{ Opt_max, "max=%d" },
+	{ Opt_stats_mode, "stats=%s" },
+	{ Opt_err, NULL     }
+};
+
+static inline struct binderfs_info *BINDERFS_I(const struct inode *inode)
+{
+	return inode->i_sb->s_fs_info;
+}
+
+bool is_binderfs_device(const struct inode *inode)
+{
+	if (inode->i_sb->s_magic == BINDERFS_SUPER_MAGIC)
+		return true;
+
+	return false;
+}
+
+/**
+ * binderfs_binder_device_create - allocate inode from super block of a
+ *                                 binderfs mount
+ * @ref_inode: inode from wich the super block will be taken
+ * @userp:     buffer to copy information about new device for userspace to
+ * @req:       struct binderfs_device as copied from userspace
+ *
+ * This function allocates a new binder_device and reserves a new minor
+ * number for it.
+ * Minor numbers are limited and tracked globally in binderfs_minors. The
+ * function will stash a struct binder_device for the specific binder
+ * device in i_private of the inode.
+ * It will go on to allocate a new inode from the super block of the
+ * filesystem mount, stash a struct binder_device in its i_private field
+ * and attach a dentry to that inode.
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static int binderfs_binder_device_create(struct inode *ref_inode,
+					 struct binderfs_device __user *userp,
+					 struct binderfs_device *req)
+{
+	int minor, ret;
+	struct dentry *dentry, *root;
+	struct binder_device *device;
+	char *name = NULL;
+	size_t name_len;
+	struct inode *inode = NULL;
+	struct super_block *sb = ref_inode->i_sb;
+	struct binderfs_info *info = sb->s_fs_info;
+#if defined(CONFIG_IPC_NS)
+	bool use_reserve = (info->ipc_ns == &init_ipc_ns);
+#else
+	bool use_reserve = true;
+#endif
+
+	/* Reserve new minor number for the new device. */
+	mutex_lock(&binderfs_minors_mutex);
+	if (++info->device_count <= info->mount_opts.max)
+		minor = ida_alloc_max(&binderfs_minors,
+				      use_reserve ? BINDERFS_MAX_MINOR :
+						    BINDERFS_MAX_MINOR_CAPPED,
+				      GFP_KERNEL);
+	else
+		minor = -ENOSPC;
+	if (minor < 0) {
+		--info->device_count;
+		mutex_unlock(&binderfs_minors_mutex);
+		return minor;
+	}
+	mutex_unlock(&binderfs_minors_mutex);
+
+	ret = -ENOMEM;
+	device = kzalloc(sizeof(*device), GFP_KERNEL);
+	if (!device)
+		goto err;
+
+	inode = new_inode(sb);
+	if (!inode)
+		goto err;
+
+	inode->i_ino = minor + INODE_OFFSET;
+	inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
+	init_special_inode(inode, S_IFCHR | 0600,
+			   MKDEV(MAJOR(binderfs_dev), minor));
+	inode->i_fop = &binder_fops;
+	inode->i_uid = info->root_uid;
+	inode->i_gid = info->root_gid;
+
+	req->name[BINDERFS_MAX_NAME] = '\0'; /* NUL-terminate */
+	name_len = strlen(req->name);
+	/* Make sure to include terminating NUL byte */
+	name = kmemdup(req->name, name_len + 1, GFP_KERNEL);
+	if (!name)
+		goto err;
+
+	device->binderfs_inode = inode;
+	device->context.binder_context_mgr_uid = INVALID_UID;
+	device->context.name = name;
+	device->miscdev.name = name;
+	device->miscdev.minor = minor;
+	mutex_init(&device->context.context_mgr_node_lock);
+
+	req->major = MAJOR(binderfs_dev);
+	req->minor = minor;
+
+	if (userp && copy_to_user(userp, req, sizeof(*req))) {
+		ret = -EFAULT;
+		goto err;
+	}
+
+	root = sb->s_root;
+	inode_lock(d_inode(root));
+
+	/* look it up */
+	dentry = lookup_one_len(name, root, name_len);
+	if (IS_ERR(dentry)) {
+		inode_unlock(d_inode(root));
+		ret = PTR_ERR(dentry);
+		goto err;
+	}
+
+	if (d_really_is_positive(dentry)) {
+		/* already exists */
+		dput(dentry);
+		inode_unlock(d_inode(root));
+		ret = -EEXIST;
+		goto err;
+	}
+
+	inode->i_private = device;
+	d_instantiate(dentry, inode);
+	fsnotify_create(root->d_inode, dentry);
+	inode_unlock(d_inode(root));
+
+	return 0;
+
+err:
+	kfree(name);
+	kfree(device);
+	mutex_lock(&binderfs_minors_mutex);
+	--info->device_count;
+	ida_free(&binderfs_minors, minor);
+	mutex_unlock(&binderfs_minors_mutex);
+	iput(inode);
+
+	return ret;
+}
+
+/**
+ * binderfs_ctl_ioctl - handle binder device node allocation requests
+ *
+ * The request handler for the binder-control device. All requests operate on
+ * the binderfs mount the binder-control device resides in:
+ * - BINDER_CTL_ADD
+ *   Allocate a new binder device.
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static long binder_ctl_ioctl(struct file *file, unsigned int cmd,
+			     unsigned long arg)
+{
+	int ret = -EINVAL;
+	struct inode *inode = file_inode(file);
+	struct binderfs_device __user *device = (struct binderfs_device __user *)arg;
+	struct binderfs_device device_req;
+
+	switch (cmd) {
+	case BINDER_CTL_ADD:
+		ret = copy_from_user(&device_req, device, sizeof(device_req));
+		if (ret) {
+			ret = -EFAULT;
+			break;
+		}
+
+		ret = binderfs_binder_device_create(inode, device, &device_req);
+		break;
+	default:
+		break;
+	}
+
+	return ret;
+}
+
+static void binderfs_evict_inode(struct inode *inode)
+{
+	struct binder_device *device = inode->i_private;
+	struct binderfs_info *info = BINDERFS_I(inode);
+
+	clear_inode(inode);
+
+	if (!S_ISCHR(inode->i_mode) || !device)
+		return;
+
+	mutex_lock(&binderfs_minors_mutex);
+	--info->device_count;
+	ida_free(&binderfs_minors, device->miscdev.minor);
+	mutex_unlock(&binderfs_minors_mutex);
+
+	kfree(device->context.name);
+	kfree(device);
+}
+
+/**
+ * binderfs_parse_mount_opts - parse binderfs mount options
+ * @data: options to set (can be NULL in which case defaults are used)
+ */
+static int binderfs_parse_mount_opts(char *data,
+				     struct binderfs_mount_opts *opts)
+{
+	char *p, *stats;
+	opts->max = BINDERFS_MAX_MINOR;
+	opts->stats_mode = STATS_NONE;
+
+	while ((p = strsep(&data, ",")) != NULL) {
+		substring_t args[MAX_OPT_ARGS];
+		int token;
+		int max_devices;
+
+		if (!*p)
+			continue;
+
+		token = match_token(p, tokens, args);
+		switch (token) {
+		case Opt_max:
+			if (match_int(&args[0], &max_devices) ||
+			    (max_devices < 0 ||
+			     (max_devices > BINDERFS_MAX_MINOR)))
+				return -EINVAL;
+
+			opts->max = max_devices;
+			break;
+		case Opt_stats_mode:
+			if (!capable(CAP_SYS_ADMIN))
+				return -EINVAL;
+
+			stats = match_strdup(&args[0]);
+			if (!stats)
+				return -ENOMEM;
+
+			if (strcmp(stats, "global") != 0) {
+				kfree(stats);
+				return -EINVAL;
+			}
+
+			opts->stats_mode = STATS_GLOBAL;
+			kfree(stats);
+			break;
+		default:
+			pr_err("Invalid mount options\n");
+			return -EINVAL;
+		}
+	}
+
+	return 0;
+}
+
+static int binderfs_remount(struct super_block *sb, int *flags, char *data)
+{
+	int prev_stats_mode, ret;
+	struct binderfs_info *info = sb->s_fs_info;
+
+	prev_stats_mode = info->mount_opts.stats_mode;
+	ret = binderfs_parse_mount_opts(data, &info->mount_opts);
+	if (ret)
+		return ret;
+
+	if (prev_stats_mode != info->mount_opts.stats_mode) {
+		pr_err("Binderfs stats mode cannot be changed during a remount\n");
+		info->mount_opts.stats_mode = prev_stats_mode;
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int binderfs_show_mount_opts(struct seq_file *seq, struct dentry *root)
+{
+	struct binderfs_info *info;
+
+	info = root->d_sb->s_fs_info;
+	if (info->mount_opts.max <= BINDERFS_MAX_MINOR)
+		seq_printf(seq, ",max=%d", info->mount_opts.max);
+	if (info->mount_opts.stats_mode == STATS_GLOBAL)
+		seq_printf(seq, ",stats=global");
+
+	return 0;
+}
+
+static const struct super_operations binderfs_super_ops = {
+	.evict_inode    = binderfs_evict_inode,
+	.remount_fs	= binderfs_remount,
+	.show_options	= binderfs_show_mount_opts,
+	.statfs         = simple_statfs,
+};
+
+static inline bool is_binderfs_control_device(const struct dentry *dentry)
+{
+	struct binderfs_info *info = dentry->d_sb->s_fs_info;
+	return info->control_dentry == dentry;
+}
+
+static int binderfs_rename(struct inode *old_dir, struct dentry *old_dentry,
+			   struct inode *new_dir, struct dentry *new_dentry,
+			   unsigned int flags)
+{
+	if (is_binderfs_control_device(old_dentry) ||
+	    is_binderfs_control_device(new_dentry))
+		return -EPERM;
+
+	return simple_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
+}
+
+static int binderfs_unlink(struct inode *dir, struct dentry *dentry)
+{
+	if (is_binderfs_control_device(dentry))
+		return -EPERM;
+
+	return simple_unlink(dir, dentry);
+}
+
+static const struct file_operations binder_ctl_fops = {
+	.owner		= THIS_MODULE,
+	.open		= nonseekable_open,
+	.unlocked_ioctl	= binder_ctl_ioctl,
+	.compat_ioctl	= binder_ctl_ioctl,
+	.llseek		= noop_llseek,
+};
+
+/**
+ * binderfs_binder_ctl_create - create a new binder-control device
+ * @sb: super block of the binderfs mount
+ *
+ * This function creates a new binder-control device node in the binderfs mount
+ * referred to by @sb.
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static int binderfs_binder_ctl_create(struct super_block *sb)
+{
+	int minor, ret;
+	struct dentry *dentry;
+	struct binder_device *device;
+	struct inode *inode = NULL;
+	struct dentry *root = sb->s_root;
+	struct binderfs_info *info = sb->s_fs_info;
+#if defined(CONFIG_IPC_NS)
+	bool use_reserve = (info->ipc_ns == &init_ipc_ns);
+#else
+	bool use_reserve = true;
+#endif
+
+	device = kzalloc(sizeof(*device), GFP_KERNEL);
+	if (!device)
+		return -ENOMEM;
+
+	/* If we have already created a binder-control node, return. */
+	if (info->control_dentry) {
+		ret = 0;
+		goto out;
+	}
+
+	ret = -ENOMEM;
+	inode = new_inode(sb);
+	if (!inode)
+		goto out;
+
+	/* Reserve a new minor number for the new device. */
+	mutex_lock(&binderfs_minors_mutex);
+	minor = ida_alloc_max(&binderfs_minors,
+			      use_reserve ? BINDERFS_MAX_MINOR :
+					    BINDERFS_MAX_MINOR_CAPPED,
+			      GFP_KERNEL);
+	mutex_unlock(&binderfs_minors_mutex);
+	if (minor < 0) {
+		ret = minor;
+		goto out;
+	}
+
+	inode->i_ino = SECOND_INODE;
+	inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
+	init_special_inode(inode, S_IFCHR | 0600,
+			   MKDEV(MAJOR(binderfs_dev), minor));
+	inode->i_fop = &binder_ctl_fops;
+	inode->i_uid = info->root_uid;
+	inode->i_gid = info->root_gid;
+
+	device->binderfs_inode = inode;
+	device->miscdev.minor = minor;
+
+	dentry = d_alloc_name(root, "binder-control");
+	if (!dentry)
+		goto out;
+
+	inode->i_private = device;
+	info->control_dentry = dentry;
+	d_add(dentry, inode);
+
+	return 0;
+
+out:
+	kfree(device);
+	iput(inode);
+
+	return ret;
+}
+
+static const struct inode_operations binderfs_dir_inode_operations = {
+	.lookup = simple_lookup,
+	.rename = binderfs_rename,
+	.unlink = binderfs_unlink,
+};
+
+static struct inode *binderfs_make_inode(struct super_block *sb, int mode)
+{
+	struct inode *ret;
+
+	ret = new_inode(sb);
+	if (ret) {
+		ret->i_ino = iunique(sb, BINDERFS_MAX_MINOR + INODE_OFFSET);
+		ret->i_mode = mode;
+		ret->i_atime = ret->i_mtime = ret->i_ctime = current_time(ret);
+	}
+	return ret;
+}
+
+static struct dentry *binderfs_create_dentry(struct dentry *parent,
+					     const char *name)
+{
+	struct dentry *dentry;
+
+	dentry = lookup_one_len(name, parent, strlen(name));
+	if (IS_ERR(dentry))
+		return dentry;
+
+	/* Return error if the file/dir already exists. */
+	if (d_really_is_positive(dentry)) {
+		dput(dentry);
+		return ERR_PTR(-EEXIST);
+	}
+
+	return dentry;
+}
+
+void binderfs_remove_file(struct dentry *dentry)
+{
+	struct inode *parent_inode;
+
+	parent_inode = d_inode(dentry->d_parent);
+	inode_lock(parent_inode);
+	if (simple_positive(dentry)) {
+		dget(dentry);
+		simple_unlink(parent_inode, dentry);
+		d_delete(dentry);
+		dput(dentry);
+	}
+	inode_unlock(parent_inode);
+}
+
+struct dentry *binderfs_create_file(struct dentry *parent, const char *name,
+				    const struct file_operations *fops,
+				    void *data)
+{
+	struct dentry *dentry;
+	struct inode *new_inode, *parent_inode;
+	struct super_block *sb;
+
+	parent_inode = d_inode(parent);
+	inode_lock(parent_inode);
+
+	dentry = binderfs_create_dentry(parent, name);
+	if (IS_ERR(dentry))
+		goto out;
+
+	sb = parent_inode->i_sb;
+	new_inode = binderfs_make_inode(sb, S_IFREG | 0444);
+	if (!new_inode) {
+		dput(dentry);
+		dentry = ERR_PTR(-ENOMEM);
+		goto out;
+	}
+
+	new_inode->i_fop = fops;
+	new_inode->i_private = data;
+	d_instantiate(dentry, new_inode);
+	fsnotify_create(parent_inode, dentry);
+
+out:
+	inode_unlock(parent_inode);
+	return dentry;
+}
+
+static struct dentry *binderfs_create_dir(struct dentry *parent,
+					  const char *name)
+{
+	struct dentry *dentry;
+	struct inode *new_inode, *parent_inode;
+	struct super_block *sb;
+
+	parent_inode = d_inode(parent);
+	inode_lock(parent_inode);
+
+	dentry = binderfs_create_dentry(parent, name);
+	if (IS_ERR(dentry))
+		goto out;
+
+	sb = parent_inode->i_sb;
+	new_inode = binderfs_make_inode(sb, S_IFDIR | 0755);
+	if (!new_inode) {
+		dput(dentry);
+		dentry = ERR_PTR(-ENOMEM);
+		goto out;
+	}
+
+	new_inode->i_fop = &simple_dir_operations;
+	new_inode->i_op = &simple_dir_inode_operations;
+
+	set_nlink(new_inode, 2);
+	d_instantiate(dentry, new_inode);
+	inc_nlink(parent_inode);
+	fsnotify_mkdir(parent_inode, dentry);
+
+out:
+	inode_unlock(parent_inode);
+	return dentry;
+}
+
+static int init_binder_logs(struct super_block *sb)
+{
+	struct dentry *binder_logs_root_dir, *dentry, *proc_log_dir;
+	struct binderfs_info *info;
+	int ret = 0;
+
+	binder_logs_root_dir = binderfs_create_dir(sb->s_root,
+						   "binder_logs");
+	if (IS_ERR(binder_logs_root_dir)) {
+		ret = PTR_ERR(binder_logs_root_dir);
+		goto out;
+	}
+
+	dentry = binderfs_create_file(binder_logs_root_dir, "stats",
+				      &binder_stats_fops, NULL);
+	if (IS_ERR(dentry)) {
+		ret = PTR_ERR(dentry);
+		goto out;
+	}
+
+	dentry = binderfs_create_file(binder_logs_root_dir, "state",
+				      &binder_state_fops, NULL);
+	if (IS_ERR(dentry)) {
+		ret = PTR_ERR(dentry);
+		goto out;
+	}
+
+	dentry = binderfs_create_file(binder_logs_root_dir, "transactions",
+				      &binder_transactions_fops, NULL);
+	if (IS_ERR(dentry)) {
+		ret = PTR_ERR(dentry);
+		goto out;
+	}
+
+	dentry = binderfs_create_file(binder_logs_root_dir,
+				      "transaction_log",
+				      &binder_transaction_log_fops,
+				      &binder_transaction_log);
+	if (IS_ERR(dentry)) {
+		ret = PTR_ERR(dentry);
+		goto out;
+	}
+
+	dentry = binderfs_create_file(binder_logs_root_dir,
+				      "failed_transaction_log",
+				      &binder_transaction_log_fops,
+				      &binder_transaction_log_failed);
+	if (IS_ERR(dentry)) {
+		ret = PTR_ERR(dentry);
+		goto out;
+	}
+
+	proc_log_dir = binderfs_create_dir(binder_logs_root_dir, "proc");
+	if (IS_ERR(proc_log_dir)) {
+		ret = PTR_ERR(proc_log_dir);
+		goto out;
+	}
+	info = sb->s_fs_info;
+	info->proc_log_dir = proc_log_dir;
+
+out:
+	return ret;
+}
+
+static int binderfs_fill_super(struct super_block *sb, void *data, int silent)
+{
+	int ret;
+	struct binderfs_info *info;
+	struct inode *inode = NULL;
+	struct binderfs_device device_info = { 0 };
+	const char *name;
+	size_t len;
+
+	sb->s_blocksize = PAGE_SIZE;
+	sb->s_blocksize_bits = PAGE_SHIFT;
+
+	/*
+	 * The binderfs filesystem can be mounted by userns root in a
+	 * non-initial userns. By default such mounts have the SB_I_NODEV flag
+	 * set in s_iflags to prevent security issues where userns root can
+	 * just create random device nodes via mknod() since it owns the
+	 * filesystem mount. But binderfs does not allow to create any files
+	 * including devices nodes. The only way to create binder devices nodes
+	 * is through the binder-control device which userns root is explicitly
+	 * allowed to do. So removing the SB_I_NODEV flag from s_iflags is both
+	 * necessary and safe.
+	 */
+	sb->s_iflags &= ~SB_I_NODEV;
+	sb->s_iflags |= SB_I_NOEXEC;
+	sb->s_magic = BINDERFS_SUPER_MAGIC;
+	sb->s_op = &binderfs_super_ops;
+	sb->s_time_gran = 1;
+
+	sb->s_fs_info = kzalloc(sizeof(struct binderfs_info), GFP_KERNEL);
+	if (!sb->s_fs_info)
+		return -ENOMEM;
+	info = sb->s_fs_info;
+
+	info->ipc_ns = get_ipc_ns(current->nsproxy->ipc_ns);
+
+	ret = binderfs_parse_mount_opts(data, &info->mount_opts);
+	if (ret)
+		return ret;
+
+	info->root_gid = make_kgid(sb->s_user_ns, 0);
+	if (!gid_valid(info->root_gid))
+		info->root_gid = GLOBAL_ROOT_GID;
+	info->root_uid = make_kuid(sb->s_user_ns, 0);
+	if (!uid_valid(info->root_uid))
+		info->root_uid = GLOBAL_ROOT_UID;
+
+	inode = new_inode(sb);
+	if (!inode)
+		return -ENOMEM;
+
+	inode->i_ino = FIRST_INODE;
+	inode->i_fop = &simple_dir_operations;
+	inode->i_mode = S_IFDIR | 0755;
+	inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
+	inode->i_op = &binderfs_dir_inode_operations;
+	set_nlink(inode, 2);
+
+	sb->s_root = d_make_root(inode);
+	if (!sb->s_root)
+		return -ENOMEM;
+
+	ret = binderfs_binder_ctl_create(sb);
+	if (ret)
+		return ret;
+
+	name = binder_devices_param;
+	for (len = strcspn(name, ","); len > 0; len = strcspn(name, ",")) {
+		strscpy(device_info.name, name, len + 1);
+		ret = binderfs_binder_device_create(inode, NULL, &device_info);
+		if (ret)
+			return ret;
+		name += len;
+		if (*name == ',')
+			name++;
+	}
+
+	if (info->mount_opts.stats_mode == STATS_GLOBAL)
+		return init_binder_logs(sb);
+
+	return 0;
+}
+
+static struct dentry *binderfs_mount(struct file_system_type *fs_type,
+				     int flags, const char *dev_name,
+				     void *data)
+{
+	return mount_nodev(fs_type, flags, data, binderfs_fill_super);
+}
+
+static void binderfs_kill_super(struct super_block *sb)
+{
+	struct binderfs_info *info = sb->s_fs_info;
+
+	kill_litter_super(sb);
+
+	if (info && info->ipc_ns)
+		put_ipc_ns(info->ipc_ns);
+
+	kfree(info);
+}
+
+static struct file_system_type binder_fs_type = {
+	.name		= "binder",
+	.mount		= binderfs_mount,
+	.kill_sb	= binderfs_kill_super,
+	.fs_flags	= FS_USERNS_MOUNT,
+};
+
+int __init init_binderfs(void)
+{
+	int ret;
+	const char *name;
+	size_t len;
+
+	/* Verify that the default binderfs device names are valid. */
+	name = binder_devices_param;
+	for (len = strcspn(name, ","); len > 0; len = strcspn(name, ",")) {
+		if (len > BINDERFS_MAX_NAME)
+			return -E2BIG;
+		name += len;
+		if (*name == ',')
+			name++;
+	}
+
+	/* Allocate new major number for binderfs. */
+	ret = alloc_chrdev_region(&binderfs_dev, 0, BINDERFS_MAX_MINOR,
+				  "binder");
+	if (ret)
+		return ret;
+
+	ret = register_filesystem(&binder_fs_type);
+	if (ret) {
+		unregister_chrdev_region(binderfs_dev, BINDERFS_MAX_MINOR);
+		return ret;
+	}
+
+	return ret;
+}
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
index 3e63a90..ae213ed 100644
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -174,7 +174,6 @@
 config DMA_SHARED_BUFFER
 	bool
 	default n
-	select ANON_INODES
 	select IRQ_WORK
 	help
 	  This option enables the framework for buffer-sharing between
diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
index e7cb0c6..b5f61f2 100644
--- a/drivers/base/arch_topology.c
+++ b/drivers/base/arch_topology.c
@@ -15,8 +15,11 @@
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/sched/topology.h>
+#include <linux/cpuset.h>
 
 DEFINE_PER_CPU(unsigned long, freq_scale) = SCHED_CAPACITY_SCALE;
+DEFINE_PER_CPU(unsigned long, max_cpu_freq);
+DEFINE_PER_CPU(unsigned long, max_freq_scale) = SCHED_CAPACITY_SCALE;
 
 void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq,
 			 unsigned long max_freq)
@@ -26,8 +29,29 @@
 
 	scale = (cur_freq << SCHED_CAPACITY_SHIFT) / max_freq;
 
-	for_each_cpu(i, cpus)
+	for_each_cpu(i, cpus) {
 		per_cpu(freq_scale, i) = scale;
+		per_cpu(max_cpu_freq, i) = max_freq;
+	}
+}
+
+void arch_set_max_freq_scale(struct cpumask *cpus,
+			     unsigned long policy_max_freq)
+{
+	unsigned long scale, max_freq;
+	int cpu = cpumask_first(cpus);
+
+	if (cpu > nr_cpu_ids)
+		return;
+
+	max_freq = per_cpu(max_cpu_freq, cpu);
+	if (!max_freq)
+		return;
+
+	scale = (policy_max_freq << SCHED_CAPACITY_SHIFT) / max_freq;
+
+	for_each_cpu(cpu, cpus)
+		per_cpu(max_freq_scale, cpu) = scale;
 }
 
 static DEFINE_MUTEX(cpu_scale_mutex);
@@ -47,6 +71,9 @@
 	return sprintf(buf, "%lu\n", topology_get_cpu_scale(NULL, cpu->dev.id));
 }
 
+static void update_topology_flags_workfn(struct work_struct *work);
+static DECLARE_WORK(update_topology_flags_work, update_topology_flags_workfn);
+
 static ssize_t cpu_capacity_store(struct device *dev,
 				  struct device_attribute *attr,
 				  const char *buf,
@@ -72,6 +99,8 @@
 		topology_set_cpu_scale(i, new_capacity);
 	mutex_unlock(&cpu_scale_mutex);
 
+	schedule_work(&update_topology_flags_work);
+
 	return count;
 }
 
@@ -96,6 +125,25 @@
 }
 subsys_initcall(register_cpu_capacity_sysctl);
 
+static int update_topology;
+
+int topology_update_cpu_topology(void)
+{
+	return update_topology;
+}
+
+/*
+ * Updating the sched_domains can't be done directly from cpufreq callbacks
+ * due to locking, so queue the work for later.
+ */
+static void update_topology_flags_workfn(struct work_struct *work)
+{
+	update_topology = 1;
+	rebuild_sched_domains();
+	pr_debug("sched_domain hierarchy rebuilt, flags updated\n");
+	update_topology = 0;
+}
+
 static u32 capacity_scale;
 static u32 *raw_capacity;
 
@@ -201,6 +249,7 @@
 
 	if (cpumask_empty(cpus_to_visit)) {
 		topology_normalize_cpu_scale();
+		schedule_work(&update_topology_flags_work);
 		free_raw_capacity();
 		pr_debug("cpu_capacity: parsing done\n");
 		schedule_work(&parsing_done_work);
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 985ccce..5b75d50 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -44,6 +44,10 @@
 #endif
 
 /* Device links support. */
+static LIST_HEAD(wait_for_suppliers);
+static DEFINE_MUTEX(wfs_lock);
+static LIST_HEAD(deferred_sync);
+static unsigned int defer_sync_state_count = 1;
 
 #ifdef CONFIG_SRCU
 static DEFINE_MUTEX(device_links_lock);
@@ -114,6 +118,9 @@
 		return ret;
 
 	list_for_each_entry(link, &dev->links.consumers, s_node) {
+		if (link->flags == DL_FLAG_SYNC_STATE_ONLY)
+			continue;
+
 		if (link->consumer == target)
 			return 1;
 
@@ -139,8 +146,11 @@
 		device_pm_move_last(dev);
 
 	device_for_each_child(dev, NULL, device_reorder_to_tail);
-	list_for_each_entry(link, &dev->links.consumers, s_node)
+	list_for_each_entry(link, &dev->links.consumers, s_node) {
+		if (link->flags == DL_FLAG_SYNC_STATE_ONLY)
+			continue;
 		device_reorder_to_tail(link->consumer, NULL);
+	}
 
 	return 0;
 }
@@ -199,6 +209,8 @@
 	struct device_link *link;
 
 	if (!consumer || !supplier ||
+	    (flags & DL_FLAG_SYNC_STATE_ONLY &&
+	     flags != DL_FLAG_SYNC_STATE_ONLY) ||
 	    ((flags & DL_FLAG_STATELESS) &&
 	     (flags & DL_FLAG_AUTOREMOVE_CONSUMER)))
 		return NULL;
@@ -208,11 +220,14 @@
 
 	/*
 	 * If the supplier has not been fully registered yet or there is a
-	 * reverse dependency between the consumer and the supplier already in
-	 * the graph, return NULL.
+	 * reverse (non-SYNC_STATE_ONLY) dependency between the consumer and
+	 * the supplier already in the graph, return NULL. If the link is a
+	 * SYNC_STATE_ONLY link, we don't check for reverse dependencies
+	 * because it only affects sync_state() callbacks.
 	 */
 	if (!device_pm_initialized(supplier)
-	    || device_is_dependent(consumer, supplier)) {
+	    || (!(flags & DL_FLAG_SYNC_STATE_ONLY) &&
+		  device_is_dependent(consumer, supplier))) {
 		link = NULL;
 		goto out;
 	}
@@ -220,6 +235,11 @@
 	list_for_each_entry(link, &supplier->links.consumers, s_node)
 		if (link->consumer == consumer) {
 			kref_get(&link->kref);
+			if (link->flags & DL_FLAG_SYNC_STATE_ONLY &&
+			    !(flags & DL_FLAG_SYNC_STATE_ONLY)) {
+				link->flags &= ~DL_FLAG_SYNC_STATE_ONLY;
+				goto reorder;
+			}
 			goto out;
 		}
 
@@ -290,6 +310,9 @@
 		}
 	}
 
+	if (flags & DL_FLAG_SYNC_STATE_ONLY)
+		goto out;
+reorder:
 	/*
 	 * Move the consumer and all of the devices depending on it to the end
 	 * of dpm_list and the devices_kset list.
@@ -311,6 +334,70 @@
 }
 EXPORT_SYMBOL_GPL(device_link_add);
 
+/**
+ * device_link_wait_for_supplier - Add device to wait_for_suppliers list
+ * @consumer: Consumer device
+ *
+ * Marks the @consumer device as waiting for suppliers to become available by
+ * adding it to the wait_for_suppliers list. The consumer device will never be
+ * probed until it's removed from the wait_for_suppliers list.
+ *
+ * The caller is responsible for adding the links to the supplier devices once
+ * they are available and removing the @consumer device from the
+ * wait_for_suppliers list once links to all the suppliers have been created.
+ *
+ * This function is NOT meant to be called from the probe function of the
+ * consumer but rather from code that creates/adds the consumer device.
+ */
+static void device_link_wait_for_supplier(struct device *consumer,
+					  bool need_for_probe)
+{
+	mutex_lock(&wfs_lock);
+	list_add_tail(&consumer->links.needs_suppliers, &wait_for_suppliers);
+	consumer->links.need_for_probe = need_for_probe;
+	mutex_unlock(&wfs_lock);
+}
+
+static void device_link_wait_for_mandatory_supplier(struct device *consumer)
+{
+	device_link_wait_for_supplier(consumer, true);
+}
+
+static void device_link_wait_for_optional_supplier(struct device *consumer)
+{
+	device_link_wait_for_supplier(consumer, false);
+}
+
+/**
+ * device_link_add_missing_supplier_links - Add links from consumer devices to
+ *					    supplier devices, leaving any
+ *					    consumer with inactive suppliers on
+ *					    the wait_for_suppliers list
+ *
+ * Loops through all consumers waiting on suppliers and tries to add all their
+ * supplier links. If that succeeds, the consumer device is removed from
+ * wait_for_suppliers list. Otherwise, they are left in the wait_for_suppliers
+ * list.  Devices left on the wait_for_suppliers list will not be probed.
+ *
+ * The fwnode add_links callback is expected to return 0 if it has found and
+ * added all the supplier links for the consumer device. It should return an
+ * error if it isn't able to do so.
+ *
+ * The caller of device_link_wait_for_supplier() is expected to call this once
+ * it's aware of potential suppliers becoming available.
+ */
+static void device_link_add_missing_supplier_links(void)
+{
+	struct device *dev, *tmp;
+
+	mutex_lock(&wfs_lock);
+	list_for_each_entry_safe(dev, tmp, &wait_for_suppliers,
+				 links.needs_suppliers)
+		if (!fwnode_call_int_op(dev->fwnode, add_links, dev))
+			list_del_init(&dev->links.needs_suppliers);
+	mutex_unlock(&wfs_lock);
+}
+
 static void device_link_free(struct device_link *link)
 {
 	put_device(link->consumer);
@@ -434,10 +521,23 @@
 	struct device_link *link;
 	int ret = 0;
 
+	/*
+	 * Device waiting for supplier to become available is not allowed to
+	 * probe.
+	 */
+	mutex_lock(&wfs_lock);
+	if (!list_empty(&dev->links.needs_suppliers) &&
+	    dev->links.need_for_probe) {
+		mutex_unlock(&wfs_lock);
+		return -EPROBE_DEFER;
+	}
+	mutex_unlock(&wfs_lock);
+
 	device_links_write_lock();
 
 	list_for_each_entry(link, &dev->links.suppliers, c_node) {
-		if (link->flags & DL_FLAG_STATELESS)
+		if (link->flags & DL_FLAG_STATELESS ||
+		    link->flags & DL_FLAG_SYNC_STATE_ONLY)
 			continue;
 
 		if (link->status != DL_STATE_AVAILABLE) {
@@ -454,6 +554,128 @@
 }
 
 /**
+ * __device_links_queue_sync_state - Queue a device for sync_state() callback
+ * @dev: Device to call sync_state() on
+ * @list: List head to queue the @dev on
+ *
+ * Queues a device for a sync_state() callback when the device links write lock
+ * isn't held. This allows the sync_state() execution flow to use device links
+ * APIs.  The caller must ensure this function is called with
+ * device_links_write_lock() held.
+ *
+ * This function does a get_device() to make sure the device is not freed while
+ * on this list.
+ *
+ * So the caller must also ensure that device_links_flush_sync_list() is called
+ * as soon as the caller releases device_links_write_lock().  This is necessary
+ * to make sure the sync_state() is called in a timely fashion and the
+ * put_device() is called on this device.
+ */
+static void __device_links_queue_sync_state(struct device *dev,
+					    struct list_head *list)
+{
+	struct device_link *link;
+
+	if (dev->state_synced)
+		return;
+
+	list_for_each_entry(link, &dev->links.consumers, s_node) {
+		if (link->flags & DL_FLAG_STATELESS)
+			continue;
+		if (link->status != DL_STATE_ACTIVE)
+			return;
+	}
+
+	/*
+	 * Set the flag here to avoid adding the same device to a list more
+	 * than once. This can happen if new consumers get added to the device
+	 * and probed before the list is flushed.
+	 */
+	dev->state_synced = true;
+
+	if (WARN_ON(!list_empty(&dev->links.defer_sync)))
+		return;
+
+	get_device(dev);
+	list_add_tail(&dev->links.defer_sync, list);
+}
+
+/**
+ * device_links_flush_sync_list - Call sync_state() on a list of devices
+ * @list: List of devices to call sync_state() on
+ *
+ * Calls sync_state() on all the devices that have been queued for it. This
+ * function is used in conjunction with __device_links_queue_sync_state().
+ */
+static void device_links_flush_sync_list(struct list_head *list)
+{
+	struct device *dev, *tmp;
+
+	list_for_each_entry_safe(dev, tmp, list, links.defer_sync) {
+		list_del_init(&dev->links.defer_sync);
+
+		device_lock(dev);
+
+		if (dev->bus->sync_state)
+			dev->bus->sync_state(dev);
+		else if (dev->driver && dev->driver->sync_state)
+			dev->driver->sync_state(dev);
+
+		device_unlock(dev);
+
+		put_device(dev);
+	}
+}
+
+void device_links_supplier_sync_state_pause(void)
+{
+	device_links_write_lock();
+	defer_sync_state_count++;
+	device_links_write_unlock();
+}
+
+void device_links_supplier_sync_state_resume(void)
+{
+	struct device *dev, *tmp;
+	LIST_HEAD(sync_list);
+
+	device_links_write_lock();
+	if (!defer_sync_state_count) {
+		WARN(true, "Unmatched sync_state pause/resume!");
+		goto out;
+	}
+	defer_sync_state_count--;
+	if (defer_sync_state_count)
+		goto out;
+
+	list_for_each_entry_safe(dev, tmp, &deferred_sync, links.defer_sync) {
+		/*
+		 * Delete from deferred_sync list before queuing it to
+		 * sync_list because defer_sync is used for both lists.
+		 */
+		list_del_init(&dev->links.defer_sync);
+		__device_links_queue_sync_state(dev, &sync_list);
+	}
+out:
+	device_links_write_unlock();
+
+	device_links_flush_sync_list(&sync_list);
+}
+
+static int sync_state_resume_initcall(void)
+{
+	device_links_supplier_sync_state_resume();
+	return 0;
+}
+late_initcall(sync_state_resume_initcall);
+
+static void __device_links_supplier_defer_sync(struct device *sup)
+{
+	if (list_empty(&sup->links.defer_sync))
+		list_add_tail(&sup->links.defer_sync, &deferred_sync);
+}
+
+/**
  * device_links_driver_bound - Update device links after probing its driver.
  * @dev: Device to update the links for.
  *
@@ -467,6 +689,16 @@
 void device_links_driver_bound(struct device *dev)
 {
 	struct device_link *link;
+	LIST_HEAD(sync_list);
+
+	/*
+	 * If a device probes successfully, it's expected to have created all
+	 * the device links it needs to or make new device links as it needs
+	 * them. So, it no longer needs to wait on any suppliers.
+	 */
+	mutex_lock(&wfs_lock);
+	list_del_init(&dev->links.needs_suppliers);
+	mutex_unlock(&wfs_lock);
 
 	device_links_write_lock();
 
@@ -484,11 +716,19 @@
 
 		WARN_ON(link->status != DL_STATE_CONSUMER_PROBE);
 		WRITE_ONCE(link->status, DL_STATE_ACTIVE);
+
+		if (defer_sync_state_count)
+			__device_links_supplier_defer_sync(link->supplier);
+		else
+			__device_links_queue_sync_state(link->supplier,
+							&sync_list);
 	}
 
 	dev->links.status = DL_DEV_DRIVER_BOUND;
 
 	device_links_write_unlock();
+
+	device_links_flush_sync_list(&sync_list);
 }
 
 /**
@@ -562,6 +802,7 @@
 		WRITE_ONCE(link->status, DL_STATE_DORMANT);
 	}
 
+	list_del_init(&dev->links.defer_sync);
 	__device_links_no_driver(dev);
 
 	device_links_write_unlock();
@@ -631,7 +872,8 @@
 	list_for_each_entry(link, &dev->links.consumers, s_node) {
 		enum device_link_state status;
 
-		if (link->flags & DL_FLAG_STATELESS)
+		if (link->flags & DL_FLAG_STATELESS ||
+		    link->flags & DL_FLAG_SYNC_STATE_ONLY)
 			continue;
 
 		status = link->status;
@@ -667,6 +909,10 @@
 {
 	struct device_link *link, *ln;
 
+	mutex_lock(&wfs_lock);
+	list_del(&dev->links.needs_suppliers);
+	mutex_unlock(&wfs_lock);
+
 	/*
 	 * Delete all of the remaining links from this device to any other
 	 * devices (either consumers or suppliers).
@@ -1502,6 +1748,8 @@
 #endif
 	INIT_LIST_HEAD(&dev->links.consumers);
 	INIT_LIST_HEAD(&dev->links.suppliers);
+	INIT_LIST_HEAD(&dev->links.needs_suppliers);
+	INIT_LIST_HEAD(&dev->links.defer_sync);
 	dev->links.status = DL_DEV_NO_DRIVER;
 }
 EXPORT_SYMBOL_GPL(device_initialize);
@@ -1885,7 +2133,7 @@
 	struct device *parent;
 	struct kobject *kobj;
 	struct class_interface *class_intf;
-	int error = -EINVAL;
+	int error = -EINVAL, fw_ret;
 	struct kobject *glue_dir = NULL;
 
 	dev = get_device(dev);
@@ -1982,6 +2230,32 @@
 					     BUS_NOTIFY_ADD_DEVICE, dev);
 
 	kobject_uevent(&dev->kobj, KOBJ_ADD);
+
+	if (dev->fwnode && !dev->fwnode->dev)
+		dev->fwnode->dev = dev;
+
+	/*
+	 * Check if any of the other devices (consumers) have been waiting for
+	 * this device (supplier) to be added so that they can create a device
+	 * link to it.
+	 *
+	 * This needs to happen after device_pm_add() because device_link_add()
+	 * requires the supplier be registered before it's called.
+	 *
+	 * But this also needs to happe before bus_probe_device() to make sure
+	 * waiting consumers can link to it before the driver is bound to the
+	 * device and the driver sync_state callback is called for this device.
+	 */
+	device_link_add_missing_supplier_links();
+
+	if (fwnode_has_op(dev->fwnode, add_links)) {
+		fw_ret = fwnode_call_int_op(dev->fwnode, add_links, dev);
+		if (fw_ret == -ENODEV)
+			device_link_wait_for_mandatory_supplier(dev);
+		else if (fw_ret)
+			device_link_wait_for_optional_supplier(dev);
+	}
+
 	bus_probe_device(dev);
 	if (parent)
 		klist_add_tail(&dev->p->knode_parent,
@@ -2124,6 +2398,9 @@
 	kill_device(dev);
 	device_unlock(dev);
 
+	if (dev->fwnode && dev->fwnode->dev == dev)
+		dev->fwnode->dev = NULL;
+
 	/* Notify clients of device removal.  This call must come
 	 * before dpm_sysfs_remove().
 	 */
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c
index f3ecf74..9c035fc 100644
--- a/drivers/base/cpu.c
+++ b/drivers/base/cpu.c
@@ -427,6 +427,7 @@
 	dev->parent = parent;
 	dev->groups = groups;
 	dev->release = device_create_release;
+	device_set_pm_not_required(dev);
 	dev_set_drvdata(dev, drvdata);
 
 	retval = kobject_set_name_vargs(&dev->kobj, fmt, args);
diff --git a/drivers/base/firmware_loader/Kconfig b/drivers/base/firmware_loader/Kconfig
index eb15d97..e44d10c 100644
--- a/drivers/base/firmware_loader/Kconfig
+++ b/drivers/base/firmware_loader/Kconfig
@@ -150,5 +150,17 @@
 
 	  If you are unsure about this, say N here.
 
+config FW_CACHE
+	bool "Enable firmware caching during suspend"
+	depends on PM_SLEEP
+	default y if PM_SLEEP
+	help
+	  Because firmware caching generates uevent messages that are sent
+	  over a netlink socket, it can prevent suspend on many platforms.
+	  It is also not always useful, so on such platforms we have the
+	  option.
+
+	  If unsure, say Y.
+
 endif # FW_LOADER
 endmenu
diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
index 8e9213b..ca1031e 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -50,7 +50,7 @@
 	struct list_head head;
 	int state;
 
-#ifdef CONFIG_PM_SLEEP
+#ifdef CONFIG_FW_CACHE
 	/*
 	 * Names of firmware images which have been cached successfully
 	 * will be added into the below list so that device uncache
@@ -372,7 +372,7 @@
 		 (unsigned int)fw_priv->size);
 }
 
-#ifdef CONFIG_PM_SLEEP
+#ifdef CONFIG_FW_CACHE
 static void fw_name_devm_release(struct device *dev, void *res)
 {
 	struct fw_name_devm *fwn = res;
@@ -856,7 +856,7 @@
 }
 EXPORT_SYMBOL(request_firmware_nowait);
 
-#ifdef CONFIG_PM_SLEEP
+#ifdef CONFIG_FW_CACHE
 static ASYNC_DOMAIN_EXCLUSIVE(fw_cache_domain);
 
 /**
diff --git a/drivers/base/node.c b/drivers/base/node.c
index c3968e2..ce27be2 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -67,8 +67,11 @@
 	int nid = dev->id;
 	struct pglist_data *pgdat = NODE_DATA(nid);
 	struct sysinfo i;
+	unsigned long sreclaimable, sunreclaimable;
 
 	si_meminfo_node(&i, nid);
+	sreclaimable = node_page_state(pgdat, NR_SLAB_RECLAIMABLE);
+	sunreclaimable = node_page_state(pgdat, NR_SLAB_UNRECLAIMABLE);
 	n = sprintf(buf,
 		       "Node %d MemTotal:       %8lu kB\n"
 		       "Node %d MemFree:        %8lu kB\n"
@@ -114,10 +117,14 @@
 		       "Node %d AnonPages:      %8lu kB\n"
 		       "Node %d Shmem:          %8lu kB\n"
 		       "Node %d KernelStack:    %8lu kB\n"
+#ifdef CONFIG_SHADOW_CALL_STACK
+		       "Node %d ShadowCallStack:%8lu kB\n"
+#endif
 		       "Node %d PageTables:     %8lu kB\n"
 		       "Node %d NFS_Unstable:   %8lu kB\n"
 		       "Node %d Bounce:         %8lu kB\n"
 		       "Node %d WritebackTmp:   %8lu kB\n"
+		       "Node %d KReclaimable:   %8lu kB\n"
 		       "Node %d Slab:           %8lu kB\n"
 		       "Node %d SReclaimable:   %8lu kB\n"
 		       "Node %d SUnreclaim:     %8lu kB\n"
@@ -134,24 +141,28 @@
 		       nid, K(node_page_state(pgdat, NR_ANON_MAPPED)),
 		       nid, K(i.sharedram),
 		       nid, sum_zone_node_page_state(nid, NR_KERNEL_STACK_KB),
+#ifdef CONFIG_SHADOW_CALL_STACK
+		       nid, sum_zone_node_page_state(nid, NR_KERNEL_SCS_BYTES) / 1024,
+#endif
 		       nid, K(sum_zone_node_page_state(nid, NR_PAGETABLE)),
 		       nid, K(node_page_state(pgdat, NR_UNSTABLE_NFS)),
 		       nid, K(sum_zone_node_page_state(nid, NR_BOUNCE)),
 		       nid, K(node_page_state(pgdat, NR_WRITEBACK_TEMP)),
-		       nid, K(node_page_state(pgdat, NR_SLAB_RECLAIMABLE) +
-			      node_page_state(pgdat, NR_SLAB_UNRECLAIMABLE)),
-		       nid, K(node_page_state(pgdat, NR_SLAB_RECLAIMABLE)),
+		       nid, K(sreclaimable +
+			      node_page_state(pgdat, NR_KERNEL_MISC_RECLAIMABLE)),
+		       nid, K(sreclaimable + sunreclaimable),
+		       nid, K(sreclaimable),
+		       nid, K(sunreclaimable)
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
-		       nid, K(node_page_state(pgdat, NR_SLAB_UNRECLAIMABLE)),
+		       ,
 		       nid, K(node_page_state(pgdat, NR_ANON_THPS) *
 				       HPAGE_PMD_NR),
 		       nid, K(node_page_state(pgdat, NR_SHMEM_THPS) *
 				       HPAGE_PMD_NR),
 		       nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) *
-				       HPAGE_PMD_NR));
-#else
-		       nid, K(node_page_state(pgdat, NR_SLAB_UNRECLAIMABLE)));
+				       HPAGE_PMD_NR)
 #endif
+		       );
 	n += hugetlb_report_node_meminfo(nid, buf + n);
 	return n;
 }
diff --git a/drivers/base/power/Makefile b/drivers/base/power/Makefile
index e1bb691..ec5bb19 100644
--- a/drivers/base/power/Makefile
+++ b/drivers/base/power/Makefile
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-$(CONFIG_PM)	+= sysfs.o generic_ops.o common.o qos.o runtime.o wakeirq.o
-obj-$(CONFIG_PM_SLEEP)	+= main.o wakeup.o
+obj-$(CONFIG_PM_SLEEP)	+= main.o wakeup.o wakeup_stats.o
 obj-$(CONFIG_PM_TRACE_RTC)	+= trace.o
 obj-$(CONFIG_PM_GENERIC_DOMAINS)	+=  domain.o domain_governor.o
 obj-$(CONFIG_HAVE_CLK)	+= clock_ops.o
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 4abd7c6..5454bd0 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -33,6 +33,7 @@
 #include <linux/cpufreq.h>
 #include <linux/cpuidle.h>
 #include <linux/timer.h>
+#include <linux/wakeup_reason.h>
 
 #include "../base.h"
 #include "power.h"
@@ -123,6 +124,10 @@
  */
 void device_pm_add(struct device *dev)
 {
+	/* Skip PM setup/initialization. */
+	if (device_pm_not_required(dev))
+		return;
+
 	pr_debug("PM: Adding info for %s:%s\n",
 		 dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
 	device_pm_check_callbacks(dev);
@@ -141,6 +146,9 @@
  */
 void device_pm_remove(struct device *dev)
 {
+	if (device_pm_not_required(dev))
+		return;
+
 	pr_debug("PM: Removing info for %s:%s\n",
 		 dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
 	complete_all(&dev->power.completion);
@@ -1706,6 +1714,7 @@
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
 	int error = 0;
+	char suspend_abort[MAX_SUSPEND_ABORT_LEN];
 	DECLARE_DPM_WATCHDOG_ON_STACK(wd);
 
 	TRACE_DEVICE(dev);
@@ -1729,6 +1738,9 @@
 
 	if (pm_wakeup_pending()) {
 		dev->power.direct_complete = false;
+		pm_get_active_wakeup_sources(suspend_abort,
+			MAX_SUSPEND_ABORT_LEN);
+		log_suspend_abort_reason(suspend_abort);
 		async_error = -EBUSY;
 		goto Complete;
 	}
@@ -2017,6 +2029,7 @@
 			printk(KERN_INFO "PM: Device %s not prepared "
 				"for power transition: code %d\n",
 				dev_name(dev), error);
+			dpm_save_failed_dev(dev_name(dev));
 			put_device(dev);
 			break;
 		}
diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h
index c511def..24e1184 100644
--- a/drivers/base/power/power.h
+++ b/drivers/base/power/power.h
@@ -148,3 +148,21 @@
 	device_pm_sleep_init(dev);
 	pm_runtime_init(dev);
 }
+
+#ifdef CONFIG_PM_SLEEP
+
+/* drivers/base/power/wakeup_stats.c */
+extern int wakeup_source_sysfs_add(struct device *parent,
+				   struct wakeup_source *ws);
+extern void wakeup_source_sysfs_remove(struct wakeup_source *ws);
+
+extern int pm_wakeup_source_sysfs_add(struct device *parent);
+
+#else /* !CONFIG_PM_SLEEP */
+
+static inline int pm_wakeup_source_sysfs_add(struct device *parent)
+{
+	return 0;
+}
+
+#endif /* CONFIG_PM_SLEEP */
diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c
index d713738..48ddeef 100644
--- a/drivers/base/power/sysfs.c
+++ b/drivers/base/power/sysfs.c
@@ -7,6 +7,7 @@
 #include <linux/export.h>
 #include <linux/pm_qos.h>
 #include <linux/pm_runtime.h>
+#include <linux/pm_wakeup.h>
 #include <linux/atomic.h>
 #include <linux/jiffies.h>
 #include "power.h"
@@ -648,6 +649,10 @@
 {
 	int rc;
 
+	/* No need to create PM sysfs if explicitly disabled. */
+	if (device_pm_not_required(dev))
+		return 0;
+
 	rc = sysfs_create_group(&dev->kobj, &pm_attr_group);
 	if (rc)
 		return rc;
@@ -668,8 +673,13 @@
 		if (rc)
 			goto err_wakeup;
 	}
+	rc = pm_wakeup_source_sysfs_add(dev);
+	if (rc)
+		goto err_latency;
 	return 0;
 
+ err_latency:
+	sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group);
  err_wakeup:
 	sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);
  err_runtime:
@@ -727,6 +737,8 @@
 
 void dpm_sysfs_remove(struct device *dev)
 {
+	if (device_pm_not_required(dev))
+		return;
 	sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group);
 	dev_pm_qos_constraints_destroy(dev);
 	rpm_sysfs_remove(dev);
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 7c84f64..8f5efae 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -15,6 +15,7 @@
 #include <linux/seq_file.h>
 #include <linux/debugfs.h>
 #include <linux/pm_wakeirq.h>
+#include <linux/types.h>
 #include <trace/events/power.h>
 
 #include "power.h"
@@ -72,22 +73,7 @@
 	.lock =  __SPIN_LOCK_UNLOCKED(deleted_ws.lock),
 };
 
-/**
- * wakeup_source_prepare - Prepare a new wakeup source for initialization.
- * @ws: Wakeup source to prepare.
- * @name: Pointer to the name of the new wakeup source.
- *
- * Callers must ensure that the @name string won't be freed when @ws is still in
- * use.
- */
-void wakeup_source_prepare(struct wakeup_source *ws, const char *name)
-{
-	if (ws) {
-		memset(ws, 0, sizeof(*ws));
-		ws->name = name;
-	}
-}
-EXPORT_SYMBOL_GPL(wakeup_source_prepare);
+static DEFINE_IDA(wakeup_ida);
 
 /**
  * wakeup_source_create - Create a struct wakeup_source object.
@@ -96,32 +82,34 @@
 struct wakeup_source *wakeup_source_create(const char *name)
 {
 	struct wakeup_source *ws;
+	const char *ws_name;
+	int id;
 
-	ws = kmalloc(sizeof(*ws), GFP_KERNEL);
+	ws = kzalloc(sizeof(*ws), GFP_KERNEL);
 	if (!ws)
-		return NULL;
+		goto err_ws;
 
-	wakeup_source_prepare(ws, name ? kstrdup_const(name, GFP_KERNEL) : NULL);
+	ws_name = kstrdup_const(name, GFP_KERNEL);
+	if (!ws_name)
+		goto err_name;
+	ws->name = ws_name;
+
+	id = ida_alloc(&wakeup_ida, GFP_KERNEL);
+	if (id < 0)
+		goto err_id;
+	ws->id = id;
+
 	return ws;
+
+err_id:
+	kfree_const(ws->name);
+err_name:
+	kfree(ws);
+err_ws:
+	return NULL;
 }
 EXPORT_SYMBOL_GPL(wakeup_source_create);
 
-/**
- * wakeup_source_drop - Prepare a struct wakeup_source object for destruction.
- * @ws: Wakeup source to prepare for destruction.
- *
- * Callers must ensure that __pm_stay_awake() or __pm_wakeup_event() will never
- * be run in parallel with this function for the same wakeup source object.
- */
-void wakeup_source_drop(struct wakeup_source *ws)
-{
-	if (!ws)
-		return;
-
-	__pm_relax(ws);
-}
-EXPORT_SYMBOL_GPL(wakeup_source_drop);
-
 /*
  * Record wakeup_source statistics being deleted into a dummy wakeup_source.
  */
@@ -150,6 +138,13 @@
 	spin_unlock_irqrestore(&deleted_ws.lock, flags);
 }
 
+static void wakeup_source_free(struct wakeup_source *ws)
+{
+	ida_free(&wakeup_ida, ws->id);
+	kfree_const(ws->name);
+	kfree(ws);
+}
+
 /**
  * wakeup_source_destroy - Destroy a struct wakeup_source object.
  * @ws: Wakeup source to destroy.
@@ -161,10 +156,9 @@
 	if (!ws)
 		return;
 
-	wakeup_source_drop(ws);
+	__pm_relax(ws);
 	wakeup_source_record(ws);
-	kfree_const(ws->name);
-	kfree(ws);
+	wakeup_source_free(ws);
 }
 EXPORT_SYMBOL_GPL(wakeup_source_destroy);
 
@@ -216,16 +210,26 @@
 
 /**
  * wakeup_source_register - Create wakeup source and add it to the list.
+ * @dev: Device this wakeup source is associated with (or NULL if virtual).
  * @name: Name of the wakeup source to register.
  */
-struct wakeup_source *wakeup_source_register(const char *name)
+struct wakeup_source *wakeup_source_register(struct device *dev,
+					     const char *name)
 {
 	struct wakeup_source *ws;
+	int ret;
 
 	ws = wakeup_source_create(name);
-	if (ws)
+	if (ws) {
+		if (!dev || device_is_registered(dev)) {
+			ret = wakeup_source_sysfs_add(dev, ws);
+			if (ret) {
+				wakeup_source_free(ws);
+				return NULL;
+			}
+		}
 		wakeup_source_add(ws);
-
+	}
 	return ws;
 }
 EXPORT_SYMBOL_GPL(wakeup_source_register);
@@ -238,6 +242,7 @@
 {
 	if (ws) {
 		wakeup_source_remove(ws);
+		wakeup_source_sysfs_remove(ws);
 		wakeup_source_destroy(ws);
 	}
 }
@@ -281,7 +286,7 @@
 	if (pm_suspend_target_state != PM_SUSPEND_ON)
 		dev_dbg(dev, "Suspicious %s() during system transition!\n", __func__);
 
-	ws = wakeup_source_register(dev_name(dev));
+	ws = wakeup_source_register(dev, dev_name(dev));
 	if (!ws)
 		return -ENOMEM;
 
@@ -809,6 +814,37 @@
 }
 EXPORT_SYMBOL_GPL(pm_wakeup_dev_event);
 
+void pm_get_active_wakeup_sources(char *pending_wakeup_source, size_t max)
+{
+	struct wakeup_source *ws, *last_active_ws = NULL;
+	int len = 0;
+	bool active = false;
+
+	rcu_read_lock();
+	list_for_each_entry_rcu(ws, &wakeup_sources, entry) {
+		if (ws->active && len < max) {
+			if (!active)
+				len += scnprintf(pending_wakeup_source, max,
+						"Pending Wakeup Sources: ");
+			len += scnprintf(pending_wakeup_source + len, max - len,
+				"%s ", ws->name);
+			active = true;
+		} else if (!active &&
+			   (!last_active_ws ||
+			    ktime_to_ns(ws->last_time) >
+			    ktime_to_ns(last_active_ws->last_time))) {
+			last_active_ws = ws;
+		}
+	}
+	if (!active && last_active_ws) {
+		scnprintf(pending_wakeup_source, max,
+				"Last active Wakeup Source: %s",
+				last_active_ws->name);
+	}
+	rcu_read_unlock();
+}
+EXPORT_SYMBOL_GPL(pm_get_active_wakeup_sources);
+
 void pm_print_active_wakeup_sources(void)
 {
 	struct wakeup_source *ws;
diff --git a/drivers/base/power/wakeup_stats.c b/drivers/base/power/wakeup_stats.c
new file mode 100644
index 0000000..c773491
--- /dev/null
+++ b/drivers/base/power/wakeup_stats.c
@@ -0,0 +1,214 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Wakeup statistics in sysfs
+ *
+ * Copyright (c) 2019 Linux Foundation
+ * Copyright (c) 2019 Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+ * Copyright (c) 2019 Google Inc.
+ */
+
+#include <linux/device.h>
+#include <linux/idr.h>
+#include <linux/init.h>
+#include <linux/kdev_t.h>
+#include <linux/kernel.h>
+#include <linux/kobject.h>
+#include <linux/slab.h>
+#include <linux/timekeeping.h>
+
+#include "power.h"
+
+static struct class *wakeup_class;
+
+#define wakeup_attr(_name)						\
+static ssize_t _name##_show(struct device *dev,				\
+			    struct device_attribute *attr, char *buf)	\
+{									\
+	struct wakeup_source *ws = dev_get_drvdata(dev);		\
+									\
+	return sprintf(buf, "%lu\n", ws->_name);			\
+}									\
+static DEVICE_ATTR_RO(_name)
+
+wakeup_attr(active_count);
+wakeup_attr(event_count);
+wakeup_attr(wakeup_count);
+wakeup_attr(expire_count);
+
+static ssize_t active_time_ms_show(struct device *dev,
+				   struct device_attribute *attr, char *buf)
+{
+	struct wakeup_source *ws = dev_get_drvdata(dev);
+	ktime_t active_time =
+		ws->active ? ktime_sub(ktime_get(), ws->last_time) : 0;
+
+	return sprintf(buf, "%lld\n", ktime_to_ms(active_time));
+}
+static DEVICE_ATTR_RO(active_time_ms);
+
+static ssize_t total_time_ms_show(struct device *dev,
+				  struct device_attribute *attr, char *buf)
+{
+	struct wakeup_source *ws = dev_get_drvdata(dev);
+	ktime_t active_time;
+	ktime_t total_time = ws->total_time;
+
+	if (ws->active) {
+		active_time = ktime_sub(ktime_get(), ws->last_time);
+		total_time = ktime_add(total_time, active_time);
+	}
+	return sprintf(buf, "%lld\n", ktime_to_ms(total_time));
+}
+static DEVICE_ATTR_RO(total_time_ms);
+
+static ssize_t max_time_ms_show(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	struct wakeup_source *ws = dev_get_drvdata(dev);
+	ktime_t active_time;
+	ktime_t max_time = ws->max_time;
+
+	if (ws->active) {
+		active_time = ktime_sub(ktime_get(), ws->last_time);
+		if (active_time > max_time)
+			max_time = active_time;
+	}
+	return sprintf(buf, "%lld\n", ktime_to_ms(max_time));
+}
+static DEVICE_ATTR_RO(max_time_ms);
+
+static ssize_t last_change_ms_show(struct device *dev,
+				   struct device_attribute *attr, char *buf)
+{
+	struct wakeup_source *ws = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%lld\n", ktime_to_ms(ws->last_time));
+}
+static DEVICE_ATTR_RO(last_change_ms);
+
+static ssize_t name_show(struct device *dev, struct device_attribute *attr,
+			 char *buf)
+{
+	struct wakeup_source *ws = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%s\n", ws->name);
+}
+static DEVICE_ATTR_RO(name);
+
+static ssize_t prevent_suspend_time_ms_show(struct device *dev,
+					    struct device_attribute *attr,
+					    char *buf)
+{
+	struct wakeup_source *ws = dev_get_drvdata(dev);
+	ktime_t prevent_sleep_time = ws->prevent_sleep_time;
+
+	if (ws->active && ws->autosleep_enabled) {
+		prevent_sleep_time = ktime_add(prevent_sleep_time,
+			ktime_sub(ktime_get(), ws->start_prevent_time));
+	}
+	return sprintf(buf, "%lld\n", ktime_to_ms(prevent_sleep_time));
+}
+static DEVICE_ATTR_RO(prevent_suspend_time_ms);
+
+static struct attribute *wakeup_source_attrs[] = {
+	&dev_attr_name.attr,
+	&dev_attr_active_count.attr,
+	&dev_attr_event_count.attr,
+	&dev_attr_wakeup_count.attr,
+	&dev_attr_expire_count.attr,
+	&dev_attr_active_time_ms.attr,
+	&dev_attr_total_time_ms.attr,
+	&dev_attr_max_time_ms.attr,
+	&dev_attr_last_change_ms.attr,
+	&dev_attr_prevent_suspend_time_ms.attr,
+	NULL,
+};
+ATTRIBUTE_GROUPS(wakeup_source);
+
+static void device_create_release(struct device *dev)
+{
+	kfree(dev);
+}
+
+static struct device *wakeup_source_device_create(struct device *parent,
+						  struct wakeup_source *ws)
+{
+	struct device *dev = NULL;
+	int retval = -ENODEV;
+
+	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+	if (!dev) {
+		retval = -ENOMEM;
+		goto error;
+	}
+
+	device_initialize(dev);
+	dev->devt = MKDEV(0, 0);
+	dev->class = wakeup_class;
+	dev->parent = parent;
+	dev->groups = wakeup_source_groups;
+	dev->release = device_create_release;
+	dev_set_drvdata(dev, ws);
+	device_set_pm_not_required(dev);
+
+	retval = kobject_set_name(&dev->kobj, "wakeup%d", ws->id);
+	if (retval)
+		goto error;
+
+	retval = device_add(dev);
+	if (retval)
+		goto error;
+
+	return dev;
+
+error:
+	put_device(dev);
+	return ERR_PTR(retval);
+}
+
+/**
+ * wakeup_source_sysfs_add - Add wakeup_source attributes to sysfs.
+ * @parent: Device given wakeup source is associated with (or NULL if virtual).
+ * @ws: Wakeup source to be added in sysfs.
+ */
+int wakeup_source_sysfs_add(struct device *parent, struct wakeup_source *ws)
+{
+	struct device *dev;
+
+	dev = wakeup_source_device_create(parent, ws);
+	if (IS_ERR(dev))
+		return PTR_ERR(dev);
+	ws->dev = dev;
+
+	return 0;
+}
+
+/**
+ * pm_wakeup_source_sysfs_add - Add wakeup_source attributes to sysfs
+ * for a device if they're missing.
+ * @parent: Device given wakeup source is associated with
+ */
+int pm_wakeup_source_sysfs_add(struct device *parent)
+{
+	if (!parent->power.wakeup || parent->power.wakeup->dev)
+		return 0;
+
+	return wakeup_source_sysfs_add(parent, parent->power.wakeup);
+}
+
+/**
+ * wakeup_source_sysfs_remove - Remove wakeup_source attributes from sysfs.
+ * @ws: Wakeup source to be removed from sysfs.
+ */
+void wakeup_source_sysfs_remove(struct wakeup_source *ws)
+{
+	device_unregister(ws->dev);
+}
+
+static int __init wakeup_sources_sysfs_init(void)
+{
+	wakeup_class = class_create(THIS_MODULE, "wakeup");
+
+	return PTR_ERR_OR_ZERO(wakeup_class);
+}
+postcore_initcall(wakeup_sources_sysfs_init);
diff --git a/drivers/base/syscore.c b/drivers/base/syscore.c
index 6e076f3..996573f 100644
--- a/drivers/base/syscore.c
+++ b/drivers/base/syscore.c
@@ -10,6 +10,7 @@
 #include <linux/module.h>
 #include <linux/suspend.h>
 #include <trace/events/power.h>
+#include <linux/wakeup_reason.h>
 
 static LIST_HEAD(syscore_ops_list);
 static DEFINE_MUTEX(syscore_ops_lock);
@@ -74,6 +75,8 @@
 	return 0;
 
  err_out:
+	log_suspend_abort_reason("System core suspend callback %pF failed",
+		ops->suspend);
 	pr_err("PM: System core suspend callback %pF failed.\n", ops->suspend);
 
 	list_for_each_entry_continue(ops, &syscore_ops_list, node)
diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig
index 6352357..99a2c60 100644
--- a/drivers/block/zram/Kconfig
+++ b/drivers/block/zram/Kconfig
@@ -16,7 +16,7 @@
 	  See Documentation/blockdev/zram.txt for more information.
 
 config ZRAM_WRITEBACK
-       bool "Write back incompressible page to backing device"
+       bool "Write back incompressible or idle page to backing device"
        depends on ZRAM
        default n
        help
@@ -25,6 +25,9 @@
 	 For this feature, admin should set up backing device via
 	 /sys/block/zramX/backing_dev.
 
+	 With /sys/block/zramX/{idle,writeback}, application could ask
+	 idle page's writeback to the backing device to save in memory.
+
 	 See Documentation/blockdev/zram.txt for more information.
 
 config ZRAM_MEMORY_TRACKING
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 76abe40..a2f5297 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -52,20 +52,23 @@
 static size_t huge_class_size;
 
 static void zram_free_page(struct zram *zram, size_t index);
+static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec,
+				u32 index, int offset, struct bio *bio);
+
 
 static int zram_slot_trylock(struct zram *zram, u32 index)
 {
-	return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].value);
+	return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].flags);
 }
 
 static void zram_slot_lock(struct zram *zram, u32 index)
 {
-	bit_spin_lock(ZRAM_LOCK, &zram->table[index].value);
+	bit_spin_lock(ZRAM_LOCK, &zram->table[index].flags);
 }
 
 static void zram_slot_unlock(struct zram *zram, u32 index)
 {
-	bit_spin_unlock(ZRAM_LOCK, &zram->table[index].value);
+	bit_spin_unlock(ZRAM_LOCK, &zram->table[index].flags);
 }
 
 static inline bool init_done(struct zram *zram)
@@ -73,13 +76,6 @@
 	return zram->disksize;
 }
 
-static inline bool zram_allocated(struct zram *zram, u32 index)
-{
-
-	return (zram->table[index].value >> (ZRAM_FLAG_SHIFT + 1)) ||
-					zram->table[index].handle;
-}
-
 static inline struct zram *dev_to_zram(struct device *dev)
 {
 	return (struct zram *)dev_to_disk(dev)->private_data;
@@ -99,19 +95,19 @@
 static bool zram_test_flag(struct zram *zram, u32 index,
 			enum zram_pageflags flag)
 {
-	return zram->table[index].value & BIT(flag);
+	return zram->table[index].flags & BIT(flag);
 }
 
 static void zram_set_flag(struct zram *zram, u32 index,
 			enum zram_pageflags flag)
 {
-	zram->table[index].value |= BIT(flag);
+	zram->table[index].flags |= BIT(flag);
 }
 
 static void zram_clear_flag(struct zram *zram, u32 index,
 			enum zram_pageflags flag)
 {
-	zram->table[index].value &= ~BIT(flag);
+	zram->table[index].flags &= ~BIT(flag);
 }
 
 static inline void zram_set_element(struct zram *zram, u32 index,
@@ -127,15 +123,22 @@
 
 static size_t zram_get_obj_size(struct zram *zram, u32 index)
 {
-	return zram->table[index].value & (BIT(ZRAM_FLAG_SHIFT) - 1);
+	return zram->table[index].flags & (BIT(ZRAM_FLAG_SHIFT) - 1);
 }
 
 static void zram_set_obj_size(struct zram *zram,
 					u32 index, size_t size)
 {
-	unsigned long flags = zram->table[index].value >> ZRAM_FLAG_SHIFT;
+	unsigned long flags = zram->table[index].flags >> ZRAM_FLAG_SHIFT;
 
-	zram->table[index].value = (flags << ZRAM_FLAG_SHIFT) | size;
+	zram->table[index].flags = (flags << ZRAM_FLAG_SHIFT) | size;
+}
+
+static inline bool zram_allocated(struct zram *zram, u32 index)
+{
+	return zram_get_obj_size(zram, index) ||
+			zram_test_flag(zram, index, ZRAM_SAME) ||
+			zram_test_flag(zram, index, ZRAM_WB);
 }
 
 #if PAGE_SIZE != 4096
@@ -281,17 +284,125 @@
 	return len;
 }
 
-#ifdef CONFIG_ZRAM_WRITEBACK
-static bool zram_wb_enabled(struct zram *zram)
+static ssize_t idle_store(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t len)
 {
-	return zram->backing_dev;
+	struct zram *zram = dev_to_zram(dev);
+	unsigned long nr_pages = zram->disksize >> PAGE_SHIFT;
+	int index;
+	char mode_buf[8];
+	ssize_t sz;
+
+	sz = strscpy(mode_buf, buf, sizeof(mode_buf));
+	if (sz <= 0)
+		return -EINVAL;
+
+	/* ignore trailing new line */
+	if (mode_buf[sz - 1] == '\n')
+		mode_buf[sz - 1] = 0x00;
+
+	if (strcmp(mode_buf, "all"))
+		return -EINVAL;
+
+	down_read(&zram->init_lock);
+	if (!init_done(zram)) {
+		up_read(&zram->init_lock);
+		return -EINVAL;
+	}
+
+	for (index = 0; index < nr_pages; index++) {
+		/*
+		 * Do not mark ZRAM_UNDER_WB slot as ZRAM_IDLE to close race.
+		 * See the comment in writeback_store.
+		 */
+		zram_slot_lock(zram, index);
+		if (zram_allocated(zram, index) &&
+				!zram_test_flag(zram, index, ZRAM_UNDER_WB))
+			zram_set_flag(zram, index, ZRAM_IDLE);
+		zram_slot_unlock(zram, index);
+	}
+
+	up_read(&zram->init_lock);
+
+	return len;
+}
+
+#ifdef CONFIG_ZRAM_WRITEBACK
+static ssize_t writeback_limit_enable_store(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t len)
+{
+	struct zram *zram = dev_to_zram(dev);
+	u64 val;
+	ssize_t ret = -EINVAL;
+
+	if (kstrtoull(buf, 10, &val))
+		return ret;
+
+	down_read(&zram->init_lock);
+	spin_lock(&zram->wb_limit_lock);
+	zram->wb_limit_enable = val;
+	spin_unlock(&zram->wb_limit_lock);
+	up_read(&zram->init_lock);
+	ret = len;
+
+	return ret;
+}
+
+static ssize_t writeback_limit_enable_show(struct device *dev,
+		struct device_attribute *attr, char *buf)
+{
+	bool val;
+	struct zram *zram = dev_to_zram(dev);
+
+	down_read(&zram->init_lock);
+	spin_lock(&zram->wb_limit_lock);
+	val = zram->wb_limit_enable;
+	spin_unlock(&zram->wb_limit_lock);
+	up_read(&zram->init_lock);
+
+	return scnprintf(buf, PAGE_SIZE, "%d\n", val);
+}
+
+static ssize_t writeback_limit_store(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t len)
+{
+	struct zram *zram = dev_to_zram(dev);
+	u64 val;
+	ssize_t ret = -EINVAL;
+
+	if (kstrtoull(buf, 10, &val))
+		return ret;
+
+	down_read(&zram->init_lock);
+	spin_lock(&zram->wb_limit_lock);
+	zram->bd_wb_limit = val;
+	spin_unlock(&zram->wb_limit_lock);
+	up_read(&zram->init_lock);
+	ret = len;
+
+	return ret;
+}
+
+static ssize_t writeback_limit_show(struct device *dev,
+		struct device_attribute *attr, char *buf)
+{
+	u64 val;
+	struct zram *zram = dev_to_zram(dev);
+
+	down_read(&zram->init_lock);
+	spin_lock(&zram->wb_limit_lock);
+	val = zram->bd_wb_limit;
+	spin_unlock(&zram->wb_limit_lock);
+	up_read(&zram->init_lock);
+
+	return scnprintf(buf, PAGE_SIZE, "%llu\n", val);
 }
 
 static void reset_bdev(struct zram *zram)
 {
 	struct block_device *bdev;
 
-	if (!zram_wb_enabled(zram))
+	if (!zram->backing_dev)
 		return;
 
 	bdev = zram->bdev;
@@ -448,7 +559,7 @@
 	return err;
 }
 
-static unsigned long get_entry_bdev(struct zram *zram)
+static unsigned long alloc_block_bdev(struct zram *zram)
 {
 	unsigned long blk_idx = 1;
 retry:
@@ -460,15 +571,17 @@
 	if (test_and_set_bit(blk_idx, zram->bitmap))
 		goto retry;
 
+	atomic64_inc(&zram->stats.bd_count);
 	return blk_idx;
 }
 
-static void put_entry_bdev(struct zram *zram, unsigned long entry)
+static void free_block_bdev(struct zram *zram, unsigned long blk_idx)
 {
 	int was_set;
 
-	was_set = test_and_clear_bit(entry, zram->bitmap);
+	was_set = test_and_clear_bit(blk_idx, zram->bitmap);
 	WARN_ON_ONCE(!was_set);
+	atomic64_dec(&zram->stats.bd_count);
 }
 
 static void zram_page_end_io(struct bio *bio)
@@ -511,6 +624,172 @@
 	return 1;
 }
 
+#define HUGE_WRITEBACK 1
+#define IDLE_WRITEBACK 2
+
+static ssize_t writeback_store(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t len)
+{
+	struct zram *zram = dev_to_zram(dev);
+	unsigned long nr_pages = zram->disksize >> PAGE_SHIFT;
+	unsigned long index;
+	struct bio bio;
+	struct bio_vec bio_vec;
+	struct page *page;
+	ssize_t ret, sz;
+	char mode_buf[8];
+	int mode = -1;
+	unsigned long blk_idx = 0;
+
+	sz = strscpy(mode_buf, buf, sizeof(mode_buf));
+	if (sz <= 0)
+		return -EINVAL;
+
+	/* ignore trailing newline */
+	if (mode_buf[sz - 1] == '\n')
+		mode_buf[sz - 1] = 0x00;
+
+	if (!strcmp(mode_buf, "idle"))
+		mode = IDLE_WRITEBACK;
+	else if (!strcmp(mode_buf, "huge"))
+		mode = HUGE_WRITEBACK;
+
+	if (mode == -1)
+		return -EINVAL;
+
+	down_read(&zram->init_lock);
+	if (!init_done(zram)) {
+		ret = -EINVAL;
+		goto release_init_lock;
+	}
+
+	if (!zram->backing_dev) {
+		ret = -ENODEV;
+		goto release_init_lock;
+	}
+
+	page = alloc_page(GFP_KERNEL);
+	if (!page) {
+		ret = -ENOMEM;
+		goto release_init_lock;
+	}
+
+	for (index = 0; index < nr_pages; index++) {
+		struct bio_vec bvec;
+
+		bvec.bv_page = page;
+		bvec.bv_len = PAGE_SIZE;
+		bvec.bv_offset = 0;
+
+		spin_lock(&zram->wb_limit_lock);
+		if (zram->wb_limit_enable && !zram->bd_wb_limit) {
+			spin_unlock(&zram->wb_limit_lock);
+			ret = -EIO;
+			break;
+		}
+		spin_unlock(&zram->wb_limit_lock);
+
+		if (!blk_idx) {
+			blk_idx = alloc_block_bdev(zram);
+			if (!blk_idx) {
+				ret = -ENOSPC;
+				break;
+			}
+		}
+
+		zram_slot_lock(zram, index);
+		if (!zram_allocated(zram, index))
+			goto next;
+
+		if (zram_test_flag(zram, index, ZRAM_WB) ||
+				zram_test_flag(zram, index, ZRAM_SAME) ||
+				zram_test_flag(zram, index, ZRAM_UNDER_WB))
+			goto next;
+
+		if (mode == IDLE_WRITEBACK &&
+			  !zram_test_flag(zram, index, ZRAM_IDLE))
+			goto next;
+		if (mode == HUGE_WRITEBACK &&
+			  !zram_test_flag(zram, index, ZRAM_HUGE))
+			goto next;
+		/*
+		 * Clearing ZRAM_UNDER_WB is duty of caller.
+		 * IOW, zram_free_page never clear it.
+		 */
+		zram_set_flag(zram, index, ZRAM_UNDER_WB);
+		/* Need for hugepage writeback racing */
+		zram_set_flag(zram, index, ZRAM_IDLE);
+		zram_slot_unlock(zram, index);
+		if (zram_bvec_read(zram, &bvec, index, 0, NULL)) {
+			zram_slot_lock(zram, index);
+			zram_clear_flag(zram, index, ZRAM_UNDER_WB);
+			zram_clear_flag(zram, index, ZRAM_IDLE);
+			zram_slot_unlock(zram, index);
+			continue;
+		}
+
+		bio_init(&bio, &bio_vec, 1);
+		bio_set_dev(&bio, zram->bdev);
+		bio.bi_iter.bi_sector = blk_idx * (PAGE_SIZE >> 9);
+		bio.bi_opf = REQ_OP_WRITE | REQ_SYNC;
+
+		bio_add_page(&bio, bvec.bv_page, bvec.bv_len,
+				bvec.bv_offset);
+		/*
+		 * XXX: A single page IO would be inefficient for write
+		 * but it would be not bad as starter.
+		 */
+		ret = submit_bio_wait(&bio);
+		if (ret) {
+			zram_slot_lock(zram, index);
+			zram_clear_flag(zram, index, ZRAM_UNDER_WB);
+			zram_clear_flag(zram, index, ZRAM_IDLE);
+			zram_slot_unlock(zram, index);
+			continue;
+		}
+
+		atomic64_inc(&zram->stats.bd_writes);
+		/*
+		 * We released zram_slot_lock so need to check if the slot was
+		 * changed. If there is freeing for the slot, we can catch it
+		 * easily by zram_allocated.
+		 * A subtle case is the slot is freed/reallocated/marked as
+		 * ZRAM_IDLE again. To close the race, idle_store doesn't
+		 * mark ZRAM_IDLE once it found the slot was ZRAM_UNDER_WB.
+		 * Thus, we could close the race by checking ZRAM_IDLE bit.
+		 */
+		zram_slot_lock(zram, index);
+		if (!zram_allocated(zram, index) ||
+			  !zram_test_flag(zram, index, ZRAM_IDLE)) {
+			zram_clear_flag(zram, index, ZRAM_UNDER_WB);
+			zram_clear_flag(zram, index, ZRAM_IDLE);
+			goto next;
+		}
+
+		zram_free_page(zram, index);
+		zram_clear_flag(zram, index, ZRAM_UNDER_WB);
+		zram_set_flag(zram, index, ZRAM_WB);
+		zram_set_element(zram, index, blk_idx);
+		blk_idx = 0;
+		atomic64_inc(&zram->stats.pages_stored);
+		spin_lock(&zram->wb_limit_lock);
+		if (zram->wb_limit_enable && zram->bd_wb_limit > 0)
+			zram->bd_wb_limit -=  1UL << (PAGE_SHIFT - 12);
+		spin_unlock(&zram->wb_limit_lock);
+next:
+		zram_slot_unlock(zram, index);
+	}
+
+	if (blk_idx)
+		free_block_bdev(zram, blk_idx);
+	ret = len;
+	__free_page(page);
+release_init_lock:
+	up_read(&zram->init_lock);
+
+	return ret;
+}
+
 struct zram_work {
 	struct work_struct work;
 	struct zram *zram;
@@ -564,79 +843,21 @@
 static int read_from_bdev(struct zram *zram, struct bio_vec *bvec,
 			unsigned long entry, struct bio *parent, bool sync)
 {
+	atomic64_inc(&zram->stats.bd_reads);
 	if (sync)
 		return read_from_bdev_sync(zram, bvec, entry, parent);
 	else
 		return read_from_bdev_async(zram, bvec, entry, parent);
 }
-
-static int write_to_bdev(struct zram *zram, struct bio_vec *bvec,
-					u32 index, struct bio *parent,
-					unsigned long *pentry)
-{
-	struct bio *bio;
-	unsigned long entry;
-
-	bio = bio_alloc(GFP_ATOMIC, 1);
-	if (!bio)
-		return -ENOMEM;
-
-	entry = get_entry_bdev(zram);
-	if (!entry) {
-		bio_put(bio);
-		return -ENOSPC;
-	}
-
-	bio->bi_iter.bi_sector = entry * (PAGE_SIZE >> 9);
-	bio_set_dev(bio, zram->bdev);
-	if (!bio_add_page(bio, bvec->bv_page, bvec->bv_len,
-					bvec->bv_offset)) {
-		bio_put(bio);
-		put_entry_bdev(zram, entry);
-		return -EIO;
-	}
-
-	if (!parent) {
-		bio->bi_opf = REQ_OP_WRITE | REQ_SYNC;
-		bio->bi_end_io = zram_page_end_io;
-	} else {
-		bio->bi_opf = parent->bi_opf;
-		bio_chain(bio, parent);
-	}
-
-	submit_bio(bio);
-	*pentry = entry;
-
-	return 0;
-}
-
-static void zram_wb_clear(struct zram *zram, u32 index)
-{
-	unsigned long entry;
-
-	zram_clear_flag(zram, index, ZRAM_WB);
-	entry = zram_get_element(zram, index);
-	zram_set_element(zram, index, 0);
-	put_entry_bdev(zram, entry);
-}
-
 #else
-static bool zram_wb_enabled(struct zram *zram) { return false; }
 static inline void reset_bdev(struct zram *zram) {};
-static int write_to_bdev(struct zram *zram, struct bio_vec *bvec,
-					u32 index, struct bio *parent,
-					unsigned long *pentry)
-
-{
-	return -EIO;
-}
-
 static int read_from_bdev(struct zram *zram, struct bio_vec *bvec,
 			unsigned long entry, struct bio *parent, bool sync)
 {
 	return -EIO;
 }
-static void zram_wb_clear(struct zram *zram, u32 index) {}
+
+static void free_block_bdev(struct zram *zram, unsigned long blk_idx) {};
 #endif
 
 #ifdef CONFIG_ZRAM_MEMORY_TRACKING
@@ -655,14 +876,10 @@
 
 static void zram_accessed(struct zram *zram, u32 index)
 {
+	zram_clear_flag(zram, index, ZRAM_IDLE);
 	zram->table[index].ac_time = ktime_get_boottime();
 }
 
-static void zram_reset_access(struct zram *zram, u32 index)
-{
-	zram->table[index].ac_time = 0;
-}
-
 static ssize_t read_block_state(struct file *file, char __user *buf,
 				size_t count, loff_t *ppos)
 {
@@ -692,12 +909,13 @@
 
 		ts = ktime_to_timespec64(zram->table[index].ac_time);
 		copied = snprintf(kbuf + written, count,
-			"%12zd %12lld.%06lu %c%c%c\n",
+			"%12zd %12lld.%06lu %c%c%c%c\n",
 			index, (s64)ts.tv_sec,
 			ts.tv_nsec / NSEC_PER_USEC,
 			zram_test_flag(zram, index, ZRAM_SAME) ? 's' : '.',
 			zram_test_flag(zram, index, ZRAM_WB) ? 'w' : '.',
-			zram_test_flag(zram, index, ZRAM_HUGE) ? 'h' : '.');
+			zram_test_flag(zram, index, ZRAM_HUGE) ? 'h' : '.',
+			zram_test_flag(zram, index, ZRAM_IDLE) ? 'i' : '.');
 
 		if (count < copied) {
 			zram_slot_unlock(zram, index);
@@ -742,8 +960,10 @@
 #else
 static void zram_debugfs_create(void) {};
 static void zram_debugfs_destroy(void) {};
-static void zram_accessed(struct zram *zram, u32 index) {};
-static void zram_reset_access(struct zram *zram, u32 index) {};
+static void zram_accessed(struct zram *zram, u32 index)
+{
+	zram_clear_flag(zram, index, ZRAM_IDLE);
+};
 static void zram_debugfs_register(struct zram *zram) {};
 static void zram_debugfs_unregister(struct zram *zram) {};
 #endif
@@ -880,6 +1100,26 @@
 	return ret;
 }
 
+#ifdef CONFIG_ZRAM_WRITEBACK
+#define FOUR_K(x) ((x) * (1 << (PAGE_SHIFT - 12)))
+static ssize_t bd_stat_show(struct device *dev,
+		struct device_attribute *attr, char *buf)
+{
+	struct zram *zram = dev_to_zram(dev);
+	ssize_t ret;
+
+	down_read(&zram->init_lock);
+	ret = scnprintf(buf, PAGE_SIZE,
+		"%8llu %8llu %8llu\n",
+			FOUR_K((u64)atomic64_read(&zram->stats.bd_count)),
+			FOUR_K((u64)atomic64_read(&zram->stats.bd_reads)),
+			FOUR_K((u64)atomic64_read(&zram->stats.bd_writes)));
+	up_read(&zram->init_lock);
+
+	return ret;
+}
+#endif
+
 static ssize_t debug_stat_show(struct device *dev,
 		struct device_attribute *attr, char *buf)
 {
@@ -900,6 +1140,9 @@
 
 static DEVICE_ATTR_RO(io_stat);
 static DEVICE_ATTR_RO(mm_stat);
+#ifdef CONFIG_ZRAM_WRITEBACK
+static DEVICE_ATTR_RO(bd_stat);
+#endif
 static DEVICE_ATTR_RO(debug_stat);
 
 static void zram_meta_free(struct zram *zram, u64 disksize)
@@ -944,17 +1187,21 @@
 {
 	unsigned long handle;
 
-	zram_reset_access(zram, index);
+#ifdef CONFIG_ZRAM_MEMORY_TRACKING
+	zram->table[index].ac_time = 0;
+#endif
+	if (zram_test_flag(zram, index, ZRAM_IDLE))
+		zram_clear_flag(zram, index, ZRAM_IDLE);
 
 	if (zram_test_flag(zram, index, ZRAM_HUGE)) {
 		zram_clear_flag(zram, index, ZRAM_HUGE);
 		atomic64_dec(&zram->stats.huge_pages);
 	}
 
-	if (zram_wb_enabled(zram) && zram_test_flag(zram, index, ZRAM_WB)) {
-		zram_wb_clear(zram, index);
-		atomic64_dec(&zram->stats.pages_stored);
-		return;
+	if (zram_test_flag(zram, index, ZRAM_WB)) {
+		zram_clear_flag(zram, index, ZRAM_WB);
+		free_block_bdev(zram, zram_get_element(zram, index));
+		goto out;
 	}
 
 	/*
@@ -963,10 +1210,8 @@
 	 */
 	if (zram_test_flag(zram, index, ZRAM_SAME)) {
 		zram_clear_flag(zram, index, ZRAM_SAME);
-		zram_set_element(zram, index, 0);
 		atomic64_dec(&zram->stats.same_pages);
-		atomic64_dec(&zram->stats.pages_stored);
-		return;
+		goto out;
 	}
 
 	handle = zram_get_handle(zram, index);
@@ -977,10 +1222,12 @@
 
 	atomic64_sub(zram_get_obj_size(zram, index),
 			&zram->stats.compr_data_size);
+out:
 	atomic64_dec(&zram->stats.pages_stored);
-
 	zram_set_handle(zram, index, 0);
 	zram_set_obj_size(zram, index, 0);
+	WARN_ON_ONCE(zram->table[index].flags &
+		~(1UL << ZRAM_LOCK | 1UL << ZRAM_UNDER_WB));
 }
 
 static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index,
@@ -991,24 +1238,20 @@
 	unsigned int size;
 	void *src, *dst;
 
-	if (zram_wb_enabled(zram)) {
-		zram_slot_lock(zram, index);
-		if (zram_test_flag(zram, index, ZRAM_WB)) {
-			struct bio_vec bvec;
+	zram_slot_lock(zram, index);
+	if (zram_test_flag(zram, index, ZRAM_WB)) {
+		struct bio_vec bvec;
 
-			zram_slot_unlock(zram, index);
-
-			bvec.bv_page = page;
-			bvec.bv_len = PAGE_SIZE;
-			bvec.bv_offset = 0;
-			return read_from_bdev(zram, &bvec,
-					zram_get_element(zram, index),
-					bio, partial_io);
-		}
 		zram_slot_unlock(zram, index);
+
+		bvec.bv_page = page;
+		bvec.bv_len = PAGE_SIZE;
+		bvec.bv_offset = 0;
+		return read_from_bdev(zram, &bvec,
+				zram_get_element(zram, index),
+				bio, partial_io);
 	}
 
-	zram_slot_lock(zram, index);
 	handle = zram_get_handle(zram, index);
 	if (!handle || zram_test_flag(zram, index, ZRAM_SAME)) {
 		unsigned long value;
@@ -1093,7 +1336,6 @@
 	struct page *page = bvec->bv_page;
 	unsigned long element = 0;
 	enum zram_pageflags flags = 0;
-	bool allow_wb = true;
 
 	mem = kmap_atomic(page);
 	if (page_same_filled(mem, &element)) {
@@ -1118,21 +1360,8 @@
 		return ret;
 	}
 
-	if (unlikely(comp_len >= huge_class_size)) {
+	if (comp_len >= huge_class_size)
 		comp_len = PAGE_SIZE;
-		if (zram_wb_enabled(zram) && allow_wb) {
-			zcomp_stream_put(zram->comp);
-			ret = write_to_bdev(zram, bvec, index, bio, &element);
-			if (!ret) {
-				flags = ZRAM_WB;
-				ret = 1;
-				goto out;
-			}
-			allow_wb = false;
-			goto compress_again;
-		}
-	}
-
 	/*
 	 * handle allocation has 2 paths:
 	 * a) fast path is executed with preemption disabled (for
@@ -1616,10 +1845,14 @@
 static DEVICE_ATTR_WO(reset);
 static DEVICE_ATTR_WO(mem_limit);
 static DEVICE_ATTR_WO(mem_used_max);
+static DEVICE_ATTR_WO(idle);
 static DEVICE_ATTR_RW(max_comp_streams);
 static DEVICE_ATTR_RW(comp_algorithm);
 #ifdef CONFIG_ZRAM_WRITEBACK
 static DEVICE_ATTR_RW(backing_dev);
+static DEVICE_ATTR_WO(writeback);
+static DEVICE_ATTR_RW(writeback_limit);
+static DEVICE_ATTR_RW(writeback_limit_enable);
 #endif
 
 static struct attribute *zram_disk_attrs[] = {
@@ -1629,13 +1862,20 @@
 	&dev_attr_compact.attr,
 	&dev_attr_mem_limit.attr,
 	&dev_attr_mem_used_max.attr,
+	&dev_attr_idle.attr,
 	&dev_attr_max_comp_streams.attr,
 	&dev_attr_comp_algorithm.attr,
 #ifdef CONFIG_ZRAM_WRITEBACK
 	&dev_attr_backing_dev.attr,
+	&dev_attr_writeback.attr,
+	&dev_attr_writeback_limit.attr,
+	&dev_attr_writeback_limit_enable.attr,
 #endif
 	&dev_attr_io_stat.attr,
 	&dev_attr_mm_stat.attr,
+#ifdef CONFIG_ZRAM_WRITEBACK
+	&dev_attr_bd_stat.attr,
+#endif
 	&dev_attr_debug_stat.attr,
 	NULL,
 };
@@ -1669,7 +1909,9 @@
 	device_id = ret;
 
 	init_rwsem(&zram->init_lock);
-
+#ifdef CONFIG_ZRAM_WRITEBACK
+	spin_lock_init(&zram->wb_limit_lock);
+#endif
 	queue = blk_alloc_queue(GFP_KERNEL);
 	if (!queue) {
 		pr_err("Error allocating disk queue for device %d\n",
diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h
index d1095df..f2fd46d 100644
--- a/drivers/block/zram/zram_drv.h
+++ b/drivers/block/zram/zram_drv.h
@@ -30,7 +30,7 @@
 
 
 /*
- * The lower ZRAM_FLAG_SHIFT bits of table.value is for
+ * The lower ZRAM_FLAG_SHIFT bits of table.flags is for
  * object size (excluding header), the higher bits is for
  * zram_pageflags.
  *
@@ -41,13 +41,15 @@
  */
 #define ZRAM_FLAG_SHIFT 24
 
-/* Flags for zram pages (table[page_no].value) */
+/* Flags for zram pages (table[page_no].flags) */
 enum zram_pageflags {
 	/* zram slot is locked */
 	ZRAM_LOCK = ZRAM_FLAG_SHIFT,
 	ZRAM_SAME,	/* Page consists the same element */
 	ZRAM_WB,	/* page is stored on backing_device */
+	ZRAM_UNDER_WB,	/* page is under writeback */
 	ZRAM_HUGE,	/* Incompressible page */
+	ZRAM_IDLE,	/* not accessed page since last idle marking */
 
 	__NR_ZRAM_PAGEFLAGS,
 };
@@ -60,7 +62,7 @@
 		unsigned long handle;
 		unsigned long element;
 	};
-	unsigned long value;
+	unsigned long flags;
 #ifdef CONFIG_ZRAM_MEMORY_TRACKING
 	ktime_t ac_time;
 #endif
@@ -80,6 +82,11 @@
 	atomic_long_t max_used_pages;	/* no. of maximum pages stored */
 	atomic64_t writestall;		/* no. of write slow paths */
 	atomic64_t miss_free;		/* no. of missed free */
+#ifdef	CONFIG_ZRAM_WRITEBACK
+	atomic64_t bd_count;		/* no. of pages in backing device */
+	atomic64_t bd_reads;		/* no. of reads from backing device */
+	atomic64_t bd_writes;		/* no. of writes from backing device */
+#endif
 };
 
 struct zram {
@@ -105,8 +112,11 @@
 	 * zram is claimed so open request will be failed
 	 */
 	bool claim; /* Protected by bdev->bd_mutex */
-#ifdef CONFIG_ZRAM_WRITEBACK
 	struct file *backing_dev;
+#ifdef CONFIG_ZRAM_WRITEBACK
+	spinlock_t wb_limit_lock;
+	bool wb_limit_enable;
+	u64 bd_wb_limit;
 	struct block_device *bdev;
 	unsigned int old_block_size;
 	unsigned long *bitmap;
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 86fe1df..af6e240 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -265,7 +265,7 @@
 #include <linux/syscalls.h>
 #include <linux/completion.h>
 #include <linux/uuid.h>
-#include <crypto/chacha20.h>
+#include <crypto/chacha.h>
 
 #include <asm/processor.h>
 #include <linux/uaccess.h>
@@ -431,11 +431,10 @@
 #define crng_ready() (likely(crng_init > 1))
 static int crng_init_cnt = 0;
 static unsigned long crng_global_init_time = 0;
-#define CRNG_INIT_CNT_THRESH (2*CHACHA20_KEY_SIZE)
-static void _extract_crng(struct crng_state *crng,
-			  __u8 out[CHACHA20_BLOCK_SIZE]);
+#define CRNG_INIT_CNT_THRESH (2*CHACHA_KEY_SIZE)
+static void _extract_crng(struct crng_state *crng, __u8 out[CHACHA_BLOCK_SIZE]);
 static void _crng_backtrack_protect(struct crng_state *crng,
-				    __u8 tmp[CHACHA20_BLOCK_SIZE], int used);
+				    __u8 tmp[CHACHA_BLOCK_SIZE], int used);
 static void process_random_ready_list(void);
 static void _get_random_bytes(void *buf, int nbytes);
 
@@ -866,7 +865,7 @@
 	}
 	p = (unsigned char *) &primary_crng.state[4];
 	while (len > 0 && crng_init_cnt < CRNG_INIT_CNT_THRESH) {
-		p[crng_init_cnt % CHACHA20_KEY_SIZE] ^= *cp;
+		p[crng_init_cnt % CHACHA_KEY_SIZE] ^= *cp;
 		cp++; crng_init_cnt++; len--;
 	}
 	spin_unlock_irqrestore(&primary_crng.lock, flags);
@@ -898,7 +897,7 @@
 	unsigned long		flags;
 	static unsigned char	lfsr = 1;
 	unsigned char		tmp;
-	unsigned		i, max = CHACHA20_KEY_SIZE;
+	unsigned		i, max = CHACHA_KEY_SIZE;
 	const char *		src_buf = cp;
 	char *			dest_buf = (char *) &primary_crng.state[4];
 
@@ -916,8 +915,8 @@
 		lfsr >>= 1;
 		if (tmp & 1)
 			lfsr ^= 0xE1;
-		tmp = dest_buf[i % CHACHA20_KEY_SIZE];
-		dest_buf[i % CHACHA20_KEY_SIZE] ^= src_buf[i % len] ^ lfsr;
+		tmp = dest_buf[i % CHACHA_KEY_SIZE];
+		dest_buf[i % CHACHA_KEY_SIZE] ^= src_buf[i % len] ^ lfsr;
 		lfsr += (tmp << 3) | (tmp >> 5);
 	}
 	spin_unlock_irqrestore(&primary_crng.lock, flags);
@@ -929,7 +928,7 @@
 	unsigned long	flags;
 	int		i, num;
 	union {
-		__u8	block[CHACHA20_BLOCK_SIZE];
+		__u8	block[CHACHA_BLOCK_SIZE];
 		__u32	key[8];
 	} buf;
 
@@ -940,7 +939,7 @@
 	} else {
 		_extract_crng(&primary_crng, buf.block);
 		_crng_backtrack_protect(&primary_crng, buf.block,
-					CHACHA20_KEY_SIZE);
+					CHACHA_KEY_SIZE);
 	}
 	spin_lock_irqsave(&crng->lock, flags);
 	for (i = 0; i < 8; i++) {
@@ -976,7 +975,7 @@
 }
 
 static void _extract_crng(struct crng_state *crng,
-			  __u8 out[CHACHA20_BLOCK_SIZE])
+			  __u8 out[CHACHA_BLOCK_SIZE])
 {
 	unsigned long v, flags;
 
@@ -993,7 +992,7 @@
 	spin_unlock_irqrestore(&crng->lock, flags);
 }
 
-static void extract_crng(__u8 out[CHACHA20_BLOCK_SIZE])
+static void extract_crng(__u8 out[CHACHA_BLOCK_SIZE])
 {
 	struct crng_state *crng = NULL;
 
@@ -1011,14 +1010,14 @@
  * enough) to mutate the CRNG key to provide backtracking protection.
  */
 static void _crng_backtrack_protect(struct crng_state *crng,
-				    __u8 tmp[CHACHA20_BLOCK_SIZE], int used)
+				    __u8 tmp[CHACHA_BLOCK_SIZE], int used)
 {
 	unsigned long	flags;
 	__u32		*s, *d;
 	int		i;
 
 	used = round_up(used, sizeof(__u32));
-	if (used + CHACHA20_KEY_SIZE > CHACHA20_BLOCK_SIZE) {
+	if (used + CHACHA_KEY_SIZE > CHACHA_BLOCK_SIZE) {
 		extract_crng(tmp);
 		used = 0;
 	}
@@ -1030,7 +1029,7 @@
 	spin_unlock_irqrestore(&crng->lock, flags);
 }
 
-static void crng_backtrack_protect(__u8 tmp[CHACHA20_BLOCK_SIZE], int used)
+static void crng_backtrack_protect(__u8 tmp[CHACHA_BLOCK_SIZE], int used)
 {
 	struct crng_state *crng = NULL;
 
@@ -1045,8 +1044,8 @@
 
 static ssize_t extract_crng_user(void __user *buf, size_t nbytes)
 {
-	ssize_t ret = 0, i = CHACHA20_BLOCK_SIZE;
-	__u8 tmp[CHACHA20_BLOCK_SIZE] __aligned(4);
+	ssize_t ret = 0, i = CHACHA_BLOCK_SIZE;
+	__u8 tmp[CHACHA_BLOCK_SIZE] __aligned(4);
 	int large_request = (nbytes > 256);
 
 	while (nbytes) {
@@ -1060,7 +1059,7 @@
 		}
 
 		extract_crng(tmp);
-		i = min_t(int, nbytes, CHACHA20_BLOCK_SIZE);
+		i = min_t(int, nbytes, CHACHA_BLOCK_SIZE);
 		if (copy_to_user(buf, tmp, i)) {
 			ret = -EFAULT;
 			break;
@@ -1625,14 +1624,14 @@
  */
 static void _get_random_bytes(void *buf, int nbytes)
 {
-	__u8 tmp[CHACHA20_BLOCK_SIZE] __aligned(4);
+	__u8 tmp[CHACHA_BLOCK_SIZE] __aligned(4);
 
 	trace_get_random_bytes(nbytes, _RET_IP_);
 
-	while (nbytes >= CHACHA20_BLOCK_SIZE) {
+	while (nbytes >= CHACHA_BLOCK_SIZE) {
 		extract_crng(buf);
-		buf += CHACHA20_BLOCK_SIZE;
-		nbytes -= CHACHA20_BLOCK_SIZE;
+		buf += CHACHA_BLOCK_SIZE;
+		nbytes -= CHACHA_BLOCK_SIZE;
 	}
 
 	if (nbytes > 0) {
@@ -1640,7 +1639,7 @@
 		memcpy(buf, tmp, nbytes);
 		crng_backtrack_protect(tmp, nbytes);
 	} else
-		crng_backtrack_protect(tmp, CHACHA20_BLOCK_SIZE);
+		crng_backtrack_protect(tmp, CHACHA_BLOCK_SIZE);
 	memzero_explicit(tmp, sizeof(tmp));
 }
 
@@ -2211,8 +2210,8 @@
 
 struct batched_entropy {
 	union {
-		u64 entropy_u64[CHACHA20_BLOCK_SIZE / sizeof(u64)];
-		u32 entropy_u32[CHACHA20_BLOCK_SIZE / sizeof(u32)];
+		u64 entropy_u64[CHACHA_BLOCK_SIZE / sizeof(u64)];
+		u32 entropy_u32[CHACHA_BLOCK_SIZE / sizeof(u32)];
 	};
 	unsigned int position;
 	spinlock_t batch_lock;
diff --git a/drivers/char/tpm/Kconfig b/drivers/char/tpm/Kconfig
index 18c81cb..4819874 100644
--- a/drivers/char/tpm/Kconfig
+++ b/drivers/char/tpm/Kconfig
@@ -157,7 +157,6 @@
 config TCG_VTPM_PROXY
 	tristate "VTPM Proxy Interface"
 	depends on TCG_TPM
-	select ANON_INODES
 	---help---
 	  This driver proxies for an emulated TPM (vTPM) running in userspace.
 	  A device /dev/vtpmx is provided that creates a device pair
diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index 608af20..f918250 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -37,6 +37,13 @@
 
 	  If in doubt, say N.
 
+config CPU_FREQ_TIMES
+       bool "CPU frequency time-in-state statistics"
+       help
+         Export CPU time-in-state information through procfs.
+
+         If in doubt, say N.
+
 choice
 	prompt "Default CPUFreq governor"
 	default CPU_FREQ_DEFAULT_GOV_USERSPACE if ARM_SA1100_CPUFREQ || ARM_SA1110_CPUFREQ
@@ -227,6 +234,15 @@
 
 	  If in doubt, say N.
 
+config CPUFREQ_DUMMY
+	tristate "Dummy CPU frequency driver"
+	help
+	  This option adds a generic dummy CPUfreq driver, which sets a fake
+	  2-frequency table when initializing each policy and otherwise does
+	  nothing.
+
+	  If in doubt, say N
+
 if X86
 source "drivers/cpufreq/Kconfig.x86"
 endif
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index c1ffeab..75bfc5a 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -5,7 +5,10 @@
 # CPUfreq stats
 obj-$(CONFIG_CPU_FREQ_STAT)             += cpufreq_stats.o
 
-# CPUfreq governors 
+# CPUfreq times
+obj-$(CONFIG_CPU_FREQ_TIMES)		+= cpufreq_times.o
+
+# CPUfreq governors
 obj-$(CONFIG_CPU_FREQ_GOV_PERFORMANCE)	+= cpufreq_performance.o
 obj-$(CONFIG_CPU_FREQ_GOV_POWERSAVE)	+= cpufreq_powersave.o
 obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE)	+= cpufreq_userspace.o
@@ -17,6 +20,8 @@
 obj-$(CONFIG_CPUFREQ_DT)		+= cpufreq-dt.o
 obj-$(CONFIG_CPUFREQ_DT_PLATDEV)	+= cpufreq-dt-platdev.o
 
+obj-$(CONFIG_CPUFREQ_DUMMY)		+= dummy-cpufreq.o
+
 ##################################################################################
 # x86 drivers.
 # Link order matters. K8 is preferred to ACPI because of firmware bugs in early
diff --git a/drivers/cpufreq/arm_big_little.c b/drivers/cpufreq/arm_big_little.c
index cf62a1f..803d41c 100644
--- a/drivers/cpufreq/arm_big_little.c
+++ b/drivers/cpufreq/arm_big_little.c
@@ -24,6 +24,7 @@
 #include <linux/cpufreq.h>
 #include <linux/cpumask.h>
 #include <linux/cpu_cooling.h>
+#include <linux/energy_model.h>
 #include <linux/export.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
@@ -456,6 +457,7 @@
 /* Per-CPU initialization */
 static int bL_cpufreq_init(struct cpufreq_policy *policy)
 {
+	struct em_data_callback em_cb = EM_DATA_CB(of_dev_pm_opp_get_cpu_power);
 	u32 cur_cluster = cpu_to_cluster(policy->cpu);
 	struct device *cpu_dev;
 	int ret;
@@ -487,6 +489,14 @@
 	policy->cpuinfo.transition_latency =
 				arm_bL_ops->get_transition_latency(cpu_dev);
 
+	ret = dev_pm_opp_get_opp_count(cpu_dev);
+	if (ret <= 0) {
+		dev_dbg(cpu_dev, "OPP table is not ready, deferring probe\n");
+		return -EPROBE_DEFER;
+	}
+
+	em_register_perf_domain(policy->cpus, ret, &em_cb);
+
 	if (is_bL_switching_enabled())
 		per_cpu(cpu_last_req_freq, policy->cpu) = clk_get_cpu_rate(policy->cpu);
 
diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c
index e58bfcb..7556e07 100644
--- a/drivers/cpufreq/cpufreq-dt.c
+++ b/drivers/cpufreq/cpufreq-dt.c
@@ -16,6 +16,7 @@
 #include <linux/cpu_cooling.h>
 #include <linux/cpufreq.h>
 #include <linux/cpumask.h>
+#include <linux/energy_model.h>
 #include <linux/err.h>
 #include <linux/module.h>
 #include <linux/of.h>
@@ -152,6 +153,7 @@
 
 static int cpufreq_init(struct cpufreq_policy *policy)
 {
+	struct em_data_callback em_cb = EM_DATA_CB(of_dev_pm_opp_get_cpu_power);
 	struct cpufreq_frequency_table *freq_table;
 	struct opp_table *opp_table = NULL;
 	struct private_data *priv;
@@ -160,7 +162,7 @@
 	unsigned int transition_latency;
 	bool fallback = false;
 	const char *name;
-	int ret;
+	int ret, nr_opp;
 
 	cpu_dev = get_cpu_device(policy->cpu);
 	if (!cpu_dev) {
@@ -237,6 +239,7 @@
 		ret = -EPROBE_DEFER;
 		goto out_free_opp;
 	}
+	nr_opp = ret;
 
 	if (fallback) {
 		cpumask_setall(policy->cpus);
@@ -280,6 +283,8 @@
 	policy->cpuinfo.transition_latency = transition_latency;
 	policy->dvfs_possible_from_any_cpu = true;
 
+	em_register_perf_domain(policy->cpus, nr_opp, &em_cb);
+
 	return 0;
 
 out_free_cpufreq_table:
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index e35c397..c9b9a4c 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -19,6 +19,7 @@
 
 #include <linux/cpu.h>
 #include <linux/cpufreq.h>
+#include <linux/cpufreq_times.h>
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/init.h>
@@ -158,6 +159,12 @@
 }
 EXPORT_SYMBOL_GPL(arch_set_freq_scale);
 
+__weak void arch_set_max_freq_scale(struct cpumask *cpus,
+				    unsigned long policy_max_freq)
+{
+}
+EXPORT_SYMBOL_GPL(arch_set_max_freq_scale);
+
 /*
  * This is a generic cpufreq init() routine which can be used by cpufreq
  * drivers of SMP systems. It will do following:
@@ -349,6 +356,7 @@
 		}
 
 		cpufreq_stats_record_transition(policy, freqs->new);
+		cpufreq_times_record_transition(policy, freqs->new);
 		policy->cur = freqs->new;
 	}
 }
@@ -1302,6 +1310,7 @@
 			goto out_destroy_policy;
 
 		cpufreq_stats_create_table(policy);
+		cpufreq_times_create_policy(policy);
 
 		write_lock_irqsave(&cpufreq_driver_lock, flags);
 		list_add(&policy->policy_list, &cpufreq_policy_list);
@@ -1864,9 +1873,15 @@
 unsigned int cpufreq_driver_fast_switch(struct cpufreq_policy *policy,
 					unsigned int target_freq)
 {
+	int ret;
+
 	target_freq = clamp_val(target_freq, policy->min, policy->max);
 
-	return cpufreq_driver->fast_switch(policy, target_freq);
+	ret = cpufreq_driver->fast_switch(policy, target_freq);
+	if (ret)
+		cpufreq_times_record_transition(policy, ret);
+
+	return ret;
 }
 EXPORT_SYMBOL_GPL(cpufreq_driver_fast_switch);
 
@@ -2246,6 +2261,8 @@
 	policy->max = new_policy->max;
 	trace_cpu_frequency_limits(policy);
 
+	arch_set_max_freq_scale(policy->cpus, policy->max);
+
 	policy->cached_target_freq = UINT_MAX;
 
 	pr_debug("new min and max freqs are %u - %u kHz\n",
@@ -2280,6 +2297,7 @@
 		ret = cpufreq_start_governor(policy);
 		if (!ret) {
 			pr_debug("cpufreq: governor change\n");
+			sched_cpufreq_governor_change(policy, old_gov);
 			return 0;
 		}
 		cpufreq_exit_governor(policy);
diff --git a/drivers/cpufreq/cpufreq_times.c b/drivers/cpufreq/cpufreq_times.c
new file mode 100644
index 0000000..210742e
--- /dev/null
+++ b/drivers/cpufreq/cpufreq_times.c
@@ -0,0 +1,633 @@
+/* drivers/cpufreq/cpufreq_times.c
+ *
+ * Copyright (C) 2018 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ *
+ */
+
+#include <linux/cpufreq.h>
+#include <linux/cpufreq_times.h>
+#include <linux/hashtable.h>
+#include <linux/init.h>
+#include <linux/jiffies.h>
+#include <linux/proc_fs.h>
+#include <linux/sched.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/threads.h>
+
+#define UID_HASH_BITS 10
+
+static DECLARE_HASHTABLE(uid_hash_table, UID_HASH_BITS);
+
+static DEFINE_SPINLOCK(task_time_in_state_lock); /* task->time_in_state */
+static DEFINE_SPINLOCK(uid_lock); /* uid_hash_table */
+
+struct concurrent_times {
+	atomic64_t active[NR_CPUS];
+	atomic64_t policy[NR_CPUS];
+};
+
+struct uid_entry {
+	uid_t uid;
+	unsigned int max_state;
+	struct hlist_node hash;
+	struct rcu_head rcu;
+	struct concurrent_times *concurrent_times;
+	u64 time_in_state[0];
+};
+
+/**
+ * struct cpu_freqs - per-cpu frequency information
+ * @offset: start of these freqs' stats in task time_in_state array
+ * @max_state: number of entries in freq_table
+ * @last_index: index in freq_table of last frequency switched to
+ * @freq_table: list of available frequencies
+ */
+struct cpu_freqs {
+	unsigned int offset;
+	unsigned int max_state;
+	unsigned int last_index;
+	unsigned int freq_table[0];
+};
+
+static struct cpu_freqs *all_freqs[NR_CPUS];
+
+static unsigned int next_offset;
+
+
+/* Caller must hold rcu_read_lock() */
+static struct uid_entry *find_uid_entry_rcu(uid_t uid)
+{
+	struct uid_entry *uid_entry;
+
+	hash_for_each_possible_rcu(uid_hash_table, uid_entry, hash, uid) {
+		if (uid_entry->uid == uid)
+			return uid_entry;
+	}
+	return NULL;
+}
+
+/* Caller must hold uid lock */
+static struct uid_entry *find_uid_entry_locked(uid_t uid)
+{
+	struct uid_entry *uid_entry;
+
+	hash_for_each_possible(uid_hash_table, uid_entry, hash, uid) {
+		if (uid_entry->uid == uid)
+			return uid_entry;
+	}
+	return NULL;
+}
+
+/* Caller must hold uid lock */
+static struct uid_entry *find_or_register_uid_locked(uid_t uid)
+{
+	struct uid_entry *uid_entry, *temp;
+	struct concurrent_times *times;
+	unsigned int max_state = READ_ONCE(next_offset);
+	size_t alloc_size = sizeof(*uid_entry) + max_state *
+		sizeof(uid_entry->time_in_state[0]);
+
+	uid_entry = find_uid_entry_locked(uid);
+	if (uid_entry) {
+		if (uid_entry->max_state == max_state)
+			return uid_entry;
+		/* uid_entry->time_in_state is too small to track all freqs, so
+		 * expand it.
+		 */
+		temp = __krealloc(uid_entry, alloc_size, GFP_ATOMIC);
+		if (!temp)
+			return uid_entry;
+		temp->max_state = max_state;
+		memset(temp->time_in_state + uid_entry->max_state, 0,
+		       (max_state - uid_entry->max_state) *
+		       sizeof(uid_entry->time_in_state[0]));
+		if (temp != uid_entry) {
+			hlist_replace_rcu(&uid_entry->hash, &temp->hash);
+			kfree_rcu(uid_entry, rcu);
+		}
+		return temp;
+	}
+
+	uid_entry = kzalloc(alloc_size, GFP_ATOMIC);
+	if (!uid_entry)
+		return NULL;
+	times = kzalloc(sizeof(*times), GFP_ATOMIC);
+	if (!times) {
+		kfree(uid_entry);
+		return NULL;
+	}
+
+	uid_entry->uid = uid;
+	uid_entry->max_state = max_state;
+	uid_entry->concurrent_times = times;
+
+	hash_add_rcu(uid_hash_table, &uid_entry->hash, uid);
+
+	return uid_entry;
+}
+
+static int single_uid_time_in_state_show(struct seq_file *m, void *ptr)
+{
+	struct uid_entry *uid_entry;
+	unsigned int i;
+	uid_t uid = from_kuid_munged(current_user_ns(), *(kuid_t *)m->private);
+
+	if (uid == overflowuid)
+		return -EINVAL;
+
+	rcu_read_lock();
+
+	uid_entry = find_uid_entry_rcu(uid);
+	if (!uid_entry) {
+		rcu_read_unlock();
+		return 0;
+	}
+
+	for (i = 0; i < uid_entry->max_state; ++i) {
+		u64 time = nsec_to_clock_t(uid_entry->time_in_state[i]);
+		seq_write(m, &time, sizeof(time));
+	}
+
+	rcu_read_unlock();
+
+	return 0;
+}
+
+static void *uid_seq_start(struct seq_file *seq, loff_t *pos)
+{
+	if (*pos >= HASH_SIZE(uid_hash_table))
+		return NULL;
+
+	return &uid_hash_table[*pos];
+}
+
+static void *uid_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+	do {
+		(*pos)++;
+
+		if (*pos >= HASH_SIZE(uid_hash_table))
+			return NULL;
+	} while (hlist_empty(&uid_hash_table[*pos]));
+
+	return &uid_hash_table[*pos];
+}
+
+static void uid_seq_stop(struct seq_file *seq, void *v) { }
+
+static int uid_time_in_state_seq_show(struct seq_file *m, void *v)
+{
+	struct uid_entry *uid_entry;
+	struct cpu_freqs *freqs, *last_freqs = NULL;
+	int i, cpu;
+
+	if (v == uid_hash_table) {
+		seq_puts(m, "uid:");
+		for_each_possible_cpu(cpu) {
+			freqs = all_freqs[cpu];
+			if (!freqs || freqs == last_freqs)
+				continue;
+			last_freqs = freqs;
+			for (i = 0; i < freqs->max_state; i++) {
+				seq_put_decimal_ull(m, " ",
+						    freqs->freq_table[i]);
+			}
+		}
+		seq_putc(m, '\n');
+	}
+
+	rcu_read_lock();
+
+	hlist_for_each_entry_rcu(uid_entry, (struct hlist_head *)v, hash) {
+		if (uid_entry->max_state) {
+			seq_put_decimal_ull(m, "", uid_entry->uid);
+			seq_putc(m, ':');
+		}
+		for (i = 0; i < uid_entry->max_state; ++i) {
+			u64 time = nsec_to_clock_t(uid_entry->time_in_state[i]);
+			seq_put_decimal_ull(m, " ", time);
+		}
+		if (uid_entry->max_state)
+			seq_putc(m, '\n');
+	}
+
+	rcu_read_unlock();
+	return 0;
+}
+
+static int concurrent_time_seq_show(struct seq_file *m, void *v,
+	atomic64_t *(*get_times)(struct concurrent_times *))
+{
+	struct uid_entry *uid_entry;
+	int i, num_possible_cpus = num_possible_cpus();
+
+	rcu_read_lock();
+
+	hlist_for_each_entry_rcu(uid_entry, (struct hlist_head *)v, hash) {
+		atomic64_t *times = get_times(uid_entry->concurrent_times);
+
+		seq_put_decimal_ull(m, "", (u64)uid_entry->uid);
+		seq_putc(m, ':');
+
+		for (i = 0; i < num_possible_cpus; ++i) {
+			u64 time = nsec_to_clock_t(atomic64_read(&times[i]));
+
+			seq_put_decimal_ull(m, " ", time);
+		}
+		seq_putc(m, '\n');
+	}
+
+	rcu_read_unlock();
+
+	return 0;
+}
+
+static inline atomic64_t *get_active_times(struct concurrent_times *times)
+{
+	return times->active;
+}
+
+static int concurrent_active_time_seq_show(struct seq_file *m, void *v)
+{
+	if (v == uid_hash_table) {
+		seq_put_decimal_ull(m, "cpus: ", num_possible_cpus());
+		seq_putc(m, '\n');
+	}
+
+	return concurrent_time_seq_show(m, v, get_active_times);
+}
+
+static inline atomic64_t *get_policy_times(struct concurrent_times *times)
+{
+	return times->policy;
+}
+
+static int concurrent_policy_time_seq_show(struct seq_file *m, void *v)
+{
+	int i;
+	struct cpu_freqs *freqs, *last_freqs = NULL;
+
+	if (v == uid_hash_table) {
+		int cnt = 0;
+
+		for_each_possible_cpu(i) {
+			freqs = all_freqs[i];
+			if (!freqs)
+				continue;
+			if (freqs != last_freqs) {
+				if (last_freqs) {
+					seq_put_decimal_ull(m, ": ", cnt);
+					seq_putc(m, ' ');
+					cnt = 0;
+				}
+				seq_put_decimal_ull(m, "policy", i);
+
+				last_freqs = freqs;
+			}
+			cnt++;
+		}
+		if (last_freqs) {
+			seq_put_decimal_ull(m, ": ", cnt);
+			seq_putc(m, '\n');
+		}
+	}
+
+	return concurrent_time_seq_show(m, v, get_policy_times);
+}
+
+void cpufreq_task_times_init(struct task_struct *p)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&task_time_in_state_lock, flags);
+	p->time_in_state = NULL;
+	spin_unlock_irqrestore(&task_time_in_state_lock, flags);
+	p->max_state = 0;
+}
+
+void cpufreq_task_times_alloc(struct task_struct *p)
+{
+	void *temp;
+	unsigned long flags;
+	unsigned int max_state = READ_ONCE(next_offset);
+
+	/* We use one array to avoid multiple allocs per task */
+	temp = kcalloc(max_state, sizeof(p->time_in_state[0]), GFP_ATOMIC);
+	if (!temp)
+		return;
+
+	spin_lock_irqsave(&task_time_in_state_lock, flags);
+	p->time_in_state = temp;
+	spin_unlock_irqrestore(&task_time_in_state_lock, flags);
+	p->max_state = max_state;
+}
+
+/* Caller must hold task_time_in_state_lock */
+static int cpufreq_task_times_realloc_locked(struct task_struct *p)
+{
+	void *temp;
+	unsigned int max_state = READ_ONCE(next_offset);
+
+	temp = krealloc(p->time_in_state, max_state * sizeof(u64), GFP_ATOMIC);
+	if (!temp)
+		return -ENOMEM;
+	p->time_in_state = temp;
+	memset(p->time_in_state + p->max_state, 0,
+	       (max_state - p->max_state) * sizeof(u64));
+	p->max_state = max_state;
+	return 0;
+}
+
+void cpufreq_task_times_exit(struct task_struct *p)
+{
+	unsigned long flags;
+	void *temp;
+
+	if (!p->time_in_state)
+		return;
+
+	spin_lock_irqsave(&task_time_in_state_lock, flags);
+	temp = p->time_in_state;
+	p->time_in_state = NULL;
+	spin_unlock_irqrestore(&task_time_in_state_lock, flags);
+	kfree(temp);
+}
+
+int proc_time_in_state_show(struct seq_file *m, struct pid_namespace *ns,
+	struct pid *pid, struct task_struct *p)
+{
+	unsigned int cpu, i;
+	u64 cputime;
+	unsigned long flags;
+	struct cpu_freqs *freqs;
+	struct cpu_freqs *last_freqs = NULL;
+
+	spin_lock_irqsave(&task_time_in_state_lock, flags);
+	for_each_possible_cpu(cpu) {
+		freqs = all_freqs[cpu];
+		if (!freqs || freqs == last_freqs)
+			continue;
+		last_freqs = freqs;
+
+		seq_printf(m, "cpu%u\n", cpu);
+		for (i = 0; i < freqs->max_state; i++) {
+			cputime = 0;
+			if (freqs->offset + i < p->max_state &&
+			    p->time_in_state)
+				cputime = p->time_in_state[freqs->offset + i];
+			seq_printf(m, "%u %lu\n", freqs->freq_table[i],
+				   (unsigned long)nsec_to_clock_t(cputime));
+		}
+	}
+	spin_unlock_irqrestore(&task_time_in_state_lock, flags);
+	return 0;
+}
+
+void cpufreq_acct_update_power(struct task_struct *p, u64 cputime)
+{
+	unsigned long flags;
+	unsigned int state;
+	unsigned int active_cpu_cnt = 0;
+	unsigned int policy_cpu_cnt = 0;
+	unsigned int policy_first_cpu;
+	struct uid_entry *uid_entry;
+	struct cpu_freqs *freqs = all_freqs[task_cpu(p)];
+	struct cpufreq_policy *policy;
+	uid_t uid = from_kuid_munged(current_user_ns(), task_uid(p));
+	int cpu = 0;
+
+	if (!freqs || is_idle_task(p) || p->flags & PF_EXITING)
+		return;
+
+	state = freqs->offset + READ_ONCE(freqs->last_index);
+
+	spin_lock_irqsave(&task_time_in_state_lock, flags);
+	if ((state < p->max_state || !cpufreq_task_times_realloc_locked(p)) &&
+	    p->time_in_state)
+		p->time_in_state[state] += cputime;
+	spin_unlock_irqrestore(&task_time_in_state_lock, flags);
+
+	spin_lock_irqsave(&uid_lock, flags);
+	uid_entry = find_or_register_uid_locked(uid);
+	if (uid_entry && state < uid_entry->max_state)
+		uid_entry->time_in_state[state] += cputime;
+	spin_unlock_irqrestore(&uid_lock, flags);
+
+	rcu_read_lock();
+	uid_entry = find_uid_entry_rcu(uid);
+	if (!uid_entry) {
+		rcu_read_unlock();
+		return;
+	}
+
+	for_each_possible_cpu(cpu)
+		if (!idle_cpu(cpu))
+			++active_cpu_cnt;
+
+	atomic64_add(cputime,
+		     &uid_entry->concurrent_times->active[active_cpu_cnt - 1]);
+
+	policy = cpufreq_cpu_get(task_cpu(p));
+	if (!policy) {
+		/*
+		 * This CPU may have just come up and not have a cpufreq policy
+		 * yet.
+		 */
+		rcu_read_unlock();
+		return;
+	}
+
+	for_each_cpu(cpu, policy->related_cpus)
+		if (!idle_cpu(cpu))
+			++policy_cpu_cnt;
+
+	policy_first_cpu = cpumask_first(policy->related_cpus);
+	cpufreq_cpu_put(policy);
+
+	atomic64_add(cputime,
+		     &uid_entry->concurrent_times->policy[policy_first_cpu +
+							  policy_cpu_cnt - 1]);
+	rcu_read_unlock();
+}
+
+static int cpufreq_times_get_index(struct cpu_freqs *freqs, unsigned int freq)
+{
+	int index;
+        for (index = 0; index < freqs->max_state; ++index) {
+		if (freqs->freq_table[index] == freq)
+			return index;
+        }
+	return -1;
+}
+
+void cpufreq_times_create_policy(struct cpufreq_policy *policy)
+{
+	int cpu, index = 0;
+	unsigned int count = 0;
+	struct cpufreq_frequency_table *pos, *table;
+	struct cpu_freqs *freqs;
+	void *tmp;
+
+	if (all_freqs[policy->cpu])
+		return;
+
+	table = policy->freq_table;
+	if (!table)
+		return;
+
+	cpufreq_for_each_valid_entry(pos, table)
+		count++;
+
+	tmp =  kzalloc(sizeof(*freqs) + sizeof(freqs->freq_table[0]) * count,
+		       GFP_KERNEL);
+	if (!tmp)
+		return;
+
+	freqs = tmp;
+	freqs->max_state = count;
+
+	cpufreq_for_each_valid_entry(pos, table)
+		freqs->freq_table[index++] = pos->frequency;
+
+	index = cpufreq_times_get_index(freqs, policy->cur);
+	if (index >= 0)
+		WRITE_ONCE(freqs->last_index, index);
+
+	freqs->offset = next_offset;
+	WRITE_ONCE(next_offset, freqs->offset + count);
+	for_each_cpu(cpu, policy->related_cpus)
+		all_freqs[cpu] = freqs;
+}
+
+static void uid_entry_reclaim(struct rcu_head *rcu)
+{
+	struct uid_entry *uid_entry = container_of(rcu, struct uid_entry, rcu);
+
+	kfree(uid_entry->concurrent_times);
+	kfree(uid_entry);
+}
+
+void cpufreq_task_times_remove_uids(uid_t uid_start, uid_t uid_end)
+{
+	struct uid_entry *uid_entry;
+	struct hlist_node *tmp;
+	unsigned long flags;
+	u64 uid;
+
+	spin_lock_irqsave(&uid_lock, flags);
+
+	for (uid = uid_start; uid <= uid_end; uid++) {
+		hash_for_each_possible_safe(uid_hash_table, uid_entry, tmp,
+			hash, uid) {
+			if (uid == uid_entry->uid) {
+				hash_del_rcu(&uid_entry->hash);
+				call_rcu(&uid_entry->rcu, uid_entry_reclaim);
+			}
+		}
+	}
+
+	spin_unlock_irqrestore(&uid_lock, flags);
+}
+
+void cpufreq_times_record_transition(struct cpufreq_policy *policy,
+	unsigned int new_freq)
+{
+	int index;
+	struct cpu_freqs *freqs = all_freqs[policy->cpu];
+	if (!freqs)
+		return;
+
+	index = cpufreq_times_get_index(freqs, new_freq);
+	if (index >= 0)
+		WRITE_ONCE(freqs->last_index, index);
+}
+
+static const struct seq_operations uid_time_in_state_seq_ops = {
+	.start = uid_seq_start,
+	.next = uid_seq_next,
+	.stop = uid_seq_stop,
+	.show = uid_time_in_state_seq_show,
+};
+
+static int uid_time_in_state_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &uid_time_in_state_seq_ops);
+}
+
+int single_uid_time_in_state_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, single_uid_time_in_state_show,
+			&(inode->i_uid));
+}
+
+static const struct file_operations uid_time_in_state_fops = {
+	.open		= uid_time_in_state_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= seq_release,
+};
+
+static const struct seq_operations concurrent_active_time_seq_ops = {
+	.start = uid_seq_start,
+	.next = uid_seq_next,
+	.stop = uid_seq_stop,
+	.show = concurrent_active_time_seq_show,
+};
+
+static int concurrent_active_time_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &concurrent_active_time_seq_ops);
+}
+
+static const struct file_operations concurrent_active_time_fops = {
+	.open		= concurrent_active_time_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= seq_release,
+};
+
+static const struct seq_operations concurrent_policy_time_seq_ops = {
+	.start = uid_seq_start,
+	.next = uid_seq_next,
+	.stop = uid_seq_stop,
+	.show = concurrent_policy_time_seq_show,
+};
+
+static int concurrent_policy_time_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &concurrent_policy_time_seq_ops);
+}
+
+static const struct file_operations concurrent_policy_time_fops = {
+	.open		= concurrent_policy_time_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= seq_release,
+};
+
+static int __init cpufreq_times_init(void)
+{
+	proc_create_data("uid_time_in_state", 0444, NULL,
+			 &uid_time_in_state_fops, NULL);
+
+	proc_create_data("uid_concurrent_active_time", 0444, NULL,
+			 &concurrent_active_time_fops, NULL);
+
+	proc_create_data("uid_concurrent_policy_time", 0444, NULL,
+			 &concurrent_policy_time_fops, NULL);
+
+	return 0;
+}
+
+early_initcall(cpufreq_times_init);
diff --git a/drivers/cpufreq/dummy-cpufreq.c b/drivers/cpufreq/dummy-cpufreq.c
new file mode 100644
index 0000000..ea40d5c
--- /dev/null
+++ b/drivers/cpufreq/dummy-cpufreq.c
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Google, Inc.
+ */
+#include <linux/cpufreq.h>
+#include <linux/module.h>
+
+static struct cpufreq_frequency_table freq_table[] = {
+	{ .frequency = 1 },
+	{ .frequency = 2 },
+	{ .frequency = CPUFREQ_TABLE_END },
+};
+
+static int dummy_cpufreq_target_index(struct cpufreq_policy *policy,
+				   unsigned int index)
+{
+	return 0;
+}
+
+static int dummy_cpufreq_driver_init(struct cpufreq_policy *policy)
+{
+	policy->freq_table = freq_table;
+	return 0;
+}
+
+static unsigned int dummy_cpufreq_get(unsigned int cpu)
+{
+	return 1;
+}
+
+static int dummy_cpufreq_verify(struct cpufreq_policy *policy)
+{
+	return 0;
+}
+
+static struct cpufreq_driver dummy_cpufreq_driver = {
+	.name = "dummy",
+	.target_index = dummy_cpufreq_target_index,
+	.init = dummy_cpufreq_driver_init,
+	.get = dummy_cpufreq_get,
+	.verify = dummy_cpufreq_verify,
+	.attr = cpufreq_generic_attr,
+};
+
+static int __init dummy_cpufreq_init(void)
+{
+	return cpufreq_register_driver(&dummy_cpufreq_driver);
+}
+
+static void __exit dummy_cpufreq_exit(void)
+{
+	cpufreq_unregister_driver(&dummy_cpufreq_driver);
+}
+
+module_init(dummy_cpufreq_init);
+module_exit(dummy_cpufreq_exit);
+
+MODULE_AUTHOR("Connor O'Brien <connoro@google.com>");
+MODULE_DESCRIPTION("dummy cpufreq driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c
index 3f06934..80001120 100644
--- a/drivers/cpufreq/scmi-cpufreq.c
+++ b/drivers/cpufreq/scmi-cpufreq.c
@@ -12,6 +12,7 @@
 #include <linux/cpufreq.h>
 #include <linux/cpumask.h>
 #include <linux/cpu_cooling.h>
+#include <linux/energy_model.h>
 #include <linux/export.h>
 #include <linux/module.h>
 #include <linux/pm_opp.h>
@@ -103,13 +104,42 @@
 	return 0;
 }
 
+static int __maybe_unused
+scmi_get_cpu_power(unsigned long *power, unsigned long *KHz, int cpu)
+{
+	struct device *cpu_dev = get_cpu_device(cpu);
+	unsigned long Hz;
+	int ret, domain;
+
+	if (!cpu_dev) {
+		pr_err("failed to get cpu%d device\n", cpu);
+		return -ENODEV;
+	}
+
+	domain = handle->perf_ops->device_domain_id(cpu_dev);
+	if (domain < 0)
+		return domain;
+
+	/* Get the power cost of the performance domain. */
+	Hz = *KHz * 1000;
+	ret = handle->perf_ops->est_power_get(handle, domain, &Hz, power);
+	if (ret)
+		return ret;
+
+	/* The EM framework specifies the frequency in KHz. */
+	*KHz = Hz / 1000;
+
+	return 0;
+}
+
 static int scmi_cpufreq_init(struct cpufreq_policy *policy)
 {
-	int ret;
+	int ret, nr_opp;
 	unsigned int latency;
 	struct device *cpu_dev;
 	struct scmi_data *priv;
 	struct cpufreq_frequency_table *freq_table;
+	struct em_data_callback em_cb = EM_DATA_CB(scmi_get_cpu_power);
 
 	cpu_dev = get_cpu_device(policy->cpu);
 	if (!cpu_dev) {
@@ -142,6 +172,7 @@
 		ret = -EPROBE_DEFER;
 		goto out_free_opp;
 	}
+	nr_opp = ret;
 
 	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
 	if (!priv) {
@@ -171,6 +202,9 @@
 	policy->cpuinfo.transition_latency = latency;
 
 	policy->fast_switch_possible = true;
+
+	em_register_perf_domain(policy->cpus, nr_opp, &em_cb);
+
 	return 0;
 
 out_free_priv:
diff --git a/drivers/cpufreq/scpi-cpufreq.c b/drivers/cpufreq/scpi-cpufreq.c
index 87a98ec..05fc744 100644
--- a/drivers/cpufreq/scpi-cpufreq.c
+++ b/drivers/cpufreq/scpi-cpufreq.c
@@ -23,6 +23,7 @@
 #include <linux/cpufreq.h>
 #include <linux/cpumask.h>
 #include <linux/cpu_cooling.h>
+#include <linux/energy_model.h>
 #include <linux/export.h>
 #include <linux/module.h>
 #include <linux/of_platform.h>
@@ -98,11 +99,12 @@
 
 static int scpi_cpufreq_init(struct cpufreq_policy *policy)
 {
-	int ret;
+	int ret, nr_opp;
 	unsigned int latency;
 	struct device *cpu_dev;
 	struct scpi_data *priv;
 	struct cpufreq_frequency_table *freq_table;
+	struct em_data_callback em_cb = EM_DATA_CB(of_dev_pm_opp_get_cpu_power);
 
 	cpu_dev = get_cpu_device(policy->cpu);
 	if (!cpu_dev) {
@@ -135,6 +137,7 @@
 		ret = -EPROBE_DEFER;
 		goto out_free_opp;
 	}
+	nr_opp = ret;
 
 	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
 	if (!priv) {
@@ -170,6 +173,9 @@
 	policy->cpuinfo.transition_latency = latency;
 
 	policy->fast_switch_possible = false;
+
+	em_register_perf_domain(policy->cpus, nr_opp, &em_cb);
+
 	return 0;
 
 out_free_cpufreq_table:
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index 6df894d..96a3a9b 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -221,7 +221,7 @@
 	}
 
 	/* Take note of the planned idle state. */
-	sched_idle_set_state(target_state);
+	sched_idle_set_state(target_state, index);
 
 	trace_cpu_idle_rcuidle(index, dev->cpu);
 	time_start = ns_to_ktime(local_clock());
@@ -235,7 +235,7 @@
 	trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu);
 
 	/* The cpu is no longer idle or about to enter idle. */
-	sched_idle_set_state(NULL);
+	sched_idle_set_state(NULL, -1);
 
 	if (broadcast) {
 		if (WARN_ON_ONCE(!irqs_disabled()))
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c
index 6d7f6b9..2ee86c9 100644
--- a/drivers/cpuidle/governors/menu.c
+++ b/drivers/cpuidle/governors/menu.c
@@ -131,10 +131,6 @@
 	int		interval_ptr;
 };
 
-
-#define LOAD_INT(x) ((x) >> FSHIFT)
-#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
-
 static inline int get_loadavg(unsigned long load)
 {
 	return LOAD_INT(load) * 10 + LOAD_FRAC(load) / 10;
diff --git a/drivers/dma-buf/Kconfig b/drivers/dma-buf/Kconfig
index ed3b785..b0194c8 100644
--- a/drivers/dma-buf/Kconfig
+++ b/drivers/dma-buf/Kconfig
@@ -3,7 +3,6 @@
 config SYNC_FILE
 	bool "Explicit Synchronization Framework"
 	default n
-	select ANON_INODES
 	select DMA_SHARED_BUFFER
 	---help---
 	  The Sync File Framework adds explicit syncronization via
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index 6984214..f83bd52 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -34,8 +34,10 @@
 #include <linux/poll.h>
 #include <linux/reservation.h>
 #include <linux/mm.h>
+#include <linux/mount.h>
 
 #include <uapi/linux/dma-buf.h>
+#include <uapi/linux/magic.h>
 
 static inline int is_dma_buf_file(struct file *);
 
@@ -46,6 +48,41 @@
 
 static struct dma_buf_list db_list;
 
+static char *dmabuffs_dname(struct dentry *dentry, char *buffer, int buflen)
+{
+	struct dma_buf *dmabuf;
+	char name[DMA_BUF_NAME_LEN];
+	size_t ret = 0;
+
+	dmabuf = dentry->d_fsdata;
+	mutex_lock(&dmabuf->lock);
+	if (dmabuf->name)
+		ret = strlcpy(name, dmabuf->name, DMA_BUF_NAME_LEN);
+	mutex_unlock(&dmabuf->lock);
+
+	return dynamic_dname(dentry, buffer, buflen, "/%s:%s",
+			     dentry->d_name.name, ret > 0 ? name : "");
+}
+
+static const struct dentry_operations dma_buf_dentry_ops = {
+	.d_dname = dmabuffs_dname,
+};
+
+static struct vfsmount *dma_buf_mnt;
+
+static struct dentry *dma_buf_fs_mount(struct file_system_type *fs_type,
+		int flags, const char *name, void *data)
+{
+	return mount_pseudo(fs_type, "dmabuf:", NULL, &dma_buf_dentry_ops,
+			DMA_BUF_MAGIC);
+}
+
+static struct file_system_type dma_buf_fs_type = {
+	.name = "dmabuf",
+	.mount = dma_buf_fs_mount,
+	.kill_sb = kill_anon_super,
+};
+
 static int dma_buf_release(struct inode *inode, struct file *file)
 {
 	struct dma_buf *dmabuf;
@@ -276,6 +313,43 @@
 	return events;
 }
 
+/**
+ * dma_buf_set_name - Set a name to a specific dma_buf to track the usage.
+ * The name of the dma-buf buffer can only be set when the dma-buf is not
+ * attached to any devices. It could theoritically support changing the
+ * name of the dma-buf if the same piece of memory is used for multiple
+ * purpose between different devices.
+ *
+ * @dmabuf [in]     dmabuf buffer that will be renamed.
+ * @buf:   [in]     A piece of userspace memory that contains the name of
+ *                  the dma-buf.
+ *
+ * Returns 0 on success. If the dma-buf buffer is already attached to
+ * devices, return -EBUSY.
+ *
+ */
+static long dma_buf_set_name(struct dma_buf *dmabuf, const char __user *buf)
+{
+	char *name = strndup_user(buf, DMA_BUF_NAME_LEN);
+	long ret = 0;
+
+	if (IS_ERR(name))
+		return PTR_ERR(name);
+
+	mutex_lock(&dmabuf->lock);
+	if (!list_empty(&dmabuf->attachments)) {
+		ret = -EBUSY;
+		kfree(name);
+		goto out_unlock;
+	}
+	kfree(dmabuf->name);
+	dmabuf->name = name;
+
+out_unlock:
+	mutex_unlock(&dmabuf->lock);
+	return ret;
+}
+
 static long dma_buf_ioctl(struct file *file,
 			  unsigned int cmd, unsigned long arg)
 {
@@ -314,11 +388,29 @@
 			ret = dma_buf_begin_cpu_access(dmabuf, direction);
 
 		return ret;
+
+	case DMA_BUF_SET_NAME:
+		return dma_buf_set_name(dmabuf, (const char __user *)arg);
+
 	default:
 		return -ENOTTY;
 	}
 }
 
+static void dma_buf_show_fdinfo(struct seq_file *m, struct file *file)
+{
+	struct dma_buf *dmabuf = file->private_data;
+
+	seq_printf(m, "size:\t%zu\n", dmabuf->size);
+	/* Don't count the temporary reference taken inside procfs seq_show */
+	seq_printf(m, "count:\t%ld\n", file_count(dmabuf->file) - 1);
+	seq_printf(m, "exp_name:\t%s\n", dmabuf->exp_name);
+	mutex_lock(&dmabuf->lock);
+	if (dmabuf->name)
+		seq_printf(m, "name:\t%s\n", dmabuf->name);
+	mutex_unlock(&dmabuf->lock);
+}
+
 static const struct file_operations dma_buf_fops = {
 	.release	= dma_buf_release,
 	.mmap		= dma_buf_mmap_internal,
@@ -328,6 +420,7 @@
 #ifdef CONFIG_COMPAT
 	.compat_ioctl	= dma_buf_ioctl,
 #endif
+	.show_fdinfo	= dma_buf_show_fdinfo,
 };
 
 /*
@@ -338,6 +431,32 @@
 	return file->f_op == &dma_buf_fops;
 }
 
+static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags)
+{
+	struct file *file;
+	struct inode *inode = alloc_anon_inode(dma_buf_mnt->mnt_sb);
+
+	if (IS_ERR(inode))
+		return ERR_CAST(inode);
+
+	inode->i_size = dmabuf->size;
+	inode_set_bytes(inode, dmabuf->size);
+
+	file = alloc_file_pseudo(inode, dma_buf_mnt, "dmabuf",
+				 flags, &dma_buf_fops);
+	if (IS_ERR(file))
+		goto err_alloc_file;
+	file->f_flags = flags & (O_ACCMODE | O_NONBLOCK);
+	file->private_data = dmabuf;
+	file->f_path.dentry->d_fsdata = dmabuf;
+
+	return file;
+
+err_alloc_file:
+	iput(inode);
+	return file;
+}
+
 /**
  * DOC: dma buf device access
  *
@@ -434,8 +553,7 @@
 	}
 	dmabuf->resv = resv;
 
-	file = anon_inode_getfile("dmabuf", &dma_buf_fops, dmabuf,
-					exp_info->flags);
+	file = dma_buf_getfile(dmabuf, exp_info->flags);
 	if (IS_ERR(file)) {
 		ret = PTR_ERR(file);
 		goto err_dmabuf;
@@ -1026,8 +1144,8 @@
 		return ret;
 
 	seq_puts(s, "\nDma-buf Objects:\n");
-	seq_printf(s, "%-8s\t%-8s\t%-8s\t%-8s\texp_name\n",
-		   "size", "flags", "mode", "count");
+	seq_printf(s, "%-8s\t%-8s\t%-8s\t%-8s\texp_name\t%-8s\n",
+		   "size", "flags", "mode", "count", "ino");
 
 	list_for_each_entry(buf_obj, &db_list.head, list_node) {
 		ret = mutex_lock_interruptible(&buf_obj->lock);
@@ -1038,11 +1156,13 @@
 			continue;
 		}
 
-		seq_printf(s, "%08zu\t%08x\t%08x\t%08ld\t%s\n",
+		seq_printf(s, "%08zu\t%08x\t%08x\t%08ld\t%s\t%08lu\t%s\n",
 				buf_obj->size,
 				buf_obj->file->f_flags, buf_obj->file->f_mode,
 				file_count(buf_obj->file),
-				buf_obj->exp_name);
+				buf_obj->exp_name,
+				file_inode(buf_obj->file)->i_ino,
+				buf_obj->name ?: "");
 
 		robj = buf_obj->resv;
 		while (true) {
@@ -1148,6 +1268,10 @@
 
 static int __init dma_buf_init(void)
 {
+	dma_buf_mnt = kern_mount(&dma_buf_fs_type);
+	if (IS_ERR(dma_buf_mnt))
+		return PTR_ERR(dma_buf_mnt);
+
 	mutex_init(&db_list.lock);
 	INIT_LIST_HEAD(&db_list.head);
 	dma_buf_init_debugfs();
@@ -1158,5 +1282,6 @@
 static void __exit dma_buf_deinit(void)
 {
 	dma_buf_uninit_debugfs();
+	kern_unmount(dma_buf_mnt);
 }
 __exitcall(dma_buf_deinit);
diff --git a/drivers/energy_model/Kconfig b/drivers/energy_model/Kconfig
new file mode 100644
index 0000000..3fbf968
--- /dev/null
+++ b/drivers/energy_model/Kconfig
@@ -0,0 +1,16 @@
+config LEGACY_ENERGY_MODEL_DT
+	bool "Legacy DT-based Energy Model of CPUs"
+	default n
+	help
+	  The Energy Aware Scheduler (EAS) used to rely on Energy Models
+	  (EMs) statically defined in the Device Tree. More recent
+	  versions of EAS now rely on the EM framework to get the power
+	  costs of CPUs.
+
+	  This driver reads old-style static EMs in DT and feeds them in
+	  the EM framework, hence enabling to use EAS on platforms with
+	  old DT files. Since EAS now uses only the active costs of CPUs,
+	  the cluster-related costs and idle-costs of the old EM are
+	  ignored.
+
+	  If in doubt, say N.
diff --git a/drivers/energy_model/Makefile b/drivers/energy_model/Makefile
new file mode 100644
index 0000000..7bc0a7e
--- /dev/null
+++ b/drivers/energy_model/Makefile
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0
+
+obj-$(CONFIG_LEGACY_ENERGY_MODEL_DT)	+= legacy_em_dt.o
diff --git a/drivers/energy_model/legacy_em_dt.c b/drivers/energy_model/legacy_em_dt.c
new file mode 100644
index 0000000..b608790
--- /dev/null
+++ b/drivers/energy_model/legacy_em_dt.c
@@ -0,0 +1,193 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Legacy Energy Model loading driver
+ *
+ * Copyright (C) 2018, ARM Ltd.
+ * Written by: Quentin Perret, ARM Ltd.
+ */
+
+#define pr_fmt(fmt) "legacy-dt-em: " fmt
+
+#include <linux/cpufreq.h>
+#include <linux/cpumask.h>
+#include <linux/cpuset.h>
+#include <linux/energy_model.h>
+#include <linux/gfp.h>
+#include <linux/init.h>
+#include <linux/of.h>
+#include <linux/printk.h>
+#include <linux/slab.h>
+
+static cpumask_var_t cpus_to_visit;
+
+static DEFINE_PER_CPU(unsigned long, nr_states) = 0;
+
+struct em_state {
+	unsigned long frequency;
+	unsigned long power;
+	unsigned long capacity;
+};
+static DEFINE_PER_CPU(struct em_state*, cpu_em) = NULL;
+
+static void finish_em_loading_workfn(struct work_struct *work);
+static DECLARE_WORK(finish_em_loading_work, finish_em_loading_workfn);
+
+static DEFINE_MUTEX(em_loading_mutex);
+
+/*
+ * Callback given to the EM framework. All this does is browse the table
+ * created by legacy_em_dt().
+ */
+static int get_power(unsigned long *mW, unsigned long *KHz, int cpu)
+{
+	unsigned long nstates = per_cpu(nr_states, cpu);
+	struct em_state *em = per_cpu(cpu_em, cpu);
+	int i;
+
+	if (!nstates || !em)
+		return -ENODEV;
+
+	for (i = 0; i < nstates - 1; i++) {
+		if (em[i].frequency > *KHz)
+			break;
+	}
+
+	*KHz = em[i].frequency;
+	*mW = em[i].power;
+
+	return 0;
+}
+
+static int init_em_dt_callback(struct notifier_block *nb, unsigned long val,
+			       void *data)
+{
+	struct em_data_callback em_cb = EM_DATA_CB(get_power);
+	unsigned long nstates, scale_cpu, max_freq;
+	struct cpufreq_policy *policy = data;
+	const struct property *prop;
+	struct device_node *cn, *cp;
+	struct em_state *em;
+	int cpu, i, ret = 0;
+	const __be32 *tmp;
+
+	if (val != CPUFREQ_NOTIFY)
+		return 0;
+
+	mutex_lock(&em_loading_mutex);
+
+	/* Do not register twice an energy model */
+	for_each_cpu(cpu, policy->cpus) {
+		if (per_cpu(nr_states, cpu) || per_cpu(cpu_em, cpu)) {
+			pr_err("EM of CPU%d already loaded\n", cpu);
+			ret = -EEXIST;
+			goto unlock;
+		}
+	}
+
+	max_freq = policy->cpuinfo.max_freq;
+	if (!max_freq) {
+		pr_err("No policy->max for CPU%d\n", cpu);
+		ret = -EINVAL;
+		goto unlock;
+	}
+
+	cpu = cpumask_first(policy->cpus);
+	cn = of_get_cpu_node(cpu, NULL);
+	if (!cn) {
+		pr_err("No device_node for CPU%d\n", cpu);
+		ret = -ENODEV;
+		goto unlock;
+	}
+
+	cp = of_parse_phandle(cn, "sched-energy-costs", 0);
+	if (!cp) {
+		pr_err("CPU%d node has no sched-energy-costs\n", cpu);
+		ret = -ENODEV;
+		goto unlock;
+	}
+
+	prop = of_find_property(cp, "busy-cost-data", NULL);
+	if (!prop || !prop->value) {
+		pr_err("No busy-cost-data for CPU%d\n", cpu);
+		ret = -ENODEV;
+		goto unlock;
+	}
+
+	nstates = (prop->length / sizeof(u32)) / 2;
+	em = kcalloc(nstates, sizeof(struct em_cap_state), GFP_KERNEL);
+	if (!em) {
+		ret = -ENOMEM;
+		goto unlock;
+	}
+
+	/* Copy the capacity and power cost to the table. */
+	for (i = 0, tmp = prop->value; i < nstates; i++) {
+		em[i].capacity = be32_to_cpup(tmp++);
+		em[i].power = be32_to_cpup(tmp++);
+	}
+
+	/* Get the CPU capacity (according to the EM) */
+	scale_cpu = em[nstates - 1].capacity;
+	if (!scale_cpu) {
+		pr_err("CPU%d: capacity cannot be 0\n", cpu);
+		kfree(em);
+		ret = -EINVAL;
+		goto unlock;
+	}
+
+	/* Re-compute the intermediate frequencies based on the EM. */
+	for (i = 0; i < nstates; i++)
+		em[i].frequency = em[i].capacity * max_freq / scale_cpu;
+
+	/* Assign the table to all CPUs of this policy. */
+	for_each_cpu(i, policy->cpus) {
+		per_cpu(nr_states, i) = nstates;
+		per_cpu(cpu_em, i) = em;
+	}
+
+	pr_info("Registering EM of %*pbl\n", cpumask_pr_args(policy->cpus));
+	em_register_perf_domain(policy->cpus, nstates, &em_cb);
+
+	/* Finish the work when all possible CPUs have been registered. */
+	cpumask_andnot(cpus_to_visit, cpus_to_visit, policy->cpus);
+	if (cpumask_empty(cpus_to_visit))
+		schedule_work(&finish_em_loading_work);
+
+unlock:
+	mutex_unlock(&em_loading_mutex);
+
+	return ret;
+}
+
+static struct notifier_block init_em_dt_notifier = {
+	.notifier_call = init_em_dt_callback,
+};
+
+static void finish_em_loading_workfn(struct work_struct *work)
+{
+	cpufreq_unregister_notifier(&init_em_dt_notifier,
+				    CPUFREQ_POLICY_NOTIFIER);
+	free_cpumask_var(cpus_to_visit);
+
+	/* Let the scheduler know the Energy Model is ready. */
+	rebuild_sched_domains();
+}
+
+static int __init register_cpufreq_notifier(void)
+{
+	int ret;
+
+	if (!alloc_cpumask_var(&cpus_to_visit, GFP_KERNEL))
+		return -ENOMEM;
+
+	cpumask_copy(cpus_to_visit, cpu_possible_mask);
+
+	ret = cpufreq_register_notifier(&init_em_dt_notifier,
+					CPUFREQ_POLICY_NOTIFIER);
+
+	if (ret)
+		free_cpumask_var(cpus_to_visit);
+
+	return ret;
+}
+core_initcall(register_cpufreq_notifier);
diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c
index 87c99d2..3c8ae7c 100644
--- a/drivers/firmware/arm_scmi/perf.c
+++ b/drivers/firmware/arm_scmi/perf.c
@@ -427,6 +427,33 @@
 	return ret;
 }
 
+static int scmi_dvfs_est_power_get(const struct scmi_handle *handle, u32 domain,
+				   unsigned long *freq, unsigned long *power)
+{
+	struct scmi_perf_info *pi = handle->perf_priv;
+	struct perf_dom_info *dom;
+	unsigned long opp_freq;
+	int idx, ret = -EINVAL;
+	struct scmi_opp *opp;
+
+	dom = pi->dom_info + domain;
+	if (!dom)
+		return -EIO;
+
+	for (opp = dom->opp, idx = 0; idx < dom->opp_count; idx++, opp++) {
+		opp_freq = opp->perf * dom->mult_factor;
+		if (opp_freq < *freq)
+			continue;
+
+		*freq = opp_freq;
+		*power = opp->power;
+		ret = 0;
+		break;
+	}
+
+	return ret;
+}
+
 static struct scmi_perf_ops perf_ops = {
 	.limits_set = scmi_perf_limits_set,
 	.limits_get = scmi_perf_limits_get,
@@ -437,6 +464,7 @@
 	.device_opps_add = scmi_dvfs_device_opps_add,
 	.freq_set = scmi_dvfs_freq_set,
 	.freq_get = scmi_dvfs_freq_get,
+	.est_power_get = scmi_dvfs_est_power_get,
 };
 
 static int scmi_perf_protocol_init(struct scmi_handle *handle)
diff --git a/drivers/firmware/efi/libstub/Makefile b/drivers/firmware/efi/libstub/Makefile
index d984509..818d399 100644
--- a/drivers/firmware/efi/libstub/Makefile
+++ b/drivers/firmware/efi/libstub/Makefile
@@ -28,7 +28,8 @@
 				   -D__NO_FORTIFY \
 				   $(call cc-option,-ffreestanding) \
 				   $(call cc-option,-fno-stack-protector) \
-				   -D__DISABLE_EXPORTS
+				   -D__DISABLE_EXPORTS \
+				   $(DISABLE_LTO)
 
 GCOV_PROFILE			:= n
 KASAN_SANITIZE			:= n
diff --git a/drivers/gnss/Kconfig b/drivers/gnss/Kconfig
index 6abc885..73482e8 100644
--- a/drivers/gnss/Kconfig
+++ b/drivers/gnss/Kconfig
@@ -40,4 +40,19 @@
 
 	  If unsure, say N.
 
+config GNSS_CMDLINE_SERIAL
+	tristate "Command line test driver for GNSS"
+	depends on SERIAL_DEV_BUS
+	select GNSS_SERIAL
+	---help---
+	  Say Y here if you want to test the GNSS subsystem but do not have a
+	  way to communicate a binding through firmware such as DT or ACPI.
+	  The correct serdev device and protocol type must be specified on
+	  the module command line.
+
+	  To compile this driver as a module, choose M here: the module will
+	  be called gnss-cmdline.
+
+	  If unsure, say N.
+
 endif # GNSS
diff --git a/drivers/gnss/Makefile b/drivers/gnss/Makefile
index 5cf0ebe..d517c30 100644
--- a/drivers/gnss/Makefile
+++ b/drivers/gnss/Makefile
@@ -14,3 +14,6 @@
 
 obj-$(CONFIG_GNSS_UBX_SERIAL)		+= gnss-ubx.o
 gnss-ubx-y := ubx.o
+
+obj-$(CONFIG_GNSS_CMDLINE_SERIAL)	+= gnss-cmdline.o
+gnss-cmdline-y := cmdline.o
diff --git a/drivers/gnss/cmdline.c b/drivers/gnss/cmdline.c
new file mode 100644
index 0000000..3e1d2463
--- /dev/null
+++ b/drivers/gnss/cmdline.c
@@ -0,0 +1,139 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Test driver for GNSS. This driver requires the serdev binding and protocol
+ * type to be specified on the module command line.
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include <linux/device.h>
+#include <linux/gnss.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/serdev.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+
+#include "serial.h"
+
+#define GNSS_CMDLINE_MODULE_NAME "gnss-cmdline"
+
+#define gnss_cmdline_err(...) \
+	pr_err(GNSS_CMDLINE_MODULE_NAME ": " __VA_ARGS__)
+
+static char *serdev;
+module_param(serdev, charp, 0644);
+MODULE_PARM_DESC(serdev, "serial device to wrap");
+
+static int type;
+module_param(type, int, 0644);
+MODULE_PARM_DESC(serdev, "GNSS protocol type (see 'enum gnss_type')");
+
+static struct serdev_device *serdev_device;
+
+static int name_match(struct device *dev, void *data)
+{
+	return strstr(dev_name(dev), data) != NULL;
+}
+
+static int __init gnss_cmdline_init(void)
+{
+	struct device *serial_dev, *port_dev, *serdev_dev;
+	char *driver_name, *port_name, *serdev_name;
+	char *serdev_dup, *serdev_dup_sep;
+	struct gnss_serial *gserial;
+	int err = -ENODEV;
+
+	/* User did not set the serdev module parameter */
+	if (!serdev)
+		return 0;
+
+	if (type < 0 || type >= GNSS_TYPE_COUNT) {
+		gnss_cmdline_err("invalid gnss type '%d'\n", type);
+		return -EINVAL;
+	}
+
+	serdev_dup = serdev_dup_sep = kstrdup(serdev, GFP_KERNEL);
+	if (!serdev_dup)
+		return -ENOMEM;
+
+	driver_name = strsep(&serdev_dup_sep, "/");
+	if (!driver_name) {
+		gnss_cmdline_err("driver name missing\n");
+		goto err_free_serdev_dup;
+	}
+
+	port_name = strsep(&serdev_dup_sep, "/");
+	if (!port_name) {
+		gnss_cmdline_err("port name missing\n");
+		goto err_free_serdev_dup;
+	}
+
+	serdev_name = strsep(&serdev_dup_sep, "/");
+	if (!serdev_name) {
+		gnss_cmdline_err("serdev name missing\n");
+		goto err_free_serdev_dup;
+	}
+
+	/* Find the driver device instance (e.g. serial8250) */
+	serial_dev = bus_find_device_by_name(&platform_bus_type,
+					     NULL, driver_name);
+	if (!serial_dev) {
+		gnss_cmdline_err("no device '%s'\n", driver_name);
+		goto err_free_serdev_dup;
+	}
+
+	/* Find the port device instance (e.g. serial0) */
+	port_dev = device_find_child(serial_dev, port_name, name_match);
+	if (!port_dev) {
+		gnss_cmdline_err("no port '%s'\n", port_name);
+		goto err_free_serdev_dup;
+	}
+
+	/* Find the serdev device instance (e.g. serial0-0) */
+	serdev_dev = device_find_child(port_dev, serdev_name, name_match);
+	if (!serdev_dev) {
+		gnss_cmdline_err("no serdev '%s'\n", serdev_name);
+		goto err_free_serdev_dup;
+	}
+
+	gserial = gnss_serial_allocate(to_serdev_device(serdev_dev), 0);
+	if (IS_ERR(gserial)) {
+		err = PTR_ERR(gserial);
+		goto err_free_serdev_dup;
+	}
+
+	gserial->gdev->type = type;
+
+	err = gnss_serial_register(gserial);
+	if (err) {
+		gnss_serial_free(gserial);
+		goto err_free_serdev_dup;
+	}
+
+	serdev_device = to_serdev_device(serdev_dev);
+	err = 0;
+err_free_serdev_dup:
+	kfree(serdev_dup);
+	return err;
+}
+
+static void __exit gnss_cmdline_exit(void)
+{
+	struct gnss_serial *gserial;
+
+	if (!serdev_device)
+		return;
+
+	gserial = serdev_device_get_drvdata(serdev_device);
+
+	gnss_serial_deregister(gserial);
+	gnss_serial_free(gserial);
+}
+
+module_init(gnss_cmdline_init);
+module_exit(gnss_cmdline_exit);
+
+MODULE_AUTHOR("Alistair Delva <adelva@google.com>");
+MODULE_DESCRIPTION("GNSS command line driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index ed51221..4877999 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -12,7 +12,6 @@
 
 menuconfig GPIOLIB
 	bool "GPIO Support"
-	select ANON_INODES
 	help
 	  This enables GPIO support through the generic GPIO library.
 	  You only need to enable this, if you also want to enable
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index f92597c..40339d0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -1158,7 +1158,7 @@
 		alloc_flags = 0;
 		if (!offset || !*offset)
 			return -EINVAL;
-		user_addr = *offset;
+		user_addr = untagged_addr(*offset);
 	} else {
 		return -EINVAL;
 	}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 71792d8..b542384 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -299,6 +299,8 @@
 	uint32_t handle;
 	int r;
 
+	args->addr = untagged_addr(args->addr);
+
 	if (offset_in_page(args->addr | args->size))
 		return -EINVAL;
 
diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index df31c38..d394469 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -60,7 +60,6 @@
 
 	drm_file_free(client->file);
 }
-EXPORT_SYMBOL(drm_client_close);
 
 /**
  * drm_client_init - Initialise a DRM client
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 6011d76..486b784 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -256,9 +256,7 @@
 
 	if (connector_type != DRM_MODE_CONNECTOR_VIRTUAL &&
 	    connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
-		drm_object_attach_property(&connector->base,
-					      config->edid_property,
-					      0);
+		drm_connector_attach_edid_property(connector);
 
 	drm_object_attach_property(&connector->base,
 				      config->dpms_property, 0);
@@ -291,6 +289,25 @@
 EXPORT_SYMBOL(drm_connector_init);
 
 /**
+ * drm_connector_attach_edid_property - attach edid property.
+ * @dev: DRM device
+ * @connector: the connector
+ *
+ * Some connector types like DRM_MODE_CONNECTOR_VIRTUAL do not get a
+ * edid property attached by default.  This function can be used to
+ * explicitly enable the edid property in these cases.
+ */
+void drm_connector_attach_edid_property(struct drm_connector *connector)
+{
+	struct drm_mode_config *config = &connector->dev->mode_config;
+
+	drm_object_attach_property(&connector->base,
+				   config->edid_property,
+				   0);
+}
+EXPORT_SYMBOL(drm_connector_attach_edid_property);
+
+/**
  * drm_connector_attach_encoder - attach a connector to an encoder
  * @connector: connector to attach
  * @encoder: encoder to attach @connector to
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index ba129b6..aa6b551 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -650,9 +650,9 @@
 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb_ioctl, DRM_UNLOCKED),
 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_UNLOCKED),
 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_UNLOCKED),
-	DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_UNLOCKED),
-	DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_UNLOCKED),
-	DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_UNLOCKED),
+	DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, DRM_UNLOCKED),
 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_UNLOCKED),
 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER|DRM_UNLOCKED),
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 186db2e..1c32b70 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -679,6 +679,43 @@
 EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
 
 /**
+ * drm_gem_prime_mmap - PRIME mmap function for GEM drivers
+ * @obj: GEM object
+ * @vma: Virtual address range
+ *
+ * This function sets up a userspace mapping for PRIME exported buffers using
+ * the same codepath that is used for regular GEM buffer mapping on the DRM fd.
+ * The fake GEM offset is added to vma->vm_pgoff and &drm_driver->fops->mmap is
+ * called to set up the mapping.
+ *
+ * Drivers can use this as their &drm_driver.gem_prime_mmap callback.
+ */
+int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
+{
+	/* Used by drm_gem_mmap() to lookup the GEM object */
+	struct drm_file priv = {
+		.minor = obj->dev->primary,
+	};
+	struct file fil = {
+		.private_data = &priv,
+	};
+	int ret;
+
+	ret = drm_vma_node_allow(&obj->vma_node, &priv);
+	if (ret)
+		return ret;
+
+	vma->vm_pgoff += drm_vma_node_start(&obj->vma_node);
+
+	ret = obj->dev->driver->fops->mmap(&fil, vma);
+
+	drm_vma_node_revoke(&obj->vma_node, &priv);
+
+	return ret;
+}
+EXPORT_SYMBOL(drm_gem_prime_mmap);
+
+/**
  * drm_gem_prime_import_dev - core implementation of the import callback
  * @dev: drm_device to import into
  * @dma_buf: dma-buf object to import
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index f08c547..5289481 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -1604,7 +1604,9 @@
 		 * happened we would make the mistake of assuming that the
 		 * relocations were valid.
 		 */
-		user_access_begin();
+		if (!user_access_begin(VERIFY_WRITE, urelocs, size))
+			goto end_user;
+
 		for (copied = 0; copied < nreloc; copied++)
 			unsafe_put_user(-1,
 					&urelocs[copied].presumed_offset,
@@ -2649,7 +2651,17 @@
 		unsigned int i;
 
 		/* Copy the new buffer offsets back to the user's exec list. */
-		user_access_begin();
+		/*
+		 * Note: count * sizeof(*user_exec_list) does not overflow,
+		 * because we checked 'count' in check_buffer_count().
+		 *
+		 * And this range already got effectively checked earlier
+		 * when we did the "copy_from_user()" above.
+		 */
+		if (!user_access_begin(VERIFY_WRITE, user_exec_list,
+				       count * sizeof(*user_exec_list)))
+			goto end_user;
+
 		for (i = 0; i < args->buffer_count; i++) {
 			if (!(exec2_list[i].offset & UPDATE))
 				continue;
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index 27d8e7d..8572caf 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -291,6 +291,8 @@
 	uint32_t handle;
 	int r;
 
+	args->addr = untagged_addr(args->addr);
+
 	if (offset_in_page(args->addr | args->size))
 		return -EINVAL;
 
diff --git a/drivers/gpu/drm/virtio/Makefile b/drivers/gpu/drm/virtio/Makefile
index f29deec..11e25e9 100644
--- a/drivers/gpu/drm/virtio/Makefile
+++ b/drivers/gpu/drm/virtio/Makefile
@@ -6,6 +6,6 @@
 virtio-gpu-y := virtgpu_drv.o virtgpu_kms.o virtgpu_drm_bus.o virtgpu_gem.o \
 	virtgpu_fb.o virtgpu_display.o virtgpu_vq.o virtgpu_ttm.o \
 	virtgpu_fence.o virtgpu_object.o virtgpu_debugfs.o virtgpu_plane.o \
-	virtgpu_ioctl.o virtgpu_prime.o
+	virtgpu_ioctl.o virtgpu_prime.o virtgpu_trace_points.o
 
 obj-$(CONFIG_DRM_VIRTIO_GPU) += virtio-gpu.o
diff --git a/drivers/gpu/drm/virtio/virtgpu_debugfs.c b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
index 73dc990..ed0fcda 100644
--- a/drivers/gpu/drm/virtio/virtgpu_debugfs.c
+++ b/drivers/gpu/drm/virtio/virtgpu_debugfs.c
@@ -28,6 +28,30 @@
 
 #include "virtgpu_drv.h"
 
+static void virtio_add_bool(struct seq_file *m, const char *name,
+				    bool value)
+{
+	seq_printf(m, "%-16s : %s\n", name, value ? "yes" : "no");
+}
+
+static void virtio_add_int(struct seq_file *m, const char *name,
+				   int value)
+{
+	seq_printf(m, "%-16s : %d\n", name, value);
+}
+
+static int virtio_gpu_features(struct seq_file *m, void *data)
+{
+	struct drm_info_node *node = (struct drm_info_node *) m->private;
+	struct virtio_gpu_device *vgdev = node->minor->dev->dev_private;
+
+	virtio_add_bool(m, "virgl", vgdev->has_virgl_3d);
+	virtio_add_bool(m, "edid", vgdev->has_edid);
+	virtio_add_int(m, "cap sets", vgdev->num_capsets);
+	virtio_add_int(m, "scanouts", vgdev->num_scanouts);
+	return 0;
+}
+
 static int
 virtio_gpu_debugfs_irq_info(struct seq_file *m, void *data)
 {
@@ -41,7 +65,8 @@
 }
 
 static struct drm_info_list virtio_gpu_debugfs_list[] = {
-	{ "irq_fence", virtio_gpu_debugfs_irq_info, 0, NULL },
+	{ "virtio-gpu-features", virtio_gpu_features },
+	{ "virtio-gpu-irq-fence", virtio_gpu_debugfs_irq_info, 0, NULL },
 };
 
 #define VIRTIO_GPU_DEBUGFS_ENTRIES ARRAY_SIZE(virtio_gpu_debugfs_list)
diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
index 25503b9..d168fb6 100644
--- a/drivers/gpu/drm/virtio/virtgpu_display.c
+++ b/drivers/gpu/drm/virtio/virtgpu_display.c
@@ -75,12 +75,9 @@
 			    struct drm_gem_object *obj)
 {
 	int ret;
-	struct virtio_gpu_object *bo;
 
 	vgfb->base.obj[0] = obj;
 
-	bo = gem_to_virtio_gpu_obj(obj);
-
 	drm_helper_mode_fill_fb_struct(dev, &vgfb->base, mode_cmd);
 
 	ret = drm_framebuffer_init(dev, &vgfb->base, &virtio_gpu_fb_funcs);
@@ -109,6 +106,9 @@
 static void virtio_gpu_crtc_atomic_enable(struct drm_crtc *crtc,
 					  struct drm_crtc_state *old_state)
 {
+	struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(crtc);
+
+	output->enabled = true;
 }
 
 static void virtio_gpu_crtc_atomic_disable(struct drm_crtc *crtc,
@@ -119,6 +119,7 @@
 	struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(crtc);
 
 	virtio_gpu_cmd_set_scanout(vgdev, output->index, 0, 0, 0, 0, 0);
+	output->enabled = false;
 }
 
 static int virtio_gpu_crtc_atomic_check(struct drm_crtc *crtc,
@@ -168,6 +169,12 @@
 	struct drm_display_mode *mode = NULL;
 	int count, width, height;
 
+	if (output->edid) {
+		count = drm_add_edid_modes(connector, output->edid);
+		if (count)
+			return count;
+	}
+
 	width  = le32_to_cpu(output->info.r.width);
 	height = le32_to_cpu(output->info.r.height);
 	count = drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX);
@@ -236,12 +243,8 @@
 
 static void virtio_gpu_conn_destroy(struct drm_connector *connector)
 {
-	struct virtio_gpu_output *virtio_gpu_output =
-		drm_connector_to_virtio_gpu_output(connector);
-
 	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
-	kfree(virtio_gpu_output);
 }
 
 static const struct drm_connector_funcs virtio_gpu_connector_funcs = {
@@ -286,6 +289,8 @@
 	drm_connector_init(dev, connector, &virtio_gpu_connector_funcs,
 			   DRM_MODE_CONNECTOR_VIRTUAL);
 	drm_connector_helper_add(connector, &virtio_gpu_conn_helper_funcs);
+	if (vgdev->has_edid)
+		drm_connector_attach_edid_property(connector);
 
 	drm_encoder_init(dev, encoder, &virtio_gpu_enc_funcs,
 			 DRM_MODE_ENCODER_VIRTUAL, NULL);
@@ -372,6 +377,10 @@
 
 void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev)
 {
-	virtio_gpu_fbdev_fini(vgdev);
+	int i;
+
+	for (i = 0 ; i < vgdev->num_scanouts; ++i)
+		kfree(vgdev->outputs[i].edid);
+	drm_atomic_helper_shutdown(vgdev->ddev);
 	drm_mode_config_cleanup(vgdev->ddev);
 }
diff --git a/drivers/gpu/drm/virtio/virtgpu_drm_bus.c b/drivers/gpu/drm/virtio/virtgpu_drm_bus.c
index 7df8d0c..b61e323 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drm_bus.c
+++ b/drivers/gpu/drm/virtio/virtgpu_drm_bus.c
@@ -71,6 +71,37 @@
 		if (vga)
 			virtio_pci_kick_out_firmware_fb(pdev);
 
+		/*
+		 * Normally the drm_dev_set_unique() call is done by core DRM.
+		 * The following comment covers, why virtio cannot rely on it.
+		 *
+		 * Unlike the other virtual GPU drivers, virtio abstracts the
+		 * underlying bus type by using struct virtio_device.
+		 *
+		 * Hence the dev_is_pci() check, used in core DRM, will fail
+		 * and the unique returned will be the virtio_device "virtio0",
+		 * while a "pci:..." one is required.
+		 *
+		 * A few other ideas were considered:
+		 * - Extend the dev_is_pci() check [in drm_set_busid] to
+		 *   consider virtio.
+		 *   Seems like a bigger hack than what we have already.
+		 *
+		 * - Point drm_device::dev to the parent of the virtio_device
+		 *   Semantic changes:
+		 *   * Using the wrong device for i2c, framebuffer_alloc and
+		 *     prime import.
+		 *   Visual changes:
+		 *   * Helpers such as DRM_DEV_ERROR, dev_info, drm_printer,
+		 *     will print the wrong information.
+		 *
+		 * We could address the latter issues, by introducing
+		 * drm_device::bus_dev, ... which would be used solely for this.
+		 *
+		 * So for the moment keep things as-is, with a bulky comment
+		 * for the next person who feels like removing this
+		 * drm_dev_set_unique() quirk.
+		 */
 		snprintf(unique, sizeof(unique), "pci:%s", pname);
 		ret = drm_dev_set_unique(dev, unique);
 		if (ret)
@@ -85,6 +116,6 @@
 	return 0;
 
 err_free:
-	drm_dev_unref(dev);
+	drm_dev_put(dev);
 	return ret;
 }
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c b/drivers/gpu/drm/virtio/virtgpu_drv.c
index d9287c1..1fd1046 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.c
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.c
@@ -42,13 +42,20 @@
 
 static int virtio_gpu_probe(struct virtio_device *vdev)
 {
+	int ret;
+
 	if (vgacon_text_force() && virtio_gpu_modeset == -1)
 		return -EINVAL;
 
 	if (virtio_gpu_modeset == 0)
 		return -EINVAL;
 
-	return drm_virtio_init(&driver, vdev);
+	ret = drm_virtio_init(&driver, vdev);
+	if (ret)
+		return ret;
+
+	drm_fbdev_generic_setup(vdev->priv, 32);
+	return 0;
 }
 
 static void virtio_gpu_remove(struct virtio_device *vdev)
@@ -80,6 +87,7 @@
 	 */
 	VIRTIO_GPU_F_VIRGL,
 #endif
+	VIRTIO_GPU_F_EDID,
 };
 static struct virtio_driver virtio_gpu_driver = {
 	.feature_table = features,
@@ -130,8 +138,6 @@
 	.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
 	.gem_prime_export = drm_gem_prime_export,
 	.gem_prime_import = drm_gem_prime_import,
-	.gem_prime_pin = virtgpu_gem_prime_pin,
-	.gem_prime_unpin = virtgpu_gem_prime_unpin,
 	.gem_prime_get_sg_table = virtgpu_gem_prime_get_sg_table,
 	.gem_prime_import_sg_table = virtgpu_gem_prime_import_sg_table,
 	.gem_prime_vmap = virtgpu_gem_prime_vmap,
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 65605e2..a9aa023 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -36,6 +36,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_encoder.h>
+#include <drm/drm_fb_helper.h>
 #include <drm/ttm/ttm_bo_api.h>
 #include <drm/ttm/ttm_bo_driver.h>
 #include <drm/ttm/ttm_placement.h>
@@ -46,23 +47,42 @@
 #define DRIVER_DATE "0"
 
 #define DRIVER_MAJOR 0
-#define DRIVER_MINOR 0
-#define DRIVER_PATCHLEVEL 1
+#define DRIVER_MINOR 1
+#define DRIVER_PATCHLEVEL 0
 
 /* virtgpu_drm_bus.c */
 int drm_virtio_init(struct drm_driver *driver, struct virtio_device *vdev);
 
+struct virtio_gpu_object_params {
+	uint32_t format;
+	uint32_t width;
+	uint32_t height;
+	unsigned long size;
+	bool dumb;
+	/* 3d */
+	bool virgl;
+	uint32_t target;
+	uint32_t bind;
+	uint32_t depth;
+	uint32_t array_size;
+	uint32_t last_level;
+	uint32_t nr_samples;
+	uint32_t flags;
+};
+
 struct virtio_gpu_object {
 	struct drm_gem_object gem_base;
 	uint32_t hw_res_handle;
 
 	struct sg_table *pages;
+	uint32_t mapped;
 	void *vmap;
 	bool dumb;
 	struct ttm_place                placement_code;
 	struct ttm_placement		placement;
 	struct ttm_buffer_object	tbo;
 	struct ttm_bo_kmap_obj		kmap;
+	bool created;
 };
 #define gem_to_virtio_gpu_obj(gobj) \
 	container_of((gobj), struct virtio_gpu_object, gem_base)
@@ -85,7 +105,6 @@
 	struct dma_fence f;
 	struct virtio_gpu_fence_driver *drv;
 	struct list_head node;
-	uint64_t seq;
 };
 #define to_virtio_fence(x) \
 	container_of(x, struct virtio_gpu_fence, f)
@@ -112,8 +131,10 @@
 	struct drm_encoder enc;
 	struct virtio_gpu_display_one info;
 	struct virtio_gpu_update_cursor cursor;
+	struct edid *edid;
 	int cur_x;
 	int cur_y;
+	bool enabled;
 };
 #define drm_crtc_to_virtio_gpu_output(x) \
 	container_of(x, struct virtio_gpu_output, crtc)
@@ -127,6 +148,7 @@
 	int x1, y1, x2, y2; /* dirty rect */
 	spinlock_t dirty_lock;
 	uint32_t hw_res_handle;
+	struct virtio_gpu_fence *fence;
 };
 #define to_virtio_gpu_framebuffer(x) \
 	container_of(x, struct virtio_gpu_framebuffer, base)
@@ -138,8 +160,6 @@
 	struct ttm_bo_device		bdev;
 };
 
-struct virtio_gpu_fbdev;
-
 struct virtio_gpu_queue {
 	struct virtqueue *vq;
 	spinlock_t qlock;
@@ -170,8 +190,6 @@
 
 	struct virtio_gpu_mman mman;
 
-	/* pointer to fbdev info structure */
-	struct virtio_gpu_fbdev *vgfbdev;
 	struct virtio_gpu_output outputs[VIRTIO_GPU_MAX_SCANOUTS];
 	uint32_t num_scanouts;
 
@@ -180,8 +198,7 @@
 	struct kmem_cache *vbufs;
 	bool vqs_ready;
 
-	struct idr	resource_idr;
-	spinlock_t resource_idr_lock;
+	struct ida	resource_ida;
 
 	wait_queue_head_t resp_wq;
 	/* current display info */
@@ -190,10 +207,10 @@
 
 	struct virtio_gpu_fence_driver fence_drv;
 
-	struct idr	ctx_id_idr;
-	spinlock_t ctx_id_idr_lock;
+	struct ida	ctx_id_ida;
 
 	bool has_virgl_3d;
+	bool has_edid;
 
 	struct work_struct config_changed_work;
 
@@ -209,6 +226,9 @@
 /* virtio_ioctl.c */
 #define DRM_VIRTIO_NUM_IOCTLS 10
 extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS];
+int virtio_gpu_object_list_validate(struct ww_acquire_ctx *ticket,
+				    struct list_head *head);
+void virtio_gpu_unref_list(struct list_head *head);
 
 /* virtio_kms.c */
 int virtio_gpu_driver_load(struct drm_device *dev, unsigned long flags);
@@ -222,16 +242,17 @@
 void virtio_gpu_gem_fini(struct virtio_gpu_device *vgdev);
 int virtio_gpu_gem_create(struct drm_file *file,
 			  struct drm_device *dev,
-			  uint64_t size,
+			  struct virtio_gpu_object_params *params,
 			  struct drm_gem_object **obj_p,
 			  uint32_t *handle_p);
 int virtio_gpu_gem_object_open(struct drm_gem_object *obj,
 			       struct drm_file *file);
 void virtio_gpu_gem_object_close(struct drm_gem_object *obj,
 				 struct drm_file *file);
-struct virtio_gpu_object *virtio_gpu_alloc_object(struct drm_device *dev,
-						  size_t size, bool kernel,
-						  bool pinned);
+struct virtio_gpu_object*
+virtio_gpu_alloc_object(struct drm_device *dev,
+			struct virtio_gpu_object_params *params,
+			struct virtio_gpu_fence *fence);
 int virtio_gpu_mode_dumb_create(struct drm_file *file_priv,
 				struct drm_device *dev,
 				struct drm_mode_create_dumb *args);
@@ -240,30 +261,24 @@
 			      uint32_t handle, uint64_t *offset_p);
 
 /* virtio_fb */
-#define VIRTIO_GPUFB_CONN_LIMIT 1
-int virtio_gpu_fbdev_init(struct virtio_gpu_device *vgdev);
-void virtio_gpu_fbdev_fini(struct virtio_gpu_device *vgdev);
 int virtio_gpu_surface_dirty(struct virtio_gpu_framebuffer *qfb,
 			     struct drm_clip_rect *clips,
 			     unsigned int num_clips);
 /* virtio vg */
 int virtio_gpu_alloc_vbufs(struct virtio_gpu_device *vgdev);
 void virtio_gpu_free_vbufs(struct virtio_gpu_device *vgdev);
-void virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
-			       uint32_t *resid);
-void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id);
 void virtio_gpu_cmd_create_resource(struct virtio_gpu_device *vgdev,
-				    uint32_t resource_id,
-				    uint32_t format,
-				    uint32_t width,
-				    uint32_t height);
+				    struct virtio_gpu_object *bo,
+				    struct virtio_gpu_object_params *params,
+				    struct virtio_gpu_fence *fence);
 void virtio_gpu_cmd_unref_resource(struct virtio_gpu_device *vgdev,
 				   uint32_t resource_id);
 void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev,
-					uint32_t resource_id, uint64_t offset,
+					struct virtio_gpu_object *bo,
+					uint64_t offset,
 					__le32 width, __le32 height,
 					__le32 x, __le32 y,
-					struct virtio_gpu_fence **fence);
+					struct virtio_gpu_fence *fence);
 void virtio_gpu_cmd_resource_flush(struct virtio_gpu_device *vgdev,
 				   uint32_t resource_id,
 				   uint32_t x, uint32_t y,
@@ -274,19 +289,19 @@
 				uint32_t x, uint32_t y);
 int virtio_gpu_object_attach(struct virtio_gpu_device *vgdev,
 			     struct virtio_gpu_object *obj,
-			     uint32_t resource_id,
-			     struct virtio_gpu_fence **fence);
+			     struct virtio_gpu_fence *fence);
+void virtio_gpu_object_detach(struct virtio_gpu_device *vgdev,
+			      struct virtio_gpu_object *obj);
 int virtio_gpu_attach_status_page(struct virtio_gpu_device *vgdev);
 int virtio_gpu_detach_status_page(struct virtio_gpu_device *vgdev);
 void virtio_gpu_cursor_ping(struct virtio_gpu_device *vgdev,
 			    struct virtio_gpu_output *output);
 int virtio_gpu_cmd_get_display_info(struct virtio_gpu_device *vgdev);
-void virtio_gpu_cmd_resource_inval_backing(struct virtio_gpu_device *vgdev,
-					   uint32_t resource_id);
 int virtio_gpu_cmd_get_capset_info(struct virtio_gpu_device *vgdev, int idx);
 int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev,
 			      int idx, int version,
 			      struct virtio_gpu_drv_cap_cache **cache_p);
+int virtio_gpu_cmd_get_edids(struct virtio_gpu_device *vgdev);
 void virtio_gpu_cmd_context_create(struct virtio_gpu_device *vgdev, uint32_t id,
 				   uint32_t nlen, const char *name);
 void virtio_gpu_cmd_context_destroy(struct virtio_gpu_device *vgdev,
@@ -299,21 +314,23 @@
 					    uint32_t resource_id);
 void virtio_gpu_cmd_submit(struct virtio_gpu_device *vgdev,
 			   void *data, uint32_t data_size,
-			   uint32_t ctx_id, struct virtio_gpu_fence **fence);
+			   uint32_t ctx_id, struct virtio_gpu_fence *fence);
 void virtio_gpu_cmd_transfer_from_host_3d(struct virtio_gpu_device *vgdev,
 					  uint32_t resource_id, uint32_t ctx_id,
 					  uint64_t offset, uint32_t level,
 					  struct virtio_gpu_box *box,
-					  struct virtio_gpu_fence **fence);
+					  struct virtio_gpu_fence *fence);
 void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
-					uint32_t resource_id, uint32_t ctx_id,
+					struct virtio_gpu_object *bo,
+					uint32_t ctx_id,
 					uint64_t offset, uint32_t level,
 					struct virtio_gpu_box *box,
-					struct virtio_gpu_fence **fence);
+					struct virtio_gpu_fence *fence);
 void
 virtio_gpu_cmd_resource_create_3d(struct virtio_gpu_device *vgdev,
-				  struct virtio_gpu_resource_create_3d *rc_3d,
-				  struct virtio_gpu_fence **fence);
+				  struct virtio_gpu_object *bo,
+				  struct virtio_gpu_object_params *params,
+				  struct virtio_gpu_fence *fence);
 void virtio_gpu_ctrl_ack(struct virtqueue *vq);
 void virtio_gpu_cursor_ack(struct virtqueue *vq);
 void virtio_gpu_fence_ack(struct virtqueue *vq);
@@ -341,25 +358,28 @@
 int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma);
 
 /* virtio_gpu_fence.c */
-int virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
+bool virtio_fence_signaled(struct dma_fence *f);
+struct virtio_gpu_fence *virtio_gpu_fence_alloc(
+	struct virtio_gpu_device *vgdev);
+void virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
 			  struct virtio_gpu_ctrl_hdr *cmd_hdr,
-			  struct virtio_gpu_fence **fence);
+			  struct virtio_gpu_fence *fence);
 void virtio_gpu_fence_event_process(struct virtio_gpu_device *vdev,
 				    u64 last_seq);
 
 /* virtio_gpu_object */
 int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
-			     unsigned long size, bool kernel, bool pinned,
-			     struct virtio_gpu_object **bo_ptr);
-int virtio_gpu_object_kmap(struct virtio_gpu_object *bo, void **ptr);
+			     struct virtio_gpu_object_params *params,
+			     struct virtio_gpu_object **bo_ptr,
+			     struct virtio_gpu_fence *fence);
+void virtio_gpu_object_kunmap(struct virtio_gpu_object *bo);
+int virtio_gpu_object_kmap(struct virtio_gpu_object *bo);
 int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev,
 				   struct virtio_gpu_object *bo);
 void virtio_gpu_object_free_sg_table(struct virtio_gpu_object *bo);
 int virtio_gpu_object_wait(struct virtio_gpu_object *bo, bool no_wait);
 
 /* virtgpu_prime.c */
-int virtgpu_gem_prime_pin(struct drm_gem_object *obj);
-void virtgpu_gem_prime_unpin(struct drm_gem_object *obj);
 struct sg_table *virtgpu_gem_prime_get_sg_table(struct drm_gem_object *obj);
 struct drm_gem_object *virtgpu_gem_prime_import_sg_table(
 	struct drm_device *dev, struct dma_buf_attachment *attach,
@@ -372,7 +392,7 @@
 static inline struct virtio_gpu_object*
 virtio_gpu_object_ref(struct virtio_gpu_object *bo)
 {
-	ttm_bo_reference(&bo->tbo);
+	ttm_bo_get(&bo->tbo);
 	return bo;
 }
 
@@ -383,9 +403,8 @@
 	if ((*bo) == NULL)
 		return;
 	tbo = &((*bo)->tbo);
-	ttm_bo_unref(&tbo);
-	if (tbo == NULL)
-		*bo = NULL;
+	ttm_bo_put(tbo);
+	*bo = NULL;
 }
 
 static inline u64 virtio_gpu_object_mmap_offset(struct virtio_gpu_object *bo)
diff --git a/drivers/gpu/drm/virtio/virtgpu_fb.c b/drivers/gpu/drm/virtio/virtgpu_fb.c
index a121b1c..b07584b 100644
--- a/drivers/gpu/drm/virtio/virtgpu_fb.c
+++ b/drivers/gpu/drm/virtio/virtgpu_fb.c
@@ -27,15 +27,6 @@
 #include <drm/drm_fb_helper.h>
 #include "virtgpu_drv.h"
 
-#define VIRTIO_GPU_FBCON_POLL_PERIOD (HZ / 60)
-
-struct virtio_gpu_fbdev {
-	struct drm_fb_helper           helper;
-	struct virtio_gpu_framebuffer  vgfb;
-	struct virtio_gpu_device       *vgdev;
-	struct delayed_work            work;
-};
-
 static int virtio_gpu_dirty_update(struct virtio_gpu_framebuffer *fb,
 				   bool store, int x, int y,
 				   int width, int height)
@@ -102,7 +93,7 @@
 
 		offset = (y * fb->base.pitches[0]) + x * bpp;
 
-		virtio_gpu_cmd_transfer_to_host_2d(vgdev, obj->hw_res_handle,
+		virtio_gpu_cmd_transfer_to_host_2d(vgdev, obj,
 						   offset,
 						   cpu_to_le32(w),
 						   cpu_to_le32(h),
@@ -157,199 +148,3 @@
 				      left, top, right - left, bottom - top);
 	return 0;
 }
-
-static void virtio_gpu_fb_dirty_work(struct work_struct *work)
-{
-	struct delayed_work *delayed_work = to_delayed_work(work);
-	struct virtio_gpu_fbdev *vfbdev =
-		container_of(delayed_work, struct virtio_gpu_fbdev, work);
-	struct virtio_gpu_framebuffer *vgfb = &vfbdev->vgfb;
-
-	virtio_gpu_dirty_update(&vfbdev->vgfb, false, vgfb->x1, vgfb->y1,
-				vgfb->x2 - vgfb->x1, vgfb->y2 - vgfb->y1);
-}
-
-static void virtio_gpu_3d_fillrect(struct fb_info *info,
-				   const struct fb_fillrect *rect)
-{
-	struct virtio_gpu_fbdev *vfbdev = info->par;
-
-	drm_fb_helper_sys_fillrect(info, rect);
-	virtio_gpu_dirty_update(&vfbdev->vgfb, true, rect->dx, rect->dy,
-			     rect->width, rect->height);
-	schedule_delayed_work(&vfbdev->work, VIRTIO_GPU_FBCON_POLL_PERIOD);
-}
-
-static void virtio_gpu_3d_copyarea(struct fb_info *info,
-				   const struct fb_copyarea *area)
-{
-	struct virtio_gpu_fbdev *vfbdev = info->par;
-
-	drm_fb_helper_sys_copyarea(info, area);
-	virtio_gpu_dirty_update(&vfbdev->vgfb, true, area->dx, area->dy,
-			   area->width, area->height);
-	schedule_delayed_work(&vfbdev->work, VIRTIO_GPU_FBCON_POLL_PERIOD);
-}
-
-static void virtio_gpu_3d_imageblit(struct fb_info *info,
-				    const struct fb_image *image)
-{
-	struct virtio_gpu_fbdev *vfbdev = info->par;
-
-	drm_fb_helper_sys_imageblit(info, image);
-	virtio_gpu_dirty_update(&vfbdev->vgfb, true, image->dx, image->dy,
-			     image->width, image->height);
-	schedule_delayed_work(&vfbdev->work, VIRTIO_GPU_FBCON_POLL_PERIOD);
-}
-
-static struct fb_ops virtio_gpufb_ops = {
-	.owner = THIS_MODULE,
-	DRM_FB_HELPER_DEFAULT_OPS,
-	.fb_fillrect = virtio_gpu_3d_fillrect,
-	.fb_copyarea = virtio_gpu_3d_copyarea,
-	.fb_imageblit = virtio_gpu_3d_imageblit,
-};
-
-static int virtio_gpu_vmap_fb(struct virtio_gpu_device *vgdev,
-			      struct virtio_gpu_object *obj)
-{
-	return virtio_gpu_object_kmap(obj, NULL);
-}
-
-static int virtio_gpufb_create(struct drm_fb_helper *helper,
-			       struct drm_fb_helper_surface_size *sizes)
-{
-	struct virtio_gpu_fbdev *vfbdev =
-		container_of(helper, struct virtio_gpu_fbdev, helper);
-	struct drm_device *dev = helper->dev;
-	struct virtio_gpu_device *vgdev = dev->dev_private;
-	struct fb_info *info;
-	struct drm_framebuffer *fb;
-	struct drm_mode_fb_cmd2 mode_cmd = {};
-	struct virtio_gpu_object *obj;
-	uint32_t resid, format, size;
-	int ret;
-
-	mode_cmd.width = sizes->surface_width;
-	mode_cmd.height = sizes->surface_height;
-	mode_cmd.pitches[0] = mode_cmd.width * 4;
-	mode_cmd.pixel_format = drm_mode_legacy_fb_format(32, 24);
-
-	format = virtio_gpu_translate_format(mode_cmd.pixel_format);
-	if (format == 0)
-		return -EINVAL;
-
-	size = mode_cmd.pitches[0] * mode_cmd.height;
-	obj = virtio_gpu_alloc_object(dev, size, false, true);
-	if (IS_ERR(obj))
-		return PTR_ERR(obj);
-
-	virtio_gpu_resource_id_get(vgdev, &resid);
-	virtio_gpu_cmd_create_resource(vgdev, resid, format,
-				       mode_cmd.width, mode_cmd.height);
-
-	ret = virtio_gpu_vmap_fb(vgdev, obj);
-	if (ret) {
-		DRM_ERROR("failed to vmap fb %d\n", ret);
-		goto err_obj_vmap;
-	}
-
-	/* attach the object to the resource */
-	ret = virtio_gpu_object_attach(vgdev, obj, resid, NULL);
-	if (ret)
-		goto err_obj_attach;
-
-	info = drm_fb_helper_alloc_fbi(helper);
-	if (IS_ERR(info)) {
-		ret = PTR_ERR(info);
-		goto err_fb_alloc;
-	}
-
-	info->par = helper;
-
-	ret = virtio_gpu_framebuffer_init(dev, &vfbdev->vgfb,
-					  &mode_cmd, &obj->gem_base);
-	if (ret)
-		goto err_fb_alloc;
-
-	fb = &vfbdev->vgfb.base;
-
-	vfbdev->helper.fb = fb;
-
-	strcpy(info->fix.id, "virtiodrmfb");
-	info->fbops = &virtio_gpufb_ops;
-	info->pixmap.flags = FB_PIXMAP_SYSTEM;
-
-	info->screen_buffer = obj->vmap;
-	info->screen_size = obj->gem_base.size;
-	drm_fb_helper_fill_fix(info, fb->pitches[0], fb->format->depth);
-	drm_fb_helper_fill_var(info, &vfbdev->helper,
-			       sizes->fb_width, sizes->fb_height);
-
-	info->fix.mmio_start = 0;
-	info->fix.mmio_len = 0;
-	return 0;
-
-err_fb_alloc:
-	virtio_gpu_cmd_resource_inval_backing(vgdev, resid);
-err_obj_attach:
-err_obj_vmap:
-	virtio_gpu_gem_free_object(&obj->gem_base);
-	return ret;
-}
-
-static int virtio_gpu_fbdev_destroy(struct drm_device *dev,
-				    struct virtio_gpu_fbdev *vgfbdev)
-{
-	struct virtio_gpu_framebuffer *vgfb = &vgfbdev->vgfb;
-
-	drm_fb_helper_unregister_fbi(&vgfbdev->helper);
-
-	if (vgfb->base.obj[0])
-		vgfb->base.obj[0] = NULL;
-	drm_fb_helper_fini(&vgfbdev->helper);
-	drm_framebuffer_cleanup(&vgfb->base);
-
-	return 0;
-}
-static const struct drm_fb_helper_funcs virtio_gpu_fb_helper_funcs = {
-	.fb_probe = virtio_gpufb_create,
-};
-
-int virtio_gpu_fbdev_init(struct virtio_gpu_device *vgdev)
-{
-	struct virtio_gpu_fbdev *vgfbdev;
-	int bpp_sel = 32; /* TODO: parameter from somewhere? */
-	int ret;
-
-	vgfbdev = kzalloc(sizeof(struct virtio_gpu_fbdev), GFP_KERNEL);
-	if (!vgfbdev)
-		return -ENOMEM;
-
-	vgfbdev->vgdev = vgdev;
-	vgdev->vgfbdev = vgfbdev;
-	INIT_DELAYED_WORK(&vgfbdev->work, virtio_gpu_fb_dirty_work);
-
-	drm_fb_helper_prepare(vgdev->ddev, &vgfbdev->helper,
-			      &virtio_gpu_fb_helper_funcs);
-	ret = drm_fb_helper_init(vgdev->ddev, &vgfbdev->helper,
-				 VIRTIO_GPUFB_CONN_LIMIT);
-	if (ret) {
-		kfree(vgfbdev);
-		return ret;
-	}
-
-	drm_fb_helper_single_add_all_connectors(&vgfbdev->helper);
-	drm_fb_helper_initial_config(&vgfbdev->helper, bpp_sel);
-	return 0;
-}
-
-void virtio_gpu_fbdev_fini(struct virtio_gpu_device *vgdev)
-{
-	if (!vgdev->vgfbdev)
-		return;
-
-	virtio_gpu_fbdev_destroy(vgdev->ddev, vgdev->vgfbdev);
-	kfree(vgdev->vgfbdev);
-	vgdev->vgfbdev = NULL;
-}
diff --git a/drivers/gpu/drm/virtio/virtgpu_fence.c b/drivers/gpu/drm/virtio/virtgpu_fence.c
index 00c742a..6dce548 100644
--- a/drivers/gpu/drm/virtio/virtgpu_fence.c
+++ b/drivers/gpu/drm/virtio/virtgpu_fence.c
@@ -24,6 +24,7 @@
  */
 
 #include <drm/drmP.h>
+#include <trace/events/dma_fence.h>
 #include "virtgpu_drv.h"
 
 static const char *virtio_get_driver_name(struct dma_fence *f)
@@ -36,20 +37,18 @@
 	return "controlq";
 }
 
-static bool virtio_signaled(struct dma_fence *f)
+bool virtio_fence_signaled(struct dma_fence *f)
 {
 	struct virtio_gpu_fence *fence = to_virtio_fence(f);
 
-	if (atomic64_read(&fence->drv->last_seq) >= fence->seq)
+	if (atomic64_read(&fence->drv->last_seq) >= fence->f.seqno)
 		return true;
 	return false;
 }
 
 static void virtio_fence_value_str(struct dma_fence *f, char *str, int size)
 {
-	struct virtio_gpu_fence *fence = to_virtio_fence(f);
-
-	snprintf(str, size, "%llu", fence->seq);
+	snprintf(str, size, "%llu", (long long unsigned int) f->seqno);
 }
 
 static void virtio_timeline_value_str(struct dma_fence *f, char *str, int size)
@@ -62,34 +61,47 @@
 static const struct dma_fence_ops virtio_fence_ops = {
 	.get_driver_name     = virtio_get_driver_name,
 	.get_timeline_name   = virtio_get_timeline_name,
-	.signaled            = virtio_signaled,
+	.signaled            = virtio_fence_signaled,
 	.fence_value_str     = virtio_fence_value_str,
 	.timeline_value_str  = virtio_timeline_value_str,
 };
 
-int virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
+struct virtio_gpu_fence *virtio_gpu_fence_alloc(struct virtio_gpu_device *vgdev)
+{
+	struct virtio_gpu_fence_driver *drv = &vgdev->fence_drv;
+	struct virtio_gpu_fence *fence = kzalloc(sizeof(struct virtio_gpu_fence),
+							GFP_KERNEL);
+	if (!fence)
+		return fence;
+
+	fence->drv = drv;
+
+	/* This only partially initializes the fence because the seqno is
+	 * unknown yet.  The fence must not be used outside of the driver
+	 * until virtio_gpu_fence_emit is called.
+	 */
+	dma_fence_init(&fence->f, &virtio_fence_ops, &drv->lock, drv->context, 0);
+
+	return fence;
+}
+
+void virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
 			  struct virtio_gpu_ctrl_hdr *cmd_hdr,
-			  struct virtio_gpu_fence **fence)
+			  struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_fence_driver *drv = &vgdev->fence_drv;
 	unsigned long irq_flags;
 
-	*fence = kmalloc(sizeof(struct virtio_gpu_fence), GFP_ATOMIC);
-	if ((*fence) == NULL)
-		return -ENOMEM;
-
 	spin_lock_irqsave(&drv->lock, irq_flags);
-	(*fence)->drv = drv;
-	(*fence)->seq = ++drv->sync_seq;
-	dma_fence_init(&(*fence)->f, &virtio_fence_ops, &drv->lock,
-		       drv->context, (*fence)->seq);
-	dma_fence_get(&(*fence)->f);
-	list_add_tail(&(*fence)->node, &drv->fences);
+	fence->f.seqno = ++drv->sync_seq;
+	dma_fence_get(&fence->f);
+	list_add_tail(&fence->node, &drv->fences);
 	spin_unlock_irqrestore(&drv->lock, irq_flags);
 
+	trace_dma_fence_emit(&fence->f);
+
 	cmd_hdr->flags |= cpu_to_le32(VIRTIO_GPU_FLAG_FENCE);
-	cmd_hdr->fence_id = cpu_to_le64((*fence)->seq);
-	return 0;
+	cmd_hdr->fence_id = cpu_to_le64(fence->f.seqno);
 }
 
 void virtio_gpu_fence_event_process(struct virtio_gpu_device *vgdev,
@@ -102,7 +114,7 @@
 	spin_lock_irqsave(&drv->lock, irq_flags);
 	atomic64_set(&vgdev->fence_drv.last_seq, last_seq);
 	list_for_each_entry_safe(fence, tmp, &drv->fences, node) {
-		if (last_seq < fence->seq)
+		if (last_seq < fence->f.seqno)
 			continue;
 		dma_fence_signal_locked(&fence->f);
 		list_del(&fence->node);
diff --git a/drivers/gpu/drm/virtio/virtgpu_gem.c b/drivers/gpu/drm/virtio/virtgpu_gem.c
index 0f2768e..a607bd1 100644
--- a/drivers/gpu/drm/virtio/virtgpu_gem.c
+++ b/drivers/gpu/drm/virtio/virtgpu_gem.c
@@ -34,15 +34,16 @@
 		virtio_gpu_object_unref(&obj);
 }
 
-struct virtio_gpu_object *virtio_gpu_alloc_object(struct drm_device *dev,
-						  size_t size, bool kernel,
-						  bool pinned)
+struct virtio_gpu_object*
+virtio_gpu_alloc_object(struct drm_device *dev,
+			struct virtio_gpu_object_params *params,
+			struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_device *vgdev = dev->dev_private;
 	struct virtio_gpu_object *obj;
 	int ret;
 
-	ret = virtio_gpu_object_create(vgdev, size, kernel, pinned, &obj);
+	ret = virtio_gpu_object_create(vgdev, params, &obj, fence);
 	if (ret)
 		return ERR_PTR(ret);
 
@@ -51,7 +52,7 @@
 
 int virtio_gpu_gem_create(struct drm_file *file,
 			  struct drm_device *dev,
-			  uint64_t size,
+			  struct virtio_gpu_object_params *params,
 			  struct drm_gem_object **obj_p,
 			  uint32_t *handle_p)
 {
@@ -59,7 +60,7 @@
 	int ret;
 	u32 handle;
 
-	obj = virtio_gpu_alloc_object(dev, size, false, false);
+	obj = virtio_gpu_alloc_object(dev, params, NULL);
 	if (IS_ERR(obj))
 		return PTR_ERR(obj);
 
@@ -82,35 +83,25 @@
 				struct drm_device *dev,
 				struct drm_mode_create_dumb *args)
 {
-	struct virtio_gpu_device *vgdev = dev->dev_private;
 	struct drm_gem_object *gobj;
-	struct virtio_gpu_object *obj;
+	struct virtio_gpu_object_params params = { 0 };
 	int ret;
 	uint32_t pitch;
-	uint32_t resid;
-	uint32_t format;
 
 	pitch = args->width * ((args->bpp + 1) / 8);
 	args->size = pitch * args->height;
 	args->size = ALIGN(args->size, PAGE_SIZE);
 
-	ret = virtio_gpu_gem_create(file_priv, dev, args->size, &gobj,
+	params.format = virtio_gpu_translate_format(DRM_FORMAT_HOST_XRGB8888);
+	params.width = args->width;
+	params.height = args->height;
+	params.size = args->size;
+	params.dumb = true;
+	ret = virtio_gpu_gem_create(file_priv, dev, &params, &gobj,
 				    &args->handle);
 	if (ret)
 		goto fail;
 
-	format = virtio_gpu_translate_format(DRM_FORMAT_XRGB8888);
-	virtio_gpu_resource_id_get(vgdev, &resid);
-	virtio_gpu_cmd_create_resource(vgdev, resid, format,
-				       args->width, args->height);
-
-	/* attach the object to the resource */
-	obj = gem_to_virtio_gpu_obj(gobj);
-	ret = virtio_gpu_object_attach(vgdev, obj, resid, NULL);
-	if (ret)
-		goto fail;
-
-	obj->dumb = true;
 	args->pitch = pitch;
 	return ret;
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
index 8d2f5de..c0ba1ea 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
@@ -28,6 +28,7 @@
 #include <drm/drmP.h>
 #include <drm/virtgpu_drm.h>
 #include <drm/ttm/ttm_execbuf_util.h>
+#include <linux/sync_file.h>
 
 #include "virtgpu_drv.h"
 
@@ -53,8 +54,8 @@
 					 &virtio_gpu_map->offset);
 }
 
-static int virtio_gpu_object_list_validate(struct ww_acquire_ctx *ticket,
-					   struct list_head *head)
+int virtio_gpu_object_list_validate(struct ww_acquire_ctx *ticket,
+				    struct list_head *head)
 {
 	struct ttm_operation_ctx ctx = { false, false };
 	struct ttm_validate_buffer *buf;
@@ -78,7 +79,7 @@
 	return 0;
 }
 
-static void virtio_gpu_unref_list(struct list_head *head)
+void virtio_gpu_unref_list(struct list_head *head)
 {
 	struct ttm_validate_buffer *buf;
 	struct ttm_buffer_object *bo;
@@ -105,7 +106,7 @@
 	struct virtio_gpu_device *vgdev = dev->dev_private;
 	struct virtio_gpu_fpriv *vfpriv = drm_file->driver_priv;
 	struct drm_gem_object *gobj;
-	struct virtio_gpu_fence *fence;
+	struct virtio_gpu_fence *out_fence;
 	struct virtio_gpu_object *qobj;
 	int ret;
 	uint32_t *bo_handles = NULL;
@@ -114,11 +115,46 @@
 	struct ttm_validate_buffer *buflist = NULL;
 	int i;
 	struct ww_acquire_ctx ticket;
+	struct sync_file *sync_file;
+	int in_fence_fd = exbuf->fence_fd;
+	int out_fence_fd = -1;
 	void *buf;
 
 	if (vgdev->has_virgl_3d == false)
 		return -ENOSYS;
 
+	if ((exbuf->flags & ~VIRTGPU_EXECBUF_FLAGS))
+		return -EINVAL;
+
+	exbuf->fence_fd = -1;
+
+	if (exbuf->flags & VIRTGPU_EXECBUF_FENCE_FD_IN) {
+		struct dma_fence *in_fence;
+
+		in_fence = sync_file_get_fence(in_fence_fd);
+
+		if (!in_fence)
+			return -EINVAL;
+
+		/*
+		 * Wait if the fence is from a foreign context, or if the fence
+		 * array contains any fence from a foreign context.
+		 */
+		ret = 0;
+		if (!dma_fence_match_context(in_fence, vgdev->fence_drv.context))
+			ret = dma_fence_wait(in_fence, true);
+
+		dma_fence_put(in_fence);
+		if (ret)
+			return ret;
+	}
+
+	if (exbuf->flags & VIRTGPU_EXECBUF_FENCE_FD_OUT) {
+		out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
+		if (out_fence_fd < 0)
+			return out_fence_fd;
+	}
+
 	INIT_LIST_HEAD(&validate_list);
 	if (exbuf->num_bo_handles) {
 
@@ -128,26 +164,22 @@
 					   sizeof(struct ttm_validate_buffer),
 					   GFP_KERNEL | __GFP_ZERO);
 		if (!bo_handles || !buflist) {
-			kvfree(bo_handles);
-			kvfree(buflist);
-			return -ENOMEM;
+			ret = -ENOMEM;
+			goto out_unused_fd;
 		}
 
-		user_bo_handles = (void __user *)(uintptr_t)exbuf->bo_handles;
+		user_bo_handles = u64_to_user_ptr(exbuf->bo_handles);
 		if (copy_from_user(bo_handles, user_bo_handles,
 				   exbuf->num_bo_handles * sizeof(uint32_t))) {
 			ret = -EFAULT;
-			kvfree(bo_handles);
-			kvfree(buflist);
-			return ret;
+			goto out_unused_fd;
 		}
 
 		for (i = 0; i < exbuf->num_bo_handles; i++) {
 			gobj = drm_gem_object_lookup(drm_file, bo_handles[i]);
 			if (!gobj) {
-				kvfree(bo_handles);
-				kvfree(buflist);
-				return -ENOENT;
+				ret = -ENOENT;
+				goto out_unused_fd;
 			}
 
 			qobj = gem_to_virtio_gpu_obj(gobj);
@@ -156,34 +188,60 @@
 			list_add(&buflist[i].head, &validate_list);
 		}
 		kvfree(bo_handles);
+		bo_handles = NULL;
 	}
 
 	ret = virtio_gpu_object_list_validate(&ticket, &validate_list);
 	if (ret)
 		goto out_free;
 
-	buf = memdup_user((void __user *)(uintptr_t)exbuf->command,
-			  exbuf->size);
+	buf = memdup_user(u64_to_user_ptr(exbuf->command), exbuf->size);
 	if (IS_ERR(buf)) {
 		ret = PTR_ERR(buf);
 		goto out_unresv;
 	}
-	virtio_gpu_cmd_submit(vgdev, buf, exbuf->size,
-			      vfpriv->ctx_id, &fence);
 
-	ttm_eu_fence_buffer_objects(&ticket, &validate_list, &fence->f);
+	out_fence = virtio_gpu_fence_alloc(vgdev);
+	if(!out_fence) {
+		ret = -ENOMEM;
+		goto out_memdup;
+	}
+
+	if (out_fence_fd >= 0) {
+		sync_file = sync_file_create(&out_fence->f);
+		if (!sync_file) {
+			dma_fence_put(&out_fence->f);
+			ret = -ENOMEM;
+			goto out_memdup;
+		}
+
+		exbuf->fence_fd = out_fence_fd;
+		fd_install(out_fence_fd, sync_file->file);
+	}
+
+	virtio_gpu_cmd_submit(vgdev, buf, exbuf->size,
+			      vfpriv->ctx_id, out_fence);
+
+	ttm_eu_fence_buffer_objects(&ticket, &validate_list, &out_fence->f);
 
 	/* fence the command bo */
 	virtio_gpu_unref_list(&validate_list);
 	kvfree(buflist);
-	dma_fence_put(&fence->f);
 	return 0;
 
+out_memdup:
+	kfree(buf);
 out_unresv:
 	ttm_eu_backoff_reservation(&ticket, &validate_list);
 out_free:
 	virtio_gpu_unref_list(&validate_list);
+out_unused_fd:
+	kvfree(bo_handles);
 	kvfree(buflist);
+
+	if (out_fence_fd >= 0)
+		put_unused_fd(out_fence_fd);
+
 	return ret;
 }
 
@@ -204,10 +262,9 @@
 	default:
 		return -EINVAL;
 	}
-	if (copy_to_user((void __user *)(unsigned long)param->value,
-			 &value, sizeof(int))) {
+	if (copy_to_user(u64_to_user_ptr(param->value), &value, sizeof(int)))
 		return -EFAULT;
-	}
+
 	return 0;
 }
 
@@ -216,17 +273,12 @@
 {
 	struct virtio_gpu_device *vgdev = dev->dev_private;
 	struct drm_virtgpu_resource_create *rc = data;
+	struct virtio_gpu_fence *fence;
 	int ret;
-	uint32_t res_id;
 	struct virtio_gpu_object *qobj;
 	struct drm_gem_object *obj;
 	uint32_t handle = 0;
-	uint32_t size;
-	struct list_head validate_list;
-	struct ttm_validate_buffer mainbuf;
-	struct virtio_gpu_fence *fence = NULL;
-	struct ww_acquire_ctx ticket;
-	struct virtio_gpu_resource_create_3d rc_3d;
+	struct virtio_gpu_object_params params = { 0 };
 
 	if (vgdev->has_virgl_3d == false) {
 		if (rc->depth > 1)
@@ -241,94 +293,43 @@
 			return -EINVAL;
 	}
 
-	INIT_LIST_HEAD(&validate_list);
-	memset(&mainbuf, 0, sizeof(struct ttm_validate_buffer));
-
-	virtio_gpu_resource_id_get(vgdev, &res_id);
-
-	size = rc->size;
-
+	params.format = rc->format;
+	params.width = rc->width;
+	params.height = rc->height;
+	params.size = rc->size;
+	if (vgdev->has_virgl_3d) {
+		params.virgl = true;
+		params.target = rc->target;
+		params.bind = rc->bind;
+		params.depth = rc->depth;
+		params.array_size = rc->array_size;
+		params.last_level = rc->last_level;
+		params.nr_samples = rc->nr_samples;
+		params.flags = rc->flags;
+	}
 	/* allocate a single page size object */
-	if (size == 0)
-		size = PAGE_SIZE;
+	if (params.size == 0)
+		params.size = PAGE_SIZE;
 
-	qobj = virtio_gpu_alloc_object(dev, size, false, false);
-	if (IS_ERR(qobj)) {
-		ret = PTR_ERR(qobj);
-		goto fail_id;
-	}
+	fence = virtio_gpu_fence_alloc(vgdev);
+	if (!fence)
+		return -ENOMEM;
+	qobj = virtio_gpu_alloc_object(dev, &params, fence);
+	dma_fence_put(&fence->f);
+	if (IS_ERR(qobj))
+		return PTR_ERR(qobj);
 	obj = &qobj->gem_base;
 
-	if (!vgdev->has_virgl_3d) {
-		virtio_gpu_cmd_create_resource(vgdev, res_id, rc->format,
-					       rc->width, rc->height);
-
-		ret = virtio_gpu_object_attach(vgdev, qobj, res_id, NULL);
-	} else {
-		/* use a gem reference since unref list undoes them */
-		drm_gem_object_get(&qobj->gem_base);
-		mainbuf.bo = &qobj->tbo;
-		list_add(&mainbuf.head, &validate_list);
-
-		ret = virtio_gpu_object_list_validate(&ticket, &validate_list);
-		if (ret) {
-			DRM_DEBUG("failed to validate\n");
-			goto fail_unref;
-		}
-
-		rc_3d.resource_id = cpu_to_le32(res_id);
-		rc_3d.target = cpu_to_le32(rc->target);
-		rc_3d.format = cpu_to_le32(rc->format);
-		rc_3d.bind = cpu_to_le32(rc->bind);
-		rc_3d.width = cpu_to_le32(rc->width);
-		rc_3d.height = cpu_to_le32(rc->height);
-		rc_3d.depth = cpu_to_le32(rc->depth);
-		rc_3d.array_size = cpu_to_le32(rc->array_size);
-		rc_3d.last_level = cpu_to_le32(rc->last_level);
-		rc_3d.nr_samples = cpu_to_le32(rc->nr_samples);
-		rc_3d.flags = cpu_to_le32(rc->flags);
-
-		virtio_gpu_cmd_resource_create_3d(vgdev, &rc_3d, NULL);
-		ret = virtio_gpu_object_attach(vgdev, qobj, res_id, &fence);
-		if (ret) {
-			ttm_eu_backoff_reservation(&ticket, &validate_list);
-			goto fail_unref;
-		}
-		ttm_eu_fence_buffer_objects(&ticket, &validate_list, &fence->f);
-	}
-
-	qobj->hw_res_handle = res_id;
-
 	ret = drm_gem_handle_create(file_priv, obj, &handle);
 	if (ret) {
-
 		drm_gem_object_release(obj);
-		if (vgdev->has_virgl_3d) {
-			virtio_gpu_unref_list(&validate_list);
-			dma_fence_put(&fence->f);
-		}
 		return ret;
 	}
 	drm_gem_object_put_unlocked(obj);
 
-	rc->res_handle = res_id; /* similiar to a VM address */
+	rc->res_handle = qobj->hw_res_handle; /* similiar to a VM address */
 	rc->bo_handle = handle;
-
-	if (vgdev->has_virgl_3d) {
-		virtio_gpu_unref_list(&validate_list);
-		dma_fence_put(&fence->f);
-	}
 	return 0;
-fail_unref:
-	if (vgdev->has_virgl_3d) {
-		virtio_gpu_unref_list(&validate_list);
-		dma_fence_put(&fence->f);
-	}
-//fail_obj:
-//	drm_gem_object_handle_unreference_unlocked(obj);
-fail_id:
-	virtio_gpu_resource_id_put(vgdev, res_id);
-	return ret;
 }
 
 static int virtio_gpu_resource_info_ioctl(struct drm_device *dev, void *data,
@@ -383,10 +384,16 @@
 		goto out_unres;
 
 	convert_to_hw_box(&box, &args->box);
+
+	fence = virtio_gpu_fence_alloc(vgdev);
+	if (!fence) {
+		ret = -ENOMEM;
+		goto out_unres;
+	}
 	virtio_gpu_cmd_transfer_from_host_3d
 		(vgdev, qobj->hw_res_handle,
 		 vfpriv->ctx_id, offset, args->level,
-		 &box, &fence);
+		 &box, fence);
 	reservation_object_add_excl_fence(qobj->tbo.resv,
 					  &fence->f);
 
@@ -429,13 +436,18 @@
 	convert_to_hw_box(&box, &args->box);
 	if (!vgdev->has_virgl_3d) {
 		virtio_gpu_cmd_transfer_to_host_2d
-			(vgdev, qobj->hw_res_handle, offset,
+			(vgdev, qobj, offset,
 			 box.w, box.h, box.x, box.y, NULL);
 	} else {
+		fence = virtio_gpu_fence_alloc(vgdev);
+		if (!fence) {
+			ret = -ENOMEM;
+			goto out_unres;
+		}
 		virtio_gpu_cmd_transfer_to_host_3d
-			(vgdev, qobj->hw_res_handle,
+			(vgdev, qobj,
 			 vfpriv ? vfpriv->ctx_id : 0, offset,
-			 args->level, &box, &fence);
+			 args->level, &box, fence);
 		reservation_object_add_excl_fence(qobj->tbo.resv,
 						  &fence->f);
 		dma_fence_put(&fence->f);
@@ -512,7 +524,6 @@
 	list_for_each_entry(cache_ent, &vgdev->cap_cache, head) {
 		if (cache_ent->id == args->cap_set_id &&
 		    cache_ent->version == args->cap_set_ver) {
-			ptr = cache_ent->caps_cache;
 			spin_unlock(&vgdev->display_info_lock);
 			goto copy_exit;
 		}
@@ -523,6 +534,7 @@
 	virtio_gpu_cmd_get_capset(vgdev, found_valid, args->cap_set_ver,
 				  &cache_ent);
 
+copy_exit:
 	ret = wait_event_timeout(vgdev->resp_wq,
 				 atomic_read(&cache_ent->is_valid), 5 * HZ);
 	if (!ret)
@@ -533,8 +545,7 @@
 
 	ptr = cache_ent->caps_cache;
 
-copy_exit:
-	if (copy_to_user((void __user *)(unsigned long)args->addr, ptr, size))
+	if (copy_to_user(u64_to_user_ptr(args->addr), ptr, size))
 		return -EFAULT;
 
 	return 0;
@@ -542,34 +553,34 @@
 
 struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
 	DRM_IOCTL_DEF_DRV(VIRTGPU_MAP, virtio_gpu_map_ioctl,
-			  DRM_AUTH | DRM_UNLOCKED | DRM_RENDER_ALLOW),
+			  DRM_AUTH | DRM_RENDER_ALLOW),
 
 	DRM_IOCTL_DEF_DRV(VIRTGPU_EXECBUFFER, virtio_gpu_execbuffer_ioctl,
-			  DRM_AUTH | DRM_UNLOCKED | DRM_RENDER_ALLOW),
+			  DRM_AUTH | DRM_RENDER_ALLOW),
 
 	DRM_IOCTL_DEF_DRV(VIRTGPU_GETPARAM, virtio_gpu_getparam_ioctl,
-			  DRM_AUTH | DRM_UNLOCKED | DRM_RENDER_ALLOW),
+			  DRM_AUTH | DRM_RENDER_ALLOW),
 
 	DRM_IOCTL_DEF_DRV(VIRTGPU_RESOURCE_CREATE,
 			  virtio_gpu_resource_create_ioctl,
-			  DRM_AUTH | DRM_UNLOCKED | DRM_RENDER_ALLOW),
+			  DRM_AUTH | DRM_RENDER_ALLOW),
 
 	DRM_IOCTL_DEF_DRV(VIRTGPU_RESOURCE_INFO, virtio_gpu_resource_info_ioctl,
-			  DRM_AUTH | DRM_UNLOCKED | DRM_RENDER_ALLOW),
+			  DRM_AUTH | DRM_RENDER_ALLOW),
 
 	/* make transfer async to the main ring? - no sure, can we
 	 * thread these in the underlying GL
 	 */
 	DRM_IOCTL_DEF_DRV(VIRTGPU_TRANSFER_FROM_HOST,
 			  virtio_gpu_transfer_from_host_ioctl,
-			  DRM_AUTH | DRM_UNLOCKED | DRM_RENDER_ALLOW),
+			  DRM_AUTH | DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(VIRTGPU_TRANSFER_TO_HOST,
 			  virtio_gpu_transfer_to_host_ioctl,
-			  DRM_AUTH | DRM_UNLOCKED | DRM_RENDER_ALLOW),
+			  DRM_AUTH | DRM_RENDER_ALLOW),
 
 	DRM_IOCTL_DEF_DRV(VIRTGPU_WAIT, virtio_gpu_wait_ioctl,
-			  DRM_AUTH | DRM_UNLOCKED | DRM_RENDER_ALLOW),
+			  DRM_AUTH | DRM_RENDER_ALLOW),
 
 	DRM_IOCTL_DEF_DRV(VIRTGPU_GET_CAPS, virtio_gpu_get_caps_ioctl,
-			  DRM_AUTH | DRM_UNLOCKED | DRM_RENDER_ALLOW),
+			  DRM_AUTH | DRM_RENDER_ALLOW),
 };
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 65060c0..c340be2 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -28,11 +28,6 @@
 #include <drm/drmP.h>
 #include "virtgpu_drv.h"
 
-static int virtio_gpu_fbdev = 1;
-
-MODULE_PARM_DESC(fbdev, "Disable/Enable framebuffer device & console");
-module_param_named(fbdev, virtio_gpu_fbdev, int, 0400);
-
 static void virtio_gpu_config_changed_work_func(struct work_struct *work)
 {
 	struct virtio_gpu_device *vgdev =
@@ -44,6 +39,8 @@
 	virtio_cread(vgdev->vdev, struct virtio_gpu_config,
 		     events_read, &events_read);
 	if (events_read & VIRTIO_GPU_EVENT_DISPLAY) {
+		if (vgdev->has_edid)
+			virtio_gpu_cmd_get_edids(vgdev);
 		virtio_gpu_cmd_get_display_info(vgdev);
 		drm_helper_hpd_irq_event(vgdev->ddev);
 		events_clear |= VIRTIO_GPU_EVENT_DISPLAY;
@@ -52,39 +49,23 @@
 		      events_clear, &events_clear);
 }
 
-static void virtio_gpu_ctx_id_get(struct virtio_gpu_device *vgdev,
-				  uint32_t *resid)
+static int virtio_gpu_context_create(struct virtio_gpu_device *vgdev,
+				      uint32_t nlen, const char *name)
 {
-	int handle;
+	int handle = ida_alloc(&vgdev->ctx_id_ida, GFP_KERNEL);
 
-	idr_preload(GFP_KERNEL);
-	spin_lock(&vgdev->ctx_id_idr_lock);
-	handle = idr_alloc(&vgdev->ctx_id_idr, NULL, 1, 0, 0);
-	spin_unlock(&vgdev->ctx_id_idr_lock);
-	idr_preload_end();
-	*resid = handle;
-}
-
-static void virtio_gpu_ctx_id_put(struct virtio_gpu_device *vgdev, uint32_t id)
-{
-	spin_lock(&vgdev->ctx_id_idr_lock);
-	idr_remove(&vgdev->ctx_id_idr, id);
-	spin_unlock(&vgdev->ctx_id_idr_lock);
-}
-
-static void virtio_gpu_context_create(struct virtio_gpu_device *vgdev,
-				      uint32_t nlen, const char *name,
-				      uint32_t *ctx_id)
-{
-	virtio_gpu_ctx_id_get(vgdev, ctx_id);
-	virtio_gpu_cmd_context_create(vgdev, *ctx_id, nlen, name);
+	if (handle < 0)
+		return handle;
+	handle += 1;
+	virtio_gpu_cmd_context_create(vgdev, handle, nlen, name);
+	return handle;
 }
 
 static void virtio_gpu_context_destroy(struct virtio_gpu_device *vgdev,
 				      uint32_t ctx_id)
 {
 	virtio_gpu_cmd_context_destroy(vgdev, ctx_id);
-	virtio_gpu_ctx_id_put(vgdev, ctx_id);
+	ida_free(&vgdev->ctx_id_ida, ctx_id - 1);
 }
 
 static void virtio_gpu_init_vq(struct virtio_gpu_queue *vgvq,
@@ -151,10 +132,8 @@
 	vgdev->dev = dev->dev;
 
 	spin_lock_init(&vgdev->display_info_lock);
-	spin_lock_init(&vgdev->ctx_id_idr_lock);
-	idr_init(&vgdev->ctx_id_idr);
-	spin_lock_init(&vgdev->resource_idr_lock);
-	idr_init(&vgdev->resource_idr);
+	ida_init(&vgdev->ctx_id_ida);
+	ida_init(&vgdev->resource_ida);
 	init_waitqueue_head(&vgdev->resp_wq);
 	virtio_gpu_init_vq(&vgdev->ctrlq, virtio_gpu_dequeue_ctrl_func);
 	virtio_gpu_init_vq(&vgdev->cursorq, virtio_gpu_dequeue_cursor_func);
@@ -174,6 +153,10 @@
 #else
 	DRM_INFO("virgl 3d acceleration not supported by guest\n");
 #endif
+	if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_EDID)) {
+		vgdev->has_edid = true;
+		DRM_INFO("EDID support available.\n");
+	}
 
 	ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
 	if (ret) {
@@ -219,12 +202,11 @@
 
 	if (num_capsets)
 		virtio_gpu_get_capsets(vgdev, num_capsets);
+	if (vgdev->has_edid)
+		virtio_gpu_cmd_get_edids(vgdev);
 	virtio_gpu_cmd_get_display_info(vgdev);
 	wait_event_timeout(vgdev->resp_wq, !vgdev->display_info_pending,
 			   5 * HZ);
-	if (virtio_gpu_fbdev)
-		virtio_gpu_fbdev_init(vgdev);
-
 	return 0;
 
 err_modeset:
@@ -257,6 +239,7 @@
 	flush_work(&vgdev->ctrlq.dequeue_work);
 	flush_work(&vgdev->cursorq.dequeue_work);
 	flush_work(&vgdev->config_changed_work);
+	vgdev->vdev->config->reset(vgdev->vdev);
 	vgdev->vdev->config->del_vqs(vgdev->vdev);
 
 	virtio_gpu_modeset_fini(vgdev);
@@ -271,7 +254,7 @@
 {
 	struct virtio_gpu_device *vgdev = dev->dev_private;
 	struct virtio_gpu_fpriv *vfpriv;
-	uint32_t id;
+	int id;
 	char dbgname[TASK_COMM_LEN];
 
 	/* can't create contexts without 3d renderer */
@@ -284,7 +267,11 @@
 		return -ENOMEM;
 
 	get_task_comm(dbgname, current);
-	virtio_gpu_context_create(vgdev, strlen(dbgname), dbgname, &id);
+	id = virtio_gpu_context_create(vgdev, strlen(dbgname), dbgname);
+	if (id < 0) {
+		kfree(vfpriv);
+		return id;
+	}
 
 	vfpriv->ctx_id = id;
 	file->driver_priv = vfpriv;
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
index 9f2f470..aaeceb7 100644
--- a/drivers/gpu/drm/virtio/virtgpu_object.c
+++ b/drivers/gpu/drm/virtio/virtgpu_object.c
@@ -23,8 +23,40 @@
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#include <drm/ttm/ttm_execbuf_util.h>
+
 #include "virtgpu_drv.h"
 
+static int virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
+				       uint32_t *resid)
+{
+#if 0
+	int handle = ida_alloc(&vgdev->resource_ida, GFP_KERNEL);
+
+	if (handle < 0)
+		return handle;
+#else
+	static int handle;
+
+	/*
+	 * FIXME: dirty hack to avoid re-using IDs, virglrenderer
+	 * can't deal with that.  Needs fixing in virglrenderer, also
+	 * should figure a better way to handle that in the guest.
+	 */
+	handle++;
+#endif
+
+	*resid = handle + 1;
+	return 0;
+}
+
+static void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id)
+{
+#if 0
+	ida_free(&vgdev->resource_ida, id - 1);
+#endif
+}
+
 static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
 {
 	struct virtio_gpu_object *bo;
@@ -33,88 +65,130 @@
 	bo = container_of(tbo, struct virtio_gpu_object, tbo);
 	vgdev = (struct virtio_gpu_device *)bo->gem_base.dev->dev_private;
 
-	if (bo->hw_res_handle)
+	if (bo->created)
 		virtio_gpu_cmd_unref_resource(vgdev, bo->hw_res_handle);
 	if (bo->pages)
 		virtio_gpu_object_free_sg_table(bo);
 	drm_gem_object_release(&bo->gem_base);
+	virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle);
 	kfree(bo);
 }
 
-static void virtio_gpu_init_ttm_placement(struct virtio_gpu_object *vgbo,
-					  bool pinned)
+static void virtio_gpu_init_ttm_placement(struct virtio_gpu_object *vgbo)
 {
 	u32 c = 1;
-	u32 pflag = pinned ? TTM_PL_FLAG_NO_EVICT : 0;
 
 	vgbo->placement.placement = &vgbo->placement_code;
 	vgbo->placement.busy_placement = &vgbo->placement_code;
 	vgbo->placement_code.fpfn = 0;
 	vgbo->placement_code.lpfn = 0;
 	vgbo->placement_code.flags =
-		TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT | pflag;
+		TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT |
+		TTM_PL_FLAG_NO_EVICT;
 	vgbo->placement.num_placement = c;
 	vgbo->placement.num_busy_placement = c;
 
 }
 
 int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
-			     unsigned long size, bool kernel, bool pinned,
-			     struct virtio_gpu_object **bo_ptr)
+			     struct virtio_gpu_object_params *params,
+			     struct virtio_gpu_object **bo_ptr,
+			     struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_object *bo;
-	enum ttm_bo_type type;
 	size_t acc_size;
 	int ret;
 
-	if (kernel)
-		type = ttm_bo_type_kernel;
-	else
-		type = ttm_bo_type_device;
 	*bo_ptr = NULL;
 
-	acc_size = ttm_bo_dma_acc_size(&vgdev->mman.bdev, size,
+	acc_size = ttm_bo_dma_acc_size(&vgdev->mman.bdev, params->size,
 				       sizeof(struct virtio_gpu_object));
 
 	bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL);
 	if (bo == NULL)
 		return -ENOMEM;
-	size = roundup(size, PAGE_SIZE);
-	ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size);
-	if (ret != 0) {
+	ret = virtio_gpu_resource_id_get(vgdev, &bo->hw_res_handle);
+	if (ret < 0) {
 		kfree(bo);
 		return ret;
 	}
-	bo->dumb = false;
-	virtio_gpu_init_ttm_placement(bo, pinned);
+	params->size = roundup(params->size, PAGE_SIZE);
+	ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, params->size);
+	if (ret != 0) {
+		virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle);
+		kfree(bo);
+		return ret;
+	}
+	bo->dumb = params->dumb;
 
-	ret = ttm_bo_init(&vgdev->mman.bdev, &bo->tbo, size, type,
-			  &bo->placement, 0, !kernel, acc_size,
-			  NULL, NULL, &virtio_gpu_ttm_bo_destroy);
+	if (params->virgl) {
+		virtio_gpu_cmd_resource_create_3d(vgdev, bo, params, fence);
+	} else {
+		virtio_gpu_cmd_create_resource(vgdev, bo, params, fence);
+	}
+
+	virtio_gpu_init_ttm_placement(bo);
+	ret = ttm_bo_init(&vgdev->mman.bdev, &bo->tbo, params->size,
+			  ttm_bo_type_device, &bo->placement, 0,
+			  true, acc_size, NULL, NULL,
+			  &virtio_gpu_ttm_bo_destroy);
 	/* ttm_bo_init failure will call the destroy */
 	if (ret != 0)
 		return ret;
 
+	if (fence) {
+		struct virtio_gpu_fence_driver *drv = &vgdev->fence_drv;
+		struct list_head validate_list;
+		struct ttm_validate_buffer mainbuf;
+		struct ww_acquire_ctx ticket;
+		unsigned long irq_flags;
+		bool signaled;
+
+		INIT_LIST_HEAD(&validate_list);
+		memset(&mainbuf, 0, sizeof(struct ttm_validate_buffer));
+
+		/* use a gem reference since unref list undoes them */
+		drm_gem_object_get(&bo->gem_base);
+		mainbuf.bo = &bo->tbo;
+		list_add(&mainbuf.head, &validate_list);
+
+		ret = virtio_gpu_object_list_validate(&ticket, &validate_list);
+		if (ret == 0) {
+			spin_lock_irqsave(&drv->lock, irq_flags);
+			signaled = virtio_fence_signaled(&fence->f);
+			if (!signaled)
+				/* virtio create command still in flight */
+				ttm_eu_fence_buffer_objects(&ticket, &validate_list,
+							    &fence->f);
+			spin_unlock_irqrestore(&drv->lock, irq_flags);
+			if (signaled)
+				/* virtio create command finished */
+				ttm_eu_backoff_reservation(&ticket, &validate_list);
+		}
+		virtio_gpu_unref_list(&validate_list);
+	}
+
 	*bo_ptr = bo;
 	return 0;
 }
 
-int virtio_gpu_object_kmap(struct virtio_gpu_object *bo, void **ptr)
+void virtio_gpu_object_kunmap(struct virtio_gpu_object *bo)
+{
+	bo->vmap = NULL;
+	ttm_bo_kunmap(&bo->kmap);
+}
+
+int virtio_gpu_object_kmap(struct virtio_gpu_object *bo)
 {
 	bool is_iomem;
 	int r;
 
-	if (bo->vmap) {
-		if (ptr)
-			*ptr = bo->vmap;
-		return 0;
-	}
+	WARN_ON(bo->vmap);
+
 	r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.num_pages, &bo->kmap);
 	if (r)
 		return r;
 	bo->vmap = ttm_kmap_obj_virtual(&bo->kmap, &is_iomem);
-	if (ptr)
-		*ptr = bo->vmap;
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c
index dc5b5b2..7eaac3b 100644
--- a/drivers/gpu/drm/virtio/virtgpu_plane.c
+++ b/drivers/gpu/drm/virtio/virtgpu_plane.c
@@ -152,13 +152,13 @@
 	if (WARN_ON(!output))
 		return;
 
-	if (plane->state->fb) {
+	if (plane->state->fb && output->enabled) {
 		vgfb = to_virtio_gpu_framebuffer(plane->state->fb);
 		bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
 		handle = bo->hw_res_handle;
 		if (bo->dumb) {
 			virtio_gpu_cmd_transfer_to_host_2d
-				(vgdev, handle, 0,
+				(vgdev, bo, 0,
 				 cpu_to_le32(plane->state->src_w >> 16),
 				 cpu_to_le32(plane->state->src_h >> 16),
 				 cpu_to_le32(plane->state->src_x >> 16),
@@ -180,11 +180,49 @@
 				   plane->state->src_h >> 16,
 				   plane->state->src_x >> 16,
 				   plane->state->src_y >> 16);
-	virtio_gpu_cmd_resource_flush(vgdev, handle,
-				      plane->state->src_x >> 16,
-				      plane->state->src_y >> 16,
-				      plane->state->src_w >> 16,
-				      plane->state->src_h >> 16);
+	if (handle)
+		virtio_gpu_cmd_resource_flush(vgdev, handle,
+					      plane->state->src_x >> 16,
+					      plane->state->src_y >> 16,
+					      plane->state->src_w >> 16,
+					      plane->state->src_h >> 16);
+}
+
+static int virtio_gpu_cursor_prepare_fb(struct drm_plane *plane,
+					struct drm_plane_state *new_state)
+{
+	struct drm_device *dev = plane->dev;
+	struct virtio_gpu_device *vgdev = dev->dev_private;
+	struct virtio_gpu_framebuffer *vgfb;
+	struct virtio_gpu_object *bo;
+
+	if (!new_state->fb)
+		return 0;
+
+	vgfb = to_virtio_gpu_framebuffer(new_state->fb);
+	bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
+	if (bo && bo->dumb && (plane->state->fb != new_state->fb)) {
+		vgfb->fence = virtio_gpu_fence_alloc(vgdev);
+		if (!vgfb->fence)
+			return -ENOMEM;
+	}
+
+	return 0;
+}
+
+static void virtio_gpu_cursor_cleanup_fb(struct drm_plane *plane,
+					 struct drm_plane_state *old_state)
+{
+	struct virtio_gpu_framebuffer *vgfb;
+
+	if (!plane->state->fb)
+		return;
+
+	vgfb = to_virtio_gpu_framebuffer(plane->state->fb);
+	if (vgfb->fence) {
+		dma_fence_put(&vgfb->fence->f);
+		vgfb->fence = NULL;
+	}
 }
 
 static void virtio_gpu_cursor_plane_update(struct drm_plane *plane,
@@ -194,7 +232,6 @@
 	struct virtio_gpu_device *vgdev = dev->dev_private;
 	struct virtio_gpu_output *output = NULL;
 	struct virtio_gpu_framebuffer *vgfb;
-	struct virtio_gpu_fence *fence = NULL;
 	struct virtio_gpu_object *bo = NULL;
 	uint32_t handle;
 	int ret = 0;
@@ -217,16 +254,16 @@
 	if (bo && bo->dumb && (plane->state->fb != old_state->fb)) {
 		/* new cursor -- update & wait */
 		virtio_gpu_cmd_transfer_to_host_2d
-			(vgdev, handle, 0,
+			(vgdev, bo, 0,
 			 cpu_to_le32(plane->state->crtc_w),
 			 cpu_to_le32(plane->state->crtc_h),
-			 0, 0, &fence);
+			 0, 0, vgfb->fence);
 		ret = virtio_gpu_object_reserve(bo, false);
 		if (!ret) {
 			reservation_object_add_excl_fence(bo->tbo.resv,
-							  &fence->f);
-			dma_fence_put(&fence->f);
-			fence = NULL;
+							  &vgfb->fence->f);
+			dma_fence_put(&vgfb->fence->f);
+			vgfb->fence = NULL;
 			virtio_gpu_object_unreserve(bo);
 			virtio_gpu_object_wait(bo, false);
 		}
@@ -268,6 +305,8 @@
 };
 
 static const struct drm_plane_helper_funcs virtio_gpu_cursor_helper_funcs = {
+	.prepare_fb		= virtio_gpu_cursor_prepare_fb,
+	.cleanup_fb		= virtio_gpu_cursor_cleanup_fb,
 	.atomic_check		= virtio_gpu_plane_atomic_check,
 	.atomic_update		= virtio_gpu_cursor_plane_update,
 };
diff --git a/drivers/gpu/drm/virtio/virtgpu_prime.c b/drivers/gpu/drm/virtio/virtgpu_prime.c
index d27a168..4bbdaed 100644
--- a/drivers/gpu/drm/virtio/virtgpu_prime.c
+++ b/drivers/gpu/drm/virtio/virtgpu_prime.c
@@ -28,21 +28,16 @@
  * device that might share buffers with virtgpu
  */
 
-int virtgpu_gem_prime_pin(struct drm_gem_object *obj)
-{
-	WARN_ONCE(1, "not implemented");
-	return -ENODEV;
-}
-
-void virtgpu_gem_prime_unpin(struct drm_gem_object *obj)
-{
-	WARN_ONCE(1, "not implemented");
-}
-
 struct sg_table *virtgpu_gem_prime_get_sg_table(struct drm_gem_object *obj)
 {
-	WARN_ONCE(1, "not implemented");
-	return ERR_PTR(-ENODEV);
+	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
+
+	if (!bo->tbo.ttm->pages || !bo->tbo.ttm->num_pages)
+		/* should not happen */
+		return ERR_PTR(-EINVAL);
+
+	return drm_prime_pages_to_sg(bo->tbo.ttm->pages,
+				     bo->tbo.ttm->num_pages);
 }
 
 struct drm_gem_object *virtgpu_gem_prime_import_sg_table(
@@ -55,17 +50,25 @@
 
 void *virtgpu_gem_prime_vmap(struct drm_gem_object *obj)
 {
-	WARN_ONCE(1, "not implemented");
-	return ERR_PTR(-ENODEV);
+	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
+	int ret;
+
+	ret = virtio_gpu_object_kmap(bo);
+	if (ret)
+		return NULL;
+	return bo->vmap;
 }
 
 void virtgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
 {
-	WARN_ONCE(1, "not implemented");
+	virtio_gpu_object_kunmap(gem_to_virtio_gpu_obj(obj));
 }
 
 int virtgpu_gem_prime_mmap(struct drm_gem_object *obj,
-		       struct vm_area_struct *area)
+			   struct vm_area_struct *vma)
 {
-	return -ENODEV;
+	struct virtio_gpu_object *bo = gem_to_virtio_gpu_obj(obj);
+
+	bo->gem_base.vma_node.vm_node.start = bo->tbo.vma_node.vm_node.start;
+	return drm_gem_prime_mmap(obj, vma);
 }
diff --git a/drivers/gpu/drm/virtio/virtgpu_trace.h b/drivers/gpu/drm/virtio/virtgpu_trace.h
new file mode 100644
index 0000000..711ecc2
--- /dev/null
+++ b/drivers/gpu/drm/virtio/virtgpu_trace.h
@@ -0,0 +1,52 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#if !defined(_VIRTGPU_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
+#define _VIRTGPU_TRACE_H_
+
+#include <linux/tracepoint.h>
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM virtio_gpu
+#define TRACE_INCLUDE_FILE virtgpu_trace
+
+DECLARE_EVENT_CLASS(virtio_gpu_cmd,
+	TP_PROTO(struct virtqueue *vq, struct virtio_gpu_ctrl_hdr *hdr),
+	TP_ARGS(vq, hdr),
+	TP_STRUCT__entry(
+			 __field(int, dev)
+			 __field(unsigned int, vq)
+			 __field(const char *, name)
+			 __field(u32, type)
+			 __field(u32, flags)
+			 __field(u64, fence_id)
+			 __field(u32, ctx_id)
+			 ),
+	TP_fast_assign(
+		       __entry->dev = vq->vdev->index;
+		       __entry->vq = vq->index;
+		       __entry->name = vq->name;
+		       __entry->type = le32_to_cpu(hdr->type);
+		       __entry->flags = le32_to_cpu(hdr->flags);
+		       __entry->fence_id = le64_to_cpu(hdr->fence_id);
+		       __entry->ctx_id = le32_to_cpu(hdr->ctx_id);
+		       ),
+	TP_printk("vdev=%d vq=%u name=%s type=0x%x flags=0x%x fence_id=%llu ctx_id=%u",
+		  __entry->dev, __entry->vq, __entry->name,
+		  __entry->type, __entry->flags, __entry->fence_id,
+		  __entry->ctx_id)
+);
+
+DEFINE_EVENT(virtio_gpu_cmd, virtio_gpu_cmd_queue,
+	TP_PROTO(struct virtqueue *vq, struct virtio_gpu_ctrl_hdr *hdr),
+	TP_ARGS(vq, hdr)
+);
+
+DEFINE_EVENT(virtio_gpu_cmd, virtio_gpu_cmd_response,
+	TP_PROTO(struct virtqueue *vq, struct virtio_gpu_ctrl_hdr *hdr),
+	TP_ARGS(vq, hdr)
+);
+
+#endif
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/virtio
+#include <trace/define_trace.h>
diff --git a/drivers/gpu/drm/virtio/virtgpu_trace_points.c b/drivers/gpu/drm/virtio/virtgpu_trace_points.c
new file mode 100644
index 0000000..1970cb6
--- /dev/null
+++ b/drivers/gpu/drm/virtio/virtgpu_trace_points.c
@@ -0,0 +1,5 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "virtgpu_drv.h"
+
+#define CREATE_TRACE_POINTS
+#include "virtgpu_trace.h"
diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
index 11f8ae5..8f78002 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
@@ -106,29 +106,6 @@
 	}
 }
 
-#if 0
-/*
- * Hmm, seems to not do anything useful.  Leftover debug hack?
- * Something like printing pagefaults to kernel log?
- */
-static struct vm_operations_struct virtio_gpu_ttm_vm_ops;
-static const struct vm_operations_struct *ttm_vm_ops;
-
-static int virtio_gpu_ttm_fault(struct vm_fault *vmf)
-{
-	struct ttm_buffer_object *bo;
-	struct virtio_gpu_device *vgdev;
-	int r;
-
-	bo = (struct ttm_buffer_object *)vmf->vma->vm_private_data;
-	if (bo == NULL)
-		return VM_FAULT_NOPAGE;
-	vgdev = virtio_gpu_get_vgdev(bo->bdev);
-	r = ttm_vm_ops->fault(vmf);
-	return r;
-}
-#endif
-
 int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma)
 {
 	struct drm_file *file_priv;
@@ -143,19 +120,8 @@
 		return -EINVAL;
 	}
 	r = ttm_bo_mmap(filp, vma, &vgdev->mman.bdev);
-#if 0
-	if (unlikely(r != 0))
-		return r;
-	if (unlikely(ttm_vm_ops == NULL)) {
-		ttm_vm_ops = vma->vm_ops;
-		virtio_gpu_ttm_vm_ops = *ttm_vm_ops;
-		virtio_gpu_ttm_vm_ops.fault = &virtio_gpu_ttm_fault;
-	}
-	vma->vm_ops = &virtio_gpu_ttm_vm_ops;
-	return 0;
-#else
+
 	return r;
-#endif
 }
 
 static int virtio_gpu_invalidate_caches(struct ttm_bo_device *bdev,
@@ -206,10 +172,6 @@
 static int virtio_gpu_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
 				    struct ttm_mem_type_manager *man)
 {
-	struct virtio_gpu_device *vgdev;
-
-	vgdev = virtio_gpu_get_vgdev(bdev);
-
 	switch (type) {
 	case TTM_PL_SYSTEM:
 		/* System memory */
@@ -284,42 +246,45 @@
  */
 struct virtio_gpu_ttm_tt {
 	struct ttm_dma_tt		ttm;
-	struct virtio_gpu_device	*vgdev;
-	u64				offset;
+	struct virtio_gpu_object        *obj;
 };
 
-static int virtio_gpu_ttm_backend_bind(struct ttm_tt *ttm,
-				       struct ttm_mem_reg *bo_mem)
+static int virtio_gpu_ttm_tt_bind(struct ttm_tt *ttm,
+				  struct ttm_mem_reg *bo_mem)
 {
-	struct virtio_gpu_ttm_tt *gtt = (void *)ttm;
+	struct virtio_gpu_ttm_tt *gtt =
+		container_of(ttm, struct virtio_gpu_ttm_tt, ttm.ttm);
+	struct virtio_gpu_device *vgdev =
+		virtio_gpu_get_vgdev(gtt->obj->tbo.bdev);
 
-	gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT);
-	if (!ttm->num_pages)
-		WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n",
-		     ttm->num_pages, bo_mem, ttm);
-
-	/* Not implemented */
+	virtio_gpu_object_attach(vgdev, gtt->obj, NULL);
 	return 0;
 }
 
-static int virtio_gpu_ttm_backend_unbind(struct ttm_tt *ttm)
+static int virtio_gpu_ttm_tt_unbind(struct ttm_tt *ttm)
 {
-	/* Not implemented */
+	struct virtio_gpu_ttm_tt *gtt =
+		container_of(ttm, struct virtio_gpu_ttm_tt, ttm.ttm);
+	struct virtio_gpu_device *vgdev =
+		virtio_gpu_get_vgdev(gtt->obj->tbo.bdev);
+
+	virtio_gpu_object_detach(vgdev, gtt->obj);
 	return 0;
 }
 
-static void virtio_gpu_ttm_backend_destroy(struct ttm_tt *ttm)
+static void virtio_gpu_ttm_tt_destroy(struct ttm_tt *ttm)
 {
-	struct virtio_gpu_ttm_tt *gtt = (void *)ttm;
+	struct virtio_gpu_ttm_tt *gtt =
+		container_of(ttm, struct virtio_gpu_ttm_tt, ttm.ttm);
 
 	ttm_dma_tt_fini(&gtt->ttm);
 	kfree(gtt);
 }
 
-static struct ttm_backend_func virtio_gpu_backend_func = {
-	.bind = &virtio_gpu_ttm_backend_bind,
-	.unbind = &virtio_gpu_ttm_backend_unbind,
-	.destroy = &virtio_gpu_ttm_backend_destroy,
+static struct ttm_backend_func virtio_gpu_tt_func = {
+	.bind = &virtio_gpu_ttm_tt_bind,
+	.unbind = &virtio_gpu_ttm_tt_unbind,
+	.destroy = &virtio_gpu_ttm_tt_destroy,
 };
 
 static struct ttm_tt *virtio_gpu_ttm_tt_create(struct ttm_buffer_object *bo,
@@ -332,8 +297,8 @@
 	gtt = kzalloc(sizeof(struct virtio_gpu_ttm_tt), GFP_KERNEL);
 	if (gtt == NULL)
 		return NULL;
-	gtt->ttm.ttm.func = &virtio_gpu_backend_func;
-	gtt->vgdev = vgdev;
+	gtt->ttm.ttm.func = &virtio_gpu_tt_func;
+	gtt->obj = container_of(bo, struct virtio_gpu_object, tbo);
 	if (ttm_dma_tt_init(&gtt->ttm, bo, page_flags)) {
 		kfree(gtt);
 		return NULL;
@@ -341,60 +306,11 @@
 	return &gtt->ttm.ttm;
 }
 
-static void virtio_gpu_move_null(struct ttm_buffer_object *bo,
-				 struct ttm_mem_reg *new_mem)
-{
-	struct ttm_mem_reg *old_mem = &bo->mem;
-
-	BUG_ON(old_mem->mm_node != NULL);
-	*old_mem = *new_mem;
-	new_mem->mm_node = NULL;
-}
-
-static int virtio_gpu_bo_move(struct ttm_buffer_object *bo, bool evict,
-			      struct ttm_operation_ctx *ctx,
-			      struct ttm_mem_reg *new_mem)
-{
-	int ret;
-
-	ret = ttm_bo_wait(bo, ctx->interruptible, ctx->no_wait_gpu);
-	if (ret)
-		return ret;
-
-	virtio_gpu_move_null(bo, new_mem);
-	return 0;
-}
-
-static void virtio_gpu_bo_move_notify(struct ttm_buffer_object *tbo,
-				      bool evict,
-				      struct ttm_mem_reg *new_mem)
-{
-	struct virtio_gpu_object *bo;
-	struct virtio_gpu_device *vgdev;
-
-	bo = container_of(tbo, struct virtio_gpu_object, tbo);
-	vgdev = (struct virtio_gpu_device *)bo->gem_base.dev->dev_private;
-
-	if (!new_mem || (new_mem->placement & TTM_PL_FLAG_SYSTEM)) {
-		if (bo->hw_res_handle)
-			virtio_gpu_cmd_resource_inval_backing(vgdev,
-							   bo->hw_res_handle);
-
-	} else if (new_mem->placement & TTM_PL_FLAG_TT) {
-		if (bo->hw_res_handle) {
-			virtio_gpu_object_attach(vgdev, bo, bo->hw_res_handle,
-						 NULL);
-		}
-	}
-}
-
 static void virtio_gpu_bo_swap_notify(struct ttm_buffer_object *tbo)
 {
 	struct virtio_gpu_object *bo;
-	struct virtio_gpu_device *vgdev;
 
 	bo = container_of(tbo, struct virtio_gpu_object, tbo);
-	vgdev = (struct virtio_gpu_device *)bo->gem_base.dev->dev_private;
 
 	if (bo->pages)
 		virtio_gpu_object_free_sg_table(bo);
@@ -406,11 +322,9 @@
 	.init_mem_type = &virtio_gpu_init_mem_type,
 	.eviction_valuable = ttm_bo_eviction_valuable,
 	.evict_flags = &virtio_gpu_evict_flags,
-	.move = &virtio_gpu_bo_move,
 	.verify_access = &virtio_gpu_verify_access,
 	.io_mem_reserve = &virtio_gpu_ttm_io_mem_reserve,
 	.io_mem_free = &virtio_gpu_ttm_io_mem_free,
-	.move_notify = &virtio_gpu_bo_move_notify,
 	.swap_notify = &virtio_gpu_bo_swap_notify,
 };
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c
index c8a581b..981ee16 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vq.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c
@@ -28,6 +28,7 @@
 
 #include <drm/drmP.h>
 #include "virtgpu_drv.h"
+#include "virtgpu_trace.h"
 #include <linux/virtio.h>
 #include <linux/virtio_config.h>
 #include <linux/virtio_ring.h>
@@ -38,26 +39,6 @@
 			       + MAX_INLINE_CMD_SIZE		 \
 			       + MAX_INLINE_RESP_SIZE)
 
-void virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
-				uint32_t *resid)
-{
-	int handle;
-
-	idr_preload(GFP_KERNEL);
-	spin_lock(&vgdev->resource_idr_lock);
-	handle = idr_alloc(&vgdev->resource_idr, NULL, 1, 0, GFP_NOWAIT);
-	spin_unlock(&vgdev->resource_idr_lock);
-	idr_preload_end();
-	*resid = handle;
-}
-
-void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id)
-{
-	spin_lock(&vgdev->resource_idr_lock);
-	idr_remove(&vgdev->resource_idr, id);
-	spin_unlock(&vgdev->resource_idr_lock);
-}
-
 void virtio_gpu_ctrl_ack(struct virtqueue *vq)
 {
 	struct drm_device *dev = vq->vdev->priv;
@@ -98,10 +79,9 @@
 {
 	struct virtio_gpu_vbuffer *vbuf;
 
-	vbuf = kmem_cache_alloc(vgdev->vbufs, GFP_KERNEL);
+	vbuf = kmem_cache_zalloc(vgdev->vbufs, GFP_KERNEL);
 	if (!vbuf)
 		return ERR_PTR(-ENOMEM);
-	memset(vbuf, 0, VBUFFER_SIZE);
 
 	BUG_ON(size > MAX_INLINE_CMD_SIZE);
 	vbuf->buf = (void *)vbuf + sizeof(*vbuf);
@@ -213,8 +193,19 @@
 
 	list_for_each_entry_safe(entry, tmp, &reclaim_list, list) {
 		resp = (struct virtio_gpu_ctrl_hdr *)entry->resp_buf;
-		if (resp->type != cpu_to_le32(VIRTIO_GPU_RESP_OK_NODATA))
-			DRM_DEBUG("response 0x%x\n", le32_to_cpu(resp->type));
+
+		trace_virtio_gpu_cmd_response(vgdev->ctrlq.vq, resp);
+
+		if (resp->type != cpu_to_le32(VIRTIO_GPU_RESP_OK_NODATA)) {
+			if (resp->type >= cpu_to_le32(VIRTIO_GPU_RESP_ERR_UNSPEC)) {
+				struct virtio_gpu_ctrl_hdr *cmd;
+				cmd = (struct virtio_gpu_ctrl_hdr *)entry->buf;
+				DRM_ERROR("response 0x%x (command 0x%x)\n",
+					  le32_to_cpu(resp->type),
+					  le32_to_cpu(cmd->type));
+			} else
+				DRM_DEBUG("response 0x%x\n", le32_to_cpu(resp->type));
+		}
 		if (resp->flags & cpu_to_le32(VIRTIO_GPU_FLAG_FENCE)) {
 			u64 f = le64_to_cpu(resp->fence_id);
 
@@ -297,6 +288,9 @@
 		spin_lock(&vgdev->ctrlq.qlock);
 		goto retry;
 	} else {
+		trace_virtio_gpu_cmd_queue(vq,
+			(struct virtio_gpu_ctrl_hdr *)vbuf->buf);
+
 		virtqueue_kick(vq);
 	}
 
@@ -319,7 +313,7 @@
 static int virtio_gpu_queue_fenced_ctrl_buffer(struct virtio_gpu_device *vgdev,
 					       struct virtio_gpu_vbuffer *vbuf,
 					       struct virtio_gpu_ctrl_hdr *hdr,
-					       struct virtio_gpu_fence **fence)
+					       struct virtio_gpu_fence *fence)
 {
 	struct virtqueue *vq = vgdev->ctrlq.vq;
 	int rc;
@@ -372,6 +366,9 @@
 		spin_lock(&vgdev->cursorq.qlock);
 		goto retry;
 	} else {
+		trace_virtio_gpu_cmd_queue(vq,
+			(struct virtio_gpu_ctrl_hdr *)vbuf->buf);
+
 		virtqueue_kick(vq);
 	}
 
@@ -388,10 +385,9 @@
 
 /* create a basic resource */
 void virtio_gpu_cmd_create_resource(struct virtio_gpu_device *vgdev,
-				    uint32_t resource_id,
-				    uint32_t format,
-				    uint32_t width,
-				    uint32_t height)
+				    struct virtio_gpu_object *bo,
+				    struct virtio_gpu_object_params *params,
+				    struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_resource_create_2d *cmd_p;
 	struct virtio_gpu_vbuffer *vbuf;
@@ -400,12 +396,13 @@
 	memset(cmd_p, 0, sizeof(*cmd_p));
 
 	cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_RESOURCE_CREATE_2D);
-	cmd_p->resource_id = cpu_to_le32(resource_id);
-	cmd_p->format = cpu_to_le32(format);
-	cmd_p->width = cpu_to_le32(width);
-	cmd_p->height = cpu_to_le32(height);
+	cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
+	cmd_p->format = cpu_to_le32(params->format);
+	cmd_p->width = cpu_to_le32(params->width);
+	cmd_p->height = cpu_to_le32(params->height);
 
-	virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
+	virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, &cmd_p->hdr, fence);
+	bo->created = true;
 }
 
 void virtio_gpu_cmd_unref_resource(struct virtio_gpu_device *vgdev,
@@ -423,8 +420,9 @@
 	virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
 }
 
-void virtio_gpu_cmd_resource_inval_backing(struct virtio_gpu_device *vgdev,
-					   uint32_t resource_id)
+static void virtio_gpu_cmd_resource_inval_backing(struct virtio_gpu_device *vgdev,
+						  uint32_t resource_id,
+						  struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_resource_detach_backing *cmd_p;
 	struct virtio_gpu_vbuffer *vbuf;
@@ -435,7 +433,7 @@
 	cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING);
 	cmd_p->resource_id = cpu_to_le32(resource_id);
 
-	virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
+	virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, &cmd_p->hdr, fence);
 }
 
 void virtio_gpu_cmd_set_scanout(struct virtio_gpu_device *vgdev,
@@ -482,19 +480,26 @@
 }
 
 void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev,
-					uint32_t resource_id, uint64_t offset,
+					struct virtio_gpu_object *bo,
+					uint64_t offset,
 					__le32 width, __le32 height,
 					__le32 x, __le32 y,
-					struct virtio_gpu_fence **fence)
+					struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_transfer_to_host_2d *cmd_p;
 	struct virtio_gpu_vbuffer *vbuf;
+	bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev);
+
+	if (use_dma_api)
+		dma_sync_sg_for_device(vgdev->vdev->dev.parent,
+				       bo->pages->sgl, bo->pages->nents,
+				       DMA_TO_DEVICE);
 
 	cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p));
 	memset(cmd_p, 0, sizeof(*cmd_p));
 
 	cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D);
-	cmd_p->resource_id = cpu_to_le32(resource_id);
+	cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
 	cmd_p->offset = cpu_to_le64(offset);
 	cmd_p->r.width = width;
 	cmd_p->r.height = height;
@@ -509,7 +514,7 @@
 				       uint32_t resource_id,
 				       struct virtio_gpu_mem_entry *ents,
 				       uint32_t nents,
-				       struct virtio_gpu_fence **fence)
+				       struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_resource_attach_backing *cmd_p;
 	struct virtio_gpu_vbuffer *vbuf;
@@ -595,6 +600,45 @@
 		}
 	}
 	spin_unlock(&vgdev->display_info_lock);
+	wake_up_all(&vgdev->resp_wq);
+}
+
+static int virtio_get_edid_block(void *data, u8 *buf,
+				 unsigned int block, size_t len)
+{
+	struct virtio_gpu_resp_edid *resp = data;
+	size_t start = block * EDID_LENGTH;
+
+	if (start + len > le32_to_cpu(resp->size))
+		return -1;
+	memcpy(buf, resp->edid + start, len);
+	return 0;
+}
+
+static void virtio_gpu_cmd_get_edid_cb(struct virtio_gpu_device *vgdev,
+				       struct virtio_gpu_vbuffer *vbuf)
+{
+	struct virtio_gpu_cmd_get_edid *cmd =
+		(struct virtio_gpu_cmd_get_edid *)vbuf->buf;
+	struct virtio_gpu_resp_edid *resp =
+		(struct virtio_gpu_resp_edid *)vbuf->resp_buf;
+	uint32_t scanout = le32_to_cpu(cmd->scanout);
+	struct virtio_gpu_output *output;
+	struct edid *new_edid, *old_edid;
+
+	if (scanout >= vgdev->num_scanouts)
+		return;
+	output = vgdev->outputs + scanout;
+
+	new_edid = drm_do_get_edid(&output->conn, virtio_get_edid_block, resp);
+	drm_connector_update_edid_property(&output->conn, new_edid);
+
+	spin_lock(&vgdev->display_info_lock);
+	old_edid = output->edid;
+	output->edid = new_edid;
+	spin_unlock(&vgdev->display_info_lock);
+
+	kfree(old_edid);
 	wake_up(&vgdev->resp_wq);
 }
 
@@ -650,11 +694,14 @@
 {
 	struct virtio_gpu_get_capset *cmd_p;
 	struct virtio_gpu_vbuffer *vbuf;
-	int max_size = vgdev->capsets[idx].max_size;
+	int max_size;
 	struct virtio_gpu_drv_cap_cache *cache_ent;
+	struct virtio_gpu_drv_cap_cache *search_ent;
 	void *resp_buf;
 
-	if (idx > vgdev->num_capsets)
+	*cache_p = NULL;
+
+	if (idx >= vgdev->num_capsets)
 		return -EINVAL;
 
 	if (version > vgdev->capsets[idx].max_version)
@@ -664,6 +711,7 @@
 	if (!cache_ent)
 		return -ENOMEM;
 
+	max_size = vgdev->capsets[idx].max_size;
 	cache_ent->caps_cache = kmalloc(max_size, GFP_KERNEL);
 	if (!cache_ent->caps_cache) {
 		kfree(cache_ent);
@@ -683,9 +731,26 @@
 	atomic_set(&cache_ent->is_valid, 0);
 	cache_ent->size = max_size;
 	spin_lock(&vgdev->display_info_lock);
-	list_add_tail(&cache_ent->head, &vgdev->cap_cache);
+	/* Search while under lock in case it was added by another task. */
+	list_for_each_entry(search_ent, &vgdev->cap_cache, head) {
+		if (search_ent->id == vgdev->capsets[idx].id &&
+		    search_ent->version == version) {
+			*cache_p = search_ent;
+			break;
+		}
+	}
+	if (!*cache_p)
+		list_add_tail(&cache_ent->head, &vgdev->cap_cache);
 	spin_unlock(&vgdev->display_info_lock);
 
+	if (*cache_p) {
+		/* Entry was found, so free everything that was just created. */
+		kfree(resp_buf);
+		kfree(cache_ent->caps_cache);
+		kfree(cache_ent);
+		return 0;
+	}
+
 	cmd_p = virtio_gpu_alloc_cmd_resp
 		(vgdev, &virtio_gpu_cmd_capset_cb, &vbuf, sizeof(*cmd_p),
 		 sizeof(struct virtio_gpu_resp_capset) + max_size,
@@ -699,6 +764,34 @@
 	return 0;
 }
 
+int virtio_gpu_cmd_get_edids(struct virtio_gpu_device *vgdev)
+{
+	struct virtio_gpu_cmd_get_edid *cmd_p;
+	struct virtio_gpu_vbuffer *vbuf;
+	void *resp_buf;
+	int scanout;
+
+	if (WARN_ON(!vgdev->has_edid))
+		return -EINVAL;
+
+	for (scanout = 0; scanout < vgdev->num_scanouts; scanout++) {
+		resp_buf = kzalloc(sizeof(struct virtio_gpu_resp_edid),
+				   GFP_KERNEL);
+		if (!resp_buf)
+			return -ENOMEM;
+
+		cmd_p = virtio_gpu_alloc_cmd_resp
+			(vgdev, &virtio_gpu_cmd_get_edid_cb, &vbuf,
+			 sizeof(*cmd_p), sizeof(struct virtio_gpu_resp_edid),
+			 resp_buf);
+		cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_GET_EDID);
+		cmd_p->scanout = cpu_to_le32(scanout);
+		virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
+	}
+
+	return 0;
+}
+
 void virtio_gpu_cmd_context_create(struct virtio_gpu_device *vgdev, uint32_t id,
 				   uint32_t nlen, const char *name)
 {
@@ -765,8 +858,9 @@
 
 void
 virtio_gpu_cmd_resource_create_3d(struct virtio_gpu_device *vgdev,
-				  struct virtio_gpu_resource_create_3d *rc_3d,
-				  struct virtio_gpu_fence **fence)
+				  struct virtio_gpu_object *bo,
+				  struct virtio_gpu_object_params *params,
+				  struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_resource_create_3d *cmd_p;
 	struct virtio_gpu_vbuffer *vbuf;
@@ -774,28 +868,46 @@
 	cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p));
 	memset(cmd_p, 0, sizeof(*cmd_p));
 
-	*cmd_p = *rc_3d;
 	cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_RESOURCE_CREATE_3D);
-	cmd_p->hdr.flags = 0;
+	cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
+	cmd_p->format = cpu_to_le32(params->format);
+	cmd_p->width = cpu_to_le32(params->width);
+	cmd_p->height = cpu_to_le32(params->height);
+
+	cmd_p->target = cpu_to_le32(params->target);
+	cmd_p->bind = cpu_to_le32(params->bind);
+	cmd_p->depth = cpu_to_le32(params->depth);
+	cmd_p->array_size = cpu_to_le32(params->array_size);
+	cmd_p->last_level = cpu_to_le32(params->last_level);
+	cmd_p->nr_samples = cpu_to_le32(params->nr_samples);
+	cmd_p->flags = cpu_to_le32(params->flags);
 
 	virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, &cmd_p->hdr, fence);
+	bo->created = true;
 }
 
 void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
-					uint32_t resource_id, uint32_t ctx_id,
+					struct virtio_gpu_object *bo,
+					uint32_t ctx_id,
 					uint64_t offset, uint32_t level,
 					struct virtio_gpu_box *box,
-					struct virtio_gpu_fence **fence)
+					struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_transfer_host_3d *cmd_p;
 	struct virtio_gpu_vbuffer *vbuf;
+	bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev);
+
+	if (use_dma_api)
+		dma_sync_sg_for_device(vgdev->vdev->dev.parent,
+				       bo->pages->sgl, bo->pages->nents,
+				       DMA_TO_DEVICE);
 
 	cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p));
 	memset(cmd_p, 0, sizeof(*cmd_p));
 
 	cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D);
 	cmd_p->hdr.ctx_id = cpu_to_le32(ctx_id);
-	cmd_p->resource_id = cpu_to_le32(resource_id);
+	cmd_p->resource_id = cpu_to_le32(bo->hw_res_handle);
 	cmd_p->box = *box;
 	cmd_p->offset = cpu_to_le64(offset);
 	cmd_p->level = cpu_to_le32(level);
@@ -807,7 +919,7 @@
 					  uint32_t resource_id, uint32_t ctx_id,
 					  uint64_t offset, uint32_t level,
 					  struct virtio_gpu_box *box,
-					  struct virtio_gpu_fence **fence)
+					  struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_transfer_host_3d *cmd_p;
 	struct virtio_gpu_vbuffer *vbuf;
@@ -827,7 +939,7 @@
 
 void virtio_gpu_cmd_submit(struct virtio_gpu_device *vgdev,
 			   void *data, uint32_t data_size,
-			   uint32_t ctx_id, struct virtio_gpu_fence **fence)
+			   uint32_t ctx_id, struct virtio_gpu_fence *fence)
 {
 	struct virtio_gpu_cmd_submit *cmd_p;
 	struct virtio_gpu_vbuffer *vbuf;
@@ -847,12 +959,15 @@
 
 int virtio_gpu_object_attach(struct virtio_gpu_device *vgdev,
 			     struct virtio_gpu_object *obj,
-			     uint32_t resource_id,
-			     struct virtio_gpu_fence **fence)
+			     struct virtio_gpu_fence *fence)
 {
+	bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev);
 	struct virtio_gpu_mem_entry *ents;
 	struct scatterlist *sg;
-	int si;
+	int si, nents;
+
+	if (WARN_ON_ONCE(!obj->created))
+		return -EINVAL;
 
 	if (!obj->pages) {
 		int ret;
@@ -862,28 +977,59 @@
 			return ret;
 	}
 
+	if (use_dma_api) {
+		obj->mapped = dma_map_sg(vgdev->vdev->dev.parent,
+					 obj->pages->sgl, obj->pages->nents,
+					 DMA_TO_DEVICE);
+		nents = obj->mapped;
+	} else {
+		nents = obj->pages->nents;
+	}
+
 	/* gets freed when the ring has consumed it */
-	ents = kmalloc_array(obj->pages->nents,
-			     sizeof(struct virtio_gpu_mem_entry),
+	ents = kmalloc_array(nents, sizeof(struct virtio_gpu_mem_entry),
 			     GFP_KERNEL);
 	if (!ents) {
 		DRM_ERROR("failed to allocate ent list\n");
 		return -ENOMEM;
 	}
 
-	for_each_sg(obj->pages->sgl, sg, obj->pages->nents, si) {
-		ents[si].addr = cpu_to_le64(sg_phys(sg));
+	for_each_sg(obj->pages->sgl, sg, nents, si) {
+		ents[si].addr = cpu_to_le64(use_dma_api
+					    ? sg_dma_address(sg)
+					    : sg_phys(sg));
 		ents[si].length = cpu_to_le32(sg->length);
 		ents[si].padding = 0;
 	}
 
-	virtio_gpu_cmd_resource_attach_backing(vgdev, resource_id,
-					       ents, obj->pages->nents,
+	virtio_gpu_cmd_resource_attach_backing(vgdev, obj->hw_res_handle,
+					       ents, nents,
 					       fence);
-	obj->hw_res_handle = resource_id;
 	return 0;
 }
 
+void virtio_gpu_object_detach(struct virtio_gpu_device *vgdev,
+			      struct virtio_gpu_object *obj)
+{
+	bool use_dma_api = !virtio_has_iommu_quirk(vgdev->vdev);
+
+	if (use_dma_api && obj->mapped) {
+		struct virtio_gpu_fence *fence = virtio_gpu_fence_alloc(vgdev);
+		/* detach backing and wait for the host process it ... */
+		virtio_gpu_cmd_resource_inval_backing(vgdev, obj->hw_res_handle, fence);
+		dma_fence_wait(&fence->f, true);
+		dma_fence_put(&fence->f);
+
+		/* ... then tear down iommu mappings */
+		dma_unmap_sg(vgdev->vdev->dev.parent,
+			     obj->pages->sgl, obj->mapped,
+			     DMA_TO_DEVICE);
+		obj->mapped = 0;
+	} else {
+		virtio_gpu_cmd_resource_inval_backing(vgdev, obj->hw_res_handle, NULL);
+	}
+}
+
 void virtio_gpu_cursor_ping(struct virtio_gpu_device *vgdev,
 			    struct virtio_gpu_output *output)
 {
diff --git a/drivers/hwtracing/coresight/Kconfig b/drivers/hwtracing/coresight/Kconfig
index ad34380..44d1650 100644
--- a/drivers/hwtracing/coresight/Kconfig
+++ b/drivers/hwtracing/coresight/Kconfig
@@ -75,6 +75,7 @@
 	bool "CoreSight Embedded Trace Macrocell 4.x driver"
 	depends on ARM64
 	select CORESIGHT_LINKS_AND_SINKS
+	select PID_IN_CONTEXTIDR
 	help
 	  This driver provides support for the ETM4.x tracer module, tracing the
 	  instructions that a processor is executing. This is primarily useful
diff --git a/drivers/hwtracing/coresight/coresight-catu.h b/drivers/hwtracing/coresight/coresight-catu.h
index 1b281f0..1d2ad18 100644
--- a/drivers/hwtracing/coresight/coresight-catu.h
+++ b/drivers/hwtracing/coresight/coresight-catu.h
@@ -109,11 +109,6 @@
 	return true;
 }
 
-#ifdef CONFIG_CORESIGHT_CATU
 extern const struct etr_buf_operations etr_catu_buf_ops;
-#else
-/* Dummy declaration for the CATU ops */
-static const struct etr_buf_operations etr_catu_buf_ops;
-#endif
 
 #endif
diff --git a/drivers/hwtracing/coresight/coresight-dynamic-replicator.c b/drivers/hwtracing/coresight/coresight-dynamic-replicator.c
index d31f1d8..8be9ed1 100644
--- a/drivers/hwtracing/coresight/coresight-dynamic-replicator.c
+++ b/drivers/hwtracing/coresight/coresight-dynamic-replicator.c
@@ -26,12 +26,14 @@
  * @dev:	the device entity associated with this component
  * @atclk:	optional clock for the core parts of the replicator.
  * @csdev:	component vitals needed by the framework
+ * @spinlock:	serialize enable/disable operations.
  */
 struct replicator_state {
 	void __iomem		*base;
 	struct device		*dev;
 	struct clk		*atclk;
 	struct coresight_device	*csdev;
+	spinlock_t		spinlock;
 };
 
 /*
@@ -41,17 +43,20 @@
 {
 	CS_UNLOCK(drvdata->base);
 
-	writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER0);
-	writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER1);
+	if (!coresight_claim_device_unlocked(drvdata->base)) {
+		writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER0);
+		writel_relaxed(0xff, drvdata->base + REPLICATOR_IDFILTER1);
+		coresight_disclaim_device_unlocked(drvdata->base);
+	}
 
 	CS_LOCK(drvdata->base);
 }
 
-static int replicator_enable(struct coresight_device *csdev, int inport,
-			      int outport)
+static int dynamic_replicator_enable(struct replicator_state *drvdata,
+				     int inport, int outport)
 {
+	int rc = 0;
 	u32 reg;
-	struct replicator_state *drvdata = dev_get_drvdata(csdev->dev.parent);
 
 	switch (outport) {
 	case 0:
@@ -67,20 +72,45 @@
 
 	CS_UNLOCK(drvdata->base);
 
+	if ((readl_relaxed(drvdata->base + REPLICATOR_IDFILTER0) == 0xff) &&
+	    (readl_relaxed(drvdata->base + REPLICATOR_IDFILTER1) == 0xff))
+		rc = coresight_claim_device_unlocked(drvdata->base);
 
 	/* Ensure that the outport is enabled. */
-	writel_relaxed(0x00, drvdata->base + reg);
+	if (!rc)
+		writel_relaxed(0x00, drvdata->base + reg);
 	CS_LOCK(drvdata->base);
 
-	dev_info(drvdata->dev, "REPLICATOR enabled\n");
-	return 0;
+	return rc;
 }
 
-static void replicator_disable(struct coresight_device *csdev, int inport,
-				int outport)
+static int replicator_enable(struct coresight_device *csdev, int inport,
+			     int outport)
+{
+	int rc = 0;
+	struct replicator_state *drvdata = dev_get_drvdata(csdev->dev.parent);
+	unsigned long flags;
+	bool first_enable = false;
+
+	spin_lock_irqsave(&drvdata->spinlock, flags);
+	if (atomic_read(&csdev->refcnt[outport]) == 0) {
+		rc = dynamic_replicator_enable(drvdata, inport, outport);
+		if (!rc)
+			first_enable = true;
+	}
+	if (!rc)
+		atomic_inc(&csdev->refcnt[outport]);
+	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+
+	if (first_enable)
+		dev_dbg(&csdev->dev, "REPLICATOR enabled\n");
+	return rc;
+}
+
+static void dynamic_replicator_disable(struct replicator_state *drvdata,
+				       int inport, int outport)
 {
 	u32 reg;
-	struct replicator_state *drvdata = dev_get_drvdata(csdev->dev.parent);
 
 	switch (outport) {
 	case 0:
@@ -99,9 +129,28 @@
 	/* disable the flow of ATB data through port */
 	writel_relaxed(0xff, drvdata->base + reg);
 
+	if ((readl_relaxed(drvdata->base + REPLICATOR_IDFILTER0) == 0xff) &&
+	    (readl_relaxed(drvdata->base + REPLICATOR_IDFILTER1) == 0xff))
+		coresight_disclaim_device_unlocked(drvdata->base);
 	CS_LOCK(drvdata->base);
+}
 
-	dev_info(drvdata->dev, "REPLICATOR disabled\n");
+static void replicator_disable(struct coresight_device *csdev, int inport,
+				int outport)
+{
+	struct replicator_state *drvdata = dev_get_drvdata(csdev->dev.parent);
+	unsigned long flags;
+	bool last_disable = false;
+
+	spin_lock_irqsave(&drvdata->spinlock, flags);
+	if (atomic_dec_return(&csdev->refcnt[outport]) == 0) {
+		dynamic_replicator_disable(drvdata, inport, outport);
+		last_disable = true;
+	}
+	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+
+	if (last_disable)
+		dev_dbg(drvdata->dev, "REPLICATOR disabled\n");
 }
 
 static const struct coresight_ops_link replicator_link_ops = {
@@ -174,6 +223,7 @@
 	dev_set_drvdata(dev, drvdata);
 	pm_runtime_put(&adev->dev);
 
+	spin_lock_init(&drvdata->spinlock);
 	desc.type = CORESIGHT_DEV_TYPE_LINK;
 	desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_SPLIT;
 	desc.ops = &replicator_cs_ops;
diff --git a/drivers/hwtracing/coresight/coresight-etb10.c b/drivers/hwtracing/coresight/coresight-etb10.c
index 0dad862..c34fd35 100644
--- a/drivers/hwtracing/coresight/coresight-etb10.c
+++ b/drivers/hwtracing/coresight/coresight-etb10.c
@@ -5,7 +5,7 @@
  * Description: CoreSight Embedded Trace Buffer driver
  */
 
-#include <asm/local.h>
+#include <linux/atomic.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
@@ -28,6 +28,7 @@
 
 
 #include "coresight-priv.h"
+#include "coresight-etm-perf.h"
 
 #define ETB_RAM_DEPTH_REG	0x004
 #define ETB_STATUS_REG		0x00c
@@ -71,8 +72,8 @@
  * @miscdev:	specifics to handle "/dev/xyz.etb" entry.
  * @spinlock:	only one at a time pls.
  * @reading:	synchronise user space access to etb buffer.
- * @mode:	this ETB is being used.
  * @buf:	area of memory where ETB buffer content gets sent.
+ * @mode:	this ETB is being used.
  * @buffer_depth: size of @buf.
  * @trigger_cntr: amount of words to store after a trigger.
  */
@@ -84,12 +85,15 @@
 	struct miscdevice	miscdev;
 	spinlock_t		spinlock;
 	local_t			reading;
-	local_t			mode;
 	u8			*buf;
+	u32			mode;
 	u32			buffer_depth;
 	u32			trigger_cntr;
 };
 
+static int etb_set_buffer(struct coresight_device *csdev,
+			  struct perf_output_handle *handle);
+
 static unsigned int etb_get_buffer_depth(struct etb_drvdata *drvdata)
 {
 	u32 depth = 0;
@@ -103,7 +107,7 @@
 	return depth;
 }
 
-static void etb_enable_hw(struct etb_drvdata *drvdata)
+static void __etb_enable_hw(struct etb_drvdata *drvdata)
 {
 	int i;
 	u32 depth;
@@ -131,40 +135,104 @@
 	CS_LOCK(drvdata->base);
 }
 
-static int etb_enable(struct coresight_device *csdev, u32 mode)
+static int etb_enable_hw(struct etb_drvdata *drvdata)
 {
-	u32 val;
-	unsigned long flags;
-	struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+	int rc = coresight_claim_device(drvdata->base);
 
-	val = local_cmpxchg(&drvdata->mode,
-			    CS_MODE_DISABLED, mode);
-	/*
-	 * When accessing from Perf, a HW buffer can be handled
-	 * by a single trace entity.  In sysFS mode many tracers
-	 * can be logging to the same HW buffer.
-	 */
-	if (val == CS_MODE_PERF)
-		return -EBUSY;
+	if (rc)
+		return rc;
 
-	/* Don't let perf disturb sysFS sessions */
-	if (val == CS_MODE_SYSFS && mode == CS_MODE_PERF)
-		return -EBUSY;
-
-	/* Nothing to do, the tracer is already enabled. */
-	if (val == CS_MODE_SYSFS)
-		goto out;
-
-	spin_lock_irqsave(&drvdata->spinlock, flags);
-	etb_enable_hw(drvdata);
-	spin_unlock_irqrestore(&drvdata->spinlock, flags);
-
-out:
-	dev_info(drvdata->dev, "ETB enabled\n");
+	__etb_enable_hw(drvdata);
 	return 0;
 }
 
-static void etb_disable_hw(struct etb_drvdata *drvdata)
+static int etb_enable_sysfs(struct coresight_device *csdev)
+{
+	int ret = 0;
+	unsigned long flags;
+	struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+
+	spin_lock_irqsave(&drvdata->spinlock, flags);
+
+	/* Don't messup with perf sessions. */
+	if (drvdata->mode == CS_MODE_PERF) {
+		ret = -EBUSY;
+		goto out;
+	}
+
+	if (drvdata->mode == CS_MODE_DISABLED) {
+		ret = etb_enable_hw(drvdata);
+		if (ret)
+			goto out;
+
+		drvdata->mode = CS_MODE_SYSFS;
+	}
+
+	atomic_inc(csdev->refcnt);
+out:
+	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	return ret;
+}
+
+static int etb_enable_perf(struct coresight_device *csdev, void *data)
+{
+	int ret = 0;
+	unsigned long flags;
+	struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+
+	spin_lock_irqsave(&drvdata->spinlock, flags);
+
+	/* No need to continue if the component is already in use. */
+	if (drvdata->mode != CS_MODE_DISABLED) {
+		ret = -EBUSY;
+		goto out;
+	}
+
+	/*
+	 * We don't have an internal state to clean up if we fail to setup
+	 * the perf buffer. So we can perform the step before we turn the
+	 * ETB on and leave without cleaning up.
+	 */
+	ret = etb_set_buffer(csdev, (struct perf_output_handle *)data);
+	if (ret)
+		goto out;
+
+	ret = etb_enable_hw(drvdata);
+	if (!ret) {
+		drvdata->mode = CS_MODE_PERF;
+		atomic_inc(csdev->refcnt);
+	}
+
+out:
+	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	return ret;
+}
+
+static int etb_enable(struct coresight_device *csdev, u32 mode, void *data)
+{
+	int ret;
+	struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+
+	switch (mode) {
+	case CS_MODE_SYSFS:
+		ret = etb_enable_sysfs(csdev);
+		break;
+	case CS_MODE_PERF:
+		ret = etb_enable_perf(csdev, data);
+		break;
+	default:
+		ret = -EINVAL;
+		break;
+	}
+
+	if (ret)
+		return ret;
+
+	dev_dbg(drvdata->dev, "ETB enabled\n");
+	return 0;
+}
+
+static void __etb_disable_hw(struct etb_drvdata *drvdata)
 {
 	u32 ffcr;
 
@@ -254,25 +322,40 @@
 	CS_LOCK(drvdata->base);
 }
 
-static void etb_disable(struct coresight_device *csdev)
+static void etb_disable_hw(struct etb_drvdata *drvdata)
+{
+	__etb_disable_hw(drvdata);
+	etb_dump_hw(drvdata);
+	coresight_disclaim_device(drvdata->base);
+}
+
+static int etb_disable(struct coresight_device *csdev)
 {
 	struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 	unsigned long flags;
 
 	spin_lock_irqsave(&drvdata->spinlock, flags);
+
+	if (atomic_dec_return(csdev->refcnt)) {
+		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		return -EBUSY;
+	}
+
+	/* Complain if we (somehow) got out of sync */
+	WARN_ON_ONCE(drvdata->mode == CS_MODE_DISABLED);
 	etb_disable_hw(drvdata);
-	etb_dump_hw(drvdata);
+	drvdata->mode = CS_MODE_DISABLED;
 	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
-	local_set(&drvdata->mode, CS_MODE_DISABLED);
-
-	dev_info(drvdata->dev, "ETB disabled\n");
+	dev_dbg(drvdata->dev, "ETB disabled\n");
+	return 0;
 }
 
-static void *etb_alloc_buffer(struct coresight_device *csdev, int cpu,
-			      void **pages, int nr_pages, bool overwrite)
+static void *etb_alloc_buffer(struct coresight_device *csdev,
+			      struct perf_event *event, void **pages,
+			      int nr_pages, bool overwrite)
 {
-	int node;
+	int node, cpu = event->cpu;
 	struct cs_buffers *buf;
 
 	if (cpu == -1)
@@ -298,12 +381,14 @@
 }
 
 static int etb_set_buffer(struct coresight_device *csdev,
-			  struct perf_output_handle *handle,
-			  void *sink_config)
+			  struct perf_output_handle *handle)
 {
 	int ret = 0;
 	unsigned long head;
-	struct cs_buffers *buf = sink_config;
+	struct cs_buffers *buf = etm_perf_sink_config(handle);
+
+	if (!buf)
+		return -EINVAL;
 
 	/* wrap head around to the amount of space we have */
 	head = handle->head & ((buf->nr_pages << PAGE_SHIFT) - 1);
@@ -319,37 +404,7 @@
 	return ret;
 }
 
-static unsigned long etb_reset_buffer(struct coresight_device *csdev,
-				      struct perf_output_handle *handle,
-				      void *sink_config)
-{
-	unsigned long size = 0;
-	struct cs_buffers *buf = sink_config;
-
-	if (buf) {
-		/*
-		 * In snapshot mode ->data_size holds the new address of the
-		 * ring buffer's head.  The size itself is the whole address
-		 * range since we want the latest information.
-		 */
-		if (buf->snapshot)
-			handle->head = local_xchg(&buf->data_size,
-						  buf->nr_pages << PAGE_SHIFT);
-
-		/*
-		 * Tell the tracer PMU how much we got in this run and if
-		 * something went wrong along the way.  Nobody else can use
-		 * this cs_buffers instance until we are done.  As such
-		 * resetting parameters here and squaring off with the ring
-		 * buffer API in the tracer PMU is fine.
-		 */
-		size = local_xchg(&buf->data_size, 0);
-	}
-
-	return size;
-}
-
-static void etb_update_buffer(struct coresight_device *csdev,
+static unsigned long etb_update_buffer(struct coresight_device *csdev,
 			      struct perf_output_handle *handle,
 			      void *sink_config)
 {
@@ -358,17 +413,18 @@
 	u8 *buf_ptr;
 	const u32 *barrier;
 	u32 read_ptr, write_ptr, capacity;
-	u32 status, read_data, to_read;
-	unsigned long offset;
+	u32 status, read_data;
+	unsigned long offset, to_read, flags;
 	struct cs_buffers *buf = sink_config;
 	struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
 	if (!buf)
-		return;
+		return 0;
 
 	capacity = drvdata->buffer_depth * ETB_FRAME_SIZE_WORDS;
 
-	etb_disable_hw(drvdata);
+	spin_lock_irqsave(&drvdata->spinlock, flags);
+	__etb_disable_hw(drvdata);
 	CS_UNLOCK(drvdata->base);
 
 	/* unit is in words, not bytes */
@@ -433,7 +489,13 @@
 		lost = true;
 	}
 
-	if (lost)
+	/*
+	 * Don't set the TRUNCATED flag in snapshot mode because 1) the
+	 * captured buffer is expected to be truncated and 2) a full buffer
+	 * prevents the event from being re-enabled by the perf core,
+	 * resulting in stale data being send to user space.
+	 */
+	if (!buf->snapshot && lost)
 		perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED);
 
 	/* finally tell HW where we want to start reading from */
@@ -469,18 +531,18 @@
 	writel_relaxed(0x0, drvdata->base + ETB_RAM_WRITE_POINTER);
 
 	/*
-	 * In snapshot mode all we have to do is communicate to
-	 * perf_aux_output_end() the address of the current head.  In full
-	 * trace mode the same function expects a size to move rb->aux_head
-	 * forward.
+	 * In snapshot mode we have to update the handle->head to point
+	 * to the new location.
 	 */
-	if (buf->snapshot)
-		local_set(&buf->data_size, (cur * PAGE_SIZE) + offset);
-	else
-		local_add(to_read, &buf->data_size);
-
-	etb_enable_hw(drvdata);
+	if (buf->snapshot) {
+		handle->head = (cur * PAGE_SIZE) + offset;
+		to_read = buf->nr_pages << PAGE_SHIFT;
+	}
+	__etb_enable_hw(drvdata);
 	CS_LOCK(drvdata->base);
+	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+
+	return to_read;
 }
 
 static const struct coresight_ops_sink etb_sink_ops = {
@@ -488,8 +550,6 @@
 	.disable	= etb_disable,
 	.alloc_buffer	= etb_alloc_buffer,
 	.free_buffer	= etb_free_buffer,
-	.set_buffer	= etb_set_buffer,
-	.reset_buffer	= etb_reset_buffer,
 	.update_buffer	= etb_update_buffer,
 };
 
@@ -502,14 +562,14 @@
 	unsigned long flags;
 
 	spin_lock_irqsave(&drvdata->spinlock, flags);
-	if (local_read(&drvdata->mode) == CS_MODE_SYSFS) {
-		etb_disable_hw(drvdata);
+	if (drvdata->mode == CS_MODE_SYSFS) {
+		__etb_disable_hw(drvdata);
 		etb_dump_hw(drvdata);
-		etb_enable_hw(drvdata);
+		__etb_enable_hw(drvdata);
 	}
 	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
-	dev_info(drvdata->dev, "ETB dumped\n");
+	dev_dbg(drvdata->dev, "ETB dumped\n");
 }
 
 static int etb_open(struct inode *inode, struct file *file)
diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c
index c3c6452..84f1dcb 100644
--- a/drivers/hwtracing/coresight/coresight-etm-perf.c
+++ b/drivers/hwtracing/coresight/coresight-etm-perf.c
@@ -14,6 +14,7 @@
 #include <linux/perf_event.h>
 #include <linux/percpu-defs.h>
 #include <linux/slab.h>
+#include <linux/stringhash.h>
 #include <linux/types.h>
 #include <linux/workqueue.h>
 
@@ -23,32 +24,23 @@
 static struct pmu etm_pmu;
 static bool etm_perf_up;
 
-/**
- * struct etm_event_data - Coresight specifics associated to an event
- * @work:		Handle to free allocated memory outside IRQ context.
- * @mask:		Hold the CPU(s) this event was set for.
- * @snk_config:		The sink configuration.
- * @path:		An array of path, each slot for one CPU.
- */
-struct etm_event_data {
-	struct work_struct work;
-	cpumask_t mask;
-	void *snk_config;
-	struct list_head * __percpu *path;
-};
-
 static DEFINE_PER_CPU(struct perf_output_handle, ctx_handle);
 static DEFINE_PER_CPU(struct coresight_device *, csdev_src);
 
 /* ETMv3.5/PTM's ETMCR is 'config' */
 PMU_FORMAT_ATTR(cycacc,		"config:" __stringify(ETM_OPT_CYCACC));
+PMU_FORMAT_ATTR(contextid,	"config:" __stringify(ETM_OPT_CTXTID));
 PMU_FORMAT_ATTR(timestamp,	"config:" __stringify(ETM_OPT_TS));
 PMU_FORMAT_ATTR(retstack,	"config:" __stringify(ETM_OPT_RETSTK));
+/* Sink ID - same for all ETMs */
+PMU_FORMAT_ATTR(sinkid,		"config2:0-31");
 
 static struct attribute *etm_config_formats_attr[] = {
 	&format_attr_cycacc.attr,
+	&format_attr_contextid.attr,
 	&format_attr_timestamp.attr,
 	&format_attr_retstack.attr,
+	&format_attr_sinkid.attr,
 	NULL,
 };
 
@@ -57,8 +49,18 @@
 	.attrs  = etm_config_formats_attr,
 };
 
+static struct attribute *etm_config_sinks_attr[] = {
+	NULL,
+};
+
+static const struct attribute_group etm_pmu_sinks_group = {
+	.name   = "sinks",
+	.attrs  = etm_config_sinks_attr,
+};
+
 static const struct attribute_group *etm_pmu_attr_groups[] = {
 	&etm_pmu_format_group,
+	&etm_pmu_sinks_group,
 	NULL,
 };
 
@@ -118,25 +120,34 @@
 	return ret;
 }
 
+static void free_sink_buffer(struct etm_event_data *event_data)
+{
+	int cpu;
+	cpumask_t *mask = &event_data->mask;
+	struct coresight_device *sink;
+
+	if (WARN_ON(cpumask_empty(mask)))
+		return;
+
+	if (!event_data->snk_config)
+		return;
+
+	cpu = cpumask_first(mask);
+	sink = coresight_get_sink(etm_event_cpu_path(event_data, cpu));
+	sink_ops(sink)->free_buffer(event_data->snk_config);
+}
+
 static void free_event_data(struct work_struct *work)
 {
 	int cpu;
 	cpumask_t *mask;
 	struct etm_event_data *event_data;
-	struct coresight_device *sink;
 
 	event_data = container_of(work, struct etm_event_data, work);
 	mask = &event_data->mask;
-	/*
-	 * First deal with the sink configuration.  See comment in
-	 * etm_setup_aux() about why we take the first available path.
-	 */
-	if (event_data->snk_config) {
-		cpu = cpumask_first(mask);
-		sink = coresight_get_sink(etm_event_cpu_path(event_data, cpu));
-		if (sink_ops(sink)->free_buffer)
-			sink_ops(sink)->free_buffer(event_data->snk_config);
-	}
+
+	/* Free the sink buffers, if there are any */
+	free_sink_buffer(event_data);
 
 	for_each_cpu(cpu, mask) {
 		struct list_head **ppath;
@@ -161,15 +172,12 @@
 	if (!event_data)
 		return NULL;
 
-	/* Make sure nothing disappears under us */
-	get_online_cpus();
 
 	mask = &event_data->mask;
 	if (cpu != -1)
 		cpumask_set_cpu(cpu, mask);
 	else
-		cpumask_copy(mask, cpu_online_mask);
-	put_online_cpus();
+		cpumask_copy(mask, cpu_present_mask);
 
 	/*
 	 * Each CPU has a single path between source and destination.  As such
@@ -199,6 +207,7 @@
 static void *etm_setup_aux(struct perf_event *event, void **pages,
 			   int nr_pages, bool overwrite)
 {
+	u32 id;
 	int cpu = event->cpu;
 	cpumask_t *mask;
 	struct coresight_device *sink;
@@ -209,31 +218,40 @@
 		return NULL;
 	INIT_WORK(&event_data->work, free_event_data);
 
-	/*
-	 * In theory nothing prevent tracers in a trace session from being
-	 * associated with different sinks, nor having a sink per tracer.  But
-	 * until we have HW with this kind of topology we need to assume tracers
-	 * in a trace session are using the same sink.  Therefore go through
-	 * the coresight bus and pick the first enabled sink.
-	 *
-	 * When operated from sysFS users are responsible to enable the sink
-	 * while from perf, the perf tools will do it based on the choice made
-	 * on the cmd line.  As such the "enable_sink" flag in sysFS is reset.
-	 */
-	sink = coresight_get_enabled_sink(true);
+	/* First get the selected sink from user space. */
+	if (event->attr.config2) {
+		id = (u32)event->attr.config2;
+		sink = coresight_get_sink_by_id(id);
+	} else {
+		sink = coresight_get_enabled_sink(true);
+	}
+
 	if (!sink)
 		goto err;
 
 	mask = &event_data->mask;
 
-	/* Setup the path for each CPU in a trace session */
+	/*
+	 * Setup the path for each CPU in a trace session. We try to build
+	 * trace path for each CPU in the mask. If we don't find an ETM
+	 * for the CPU or fail to build a path, we clear the CPU from the
+	 * mask and continue with the rest. If ever we try to trace on those
+	 * CPUs, we can handle it and fail the session.
+	 */
 	for_each_cpu(cpu, mask) {
 		struct list_head *path;
 		struct coresight_device *csdev;
 
 		csdev = per_cpu(csdev_src, cpu);
-		if (!csdev)
-			goto err;
+		/*
+		 * If there is no ETM associated with this CPU clear it from
+		 * the mask and continue with the rest. If ever we try to trace
+		 * on this CPU, we handle it accordingly.
+		 */
+		if (!csdev) {
+			cpumask_clear_cpu(cpu, mask);
+			continue;
+		}
 
 		/*
 		 * Building a path doesn't enable it, it simply builds a
@@ -241,19 +259,25 @@
 		 * referenced later when the path is actually needed.
 		 */
 		path = coresight_build_path(csdev, sink);
-		if (IS_ERR(path))
-			goto err;
+		if (IS_ERR(path)) {
+			cpumask_clear_cpu(cpu, mask);
+			continue;
+		}
 
 		*etm_event_cpu_path_ptr(event_data, cpu) = path;
 	}
 
-	if (!sink_ops(sink)->alloc_buffer)
+	/* If we don't have any CPUs ready for tracing, abort */
+	cpu = cpumask_first(mask);
+	if (cpu >= nr_cpu_ids)
 		goto err;
 
-	cpu = cpumask_first(mask);
-	/* Get the AUX specific data from the sink buffer */
+	if (!sink_ops(sink)->alloc_buffer || !sink_ops(sink)->free_buffer)
+		goto err;
+
+	/* Allocate the sink buffer for this session */
 	event_data->snk_config =
-			sink_ops(sink)->alloc_buffer(sink, cpu, pages,
+			sink_ops(sink)->alloc_buffer(sink, event, pages,
 						     nr_pages, overwrite);
 	if (!event_data->snk_config)
 		goto err;
@@ -289,16 +313,11 @@
 	path = etm_event_cpu_path(event_data, cpu);
 	/* We need a sink, no need to continue without one */
 	sink = coresight_get_sink(path);
-	if (WARN_ON_ONCE(!sink || !sink_ops(sink)->set_buffer))
-		goto fail_end_stop;
-
-	/* Configure the sink */
-	if (sink_ops(sink)->set_buffer(sink, handle,
-				       event_data->snk_config))
+	if (WARN_ON_ONCE(!sink))
 		goto fail_end_stop;
 
 	/* Nothing will happen without a path */
-	if (coresight_enable_path(path, CS_MODE_PERF))
+	if (coresight_enable_path(path, CS_MODE_PERF, handle))
 		goto fail_end_stop;
 
 	/* Tell the perf core the event is alive */
@@ -358,15 +377,8 @@
 		if (!sink_ops(sink)->update_buffer)
 			return;
 
-		sink_ops(sink)->update_buffer(sink, handle,
+		size = sink_ops(sink)->update_buffer(sink, handle,
 					      event_data->snk_config);
-
-		if (!sink_ops(sink)->reset_buffer)
-			return;
-
-		size = sink_ops(sink)->reset_buffer(sink, handle,
-						    event_data->snk_config);
-
 		perf_aux_output_end(handle, size);
 	}
 
@@ -437,15 +449,16 @@
 static void etm_addr_filters_sync(struct perf_event *event)
 {
 	struct perf_addr_filters_head *head = perf_event_addr_filters(event);
-	unsigned long start, stop, *offs = event->addr_filters_offs;
+	unsigned long start, stop;
+	struct perf_addr_filter_range *fr = event->addr_filter_ranges;
 	struct etm_filters *filters = event->hw.addr_filters;
 	struct etm_filter *etm_filter;
 	struct perf_addr_filter *filter;
 	int i = 0;
 
 	list_for_each_entry(filter, &head->list, entry) {
-		start = filter->offset + offs[i];
-		stop = start + filter->size;
+		start = fr[i].start;
+		stop = start + fr[i].size;
 		etm_filter = &filters->etm_filter[i];
 
 		switch (filter->action) {
@@ -494,11 +507,84 @@
 	return 0;
 }
 
+static ssize_t etm_perf_sink_name_show(struct device *dev,
+				       struct device_attribute *dattr,
+				       char *buf)
+{
+	struct dev_ext_attribute *ea;
+
+	ea = container_of(dattr, struct dev_ext_attribute, attr);
+	return scnprintf(buf, PAGE_SIZE, "0x%lx\n", (unsigned long)(ea->var));
+}
+
+int etm_perf_add_symlink_sink(struct coresight_device *csdev)
+{
+	int ret;
+	unsigned long hash;
+	const char *name;
+	struct device *pmu_dev = etm_pmu.dev;
+	struct device *dev = &csdev->dev;
+	struct dev_ext_attribute *ea;
+
+	if (csdev->type != CORESIGHT_DEV_TYPE_SINK &&
+	    csdev->type != CORESIGHT_DEV_TYPE_LINKSINK)
+		return -EINVAL;
+
+	if (csdev->ea != NULL)
+		return -EINVAL;
+
+	if (!etm_perf_up)
+		return -EPROBE_DEFER;
+
+	ea = devm_kzalloc(dev, sizeof(*ea), GFP_KERNEL);
+	if (!ea)
+		return -ENOMEM;
+
+	name = dev_name(dev);
+	/* See function coresight_get_sink_by_id() to know where this is used */
+	hash = hashlen_hash(hashlen_string(NULL, name));
+
+	sysfs_attr_init(&ea->attr.attr);
+	ea->attr.attr.name = devm_kstrdup(dev, name, GFP_KERNEL);
+	if (!ea->attr.attr.name)
+		return -ENOMEM;
+
+	ea->attr.attr.mode = 0444;
+	ea->attr.show = etm_perf_sink_name_show;
+	ea->var = (unsigned long *)hash;
+
+	ret = sysfs_add_file_to_group(&pmu_dev->kobj,
+				      &ea->attr.attr, "sinks");
+
+	if (!ret)
+		csdev->ea = ea;
+
+	return ret;
+}
+
+void etm_perf_del_symlink_sink(struct coresight_device *csdev)
+{
+	struct device *pmu_dev = etm_pmu.dev;
+	struct dev_ext_attribute *ea = csdev->ea;
+
+	if (csdev->type != CORESIGHT_DEV_TYPE_SINK &&
+	    csdev->type != CORESIGHT_DEV_TYPE_LINKSINK)
+		return;
+
+	if (!ea)
+		return;
+
+	sysfs_remove_file_from_group(&pmu_dev->kobj,
+				     &ea->attr.attr, "sinks");
+	csdev->ea = NULL;
+}
+
 static int __init etm_perf_init(void)
 {
 	int ret;
 
-	etm_pmu.capabilities		= PERF_PMU_CAP_EXCLUSIVE;
+	etm_pmu.capabilities		= (PERF_PMU_CAP_EXCLUSIVE |
+					   PERF_PMU_CAP_ITRACE);
 
 	etm_pmu.attr_groups		= etm_pmu_attr_groups;
 	etm_pmu.task_ctx_nr		= perf_sw_context;
diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.h b/drivers/hwtracing/coresight/coresight-etm-perf.h
index 4197df4..015213a 100644
--- a/drivers/hwtracing/coresight/coresight-etm-perf.h
+++ b/drivers/hwtracing/coresight/coresight-etm-perf.h
@@ -7,6 +7,7 @@
 #ifndef _CORESIGHT_ETM_PERF_H
 #define _CORESIGHT_ETM_PERF_H
 
+#include <linux/percpu-defs.h>
 #include "coresight-priv.h"
 
 struct coresight_device;
@@ -42,13 +43,42 @@
 	bool			ssstatus;
 };
 
+/**
+ * struct etm_event_data - Coresight specifics associated to an event
+ * @work:		Handle to free allocated memory outside IRQ context.
+ * @mask:		Hold the CPU(s) this event was set for.
+ * @snk_config:		The sink configuration.
+ * @path:		An array of path, each slot for one CPU.
+ */
+struct etm_event_data {
+	struct work_struct work;
+	cpumask_t mask;
+	void *snk_config;
+	struct list_head * __percpu *path;
+};
 
 #ifdef CONFIG_CORESIGHT
 int etm_perf_symlink(struct coresight_device *csdev, bool link);
+int etm_perf_add_symlink_sink(struct coresight_device *csdev);
+void etm_perf_del_symlink_sink(struct coresight_device *csdev);
+static inline void *etm_perf_sink_config(struct perf_output_handle *handle)
+{
+	struct etm_event_data *data = perf_get_aux(handle);
 
+	if (data)
+		return data->snk_config;
+	return NULL;
+}
 #else
 static inline int etm_perf_symlink(struct coresight_device *csdev, bool link)
 { return -EINVAL; }
+int etm_perf_add_symlink_sink(struct coresight_device *csdev)
+{ return -EINVAL; }
+void etm_perf_del_symlink_sink(struct coresight_device *csdev) {}
+static inline void *etm_perf_sink_config(struct perf_output_handle *handle)
+{
+	return NULL;
+}
 
 #endif /* CONFIG_CORESIGHT */
 
diff --git a/drivers/hwtracing/coresight/coresight-etm3x.c b/drivers/hwtracing/coresight/coresight-etm3x.c
index 7c74263..fd5c4cc 100644
--- a/drivers/hwtracing/coresight/coresight-etm3x.c
+++ b/drivers/hwtracing/coresight/coresight-etm3x.c
@@ -355,11 +355,10 @@
 	return 0;
 }
 
-static void etm_enable_hw(void *info)
+static int etm_enable_hw(struct etm_drvdata *drvdata)
 {
-	int i;
+	int i, rc;
 	u32 etmcr;
-	struct etm_drvdata *drvdata = info;
 	struct etm_config *config = &drvdata->config;
 
 	CS_UNLOCK(drvdata->base);
@@ -370,6 +369,9 @@
 	etm_set_pwrup(drvdata);
 	/* Make sure all registers are accessible */
 	etm_os_unlock(drvdata);
+	rc = coresight_claim_device_unlocked(drvdata->base);
+	if (rc)
+		goto done;
 
 	etm_set_prog(drvdata);
 
@@ -418,9 +420,29 @@
 	etm_writel(drvdata, 0x0, ETMVMIDCVR);
 
 	etm_clr_prog(drvdata);
+
+done:
+	if (rc)
+		etm_set_pwrdwn(drvdata);
 	CS_LOCK(drvdata->base);
 
-	dev_dbg(drvdata->dev, "cpu: %d enable smp call done\n", drvdata->cpu);
+	dev_dbg(drvdata->dev, "cpu: %d enable smp call done: %d\n",
+		drvdata->cpu, rc);
+	return rc;
+}
+
+struct etm_enable_arg {
+	struct etm_drvdata *drvdata;
+	int rc;
+};
+
+static void etm_enable_hw_smp_call(void *info)
+{
+	struct etm_enable_arg *arg = info;
+
+	if (WARN_ON(!arg))
+		return;
+	arg->rc = etm_enable_hw(arg->drvdata);
 }
 
 static int etm_cpu_id(struct coresight_device *csdev)
@@ -475,14 +497,13 @@
 	/* Configure the tracer based on the session's specifics */
 	etm_parse_event_config(drvdata, event);
 	/* And enable it */
-	etm_enable_hw(drvdata);
-
-	return 0;
+	return etm_enable_hw(drvdata);
 }
 
 static int etm_enable_sysfs(struct coresight_device *csdev)
 {
 	struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+	struct etm_enable_arg arg = { 0 };
 	int ret;
 
 	spin_lock(&drvdata->spinlock);
@@ -492,20 +513,21 @@
 	 * hw configuration will take place on the local CPU during bring up.
 	 */
 	if (cpu_online(drvdata->cpu)) {
+		arg.drvdata = drvdata;
 		ret = smp_call_function_single(drvdata->cpu,
-					       etm_enable_hw, drvdata, 1);
-		if (ret)
-			goto err;
+					       etm_enable_hw_smp_call, &arg, 1);
+		if (!ret)
+			ret = arg.rc;
+		if (!ret)
+			drvdata->sticky_enable = true;
+	} else {
+		ret = -ENODEV;
 	}
 
-	drvdata->sticky_enable = true;
 	spin_unlock(&drvdata->spinlock);
 
-	dev_info(drvdata->dev, "ETM tracing enabled\n");
-	return 0;
-
-err:
-	spin_unlock(&drvdata->spinlock);
+	if (!ret)
+		dev_dbg(drvdata->dev, "ETM tracing enabled\n");
 	return ret;
 }
 
@@ -555,6 +577,8 @@
 	for (i = 0; i < drvdata->nr_cntr; i++)
 		config->cntr_val[i] = etm_readl(drvdata, ETMCNTVRn(i));
 
+	coresight_disclaim_device_unlocked(drvdata->base);
+
 	etm_set_pwrdwn(drvdata);
 	CS_LOCK(drvdata->base);
 
@@ -604,7 +628,7 @@
 	spin_unlock(&drvdata->spinlock);
 	cpus_read_unlock();
 
-	dev_info(drvdata->dev, "ETM tracing disabled\n");
+	dev_dbg(drvdata->dev, "ETM tracing disabled\n");
 }
 
 static void etm_disable(struct coresight_device *csdev,
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c
index b7bc08c..3e22cfc 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x.c
@@ -18,6 +18,7 @@
 #include <linux/stat.h>
 #include <linux/clk.h>
 #include <linux/cpu.h>
+#include <linux/cpu_pm.h>
 #include <linux/coresight.h>
 #include <linux/coresight-pmu.h>
 #include <linux/pm_wakeup.h>
@@ -26,6 +27,7 @@
 #include <linux/uaccess.h>
 #include <linux/perf_event.h>
 #include <linux/pm_runtime.h>
+#include <linux/property.h>
 #include <asm/sections.h>
 #include <asm/local.h>
 #include <asm/virt.h>
@@ -36,6 +38,15 @@
 static int boot_enable;
 module_param_named(boot_enable, boot_enable, int, S_IRUGO);
 
+#define PARAM_PM_SAVE_FIRMWARE	  0 /* save self-hosted state as per firmware */
+#define PARAM_PM_SAVE_NEVER	  1 /* never save any state */
+#define PARAM_PM_SAVE_SELF_HOSTED 2 /* save self-hosted state only */
+
+static int pm_save_enable = PARAM_PM_SAVE_FIRMWARE;
+module_param(pm_save_enable, int, 0444);
+MODULE_PARM_DESC(pm_save_enable,
+	"Save/restore state on power down: 1 = never, 2 = self-hosted");
+
 /* The number of ETMv4 currently registered */
 static int etm4_count;
 static struct etmv4_drvdata *etmdrvdata[NR_CPUS];
@@ -53,6 +64,14 @@
 	isb();
 }
 
+static void etm4_os_lock(struct etmv4_drvdata *drvdata)
+{
+	/* Writing 0x1 to TRCOSLAR locks the trace registers */
+	writel_relaxed(0x1, drvdata->base + TRCOSLAR);
+	drvdata->os_unlock = false;
+	isb();
+}
+
 static bool etm4_arch_supported(u8 arch)
 {
 	/* Mask out the minor version number */
@@ -79,16 +98,24 @@
 	return drvdata->trcid;
 }
 
-static void etm4_enable_hw(void *info)
+struct etm4_enable_arg {
+	struct etmv4_drvdata *drvdata;
+	int rc;
+};
+
+static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
 {
-	int i;
-	struct etmv4_drvdata *drvdata = info;
+	int i, rc;
 	struct etmv4_config *config = &drvdata->config;
 
 	CS_UNLOCK(drvdata->base);
 
 	etm4_os_unlock(drvdata);
 
+	rc = coresight_claim_device_unlocked(drvdata->base);
+	if (rc)
+		goto done;
+
 	/* Disable the trace unit before programming trace registers */
 	writel_relaxed(0, drvdata->base + TRCPRGCTLR);
 
@@ -130,8 +157,11 @@
 			       drvdata->base + TRCCNTVRn(i));
 	}
 
-	/* Resource selector pair 0 is always implemented and reserved */
-	for (i = 0; i < drvdata->nr_resource * 2; i++)
+	/*
+	 * Resource selector pair 0 is always implemented and reserved.  As
+	 * such start at 2.
+	 */
+	for (i = 2; i < drvdata->nr_resource * 2; i++)
 		writel_relaxed(config->res_ctrl[i],
 			       drvdata->base + TRCRSCTLRn(i));
 
@@ -182,9 +212,106 @@
 	dsb(sy);
 	isb();
 
+done:
 	CS_LOCK(drvdata->base);
 
-	dev_dbg(drvdata->dev, "cpu: %d enable smp call done\n", drvdata->cpu);
+	dev_dbg(drvdata->dev, "cpu: %d enable smp call done: %d\n",
+		drvdata->cpu, rc);
+	return rc;
+}
+
+static void etm4_enable_hw_smp_call(void *info)
+{
+	struct etm4_enable_arg *arg = info;
+
+	if (WARN_ON(!arg))
+		return;
+	arg->rc = etm4_enable_hw(arg->drvdata);
+}
+
+/*
+ * The goal of function etm4_config_timestamp_event() is to configure a
+ * counter that will tell the tracer to emit a timestamp packet when it
+ * reaches zero.  This is done in order to get a more fine grained idea
+ * of when instructions are executed so that they can be correlated
+ * with execution on other CPUs.
+ *
+ * To do this the counter itself is configured to self reload and
+ * TRCRSCTLR1 (always true) used to get the counter to decrement.  From
+ * there a resource selector is configured with the counter and the
+ * timestamp control register to use the resource selector to trigger the
+ * event that will insert a timestamp packet in the stream.
+ */
+static int etm4_config_timestamp_event(struct etmv4_drvdata *drvdata)
+{
+	int ctridx, ret = -EINVAL;
+	int counter, rselector;
+	u32 val = 0;
+	struct etmv4_config *config = &drvdata->config;
+
+	/* No point in trying if we don't have at least one counter */
+	if (!drvdata->nr_cntr)
+		goto out;
+
+	/* Find a counter that hasn't been initialised */
+	for (ctridx = 0; ctridx < drvdata->nr_cntr; ctridx++)
+		if (config->cntr_val[ctridx] == 0)
+			break;
+
+	/* All the counters have been configured already, bail out */
+	if (ctridx == drvdata->nr_cntr) {
+		pr_debug("%s: no available counter found\n", __func__);
+		ret = -ENOSPC;
+		goto out;
+	}
+
+	/*
+	 * Searching for an available resource selector to use, starting at
+	 * '2' since every implementation has at least 2 resource selector.
+	 * ETMIDR4 gives the number of resource selector _pairs_,
+	 * hence multiply by 2.
+	 */
+	for (rselector = 2; rselector < drvdata->nr_resource * 2; rselector++)
+		if (!config->res_ctrl[rselector])
+			break;
+
+	if (rselector == drvdata->nr_resource * 2) {
+		pr_debug("%s: no available resource selector found\n",
+			 __func__);
+		ret = -ENOSPC;
+		goto out;
+	}
+
+	/* Remember what counter we used */
+	counter = 1 << ctridx;
+
+	/*
+	 * Initialise original and reload counter value to the smallest
+	 * possible value in order to get as much precision as we can.
+	 */
+	config->cntr_val[ctridx] = 1;
+	config->cntrldvr[ctridx] = 1;
+
+	/* Set the trace counter control register */
+	val =  0x1 << 16	|  /* Bit 16, reload counter automatically */
+	       0x0 << 7		|  /* Select single resource selector */
+	       0x1;		   /* Resource selector 1, i.e always true */
+
+	config->cntr_ctrl[ctridx] = val;
+
+	val = 0x2 << 16		| /* Group 0b0010 - Counter and sequencers */
+	      counter << 0;	  /* Counter to use */
+
+	config->res_ctrl[rselector] = val;
+
+	val = 0x0 << 7		| /* Select single resource selector */
+	      rselector;	  /* Resource selector */
+
+	config->ts_ctrl = val;
+
+	ret = 0;
+out:
+	return ret;
 }
 
 static int etm4_parse_event_config(struct etmv4_drvdata *drvdata,
@@ -222,9 +349,29 @@
 		/* TRM: Must program this for cycacc to work */
 		config->ccctlr = ETM_CYC_THRESHOLD_DEFAULT;
 	}
-	if (attr->config & BIT(ETM_OPT_TS))
+	if (attr->config & BIT(ETM_OPT_TS)) {
+		/*
+		 * Configure timestamps to be emitted at regular intervals in
+		 * order to correlate instructions executed on different CPUs
+		 * (CPU-wide trace scenarios).
+		 */
+		ret = etm4_config_timestamp_event(drvdata);
+
+		/*
+		 * No need to go further if timestamp intervals can't
+		 * be configured.
+		 */
+		if (ret)
+			goto out;
+
 		/* bit[11], Global timestamp tracing bit */
 		config->cfg |= BIT(11);
+	}
+
+	if (attr->config & BIT(ETM_OPT_CTXTID))
+		/* bit[6], Context ID tracing bit */
+		config->cfg |= BIT(ETM4_CFG_BIT_CTXTID);
+
 	/* return stack - enable if selected and supported */
 	if ((attr->config & BIT(ETM_OPT_RETSTK)) && drvdata->retstack)
 		/* bit[12], Return stack enable bit */
@@ -250,7 +397,7 @@
 	if (ret)
 		goto out;
 	/* And enable it */
-	etm4_enable_hw(drvdata);
+	ret = etm4_enable_hw(drvdata);
 
 out:
 	return ret;
@@ -259,6 +406,7 @@
 static int etm4_enable_sysfs(struct coresight_device *csdev)
 {
 	struct etmv4_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+	struct etm4_enable_arg arg = { 0 };
 	int ret;
 
 	spin_lock(&drvdata->spinlock);
@@ -267,19 +415,17 @@
 	 * Executing etm4_enable_hw on the cpu whose ETM is being enabled
 	 * ensures that register writes occur when cpu is powered.
 	 */
+	arg.drvdata = drvdata;
 	ret = smp_call_function_single(drvdata->cpu,
-				       etm4_enable_hw, drvdata, 1);
-	if (ret)
-		goto err;
-
-	drvdata->sticky_enable = true;
+				       etm4_enable_hw_smp_call, &arg, 1);
+	if (!ret)
+		ret = arg.rc;
+	if (!ret)
+		drvdata->sticky_enable = true;
 	spin_unlock(&drvdata->spinlock);
 
-	dev_info(drvdata->dev, "ETM tracing enabled\n");
-	return 0;
-
-err:
-	spin_unlock(&drvdata->spinlock);
+	if (!ret)
+		dev_dbg(drvdata->dev, "ETM tracing enabled\n");
 	return ret;
 }
 
@@ -340,6 +486,8 @@
 	isb();
 	writel_relaxed(control, drvdata->base + TRCPRGCTLR);
 
+	coresight_disclaim_device_unlocked(drvdata->base);
+
 	CS_LOCK(drvdata->base);
 
 	dev_dbg(drvdata->dev, "cpu: %d disable smp call done\n", drvdata->cpu);
@@ -392,7 +540,7 @@
 	spin_unlock(&drvdata->spinlock);
 	cpus_read_unlock();
 
-	dev_info(drvdata->dev, "ETM tracing disabled\n");
+	dev_dbg(drvdata->dev, "ETM tracing disabled\n");
 }
 
 static void etm4_disable(struct coresight_device *csdev,
@@ -954,6 +1102,288 @@
 	drvdata->trcid = coresight_get_trace_id(drvdata->cpu);
 }
 
+#ifdef CONFIG_CPU_PM
+static int etm4_cpu_save(struct etmv4_drvdata *drvdata)
+{
+	int i, ret = 0;
+	struct etmv4_save_state *state;
+	struct device *etm_dev = &drvdata->csdev->dev;
+
+	/*
+	 * As recommended by 3.4.1 ("The procedure when powering down the PE")
+	 * of ARM IHI 0064D
+	 */
+	dsb(sy);
+	isb();
+
+	CS_UNLOCK(drvdata->base);
+
+	/* Lock the OS lock to disable trace and external debugger access */
+	etm4_os_lock(drvdata);
+
+	/* wait for TRCSTATR.PMSTABLE to go up */
+	if (coresight_timeout(drvdata->base, TRCSTATR,
+			      TRCSTATR_PMSTABLE_BIT, 1)) {
+		dev_err(etm_dev,
+			"timeout while waiting for PM Stable Status\n");
+		etm4_os_unlock(drvdata);
+		ret = -EBUSY;
+		goto out;
+	}
+
+	state = drvdata->save_state;
+
+	state->trcprgctlr = readl(drvdata->base + TRCPRGCTLR);
+	state->trcprocselr = readl(drvdata->base + TRCPROCSELR);
+	state->trcconfigr = readl(drvdata->base + TRCCONFIGR);
+	state->trcauxctlr = readl(drvdata->base + TRCAUXCTLR);
+	state->trceventctl0r = readl(drvdata->base + TRCEVENTCTL0R);
+	state->trceventctl1r = readl(drvdata->base + TRCEVENTCTL1R);
+	state->trcstallctlr = readl(drvdata->base + TRCSTALLCTLR);
+	state->trctsctlr = readl(drvdata->base + TRCTSCTLR);
+	state->trcsyncpr = readl(drvdata->base + TRCSYNCPR);
+	state->trcccctlr = readl(drvdata->base + TRCCCCTLR);
+	state->trcbbctlr = readl(drvdata->base + TRCBBCTLR);
+	state->trctraceidr = readl(drvdata->base + TRCTRACEIDR);
+	state->trcqctlr = readl(drvdata->base + TRCQCTLR);
+
+	state->trcvictlr = readl(drvdata->base + TRCVICTLR);
+	state->trcviiectlr = readl(drvdata->base + TRCVIIECTLR);
+	state->trcvissctlr = readl(drvdata->base + TRCVISSCTLR);
+	state->trcvipcssctlr = readl(drvdata->base + TRCVIPCSSCTLR);
+	state->trcvdctlr = readl(drvdata->base + TRCVDCTLR);
+	state->trcvdsacctlr = readl(drvdata->base + TRCVDSACCTLR);
+	state->trcvdarcctlr = readl(drvdata->base + TRCVDARCCTLR);
+
+	for (i = 0; i < drvdata->nrseqstate; i++)
+		state->trcseqevr[i] = readl(drvdata->base + TRCSEQEVRn(i));
+
+	state->trcseqrstevr = readl(drvdata->base + TRCSEQRSTEVR);
+	state->trcseqstr = readl(drvdata->base + TRCSEQSTR);
+	state->trcextinselr = readl(drvdata->base + TRCEXTINSELR);
+
+	for (i = 0; i < drvdata->nr_cntr; i++) {
+		state->trccntrldvr[i] = readl(drvdata->base + TRCCNTRLDVRn(i));
+		state->trccntctlr[i] = readl(drvdata->base + TRCCNTCTLRn(i));
+		state->trccntvr[i] = readl(drvdata->base + TRCCNTVRn(i));
+	}
+
+	for (i = 0; i < drvdata->nr_resource * 2; i++)
+		state->trcrsctlr[i] = readl(drvdata->base + TRCRSCTLRn(i));
+
+	for (i = 0; i < drvdata->nr_ss_cmp; i++) {
+		state->trcssccr[i] = readl(drvdata->base + TRCSSCCRn(i));
+		state->trcsscsr[i] = readl(drvdata->base + TRCSSCSRn(i));
+		state->trcsspcicr[i] = readl(drvdata->base + TRCSSPCICRn(i));
+	}
+
+	for (i = 0; i < drvdata->nr_addr_cmp * 2; i++) {
+		state->trcacvr[i] = readl(drvdata->base + TRCACVRn(i));
+		state->trcacatr[i] = readl(drvdata->base + TRCACATRn(i));
+	}
+
+	/*
+	 * Data trace stream is architecturally prohibited for A profile cores
+	 * so we don't save (or later restore) trcdvcvr and trcdvcmr - As per
+	 * section 1.3.4 ("Possible functional configurations of an ETMv4 trace
+	 * unit") of ARM IHI 0064D.
+	 */
+
+	for (i = 0; i < drvdata->numcidc; i++)
+		state->trccidcvr[i] = readl(drvdata->base + TRCCIDCVRn(i));
+
+	for (i = 0; i < drvdata->numvmidc; i++)
+		state->trcvmidcvr[i] = readl(drvdata->base + TRCVMIDCVRn(i));
+
+	state->trccidcctlr0 = readl(drvdata->base + TRCCIDCCTLR0);
+	state->trccidcctlr1 = readl(drvdata->base + TRCCIDCCTLR1);
+
+	state->trcvmidcctlr0 = readl(drvdata->base + TRCVMIDCCTLR0);
+	state->trcvmidcctlr0 = readl(drvdata->base + TRCVMIDCCTLR1);
+
+	state->trcclaimset = readl(drvdata->base + TRCCLAIMCLR);
+
+	state->trcpdcr = readl(drvdata->base + TRCPDCR);
+
+	/* wait for TRCSTATR.IDLE to go up */
+	if (coresight_timeout(drvdata->base, TRCSTATR, TRCSTATR_IDLE_BIT, 1)) {
+		dev_err(etm_dev,
+			"timeout while waiting for Idle Trace Status\n");
+		etm4_os_unlock(drvdata);
+		ret = -EBUSY;
+		goto out;
+	}
+
+	drvdata->state_needs_restore = true;
+
+	/*
+	 * Power can be removed from the trace unit now. We do this to
+	 * potentially save power on systems that respect the TRCPDCR_PU
+	 * despite requesting software to save/restore state.
+	 */
+	writel_relaxed((state->trcpdcr & ~TRCPDCR_PU),
+			drvdata->base + TRCPDCR);
+
+out:
+	CS_LOCK(drvdata->base);
+	return ret;
+}
+
+static void etm4_cpu_restore(struct etmv4_drvdata *drvdata)
+{
+	int i;
+	struct etmv4_save_state *state = drvdata->save_state;
+
+	CS_UNLOCK(drvdata->base);
+
+	writel_relaxed(state->trcclaimset, drvdata->base + TRCCLAIMSET);
+
+	writel_relaxed(state->trcprgctlr, drvdata->base + TRCPRGCTLR);
+	writel_relaxed(state->trcprocselr, drvdata->base + TRCPROCSELR);
+	writel_relaxed(state->trcconfigr, drvdata->base + TRCCONFIGR);
+	writel_relaxed(state->trcauxctlr, drvdata->base + TRCAUXCTLR);
+	writel_relaxed(state->trceventctl0r, drvdata->base + TRCEVENTCTL0R);
+	writel_relaxed(state->trceventctl1r, drvdata->base + TRCEVENTCTL1R);
+	writel_relaxed(state->trcstallctlr, drvdata->base + TRCSTALLCTLR);
+	writel_relaxed(state->trctsctlr, drvdata->base + TRCTSCTLR);
+	writel_relaxed(state->trcsyncpr, drvdata->base + TRCSYNCPR);
+	writel_relaxed(state->trcccctlr, drvdata->base + TRCCCCTLR);
+	writel_relaxed(state->trcbbctlr, drvdata->base + TRCBBCTLR);
+	writel_relaxed(state->trctraceidr, drvdata->base + TRCTRACEIDR);
+	writel_relaxed(state->trcqctlr, drvdata->base + TRCQCTLR);
+
+	writel_relaxed(state->trcvictlr, drvdata->base + TRCVICTLR);
+	writel_relaxed(state->trcviiectlr, drvdata->base + TRCVIIECTLR);
+	writel_relaxed(state->trcvissctlr, drvdata->base + TRCVISSCTLR);
+	writel_relaxed(state->trcvipcssctlr, drvdata->base + TRCVIPCSSCTLR);
+	writel_relaxed(state->trcvdctlr, drvdata->base + TRCVDCTLR);
+	writel_relaxed(state->trcvdsacctlr, drvdata->base + TRCVDSACCTLR);
+	writel_relaxed(state->trcvdarcctlr, drvdata->base + TRCVDARCCTLR);
+
+	for (i = 0; i < drvdata->nrseqstate; i++)
+		writel_relaxed(state->trcseqevr[i],
+			       drvdata->base + TRCSEQEVRn(i));
+
+	writel_relaxed(state->trcseqrstevr, drvdata->base + TRCSEQRSTEVR);
+	writel_relaxed(state->trcseqstr, drvdata->base + TRCSEQSTR);
+	writel_relaxed(state->trcextinselr, drvdata->base + TRCEXTINSELR);
+
+	for (i = 0; i < drvdata->nr_cntr; i++) {
+		writel_relaxed(state->trccntrldvr[i],
+			       drvdata->base + TRCCNTRLDVRn(i));
+		writel_relaxed(state->trccntctlr[i],
+			       drvdata->base + TRCCNTCTLRn(i));
+		writel_relaxed(state->trccntvr[i],
+			       drvdata->base + TRCCNTVRn(i));
+	}
+
+	for (i = 0; i < drvdata->nr_resource * 2; i++)
+		writel_relaxed(state->trcrsctlr[i],
+			       drvdata->base + TRCRSCTLRn(i));
+
+	for (i = 0; i < drvdata->nr_ss_cmp; i++) {
+		writel_relaxed(state->trcssccr[i],
+			       drvdata->base + TRCSSCCRn(i));
+		writel_relaxed(state->trcsscsr[i],
+			       drvdata->base + TRCSSCSRn(i));
+		writel_relaxed(state->trcsspcicr[i],
+			       drvdata->base + TRCSSPCICRn(i));
+	}
+
+	for (i = 0; i < drvdata->nr_addr_cmp * 2; i++) {
+		writel_relaxed(state->trcacvr[i],
+			       drvdata->base + TRCACVRn(i));
+		writel_relaxed(state->trcacatr[i],
+			       drvdata->base + TRCACATRn(i));
+	}
+
+	for (i = 0; i < drvdata->numcidc; i++)
+		writel_relaxed(state->trccidcvr[i],
+			       drvdata->base + TRCCIDCVRn(i));
+
+	for (i = 0; i < drvdata->numvmidc; i++)
+		writel_relaxed(state->trcvmidcvr[i],
+			       drvdata->base + TRCVMIDCVRn(i));
+
+	writel_relaxed(state->trccidcctlr0, drvdata->base + TRCCIDCCTLR0);
+	writel_relaxed(state->trccidcctlr1, drvdata->base + TRCCIDCCTLR1);
+
+	writel_relaxed(state->trcvmidcctlr0, drvdata->base + TRCVMIDCCTLR0);
+	writel_relaxed(state->trcvmidcctlr0, drvdata->base + TRCVMIDCCTLR1);
+
+	writel_relaxed(state->trcclaimset, drvdata->base + TRCCLAIMSET);
+
+	writel_relaxed(state->trcpdcr, drvdata->base + TRCPDCR);
+
+	drvdata->state_needs_restore = false;
+
+	/*
+	 * As recommended by section 4.3.7 ("Synchronization when using the
+	 * memory-mapped interface") of ARM IHI 0064D
+	 */
+	dsb(sy);
+	isb();
+
+	/* Unlock the OS lock to re-enable trace and external debug access */
+	etm4_os_unlock(drvdata);
+	CS_LOCK(drvdata->base);
+}
+
+static int etm4_cpu_pm_notify(struct notifier_block *nb, unsigned long cmd,
+			      void *v)
+{
+	struct etmv4_drvdata *drvdata;
+	unsigned int cpu = smp_processor_id();
+
+	if (!etmdrvdata[cpu])
+		return NOTIFY_OK;
+
+	drvdata = etmdrvdata[cpu];
+
+	if (!drvdata->save_state)
+		return NOTIFY_OK;
+
+	if (WARN_ON_ONCE(drvdata->cpu != cpu))
+		return NOTIFY_BAD;
+
+	switch (cmd) {
+	case CPU_PM_ENTER:
+		/* save the state if self-hosted coresight is in use */
+		if (local_read(&drvdata->mode))
+			if (etm4_cpu_save(drvdata))
+				return NOTIFY_BAD;
+		break;
+	case CPU_PM_EXIT:
+		/* fallthrough */
+	case CPU_PM_ENTER_FAILED:
+		if (drvdata->state_needs_restore)
+			etm4_cpu_restore(drvdata);
+		break;
+	default:
+		return NOTIFY_DONE;
+	}
+
+	return NOTIFY_OK;
+}
+
+static struct notifier_block etm4_cpu_pm_nb = {
+	.notifier_call = etm4_cpu_pm_notify,
+};
+
+static int etm4_cpu_pm_register(void)
+{
+	return cpu_pm_register_notifier(&etm4_cpu_pm_nb);
+}
+
+static void etm4_cpu_pm_unregister(void)
+{
+	cpu_pm_unregister_notifier(&etm4_cpu_pm_nb);
+}
+#else
+static int etm4_cpu_pm_register(void) { return 0; }
+static void etm4_cpu_pm_unregister(void) { }
+#endif
+
 static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
 {
 	int ret;
@@ -979,6 +1409,17 @@
 	drvdata->dev = &adev->dev;
 	dev_set_drvdata(dev, drvdata);
 
+	if (pm_save_enable == PARAM_PM_SAVE_FIRMWARE)
+		pm_save_enable = coresight_loses_context_with_cpu(dev) ?
+			       PARAM_PM_SAVE_SELF_HOSTED : PARAM_PM_SAVE_NEVER;
+
+	if (pm_save_enable != PARAM_PM_SAVE_NEVER) {
+		drvdata->save_state = devm_kmalloc(dev,
+				sizeof(struct etmv4_save_state), GFP_KERNEL);
+		if (!drvdata->save_state)
+			return -ENOMEM;
+	}
+
 	/* Validity for the resource is already checked by the AMBA core */
 	base = devm_ioremap_resource(dev, res);
 	if (IS_ERR(base))
@@ -1007,6 +1448,10 @@
 		if (ret < 0)
 			goto err_arch_supported;
 		hp_online = ret;
+
+		ret = etm4_cpu_pm_register();
+		if (ret)
+			goto err_arch_supported;
 	}
 
 	cpus_read_unlock();
@@ -1050,6 +1495,8 @@
 
 err_arch_supported:
 	if (--etm4_count == 0) {
+		etm4_cpu_pm_unregister();
+
 		cpuhp_remove_state_nocalls(CPUHP_AP_ARM_CORESIGHT_STARTING);
 		if (hp_online)
 			cpuhp_remove_state_nocalls(hp_online);
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h
index 52786e9..570baf4 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x.h
+++ b/drivers/hwtracing/coresight/coresight-etm4x.h
@@ -175,6 +175,7 @@
 					 ETM_MODE_EXCL_USER)
 
 #define TRCSTATR_IDLE_BIT		0
+#define TRCSTATR_PMSTABLE_BIT		1
 #define ETM_DEFAULT_ADDR_COMP		0
 
 /* PowerDown Control Register bits */
@@ -282,6 +283,65 @@
 };
 
 /**
+ * struct etm4_save_state - state to be preserved when ETM is without power
+ */
+struct etmv4_save_state {
+	u32	trcprgctlr;
+	u32	trcprocselr;
+	u32	trcconfigr;
+	u32	trcauxctlr;
+	u32	trceventctl0r;
+	u32	trceventctl1r;
+	u32	trcstallctlr;
+	u32	trctsctlr;
+	u32	trcsyncpr;
+	u32	trcccctlr;
+	u32	trcbbctlr;
+	u32	trctraceidr;
+	u32	trcqctlr;
+
+	u32	trcvictlr;
+	u32	trcviiectlr;
+	u32	trcvissctlr;
+	u32	trcvipcssctlr;
+	u32	trcvdctlr;
+	u32	trcvdsacctlr;
+	u32	trcvdarcctlr;
+
+	u32	trcseqevr[ETM_MAX_SEQ_STATES];
+	u32	trcseqrstevr;
+	u32	trcseqstr;
+	u32	trcextinselr;
+	u32	trccntrldvr[ETMv4_MAX_CNTR];
+	u32	trccntctlr[ETMv4_MAX_CNTR];
+	u32	trccntvr[ETMv4_MAX_CNTR];
+
+	u32	trcrsctlr[ETM_MAX_RES_SEL * 2];
+
+	u32	trcssccr[ETM_MAX_SS_CMP];
+	u32	trcsscsr[ETM_MAX_SS_CMP];
+	u32	trcsspcicr[ETM_MAX_SS_CMP];
+
+	u64	trcacvr[ETM_MAX_SINGLE_ADDR_CMP];
+	u64	trcacatr[ETM_MAX_SINGLE_ADDR_CMP];
+	u64	trccidcvr[ETMv4_MAX_CTXID_CMP];
+	u32	trcvmidcvr[ETM_MAX_VMID_CMP];
+	u32	trccidcctlr0;
+	u32	trccidcctlr1;
+	u32	trcvmidcctlr0;
+	u32	trcvmidcctlr1;
+
+	u32	trcclaimset;
+
+	u32	cntr_val[ETMv4_MAX_CNTR];
+	u32	seq_state;
+	u32	vinst_ctrl;
+	u32	ss_status[ETM_MAX_SS_CMP];
+
+	u32	trcpdcr;
+};
+
+/**
  * struct etm4_drvdata - specifics associated to an ETM component
  * @base:       Memory mapped base address for this component.
  * @dev:        The device entity associated to this component.
@@ -337,6 +397,8 @@
  * @atbtrig:	If the implementation can support ATB triggers
  * @lpoverride:	If the implementation can support low-power state over.
  * @config:	structure holding configuration parameters.
+ * @save_state:	State to be preserved across power loss
+ * @state_needs_restore: True when there is context to restore after PM exit
  */
 struct etmv4_drvdata {
 	void __iomem			*base;
@@ -383,6 +445,8 @@
 	bool				atbtrig;
 	bool				lpoverride;
 	struct etmv4_config		config;
+	struct etmv4_save_state		*save_state;
+	bool				state_needs_restore;
 };
 
 /* Address comparator access types */
diff --git a/drivers/hwtracing/coresight/coresight-funnel.c b/drivers/hwtracing/coresight/coresight-funnel.c
index 448145a..397ec75f 100644
--- a/drivers/hwtracing/coresight/coresight-funnel.c
+++ b/drivers/hwtracing/coresight/coresight-funnel.c
@@ -12,6 +12,8 @@
 #include <linux/err.h>
 #include <linux/fs.h>
 #include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/coresight.h>
 #include <linux/amba/bus.h>
@@ -25,6 +27,7 @@
 #define FUNNEL_HOLDTIME_MASK	0xf00
 #define FUNNEL_HOLDTIME_SHFT	0x8
 #define FUNNEL_HOLDTIME		(0x7 << FUNNEL_HOLDTIME_SHFT)
+#define FUNNEL_ENSx_MASK	0xff
 
 /**
  * struct funnel_drvdata - specifics associated to a funnel component
@@ -33,6 +36,7 @@
  * @atclk:	optional clock for the core parts of the funnel.
  * @csdev:	component vitals needed by the framework.
  * @priority:	port selection order.
+ * @spinlock:	serialize enable/disable operations.
  */
 struct funnel_drvdata {
 	void __iomem		*base;
@@ -40,36 +44,60 @@
 	struct clk		*atclk;
 	struct coresight_device	*csdev;
 	unsigned long		priority;
+	spinlock_t		spinlock;
 };
 
-static void funnel_enable_hw(struct funnel_drvdata *drvdata, int port)
+static int dynamic_funnel_enable_hw(struct funnel_drvdata *drvdata, int port)
 {
 	u32 functl;
+	int rc = 0;
 
 	CS_UNLOCK(drvdata->base);
 
 	functl = readl_relaxed(drvdata->base + FUNNEL_FUNCTL);
+	/* Claim the device only when we enable the first slave */
+	if (!(functl & FUNNEL_ENSx_MASK)) {
+		rc = coresight_claim_device_unlocked(drvdata->base);
+		if (rc)
+			goto done;
+	}
+
 	functl &= ~FUNNEL_HOLDTIME_MASK;
 	functl |= FUNNEL_HOLDTIME;
 	functl |= (1 << port);
 	writel_relaxed(functl, drvdata->base + FUNNEL_FUNCTL);
 	writel_relaxed(drvdata->priority, drvdata->base + FUNNEL_PRICTL);
-
+done:
 	CS_LOCK(drvdata->base);
+	return rc;
 }
 
 static int funnel_enable(struct coresight_device *csdev, int inport,
 			 int outport)
 {
+	int rc = 0;
 	struct funnel_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+	unsigned long flags;
+	bool first_enable = false;
 
-	funnel_enable_hw(drvdata, inport);
+	spin_lock_irqsave(&drvdata->spinlock, flags);
+	if (atomic_read(&csdev->refcnt[inport]) == 0) {
+		if (drvdata->base)
+			rc = dynamic_funnel_enable_hw(drvdata, inport);
+		if (!rc)
+			first_enable = true;
+	}
+	if (!rc)
+		atomic_inc(&csdev->refcnt[inport]);
+	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
-	dev_info(drvdata->dev, "FUNNEL inport %d enabled\n", inport);
-	return 0;
+	if (first_enable)
+		dev_dbg(drvdata->dev, "FUNNEL inport %d enabled\n", inport);
+	return rc;
 }
 
-static void funnel_disable_hw(struct funnel_drvdata *drvdata, int inport)
+static void dynamic_funnel_disable_hw(struct funnel_drvdata *drvdata,
+				      int inport)
 {
 	u32 functl;
 
@@ -79,6 +107,10 @@
 	functl &= ~(1 << inport);
 	writel_relaxed(functl, drvdata->base + FUNNEL_FUNCTL);
 
+	/* Disclaim the device if none of the slaves are now active */
+	if (!(functl & FUNNEL_ENSx_MASK))
+		coresight_disclaim_device_unlocked(drvdata->base);
+
 	CS_LOCK(drvdata->base);
 }
 
@@ -86,10 +118,19 @@
 			   int outport)
 {
 	struct funnel_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+	unsigned long flags;
+	bool last_disable = false;
 
-	funnel_disable_hw(drvdata, inport);
+	spin_lock_irqsave(&drvdata->spinlock, flags);
+	if (atomic_dec_return(&csdev->refcnt[inport]) == 0) {
+		if (drvdata->base)
+			dynamic_funnel_disable_hw(drvdata, inport);
+		last_disable = true;
+	}
+	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
-	dev_info(drvdata->dev, "FUNNEL inport %d disabled\n", inport);
+	if (last_disable)
+		dev_dbg(drvdata->dev, "FUNNEL inport %d disabled\n", inport);
 }
 
 static const struct coresight_ops_link funnel_link_ops = {
@@ -161,54 +202,71 @@
 };
 ATTRIBUTE_GROUPS(coresight_funnel);
 
-static int funnel_probe(struct amba_device *adev, const struct amba_id *id)
+static int funnel_probe(struct device *dev, struct resource *res)
 {
 	int ret;
 	void __iomem *base;
-	struct device *dev = &adev->dev;
 	struct coresight_platform_data *pdata = NULL;
 	struct funnel_drvdata *drvdata;
-	struct resource *res = &adev->res;
 	struct coresight_desc desc = { 0 };
-	struct device_node *np = adev->dev.of_node;
+	struct device_node *np = dev->of_node;
 
 	if (np) {
 		pdata = of_get_coresight_platform_data(dev, np);
 		if (IS_ERR(pdata))
 			return PTR_ERR(pdata);
-		adev->dev.platform_data = pdata;
+		dev->platform_data = pdata;
 	}
 
+	if (of_device_is_compatible(np, "arm,coresight-funnel"))
+		pr_warn_once("Uses OBSOLETE CoreSight funnel binding\n");
+
 	drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
 	if (!drvdata)
 		return -ENOMEM;
 
-	drvdata->dev = &adev->dev;
-	drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */
+	drvdata->dev = dev;
+	drvdata->atclk = devm_clk_get(dev, "atclk"); /* optional */
 	if (!IS_ERR(drvdata->atclk)) {
 		ret = clk_prepare_enable(drvdata->atclk);
 		if (ret)
 			return ret;
 	}
+
+	/*
+	 * Map the device base for dynamic-funnel, which has been
+	 * validated by AMBA core.
+	 */
+	if (res) {
+		base = devm_ioremap_resource(dev, res);
+		if (IS_ERR(base)) {
+			ret = PTR_ERR(base);
+			goto out_disable_clk;
+		}
+		drvdata->base = base;
+		desc.groups = coresight_funnel_groups;
+	}
+
 	dev_set_drvdata(dev, drvdata);
 
-	/* Validity for the resource is already checked by the AMBA core */
-	base = devm_ioremap_resource(dev, res);
-	if (IS_ERR(base))
-		return PTR_ERR(base);
-
-	drvdata->base = base;
-	pm_runtime_put(&adev->dev);
-
+	spin_lock_init(&drvdata->spinlock);
 	desc.type = CORESIGHT_DEV_TYPE_LINK;
 	desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_MERG;
 	desc.ops = &funnel_cs_ops;
 	desc.pdata = pdata;
 	desc.dev = dev;
-	desc.groups = coresight_funnel_groups;
 	drvdata->csdev = coresight_register(&desc);
+	if (IS_ERR(drvdata->csdev)) {
+		ret = PTR_ERR(drvdata->csdev);
+		goto out_disable_clk;
+	}
 
-	return PTR_ERR_OR_ZERO(drvdata->csdev);
+	pm_runtime_put(dev);
+
+out_disable_clk:
+	if (ret && !IS_ERR_OR_NULL(drvdata->atclk))
+		clk_disable_unprepare(drvdata->atclk);
+	return ret;
 }
 
 #ifdef CONFIG_PM
@@ -237,7 +295,48 @@
 	SET_RUNTIME_PM_OPS(funnel_runtime_suspend, funnel_runtime_resume, NULL)
 };
 
-static const struct amba_id funnel_ids[] = {
+static int static_funnel_probe(struct platform_device *pdev)
+{
+	int ret;
+
+	pm_runtime_get_noresume(&pdev->dev);
+	pm_runtime_set_active(&pdev->dev);
+	pm_runtime_enable(&pdev->dev);
+
+	/* Static funnel do not have programming base */
+	ret = funnel_probe(&pdev->dev, NULL);
+
+	if (ret) {
+		pm_runtime_put_noidle(&pdev->dev);
+		pm_runtime_disable(&pdev->dev);
+	}
+
+	return ret;
+}
+
+static const struct of_device_id static_funnel_match[] = {
+	{.compatible = "arm,coresight-static-funnel"},
+	{}
+};
+
+static struct platform_driver static_funnel_driver = {
+	.probe          = static_funnel_probe,
+	.driver         = {
+		.name   = "coresight-static-funnel",
+		.of_match_table = static_funnel_match,
+		.pm	= &funnel_dev_pm_ops,
+		.suppress_bind_attrs = true,
+	},
+};
+builtin_platform_driver(static_funnel_driver);
+
+static int dynamic_funnel_probe(struct amba_device *adev,
+				const struct amba_id *id)
+{
+	return funnel_probe(&adev->dev, &adev->res);
+}
+
+static const struct amba_id dynamic_funnel_ids[] = {
 	{
 		.id     = 0x000bb908,
 		.mask   = 0x000fffff,
@@ -250,14 +349,14 @@
 	{ 0, 0},
 };
 
-static struct amba_driver funnel_driver = {
+static struct amba_driver dynamic_funnel_driver = {
 	.drv = {
-		.name	= "coresight-funnel",
+		.name	= "coresight-dynamic-funnel",
 		.owner	= THIS_MODULE,
 		.pm	= &funnel_dev_pm_ops,
 		.suppress_bind_attrs = true,
 	},
-	.probe		= funnel_probe,
-	.id_table	= funnel_ids,
+	.probe		= dynamic_funnel_probe,
+	.id_table	= dynamic_funnel_ids,
 };
-builtin_amba_driver(funnel_driver);
+builtin_amba_driver(dynamic_funnel_driver);
diff --git a/drivers/hwtracing/coresight/coresight-priv.h b/drivers/hwtracing/coresight/coresight-priv.h
index 1a6cf35..b936c6d 100644
--- a/drivers/hwtracing/coresight/coresight-priv.h
+++ b/drivers/hwtracing/coresight/coresight-priv.h
@@ -25,6 +25,13 @@
 #define CORESIGHT_DEVID		0xfc8
 #define CORESIGHT_DEVTYPE	0xfcc
 
+
+/*
+ * Coresight device CLAIM protocol.
+ * See PSCI - ARM DEN 0022D, Section: 6.8.1 Debug and Trace save and restore.
+ */
+#define CORESIGHT_CLAIM_SELF_HOSTED	BIT(1)
+
 #define TIMEOUT_US		100
 #define BMVAL(val, lsb, msb)	((val & GENMASK(msb, lsb)) >> lsb)
 
@@ -137,9 +144,10 @@
 }
 
 void coresight_disable_path(struct list_head *path);
-int coresight_enable_path(struct list_head *path, u32 mode);
+int coresight_enable_path(struct list_head *path, u32 mode, void *sink_data);
 struct coresight_device *coresight_get_sink(struct list_head *path);
 struct coresight_device *coresight_get_enabled_sink(bool reset);
+struct coresight_device *coresight_get_sink_by_id(u32 id);
 struct list_head *coresight_build_path(struct coresight_device *csdev,
 				       struct coresight_device *sink);
 void coresight_release_path(struct list_head *path);
diff --git a/drivers/hwtracing/coresight/coresight-replicator.c b/drivers/hwtracing/coresight/coresight-replicator.c
index 8d2eaaa..344e73e 100644
--- a/drivers/hwtracing/coresight/coresight-replicator.c
+++ b/drivers/hwtracing/coresight/coresight-replicator.c
@@ -35,7 +35,8 @@
 {
 	struct replicator_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
-	dev_info(drvdata->dev, "REPLICATOR enabled\n");
+	if (atomic_inc_return(&csdev->refcnt[outport]) == 1)
+		dev_dbg(drvdata->dev, "REPLICATOR enabled\n");
 	return 0;
 }
 
@@ -44,7 +45,8 @@
 {
 	struct replicator_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
-	dev_info(drvdata->dev, "REPLICATOR disabled\n");
+	if (atomic_dec_return(&csdev->refcnt[outport]) == 0)
+		dev_dbg(drvdata->dev, "REPLICATOR disabled\n");
 }
 
 static const struct coresight_ops_link replicator_link_ops = {
diff --git a/drivers/hwtracing/coresight/coresight-stm.c b/drivers/hwtracing/coresight/coresight-stm.c
index c46c70a..35d6f97 100644
--- a/drivers/hwtracing/coresight/coresight-stm.c
+++ b/drivers/hwtracing/coresight/coresight-stm.c
@@ -211,7 +211,7 @@
 	stm_enable_hw(drvdata);
 	spin_unlock(&drvdata->spinlock);
 
-	dev_info(drvdata->dev, "STM tracing enabled\n");
+	dev_dbg(drvdata->dev, "STM tracing enabled\n");
 	return 0;
 }
 
@@ -274,7 +274,7 @@
 		pm_runtime_put(drvdata->dev);
 
 		local_set(&drvdata->mode, CS_MODE_DISABLED);
-		dev_info(drvdata->dev, "STM tracing disabled\n");
+		dev_dbg(drvdata->dev, "STM tracing disabled\n");
 	}
 }
 
diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c
index e310613..1dc796f 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etf.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c
@@ -4,14 +4,19 @@
  * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
  */
 
+#include <linux/atomic.h>
 #include <linux/circ_buf.h>
 #include <linux/coresight.h>
 #include <linux/perf_event.h>
 #include <linux/slab.h>
 #include "coresight-priv.h"
 #include "coresight-tmc.h"
+#include "coresight-etm-perf.h"
 
-static void tmc_etb_enable_hw(struct tmc_drvdata *drvdata)
+static int tmc_set_etf_buffer(struct coresight_device *csdev,
+			      struct perf_output_handle *handle);
+
+static void __tmc_etb_enable_hw(struct tmc_drvdata *drvdata)
 {
 	CS_UNLOCK(drvdata->base);
 
@@ -30,6 +35,17 @@
 	CS_LOCK(drvdata->base);
 }
 
+static int tmc_etb_enable_hw(struct tmc_drvdata *drvdata)
+{
+	int rc = coresight_claim_device(drvdata->base);
+
+	if (rc)
+		return rc;
+
+	__tmc_etb_enable_hw(drvdata);
+	return 0;
+}
+
 static void tmc_etb_dump_hw(struct tmc_drvdata *drvdata)
 {
 	char *bufp;
@@ -56,7 +72,7 @@
 	return;
 }
 
-static void tmc_etb_disable_hw(struct tmc_drvdata *drvdata)
+static void __tmc_etb_disable_hw(struct tmc_drvdata *drvdata)
 {
 	CS_UNLOCK(drvdata->base);
 
@@ -72,7 +88,13 @@
 	CS_LOCK(drvdata->base);
 }
 
-static void tmc_etf_enable_hw(struct tmc_drvdata *drvdata)
+static void tmc_etb_disable_hw(struct tmc_drvdata *drvdata)
+{
+	coresight_disclaim_device(drvdata);
+	__tmc_etb_disable_hw(drvdata);
+}
+
+static void __tmc_etf_enable_hw(struct tmc_drvdata *drvdata)
 {
 	CS_UNLOCK(drvdata->base);
 
@@ -88,13 +110,24 @@
 	CS_LOCK(drvdata->base);
 }
 
+static int tmc_etf_enable_hw(struct tmc_drvdata *drvdata)
+{
+	int rc = coresight_claim_device(drvdata->base);
+
+	if (rc)
+		return rc;
+
+	__tmc_etf_enable_hw(drvdata);
+	return 0;
+}
+
 static void tmc_etf_disable_hw(struct tmc_drvdata *drvdata)
 {
 	CS_UNLOCK(drvdata->base);
 
 	tmc_flush_and_stop(drvdata);
 	tmc_disable_hw(drvdata);
-
+	coresight_disclaim_device_unlocked(drvdata->base);
 	CS_LOCK(drvdata->base);
 }
 
@@ -151,8 +184,10 @@
 	 * sink is already enabled no memory is needed and the HW need not be
 	 * touched.
 	 */
-	if (drvdata->mode == CS_MODE_SYSFS)
+	if (drvdata->mode == CS_MODE_SYSFS) {
+		atomic_inc(csdev->refcnt);
 		goto out;
+	}
 
 	/*
 	 * If drvdata::buf isn't NULL, memory was allocated for a previous
@@ -170,8 +205,14 @@
 		drvdata->buf = buf;
 	}
 
-	drvdata->mode = CS_MODE_SYSFS;
-	tmc_etb_enable_hw(drvdata);
+	ret = tmc_etb_enable_hw(drvdata);
+	if (!ret) {
+		drvdata->mode = CS_MODE_SYSFS;
+		atomic_inc(csdev->refcnt);
+	} else {
+		/* Free up the buffer if we failed to enable */
+		used = false;
+	}
 out:
 	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
@@ -182,37 +223,42 @@
 	return ret;
 }
 
-static int tmc_enable_etf_sink_perf(struct coresight_device *csdev)
+static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
 {
 	int ret = 0;
 	unsigned long flags;
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+	struct perf_output_handle *handle = data;
 
 	spin_lock_irqsave(&drvdata->spinlock, flags);
-	if (drvdata->reading) {
+	do {
 		ret = -EINVAL;
-		goto out;
-	}
+		if (drvdata->reading)
+			break;
+		/*
+		 * In Perf mode there can be only one writer per sink.  There
+		 * is also no need to continue if the ETB/ETF is already
+		 * operated from sysFS.
+		 */
+		if (drvdata->mode != CS_MODE_DISABLED)
+			break;
 
-	/*
-	 * In Perf mode there can be only one writer per sink.  There
-	 * is also no need to continue if the ETB/ETR is already operated
-	 * from sysFS.
-	 */
-	if (drvdata->mode != CS_MODE_DISABLED) {
-		ret = -EINVAL;
-		goto out;
-	}
-
-	drvdata->mode = CS_MODE_PERF;
-	tmc_etb_enable_hw(drvdata);
-out:
+		ret = tmc_set_etf_buffer(csdev, handle);
+		if (ret)
+			break;
+		ret  = tmc_etb_enable_hw(drvdata);
+		if (!ret) {
+			drvdata->mode = CS_MODE_PERF;
+			atomic_inc(csdev->refcnt);
+		}
+	} while (0);
 	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
 	return ret;
 }
 
-static int tmc_enable_etf_sink(struct coresight_device *csdev, u32 mode)
+static int tmc_enable_etf_sink(struct coresight_device *csdev,
+			       u32 mode, void *data)
 {
 	int ret;
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
@@ -222,7 +268,7 @@
 		ret = tmc_enable_etf_sink_sysfs(csdev);
 		break;
 	case CS_MODE_PERF:
-		ret = tmc_enable_etf_sink_perf(csdev);
+		ret = tmc_enable_etf_sink_perf(csdev, data);
 		break;
 	/* We shouldn't be here */
 	default:
@@ -233,37 +279,45 @@
 	if (ret)
 		return ret;
 
-	dev_info(drvdata->dev, "TMC-ETB/ETF enabled\n");
+	dev_dbg(drvdata->dev, "TMC-ETB/ETF enabled\n");
 	return 0;
 }
 
-static void tmc_disable_etf_sink(struct coresight_device *csdev)
+static int tmc_disable_etf_sink(struct coresight_device *csdev)
 {
 	unsigned long flags;
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
 	spin_lock_irqsave(&drvdata->spinlock, flags);
+
 	if (drvdata->reading) {
 		spin_unlock_irqrestore(&drvdata->spinlock, flags);
-		return;
+		return -EBUSY;
 	}
 
-	/* Disable the TMC only if it needs to */
-	if (drvdata->mode != CS_MODE_DISABLED) {
-		tmc_etb_disable_hw(drvdata);
-		drvdata->mode = CS_MODE_DISABLED;
+	if (atomic_dec_return(csdev->refcnt)) {
+		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		return -EBUSY;
 	}
 
+	/* Complain if we (somehow) got out of sync */
+	WARN_ON_ONCE(drvdata->mode == CS_MODE_DISABLED);
+	tmc_etb_disable_hw(drvdata);
+	drvdata->mode = CS_MODE_DISABLED;
+
 	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
-	dev_info(drvdata->dev, "TMC-ETB/ETF disabled\n");
+	dev_dbg(drvdata->dev, "TMC-ETB/ETF disabled\n");
+	return 0;
 }
 
 static int tmc_enable_etf_link(struct coresight_device *csdev,
 			       int inport, int outport)
 {
+	int ret = 0;
 	unsigned long flags;
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+	bool first_enable = false;
 
 	spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (drvdata->reading) {
@@ -271,12 +325,20 @@
 		return -EBUSY;
 	}
 
-	tmc_etf_enable_hw(drvdata);
-	drvdata->mode = CS_MODE_SYSFS;
+	if (atomic_read(&csdev->refcnt[0]) == 0) {
+		ret = tmc_etf_enable_hw(drvdata);
+		if (!ret) {
+			drvdata->mode = CS_MODE_SYSFS;
+			first_enable = true;
+		}
+	}
+	if (!ret)
+		atomic_inc(&csdev->refcnt[0]);
 	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
-	dev_info(drvdata->dev, "TMC-ETF enabled\n");
-	return 0;
+	if (first_enable)
+		dev_dbg(drvdata->dev, "TMC-ETF enabled\n");
+	return ret;
 }
 
 static void tmc_disable_etf_link(struct coresight_device *csdev,
@@ -284,6 +346,7 @@
 {
 	unsigned long flags;
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+	bool last_disable = false;
 
 	spin_lock_irqsave(&drvdata->spinlock, flags);
 	if (drvdata->reading) {
@@ -291,17 +354,22 @@
 		return;
 	}
 
-	tmc_etf_disable_hw(drvdata);
-	drvdata->mode = CS_MODE_DISABLED;
+	if (atomic_dec_return(&csdev->refcnt[0]) == 0) {
+		tmc_etf_disable_hw(drvdata);
+		drvdata->mode = CS_MODE_DISABLED;
+		last_disable = true;
+	}
 	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
-	dev_info(drvdata->dev, "TMC-ETF disabled\n");
+	if (last_disable)
+		dev_dbg(drvdata->dev, "TMC-ETF disabled\n");
 }
 
-static void *tmc_alloc_etf_buffer(struct coresight_device *csdev, int cpu,
-				  void **pages, int nr_pages, bool overwrite)
+static void *tmc_alloc_etf_buffer(struct coresight_device *csdev,
+				  struct perf_event *event, void **pages,
+				  int nr_pages, bool overwrite)
 {
-	int node;
+	int node, cpu = event->cpu;
 	struct cs_buffers *buf;
 
 	if (cpu == -1)
@@ -328,12 +396,14 @@
 }
 
 static int tmc_set_etf_buffer(struct coresight_device *csdev,
-			      struct perf_output_handle *handle,
-			      void *sink_config)
+			      struct perf_output_handle *handle)
 {
 	int ret = 0;
 	unsigned long head;
-	struct cs_buffers *buf = sink_config;
+	struct cs_buffers *buf = etm_perf_sink_config(handle);
+
+	if (!buf)
+		return -EINVAL;
 
 	/* wrap head around to the amount of space we have */
 	head = handle->head & ((buf->nr_pages << PAGE_SHIFT) - 1);
@@ -349,36 +419,7 @@
 	return ret;
 }
 
-static unsigned long tmc_reset_etf_buffer(struct coresight_device *csdev,
-					  struct perf_output_handle *handle,
-					  void *sink_config)
-{
-	long size = 0;
-	struct cs_buffers *buf = sink_config;
-
-	if (buf) {
-		/*
-		 * In snapshot mode ->data_size holds the new address of the
-		 * ring buffer's head.  The size itself is the whole address
-		 * range since we want the latest information.
-		 */
-		if (buf->snapshot)
-			handle->head = local_xchg(&buf->data_size,
-						  buf->nr_pages << PAGE_SHIFT);
-		/*
-		 * Tell the tracer PMU how much we got in this run and if
-		 * something went wrong along the way.  Nobody else can use
-		 * this cs_buffers instance until we are done.  As such
-		 * resetting parameters here and squaring off with the ring
-		 * buffer API in the tracer PMU is fine.
-		 */
-		size = local_xchg(&buf->data_size, 0);
-	}
-
-	return size;
-}
-
-static void tmc_update_etf_buffer(struct coresight_device *csdev,
+static unsigned long tmc_update_etf_buffer(struct coresight_device *csdev,
 				  struct perf_output_handle *handle,
 				  void *sink_config)
 {
@@ -387,18 +428,19 @@
 	const u32 *barrier;
 	u32 *buf_ptr;
 	u64 read_ptr, write_ptr;
-	u32 status, to_read;
-	unsigned long offset;
+	u32 status;
+	unsigned long offset, to_read, flags;
 	struct cs_buffers *buf = sink_config;
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
 	if (!buf)
-		return;
+		return 0;
 
 	/* This shouldn't happen */
 	if (WARN_ON_ONCE(drvdata->mode != CS_MODE_PERF))
-		return;
+		return 0;
 
+	spin_lock_irqsave(&drvdata->spinlock, flags);
 	CS_UNLOCK(drvdata->base);
 
 	tmc_flush_and_stop(drvdata);
@@ -421,33 +463,16 @@
 	/*
 	 * The TMC RAM buffer may be bigger than the space available in the
 	 * perf ring buffer (handle->size).  If so advance the RRP so that we
-	 * get the latest trace data.
+	 * get the latest trace data.  In snapshot mode none of that matters
+	 * since we are expected to clobber stale data in favour of the latest
+	 * traces.
 	 */
-	if (to_read > handle->size) {
-		u32 mask = 0;
-
-		/*
-		 * The value written to RRP must be byte-address aligned to
-		 * the width of the trace memory databus _and_ to a frame
-		 * boundary (16 byte), whichever is the biggest. For example,
-		 * for 32-bit, 64-bit and 128-bit wide trace memory, the four
-		 * LSBs must be 0s. For 256-bit wide trace memory, the five
-		 * LSBs must be 0s.
-		 */
-		switch (drvdata->memwidth) {
-		case TMC_MEM_INTF_WIDTH_32BITS:
-		case TMC_MEM_INTF_WIDTH_64BITS:
-		case TMC_MEM_INTF_WIDTH_128BITS:
-			mask = GENMASK(31, 4);
-			break;
-		case TMC_MEM_INTF_WIDTH_256BITS:
-			mask = GENMASK(31, 5);
-			break;
-		}
+	if (!buf->snapshot && to_read > handle->size) {
+		u32 mask = tmc_get_memwidth_mask(drvdata);
 
 		/*
 		 * Make sure the new size is aligned in accordance with the
-		 * requirement explained above.
+		 * requirement explained in function tmc_get_memwidth_mask().
 		 */
 		to_read = handle->size & mask;
 		/* Move the RAM read pointer up */
@@ -460,7 +485,13 @@
 		lost = true;
 	}
 
-	if (lost)
+	/*
+	 * Don't set the TRUNCATED flag in snapshot mode because 1) the
+	 * captured buffer is expected to be truncated and 2) a full buffer
+	 * prevents the event from being re-enabled by the perf core,
+	 * resulting in stale data being send to user space.
+	 */
+	if (!buf->snapshot && lost)
 		perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED);
 
 	cur = buf->cur;
@@ -486,18 +517,15 @@
 		}
 	}
 
-	/*
-	 * In snapshot mode all we have to do is communicate to
-	 * perf_aux_output_end() the address of the current head.  In full
-	 * trace mode the same function expects a size to move rb->aux_head
-	 * forward.
-	 */
-	if (buf->snapshot)
-		local_set(&buf->data_size, (cur * PAGE_SIZE) + offset);
-	else
-		local_add(to_read, &buf->data_size);
-
+	/* In snapshot mode we have to update the head */
+	if (buf->snapshot) {
+		handle->head = (cur * PAGE_SIZE) + offset;
+		to_read = buf->nr_pages << PAGE_SHIFT;
+	}
 	CS_LOCK(drvdata->base);
+	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+
+	return to_read;
 }
 
 static const struct coresight_ops_sink tmc_etf_sink_ops = {
@@ -505,8 +533,6 @@
 	.disable	= tmc_disable_etf_sink,
 	.alloc_buffer	= tmc_alloc_etf_buffer,
 	.free_buffer	= tmc_free_etf_buffer,
-	.set_buffer	= tmc_set_etf_buffer,
-	.reset_buffer	= tmc_reset_etf_buffer,
 	.update_buffer	= tmc_update_etf_buffer,
 };
 
@@ -563,7 +589,7 @@
 
 	/* Disable the TMC if need be */
 	if (drvdata->mode == CS_MODE_SYSFS)
-		tmc_etb_disable_hw(drvdata);
+		__tmc_etb_disable_hw(drvdata);
 
 	drvdata->reading = true;
 out:
@@ -603,7 +629,7 @@
 		 * can't be NULL.
 		 */
 		memset(drvdata->buf, 0, drvdata->size);
-		tmc_etb_enable_hw(drvdata);
+		__tmc_etb_enable_hw(drvdata);
 	} else {
 		/*
 		 * The ETB/ETF is not tracing and the buffer was just read.
diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
index 2d6f428..a655544 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
@@ -4,12 +4,18 @@
  * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
  */
 
+#include <linux/atomic.h>
 #include <linux/coresight.h>
 #include <linux/dma-mapping.h>
 #include <linux/iommu.h>
+#include <linux/idr.h>
+#include <linux/mutex.h>
+#include <linux/refcount.h>
 #include <linux/slab.h>
+#include <linux/types.h>
 #include <linux/vmalloc.h>
 #include "coresight-catu.h"
+#include "coresight-etm-perf.h"
 #include "coresight-priv.h"
 #include "coresight-tmc.h"
 
@@ -21,6 +27,32 @@
 };
 
 /*
+ * etr_perf_buffer - Perf buffer used for ETR
+ * @drvdata		- The ETR drvdaga this buffer has been allocated for.
+ * @etr_buf		- Actual buffer used by the ETR
+ * @pid			- The PID this etr_perf_buffer belongs to.
+ * @snaphost		- Perf session mode
+ * @head		- handle->head at the beginning of the session.
+ * @nr_pages		- Number of pages in the ring buffer.
+ * @pages		- Array of Pages in the ring buffer.
+ */
+struct etr_perf_buffer {
+	struct tmc_drvdata	*drvdata;
+	struct etr_buf		*etr_buf;
+	pid_t			pid;
+	bool			snapshot;
+	unsigned long		head;
+	int			nr_pages;
+	void			**pages;
+};
+
+/* Convert the perf index to an offset within the ETR buffer */
+#define PERF_IDX2OFF(idx, buf)	((idx) % ((buf)->nr_pages << PAGE_SHIFT))
+
+/* Lower limit for ETR hardware buffer */
+#define TMC_ETR_PERF_MIN_BUF_SIZE	SZ_1M
+
+/*
  * The TMC ETR SG has a page size of 4K. The SG table contains pointers
  * to 4KB buffers. However, the OS may use a PAGE_SIZE different from
  * 4K (i.e, 16KB or 64KB). This implies that a single OS page could
@@ -728,12 +760,14 @@
 	return NULL;
 }
 
-static inline void tmc_etr_enable_catu(struct tmc_drvdata *drvdata)
+static inline int tmc_etr_enable_catu(struct tmc_drvdata *drvdata,
+				      struct etr_buf *etr_buf)
 {
 	struct coresight_device *catu = tmc_etr_get_catu_device(drvdata);
 
 	if (catu && helper_ops(catu)->enable)
-		helper_ops(catu)->enable(catu, drvdata->etr_buf);
+		return helper_ops(catu)->enable(catu, etr_buf);
+	return 0;
 }
 
 static inline void tmc_etr_disable_catu(struct tmc_drvdata *drvdata)
@@ -747,7 +781,8 @@
 static const struct etr_buf_operations *etr_buf_ops[] = {
 	[ETR_MODE_FLAT] = &etr_flat_buf_ops,
 	[ETR_MODE_ETR_SG] = &etr_sg_buf_ops,
-	[ETR_MODE_CATU] = &etr_catu_buf_ops,
+	[ETR_MODE_CATU] = IS_ENABLED(CONFIG_CORESIGHT_CATU)
+						? &etr_catu_buf_ops : NULL,
 };
 
 static inline int tmc_etr_mode_alloc_buf(int mode,
@@ -761,7 +796,7 @@
 	case ETR_MODE_FLAT:
 	case ETR_MODE_ETR_SG:
 	case ETR_MODE_CATU:
-		if (etr_buf_ops[mode]->alloc)
+		if (etr_buf_ops[mode] && etr_buf_ops[mode]->alloc)
 			rc = etr_buf_ops[mode]->alloc(drvdata, etr_buf,
 						      node, pages);
 		if (!rc)
@@ -828,6 +863,7 @@
 		return ERR_PTR(rc);
 	}
 
+	refcount_set(&etr_buf->refcount, 1);
 	dev_dbg(drvdata->dev, "allocated buffer of size %ldKB in mode %d\n",
 		(unsigned long)size >> 10, etr_buf->mode);
 	return etr_buf;
@@ -884,32 +920,30 @@
 	rrp = tmc_read_rrp(drvdata);
 	rwp = tmc_read_rwp(drvdata);
 	status = readl_relaxed(drvdata->base + TMC_STS);
+
+	/*
+	 * If there were memory errors in the session, truncate the
+	 * buffer.
+	 */
+	if (WARN_ON_ONCE(status & TMC_STS_MEMERR)) {
+		dev_dbg(&drvdata->csdev->dev,
+			"tmc memory error detected, truncating buffer\n");
+		etr_buf->len = 0;
+		etr_buf->full = 0;
+		return;
+	}
+
 	etr_buf->full = status & TMC_STS_FULL;
 
 	WARN_ON(!etr_buf->ops || !etr_buf->ops->sync);
 
 	etr_buf->ops->sync(etr_buf, rrp, rwp);
-
-	/* Insert barrier packets at the beginning, if there was an overflow */
-	if (etr_buf->full)
-		tmc_etr_buf_insert_barrier_packet(etr_buf, etr_buf->offset);
 }
 
-static void tmc_etr_enable_hw(struct tmc_drvdata *drvdata,
-			      struct etr_buf *etr_buf)
+static void __tmc_etr_enable_hw(struct tmc_drvdata *drvdata)
 {
 	u32 axictl, sts;
-
-	/* Callers should provide an appropriate buffer for use */
-	if (WARN_ON(!etr_buf || drvdata->etr_buf))
-		return;
-	drvdata->etr_buf = etr_buf;
-
-	/*
-	 * If this ETR is connected to a CATU, enable it before we turn
-	 * this on
-	 */
-	tmc_etr_enable_catu(drvdata);
+	struct etr_buf *etr_buf = drvdata->etr_buf;
 
 	CS_UNLOCK(drvdata->base);
 
@@ -929,11 +963,8 @@
 		axictl |= TMC_AXICTL_ARCACHE_OS;
 	}
 
-	if (etr_buf->mode == ETR_MODE_ETR_SG) {
-		if (WARN_ON(!tmc_etr_has_cap(drvdata, TMC_ETR_SG)))
-			return;
+	if (etr_buf->mode == ETR_MODE_ETR_SG)
 		axictl |= TMC_AXICTL_SCT_GAT_MODE;
-	}
 
 	writel_relaxed(axictl, drvdata->base + TMC_AXICTL);
 	tmc_write_dba(drvdata, etr_buf->hwaddr);
@@ -959,6 +990,38 @@
 	CS_LOCK(drvdata->base);
 }
 
+static int tmc_etr_enable_hw(struct tmc_drvdata *drvdata,
+			     struct etr_buf *etr_buf)
+{
+	int rc;
+
+	/* Callers should provide an appropriate buffer for use */
+	if (WARN_ON(!etr_buf))
+		return -EINVAL;
+
+	if ((etr_buf->mode == ETR_MODE_ETR_SG) &&
+	    WARN_ON(!tmc_etr_has_cap(drvdata, TMC_ETR_SG)))
+		return -EINVAL;
+
+	if (WARN_ON(drvdata->etr_buf))
+		return -EBUSY;
+
+	/*
+	 * If this ETR is connected to a CATU, enable it before we turn
+	 * this on.
+	 */
+	rc = tmc_etr_enable_catu(drvdata, etr_buf);
+	if (rc)
+		return rc;
+	rc = coresight_claim_device(drvdata->base);
+	if (!rc) {
+		drvdata->etr_buf = etr_buf;
+		__tmc_etr_enable_hw(drvdata);
+	}
+
+	return rc;
+}
+
 /*
  * Return the available trace data in the buffer (starts at etr_buf->offset,
  * limited by etr_buf->len) from @pos, with a maximum limit of @len,
@@ -1011,10 +1074,17 @@
 		drvdata->sysfs_buf = NULL;
 	} else {
 		tmc_sync_etr_buf(drvdata);
+		/*
+		 * Insert barrier packets at the beginning, if there was
+		 * an overflow.
+		 */
+		if (etr_buf->full)
+			tmc_etr_buf_insert_barrier_packet(etr_buf,
+							  etr_buf->offset);
 	}
 }
 
-static void tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
+static void __tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
 {
 	CS_UNLOCK(drvdata->base);
 
@@ -1030,8 +1100,14 @@
 
 	CS_LOCK(drvdata->base);
 
+}
+
+static void tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
+{
+	__tmc_etr_disable_hw(drvdata);
 	/* Disable CATU device if this ETR is connected to one */
 	tmc_etr_disable_catu(drvdata);
+	coresight_disclaim_device(drvdata->base);
 	/* Reset the ETR buf used by hardware */
 	drvdata->etr_buf = NULL;
 }
@@ -1075,8 +1151,10 @@
 	 * sink is already enabled no memory is needed and the HW need not be
 	 * touched, even if the buffer size has changed.
 	 */
-	if (drvdata->mode == CS_MODE_SYSFS)
+	if (drvdata->mode == CS_MODE_SYSFS) {
+		atomic_inc(csdev->refcnt);
 		goto out;
+	}
 
 	/*
 	 * If we don't have a buffer or it doesn't match the requested size,
@@ -1088,8 +1166,11 @@
 		drvdata->sysfs_buf = new_buf;
 	}
 
-	drvdata->mode = CS_MODE_SYSFS;
-	tmc_etr_enable_hw(drvdata, drvdata->sysfs_buf);
+	ret = tmc_etr_enable_hw(drvdata, drvdata->sysfs_buf);
+	if (!ret) {
+		drvdata->mode = CS_MODE_SYSFS;
+		atomic_inc(csdev->refcnt);
+	}
 out:
 	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
@@ -1098,55 +1179,482 @@
 		tmc_etr_free_sysfs_buf(free_buf);
 
 	if (!ret)
-		dev_info(drvdata->dev, "TMC-ETR enabled\n");
+		dev_dbg(drvdata->dev, "TMC-ETR enabled\n");
 
 	return ret;
 }
 
-static int tmc_enable_etr_sink_perf(struct coresight_device *csdev)
+/*
+ * alloc_etr_buf: Allocate ETR buffer for use by perf.
+ * The size of the hardware buffer is dependent on the size configured
+ * via sysfs and the perf ring buffer size. We prefer to allocate the
+ * largest possible size, scaling down the size by half until it
+ * reaches a minimum limit (1M), beyond which we give up.
+ */
+static struct etr_buf *
+alloc_etr_buf(struct tmc_drvdata *drvdata, struct perf_event *event,
+	      int nr_pages, void **pages, bool snapshot)
 {
-	/* We don't support perf mode yet ! */
-	return -EINVAL;
+	int node;
+	struct etr_buf *etr_buf;
+	unsigned long size;
+
+	node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu);
+	/*
+	 * Try to match the perf ring buffer size if it is larger
+	 * than the size requested via sysfs.
+	 */
+	if ((nr_pages << PAGE_SHIFT) > drvdata->size) {
+		etr_buf = tmc_alloc_etr_buf(drvdata, (nr_pages << PAGE_SHIFT),
+					    0, node, NULL);
+		if (!IS_ERR(etr_buf))
+			goto done;
+	}
+
+	/*
+	 * Else switch to configured size for this ETR
+	 * and scale down until we hit the minimum limit.
+	 */
+	size = drvdata->size;
+	do {
+		etr_buf = tmc_alloc_etr_buf(drvdata, size, 0, node, NULL);
+		if (!IS_ERR(etr_buf))
+			goto done;
+		size /= 2;
+	} while (size >= TMC_ETR_PERF_MIN_BUF_SIZE);
+
+	return ERR_PTR(-ENOMEM);
+
+done:
+	return etr_buf;
 }
 
-static int tmc_enable_etr_sink(struct coresight_device *csdev, u32 mode)
+static struct etr_buf *
+get_perf_etr_buf_cpu_wide(struct tmc_drvdata *drvdata,
+			  struct perf_event *event, int nr_pages,
+			  void **pages, bool snapshot)
+{
+	int ret;
+	pid_t pid = task_pid_nr(event->owner);
+	struct etr_buf *etr_buf;
+
+retry:
+	/*
+	 * An etr_perf_buffer is associated with an event and holds a reference
+	 * to the AUX ring buffer that was created for that event.  In CPU-wide
+	 * N:1 mode multiple events (one per CPU), each with its own AUX ring
+	 * buffer, share a sink.  As such an etr_perf_buffer is created for each
+	 * event but a single etr_buf associated with the ETR is shared between
+	 * them.  The last event in a trace session will copy the content of the
+	 * etr_buf to its AUX ring buffer.  Ring buffer associated to other
+	 * events are simply not used an freed as events are destoyed.  We still
+	 * need to allocate a ring buffer for each event since we don't know
+	 * which event will be last.
+	 */
+
+	/*
+	 * The first thing to do here is check if an etr_buf has already been
+	 * allocated for this session.  If so it is shared with this event,
+	 * otherwise it is created.
+	 */
+	mutex_lock(&drvdata->idr_mutex);
+	etr_buf = idr_find(&drvdata->idr, pid);
+	if (etr_buf) {
+		refcount_inc(&etr_buf->refcount);
+		mutex_unlock(&drvdata->idr_mutex);
+		return etr_buf;
+	}
+
+	/* If we made it here no buffer has been allocated, do so now. */
+	mutex_unlock(&drvdata->idr_mutex);
+
+	etr_buf = alloc_etr_buf(drvdata, event, nr_pages, pages, snapshot);
+	if (IS_ERR(etr_buf))
+		return etr_buf;
+
+	/* Now that we have a buffer, add it to the IDR. */
+	mutex_lock(&drvdata->idr_mutex);
+	ret = idr_alloc(&drvdata->idr, etr_buf, pid, pid + 1, GFP_KERNEL);
+	mutex_unlock(&drvdata->idr_mutex);
+
+	/* Another event with this session ID has allocated this buffer. */
+	if (ret == -ENOSPC) {
+		tmc_free_etr_buf(etr_buf);
+		goto retry;
+	}
+
+	/* The IDR can't allocate room for a new session, abandon ship. */
+	if (ret == -ENOMEM) {
+		tmc_free_etr_buf(etr_buf);
+		return ERR_PTR(ret);
+	}
+
+
+	return etr_buf;
+}
+
+static struct etr_buf *
+get_perf_etr_buf_per_thread(struct tmc_drvdata *drvdata,
+			    struct perf_event *event, int nr_pages,
+			    void **pages, bool snapshot)
+{
+	/*
+	 * In per-thread mode the etr_buf isn't shared, so just go ahead
+	 * with memory allocation.
+	 */
+	return alloc_etr_buf(drvdata, event, nr_pages, pages, snapshot);
+}
+
+static struct etr_buf *
+get_perf_etr_buf(struct tmc_drvdata *drvdata, struct perf_event *event,
+		 int nr_pages, void **pages, bool snapshot)
+{
+	if (event->cpu == -1)
+		return get_perf_etr_buf_per_thread(drvdata, event, nr_pages,
+						   pages, snapshot);
+
+	return get_perf_etr_buf_cpu_wide(drvdata, event, nr_pages,
+					 pages, snapshot);
+}
+
+static struct etr_perf_buffer *
+tmc_etr_setup_perf_buf(struct tmc_drvdata *drvdata, struct perf_event *event,
+		       int nr_pages, void **pages, bool snapshot)
+{
+	int node;
+	struct etr_buf *etr_buf;
+	struct etr_perf_buffer *etr_perf;
+
+	node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu);
+
+	etr_perf = kzalloc_node(sizeof(*etr_perf), GFP_KERNEL, node);
+	if (!etr_perf)
+		return ERR_PTR(-ENOMEM);
+
+	etr_buf = get_perf_etr_buf(drvdata, event, nr_pages, pages, snapshot);
+	if (!IS_ERR(etr_buf))
+		goto done;
+
+	kfree(etr_perf);
+	return ERR_PTR(-ENOMEM);
+
+done:
+	/*
+	 * Keep a reference to the ETR this buffer has been allocated for
+	 * in order to have access to the IDR in tmc_free_etr_buffer().
+	 */
+	etr_perf->drvdata = drvdata;
+	etr_perf->etr_buf = etr_buf;
+
+	return etr_perf;
+}
+
+
+static void *tmc_alloc_etr_buffer(struct coresight_device *csdev,
+				  struct perf_event *event, void **pages,
+				  int nr_pages, bool snapshot)
+{
+	struct etr_perf_buffer *etr_perf;
+	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+
+	etr_perf = tmc_etr_setup_perf_buf(drvdata, event,
+					  nr_pages, pages, snapshot);
+	if (IS_ERR(etr_perf)) {
+		dev_dbg(drvdata->dev, "Unable to allocate ETR buffer\n");
+		return NULL;
+	}
+
+	etr_perf->pid = task_pid_nr(event->owner);
+	etr_perf->snapshot = snapshot;
+	etr_perf->nr_pages = nr_pages;
+	etr_perf->pages = pages;
+
+	return etr_perf;
+}
+
+static void tmc_free_etr_buffer(void *config)
+{
+	struct etr_perf_buffer *etr_perf = config;
+	struct tmc_drvdata *drvdata = etr_perf->drvdata;
+	struct etr_buf *buf, *etr_buf = etr_perf->etr_buf;
+
+	if (!etr_buf)
+		goto free_etr_perf_buffer;
+
+	mutex_lock(&drvdata->idr_mutex);
+	/* If we are not the last one to use the buffer, don't touch it. */
+	if (!refcount_dec_and_test(&etr_buf->refcount)) {
+		mutex_unlock(&drvdata->idr_mutex);
+		goto free_etr_perf_buffer;
+	}
+
+	/* We are the last one, remove from the IDR and free the buffer. */
+	buf = idr_remove(&drvdata->idr, etr_perf->pid);
+	mutex_unlock(&drvdata->idr_mutex);
+
+	/*
+	 * Something went very wrong if the buffer associated with this ID
+	 * is not the same in the IDR.  Leak to avoid use after free.
+	 */
+	if (buf && WARN_ON(buf != etr_buf))
+		goto free_etr_perf_buffer;
+
+	tmc_free_etr_buf(etr_perf->etr_buf);
+
+free_etr_perf_buffer:
+	kfree(etr_perf);
+}
+
+/*
+ * tmc_etr_sync_perf_buffer: Copy the actual trace data from the hardware
+ * buffer to the perf ring buffer.
+ */
+static void tmc_etr_sync_perf_buffer(struct etr_perf_buffer *etr_perf,
+				     unsigned long src_offset,
+				     unsigned long to_copy)
+{
+	long bytes;
+	long pg_idx, pg_offset;
+	unsigned long head = etr_perf->head;
+	char **dst_pages, *src_buf;
+	struct etr_buf *etr_buf = etr_perf->etr_buf;
+
+	head = etr_perf->head;
+	pg_idx = head >> PAGE_SHIFT;
+	pg_offset = head & (PAGE_SIZE - 1);
+	dst_pages = (char **)etr_perf->pages;
+
+	while (to_copy > 0) {
+		/*
+		 * In one iteration, we can copy minimum of :
+		 *  1) what is available in the source buffer,
+		 *  2) what is available in the source buffer, before it
+		 *     wraps around.
+		 *  3) what is available in the destination page.
+		 * in one iteration.
+		 */
+		if (src_offset >= etr_buf->size)
+			src_offset -= etr_buf->size;
+		bytes = tmc_etr_buf_get_data(etr_buf, src_offset, to_copy,
+					     &src_buf);
+		if (WARN_ON_ONCE(bytes <= 0))
+			break;
+		bytes = min(bytes, (long)(PAGE_SIZE - pg_offset));
+
+		memcpy(dst_pages[pg_idx] + pg_offset, src_buf, bytes);
+
+		to_copy -= bytes;
+
+		/* Move destination pointers */
+		pg_offset += bytes;
+		if (pg_offset == PAGE_SIZE) {
+			pg_offset = 0;
+			if (++pg_idx == etr_perf->nr_pages)
+				pg_idx = 0;
+		}
+
+		/* Move source pointers */
+		src_offset += bytes;
+	}
+}
+
+/*
+ * tmc_update_etr_buffer : Update the perf ring buffer with the
+ * available trace data. We use software double buffering at the moment.
+ *
+ * TODO: Add support for reusing the perf ring buffer.
+ */
+static unsigned long
+tmc_update_etr_buffer(struct coresight_device *csdev,
+		      struct perf_output_handle *handle,
+		      void *config)
+{
+	bool lost = false;
+	unsigned long flags, offset, size = 0;
+	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+	struct etr_perf_buffer *etr_perf = config;
+	struct etr_buf *etr_buf = etr_perf->etr_buf;
+
+	spin_lock_irqsave(&drvdata->spinlock, flags);
+
+	/* Don't do anything if another tracer is using this sink */
+	if (atomic_read(csdev->refcnt) != 1) {
+		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		goto out;
+	}
+
+	if (WARN_ON(drvdata->perf_buf != etr_buf)) {
+		lost = true;
+		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		goto out;
+	}
+
+	CS_UNLOCK(drvdata->base);
+
+	tmc_flush_and_stop(drvdata);
+	tmc_sync_etr_buf(drvdata);
+
+	CS_LOCK(drvdata->base);
+	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+
+	lost = etr_buf->full;
+	offset = etr_buf->offset;
+	size = etr_buf->len;
+
+	/*
+	 * The ETR buffer may be bigger than the space available in the
+	 * perf ring buffer (handle->size).  If so advance the offset so that we
+	 * get the latest trace data.  In snapshot mode none of that matters
+	 * since we are expected to clobber stale data in favour of the latest
+	 * traces.
+	 */
+	if (!etr_perf->snapshot && size > handle->size) {
+		u32 mask = tmc_get_memwidth_mask(drvdata);
+
+		/*
+		 * Make sure the new size is aligned in accordance with the
+		 * requirement explained in function tmc_get_memwidth_mask().
+		 */
+		size = handle->size & mask;
+		offset = etr_buf->offset + etr_buf->len - size;
+
+		if (offset >= etr_buf->size)
+			offset -= etr_buf->size;
+		lost = true;
+	}
+
+	/* Insert barrier packets at the beginning, if there was an overflow */
+	if (lost)
+		tmc_etr_buf_insert_barrier_packet(etr_buf, etr_buf->offset);
+	tmc_etr_sync_perf_buffer(etr_perf, offset, size);
+
+	/*
+	 * In snapshot mode we simply increment the head by the number of byte
+	 * that were written.  User space function  cs_etm_find_snapshot() will
+	 * figure out how many bytes to get from the AUX buffer based on the
+	 * position of the head.
+	 */
+	if (etr_perf->snapshot)
+		handle->head += size;
+out:
+	/*
+	 * Don't set the TRUNCATED flag in snapshot mode because 1) the
+	 * captured buffer is expected to be truncated and 2) a full buffer
+	 * prevents the event from being re-enabled by the perf core,
+	 * resulting in stale data being send to user space.
+	 */
+	if (!etr_perf->snapshot && lost)
+		perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED);
+	return size;
+}
+
+static int tmc_enable_etr_sink_perf(struct coresight_device *csdev, void *data)
+{
+	int rc = 0;
+	pid_t pid;
+	unsigned long flags;
+	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+	struct perf_output_handle *handle = data;
+	struct etr_perf_buffer *etr_perf = etm_perf_sink_config(handle);
+
+	spin_lock_irqsave(&drvdata->spinlock, flags);
+	 /* Don't use this sink if it is already claimed by sysFS */
+	if (drvdata->mode == CS_MODE_SYSFS) {
+		rc = -EBUSY;
+		goto unlock_out;
+	}
+
+	if (WARN_ON(!etr_perf || !etr_perf->etr_buf)) {
+		rc = -EINVAL;
+		goto unlock_out;
+	}
+
+	/* Get a handle on the pid of the process to monitor */
+	pid = etr_perf->pid;
+
+	/* Do not proceed if this device is associated with another session */
+	if (drvdata->pid != -1 && drvdata->pid != pid) {
+		rc = -EBUSY;
+		goto unlock_out;
+	}
+
+	etr_perf->head = PERF_IDX2OFF(handle->head, etr_perf);
+
+	/*
+	 * No HW configuration is needed if the sink is already in
+	 * use for this session.
+	 */
+	if (drvdata->pid == pid) {
+		atomic_inc(csdev->refcnt);
+		goto unlock_out;
+	}
+
+	rc = tmc_etr_enable_hw(drvdata, etr_perf->etr_buf);
+	if (!rc) {
+		/* Associate with monitored process. */
+		drvdata->pid = pid;
+		drvdata->mode = CS_MODE_PERF;
+		drvdata->perf_buf = etr_perf->etr_buf;
+		atomic_inc(csdev->refcnt);
+	}
+
+unlock_out:
+	spin_unlock_irqrestore(&drvdata->spinlock, flags);
+	return rc;
+}
+
+static int tmc_enable_etr_sink(struct coresight_device *csdev,
+			       u32 mode, void *data)
 {
 	switch (mode) {
 	case CS_MODE_SYSFS:
 		return tmc_enable_etr_sink_sysfs(csdev);
 	case CS_MODE_PERF:
-		return tmc_enable_etr_sink_perf(csdev);
+		return tmc_enable_etr_sink_perf(csdev, data);
 	}
 
 	/* We shouldn't be here */
 	return -EINVAL;
 }
 
-static void tmc_disable_etr_sink(struct coresight_device *csdev)
+static int tmc_disable_etr_sink(struct coresight_device *csdev)
 {
 	unsigned long flags;
 	struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
 	spin_lock_irqsave(&drvdata->spinlock, flags);
+
 	if (drvdata->reading) {
 		spin_unlock_irqrestore(&drvdata->spinlock, flags);
-		return;
+		return -EBUSY;
 	}
 
-	/* Disable the TMC only if it needs to */
-	if (drvdata->mode != CS_MODE_DISABLED) {
-		tmc_etr_disable_hw(drvdata);
-		drvdata->mode = CS_MODE_DISABLED;
+	if (atomic_dec_return(csdev->refcnt)) {
+		spin_unlock_irqrestore(&drvdata->spinlock, flags);
+		return -EBUSY;
 	}
 
+	/* Complain if we (somehow) got out of sync */
+	WARN_ON_ONCE(drvdata->mode == CS_MODE_DISABLED);
+	tmc_etr_disable_hw(drvdata);
+	/* Dissociate from monitored process. */
+	drvdata->pid = -1;
+	drvdata->mode = CS_MODE_DISABLED;
+	/* Reset perf specific data */
+	drvdata->perf_buf = NULL;
+
 	spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
-	dev_info(drvdata->dev, "TMC-ETR disabled\n");
+	dev_dbg(drvdata->dev, "TMC-ETR disabled\n");
+	return 0;
 }
 
 static const struct coresight_ops_sink tmc_etr_sink_ops = {
 	.enable		= tmc_enable_etr_sink,
 	.disable	= tmc_disable_etr_sink,
+	.alloc_buffer	= tmc_alloc_etr_buffer,
+	.update_buffer	= tmc_update_etr_buffer,
+	.free_buffer	= tmc_free_etr_buffer,
 };
 
 const struct coresight_ops tmc_etr_cs_ops = {
@@ -1168,21 +1676,19 @@
 		goto out;
 	}
 
-	/* Don't interfere if operated from Perf */
-	if (drvdata->mode == CS_MODE_PERF) {
-		ret = -EINVAL;
-		goto out;
-	}
-
-	/* If sysfs_buf is NULL the trace data has been read already */
+	/*
+	 * We can safely allow reads even if the ETR is operating in PERF mode,
+	 * since the sysfs session is captured in mode specific data.
+	 * If drvdata::sysfs_data is NULL the trace data has been read already.
+	 */
 	if (!drvdata->sysfs_buf) {
 		ret = -EINVAL;
 		goto out;
 	}
 
-	/* Disable the TMC if we are trying to read from a running session */
+	/* Disable the TMC if we are trying to read from a running session. */
 	if (drvdata->mode == CS_MODE_SYSFS)
-		tmc_etr_disable_hw(drvdata);
+		__tmc_etr_disable_hw(drvdata);
 
 	drvdata->reading = true;
 out:
@@ -1209,7 +1715,7 @@
 		 * buffer. Since the tracer is still enabled drvdata::buf can't
 		 * be NULL.
 		 */
-		tmc_etr_enable_hw(drvdata, drvdata->sysfs_buf);
+		__tmc_etr_enable_hw(drvdata);
 	} else {
 		/*
 		 * The ETR is not tracing and the buffer was just read.
diff --git a/drivers/hwtracing/coresight/coresight-tmc.c b/drivers/hwtracing/coresight/coresight-tmc.c
index 1b817ec..819fab6 100644
--- a/drivers/hwtracing/coresight/coresight-tmc.c
+++ b/drivers/hwtracing/coresight/coresight-tmc.c
@@ -8,10 +8,12 @@
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/device.h>
+#include <linux/idr.h>
 #include <linux/io.h>
 #include <linux/err.h>
 #include <linux/fs.h>
 #include <linux/miscdevice.h>
+#include <linux/mutex.h>
 #include <linux/property.h>
 #include <linux/uaccess.h>
 #include <linux/slab.h>
@@ -64,6 +66,34 @@
 	writel_relaxed(0x0, drvdata->base + TMC_CTL);
 }
 
+u32 tmc_get_memwidth_mask(struct tmc_drvdata *drvdata)
+{
+	u32 mask = 0;
+
+	/*
+	 * When moving RRP or an offset address forward, the new values must
+	 * be byte-address aligned to the width of the trace memory databus
+	 * _and_ to a frame boundary (16 byte), whichever is the biggest. For
+	 * example, for 32-bit, 64-bit and 128-bit wide trace memory, the four
+	 * LSBs must be 0s. For 256-bit wide trace memory, the five LSBs must
+	 * be 0s.
+	 */
+	switch (drvdata->memwidth) {
+	case TMC_MEM_INTF_WIDTH_32BITS:
+	/* fallthrough */
+	case TMC_MEM_INTF_WIDTH_64BITS:
+	/* fallthrough */
+	case TMC_MEM_INTF_WIDTH_128BITS:
+		mask = GENMASK(31, 4);
+		break;
+	case TMC_MEM_INTF_WIDTH_256BITS:
+		mask = GENMASK(31, 5);
+		break;
+	}
+
+	return mask;
+}
+
 static int tmc_read_prepare(struct tmc_drvdata *drvdata)
 {
 	int ret = 0;
@@ -81,7 +111,7 @@
 	}
 
 	if (!ret)
-		dev_info(drvdata->dev, "TMC read start\n");
+		dev_dbg(drvdata->dev, "TMC read start\n");
 
 	return ret;
 }
@@ -103,7 +133,7 @@
 	}
 
 	if (!ret)
-		dev_info(drvdata->dev, "TMC read end\n");
+		dev_dbg(drvdata->dev, "TMC read end\n");
 
 	return ret;
 }
@@ -229,6 +259,7 @@
 coresight_tmc_reg(mode, TMC_MODE);
 coresight_tmc_reg(pscr, TMC_PSCR);
 coresight_tmc_reg(axictl, TMC_AXICTL);
+coresight_tmc_reg(authstatus, TMC_AUTHSTATUS);
 coresight_tmc_reg(devid, CORESIGHT_DEVID);
 coresight_tmc_reg64(rrp, TMC_RRP, TMC_RRPHI);
 coresight_tmc_reg64(rwp, TMC_RWP, TMC_RWPHI);
@@ -248,6 +279,7 @@
 	&dev_attr_devid.attr,
 	&dev_attr_dba.attr,
 	&dev_attr_axictl.attr,
+	&dev_attr_authstatus.attr,
 	NULL,
 };
 
@@ -336,12 +368,24 @@
 				       "arm,scatter-gather");
 }
 
+static inline bool tmc_etr_has_non_secure_access(struct tmc_drvdata *drvdata)
+{
+	u32 auth = readl_relaxed(drvdata->base + TMC_AUTHSTATUS);
+
+	return (auth & TMC_AUTH_NSID_MASK) == 0x3;
+}
+
 /* Detect and initialise the capabilities of a TMC ETR */
 static int tmc_etr_setup_caps(struct tmc_drvdata *drvdata,
 			     u32 devid, void *dev_caps)
 {
+	int rc;
+
 	u32 dma_mask = 0;
 
+	if (!tmc_etr_has_non_secure_access(drvdata))
+		return -EACCES;
+
 	/* Set the unadvertised capabilities */
 	tmc_etr_init_caps(drvdata, (u32)(unsigned long)dev_caps);
 
@@ -369,7 +413,10 @@
 		dma_mask = 40;
 	}
 
-	return dma_set_mask_and_coherent(drvdata->dev, DMA_BIT_MASK(dma_mask));
+	rc = dma_set_mask_and_coherent(drvdata->dev, DMA_BIT_MASK(dma_mask));
+	if (rc)
+		dev_err(drvdata->dev, "Failed to setup DMA mask: %d\n", rc);
+	return rc;
 }
 
 static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
@@ -415,6 +462,8 @@
 	devid = readl_relaxed(drvdata->base + CORESIGHT_DEVID);
 	drvdata->config_type = BMVAL(devid, 6, 7);
 	drvdata->memwidth = tmc_get_memwidth(devid);
+	/* This device is not associated with a session */
+	drvdata->pid = -1;
 
 	if (drvdata->config_type == TMC_CONFIG_TYPE_ETR) {
 		if (np)
@@ -427,8 +476,6 @@
 		drvdata->size = readl_relaxed(drvdata->base + TMC_RSZ) * 4;
 	}
 
-	pm_runtime_put(&adev->dev);
-
 	desc.pdata = pdata;
 	desc.dev = dev;
 	desc.groups = coresight_tmc_groups;
@@ -446,6 +493,8 @@
 		ret = tmc_etr_setup_caps(drvdata, devid, id->data);
 		if (ret)
 			goto out;
+		idr_init(&drvdata->idr);
+		mutex_init(&drvdata->idr_mutex);
 		break;
 	case TMC_CONFIG_TYPE_ETF:
 		desc.type = CORESIGHT_DEV_TYPE_LINKSINK;
@@ -470,6 +519,8 @@
 	ret = misc_register(&drvdata->miscdev);
 	if (ret)
 		coresight_unregister(drvdata->csdev);
+	else
+		pm_runtime_put(&adev->dev);
 out:
 	return ret;
 }
diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h
index 872f63e..9ea049b 100644
--- a/drivers/hwtracing/coresight/coresight-tmc.h
+++ b/drivers/hwtracing/coresight/coresight-tmc.h
@@ -8,7 +8,10 @@
 #define _CORESIGHT_TMC_H
 
 #include <linux/dma-mapping.h>
+#include <linux/idr.h>
 #include <linux/miscdevice.h>
+#include <linux/mutex.h>
+#include <linux/refcount.h>
 
 #define TMC_RSZ			0x004
 #define TMC_STS			0x00c
@@ -36,6 +39,7 @@
 #define TMC_ITATBCTR2		0xef0
 #define TMC_ITATBCTR1		0xef4
 #define TMC_ITATBCTR0		0xef8
+#define TMC_AUTHSTATUS		0xfb8
 
 /* register description */
 /* TMC_CTL - 0x020 */
@@ -44,6 +48,7 @@
 #define TMC_STS_TMCREADY_BIT	2
 #define TMC_STS_FULL		BIT(0)
 #define TMC_STS_TRIGGERED	BIT(1)
+#define TMC_STS_MEMERR		BIT(5)
 /*
  * TMC_AXICTL - 0x110
  *
@@ -86,6 +91,8 @@
 #define TMC_DEVID_AXIAW_SHIFT	17
 #define TMC_DEVID_AXIAW_MASK	0x7f
 
+#define TMC_AUTH_NSID_MASK	GENMASK(1, 0)
+
 enum tmc_config_type {
 	TMC_CONFIG_TYPE_ETB,
 	TMC_CONFIG_TYPE_ETR,
@@ -133,6 +140,7 @@
 
 /**
  * struct etr_buf - Details of the buffer used by ETR
+ * refcount	; Number of sources currently using this etr_buf.
  * @mode	: Mode of the ETR buffer, contiguous, Scatter Gather etc.
  * @full	: Trace data overflow
  * @size	: Size of the buffer.
@@ -143,6 +151,7 @@
  * @private	: Backend specific information for the buf
  */
 struct etr_buf {
+	refcount_t			refcount;
 	enum etr_mode			mode;
 	bool				full;
 	ssize_t				size;
@@ -160,6 +169,8 @@
  * @csdev:	component vitals needed by the framework.
  * @miscdev:	specifics to handle "/dev/xyz.tmc" entry.
  * @spinlock:	only one at a time pls.
+ * @pid:	Process ID of the process being monitored by the session
+ *		that is using this component.
  * @buf:	Snapshot of the trace data for ETF/ETB.
  * @etr_buf:	details of buffer used in TMC-ETR
  * @len:	size of the available trace for ETF/ETB.
@@ -170,7 +181,10 @@
  * @trigger_cntr: amount of words to store after a trigger.
  * @etr_caps:	Bitmask of capabilities of the TMC ETR, inferred from the
  *		device configuration register (DEVID)
- * @sysfs_data:	SYSFS buffer for ETR.
+ * @idr:	Holds etr_bufs allocated for this ETR.
+ * @idr_mutex:	Access serialisation for idr.
+ * @sysfs_buf:	SYSFS buffer for ETR.
+ * @perf_buf:	PERF buffer for ETR.
  */
 struct tmc_drvdata {
 	void __iomem		*base;
@@ -178,6 +192,7 @@
 	struct coresight_device	*csdev;
 	struct miscdevice	miscdev;
 	spinlock_t		spinlock;
+	pid_t			pid;
 	bool			reading;
 	union {
 		char		*buf;		/* TMC ETB */
@@ -190,7 +205,10 @@
 	enum tmc_mem_intf_width	memwidth;
 	u32			trigger_cntr;
 	u32			etr_caps;
+	struct idr		idr;
+	struct mutex		idr_mutex;
 	struct etr_buf		*sysfs_buf;
+	struct etr_buf		*perf_buf;
 };
 
 struct etr_buf_operations {
@@ -239,6 +257,7 @@
 void tmc_flush_and_stop(struct tmc_drvdata *drvdata);
 void tmc_enable_hw(struct tmc_drvdata *drvdata);
 void tmc_disable_hw(struct tmc_drvdata *drvdata);
+u32 tmc_get_memwidth_mask(struct tmc_drvdata *drvdata);
 
 /* ETB/ETF functions */
 int tmc_read_prepare_etb(struct tmc_drvdata *drvdata);
diff --git a/drivers/hwtracing/coresight/coresight-tpiu.c b/drivers/hwtracing/coresight/coresight-tpiu.c
index 459ef93..7acbeff 100644
--- a/drivers/hwtracing/coresight/coresight-tpiu.c
+++ b/drivers/hwtracing/coresight/coresight-tpiu.c
@@ -5,6 +5,7 @@
  * Description: CoreSight Trace Port Interface Unit driver
  */
 
+#include <linux/atomic.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/device.h>
@@ -68,13 +69,13 @@
 	CS_LOCK(drvdata->base);
 }
 
-static int tpiu_enable(struct coresight_device *csdev, u32 mode)
+static int tpiu_enable(struct coresight_device *csdev, u32 mode, void *__unused)
 {
 	struct tpiu_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
 	tpiu_enable_hw(drvdata);
-
-	dev_info(drvdata->dev, "TPIU enabled\n");
+	atomic_inc(csdev->refcnt);
+	dev_dbg(drvdata->dev, "TPIU enabled\n");
 	return 0;
 }
 
@@ -94,13 +95,17 @@
 	CS_LOCK(drvdata->base);
 }
 
-static void tpiu_disable(struct coresight_device *csdev)
+static int tpiu_disable(struct coresight_device *csdev)
 {
 	struct tpiu_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
+	if (atomic_dec_return(csdev->refcnt))
+		return -EBUSY;
+
 	tpiu_disable_hw(drvdata);
 
-	dev_info(drvdata->dev, "TPIU disabled\n");
+	dev_dbg(drvdata->dev, "TPIU disabled\n");
+	return 0;
 }
 
 static const struct coresight_ops_sink tpiu_sink_ops = {
diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c
index c0dabbd..ea641a8 100644
--- a/drivers/hwtracing/coresight/coresight.c
+++ b/drivers/hwtracing/coresight/coresight.c
@@ -11,6 +11,7 @@
 #include <linux/err.h>
 #include <linux/export.h>
 #include <linux/slab.h>
+#include <linux/stringhash.h>
 #include <linux/mutex.h>
 #include <linux/clk.h>
 #include <linux/coresight.h>
@@ -18,6 +19,7 @@
 #include <linux/delay.h>
 #include <linux/pm_runtime.h>
 
+#include "coresight-etm-perf.h"
 #include "coresight-priv.h"
 
 static DEFINE_MUTEX(coresight_mutex);
@@ -128,7 +130,94 @@
 	return -ENODEV;
 }
 
-static int coresight_enable_sink(struct coresight_device *csdev, u32 mode)
+static inline u32 coresight_read_claim_tags(void __iomem *base)
+{
+	return readl_relaxed(base + CORESIGHT_CLAIMCLR);
+}
+
+static inline bool coresight_is_claimed_self_hosted(void __iomem *base)
+{
+	return coresight_read_claim_tags(base) == CORESIGHT_CLAIM_SELF_HOSTED;
+}
+
+static inline bool coresight_is_claimed_any(void __iomem *base)
+{
+	return coresight_read_claim_tags(base) != 0;
+}
+
+static inline void coresight_set_claim_tags(void __iomem *base)
+{
+	writel_relaxed(CORESIGHT_CLAIM_SELF_HOSTED, base + CORESIGHT_CLAIMSET);
+	isb();
+}
+
+static inline void coresight_clear_claim_tags(void __iomem *base)
+{
+	writel_relaxed(CORESIGHT_CLAIM_SELF_HOSTED, base + CORESIGHT_CLAIMCLR);
+	isb();
+}
+
+/*
+ * coresight_claim_device_unlocked : Claim the device for self-hosted usage
+ * to prevent an external tool from touching this device. As per PSCI
+ * standards, section "Preserving the execution context" => "Debug and Trace
+ * save and Restore", DBGCLAIM[1] is reserved for Self-hosted debug/trace and
+ * DBGCLAIM[0] is reserved for external tools.
+ *
+ * Called with CS_UNLOCKed for the component.
+ * Returns : 0 on success
+ */
+int coresight_claim_device_unlocked(void __iomem *base)
+{
+	if (coresight_is_claimed_any(base))
+		return -EBUSY;
+
+	coresight_set_claim_tags(base);
+	if (coresight_is_claimed_self_hosted(base))
+		return 0;
+	/* There was a race setting the tags, clean up and fail */
+	coresight_clear_claim_tags(base);
+	return -EBUSY;
+}
+
+int coresight_claim_device(void __iomem *base)
+{
+	int rc;
+
+	CS_UNLOCK(base);
+	rc = coresight_claim_device_unlocked(base);
+	CS_LOCK(base);
+
+	return rc;
+}
+
+/*
+ * coresight_disclaim_device_unlocked : Clear the claim tags for the device.
+ * Called with CS_UNLOCKed for the component.
+ */
+void coresight_disclaim_device_unlocked(void __iomem *base)
+{
+
+	if (coresight_is_claimed_self_hosted(base))
+		coresight_clear_claim_tags(base);
+	else
+		/*
+		 * The external agent may have not honoured our claim
+		 * and has manipulated it. Or something else has seriously
+		 * gone wrong in our driver.
+		 */
+		WARN_ON_ONCE(1);
+}
+
+void coresight_disclaim_device(void __iomem *base)
+{
+	CS_UNLOCK(base);
+	coresight_disclaim_device_unlocked(base);
+	CS_LOCK(base);
+}
+
+static int coresight_enable_sink(struct coresight_device *csdev,
+				 u32 mode, void *data)
 {
 	int ret;
 
@@ -136,35 +225,37 @@
 	 * We need to make sure the "new" session is compatible with the
 	 * existing "mode" of operation.
 	 */
-	if (sink_ops(csdev)->enable) {
-		ret = sink_ops(csdev)->enable(csdev, mode);
-		if (ret)
-			return ret;
-		csdev->enable = true;
-	}
+	if (!sink_ops(csdev)->enable)
+		return -EINVAL;
 
-	atomic_inc(csdev->refcnt);
+	ret = sink_ops(csdev)->enable(csdev, mode, data);
+	if (ret)
+		return ret;
+	csdev->enable = true;
 
 	return 0;
 }
 
 static void coresight_disable_sink(struct coresight_device *csdev)
 {
-	if (atomic_dec_return(csdev->refcnt) == 0) {
-		if (sink_ops(csdev)->disable) {
-			sink_ops(csdev)->disable(csdev);
-			csdev->enable = false;
-		}
-	}
+	int ret;
+
+	if (!sink_ops(csdev)->disable)
+		return;
+
+	ret = sink_ops(csdev)->disable(csdev);
+	if (ret)
+		return;
+	csdev->enable = false;
 }
 
 static int coresight_enable_link(struct coresight_device *csdev,
 				 struct coresight_device *parent,
 				 struct coresight_device *child)
 {
-	int ret;
+	int ret = 0;
 	int link_subtype;
-	int refport, inport, outport;
+	int inport, outport;
 
 	if (!parent || !child)
 		return -EINVAL;
@@ -173,27 +264,17 @@
 	outport = coresight_find_link_outport(csdev, child);
 	link_subtype = csdev->subtype.link_subtype;
 
-	if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_MERG)
-		refport = inport;
-	else if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_SPLIT)
-		refport = outport;
-	else
-		refport = 0;
+	if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_MERG && inport < 0)
+		return inport;
+	if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_SPLIT && outport < 0)
+		return outport;
 
-	if (refport < 0)
-		return refport;
+	if (link_ops(csdev)->enable)
+		ret = link_ops(csdev)->enable(csdev, inport, outport);
+	if (!ret)
+		csdev->enable = true;
 
-	if (atomic_inc_return(&csdev->refcnt[refport]) == 1) {
-		if (link_ops(csdev)->enable) {
-			ret = link_ops(csdev)->enable(csdev, inport, outport);
-			if (ret)
-				return ret;
-		}
-	}
-
-	csdev->enable = true;
-
-	return 0;
+	return ret;
 }
 
 static void coresight_disable_link(struct coresight_device *csdev,
@@ -202,7 +283,7 @@
 {
 	int i, nr_conns;
 	int link_subtype;
-	int refport, inport, outport;
+	int inport, outport;
 
 	if (!parent || !child)
 		return;
@@ -212,20 +293,15 @@
 	link_subtype = csdev->subtype.link_subtype;
 
 	if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_MERG) {
-		refport = inport;
 		nr_conns = csdev->nr_inport;
 	} else if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_SPLIT) {
-		refport = outport;
 		nr_conns = csdev->nr_outport;
 	} else {
-		refport = 0;
 		nr_conns = 1;
 	}
 
-	if (atomic_dec_return(&csdev->refcnt[refport]) == 0) {
-		if (link_ops(csdev)->disable)
-			link_ops(csdev)->disable(csdev, inport, outport);
-	}
+	if (link_ops(csdev)->disable)
+		link_ops(csdev)->disable(csdev, inport, outport);
 
 	for (i = 0; i < nr_conns; i++)
 		if (atomic_read(&csdev->refcnt[i]) != 0)
@@ -276,13 +352,21 @@
 	return !csdev->enable;
 }
 
-void coresight_disable_path(struct list_head *path)
+/*
+ * coresight_disable_path_from : Disable components in the given path beyond
+ * @nd in the list. If @nd is NULL, all the components, except the SOURCE are
+ * disabled.
+ */
+static void coresight_disable_path_from(struct list_head *path,
+					struct coresight_node *nd)
 {
 	u32 type;
-	struct coresight_node *nd;
 	struct coresight_device *csdev, *parent, *child;
 
-	list_for_each_entry(nd, path, link) {
+	if (!nd)
+		nd = list_first_entry(path, struct coresight_node, link);
+
+	list_for_each_entry_continue(nd, path, link) {
 		csdev = nd->csdev;
 		type = csdev->type;
 
@@ -302,7 +386,12 @@
 			coresight_disable_sink(csdev);
 			break;
 		case CORESIGHT_DEV_TYPE_SOURCE:
-			/* sources are disabled from either sysFS or Perf */
+			/*
+			 * We skip the first node in the path assuming that it
+			 * is the source. So we don't expect a source device in
+			 * the middle of a path.
+			 */
+			WARN_ON(1);
 			break;
 		case CORESIGHT_DEV_TYPE_LINK:
 			parent = list_prev_entry(nd, link)->csdev;
@@ -315,7 +404,12 @@
 	}
 }
 
-int coresight_enable_path(struct list_head *path, u32 mode)
+void coresight_disable_path(struct list_head *path)
+{
+	coresight_disable_path_from(path, NULL);
+}
+
+int coresight_enable_path(struct list_head *path, u32 mode, void *sink_data)
 {
 
 	int ret = 0;
@@ -340,7 +434,7 @@
 
 		switch (type) {
 		case CORESIGHT_DEV_TYPE_SINK:
-			ret = coresight_enable_sink(csdev, mode);
+			ret = coresight_enable_sink(csdev, mode, sink_data);
 			/*
 			 * Sink is the first component turned on. If we
 			 * failed to enable the sink, there are no components
@@ -368,7 +462,7 @@
 out:
 	return ret;
 err:
-	coresight_disable_path(path);
+	coresight_disable_path_from(path, nd);
 	goto out;
 }
 
@@ -433,6 +527,47 @@
 	return dev ? to_coresight_device(dev) : NULL;
 }
 
+static int coresight_sink_by_id(struct device *dev, void *data)
+{
+	struct coresight_device *csdev = to_coresight_device(dev);
+	unsigned long hash;
+
+	if (csdev->type == CORESIGHT_DEV_TYPE_SINK ||
+	     csdev->type == CORESIGHT_DEV_TYPE_LINKSINK) {
+
+		if (!csdev->ea)
+			return 0;
+		/*
+		 * See function etm_perf_add_symlink_sink() to know where
+		 * this comes from.
+		 */
+		hash = (unsigned long)csdev->ea->var;
+
+		if ((u32)hash == *(u32 *)data)
+			return 1;
+	}
+
+	return 0;
+}
+
+/**
+ * coresight_get_sink_by_id - returns the sink that matches the id
+ * @id: Id of the sink to match
+ *
+ * The name of a sink is unique, whether it is found on the AMBA bus or
+ * otherwise.  As such the hash of that name can easily be used to identify
+ * a sink.
+ */
+struct coresight_device *coresight_get_sink_by_id(u32 id)
+{
+	struct device *dev = NULL;
+
+	dev = bus_find_device(&coresight_bustype, NULL, &id,
+			      coresight_sink_by_id);
+
+	return dev ? to_coresight_device(dev) : NULL;
+}
+
 /*
  * coresight_grab_device - Power up this device and any of the helper
  * devices connected to it for trace operation. Since the helper devices
@@ -643,7 +778,7 @@
 		goto out;
 	}
 
-	ret = coresight_enable_path(path, CS_MODE_SYSFS);
+	ret = coresight_enable_path(path, CS_MODE_SYSFS, NULL);
 	if (ret)
 		goto err_path;
 
@@ -823,7 +958,6 @@
 {
 	struct coresight_device *csdev = to_coresight_device(dev);
 
-	kfree(csdev->conns);
 	kfree(csdev->refcnt);
 	kfree(csdev);
 }
@@ -1014,7 +1148,7 @@
 	csdev = kzalloc(sizeof(*csdev), GFP_KERNEL);
 	if (!csdev) {
 		ret = -ENOMEM;
-		goto err_kzalloc_csdev;
+		goto err_out;
 	}
 
 	if (desc->type == CORESIGHT_DEV_TYPE_LINK ||
@@ -1030,7 +1164,7 @@
 	refcnts = kcalloc(nr_refcnts, sizeof(*refcnts), GFP_KERNEL);
 	if (!refcnts) {
 		ret = -ENOMEM;
-		goto err_kzalloc_refcnts;
+		goto err_free_csdev;
 	}
 
 	csdev->refcnt = refcnts;
@@ -1043,7 +1177,7 @@
 		conns = kcalloc(csdev->nr_outport, sizeof(*conns), GFP_KERNEL);
 		if (!conns) {
 			ret = -ENOMEM;
-			goto err_kzalloc_conns;
+			goto err_free_refcnts;
 		}
 
 		for (i = 0; i < csdev->nr_outport; i++) {
@@ -1070,7 +1204,27 @@
 	ret = device_register(&csdev->dev);
 	if (ret) {
 		put_device(&csdev->dev);
-		goto err_kzalloc_csdev;
+		/*
+		 * All resources are free'd explicitly via
+		 * coresight_device_release(), triggered from put_device().
+		 */
+		goto err_out;
+	}
+
+	if (csdev->type == CORESIGHT_DEV_TYPE_SINK ||
+	    csdev->type == CORESIGHT_DEV_TYPE_LINKSINK) {
+		ret = etm_perf_add_symlink_sink(csdev);
+
+		if (ret) {
+			device_unregister(&csdev->dev);
+			/*
+			 * As with the above, all resources are free'd
+			 * explicitly via coresight_device_release() triggered
+			 * from put_device(), which is in turn called from
+			 * function device_unregister().
+			 */
+			goto err_out;
+		}
 	}
 
 	mutex_lock(&coresight_mutex);
@@ -1082,19 +1236,26 @@
 
 	return csdev;
 
-err_kzalloc_conns:
+err_free_refcnts:
 	kfree(refcnts);
-err_kzalloc_refcnts:
+err_free_csdev:
 	kfree(csdev);
-err_kzalloc_csdev:
+err_out:
 	return ERR_PTR(ret);
 }
 EXPORT_SYMBOL_GPL(coresight_register);
 
 void coresight_unregister(struct coresight_device *csdev)
 {
+	etm_perf_del_symlink_sink(csdev);
 	/* Remove references of that device in the topology */
 	coresight_remove_conns(csdev);
 	device_unregister(&csdev->dev);
 }
 EXPORT_SYMBOL_GPL(coresight_unregister);
+
+bool coresight_loses_context_with_cpu(struct device *dev)
+{
+	return fwnode_property_present(dev_fwnode(dev),
+				       "arm,coresight-loses-context-with-cpu");
+}
diff --git a/drivers/hwtracing/coresight/of_coresight.c b/drivers/hwtracing/coresight/of_coresight.c
index 6880bee..2ecdd14 100644
--- a/drivers/hwtracing/coresight/of_coresight.c
+++ b/drivers/hwtracing/coresight/of_coresight.c
@@ -114,17 +114,79 @@
 }
 EXPORT_SYMBOL_GPL(of_coresight_get_cpu);
 
+/*
+ * of_coresight_parse_endpoint : Parse the given output endpoint @ep
+ * and fill the connection information in @pdata[@i].
+ *
+ * Parses the local port, remote device name and the remote port.
+ *
+ * Returns :
+ *	 1	- If the parsing is successful and a connection record
+ *		  was created for an output connection.
+ *	 0	- If the parsing completed without any fatal errors.
+ *	-Errno	- Fatal error, abort the scanning.
+ */
+static int of_coresight_parse_endpoint(struct device *dev,
+				       struct device_node *ep,
+				       struct coresight_platform_data *pdata,
+				       int i)
+{
+	int ret = 0;
+	struct of_endpoint endpoint, rendpoint;
+	struct device_node *rparent = NULL;
+	struct device_node *rep = NULL;
+	struct device *rdev = NULL;
+
+	do {
+		/* Parse the local port details */
+		if (of_graph_parse_endpoint(ep, &endpoint))
+			break;
+		/*
+		 * Get a handle on the remote endpoint and the device it is
+		 * attached to.
+		 */
+		rep = of_graph_get_remote_endpoint(ep);
+		if (!rep)
+			break;
+		rparent = of_graph_get_port_parent(rep);
+		if (!rparent)
+			break;
+		if (of_graph_parse_endpoint(rep, &rendpoint))
+			break;
+
+		/* If the remote device is not available, defer probing */
+		rdev = of_coresight_get_endpoint_device(rparent);
+		if (!rdev) {
+			ret = -EPROBE_DEFER;
+			break;
+		}
+
+		pdata->outports[i] = endpoint.port;
+		pdata->child_names[i] = devm_kstrdup(dev,
+						     dev_name(rdev),
+						     GFP_KERNEL);
+		pdata->child_ports[i] = rendpoint.port;
+		/* Connection record updated */
+		ret = 1;
+	} while (0);
+
+	if (rparent)
+		of_node_put(rparent);
+	if (rep)
+		of_node_put(rep);
+	if (rdev)
+		put_device(rdev);
+
+	return ret;
+}
+
 struct coresight_platform_data *
 of_get_coresight_platform_data(struct device *dev,
 			       const struct device_node *node)
 {
 	int i = 0, ret = 0;
 	struct coresight_platform_data *pdata;
-	struct of_endpoint endpoint, rendpoint;
-	struct device *rdev;
 	struct device_node *ep = NULL;
-	struct device_node *rparent = NULL;
-	struct device_node *rport = NULL;
 
 	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
 	if (!pdata)
@@ -132,64 +194,39 @@
 
 	/* Use device name as sysfs handle */
 	pdata->name = dev_name(dev);
+	pdata->cpu = of_coresight_get_cpu(node);
 
 	/* Get the number of input and output port for this component */
 	of_coresight_get_ports(node, &pdata->nr_inport, &pdata->nr_outport);
 
-	if (pdata->nr_outport) {
-		ret = of_coresight_alloc_memory(dev, pdata);
-		if (ret)
+	/* If there are no output connections, we are done */
+	if (!pdata->nr_outport)
+		return pdata;
+
+	ret = of_coresight_alloc_memory(dev, pdata);
+	if (ret)
+		return ERR_PTR(ret);
+
+	/* Iterate through each port to discover topology */
+	while ((ep = of_graph_get_next_endpoint(node, ep))) {
+		/*
+		 * No need to deal with input ports, as processing the
+		 * output ports connected to them will process the details.
+		 */
+		if (of_find_property(ep, "slave-mode", NULL))
+			continue;
+
+		ret = of_coresight_parse_endpoint(dev, ep, pdata, i);
+		switch (ret) {
+		case 1:
+			i++;		/* Fall through */
+		case 0:
+			break;
+		default:
 			return ERR_PTR(ret);
-
-		/* Iterate through each port to discover topology */
-		do {
-			/* Get a handle on a port */
-			ep = of_graph_get_next_endpoint(node, ep);
-			if (!ep)
-				break;
-
-			/*
-			 * No need to deal with input ports, processing for as
-			 * processing for output ports will deal with them.
-			 */
-			if (of_find_property(ep, "slave-mode", NULL))
-				continue;
-
-			/* Get a handle on the local endpoint */
-			ret = of_graph_parse_endpoint(ep, &endpoint);
-
-			if (ret)
-				continue;
-
-			/* The local out port number */
-			pdata->outports[i] = endpoint.port;
-
-			/*
-			 * Get a handle on the remote port and parent
-			 * attached to it.
-			 */
-			rparent = of_graph_get_remote_port_parent(ep);
-			rport = of_graph_get_remote_port(ep);
-
-			if (!rparent || !rport)
-				continue;
-
-			if (of_graph_parse_endpoint(rport, &rendpoint))
-				continue;
-
-			rdev = of_coresight_get_endpoint_device(rparent);
-			if (!rdev)
-				return ERR_PTR(-EPROBE_DEFER);
-
-			pdata->child_names[i] = dev_name(rdev);
-			pdata->child_ports[i] = rendpoint.id;
-
-			i++;
-		} while (ep);
+		}
 	}
 
-	pdata->cpu = of_coresight_get_cpu(node);
-
 	return pdata;
 }
 EXPORT_SYMBOL_GPL(of_get_coresight_platform_data);
diff --git a/drivers/i2c/i2c-core-of.c b/drivers/i2c/i2c-core-of.c
index 14d4884..5f489a5 100644
--- a/drivers/i2c/i2c-core-of.c
+++ b/drivers/i2c/i2c-core-of.c
@@ -53,6 +53,7 @@
 
 	info->addr = addr;
 	info->of_node = node;
+	info->fwnode = of_fwnode_handle(node);
 
 	if (of_property_read_bool(node, "host-notify"))
 		info->flags |= I2C_CLIENT_HOST_NOTIFY;
diff --git a/drivers/iio/Kconfig b/drivers/iio/Kconfig
index d08aeb4..1dec0fe 100644
--- a/drivers/iio/Kconfig
+++ b/drivers/iio/Kconfig
@@ -4,7 +4,6 @@
 
 menuconfig IIO
 	tristate "Industrial I/O support"
-	select ANON_INODES
 	help
 	  The industrial I/O subsystem provides a unified framework for
 	  drivers for many different types of embedded sensors using a
diff --git a/drivers/infiniband/Kconfig b/drivers/infiniband/Kconfig
index abb6660..176b943 100644
--- a/drivers/infiniband/Kconfig
+++ b/drivers/infiniband/Kconfig
@@ -25,7 +25,6 @@
 
 config INFINIBAND_USER_ACCESS
 	tristate "InfiniBand userspace access (verbs and CM)"
-	select ANON_INODES
 	---help---
 	  Userspace InfiniBand access support.  This enables the
 	  kernel side of userspace verbs and the userspace
diff --git a/drivers/infiniband/core/uverbs_ioctl.c b/drivers/infiniband/core/uverbs_ioctl.c
index 1a6b229..3673ef7 100644
--- a/drivers/infiniband/core/uverbs_ioctl.c
+++ b/drivers/infiniband/core/uverbs_ioctl.c
@@ -126,7 +126,7 @@
 	res = (void *)pbundle->internal_buffer + pbundle->internal_used;
 	pbundle->internal_used =
 		ALIGN(new_used, sizeof(*pbundle->internal_buffer));
-	if (flags & __GFP_ZERO)
+	if (want_init_on_alloc(flags))
 		memset(res, 0, size);
 	return res;
 }
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
index d5912f1..af9c4b5 100644
--- a/drivers/irqchip/irq-gic-v3.c
+++ b/drivers/irqchip/irq-gic-v3.c
@@ -1270,7 +1270,7 @@
 	gic_set_kvm_info(&gic_v3_kvm_info);
 }
 
-static int __init gic_of_init(struct device_node *node, struct device_node *parent)
+static int __init gicv3_of_init(struct device_node *node, struct device_node *parent)
 {
 	void __iomem *dist_base;
 	struct redist_region *rdist_regs;
@@ -1338,7 +1338,7 @@
 	return err;
 }
 
-IRQCHIP_DECLARE(gic_v3, "arm,gic-v3", gic_of_init);
+IRQCHIP_DECLARE(gic_v3, "arm,gic-v3", gicv3_of_init);
 
 #ifdef CONFIG_ACPI
 static struct
diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig
index 8b8c123..499e424 100644
--- a/drivers/md/Kconfig
+++ b/drivers/md/Kconfig
@@ -479,6 +479,15 @@
 
 	  If unsure, say N.
 
+config DM_VERITY_AVB
+	tristate "Support AVB specific verity error behavior"
+	depends on DM_VERITY
+	---help---
+	  Enables Android Verified Boot platform-specific error
+	  behavior. In particular, it will modify the vbmeta partition
+	  specified on the kernel command-line when non-transient error
+	  occurs (followed by a panic).
+
 config DM_VERITY_FEC
 	bool "Verity forward error correction support"
 	depends on DM_VERITY
@@ -559,4 +568,16 @@
 
 	  If unsure, say N.
 
+config DM_BOW
+	tristate "Backup block device"
+	depends on BLK_DEV_DM
+	select DM_BUFIO
+	---help---
+	  This device-mapper target takes a device and keeps a log of all
+	  changes using free blocks identified by issuing a trim command.
+	  This can then be restored by running a command line utility,
+	  or committed by simply replacing the target.
+
+	  If unsure, say N.
+
 endif # MD
diff --git a/drivers/md/Makefile b/drivers/md/Makefile
index 822f4e8..8bb6800 100644
--- a/drivers/md/Makefile
+++ b/drivers/md/Makefile
@@ -68,11 +68,16 @@
 obj-$(CONFIG_DM_INTEGRITY)	+= dm-integrity.o
 obj-$(CONFIG_DM_ZONED)		+= dm-zoned.o
 obj-$(CONFIG_DM_WRITECACHE)	+= dm-writecache.o
+obj-$(CONFIG_DM_BOW)		+= dm-bow.o
 
 ifeq ($(CONFIG_DM_UEVENT),y)
 dm-mod-objs			+= dm-uevent.o
 endif
 
+ifeq ($(CONFIG_DM_VERITY_AVB),y)
+dm-verity-objs			+= dm-verity-avb.o
+endif
+
 ifeq ($(CONFIG_DM_VERITY_FEC),y)
 dm-verity-objs			+= dm-verity-fec.o
 endif
diff --git a/drivers/md/dm-bow.c b/drivers/md/dm-bow.c
new file mode 100644
index 0000000..9323c7c
--- /dev/null
+++ b/drivers/md/dm-bow.c
@@ -0,0 +1,1231 @@
+/*
+ * Copyright (C) 2018 Google Limited.
+ *
+ * This file is released under the GPL.
+ */
+
+#include "dm.h"
+#include "dm-core.h"
+
+#include <linux/crc32.h>
+#include <linux/dm-bufio.h>
+#include <linux/module.h>
+
+#define DM_MSG_PREFIX "bow"
+
+struct log_entry {
+	u64 source;
+	u64 dest;
+	u32 size;
+	u32 checksum;
+} __packed;
+
+struct log_sector {
+	u32 magic;
+	u16 header_version;
+	u16 header_size;
+	u32 block_size;
+	u32 count;
+	u32 sequence;
+	sector_t sector0;
+	struct log_entry entries[];
+} __packed;
+
+/*
+ * MAGIC is BOW in ascii
+ */
+#define MAGIC 0x00574f42
+#define HEADER_VERSION 0x0100
+
+/*
+ * A sorted set of ranges representing the state of the data on the device.
+ * Use an rb_tree for fast lookup of a given sector
+ * Consecutive ranges are always of different type - operations on this
+ * set must merge matching consecutive ranges.
+ *
+ * Top range is always of type TOP
+ */
+struct bow_range {
+	struct rb_node		node;
+	sector_t		sector;
+	enum {
+		INVALID,	/* Type not set */
+		SECTOR0,	/* First sector - holds log record */
+		SECTOR0_CURRENT,/* Live contents of sector0 */
+		UNCHANGED,	/* Original contents */
+		TRIMMED,	/* Range has been trimmed */
+		CHANGED,	/* Range has been changed */
+		BACKUP,		/* Range is being used as a backup */
+		TOP,		/* Final range - sector is size of device */
+	} type;
+	struct list_head	trimmed_list; /* list of TRIMMED ranges */
+};
+
+static const char * const readable_type[] = {
+	"Invalid",
+	"Sector0",
+	"Sector0_current",
+	"Unchanged",
+	"Free",
+	"Changed",
+	"Backup",
+	"Top",
+};
+
+enum state {
+	TRIM,
+	CHECKPOINT,
+	COMMITTED,
+};
+
+struct bow_context {
+	struct dm_dev *dev;
+	u32 block_size;
+	u32 block_shift;
+	struct workqueue_struct *workqueue;
+	struct dm_bufio_client *bufio;
+	struct mutex ranges_lock; /* Hold to access this struct and/or ranges */
+	struct rb_root ranges;
+	struct dm_kobject_holder kobj_holder;	/* for sysfs attributes */
+	atomic_t state; /* One of the enum state values above */
+	u64 trims_total;
+	struct log_sector *log_sector;
+	struct list_head trimmed_list;
+	bool forward_trims;
+};
+
+sector_t range_top(struct bow_range *br)
+{
+	return container_of(rb_next(&br->node), struct bow_range, node)
+		->sector;
+}
+
+u64 range_size(struct bow_range *br)
+{
+	return (range_top(br) - br->sector) * SECTOR_SIZE;
+}
+
+static sector_t bvec_top(struct bvec_iter *bi_iter)
+{
+	return bi_iter->bi_sector + bi_iter->bi_size / SECTOR_SIZE;
+}
+
+/*
+ * Find the first range that overlaps with bi_iter
+ * bi_iter is set to the size of the overlapping sub-range
+ */
+static struct bow_range *find_first_overlapping_range(struct rb_root *ranges,
+						      struct bvec_iter *bi_iter)
+{
+	struct rb_node *node = ranges->rb_node;
+	struct bow_range *br;
+
+	while (node) {
+		br = container_of(node, struct bow_range, node);
+
+		if (br->sector <= bi_iter->bi_sector
+		    && bi_iter->bi_sector < range_top(br))
+			break;
+
+		if (bi_iter->bi_sector < br->sector)
+			node = node->rb_left;
+		else
+			node = node->rb_right;
+	}
+
+	WARN_ON(!node);
+	if (!node)
+		return NULL;
+
+	if (range_top(br) - bi_iter->bi_sector
+	    < bi_iter->bi_size >> SECTOR_SHIFT)
+		bi_iter->bi_size = (range_top(br) - bi_iter->bi_sector)
+			<< SECTOR_SHIFT;
+
+	return br;
+}
+
+void add_before(struct rb_root *ranges, struct bow_range *new_br,
+		struct bow_range *existing)
+{
+	struct rb_node *parent = &(existing->node);
+	struct rb_node **link = &(parent->rb_left);
+
+	while (*link) {
+		parent = *link;
+		link = &((*link)->rb_right);
+	}
+
+	rb_link_node(&new_br->node, parent, link);
+	rb_insert_color(&new_br->node, ranges);
+}
+
+/*
+ * Given a range br returned by find_first_overlapping_range, split br into a
+ * leading range, a range matching the bi_iter and a trailing range.
+ * Leading and trailing may end up size 0 and will then be deleted. The
+ * new range matching the bi_iter is then returned and should have its type
+ * and type specific fields populated.
+ * If bi_iter runs off the end of the range, bi_iter is truncated accordingly
+ */
+static int split_range(struct bow_context *bc, struct bow_range **br,
+		       struct bvec_iter *bi_iter)
+{
+	struct bow_range *new_br;
+
+	if (bi_iter->bi_sector < (*br)->sector) {
+		WARN_ON(true);
+		return BLK_STS_IOERR;
+	}
+
+	if (bi_iter->bi_sector > (*br)->sector) {
+		struct bow_range *leading_br =
+			kzalloc(sizeof(*leading_br), GFP_KERNEL);
+
+		if (!leading_br)
+			return BLK_STS_RESOURCE;
+
+		*leading_br = **br;
+		if (leading_br->type == TRIMMED)
+			list_add(&leading_br->trimmed_list, &bc->trimmed_list);
+
+		add_before(&bc->ranges, leading_br, *br);
+		(*br)->sector = bi_iter->bi_sector;
+	}
+
+	if (bvec_top(bi_iter) >= range_top(*br)) {
+		bi_iter->bi_size = (range_top(*br) - (*br)->sector)
+					* SECTOR_SIZE;
+		return BLK_STS_OK;
+	}
+
+	/* new_br will be the beginning, existing br will be the tail */
+	new_br = kzalloc(sizeof(*new_br), GFP_KERNEL);
+	if (!new_br)
+		return BLK_STS_RESOURCE;
+
+	new_br->sector = (*br)->sector;
+	(*br)->sector = bvec_top(bi_iter);
+	add_before(&bc->ranges, new_br, *br);
+	*br = new_br;
+
+	return BLK_STS_OK;
+}
+
+/*
+ * Sets type of a range. May merge range into surrounding ranges
+ * Since br may be invalidated, always sets br to NULL to prevent
+ * usage after this is called
+ */
+static void set_type(struct bow_context *bc, struct bow_range **br, int type)
+{
+	struct bow_range *prev = container_of(rb_prev(&(*br)->node),
+						      struct bow_range, node);
+	struct bow_range *next = container_of(rb_next(&(*br)->node),
+						      struct bow_range, node);
+
+	if ((*br)->type == TRIMMED) {
+		bc->trims_total -= range_size(*br);
+		list_del(&(*br)->trimmed_list);
+	}
+
+	if (type == TRIMMED) {
+		bc->trims_total += range_size(*br);
+		list_add(&(*br)->trimmed_list, &bc->trimmed_list);
+	}
+
+	(*br)->type = type;
+
+	if (next->type == type) {
+		if (type == TRIMMED)
+			list_del(&next->trimmed_list);
+		rb_erase(&next->node, &bc->ranges);
+		kfree(next);
+	}
+
+	if (prev->type == type) {
+		if (type == TRIMMED)
+			list_del(&(*br)->trimmed_list);
+		rb_erase(&(*br)->node, &bc->ranges);
+		kfree(*br);
+	}
+
+	*br = NULL;
+}
+
+static struct bow_range *find_free_range(struct bow_context *bc)
+{
+	if (list_empty(&bc->trimmed_list)) {
+		DMERR("Unable to find free space to back up to");
+		return NULL;
+	}
+
+	return list_first_entry(&bc->trimmed_list, struct bow_range,
+				trimmed_list);
+}
+
+static sector_t sector_to_page(struct bow_context const *bc, sector_t sector)
+{
+	WARN_ON((sector & (((sector_t)1 << (bc->block_shift - SECTOR_SHIFT)) - 1))
+		!= 0);
+	return sector >> (bc->block_shift - SECTOR_SHIFT);
+}
+
+static int copy_data(struct bow_context const *bc,
+		     struct bow_range *source, struct bow_range *dest,
+		     u32 *checksum)
+{
+	int i;
+
+	if (range_size(source) != range_size(dest)) {
+		WARN_ON(1);
+		return BLK_STS_IOERR;
+	}
+
+	if (checksum)
+		*checksum = sector_to_page(bc, source->sector);
+
+	for (i = 0; i < range_size(source) >> bc->block_shift; ++i) {
+		struct dm_buffer *read_buffer, *write_buffer;
+		u8 *read, *write;
+		sector_t page = sector_to_page(bc, source->sector) + i;
+
+		read = dm_bufio_read(bc->bufio, page, &read_buffer);
+		if (IS_ERR(read)) {
+			DMERR("Cannot read page %llu",
+			      (unsigned long long)page);
+			return PTR_ERR(read);
+		}
+
+		if (checksum)
+			*checksum = crc32(*checksum, read, bc->block_size);
+
+		write = dm_bufio_new(bc->bufio,
+				     sector_to_page(bc, dest->sector) + i,
+				     &write_buffer);
+		if (IS_ERR(write)) {
+			DMERR("Cannot write sector");
+			dm_bufio_release(read_buffer);
+			return PTR_ERR(write);
+		}
+
+		memcpy(write, read, bc->block_size);
+
+		dm_bufio_mark_buffer_dirty(write_buffer);
+		dm_bufio_release(write_buffer);
+		dm_bufio_release(read_buffer);
+	}
+
+	dm_bufio_write_dirty_buffers(bc->bufio);
+	return BLK_STS_OK;
+}
+
+/****** logging functions ******/
+
+static int add_log_entry(struct bow_context *bc, sector_t source, sector_t dest,
+			 unsigned int size, u32 checksum);
+
+static int backup_log_sector(struct bow_context *bc)
+{
+	struct bow_range *first_br, *free_br;
+	struct bvec_iter bi_iter;
+	u32 checksum = 0;
+	int ret;
+
+	first_br = container_of(rb_first(&bc->ranges), struct bow_range, node);
+
+	if (first_br->type != SECTOR0) {
+		WARN_ON(1);
+		return BLK_STS_IOERR;
+	}
+
+	if (range_size(first_br) != bc->block_size) {
+		WARN_ON(1);
+		return BLK_STS_IOERR;
+	}
+
+	free_br = find_free_range(bc);
+	/* No space left - return this error to userspace */
+	if (!free_br)
+		return BLK_STS_NOSPC;
+	bi_iter.bi_sector = free_br->sector;
+	bi_iter.bi_size = bc->block_size;
+	ret = split_range(bc, &free_br, &bi_iter);
+	if (ret)
+		return ret;
+	if (bi_iter.bi_size != bc->block_size) {
+		WARN_ON(1);
+		return BLK_STS_IOERR;
+	}
+
+	ret = copy_data(bc, first_br, free_br, &checksum);
+	if (ret)
+		return ret;
+
+	bc->log_sector->count = 0;
+	bc->log_sector->sequence++;
+	ret = add_log_entry(bc, first_br->sector, free_br->sector,
+			    range_size(first_br), checksum);
+	if (ret)
+		return ret;
+
+	set_type(bc, &free_br, BACKUP);
+	return BLK_STS_OK;
+}
+
+static int add_log_entry(struct bow_context *bc, sector_t source, sector_t dest,
+			 unsigned int size, u32 checksum)
+{
+	struct dm_buffer *sector_buffer;
+	u8 *sector;
+
+	if (sizeof(struct log_sector)
+	    + sizeof(struct log_entry) * (bc->log_sector->count + 1)
+		> bc->block_size) {
+		int ret = backup_log_sector(bc);
+
+		if (ret)
+			return ret;
+	}
+
+	sector = dm_bufio_new(bc->bufio, 0, &sector_buffer);
+	if (IS_ERR(sector)) {
+		DMERR("Cannot write boot sector");
+		dm_bufio_release(sector_buffer);
+		return BLK_STS_NOSPC;
+	}
+
+	bc->log_sector->entries[bc->log_sector->count].source = source;
+	bc->log_sector->entries[bc->log_sector->count].dest = dest;
+	bc->log_sector->entries[bc->log_sector->count].size = size;
+	bc->log_sector->entries[bc->log_sector->count].checksum = checksum;
+	bc->log_sector->count++;
+
+	memcpy(sector, bc->log_sector, bc->block_size);
+	dm_bufio_mark_buffer_dirty(sector_buffer);
+	dm_bufio_release(sector_buffer);
+	dm_bufio_write_dirty_buffers(bc->bufio);
+	return BLK_STS_OK;
+}
+
+static int prepare_log(struct bow_context *bc)
+{
+	struct bow_range *free_br, *first_br;
+	struct bvec_iter bi_iter;
+	u32 checksum = 0;
+	int ret;
+
+	/* Carve out first sector as log sector */
+	first_br = container_of(rb_first(&bc->ranges), struct bow_range, node);
+	if (first_br->type != UNCHANGED) {
+		WARN_ON(1);
+		return BLK_STS_IOERR;
+	}
+
+	if (range_size(first_br) < bc->block_size) {
+		WARN_ON(1);
+		return BLK_STS_IOERR;
+	}
+	bi_iter.bi_sector = 0;
+	bi_iter.bi_size = bc->block_size;
+	ret = split_range(bc, &first_br, &bi_iter);
+	if (ret)
+		return ret;
+	first_br->type = SECTOR0;
+	if (range_size(first_br) != bc->block_size) {
+		WARN_ON(1);
+		return BLK_STS_IOERR;
+	}
+
+	/* Find free sector for active sector0 reads/writes */
+	free_br = find_free_range(bc);
+	if (!free_br)
+		return BLK_STS_NOSPC;
+	bi_iter.bi_sector = free_br->sector;
+	bi_iter.bi_size = bc->block_size;
+	ret = split_range(bc, &free_br, &bi_iter);
+	if (ret)
+		return ret;
+	free_br->type = SECTOR0_CURRENT;
+
+	/* Copy data */
+	ret = copy_data(bc, first_br, free_br, NULL);
+	if (ret)
+		return ret;
+
+	bc->log_sector->sector0 = free_br->sector;
+
+	/* Find free sector to back up original sector zero */
+	free_br = find_free_range(bc);
+	if (!free_br)
+		return BLK_STS_NOSPC;
+	bi_iter.bi_sector = free_br->sector;
+	bi_iter.bi_size = bc->block_size;
+	ret = split_range(bc, &free_br, &bi_iter);
+	if (ret)
+		return ret;
+
+	/* Back up */
+	ret = copy_data(bc, first_br, free_br, &checksum);
+	if (ret)
+		return ret;
+
+	/*
+	 * Set up our replacement boot sector - it will get written when we
+	 * add the first log entry, which we do immediately
+	 */
+	bc->log_sector->magic = MAGIC;
+	bc->log_sector->header_version = HEADER_VERSION;
+	bc->log_sector->header_size = sizeof(*bc->log_sector);
+	bc->log_sector->block_size = bc->block_size;
+	bc->log_sector->count = 0;
+	bc->log_sector->sequence = 0;
+
+	/* Add log entry */
+	ret = add_log_entry(bc, first_br->sector, free_br->sector,
+			    range_size(first_br), checksum);
+	if (ret)
+		return ret;
+
+	set_type(bc, &free_br, BACKUP);
+	return BLK_STS_OK;
+}
+
+static struct bow_range *find_sector0_current(struct bow_context *bc)
+{
+	struct bvec_iter bi_iter;
+
+	bi_iter.bi_sector = bc->log_sector->sector0;
+	bi_iter.bi_size = bc->block_size;
+	return find_first_overlapping_range(&bc->ranges, &bi_iter);
+}
+
+/****** sysfs interface functions ******/
+
+static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr,
+			  char *buf)
+{
+	struct bow_context *bc = container_of(kobj, struct bow_context,
+					      kobj_holder.kobj);
+
+	return scnprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&bc->state));
+}
+
+static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
+			   const char *buf, size_t count)
+{
+	struct bow_context *bc = container_of(kobj, struct bow_context,
+					      kobj_holder.kobj);
+	enum state state, original_state;
+	int ret;
+
+	state = buf[0] - '0';
+	if (state < TRIM || state > COMMITTED) {
+		DMERR("State value %d out of range", state);
+		return -EINVAL;
+	}
+
+	mutex_lock(&bc->ranges_lock);
+	original_state = atomic_read(&bc->state);
+	if (state != original_state + 1) {
+		DMERR("Invalid state change from %d to %d",
+		      original_state, state);
+		ret = -EINVAL;
+		goto bad;
+	}
+
+	DMINFO("Switching to state %s", state == CHECKPOINT ? "Checkpoint"
+	       : state == COMMITTED ? "Committed" : "Unknown");
+
+	if (state == CHECKPOINT) {
+		ret = prepare_log(bc);
+		if (ret) {
+			DMERR("Failed to switch to checkpoint state");
+			goto bad;
+		}
+	} else if (state == COMMITTED) {
+		struct bow_range *br = find_sector0_current(bc);
+		struct bow_range *sector0_br =
+			container_of(rb_first(&bc->ranges), struct bow_range,
+				     node);
+
+		ret = copy_data(bc, br, sector0_br, 0);
+		if (ret) {
+			DMERR("Failed to switch to committed state");
+			goto bad;
+		}
+	}
+	atomic_inc(&bc->state);
+	ret = count;
+
+bad:
+	mutex_unlock(&bc->ranges_lock);
+	return ret;
+}
+
+static ssize_t free_show(struct kobject *kobj, struct kobj_attribute *attr,
+			  char *buf)
+{
+	struct bow_context *bc = container_of(kobj, struct bow_context,
+					      kobj_holder.kobj);
+	u64 trims_total;
+
+	mutex_lock(&bc->ranges_lock);
+	trims_total = bc->trims_total;
+	mutex_unlock(&bc->ranges_lock);
+
+	return scnprintf(buf, PAGE_SIZE, "%llu\n", trims_total);
+}
+
+static struct kobj_attribute attr_state = __ATTR_RW(state);
+static struct kobj_attribute attr_free = __ATTR_RO(free);
+
+static struct attribute *bow_attrs[] = {
+	&attr_state.attr,
+	&attr_free.attr,
+	NULL
+};
+
+static struct kobj_type bow_ktype = {
+	.sysfs_ops = &kobj_sysfs_ops,
+	.default_attrs = bow_attrs,
+	.release = dm_kobject_release
+};
+
+/****** constructor/destructor ******/
+
+static void dm_bow_dtr(struct dm_target *ti)
+{
+	struct bow_context *bc = (struct bow_context *) ti->private;
+	struct kobject *kobj;
+
+	while (rb_first(&bc->ranges)) {
+		struct bow_range *br = container_of(rb_first(&bc->ranges),
+						    struct bow_range, node);
+
+		rb_erase(&br->node, &bc->ranges);
+		kfree(br);
+	}
+	if (bc->workqueue)
+		destroy_workqueue(bc->workqueue);
+	if (bc->bufio)
+		dm_bufio_client_destroy(bc->bufio);
+
+	kobj = &bc->kobj_holder.kobj;
+	if (kobj->state_initialized) {
+		kobject_put(kobj);
+		wait_for_completion(dm_get_completion_from_kobject(kobj));
+	}
+
+	kfree(bc->log_sector);
+	kfree(bc);
+}
+
+static int dm_bow_ctr(struct dm_target *ti, unsigned int argc, char **argv)
+{
+	struct bow_context *bc;
+	struct bow_range *br;
+	int ret;
+	struct mapped_device *md = dm_table_get_md(ti->table);
+
+	if (argc != 1) {
+		ti->error = "Invalid argument count";
+		return -EINVAL;
+	}
+
+	bc = kzalloc(sizeof(*bc), GFP_KERNEL);
+	if (!bc) {
+		ti->error = "Cannot allocate bow context";
+		return -ENOMEM;
+	}
+
+	ti->num_flush_bios = 1;
+	ti->num_discard_bios = 1;
+	ti->num_write_same_bios = 1;
+	ti->private = bc;
+
+	ret = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table),
+			    &bc->dev);
+	if (ret) {
+		ti->error = "Device lookup failed";
+		goto bad;
+	}
+
+	if (bc->dev->bdev->bd_queue->limits.max_discard_sectors == 0) {
+		bc->dev->bdev->bd_queue->limits.discard_granularity = 1 << 12;
+		bc->dev->bdev->bd_queue->limits.max_hw_discard_sectors = 1 << 15;
+		bc->dev->bdev->bd_queue->limits.max_discard_sectors = 1 << 15;
+		bc->forward_trims = false;
+	} else {
+		bc->forward_trims = true;
+	}
+
+	bc->block_size = bc->dev->bdev->bd_queue->limits.logical_block_size;
+	bc->block_shift = ilog2(bc->block_size);
+	bc->log_sector = kzalloc(bc->block_size, GFP_KERNEL);
+	if (!bc->log_sector) {
+		ti->error = "Cannot allocate log sector";
+		goto bad;
+	}
+
+	init_completion(&bc->kobj_holder.completion);
+	ret = kobject_init_and_add(&bc->kobj_holder.kobj, &bow_ktype,
+				   &disk_to_dev(dm_disk(md))->kobj, "%s",
+				   "bow");
+	if (ret) {
+		ti->error = "Cannot create sysfs node";
+		goto bad;
+	}
+
+	mutex_init(&bc->ranges_lock);
+	bc->ranges = RB_ROOT;
+	bc->bufio = dm_bufio_client_create(bc->dev->bdev, bc->block_size, 1, 0,
+					   NULL, NULL);
+	if (IS_ERR(bc->bufio)) {
+		ti->error = "Cannot initialize dm-bufio";
+		ret = PTR_ERR(bc->bufio);
+		bc->bufio = NULL;
+		goto bad;
+	}
+
+	bc->workqueue = alloc_workqueue("dm-bow",
+					WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM
+					| WQ_UNBOUND, num_online_cpus());
+	if (!bc->workqueue) {
+		ti->error = "Cannot allocate workqueue";
+		ret = -ENOMEM;
+		goto bad;
+	}
+
+	INIT_LIST_HEAD(&bc->trimmed_list);
+
+	br = kzalloc(sizeof(*br), GFP_KERNEL);
+	if (!br) {
+		ti->error = "Cannot allocate ranges";
+		ret = -ENOMEM;
+		goto bad;
+	}
+
+	br->sector = ti->len;
+	br->type = TOP;
+	rb_link_node(&br->node, NULL, &bc->ranges.rb_node);
+	rb_insert_color(&br->node, &bc->ranges);
+
+	br = kzalloc(sizeof(*br), GFP_KERNEL);
+	if (!br) {
+		ti->error = "Cannot allocate ranges";
+		ret = -ENOMEM;
+		goto bad;
+	}
+
+	br->sector = 0;
+	br->type = UNCHANGED;
+	rb_link_node(&br->node, bc->ranges.rb_node,
+		     &bc->ranges.rb_node->rb_left);
+	rb_insert_color(&br->node, &bc->ranges);
+
+	ti->discards_supported = true;
+
+	return 0;
+
+bad:
+	dm_bow_dtr(ti);
+	return ret;
+}
+
+/****** Handle writes ******/
+
+static int prepare_unchanged_range(struct bow_context *bc, struct bow_range *br,
+				   struct bvec_iter *bi_iter,
+				   bool record_checksum)
+{
+	struct bow_range *backup_br;
+	struct bvec_iter backup_bi;
+	sector_t log_source, log_dest;
+	unsigned int log_size;
+	u32 checksum = 0;
+	int ret;
+	int original_type;
+	sector_t sector0;
+
+	/* Find a free range */
+	backup_br = find_free_range(bc);
+	if (!backup_br)
+		return BLK_STS_NOSPC;
+
+	/* Carve out a backup range. This may be smaller than the br given */
+	backup_bi.bi_sector = backup_br->sector;
+	backup_bi.bi_size = min(range_size(backup_br), (u64) bi_iter->bi_size);
+	ret = split_range(bc, &backup_br, &backup_bi);
+	if (ret)
+		return ret;
+
+	/*
+	 * Carve out a changed range. This will not be smaller than the backup
+	 * br since the backup br is smaller than the source range and iterator
+	 */
+	bi_iter->bi_size = backup_bi.bi_size;
+	ret = split_range(bc, &br, bi_iter);
+	if (ret)
+		return ret;
+	if (range_size(br) != range_size(backup_br)) {
+		WARN_ON(1);
+		return BLK_STS_IOERR;
+	}
+
+
+	/* Copy data over */
+	ret = copy_data(bc, br, backup_br, record_checksum ? &checksum : NULL);
+	if (ret)
+		return ret;
+
+	/* Add an entry to the log */
+	log_source = br->sector;
+	log_dest = backup_br->sector;
+	log_size = range_size(br);
+
+	/*
+	 * Set the types. Note that since set_type also amalgamates ranges
+	 * we have to set both sectors to their final type before calling
+	 * set_type on either
+	 */
+	original_type = br->type;
+	sector0 = backup_br->sector;
+	if (backup_br->type == TRIMMED)
+		list_del(&backup_br->trimmed_list);
+	backup_br->type = br->type == SECTOR0_CURRENT ? SECTOR0_CURRENT
+						      : BACKUP;
+	br->type = CHANGED;
+	set_type(bc, &backup_br, backup_br->type);
+
+	/*
+	 * Add the log entry after marking the backup sector, since adding a log
+	 * can cause another backup
+	 */
+	ret = add_log_entry(bc, log_source, log_dest, log_size, checksum);
+	if (ret) {
+		br->type = original_type;
+		return ret;
+	}
+
+	/* Now it is safe to mark this backup successful */
+	if (original_type == SECTOR0_CURRENT)
+		bc->log_sector->sector0 = sector0;
+
+	set_type(bc, &br, br->type);
+	return ret;
+}
+
+static int prepare_free_range(struct bow_context *bc, struct bow_range *br,
+			      struct bvec_iter *bi_iter)
+{
+	int ret;
+
+	ret = split_range(bc, &br, bi_iter);
+	if (ret)
+		return ret;
+	set_type(bc, &br, CHANGED);
+	return BLK_STS_OK;
+}
+
+static int prepare_changed_range(struct bow_context *bc, struct bow_range *br,
+				 struct bvec_iter *bi_iter)
+{
+	/* Nothing to do ... */
+	return BLK_STS_OK;
+}
+
+static int prepare_one_range(struct bow_context *bc,
+			     struct bvec_iter *bi_iter)
+{
+	struct bow_range *br = find_first_overlapping_range(&bc->ranges,
+							    bi_iter);
+	switch (br->type) {
+	case CHANGED:
+		return prepare_changed_range(bc, br, bi_iter);
+
+	case TRIMMED:
+		return prepare_free_range(bc, br, bi_iter);
+
+	case UNCHANGED:
+	case BACKUP:
+		return prepare_unchanged_range(bc, br, bi_iter, true);
+
+	/*
+	 * We cannot track the checksum for the active sector0, since it
+	 * may change at any point.
+	 */
+	case SECTOR0_CURRENT:
+		return prepare_unchanged_range(bc, br, bi_iter, false);
+
+	case SECTOR0:	/* Handled in the dm_bow_map */
+	case TOP:	/* Illegal - top is off the end of the device */
+	default:
+		WARN_ON(1);
+		return BLK_STS_IOERR;
+	}
+}
+
+struct write_work {
+	struct work_struct work;
+	struct bow_context *bc;
+	struct bio *bio;
+};
+
+static void bow_write(struct work_struct *work)
+{
+	struct write_work *ww = container_of(work, struct write_work, work);
+	struct bow_context *bc = ww->bc;
+	struct bio *bio = ww->bio;
+	struct bvec_iter bi_iter = bio->bi_iter;
+	int ret = BLK_STS_OK;
+
+	kfree(ww);
+
+	mutex_lock(&bc->ranges_lock);
+	do {
+		ret = prepare_one_range(bc, &bi_iter);
+		bi_iter.bi_sector += bi_iter.bi_size / SECTOR_SIZE;
+		bi_iter.bi_size = bio->bi_iter.bi_size
+			- (bi_iter.bi_sector - bio->bi_iter.bi_sector)
+			  * SECTOR_SIZE;
+	} while (!ret && bi_iter.bi_size);
+
+	mutex_unlock(&bc->ranges_lock);
+
+	if (!ret) {
+		bio_set_dev(bio, bc->dev->bdev);
+		submit_bio(bio);
+	} else {
+		DMERR("Write failure with error %d", -ret);
+		bio->bi_status = ret;
+		bio_endio(bio);
+	}
+}
+
+static int queue_write(struct bow_context *bc, struct bio *bio)
+{
+	struct write_work *ww = kmalloc(sizeof(*ww), GFP_NOIO | __GFP_NORETRY
+					| __GFP_NOMEMALLOC | __GFP_NOWARN);
+	if (!ww) {
+		DMERR("Failed to allocate write_work");
+		return -ENOMEM;
+	}
+
+	INIT_WORK(&ww->work, bow_write);
+	ww->bc = bc;
+	ww->bio = bio;
+	queue_work(bc->workqueue, &ww->work);
+	return DM_MAPIO_SUBMITTED;
+}
+
+static int handle_sector0(struct bow_context *bc, struct bio *bio)
+{
+	int ret = DM_MAPIO_REMAPPED;
+
+	if (bio->bi_iter.bi_size > bc->block_size) {
+		struct bio * split = bio_split(bio,
+					       bc->block_size >> SECTOR_SHIFT,
+					       GFP_NOIO,
+					       &fs_bio_set);
+		if (!split) {
+			DMERR("Failed to split bio");
+			bio->bi_status = BLK_STS_RESOURCE;
+			bio_endio(bio);
+			return DM_MAPIO_SUBMITTED;
+		}
+
+		bio_chain(split, bio);
+		split->bi_iter.bi_sector = bc->log_sector->sector0;
+		bio_set_dev(split, bc->dev->bdev);
+		submit_bio(split);
+
+		if (bio_data_dir(bio) == WRITE)
+			ret = queue_write(bc, bio);
+	} else {
+		bio->bi_iter.bi_sector = bc->log_sector->sector0;
+	}
+
+	return ret;
+}
+
+static int add_trim(struct bow_context *bc, struct bio *bio)
+{
+	struct bow_range *br;
+	struct bvec_iter bi_iter = bio->bi_iter;
+
+	DMDEBUG("add_trim: %llu, %u",
+		(unsigned long long)bio->bi_iter.bi_sector,
+		bio->bi_iter.bi_size);
+
+	do {
+		br = find_first_overlapping_range(&bc->ranges, &bi_iter);
+
+		switch (br->type) {
+		case UNCHANGED:
+			if (!split_range(bc, &br, &bi_iter))
+				set_type(bc, &br, TRIMMED);
+			break;
+
+		case TRIMMED:
+			/* Nothing to do */
+			break;
+
+		default:
+			/* No other case is legal in TRIM state */
+			WARN_ON(true);
+			break;
+		}
+
+		bi_iter.bi_sector += bi_iter.bi_size / SECTOR_SIZE;
+		bi_iter.bi_size = bio->bi_iter.bi_size
+			- (bi_iter.bi_sector - bio->bi_iter.bi_sector)
+			  * SECTOR_SIZE;
+
+	} while (bi_iter.bi_size);
+
+	bio_endio(bio);
+	return DM_MAPIO_SUBMITTED;
+}
+
+static int remove_trim(struct bow_context *bc, struct bio *bio)
+{
+	struct bow_range *br;
+	struct bvec_iter bi_iter = bio->bi_iter;
+
+	DMDEBUG("remove_trim: %llu, %u",
+		(unsigned long long)bio->bi_iter.bi_sector,
+		bio->bi_iter.bi_size);
+
+	do {
+		br = find_first_overlapping_range(&bc->ranges, &bi_iter);
+
+		switch (br->type) {
+		case UNCHANGED:
+			/* Nothing to do */
+			break;
+
+		case TRIMMED:
+			if (!split_range(bc, &br, &bi_iter))
+				set_type(bc, &br, UNCHANGED);
+			break;
+
+		default:
+			/* No other case is legal in TRIM state */
+			WARN_ON(true);
+			break;
+		}
+
+		bi_iter.bi_sector += bi_iter.bi_size / SECTOR_SIZE;
+		bi_iter.bi_size = bio->bi_iter.bi_size
+			- (bi_iter.bi_sector - bio->bi_iter.bi_sector)
+			  * SECTOR_SIZE;
+
+	} while (bi_iter.bi_size);
+
+	return DM_MAPIO_REMAPPED;
+}
+
+int remap_unless_illegal_trim(struct bow_context *bc, struct bio *bio)
+{
+	if (!bc->forward_trims && bio_op(bio) == REQ_OP_DISCARD) {
+		bio->bi_status = BLK_STS_NOTSUPP;
+		bio_endio(bio);
+		return DM_MAPIO_SUBMITTED;
+	} else {
+		bio_set_dev(bio, bc->dev->bdev);
+		return DM_MAPIO_REMAPPED;
+	}
+}
+
+/****** dm interface ******/
+
+static int dm_bow_map(struct dm_target *ti, struct bio *bio)
+{
+	int ret = DM_MAPIO_REMAPPED;
+	struct bow_context *bc = ti->private;
+
+	if (likely(bc->state.counter == COMMITTED))
+		return remap_unless_illegal_trim(bc, bio);
+
+	if (bio_data_dir(bio) == READ && bio->bi_iter.bi_sector != 0)
+		return remap_unless_illegal_trim(bc, bio);
+
+	if (atomic_read(&bc->state) != COMMITTED) {
+		enum state state;
+
+		mutex_lock(&bc->ranges_lock);
+		state = atomic_read(&bc->state);
+		if (state == TRIM) {
+			if (bio_op(bio) == REQ_OP_DISCARD)
+				ret = add_trim(bc, bio);
+			else if (bio_data_dir(bio) == WRITE)
+				ret = remove_trim(bc, bio);
+			else
+				/* pass-through */;
+		} else if (state == CHECKPOINT) {
+			if (bio->bi_iter.bi_sector == 0)
+				ret = handle_sector0(bc, bio);
+			else if (bio_data_dir(bio) == WRITE)
+				ret = queue_write(bc, bio);
+			else
+				/* pass-through */;
+		} else {
+			/* pass-through */
+		}
+		mutex_unlock(&bc->ranges_lock);
+	}
+
+	if (ret == DM_MAPIO_REMAPPED)
+		return remap_unless_illegal_trim(bc, bio);
+
+	return ret;
+}
+
+static void dm_bow_tablestatus(struct dm_target *ti, char *result,
+			       unsigned int maxlen)
+{
+	char *end = result + maxlen;
+	struct bow_context *bc = ti->private;
+	struct rb_node *i;
+	int trimmed_list_length = 0;
+	int trimmed_range_count = 0;
+	struct bow_range *br;
+
+	if (maxlen == 0)
+		return;
+	result[0] = 0;
+
+	list_for_each_entry(br, &bc->trimmed_list, trimmed_list)
+		if (br->type == TRIMMED) {
+			++trimmed_list_length;
+		} else {
+			scnprintf(result, end - result,
+				  "ERROR: non-trimmed entry in trimmed_list");
+			return;
+		}
+
+	if (!rb_first(&bc->ranges)) {
+		scnprintf(result, end - result, "ERROR: Empty ranges");
+		return;
+	}
+
+	if (container_of(rb_first(&bc->ranges), struct bow_range, node)
+	    ->sector) {
+		scnprintf(result, end - result,
+			 "ERROR: First range does not start at sector 0");
+		return;
+	}
+
+	for (i = rb_first(&bc->ranges); i; i = rb_next(i)) {
+		struct bow_range *br = container_of(i, struct bow_range, node);
+
+		result += scnprintf(result, end - result, "%s: %llu",
+				    readable_type[br->type],
+				    (unsigned long long)br->sector);
+		if (result >= end)
+			return;
+
+		result += scnprintf(result, end - result, "\n");
+		if (result >= end)
+			return;
+
+		if (br->type == TRIMMED)
+			++trimmed_range_count;
+
+		if (br->type == TOP) {
+			if (br->sector != ti->len) {
+				scnprintf(result, end - result,
+					 "\nERROR: Top sector is incorrect");
+			}
+
+			if (&br->node != rb_last(&bc->ranges)) {
+				scnprintf(result, end - result,
+					  "\nERROR: Top sector is not last");
+			}
+
+			break;
+		}
+
+		if (!rb_next(i)) {
+			scnprintf(result, end - result,
+				  "\nERROR: Last range not of type TOP");
+			return;
+		}
+
+		if (br->sector > range_top(br)) {
+			scnprintf(result, end - result,
+				  "\nERROR: sectors out of order");
+			return;
+		}
+	}
+
+	if (trimmed_range_count != trimmed_list_length)
+		scnprintf(result, end - result,
+			  "\nERROR: not all trimmed ranges in trimmed list");
+}
+
+static void dm_bow_status(struct dm_target *ti, status_type_t type,
+			  unsigned int status_flags, char *result,
+			  unsigned int maxlen)
+{
+	switch (type) {
+	case STATUSTYPE_INFO:
+		if (maxlen)
+			result[0] = 0;
+		break;
+
+	case STATUSTYPE_TABLE:
+		dm_bow_tablestatus(ti, result, maxlen);
+		break;
+	}
+}
+
+int dm_bow_prepare_ioctl(struct dm_target *ti, struct block_device **bdev)
+{
+	struct bow_context *bc = ti->private;
+	struct dm_dev *dev = bc->dev;
+
+	*bdev = dev->bdev;
+	/* Only pass ioctls through if the device sizes match exactly. */
+	return ti->len != i_size_read(dev->bdev->bd_inode) >> SECTOR_SHIFT;
+}
+
+static int dm_bow_iterate_devices(struct dm_target *ti,
+				  iterate_devices_callout_fn fn, void *data)
+{
+	struct bow_context *bc = ti->private;
+
+	return fn(ti, bc->dev, 0, ti->len, data);
+}
+
+static struct target_type bow_target = {
+	.name   = "bow",
+	.version = {1, 1, 1},
+	.module = THIS_MODULE,
+	.ctr    = dm_bow_ctr,
+	.dtr    = dm_bow_dtr,
+	.map    = dm_bow_map,
+	.status = dm_bow_status,
+	.prepare_ioctl  = dm_bow_prepare_ioctl,
+	.iterate_devices = dm_bow_iterate_devices,
+};
+
+int __init dm_bow_init(void)
+{
+	int r = dm_register_target(&bow_target);
+
+	if (r < 0)
+		DMERR("registering bow failed %d", r);
+	return r;
+}
+
+void dm_bow_exit(void)
+{
+	dm_unregister_target(&bow_target);
+}
+
+MODULE_LICENSE("GPL");
+
+module_init(dm_bow_init);
+module_exit(dm_bow_exit);
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c
index dc385b7..b0db052 100644
--- a/drivers/md/dm-bufio.c
+++ b/drivers/md/dm-bufio.c
@@ -33,7 +33,8 @@
 
 #define DM_BUFIO_MEMORY_PERCENT		2
 #define DM_BUFIO_VMALLOC_PERCENT	25
-#define DM_BUFIO_WRITEBACK_PERCENT	75
+#define DM_BUFIO_WRITEBACK_RATIO	3
+#define DM_BUFIO_LOW_WATERMARK_RATIO	16
 
 /*
  * Check buffer ages in this interval (seconds)
@@ -132,12 +133,14 @@
 struct dm_buffer {
 	struct rb_node node;
 	struct list_head lru_list;
+	struct list_head global_list;
 	sector_t block;
 	void *data;
 	unsigned char data_mode;		/* DATA_MODE_* */
 	unsigned char list_mode;		/* LIST_* */
 	blk_status_t read_error;
 	blk_status_t write_error;
+	unsigned accessed;
 	unsigned hold_count;
 	unsigned long state;
 	unsigned long last_accessed;
@@ -192,7 +195,11 @@
  */
 static unsigned long dm_bufio_cache_size_latch;
 
-static DEFINE_SPINLOCK(param_spinlock);
+static DEFINE_SPINLOCK(global_spinlock);
+
+static LIST_HEAD(global_queue);
+
+static unsigned long global_num = 0;
 
 /*
  * Buffers are freed after this timeout
@@ -209,11 +216,6 @@
 /*----------------------------------------------------------------*/
 
 /*
- * Per-client cache: dm_bufio_cache_size / dm_bufio_client_count
- */
-static unsigned long dm_bufio_cache_size_per_client;
-
-/*
  * The current number of clients.
  */
 static int dm_bufio_client_count;
@@ -224,11 +226,15 @@
 static LIST_HEAD(dm_bufio_all_clients);
 
 /*
- * This mutex protects dm_bufio_cache_size_latch,
- * dm_bufio_cache_size_per_client and dm_bufio_client_count
+ * This mutex protects dm_bufio_cache_size_latch and dm_bufio_client_count
  */
 static DEFINE_MUTEX(dm_bufio_clients_lock);
 
+static struct workqueue_struct *dm_bufio_wq;
+static struct delayed_work dm_bufio_cleanup_old_work;
+static struct work_struct dm_bufio_replacement_work;
+
+
 #ifdef CONFIG_DM_DEBUG_BLOCK_STACK_TRACING
 static void buffer_record_stack(struct dm_buffer *b)
 {
@@ -289,15 +295,23 @@
 
 /*----------------------------------------------------------------*/
 
-static void adjust_total_allocated(unsigned char data_mode, long diff)
+static void adjust_total_allocated(struct dm_buffer *b, bool unlink)
 {
+	unsigned char data_mode;
+	long diff;
+
 	static unsigned long * const class_ptr[DATA_MODE_LIMIT] = {
 		&dm_bufio_allocated_kmem_cache,
 		&dm_bufio_allocated_get_free_pages,
 		&dm_bufio_allocated_vmalloc,
 	};
 
-	spin_lock(&param_spinlock);
+	data_mode = b->data_mode;
+	diff = (long)b->c->block_size;
+	if (unlink)
+		diff = -diff;
+
+	spin_lock(&global_spinlock);
 
 	*class_ptr[data_mode] += diff;
 
@@ -306,7 +320,19 @@
 	if (dm_bufio_current_allocated > dm_bufio_peak_allocated)
 		dm_bufio_peak_allocated = dm_bufio_current_allocated;
 
-	spin_unlock(&param_spinlock);
+	b->accessed = 1;
+
+	if (!unlink) {
+		list_add(&b->global_list, &global_queue);
+		global_num++;
+		if (dm_bufio_current_allocated > dm_bufio_cache_size)
+			queue_work(dm_bufio_wq, &dm_bufio_replacement_work);
+	} else {
+		list_del(&b->global_list);
+		global_num--;
+	}
+
+	spin_unlock(&global_spinlock);
 }
 
 /*
@@ -327,9 +353,6 @@
 			      dm_bufio_default_cache_size);
 		dm_bufio_cache_size_latch = dm_bufio_default_cache_size;
 	}
-
-	dm_bufio_cache_size_per_client = dm_bufio_cache_size_latch /
-					 (dm_bufio_client_count ? : 1);
 }
 
 /*
@@ -435,8 +458,6 @@
 		return NULL;
 	}
 
-	adjust_total_allocated(b->data_mode, (long)c->block_size);
-
 #ifdef CONFIG_DM_DEBUG_BLOCK_STACK_TRACING
 	memset(&b->stack_trace, 0, sizeof(b->stack_trace));
 #endif
@@ -450,8 +471,6 @@
 {
 	struct dm_bufio_client *c = b->c;
 
-	adjust_total_allocated(b->data_mode, -(long)c->block_size);
-
 	free_buffer_data(c, b->data, b->data_mode);
 	kmem_cache_free(c->slab_buffer, b);
 }
@@ -469,6 +488,8 @@
 	list_add(&b->lru_list, &c->lru[dirty]);
 	__insert(b->c, b);
 	b->last_accessed = jiffies;
+
+	adjust_total_allocated(b, false);
 }
 
 /*
@@ -483,6 +504,8 @@
 	c->n_buffers[b->list_mode]--;
 	__remove(b->c, b);
 	list_del(&b->lru_list);
+
+	adjust_total_allocated(b, true);
 }
 
 /*
@@ -492,6 +515,8 @@
 {
 	struct dm_bufio_client *c = b->c;
 
+	b->accessed = 1;
+
 	BUG_ON(!c->n_buffers[b->list_mode]);
 
 	c->n_buffers[b->list_mode]--;
@@ -911,36 +936,6 @@
 }
 
 /*
- * Get writeback threshold and buffer limit for a given client.
- */
-static void __get_memory_limit(struct dm_bufio_client *c,
-			       unsigned long *threshold_buffers,
-			       unsigned long *limit_buffers)
-{
-	unsigned long buffers;
-
-	if (unlikely(READ_ONCE(dm_bufio_cache_size) != dm_bufio_cache_size_latch)) {
-		if (mutex_trylock(&dm_bufio_clients_lock)) {
-			__cache_size_refresh();
-			mutex_unlock(&dm_bufio_clients_lock);
-		}
-	}
-
-	buffers = dm_bufio_cache_size_per_client;
-	if (likely(c->sectors_per_block_bits >= 0))
-		buffers >>= c->sectors_per_block_bits + SECTOR_SHIFT;
-	else
-		buffers /= c->block_size;
-
-	if (buffers < c->minimum_buffers)
-		buffers = c->minimum_buffers;
-
-	*limit_buffers = buffers;
-	*threshold_buffers = mult_frac(buffers,
-				       DM_BUFIO_WRITEBACK_PERCENT, 100);
-}
-
-/*
  * Check if we're over watermark.
  * If we are over threshold_buffers, start freeing buffers.
  * If we're over "limit_buffers", block until we get under the limit.
@@ -948,23 +943,7 @@
 static void __check_watermark(struct dm_bufio_client *c,
 			      struct list_head *write_list)
 {
-	unsigned long threshold_buffers, limit_buffers;
-
-	__get_memory_limit(c, &threshold_buffers, &limit_buffers);
-
-	while (c->n_buffers[LIST_CLEAN] + c->n_buffers[LIST_DIRTY] >
-	       limit_buffers) {
-
-		struct dm_buffer *b = __get_unclaimed_buffer(c);
-
-		if (!b)
-			return;
-
-		__free_buffer_wake(b);
-		cond_resched();
-	}
-
-	if (c->n_buffers[LIST_DIRTY] > threshold_buffers)
+	if (c->n_buffers[LIST_DIRTY] > c->n_buffers[LIST_CLEAN] * DM_BUFIO_WRITEBACK_RATIO)
 		__write_dirty_buffers_async(c, 1, write_list);
 }
 
@@ -1844,6 +1823,74 @@
 	dm_bufio_unlock(c);
 }
 
+static void do_global_cleanup(struct work_struct *w)
+{
+	struct dm_bufio_client *locked_client = NULL;
+	struct dm_bufio_client *current_client;
+	struct dm_buffer *b;
+	unsigned spinlock_hold_count;
+	unsigned long threshold = dm_bufio_cache_size -
+		dm_bufio_cache_size / DM_BUFIO_LOW_WATERMARK_RATIO;
+	unsigned long loops = global_num * 2;
+
+	mutex_lock(&dm_bufio_clients_lock);
+
+	while (1) {
+		cond_resched();
+
+		spin_lock(&global_spinlock);
+		if (unlikely(dm_bufio_current_allocated <= threshold))
+			break;
+
+		spinlock_hold_count = 0;
+get_next:
+		if (!loops--)
+			break;
+		if (unlikely(list_empty(&global_queue)))
+			break;
+		b = list_entry(global_queue.prev, struct dm_buffer, global_list);
+
+		if (b->accessed) {
+			b->accessed = 0;
+			list_move(&b->global_list, &global_queue);
+			if (likely(++spinlock_hold_count < 16))
+				goto get_next;
+			spin_unlock(&global_spinlock);
+			continue;
+		}
+
+		current_client = b->c;
+		if (unlikely(current_client != locked_client)) {
+			if (locked_client)
+				dm_bufio_unlock(locked_client);
+
+			if (!dm_bufio_trylock(current_client)) {
+				spin_unlock(&global_spinlock);
+				dm_bufio_lock(current_client);
+				locked_client = current_client;
+				continue;
+			}
+
+			locked_client = current_client;
+		}
+
+		spin_unlock(&global_spinlock);
+
+		if (unlikely(!__try_evict_buffer(b, GFP_KERNEL))) {
+			spin_lock(&global_spinlock);
+			list_move(&b->global_list, &global_queue);
+			spin_unlock(&global_spinlock);
+		}
+	}
+
+	spin_unlock(&global_spinlock);
+
+	if (locked_client)
+		dm_bufio_unlock(locked_client);
+
+	mutex_unlock(&dm_bufio_clients_lock);
+}
+
 static void cleanup_old_buffers(void)
 {
 	unsigned long max_age_hz = get_max_age_hz();
@@ -1859,14 +1906,11 @@
 	mutex_unlock(&dm_bufio_clients_lock);
 }
 
-static struct workqueue_struct *dm_bufio_wq;
-static struct delayed_work dm_bufio_work;
-
 static void work_fn(struct work_struct *w)
 {
 	cleanup_old_buffers();
 
-	queue_delayed_work(dm_bufio_wq, &dm_bufio_work,
+	queue_delayed_work(dm_bufio_wq, &dm_bufio_cleanup_old_work,
 			   DM_BUFIO_WORK_TIMER_SECS * HZ);
 }
 
@@ -1908,8 +1952,9 @@
 	if (!dm_bufio_wq)
 		return -ENOMEM;
 
-	INIT_DELAYED_WORK(&dm_bufio_work, work_fn);
-	queue_delayed_work(dm_bufio_wq, &dm_bufio_work,
+	INIT_DELAYED_WORK(&dm_bufio_cleanup_old_work, work_fn);
+	INIT_WORK(&dm_bufio_replacement_work, do_global_cleanup);
+	queue_delayed_work(dm_bufio_wq, &dm_bufio_cleanup_old_work,
 			   DM_BUFIO_WORK_TIMER_SECS * HZ);
 
 	return 0;
@@ -1922,7 +1967,8 @@
 {
 	int bug = 0;
 
-	cancel_delayed_work_sync(&dm_bufio_work);
+	cancel_delayed_work_sync(&dm_bufio_cleanup_old_work);
+	flush_workqueue(dm_bufio_wq);
 	destroy_workqueue(dm_bufio_wq);
 
 	if (dm_bufio_client_count) {
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 34f5de1..62f7004 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -1886,6 +1886,13 @@
 		}
 	}
 
+	/*
+	 * dm-crypt performance can vary greatly depending on which crypto
+	 * algorithm implementation is used.  Help people debug performance
+	 * problems by logging the ->cra_driver_name.
+	 */
+	DMINFO("%s using implementation \"%s\"", ciphermode,
+	       crypto_skcipher_alg(any_tfm(cc))->base.cra_driver_name);
 	return 0;
 }
 
@@ -1904,6 +1911,8 @@
 		return err;
 	}
 
+	DMINFO("%s using implementation \"%s\"", ciphermode,
+	       crypto_aead_alg(any_tfm_aead(cc))->base.cra_driver_name);
 	return 0;
 }
 
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index 36275c5..7767f60 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -1979,6 +1979,9 @@
 	 */
 	if (blk_queue_add_random(q) && dm_table_all_devices_attribute(t, device_is_not_random))
 		blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, q);
+
+	/* io_pages is used for readahead */
+	q->backing_dev_info->io_pages = limits->max_sectors >> (PAGE_SHIFT - 9);
 }
 
 unsigned int dm_table_get_num_targets(struct dm_table *t)
diff --git a/drivers/md/dm-verity-avb.c b/drivers/md/dm-verity-avb.c
new file mode 100644
index 0000000..a9f102a
--- /dev/null
+++ b/drivers/md/dm-verity-avb.c
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2017 Google.
+ *
+ * This file is released under the GPLv2.
+ *
+ * Based on drivers/md/dm-verity-chromeos.c
+ */
+
+#include <linux/device-mapper.h>
+#include <linux/module.h>
+#include <linux/mount.h>
+
+#define DM_MSG_PREFIX "verity-avb"
+
+/* Set via module parameters. */
+static char avb_vbmeta_device[64];
+static char avb_invalidate_on_error[4];
+
+static void invalidate_vbmeta_endio(struct bio *bio)
+{
+	if (bio->bi_status)
+		DMERR("invalidate_vbmeta_endio: error %d", bio->bi_status);
+	complete(bio->bi_private);
+}
+
+static int invalidate_vbmeta_submit(struct bio *bio,
+				    struct block_device *bdev,
+				    int op, int access_last_sector,
+				    struct page *page)
+{
+	DECLARE_COMPLETION_ONSTACK(wait);
+
+	bio->bi_private = &wait;
+	bio->bi_end_io = invalidate_vbmeta_endio;
+	bio_set_dev(bio, bdev);
+	bio_set_op_attrs(bio, op, REQ_SYNC);
+
+	bio->bi_iter.bi_sector = 0;
+	if (access_last_sector) {
+		sector_t last_sector;
+
+		last_sector = (i_size_read(bdev->bd_inode)>>SECTOR_SHIFT) - 1;
+		bio->bi_iter.bi_sector = last_sector;
+	}
+	if (!bio_add_page(bio, page, PAGE_SIZE, 0)) {
+		DMERR("invalidate_vbmeta_submit: bio_add_page error");
+		return -EIO;
+	}
+
+	submit_bio(bio);
+	/* Wait up to 2 seconds for completion or fail. */
+	if (!wait_for_completion_timeout(&wait, msecs_to_jiffies(2000)))
+		return -EIO;
+	return 0;
+}
+
+static int invalidate_vbmeta(dev_t vbmeta_devt)
+{
+	int ret = 0;
+	struct block_device *bdev;
+	struct bio *bio;
+	struct page *page;
+	fmode_t dev_mode;
+	/* Ensure we do synchronous unblocked I/O. We may also need
+	 * sync_bdev() on completion, but it really shouldn't.
+	 */
+	int access_last_sector = 0;
+
+	DMINFO("invalidate_vbmeta: acting on device %d:%d",
+	       MAJOR(vbmeta_devt), MINOR(vbmeta_devt));
+
+	/* First we open the device for reading. */
+	dev_mode = FMODE_READ | FMODE_EXCL;
+	bdev = blkdev_get_by_dev(vbmeta_devt, dev_mode,
+				 invalidate_vbmeta);
+	if (IS_ERR(bdev)) {
+		DMERR("invalidate_kernel: could not open device for reading");
+		dev_mode = 0;
+		ret = -ENOENT;
+		goto failed_to_read;
+	}
+
+	bio = bio_alloc(GFP_NOIO, 1);
+	if (!bio) {
+		ret = -ENOMEM;
+		goto failed_bio_alloc;
+	}
+
+	page = alloc_page(GFP_NOIO);
+	if (!page) {
+		ret = -ENOMEM;
+		goto failed_to_alloc_page;
+	}
+
+	access_last_sector = 0;
+	ret = invalidate_vbmeta_submit(bio, bdev, REQ_OP_READ,
+				       access_last_sector, page);
+	if (ret) {
+		DMERR("invalidate_vbmeta: error reading");
+		goto failed_to_submit_read;
+	}
+
+	/* We have a page. Let's make sure it looks right. */
+	if (memcmp("AVB0", page_address(page), 4) == 0) {
+		/* Stamp it. */
+		memcpy(page_address(page), "AVE0", 4);
+		DMINFO("invalidate_vbmeta: found vbmeta partition");
+	} else {
+		/* Could be this is on a AVB footer, check. Also, since the
+		 * AVB footer is in the last 64 bytes, adjust for the fact that
+		 * we're dealing with 512-byte sectors.
+		 */
+		size_t offset = (1<<SECTOR_SHIFT) - 64;
+
+		access_last_sector = 1;
+		ret = invalidate_vbmeta_submit(bio, bdev, REQ_OP_READ,
+					       access_last_sector, page);
+		if (ret) {
+			DMERR("invalidate_vbmeta: error reading");
+			goto failed_to_submit_read;
+		}
+		if (memcmp("AVBf", page_address(page) + offset, 4) != 0) {
+			DMERR("invalidate_vbmeta on non-vbmeta partition");
+			ret = -EINVAL;
+			goto invalid_header;
+		}
+		/* Stamp it. */
+		memcpy(page_address(page) + offset, "AVE0", 4);
+		DMINFO("invalidate_vbmeta: found vbmeta footer partition");
+	}
+
+	/* Now rewrite the changed page - the block dev was being
+	 * changed on read. Let's reopen here.
+	 */
+	blkdev_put(bdev, dev_mode);
+	dev_mode = FMODE_WRITE | FMODE_EXCL;
+	bdev = blkdev_get_by_dev(vbmeta_devt, dev_mode,
+				 invalidate_vbmeta);
+	if (IS_ERR(bdev)) {
+		DMERR("invalidate_vbmeta: could not open device for writing");
+		dev_mode = 0;
+		ret = -ENOENT;
+		goto failed_to_write;
+	}
+
+	/* We re-use the same bio to do the write after the read. Need to reset
+	 * it to initialize bio->bi_remaining.
+	 */
+	bio_reset(bio);
+
+	ret = invalidate_vbmeta_submit(bio, bdev, REQ_OP_WRITE,
+				       access_last_sector, page);
+	if (ret) {
+		DMERR("invalidate_vbmeta: error writing");
+		goto failed_to_submit_write;
+	}
+
+	DMERR("invalidate_vbmeta: completed.");
+	ret = 0;
+failed_to_submit_write:
+failed_to_write:
+invalid_header:
+	__free_page(page);
+failed_to_submit_read:
+	/* Technically, we'll leak a page with the pending bio, but
+	 * we're about to reboot anyway.
+	 */
+failed_to_alloc_page:
+	bio_put(bio);
+failed_bio_alloc:
+	if (dev_mode)
+		blkdev_put(bdev, dev_mode);
+failed_to_read:
+	return ret;
+}
+
+void dm_verity_avb_error_handler(void)
+{
+	dev_t dev;
+
+	DMINFO("AVB error handler called for %s", avb_vbmeta_device);
+
+	if (strcmp(avb_invalidate_on_error, "yes") != 0) {
+		DMINFO("Not configured to invalidate");
+		return;
+	}
+
+	if (avb_vbmeta_device[0] == '\0') {
+		DMERR("avb_vbmeta_device parameter not set");
+		goto fail_no_dev;
+	}
+
+	dev = name_to_dev_t(avb_vbmeta_device);
+	if (!dev) {
+		DMERR("No matching partition for device: %s",
+		      avb_vbmeta_device);
+		goto fail_no_dev;
+	}
+
+	invalidate_vbmeta(dev);
+
+fail_no_dev:
+	;
+}
+
+static int __init dm_verity_avb_init(void)
+{
+	DMINFO("AVB error handler initialized with vbmeta device: %s",
+	       avb_vbmeta_device);
+	return 0;
+}
+
+static void __exit dm_verity_avb_exit(void)
+{
+}
+
+module_init(dm_verity_avb_init);
+module_exit(dm_verity_avb_exit);
+
+MODULE_AUTHOR("David Zeuthen <zeuthen@google.com>");
+MODULE_DESCRIPTION("AVB-specific error handler for dm-verity");
+MODULE_LICENSE("GPL");
+
+/* Declare parameter with no module prefix */
+#undef MODULE_PARAM_PREFIX
+#define MODULE_PARAM_PREFIX	"androidboot.vbmeta."
+module_param_string(device, avb_vbmeta_device, sizeof(avb_vbmeta_device), 0);
+module_param_string(invalidate_on_error, avb_invalidate_on_error,
+		    sizeof(avb_invalidate_on_error), 0);
diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c
index e3599b4..758b802 100644
--- a/drivers/md/dm-verity-target.c
+++ b/drivers/md/dm-verity-target.c
@@ -251,8 +251,12 @@
 	if (v->mode == DM_VERITY_MODE_LOGGING)
 		return 0;
 
-	if (v->mode == DM_VERITY_MODE_RESTART)
+	if (v->mode == DM_VERITY_MODE_RESTART) {
+#ifdef CONFIG_DM_VERITY_AVB
+		dm_verity_avb_error_handler();
+#endif
 		kernel_restart("dm-verity device corrupted");
+	}
 
 	return 1;
 }
@@ -1040,6 +1044,15 @@
 		v->tfm = NULL;
 		goto bad;
 	}
+
+	/*
+	 * dm-verity performance can vary greatly depending on which hash
+	 * algorithm implementation is used.  Help people debug performance
+	 * problems by logging the ->cra_driver_name.
+	 */
+	DMINFO("%s using implementation \"%s\"", v->alg_name,
+	       crypto_hash_alg_common(v->tfm)->base.cra_driver_name);
+
 	v->digest_size = crypto_ahash_digestsize(v->tfm);
 	if ((1 << v->hash_dev_block_bits) < v->digest_size * 2) {
 		ti->error = "Digest size too big";
diff --git a/drivers/md/dm-verity.h b/drivers/md/dm-verity.h
index 3441c10..0152d36 100644
--- a/drivers/md/dm-verity.h
+++ b/drivers/md/dm-verity.h
@@ -127,4 +127,6 @@
 extern int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io,
 				 sector_t block, u8 *digest, bool *is_zero);
 
+extern void dm_verity_avb_error_handler(void);
+
 #endif /* DM_VERITY_H */
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index c9860e3..8a68c17 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1312,12 +1312,15 @@
 		     sector_t sector, unsigned len)
 {
 	struct bio *clone = &tio->clone;
+	int ret;
 
 	__bio_clone_fast(clone, bio);
 
-	if (unlikely(bio_integrity(bio) != NULL)) {
-		int r;
+	ret = bio_crypt_clone(clone, bio, GFP_NOIO);
+	if (ret < 0)
+		return ret;
 
+	if (unlikely(bio_integrity(bio) != NULL)) {
 		if (unlikely(!dm_target_has_integrity(tio->ti->type) &&
 			     !dm_target_passes_integrity(tio->ti->type))) {
 			DMWARN("%s: the target %s doesn't support integrity data.",
@@ -1326,9 +1329,11 @@
 			return -EIO;
 		}
 
-		r = bio_integrity_clone(clone, bio, GFP_NOIO);
-		if (r < 0)
-			return r;
+		ret = bio_integrity_clone(clone, bio, GFP_NOIO);
+		if (ret < 0) {
+			bio_crypt_free_ctx(clone);
+			return ret;
+		}
 	}
 
 	if (bio_op(bio) != REQ_OP_ZONE_REPORT)
diff --git a/drivers/media/v4l2-core/videobuf-dma-contig.c b/drivers/media/v4l2-core/videobuf-dma-contig.c
index f461325..a7a9bcc 100644
--- a/drivers/media/v4l2-core/videobuf-dma-contig.c
+++ b/drivers/media/v4l2-core/videobuf-dma-contig.c
@@ -160,6 +160,7 @@
 static int videobuf_dma_contig_user_get(struct videobuf_dma_contig_memory *mem,
 					struct videobuf_buffer *vb)
 {
+	unsigned long untagged_baddr = untagged_addr(vb->baddr);
 	struct mm_struct *mm = current->mm;
 	struct vm_area_struct *vma;
 	unsigned long prev_pfn, this_pfn;
@@ -167,22 +168,22 @@
 	unsigned int offset;
 	int ret;
 
-	offset = vb->baddr & ~PAGE_MASK;
+	offset = untagged_baddr & ~PAGE_MASK;
 	mem->size = PAGE_ALIGN(vb->size + offset);
 	ret = -EINVAL;
 
 	down_read(&mm->mmap_sem);
 
-	vma = find_vma(mm, vb->baddr);
+	vma = find_vma(mm, untagged_baddr);
 	if (!vma)
 		goto out_up;
 
-	if ((vb->baddr + mem->size) > vma->vm_end)
+	if ((untagged_baddr + mem->size) > vma->vm_end)
 		goto out_up;
 
 	pages_done = 0;
 	prev_pfn = 0; /* kill warning */
-	user_address = vb->baddr;
+	user_address = untagged_baddr;
 
 	while (pages_done < (mem->size >> PAGE_SHIFT)) {
 		ret = follow_pfn(vma, user_address, &this_pfn);
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 3726eac..241e3d9 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -513,6 +513,21 @@
 	tristate
 	default MISC_RTSX_PCI || MISC_RTSX_USB
 
+config UID_SYS_STATS
+	bool "Per-UID statistics"
+	depends on PROFILING && TASK_XACCT && TASK_IO_ACCOUNTING
+	help
+	  Per UID based cpu time statistics exported to /proc/uid_cputime
+	  Per UID based io statistics exported to /proc/uid_io
+	  Per UID based procstat control in /proc/uid_procstat
+
+config UID_SYS_STATS_DEBUG
+	bool "Per-TASK statistics"
+	depends on UID_SYS_STATS
+	default n
+	help
+	  Per TASK based io statistics exported to /proc/uid_io
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index af22bbc..fca6aae 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -58,3 +58,4 @@
 obj-$(CONFIG_PCI_ENDPOINT_TEST)	+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL)		+= ocxl/
 obj-$(CONFIG_MISC_RTSX)		+= cardreader/
+obj-$(CONFIG_UID_SYS_STATS)	+= uid_sys_stats.o
diff --git a/drivers/misc/lkdtm/Makefile b/drivers/misc/lkdtm/Makefile
index cce47a1..939651b 100644
--- a/drivers/misc/lkdtm/Makefile
+++ b/drivers/misc/lkdtm/Makefile
@@ -10,6 +10,7 @@
 lkdtm-$(CONFIG_LKDTM)		+= usercopy.o
 
 KCOV_INSTRUMENT_rodata.o	:= n
+CFLAGS_rodata.o			+= $(DISABLE_LTO)
 
 OBJCOPYFLAGS :=
 OBJCOPYFLAGS_rodata_objcopy.o	:= \
diff --git a/drivers/misc/uid_sys_stats.c b/drivers/misc/uid_sys_stats.c
new file mode 100644
index 0000000..f6a6a3e
--- /dev/null
+++ b/drivers/misc/uid_sys_stats.c
@@ -0,0 +1,711 @@
+/* drivers/misc/uid_sys_stats.c
+ *
+ * Copyright (C) 2014 - 2015 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ *
+ */
+
+#include <linux/atomic.h>
+#include <linux/cpufreq_times.h>
+#include <linux/err.h>
+#include <linux/hashtable.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/list.h>
+#include <linux/mm.h>
+#include <linux/proc_fs.h>
+#include <linux/profile.h>
+#include <linux/rtmutex.h>
+#include <linux/sched/cputime.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include <linux/uaccess.h>
+
+
+#define UID_HASH_BITS	10
+DECLARE_HASHTABLE(hash_table, UID_HASH_BITS);
+
+static DEFINE_RT_MUTEX(uid_lock);
+static struct proc_dir_entry *cpu_parent;
+static struct proc_dir_entry *io_parent;
+static struct proc_dir_entry *proc_parent;
+
+struct io_stats {
+	u64 read_bytes;
+	u64 write_bytes;
+	u64 rchar;
+	u64 wchar;
+	u64 fsync;
+};
+
+#define UID_STATE_FOREGROUND	0
+#define UID_STATE_BACKGROUND	1
+#define UID_STATE_BUCKET_SIZE	2
+
+#define UID_STATE_TOTAL_CURR	2
+#define UID_STATE_TOTAL_LAST	3
+#define UID_STATE_DEAD_TASKS	4
+#define UID_STATE_SIZE		5
+
+#define MAX_TASK_COMM_LEN 256
+
+struct task_entry {
+	char comm[MAX_TASK_COMM_LEN];
+	pid_t pid;
+	struct io_stats io[UID_STATE_SIZE];
+	struct hlist_node hash;
+};
+
+struct uid_entry {
+	uid_t uid;
+	u64 utime;
+	u64 stime;
+	u64 active_utime;
+	u64 active_stime;
+	int state;
+	struct io_stats io[UID_STATE_SIZE];
+	struct hlist_node hash;
+#ifdef CONFIG_UID_SYS_STATS_DEBUG
+	DECLARE_HASHTABLE(task_entries, UID_HASH_BITS);
+#endif
+};
+
+static u64 compute_write_bytes(struct task_struct *task)
+{
+	if (task->ioac.write_bytes <= task->ioac.cancelled_write_bytes)
+		return 0;
+
+	return task->ioac.write_bytes - task->ioac.cancelled_write_bytes;
+}
+
+static void compute_io_bucket_stats(struct io_stats *io_bucket,
+					struct io_stats *io_curr,
+					struct io_stats *io_last,
+					struct io_stats *io_dead)
+{
+	/* tasks could switch to another uid group, but its io_last in the
+	 * previous uid group could still be positive.
+	 * therefore before each update, do an overflow check first
+	 */
+	int64_t delta;
+
+	delta = io_curr->read_bytes + io_dead->read_bytes -
+		io_last->read_bytes;
+	io_bucket->read_bytes += delta > 0 ? delta : 0;
+	delta = io_curr->write_bytes + io_dead->write_bytes -
+		io_last->write_bytes;
+	io_bucket->write_bytes += delta > 0 ? delta : 0;
+	delta = io_curr->rchar + io_dead->rchar - io_last->rchar;
+	io_bucket->rchar += delta > 0 ? delta : 0;
+	delta = io_curr->wchar + io_dead->wchar - io_last->wchar;
+	io_bucket->wchar += delta > 0 ? delta : 0;
+	delta = io_curr->fsync + io_dead->fsync - io_last->fsync;
+	io_bucket->fsync += delta > 0 ? delta : 0;
+
+	io_last->read_bytes = io_curr->read_bytes;
+	io_last->write_bytes = io_curr->write_bytes;
+	io_last->rchar = io_curr->rchar;
+	io_last->wchar = io_curr->wchar;
+	io_last->fsync = io_curr->fsync;
+
+	memset(io_dead, 0, sizeof(struct io_stats));
+}
+
+#ifdef CONFIG_UID_SYS_STATS_DEBUG
+static void get_full_task_comm(struct task_entry *task_entry,
+		struct task_struct *task)
+{
+	int i = 0, offset = 0, len = 0;
+	/* save one byte for terminating null character */
+	int unused_len = MAX_TASK_COMM_LEN - TASK_COMM_LEN - 1;
+	char buf[unused_len];
+	struct mm_struct *mm = task->mm;
+
+	/* fill the first TASK_COMM_LEN bytes with thread name */
+	__get_task_comm(task_entry->comm, TASK_COMM_LEN, task);
+	i = strlen(task_entry->comm);
+	while (i < TASK_COMM_LEN)
+		task_entry->comm[i++] = ' ';
+
+	/* next the executable file name */
+	if (mm) {
+		down_read(&mm->mmap_sem);
+		if (mm->exe_file) {
+			char *pathname = d_path(&mm->exe_file->f_path, buf,
+					unused_len);
+
+			if (!IS_ERR(pathname)) {
+				len = strlcpy(task_entry->comm + i, pathname,
+						unused_len);
+				i += len;
+				task_entry->comm[i++] = ' ';
+				unused_len--;
+			}
+		}
+		up_read(&mm->mmap_sem);
+	}
+	unused_len -= len;
+
+	/* fill the rest with command line argument
+	 * replace each null or new line character
+	 * between args in argv with whitespace */
+	len = get_cmdline(task, buf, unused_len);
+	while (offset < len) {
+		if (buf[offset] != '\0' && buf[offset] != '\n')
+			task_entry->comm[i++] = buf[offset];
+		else
+			task_entry->comm[i++] = ' ';
+		offset++;
+	}
+
+	/* get rid of trailing whitespaces in case when arg is memset to
+	 * zero before being reset in userspace
+	 */
+	while (task_entry->comm[i-1] == ' ')
+		i--;
+	task_entry->comm[i] = '\0';
+}
+
+static struct task_entry *find_task_entry(struct uid_entry *uid_entry,
+		struct task_struct *task)
+{
+	struct task_entry *task_entry;
+
+	hash_for_each_possible(uid_entry->task_entries, task_entry, hash,
+			task->pid) {
+		if (task->pid == task_entry->pid) {
+			/* if thread name changed, update the entire command */
+			int len = strnchr(task_entry->comm, ' ', TASK_COMM_LEN)
+				- task_entry->comm;
+
+			if (strncmp(task_entry->comm, task->comm, len))
+				get_full_task_comm(task_entry, task);
+			return task_entry;
+		}
+	}
+	return NULL;
+}
+
+static struct task_entry *find_or_register_task(struct uid_entry *uid_entry,
+		struct task_struct *task)
+{
+	struct task_entry *task_entry;
+	pid_t pid = task->pid;
+
+	task_entry = find_task_entry(uid_entry, task);
+	if (task_entry)
+		return task_entry;
+
+	task_entry = kzalloc(sizeof(struct task_entry), GFP_ATOMIC);
+	if (!task_entry)
+		return NULL;
+
+	get_full_task_comm(task_entry, task);
+
+	task_entry->pid = pid;
+	hash_add(uid_entry->task_entries, &task_entry->hash, (unsigned int)pid);
+
+	return task_entry;
+}
+
+static void remove_uid_tasks(struct uid_entry *uid_entry)
+{
+	struct task_entry *task_entry;
+	unsigned long bkt_task;
+	struct hlist_node *tmp_task;
+
+	hash_for_each_safe(uid_entry->task_entries, bkt_task,
+			tmp_task, task_entry, hash) {
+		hash_del(&task_entry->hash);
+		kfree(task_entry);
+	}
+}
+
+static void set_io_uid_tasks_zero(struct uid_entry *uid_entry)
+{
+	struct task_entry *task_entry;
+	unsigned long bkt_task;
+
+	hash_for_each(uid_entry->task_entries, bkt_task, task_entry, hash) {
+		memset(&task_entry->io[UID_STATE_TOTAL_CURR], 0,
+			sizeof(struct io_stats));
+	}
+}
+
+static void add_uid_tasks_io_stats(struct uid_entry *uid_entry,
+		struct task_struct *task, int slot)
+{
+	struct task_entry *task_entry = find_or_register_task(uid_entry, task);
+	struct io_stats *task_io_slot = &task_entry->io[slot];
+
+	task_io_slot->read_bytes += task->ioac.read_bytes;
+	task_io_slot->write_bytes += compute_write_bytes(task);
+	task_io_slot->rchar += task->ioac.rchar;
+	task_io_slot->wchar += task->ioac.wchar;
+	task_io_slot->fsync += task->ioac.syscfs;
+}
+
+static void compute_io_uid_tasks(struct uid_entry *uid_entry)
+{
+	struct task_entry *task_entry;
+	unsigned long bkt_task;
+
+	hash_for_each(uid_entry->task_entries, bkt_task, task_entry, hash) {
+		compute_io_bucket_stats(&task_entry->io[uid_entry->state],
+					&task_entry->io[UID_STATE_TOTAL_CURR],
+					&task_entry->io[UID_STATE_TOTAL_LAST],
+					&task_entry->io[UID_STATE_DEAD_TASKS]);
+	}
+}
+
+static void show_io_uid_tasks(struct seq_file *m, struct uid_entry *uid_entry)
+{
+	struct task_entry *task_entry;
+	unsigned long bkt_task;
+
+	hash_for_each(uid_entry->task_entries, bkt_task, task_entry, hash) {
+		/* Separated by comma because space exists in task comm */
+		seq_printf(m, "task,%s,%lu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu\n",
+				task_entry->comm,
+				(unsigned long)task_entry->pid,
+				task_entry->io[UID_STATE_FOREGROUND].rchar,
+				task_entry->io[UID_STATE_FOREGROUND].wchar,
+				task_entry->io[UID_STATE_FOREGROUND].read_bytes,
+				task_entry->io[UID_STATE_FOREGROUND].write_bytes,
+				task_entry->io[UID_STATE_BACKGROUND].rchar,
+				task_entry->io[UID_STATE_BACKGROUND].wchar,
+				task_entry->io[UID_STATE_BACKGROUND].read_bytes,
+				task_entry->io[UID_STATE_BACKGROUND].write_bytes,
+				task_entry->io[UID_STATE_FOREGROUND].fsync,
+				task_entry->io[UID_STATE_BACKGROUND].fsync);
+	}
+}
+#else
+static void remove_uid_tasks(struct uid_entry *uid_entry) {};
+static void set_io_uid_tasks_zero(struct uid_entry *uid_entry) {};
+static void add_uid_tasks_io_stats(struct uid_entry *uid_entry,
+		struct task_struct *task, int slot) {};
+static void compute_io_uid_tasks(struct uid_entry *uid_entry) {};
+static void show_io_uid_tasks(struct seq_file *m,
+		struct uid_entry *uid_entry) {}
+#endif
+
+static struct uid_entry *find_uid_entry(uid_t uid)
+{
+	struct uid_entry *uid_entry;
+	hash_for_each_possible(hash_table, uid_entry, hash, uid) {
+		if (uid_entry->uid == uid)
+			return uid_entry;
+	}
+	return NULL;
+}
+
+static struct uid_entry *find_or_register_uid(uid_t uid)
+{
+	struct uid_entry *uid_entry;
+
+	uid_entry = find_uid_entry(uid);
+	if (uid_entry)
+		return uid_entry;
+
+	uid_entry = kzalloc(sizeof(struct uid_entry), GFP_ATOMIC);
+	if (!uid_entry)
+		return NULL;
+
+	uid_entry->uid = uid;
+#ifdef CONFIG_UID_SYS_STATS_DEBUG
+	hash_init(uid_entry->task_entries);
+#endif
+	hash_add(hash_table, &uid_entry->hash, uid);
+
+	return uid_entry;
+}
+
+static int uid_cputime_show(struct seq_file *m, void *v)
+{
+	struct uid_entry *uid_entry = NULL;
+	struct task_struct *task, *temp;
+	struct user_namespace *user_ns = current_user_ns();
+	u64 utime;
+	u64 stime;
+	unsigned long bkt;
+	uid_t uid;
+
+	rt_mutex_lock(&uid_lock);
+
+	hash_for_each(hash_table, bkt, uid_entry, hash) {
+		uid_entry->active_stime = 0;
+		uid_entry->active_utime = 0;
+	}
+
+	rcu_read_lock();
+	do_each_thread(temp, task) {
+		uid = from_kuid_munged(user_ns, task_uid(task));
+		if (!uid_entry || uid_entry->uid != uid)
+			uid_entry = find_or_register_uid(uid);
+		if (!uid_entry) {
+			rcu_read_unlock();
+			rt_mutex_unlock(&uid_lock);
+			pr_err("%s: failed to find the uid_entry for uid %d\n",
+				__func__, uid);
+			return -ENOMEM;
+		}
+		/* avoid double accounting of dying threads */
+		if (!(task->flags & PF_EXITING)) {
+			task_cputime_adjusted(task, &utime, &stime);
+			uid_entry->active_utime += utime;
+			uid_entry->active_stime += stime;
+		}
+	} while_each_thread(temp, task);
+	rcu_read_unlock();
+
+	hash_for_each(hash_table, bkt, uid_entry, hash) {
+		u64 total_utime = uid_entry->utime +
+							uid_entry->active_utime;
+		u64 total_stime = uid_entry->stime +
+							uid_entry->active_stime;
+		seq_printf(m, "%d: %llu %llu\n", uid_entry->uid,
+			ktime_to_us(total_utime), ktime_to_us(total_stime));
+	}
+
+	rt_mutex_unlock(&uid_lock);
+	return 0;
+}
+
+static int uid_cputime_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, uid_cputime_show, PDE_DATA(inode));
+}
+
+static const struct file_operations uid_cputime_fops = {
+	.open		= uid_cputime_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= single_release,
+};
+
+static int uid_remove_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, NULL, NULL);
+}
+
+static ssize_t uid_remove_write(struct file *file,
+			const char __user *buffer, size_t count, loff_t *ppos)
+{
+	struct uid_entry *uid_entry;
+	struct hlist_node *tmp;
+	char uids[128];
+	char *start_uid, *end_uid = NULL;
+	uid_t uid_start = 0, uid_end = 0;
+	u64 uid;
+
+	if (count >= sizeof(uids))
+		count = sizeof(uids) - 1;
+
+	if (copy_from_user(uids, buffer, count))
+		return -EFAULT;
+
+	uids[count] = '\0';
+	end_uid = uids;
+	start_uid = strsep(&end_uid, "-");
+
+	if (!start_uid || !end_uid)
+		return -EINVAL;
+
+	if (kstrtouint(start_uid, 10, &uid_start) != 0 ||
+		kstrtouint(end_uid, 10, &uid_end) != 0) {
+		return -EINVAL;
+	}
+
+	/* Also remove uids from /proc/uid_time_in_state */
+	cpufreq_task_times_remove_uids(uid_start, uid_end);
+
+	rt_mutex_lock(&uid_lock);
+
+	for (uid = uid_start; uid <= uid_end; uid++) {
+		hash_for_each_possible_safe(hash_table, uid_entry, tmp,
+							hash, uid) {
+			if (uid == uid_entry->uid) {
+				remove_uid_tasks(uid_entry);
+				hash_del(&uid_entry->hash);
+				kfree(uid_entry);
+			}
+		}
+	}
+
+	rt_mutex_unlock(&uid_lock);
+	return count;
+}
+
+static const struct file_operations uid_remove_fops = {
+	.open		= uid_remove_open,
+	.release	= single_release,
+	.write		= uid_remove_write,
+};
+
+
+static void add_uid_io_stats(struct uid_entry *uid_entry,
+			struct task_struct *task, int slot)
+{
+	struct io_stats *io_slot = &uid_entry->io[slot];
+
+	/* avoid double accounting of dying threads */
+	if (slot != UID_STATE_DEAD_TASKS && (task->flags & PF_EXITING))
+		return;
+
+	io_slot->read_bytes += task->ioac.read_bytes;
+	io_slot->write_bytes += compute_write_bytes(task);
+	io_slot->rchar += task->ioac.rchar;
+	io_slot->wchar += task->ioac.wchar;
+	io_slot->fsync += task->ioac.syscfs;
+
+	add_uid_tasks_io_stats(uid_entry, task, slot);
+}
+
+static void update_io_stats_all_locked(void)
+{
+	struct uid_entry *uid_entry = NULL;
+	struct task_struct *task, *temp;
+	struct user_namespace *user_ns = current_user_ns();
+	unsigned long bkt;
+	uid_t uid;
+
+	hash_for_each(hash_table, bkt, uid_entry, hash) {
+		memset(&uid_entry->io[UID_STATE_TOTAL_CURR], 0,
+			sizeof(struct io_stats));
+		set_io_uid_tasks_zero(uid_entry);
+	}
+
+	rcu_read_lock();
+	do_each_thread(temp, task) {
+		uid = from_kuid_munged(user_ns, task_uid(task));
+		if (!uid_entry || uid_entry->uid != uid)
+			uid_entry = find_or_register_uid(uid);
+		if (!uid_entry)
+			continue;
+		add_uid_io_stats(uid_entry, task, UID_STATE_TOTAL_CURR);
+	} while_each_thread(temp, task);
+	rcu_read_unlock();
+
+	hash_for_each(hash_table, bkt, uid_entry, hash) {
+		compute_io_bucket_stats(&uid_entry->io[uid_entry->state],
+					&uid_entry->io[UID_STATE_TOTAL_CURR],
+					&uid_entry->io[UID_STATE_TOTAL_LAST],
+					&uid_entry->io[UID_STATE_DEAD_TASKS]);
+		compute_io_uid_tasks(uid_entry);
+	}
+}
+
+static void update_io_stats_uid_locked(struct uid_entry *uid_entry)
+{
+	struct task_struct *task, *temp;
+	struct user_namespace *user_ns = current_user_ns();
+
+	memset(&uid_entry->io[UID_STATE_TOTAL_CURR], 0,
+		sizeof(struct io_stats));
+	set_io_uid_tasks_zero(uid_entry);
+
+	rcu_read_lock();
+	do_each_thread(temp, task) {
+		if (from_kuid_munged(user_ns, task_uid(task)) != uid_entry->uid)
+			continue;
+		add_uid_io_stats(uid_entry, task, UID_STATE_TOTAL_CURR);
+	} while_each_thread(temp, task);
+	rcu_read_unlock();
+
+	compute_io_bucket_stats(&uid_entry->io[uid_entry->state],
+				&uid_entry->io[UID_STATE_TOTAL_CURR],
+				&uid_entry->io[UID_STATE_TOTAL_LAST],
+				&uid_entry->io[UID_STATE_DEAD_TASKS]);
+	compute_io_uid_tasks(uid_entry);
+}
+
+
+static int uid_io_show(struct seq_file *m, void *v)
+{
+	struct uid_entry *uid_entry;
+	unsigned long bkt;
+
+	rt_mutex_lock(&uid_lock);
+
+	update_io_stats_all_locked();
+
+	hash_for_each(hash_table, bkt, uid_entry, hash) {
+		seq_printf(m, "%d %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu\n",
+				uid_entry->uid,
+				uid_entry->io[UID_STATE_FOREGROUND].rchar,
+				uid_entry->io[UID_STATE_FOREGROUND].wchar,
+				uid_entry->io[UID_STATE_FOREGROUND].read_bytes,
+				uid_entry->io[UID_STATE_FOREGROUND].write_bytes,
+				uid_entry->io[UID_STATE_BACKGROUND].rchar,
+				uid_entry->io[UID_STATE_BACKGROUND].wchar,
+				uid_entry->io[UID_STATE_BACKGROUND].read_bytes,
+				uid_entry->io[UID_STATE_BACKGROUND].write_bytes,
+				uid_entry->io[UID_STATE_FOREGROUND].fsync,
+				uid_entry->io[UID_STATE_BACKGROUND].fsync);
+
+		show_io_uid_tasks(m, uid_entry);
+	}
+
+	rt_mutex_unlock(&uid_lock);
+	return 0;
+}
+
+static int uid_io_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, uid_io_show, PDE_DATA(inode));
+}
+
+static const struct file_operations uid_io_fops = {
+	.open		= uid_io_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= single_release,
+};
+
+static int uid_procstat_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, NULL, NULL);
+}
+
+static ssize_t uid_procstat_write(struct file *file,
+			const char __user *buffer, size_t count, loff_t *ppos)
+{
+	struct uid_entry *uid_entry;
+	uid_t uid;
+	int argc, state;
+	char input[128];
+
+	if (count >= sizeof(input))
+		return -EINVAL;
+
+	if (copy_from_user(input, buffer, count))
+		return -EFAULT;
+
+	input[count] = '\0';
+
+	argc = sscanf(input, "%u %d", &uid, &state);
+	if (argc != 2)
+		return -EINVAL;
+
+	if (state != UID_STATE_BACKGROUND && state != UID_STATE_FOREGROUND)
+		return -EINVAL;
+
+	rt_mutex_lock(&uid_lock);
+
+	uid_entry = find_or_register_uid(uid);
+	if (!uid_entry) {
+		rt_mutex_unlock(&uid_lock);
+		return -EINVAL;
+	}
+
+	if (uid_entry->state == state) {
+		rt_mutex_unlock(&uid_lock);
+		return count;
+	}
+
+	update_io_stats_uid_locked(uid_entry);
+
+	uid_entry->state = state;
+
+	rt_mutex_unlock(&uid_lock);
+
+	return count;
+}
+
+static const struct file_operations uid_procstat_fops = {
+	.open		= uid_procstat_open,
+	.release	= single_release,
+	.write		= uid_procstat_write,
+};
+
+static int process_notifier(struct notifier_block *self,
+			unsigned long cmd, void *v)
+{
+	struct task_struct *task = v;
+	struct uid_entry *uid_entry;
+	u64 utime, stime;
+	uid_t uid;
+
+	if (!task)
+		return NOTIFY_OK;
+
+	rt_mutex_lock(&uid_lock);
+	uid = from_kuid_munged(current_user_ns(), task_uid(task));
+	uid_entry = find_or_register_uid(uid);
+	if (!uid_entry) {
+		pr_err("%s: failed to find uid %d\n", __func__, uid);
+		goto exit;
+	}
+
+	task_cputime_adjusted(task, &utime, &stime);
+	uid_entry->utime += utime;
+	uid_entry->stime += stime;
+
+	add_uid_io_stats(uid_entry, task, UID_STATE_DEAD_TASKS);
+
+exit:
+	rt_mutex_unlock(&uid_lock);
+	return NOTIFY_OK;
+}
+
+static struct notifier_block process_notifier_block = {
+	.notifier_call	= process_notifier,
+};
+
+static int __init proc_uid_sys_stats_init(void)
+{
+	hash_init(hash_table);
+
+	cpu_parent = proc_mkdir("uid_cputime", NULL);
+	if (!cpu_parent) {
+		pr_err("%s: failed to create uid_cputime proc entry\n",
+			__func__);
+		goto err;
+	}
+
+	proc_create_data("remove_uid_range", 0222, cpu_parent,
+		&uid_remove_fops, NULL);
+	proc_create_data("show_uid_stat", 0444, cpu_parent,
+		&uid_cputime_fops, NULL);
+
+	io_parent = proc_mkdir("uid_io", NULL);
+	if (!io_parent) {
+		pr_err("%s: failed to create uid_io proc entry\n",
+			__func__);
+		goto err;
+	}
+
+	proc_create_data("stats", 0444, io_parent,
+		&uid_io_fops, NULL);
+
+	proc_parent = proc_mkdir("uid_procstat", NULL);
+	if (!proc_parent) {
+		pr_err("%s: failed to create uid_procstat proc entry\n",
+			__func__);
+		goto err;
+	}
+
+	proc_create_data("set", 0222, proc_parent,
+		&uid_procstat_fops, NULL);
+
+	profile_event_register(PROFILE_TASK_EXIT, &process_notifier_block);
+
+	return 0;
+
+err:
+	remove_proc_subtree("uid_cputime", NULL);
+	remove_proc_subtree("uid_io", NULL);
+	remove_proc_subtree("uid_procstat", NULL);
+	return -ENOMEM;
+}
+
+early_initcall(proc_uid_sys_stats_init);
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
index f57f5de..f3dc49f 100644
--- a/drivers/mmc/core/host.c
+++ b/drivers/mmc/core/host.c
@@ -441,7 +441,8 @@
 #endif
 
 	mmc_start_host(host);
-	mmc_register_pm_notifier(host);
+	if (!(host->pm_flags & MMC_PM_IGNORE_PM_NOTIFY))
+		mmc_register_pm_notifier(host);
 
 	return 0;
 }
@@ -458,7 +459,8 @@
  */
 void mmc_remove_host(struct mmc_host *host)
 {
-	mmc_unregister_pm_notifier(host);
+	if (!(host->pm_flags & MMC_PM_IGNORE_PM_NOTIFY))
+		mmc_unregister_pm_notifier(host);
 	mmc_stop_host(host);
 
 #ifdef CONFIG_DEBUG_FS
diff --git a/drivers/net/ppp/ppp_async.c b/drivers/net/ppp/ppp_async.c
index bdc4d23..7eae088 100644
--- a/drivers/net/ppp/ppp_async.c
+++ b/drivers/net/ppp/ppp_async.c
@@ -770,7 +770,7 @@
 {
 	struct sk_buff *skb;
 	unsigned char *p;
-	unsigned int len, fcs, proto;
+	unsigned int len, fcs;
 
 	skb = ap->rpkt;
 	if (ap->state & (SC_TOSS | SC_ESCAPE))
@@ -799,14 +799,14 @@
 			goto err;
 		p = skb_pull(skb, 2);
 	}
-	proto = p[0];
-	if (proto & 1) {
-		/* protocol is compressed */
-		*(u8 *)skb_push(skb, 1) = 0;
-	} else {
+
+	/* If protocol field is not compressed, it can be LCP packet */
+	if (!(p[0] & 0x01)) {
+		unsigned int proto;
+
 		if (skb->len < 2)
 			goto err;
-		proto = (proto << 8) + p[1];
+		proto = (p[0] << 8) + p[1];
 		if (proto == PPP_LCP)
 			async_lcp_peek(ap, p, skb->len, 1);
 	}
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
index 3e014ec..afaa7d1 100644
--- a/drivers/net/ppp/ppp_generic.c
+++ b/drivers/net/ppp/ppp_generic.c
@@ -1967,6 +1967,46 @@
 	ppp_recv_unlock(ppp);
 }
 
+/**
+ * __ppp_decompress_proto - Decompress protocol field, slim version.
+ * @skb: Socket buffer where protocol field should be decompressed. It must have
+ *	 at least 1 byte of head room and 1 byte of linear data. First byte of
+ *	 data must be a protocol field byte.
+ *
+ * Decompress protocol field in PPP header if it's compressed, e.g. when
+ * Protocol-Field-Compression (PFC) was negotiated. No checks w.r.t. skb data
+ * length are done in this function.
+ */
+static void __ppp_decompress_proto(struct sk_buff *skb)
+{
+	if (skb->data[0] & 0x01)
+		*(u8 *)skb_push(skb, 1) = 0x00;
+}
+
+/**
+ * ppp_decompress_proto - Check skb data room and decompress protocol field.
+ * @skb: Socket buffer where protocol field should be decompressed. First byte
+ *	 of data must be a protocol field byte.
+ *
+ * Decompress protocol field in PPP header if it's compressed, e.g. when
+ * Protocol-Field-Compression (PFC) was negotiated. This function also makes
+ * sure that skb data room is sufficient for Protocol field, before and after
+ * decompression.
+ *
+ * Return: true - decompressed successfully, false - not enough room in skb.
+ */
+static bool ppp_decompress_proto(struct sk_buff *skb)
+{
+	/* At least one byte should be present (if protocol is compressed) */
+	if (!pskb_may_pull(skb, 1))
+		return false;
+
+	__ppp_decompress_proto(skb);
+
+	/* Protocol field should occupy 2 bytes when not compressed */
+	return pskb_may_pull(skb, 2);
+}
+
 void
 ppp_input(struct ppp_channel *chan, struct sk_buff *skb)
 {
@@ -1979,7 +2019,7 @@
 	}
 
 	read_lock_bh(&pch->upl);
-	if (!pskb_may_pull(skb, 2)) {
+	if (!ppp_decompress_proto(skb)) {
 		kfree_skb(skb);
 		if (pch->ppp) {
 			++pch->ppp->dev->stats.rx_length_errors;
@@ -2076,6 +2116,9 @@
 	if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR)
 		goto err;
 
+	/* At this point the "Protocol" field MUST be decompressed, either in
+	 * ppp_input(), ppp_decompress_frame() or in ppp_receive_mp_frame().
+	 */
 	proto = PPP_PROTO(skb);
 	switch (proto) {
 	case PPP_VJC_COMP:
@@ -2247,6 +2290,9 @@
 		skb_put(skb, len);
 		skb_pull(skb, 2);	/* pull off the A/C bytes */
 
+		/* Don't call __ppp_decompress_proto() here, but instead rely on
+		 * corresponding algo (mppe/bsd/deflate) to decompress it.
+		 */
 	} else {
 		/* Uncompressed frame - pass to decompressor so it
 		   can update its dictionary if necessary. */
@@ -2292,9 +2338,11 @@
 
 	/*
 	 * Do protocol ID decompression on the first fragment of each packet.
+	 * We have to do that here, because ppp_receive_nonmp_frame() expects
+	 * decompressed protocol field.
 	 */
-	if ((PPP_MP_CB(skb)->BEbits & B) && (skb->data[0] & 1))
-		*(u8 *)skb_push(skb, 1) = 0;
+	if (PPP_MP_CB(skb)->BEbits & B)
+		__ppp_decompress_proto(skb);
 
 	/*
 	 * Expand sequence number to 32 bits, making it as close
diff --git a/drivers/net/ppp/ppp_synctty.c b/drivers/net/ppp/ppp_synctty.c
index 047f6c6..d02ba24 100644
--- a/drivers/net/ppp/ppp_synctty.c
+++ b/drivers/net/ppp/ppp_synctty.c
@@ -709,11 +709,10 @@
 		p = skb_pull(skb, 2);
 	}
 
-	/* decompress protocol field if compressed */
-	if (p[0] & 1) {
-		/* protocol is compressed */
-		*(u8 *)skb_push(skb, 1) = 0;
-	} else if (skb->len < 2)
+	/* PPP packet length should be >= 2 bytes when protocol field is not
+	 * compressed.
+	 */
+	if (!(p[0] & 0x01) && skb->len < 2)
 		goto err;
 
 	/* queue the frame to be processed */
diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c
index 9ad3ff4..b626001 100644
--- a/drivers/net/ppp/pptp.c
+++ b/drivers/net/ppp/pptp.c
@@ -325,11 +325,6 @@
 			skb_pull(skb, 2);
 		}
 
-		if ((*skb->data) & 1) {
-			/* protocol is compressed */
-			*(u8 *)skb_push(skb, 1) = 0;
-		}
-
 		skb->ip_summed = CHECKSUM_NONE;
 		skb_set_network_header(skb, skb->head-skb->data);
 		ppp_input(&po->chan, skb);
diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig
index 166920a..8c456a6 100644
--- a/drivers/net/wireless/Kconfig
+++ b/drivers/net/wireless/Kconfig
@@ -114,4 +114,11 @@
 
 	  If you choose to build a module, it'll be called rndis_wlan.
 
+config VIRT_WIFI
+	tristate "Wifi wrapper for ethernet drivers"
+	depends on CFG80211
+	---help---
+	  This option adds support for ethernet connections to appear as if they
+	  are wifi connections through a special rtnetlink device.
+
 endif # WLAN
diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile
index 7fc9630..6cfe745 100644
--- a/drivers/net/wireless/Makefile
+++ b/drivers/net/wireless/Makefile
@@ -27,3 +27,5 @@
 obj-$(CONFIG_USB_NET_RNDIS_WLAN)	+= rndis_wlan.o
 
 obj-$(CONFIG_MAC80211_HWSIM)	+= mac80211_hwsim.o
+
+obj-$(CONFIG_VIRT_WIFI)	+= virt_wifi.o
diff --git a/drivers/net/wireless/virt_wifi.c b/drivers/net/wireless/virt_wifi.c
new file mode 100644
index 0000000..6a7b53f
--- /dev/null
+++ b/drivers/net/wireless/virt_wifi.c
@@ -0,0 +1,675 @@
+// SPDX-License-Identifier: GPL-2.0
+/* drivers/net/wireless/virt_wifi.c
+ *
+ * A fake implementation of cfg80211_ops that can be tacked on to an ethernet
+ * net_device to make it appear as a wireless connection.
+ *
+ * Copyright (C) 2018 Google, Inc.
+ *
+ * Author: schuffelen@google.com
+ */
+
+#include <net/cfg80211.h>
+#include <net/rtnetlink.h>
+#include <linux/etherdevice.h>
+#include <linux/module.h>
+
+#include <net/cfg80211.h>
+#include <net/rtnetlink.h>
+#include <linux/etherdevice.h>
+#include <linux/module.h>
+#include <net/virt_wifi.h>
+
+static struct wiphy *common_wiphy;
+
+struct virt_wifi_wiphy_priv {
+	struct delayed_work scan_result;
+	struct cfg80211_scan_request *scan_request;
+	bool being_deleted;
+	struct virt_wifi_network_simulation *network_simulation;
+};
+
+static struct ieee80211_channel channel_2ghz = {
+	.band = NL80211_BAND_2GHZ,
+	.center_freq = 2432,
+	.hw_value = 2432,
+	.max_power = 20,
+};
+
+static struct ieee80211_rate bitrates_2ghz[] = {
+	{ .bitrate = 10 },
+	{ .bitrate = 20 },
+	{ .bitrate = 55 },
+	{ .bitrate = 110 },
+	{ .bitrate = 60 },
+	{ .bitrate = 120 },
+	{ .bitrate = 240 },
+};
+
+static struct ieee80211_supported_band band_2ghz = {
+	.channels = &channel_2ghz,
+	.bitrates = bitrates_2ghz,
+	.band = NL80211_BAND_2GHZ,
+	.n_channels = 1,
+	.n_bitrates = ARRAY_SIZE(bitrates_2ghz),
+	.ht_cap = {
+		.ht_supported = true,
+		.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
+		       IEEE80211_HT_CAP_GRN_FLD |
+		       IEEE80211_HT_CAP_SGI_20 |
+		       IEEE80211_HT_CAP_SGI_40 |
+		       IEEE80211_HT_CAP_DSSSCCK40,
+		.ampdu_factor = 0x3,
+		.ampdu_density = 0x6,
+		.mcs = {
+			.rx_mask = {0xff, 0xff},
+			.tx_params = IEEE80211_HT_MCS_TX_DEFINED,
+		},
+	},
+};
+
+static struct ieee80211_channel channel_5ghz = {
+	.band = NL80211_BAND_5GHZ,
+	.center_freq = 5240,
+	.hw_value = 5240,
+	.max_power = 20,
+};
+
+static struct ieee80211_rate bitrates_5ghz[] = {
+	{ .bitrate = 60 },
+	{ .bitrate = 120 },
+	{ .bitrate = 240 },
+};
+
+#define RX_MCS_MAP (IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 6 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 8 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 10 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 12 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 14)
+
+#define TX_MCS_MAP (IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 6 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 8 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 10 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 12 | \
+		    IEEE80211_VHT_MCS_SUPPORT_0_9 << 14)
+
+static struct ieee80211_supported_band band_5ghz = {
+	.channels = &channel_5ghz,
+	.bitrates = bitrates_5ghz,
+	.band = NL80211_BAND_5GHZ,
+	.n_channels = 1,
+	.n_bitrates = ARRAY_SIZE(bitrates_5ghz),
+	.ht_cap = {
+		.ht_supported = true,
+		.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
+		       IEEE80211_HT_CAP_GRN_FLD |
+		       IEEE80211_HT_CAP_SGI_20 |
+		       IEEE80211_HT_CAP_SGI_40 |
+		       IEEE80211_HT_CAP_DSSSCCK40,
+		.ampdu_factor = 0x3,
+		.ampdu_density = 0x6,
+		.mcs = {
+			.rx_mask = {0xff, 0xff},
+			.tx_params = IEEE80211_HT_MCS_TX_DEFINED,
+		},
+	},
+	.vht_cap = {
+		.vht_supported = true,
+		.cap = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
+		       IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ |
+		       IEEE80211_VHT_CAP_RXLDPC |
+		       IEEE80211_VHT_CAP_SHORT_GI_80 |
+		       IEEE80211_VHT_CAP_SHORT_GI_160 |
+		       IEEE80211_VHT_CAP_TXSTBC |
+		       IEEE80211_VHT_CAP_RXSTBC_1 |
+		       IEEE80211_VHT_CAP_RXSTBC_2 |
+		       IEEE80211_VHT_CAP_RXSTBC_3 |
+		       IEEE80211_VHT_CAP_RXSTBC_4 |
+		       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
+		.vht_mcs = {
+			.rx_mcs_map = cpu_to_le16(RX_MCS_MAP),
+			.tx_mcs_map = cpu_to_le16(TX_MCS_MAP),
+		}
+	},
+};
+
+/* Assigned at module init. Guaranteed locally-administered and unicast. */
+static u8 fake_router_bssid[ETH_ALEN] __ro_after_init = {};
+
+/* Called with the rtnl lock held. */
+static int virt_wifi_scan(struct wiphy *wiphy,
+			  struct cfg80211_scan_request *request)
+{
+	struct virt_wifi_wiphy_priv *priv = wiphy_priv(wiphy);
+
+	wiphy_debug(wiphy, "scan\n");
+
+	if (priv->scan_request || priv->being_deleted)
+		return -EBUSY;
+
+	priv->scan_request = request;
+	schedule_delayed_work(&priv->scan_result, HZ * 2);
+	if (priv->network_simulation &&
+	    priv->network_simulation->notify_scan_trigger)
+		priv->network_simulation->notify_scan_trigger(wiphy, request);
+
+	return 0;
+}
+
+/* Acquires and releases the rdev BSS lock. */
+static void virt_wifi_scan_result(struct work_struct *work)
+{
+	struct {
+		u8 tag;
+		u8 len;
+		u8 ssid[8];
+	} __packed ssid = {
+		.tag = WLAN_EID_SSID, .len = 8, .ssid = "VirtWifi",
+	};
+	struct cfg80211_bss *informed_bss;
+	struct virt_wifi_wiphy_priv *priv =
+		container_of(work, struct virt_wifi_wiphy_priv,
+			     scan_result.work);
+	struct wiphy *wiphy = priv_to_wiphy(priv);
+	struct cfg80211_scan_info scan_info = { .aborted = false };
+
+	informed_bss = cfg80211_inform_bss(wiphy, &channel_5ghz,
+					   CFG80211_BSS_FTYPE_PRESP,
+					   fake_router_bssid,
+					   ktime_get_boot_ns(),
+					   WLAN_CAPABILITY_ESS, 0,
+					   (void *)&ssid, sizeof(ssid),
+					   DBM_TO_MBM(-50), GFP_KERNEL);
+	cfg80211_put_bss(wiphy, informed_bss);
+
+	if(priv->network_simulation &&
+	   priv->network_simulation->generate_virt_scan_result) {
+		if(priv->network_simulation->generate_virt_scan_result(wiphy))
+			wiphy_err(wiphy, "Fail to generater the simulated scan result.\n");
+	}
+
+	/* Schedules work which acquires and releases the rtnl lock. */
+	cfg80211_scan_done(priv->scan_request, &scan_info);
+	priv->scan_request = NULL;
+}
+
+/* May acquire and release the rdev BSS lock. */
+static void virt_wifi_cancel_scan(struct wiphy *wiphy)
+{
+	struct virt_wifi_wiphy_priv *priv = wiphy_priv(wiphy);
+
+	cancel_delayed_work_sync(&priv->scan_result);
+	/* Clean up dangling callbacks if necessary. */
+	if (priv->scan_request) {
+		struct cfg80211_scan_info scan_info = { .aborted = true };
+		/* Schedules work which acquires and releases the rtnl lock. */
+		cfg80211_scan_done(priv->scan_request, &scan_info);
+		priv->scan_request = NULL;
+	}
+}
+
+struct virt_wifi_netdev_priv {
+	struct delayed_work connect;
+	struct net_device *lowerdev;
+	struct net_device *upperdev;
+	u32 tx_packets;
+	u32 tx_failed;
+	u8 connect_requested_bss[ETH_ALEN];
+	bool is_up;
+	bool is_connected;
+	bool being_deleted;
+};
+
+/* Called with the rtnl lock held. */
+static int virt_wifi_connect(struct wiphy *wiphy, struct net_device *netdev,
+			     struct cfg80211_connect_params *sme)
+{
+	struct virt_wifi_netdev_priv *priv = netdev_priv(netdev);
+	bool could_schedule;
+
+	if (priv->being_deleted || !priv->is_up)
+		return -EBUSY;
+
+	could_schedule = schedule_delayed_work(&priv->connect, HZ * 2);
+	if (!could_schedule)
+		return -EBUSY;
+
+	if (sme->bssid)
+		ether_addr_copy(priv->connect_requested_bss, sme->bssid);
+	else
+		eth_zero_addr(priv->connect_requested_bss);
+
+	wiphy_debug(wiphy, "connect\n");
+
+	return 0;
+}
+
+/* Acquires and releases the rdev event lock. */
+static void virt_wifi_connect_complete(struct work_struct *work)
+{
+	struct virt_wifi_netdev_priv *priv =
+		container_of(work, struct virt_wifi_netdev_priv, connect.work);
+	u8 *requested_bss = priv->connect_requested_bss;
+	bool has_addr = !is_zero_ether_addr(requested_bss);
+	bool right_addr = ether_addr_equal(requested_bss, fake_router_bssid);
+	u16 status = WLAN_STATUS_SUCCESS;
+
+	if (!priv->is_up || (has_addr && !right_addr))
+		status = WLAN_STATUS_UNSPECIFIED_FAILURE;
+	else
+		priv->is_connected = true;
+
+	/* Schedules an event that acquires the rtnl lock. */
+	cfg80211_connect_result(priv->upperdev, requested_bss, NULL, 0, NULL, 0,
+				status, GFP_KERNEL);
+	netif_carrier_on(priv->upperdev);
+}
+
+/* May acquire and release the rdev event lock. */
+static void virt_wifi_cancel_connect(struct net_device *netdev)
+{
+	struct virt_wifi_netdev_priv *priv = netdev_priv(netdev);
+
+	/* If there is work pending, clean up dangling callbacks. */
+	if (cancel_delayed_work_sync(&priv->connect)) {
+		/* Schedules an event that acquires the rtnl lock. */
+		cfg80211_connect_result(priv->upperdev,
+					priv->connect_requested_bss, NULL, 0,
+					NULL, 0,
+					WLAN_STATUS_UNSPECIFIED_FAILURE,
+					GFP_KERNEL);
+	}
+}
+
+/* Called with the rtnl lock held. Acquires the rdev event lock. */
+static int virt_wifi_disconnect(struct wiphy *wiphy, struct net_device *netdev,
+				u16 reason_code)
+{
+	struct virt_wifi_netdev_priv *priv = netdev_priv(netdev);
+
+	if (priv->being_deleted)
+		return -EBUSY;
+
+	wiphy_debug(wiphy, "disconnect\n");
+	virt_wifi_cancel_connect(netdev);
+
+	cfg80211_disconnected(netdev, reason_code, NULL, 0, true, GFP_KERNEL);
+	priv->is_connected = false;
+	netif_carrier_off(netdev);
+
+	return 0;
+}
+
+/* Called with the rtnl lock held. */
+static int virt_wifi_get_station(struct wiphy *wiphy, struct net_device *dev,
+				 const u8 *mac, struct station_info *sinfo)
+{
+	struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
+
+	wiphy_debug(wiphy, "get_station\n");
+
+	if (!priv->is_connected || !ether_addr_equal(mac, fake_router_bssid))
+		return -ENOENT;
+
+	sinfo->filled = BIT_ULL(NL80211_STA_INFO_TX_PACKETS) |
+		BIT_ULL(NL80211_STA_INFO_TX_FAILED) |
+		BIT_ULL(NL80211_STA_INFO_SIGNAL) |
+		BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
+	sinfo->tx_packets = priv->tx_packets;
+	sinfo->tx_failed = priv->tx_failed;
+	/* For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_ */
+	sinfo->signal = -50;
+	sinfo->txrate = (struct rate_info) {
+		.legacy = 10, /* units are 100kbit/s */
+	};
+	return 0;
+}
+
+/* Called with the rtnl lock held. */
+static int virt_wifi_dump_station(struct wiphy *wiphy, struct net_device *dev,
+				  int idx, u8 *mac, struct station_info *sinfo)
+{
+	struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
+
+	wiphy_debug(wiphy, "dump_station\n");
+
+	if (idx != 0 || !priv->is_connected)
+		return -ENOENT;
+
+	ether_addr_copy(mac, fake_router_bssid);
+	return virt_wifi_get_station(wiphy, dev, fake_router_bssid, sinfo);
+}
+
+static const struct cfg80211_ops virt_wifi_cfg80211_ops = {
+	.scan = virt_wifi_scan,
+
+	.connect = virt_wifi_connect,
+	.disconnect = virt_wifi_disconnect,
+
+	.get_station = virt_wifi_get_station,
+	.dump_station = virt_wifi_dump_station,
+};
+
+/* Acquires and releases the rtnl lock. */
+static struct wiphy *virt_wifi_make_wiphy(void)
+{
+	struct wiphy *wiphy;
+	struct virt_wifi_wiphy_priv *priv;
+	int err;
+
+	wiphy = wiphy_new(&virt_wifi_cfg80211_ops, sizeof(*priv));
+
+	if (!wiphy)
+		return NULL;
+
+	wiphy->max_scan_ssids = 4;
+	wiphy->max_scan_ie_len = 1000;
+	wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
+
+	wiphy->bands[NL80211_BAND_2GHZ] = &band_2ghz;
+	wiphy->bands[NL80211_BAND_5GHZ] = &band_5ghz;
+	wiphy->bands[NL80211_BAND_60GHZ] = NULL;
+
+	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
+
+	priv = wiphy_priv(wiphy);
+	priv->being_deleted = false;
+	priv->scan_request = NULL;
+	priv->network_simulation = NULL;
+
+	INIT_DELAYED_WORK(&priv->scan_result, virt_wifi_scan_result);
+
+	err = wiphy_register(wiphy);
+	if (err < 0) {
+		wiphy_free(wiphy);
+		return NULL;
+	}
+
+	return wiphy;
+}
+
+/* Acquires and releases the rtnl lock. */
+static void virt_wifi_destroy_wiphy(struct wiphy *wiphy)
+{
+	struct virt_wifi_wiphy_priv *priv;
+	WARN(!wiphy, "%s called with null wiphy", __func__);
+	if (!wiphy)
+		return;
+
+	priv = wiphy_priv(wiphy);
+	priv->being_deleted = true;
+	virt_wifi_cancel_scan(wiphy);
+
+	if (wiphy->registered)
+		wiphy_unregister(wiphy);
+	wiphy_free(wiphy);
+}
+
+/* Enters and exits a RCU-bh critical section. */
+static netdev_tx_t virt_wifi_start_xmit(struct sk_buff *skb,
+					struct net_device *dev)
+{
+	struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
+
+	priv->tx_packets++;
+	if (!priv->is_connected) {
+		priv->tx_failed++;
+		return NET_XMIT_DROP;
+	}
+
+	skb->dev = priv->lowerdev;
+	return dev_queue_xmit(skb);
+}
+
+/* Called with rtnl lock held. */
+static int virt_wifi_net_device_open(struct net_device *dev)
+{
+	struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
+	struct virt_wifi_wiphy_priv *w_priv;
+	priv->is_up = true;
+	w_priv = wiphy_priv(dev->ieee80211_ptr->wiphy);
+	if(w_priv->network_simulation &&
+	   w_priv->network_simulation->notify_device_open)
+		w_priv->network_simulation->notify_device_open(dev);
+
+	return 0;
+}
+
+/* Called with rtnl lock held. */
+static int virt_wifi_net_device_stop(struct net_device *dev)
+{
+	struct virt_wifi_netdev_priv *n_priv = netdev_priv(dev);
+	struct virt_wifi_wiphy_priv *w_priv;
+
+	n_priv->is_up = false;
+
+	if (!dev->ieee80211_ptr)
+		return 0;
+	w_priv = wiphy_priv(dev->ieee80211_ptr->wiphy);
+
+	virt_wifi_cancel_scan(dev->ieee80211_ptr->wiphy);
+	virt_wifi_cancel_connect(dev);
+	netif_carrier_off(dev);
+
+	if (w_priv->network_simulation &&
+	    w_priv->network_simulation->notify_device_stop)
+		w_priv->network_simulation->notify_device_stop(dev);
+
+	return 0;
+}
+
+static const struct net_device_ops virt_wifi_ops = {
+	.ndo_start_xmit = virt_wifi_start_xmit,
+	.ndo_open = virt_wifi_net_device_open,
+	.ndo_stop = virt_wifi_net_device_stop,
+};
+
+/* Invoked as part of rtnl lock release. */
+static void virt_wifi_net_device_destructor(struct net_device *dev)
+{
+	/* Delayed past dellink to allow nl80211 to react to the device being
+	 * deleted.
+	 */
+	kfree(dev->ieee80211_ptr);
+	dev->ieee80211_ptr = NULL;
+	free_netdev(dev);
+}
+
+/* No lock interaction. */
+static void virt_wifi_setup(struct net_device *dev)
+{
+	ether_setup(dev);
+	dev->netdev_ops = &virt_wifi_ops;
+	dev->priv_destructor = virt_wifi_net_device_destructor;
+}
+
+/* Called in a RCU read critical section from netif_receive_skb */
+static rx_handler_result_t virt_wifi_rx_handler(struct sk_buff **pskb)
+{
+	struct sk_buff *skb = *pskb;
+	struct virt_wifi_netdev_priv *priv =
+		rcu_dereference(skb->dev->rx_handler_data);
+
+	if (!priv->is_connected)
+		return RX_HANDLER_PASS;
+
+	/* GFP_ATOMIC because this is a packet interrupt handler. */
+	skb = skb_share_check(skb, GFP_ATOMIC);
+	if (!skb) {
+		dev_err(&priv->upperdev->dev, "can't skb_share_check\n");
+		return RX_HANDLER_CONSUMED;
+	}
+
+	*pskb = skb;
+	skb->dev = priv->upperdev;
+	skb->pkt_type = PACKET_HOST;
+	return RX_HANDLER_ANOTHER;
+}
+
+/* Called with rtnl lock held. */
+static int virt_wifi_newlink(struct net *src_net, struct net_device *dev,
+			     struct nlattr *tb[], struct nlattr *data[],
+			     struct netlink_ext_ack *extack)
+{
+	struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
+	int err;
+
+	if (!tb[IFLA_LINK])
+		return -EINVAL;
+
+	netif_carrier_off(dev);
+
+	priv->upperdev = dev;
+	priv->lowerdev = __dev_get_by_index(src_net,
+					    nla_get_u32(tb[IFLA_LINK]));
+
+	if (!priv->lowerdev)
+		return -ENODEV;
+	if (!tb[IFLA_MTU])
+		dev->mtu = priv->lowerdev->mtu;
+	else if (dev->mtu > priv->lowerdev->mtu)
+		return -EINVAL;
+
+	err = netdev_rx_handler_register(priv->lowerdev, virt_wifi_rx_handler,
+					 priv);
+	if (err) {
+		dev_err(&priv->lowerdev->dev,
+			"can't netdev_rx_handler_register: %d\n", err);
+		return err;
+	}
+
+	eth_hw_addr_inherit(dev, priv->lowerdev);
+	netif_stacked_transfer_operstate(priv->lowerdev, dev);
+
+	SET_NETDEV_DEV(dev, &priv->lowerdev->dev);
+	dev->ieee80211_ptr = kzalloc(sizeof(*dev->ieee80211_ptr), GFP_KERNEL);
+
+	if (!dev->ieee80211_ptr) {
+		err = -ENOMEM;
+		goto remove_handler;
+	}
+
+	dev->ieee80211_ptr->iftype = NL80211_IFTYPE_STATION;
+	dev->ieee80211_ptr->wiphy = common_wiphy;
+
+	err = register_netdevice(dev);
+	if (err) {
+		dev_err(&priv->lowerdev->dev, "can't register_netdevice: %d\n",
+			err);
+		goto free_wireless_dev;
+	}
+
+	err = netdev_upper_dev_link(priv->lowerdev, dev, extack);
+	if (err) {
+		dev_err(&priv->lowerdev->dev, "can't netdev_upper_dev_link: %d\n",
+			err);
+		goto unregister_netdev;
+	}
+
+	priv->being_deleted = false;
+	priv->is_connected = false;
+	priv->is_up = false;
+	INIT_DELAYED_WORK(&priv->connect, virt_wifi_connect_complete);
+
+	return 0;
+unregister_netdev:
+	unregister_netdevice(dev);
+free_wireless_dev:
+	kfree(dev->ieee80211_ptr);
+	dev->ieee80211_ptr = NULL;
+remove_handler:
+	netdev_rx_handler_unregister(priv->lowerdev);
+
+	return err;
+}
+
+/* Called with rtnl lock held. */
+static void virt_wifi_dellink(struct net_device *dev,
+			      struct list_head *head)
+{
+	struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
+
+	if (dev->ieee80211_ptr)
+		virt_wifi_cancel_scan(dev->ieee80211_ptr->wiphy);
+
+	priv->being_deleted = true;
+	virt_wifi_cancel_connect(dev);
+	netif_carrier_off(dev);
+
+	netdev_rx_handler_unregister(priv->lowerdev);
+	netdev_upper_dev_unlink(priv->lowerdev, dev);
+
+	unregister_netdevice_queue(dev, head);
+
+	/* Deleting the wiphy is handled in the module destructor. */
+}
+
+static struct rtnl_link_ops virt_wifi_link_ops = {
+	.kind		= "virt_wifi",
+	.setup		= virt_wifi_setup,
+	.newlink	= virt_wifi_newlink,
+	.dellink	= virt_wifi_dellink,
+	.priv_size	= sizeof(struct virt_wifi_netdev_priv),
+};
+
+/* Acquires and releases the rtnl lock. */
+static int __init virt_wifi_init_module(void)
+{
+	int err;
+
+	/* Guaranteed to be locallly-administered and not multicast. */
+	eth_random_addr(fake_router_bssid);
+
+	common_wiphy = virt_wifi_make_wiphy();
+	if (!common_wiphy)
+		return -ENOMEM;
+
+	err = rtnl_link_register(&virt_wifi_link_ops);
+	if (err)
+		virt_wifi_destroy_wiphy(common_wiphy);
+
+	return err;
+}
+
+/* Acquires and releases the rtnl lock. */
+static void __exit virt_wifi_cleanup_module(void)
+{
+	/* Will delete any devices that depend on the wiphy. */
+	rtnl_link_unregister(&virt_wifi_link_ops);
+	virt_wifi_destroy_wiphy(common_wiphy);
+}
+
+int virt_wifi_register_network_simulation
+	(struct virt_wifi_network_simulation *ops)
+{
+	struct virt_wifi_wiphy_priv *priv = wiphy_priv(common_wiphy);
+	if (priv->network_simulation)
+		return -EEXIST;
+	priv->network_simulation = ops;
+	return 0;
+}
+EXPORT_SYMBOL(virt_wifi_register_network_simulation);
+
+int virt_wifi_unregister_network_simulation(void)
+{
+	struct virt_wifi_wiphy_priv *priv = wiphy_priv(common_wiphy);
+	if(!priv->network_simulation)
+		return -ENODATA;
+	priv->network_simulation = NULL;
+	return 0;
+}
+EXPORT_SYMBOL(virt_wifi_unregister_network_simulation);
+
+module_init(virt_wifi_init_module);
+module_exit(virt_wifi_cleanup_module);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Cody Schuffelen <schuffelen@google.com>");
+MODULE_DESCRIPTION("Driver for a wireless wrapper of ethernet devices");
+MODULE_ALIAS_RTNL_LINK("virt_wifi");
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 800ad25..2aa4261 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1072,42 +1072,66 @@
 	return 0;
 }
 
+/*
+ * Convert configs to something easy to use in C code
+ */
+#if defined(CONFIG_CMDLINE_FORCE)
+static const int overwrite_incoming_cmdline = 1;
+static const int read_dt_cmdline;
+static const int concat_cmdline;
+#elif defined(CONFIG_CMDLINE_EXTEND)
+static const int overwrite_incoming_cmdline;
+static const int read_dt_cmdline = 1;
+static const int concat_cmdline = 1;
+#else /* CMDLINE_FROM_BOOTLOADER */
+static const int overwrite_incoming_cmdline;
+static const int read_dt_cmdline = 1;
+static const int concat_cmdline;
+#endif
+
+#ifdef CONFIG_CMDLINE
+static const char *config_cmdline = CONFIG_CMDLINE;
+#else
+static const char *config_cmdline = "";
+#endif
+
 int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,
 				     int depth, void *data)
 {
-	int l;
-	const char *p;
+	int l = 0;
+	const char *p = NULL;
+	char *cmdline = data;
 
 	pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname);
 
-	if (depth != 1 || !data ||
+	if (depth != 1 || !cmdline ||
 	    (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0))
 		return 0;
 
 	early_init_dt_check_for_initrd(node);
 
-	/* Retrieve command line */
-	p = of_get_flat_dt_prop(node, "bootargs", &l);
-	if (p != NULL && l > 0)
-		strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE));
+	/* Put CONFIG_CMDLINE in if forced or if data had nothing in it to start */
+	if (overwrite_incoming_cmdline || !cmdline[0])
+		strlcpy(cmdline, config_cmdline, COMMAND_LINE_SIZE);
 
-	/*
-	 * CONFIG_CMDLINE is meant to be a default in case nothing else
-	 * managed to set the command line, unless CONFIG_CMDLINE_FORCE
-	 * is set in which case we override whatever was found earlier.
-	 */
-#ifdef CONFIG_CMDLINE
-#if defined(CONFIG_CMDLINE_EXTEND)
-	strlcat(data, " ", COMMAND_LINE_SIZE);
-	strlcat(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
-#elif defined(CONFIG_CMDLINE_FORCE)
-	strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
-#else
-	/* No arguments from boot loader, use kernel's  cmdl*/
-	if (!((char *)data)[0])
-		strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
-#endif
-#endif /* CONFIG_CMDLINE */
+	/* Retrieve command line unless forcing */
+	if (read_dt_cmdline)
+		p = of_get_flat_dt_prop(node, "bootargs", &l);
+
+	if (p != NULL && l > 0) {
+		if (concat_cmdline) {
+			int cmdline_len;
+			int copy_len;
+			strlcat(cmdline, " ", COMMAND_LINE_SIZE);
+			cmdline_len = strlen(cmdline);
+			copy_len = COMMAND_LINE_SIZE - cmdline_len - 1;
+			copy_len = min((int)l, copy_len);
+			strncpy(cmdline + cmdline_len, p, copy_len);
+			cmdline[cmdline_len + copy_len] = '\0';
+		} else {
+			strlcpy(cmdline, p, min((int)l, COMMAND_LINE_SIZE));
+		}
+	}
 
 	pr_debug("Command line is: %s\n", (char*)data);
 
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index 04ad312..6e9e275 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -486,6 +486,7 @@
 	pr_debug("%s()\n", __func__);
 	pr_debug(" starting at: %pOF\n", root);
 
+	device_links_supplier_sync_state_pause();
 	for_each_child_of_node(root, child) {
 		rc = of_platform_bus_create(child, matches, lookup, parent, true);
 		if (rc) {
@@ -493,6 +494,8 @@
 			break;
 		}
 	}
+	device_links_supplier_sync_state_resume();
+
 	of_node_set_flag(root, OF_POPULATED_BUS);
 
 	of_node_put(root);
@@ -524,6 +527,7 @@
 	if (!of_have_populated_dt())
 		return -ENODEV;
 
+	device_links_supplier_sync_state_pause();
 	/*
 	 * Handle certain compatibles explicitly, since we don't want to create
 	 * platform_devices for every node in /reserved-memory with a
@@ -544,6 +548,14 @@
 	return 0;
 }
 arch_initcall_sync(of_platform_default_populate_init);
+
+static int __init of_platform_sync_state_init(void)
+{
+	if (of_have_populated_dt())
+		device_links_supplier_sync_state_resume();
+	return 0;
+}
+late_initcall_sync(of_platform_sync_state_init);
 #endif
 
 int of_platform_device_destroy(struct device *dev, void *data)
diff --git a/drivers/of/property.c b/drivers/of/property.c
index 43720c2d..099d37d 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -25,6 +25,7 @@
 #include <linux/of_device.h>
 #include <linux/of_graph.h>
 #include <linux/string.h>
+#include <linux/moduleparam.h>
 
 #include "of_private.h"
 
@@ -985,6 +986,320 @@
 	return of_device_get_match_data(dev);
 }
 
+static bool of_is_ancestor_of(struct device_node *test_ancestor,
+			      struct device_node *child)
+{
+	of_node_get(child);
+	while (child) {
+		if (child == test_ancestor) {
+			of_node_put(child);
+			return true;
+		}
+		child = of_get_next_parent(child);
+	}
+	return false;
+}
+
+/**
+ * of_link_to_phandle - Add device link to supplier from supplier phandle
+ * @dev: consumer device
+ * @sup_np: phandle to supplier device tree node
+ *
+ * Given a phandle to a supplier device tree node (@sup_np), this function
+ * finds the device that owns the supplier device tree node and creates a
+ * device link from @dev consumer device to the supplier device. This function
+ * doesn't create device links for invalid scenarios such as trying to create a
+ * link with a parent device as the consumer of its child device. In such
+ * cases, it returns an error.
+ *
+ * Returns:
+ * - 0 if link successfully created to supplier
+ * - -EAGAIN if linking to the supplier should be reattempted
+ * - -EINVAL if the supplier link is invalid and should not be created
+ * - -ENODEV if there is no device that corresponds to the supplier phandle
+ */
+static int of_link_to_phandle(struct device *dev, struct device_node *sup_np,
+			      u32 dl_flags)
+{
+	struct device *sup_dev;
+	int ret = 0;
+	struct device_node *tmp_np = sup_np;
+	int is_populated;
+
+	of_node_get(sup_np);
+	/*
+	 * Find the device node that contains the supplier phandle.  It may be
+	 * @sup_np or it may be an ancestor of @sup_np.
+	 */
+	while (sup_np && !of_find_property(sup_np, "compatible", NULL))
+		sup_np = of_get_next_parent(sup_np);
+	if (!sup_np) {
+		dev_dbg(dev, "Not linking to %pOFP - No device\n", tmp_np);
+		return -ENODEV;
+	}
+
+	/*
+	 * Don't allow linking a device node as a consumer of one of its
+	 * descendant nodes. By definition, a child node can't be a functional
+	 * dependency for the parent node.
+	 */
+	if (of_is_ancestor_of(dev->of_node, sup_np)) {
+		dev_dbg(dev, "Not linking to %pOFP - is descendant\n", sup_np);
+		of_node_put(sup_np);
+		return -EINVAL;
+	}
+	sup_dev = get_dev_from_fwnode(&sup_np->fwnode);
+	is_populated = of_node_check_flag(sup_np, OF_POPULATED);
+	of_node_put(sup_np);
+	if (!sup_dev && is_populated) {
+		/* Early device without struct device. */
+		dev_dbg(dev, "Not linking to %pOFP - No struct device\n",
+			sup_np);
+		return -ENODEV;
+	} else if (!sup_dev) {
+		return -EAGAIN;
+	}
+	if (!device_link_add(dev, sup_dev, dl_flags))
+		ret = -EAGAIN;
+	put_device(sup_dev);
+	return ret;
+}
+
+/**
+ * parse_prop_cells - Property parsing function for suppliers
+ *
+ * @np:		Pointer to device tree node containing a list
+ * @prop_name:	Name of property to be parsed. Expected to hold phandle values
+ * @index:	For properties holding a list of phandles, this is the index
+ *		into the list.
+ * @list_name:	Property name that is known to contain list of phandle(s) to
+ *		supplier(s)
+ * @cells_name:	property name that specifies phandles' arguments count
+ *
+ * This is a helper function to parse properties that have a known fixed name
+ * and are a list of phandles and phandle arguments.
+ *
+ * Returns:
+ * - phandle node pointer with refcount incremented. Caller must of_node_put()
+ *   on it when done.
+ * - NULL if no phandle found at index
+ */
+static struct device_node *parse_prop_cells(struct device_node *np,
+					    const char *prop_name, int index,
+					    const char *list_name,
+					    const char *cells_name)
+{
+	struct of_phandle_args sup_args;
+
+	if (strcmp(prop_name, list_name))
+		return NULL;
+
+	if (of_parse_phandle_with_args(np, list_name, cells_name, index,
+				       &sup_args))
+		return NULL;
+
+	return sup_args.np;
+}
+
+#define DEFINE_SIMPLE_PROP(fname, name, cells)				  \
+static struct device_node *parse_##fname(struct device_node *np,	  \
+					const char *prop_name, int index) \
+{									  \
+	return parse_prop_cells(np, prop_name, index, name, cells);	  \
+}
+
+static int strcmp_suffix(const char *str, const char *suffix)
+{
+	unsigned int len, suffix_len;
+
+	len = strlen(str);
+	suffix_len = strlen(suffix);
+	if (len <= suffix_len)
+		return -1;
+	return strcmp(str + len - suffix_len, suffix);
+}
+
+/**
+ * parse_suffix_prop_cells - Suffix property parsing function for suppliers
+ *
+ * @np:		Pointer to device tree node containing a list
+ * @prop_name:	Name of property to be parsed. Expected to hold phandle values
+ * @index:	For properties holding a list of phandles, this is the index
+ *		into the list.
+ * @suffix:	Property suffix that is known to contain list of phandle(s) to
+ *		supplier(s)
+ * @cells_name:	property name that specifies phandles' arguments count
+ *
+ * This is a helper function to parse properties that have a known fixed suffix
+ * and are a list of phandles and phandle arguments.
+ *
+ * Returns:
+ * - phandle node pointer with refcount incremented. Caller must of_node_put()
+ *   on it when done.
+ * - NULL if no phandle found at index
+ */
+static struct device_node *parse_suffix_prop_cells(struct device_node *np,
+					    const char *prop_name, int index,
+					    const char *suffix,
+					    const char *cells_name)
+{
+	struct of_phandle_args sup_args;
+
+	if (strcmp_suffix(prop_name, suffix))
+		return NULL;
+
+	if (of_parse_phandle_with_args(np, prop_name, cells_name, index,
+				       &sup_args))
+		return NULL;
+
+	return sup_args.np;
+}
+
+#define DEFINE_SUFFIX_PROP(fname, suffix, cells)			     \
+static struct device_node *parse_##fname(struct device_node *np,	     \
+					const char *prop_name, int index)    \
+{									     \
+	return parse_suffix_prop_cells(np, prop_name, index, suffix, cells); \
+}
+
+/**
+ * struct supplier_bindings - Property parsing functions for suppliers
+ *
+ * @parse_prop: function name
+ *	parse_prop() finds the node corresponding to a supplier phandle
+ * @parse_prop.np: Pointer to device node holding supplier phandle property
+ * @parse_prop.prop_name: Name of property holding a phandle value
+ * @parse_prop.index: For properties holding a list of phandles, this is the
+ *		      index into the list
+ *
+ * Returns:
+ * parse_prop() return values are
+ * - phandle node pointer with refcount incremented. Caller must of_node_put()
+ *   on it when done.
+ * - NULL if no phandle found at index
+ */
+struct supplier_bindings {
+	struct device_node *(*parse_prop)(struct device_node *np,
+					  const char *prop_name, int index);
+};
+
+DEFINE_SIMPLE_PROP(clocks, "clocks", "#clock-cells")
+DEFINE_SIMPLE_PROP(interconnects, "interconnects", "#interconnect-cells")
+DEFINE_SIMPLE_PROP(iommus, "iommus", "#iommu-cells")
+DEFINE_SIMPLE_PROP(mboxes, "mboxes", "#mbox-cells")
+DEFINE_SIMPLE_PROP(io_channels, "io-channel", "#io-channel-cells")
+DEFINE_SIMPLE_PROP(interrupt_parent, "interrupt-parent", NULL)
+DEFINE_SIMPLE_PROP(dmas, "dmas", "#dma-cells")
+DEFINE_SUFFIX_PROP(regulators, "-supply", NULL)
+DEFINE_SUFFIX_PROP(gpio, "-gpio", "#gpio-cells")
+DEFINE_SUFFIX_PROP(gpios, "-gpios", "#gpio-cells")
+
+static struct device_node *parse_iommu_maps(struct device_node *np,
+					    const char *prop_name, int index)
+{
+	if (strcmp(prop_name, "iommu-map"))
+		return NULL;
+
+	return of_parse_phandle(np, prop_name, (index * 4) + 1);
+}
+
+static const struct supplier_bindings of_supplier_bindings[] = {
+	{ .parse_prop = parse_clocks, },
+	{ .parse_prop = parse_interconnects, },
+	{ .parse_prop = parse_iommus, },
+	{ .parse_prop = parse_iommu_maps, },
+	{ .parse_prop = parse_mboxes, },
+	{ .parse_prop = parse_io_channels, },
+	{ .parse_prop = parse_interrupt_parent, },
+	{ .parse_prop = parse_dmas, },
+	{ .parse_prop = parse_regulators, },
+	{ .parse_prop = parse_gpio, },
+	{ .parse_prop = parse_gpios, },
+	{}
+};
+
+/**
+ * of_link_property - Create device links to suppliers listed in a property
+ * @dev: Consumer device
+ * @con_np: The consumer device tree node which contains the property
+ * @prop_name: Name of property to be parsed
+ *
+ * This function checks if the property @prop_name that is present in the
+ * @con_np device tree node is one of the known common device tree bindings
+ * that list phandles to suppliers. If @prop_name isn't one, this function
+ * doesn't do anything.
+ *
+ * If @prop_name is one, this function attempts to create device links from the
+ * consumer device @dev to all the devices of the suppliers listed in
+ * @prop_name.
+ *
+ * Any failed attempt to create a device link will NOT result in an immediate
+ * return.  of_link_property() must create links to all the available supplier
+ * devices even when attempts to create a link to one or more suppliers fail.
+ */
+static int of_link_property(struct device *dev, struct device_node *con_np,
+			     const char *prop_name)
+{
+	struct device_node *phandle;
+	const struct supplier_bindings *s = of_supplier_bindings;
+	unsigned int i = 0;
+	bool matched = false;
+	int ret = 0;
+	u32 dl_flags;
+
+	if (dev->of_node == con_np)
+		dl_flags = 0;
+	else
+		dl_flags = DL_FLAG_SYNC_STATE_ONLY;
+
+	/* Do not stop at first failed link, link all available suppliers. */
+	while (!matched && s->parse_prop) {
+		while ((phandle = s->parse_prop(con_np, prop_name, i))) {
+			matched = true;
+			i++;
+			if (of_link_to_phandle(dev, phandle, dl_flags)
+								== -EAGAIN)
+				ret = -EAGAIN;
+			of_node_put(phandle);
+		}
+		s++;
+	}
+	return ret;
+}
+
+static int of_link_to_suppliers(struct device *dev,
+				  struct device_node *con_np)
+{
+	struct device_node *child;
+	struct property *p;
+	int ret = 0;
+
+	for_each_property_of_node(con_np, p)
+		if (of_link_property(dev, con_np, p->name))
+			ret = -ENODEV;
+
+	for_each_child_of_node(con_np, child)
+		if (of_link_to_suppliers(dev, child) && !ret)
+			ret = -EAGAIN;
+
+	return ret;
+}
+
+static bool of_devlink = true;
+core_param(of_devlink, of_devlink, bool, 0);
+
+static int of_fwnode_add_links(const struct fwnode_handle *fwnode,
+			       struct device *dev)
+{
+	if (!of_devlink)
+		return 0;
+
+	if (unlikely(!is_of_node(fwnode)))
+		return 0;
+
+	return of_link_to_suppliers(dev, to_of_node(fwnode));
+}
+
 const struct fwnode_operations of_fwnode_ops = {
 	.get = of_fwnode_get,
 	.put = of_fwnode_put,
@@ -1001,5 +1316,6 @@
 	.graph_get_remote_endpoint = of_fwnode_graph_get_remote_endpoint,
 	.graph_get_port_parent = of_fwnode_graph_get_port_parent,
 	.graph_parse_endpoint = of_fwnode_graph_parse_endpoint,
+	.add_links = of_fwnode_add_links,
 };
 EXPORT_SYMBOL_GPL(of_fwnode_ops);
diff --git a/drivers/opp/of.c b/drivers/opp/of.c
index 20988c4..7830df8 100644
--- a/drivers/opp/of.c
+++ b/drivers/opp/of.c
@@ -778,3 +778,63 @@
 	return of_node_get(opp->np);
 }
 EXPORT_SYMBOL_GPL(dev_pm_opp_get_of_node);
+
+/**
+ * of_dev_pm_opp_get_cpu_power() - Estimates the power of a CPU
+ * @mW:		pointer to the power estimate in milli-watts
+ * @KHz:	pointer to the OPP's frequency, in kilo-hertz
+ * @cpu:	CPU for which power needs to be estimated
+ *
+ * Computes the power estimated by @CPU at the first OPP above @KHz (ceil),
+ * and updates @KHz and @mW accordingly.
+ *
+ * The power is estimated as P = C * V^2 * f, with C the CPU's capacitance
+ * (read from the 'dynamic-power-coefficient' devicetree binding) and V and f
+ * respectively the voltage and frequency of the OPP.
+ *
+ * Return: -ENODEV if the CPU device cannot be found, -EINVAL if the power
+ * calculation failed because of missing parameters, 0 otherwise.
+ */
+int of_dev_pm_opp_get_cpu_power(unsigned long *mW, unsigned long *KHz, int cpu)
+{
+	unsigned long mV, Hz, MHz;
+	struct device *cpu_dev;
+	struct dev_pm_opp *opp;
+	struct device_node *np;
+	u32 cap;
+	u64 tmp;
+	int ret;
+
+	cpu_dev = get_cpu_device(cpu);
+	if (!cpu_dev)
+		return -ENODEV;
+
+	np = of_node_get(cpu_dev->of_node);
+	if (!np)
+		return -EINVAL;
+
+	ret = of_property_read_u32(np, "dynamic-power-coefficient", &cap);
+	of_node_put(np);
+	if (ret)
+		return -EINVAL;
+
+	Hz = *KHz * 1000;
+	opp = dev_pm_opp_find_freq_ceil(cpu_dev, &Hz);
+	if (IS_ERR(opp))
+		return -EINVAL;
+
+	mV = dev_pm_opp_get_voltage(opp) / 1000;
+	dev_pm_opp_put(opp);
+	if (!mV)
+		return -EINVAL;
+
+	MHz = Hz / 1000000;
+	tmp = (u64)cap * mV * mV * MHz;
+	do_div(tmp, 1000000000);
+
+	*mW = (unsigned long)tmp;
+	*KHz = Hz / 1000;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(of_dev_pm_opp_get_cpu_power);
diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
index e853618..e43a7b3 100644
--- a/drivers/power/supply/power_supply_core.c
+++ b/drivers/power/supply/power_supply_core.c
@@ -902,14 +902,14 @@
 	}
 
 	spin_lock_init(&psy->changed_lock);
-	rc = device_init_wakeup(dev, ws);
-	if (rc)
-		goto wakeup_init_failed;
-
 	rc = device_add(dev);
 	if (rc)
 		goto device_add_failed;
 
+	rc = device_init_wakeup(dev, ws);
+	if (rc)
+		goto wakeup_init_failed;
+
 	rc = psy_register_thermal(psy);
 	if (rc)
 		goto register_thermal_failed;
@@ -946,8 +946,8 @@
 	psy_unregister_thermal(psy);
 register_thermal_failed:
 	device_del(dev);
-device_add_failed:
 wakeup_init_failed:
+device_add_failed:
 check_supplies_failed:
 dev_set_name_failed:
 	put_device(dev);
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index 186f779..b9cd734 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -1291,7 +1291,8 @@
 	device_enable_async_suspend(&sdev->sdev_gendev);
 	scsi_autopm_get_target(starget);
 	pm_runtime_set_active(&sdev->sdev_gendev);
-	pm_runtime_forbid(&sdev->sdev_gendev);
+	if (!sdev->rpm_autosuspend)
+		pm_runtime_forbid(&sdev->sdev_gendev);
 	pm_runtime_enable(&sdev->sdev_gendev);
 	scsi_autopm_put_target(starget);
 
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index f8a09e6..c4d3e9f 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -3330,6 +3330,10 @@
 	}
 
 	blk_pm_runtime_init(sdp->request_queue, dev);
+	if (sdp->rpm_autosuspend) {
+		pm_runtime_set_autosuspend_delay(dev,
+			sdp->host->hostt->rpm_autosuspend_delay);
+	}
 	device_add_disk(dev, gd);
 	if (sdkp->capacity)
 		sd_dif_config_host(sdkp);
diff --git a/drivers/scsi/ufs/Kconfig b/drivers/scsi/ufs/Kconfig
index e09fe6a..4860a9f 100644
--- a/drivers/scsi/ufs/Kconfig
+++ b/drivers/scsi/ufs/Kconfig
@@ -109,3 +109,12 @@
 
 	  Select this if you have UFS controller on Hisilicon chipset.
 	  If unsure, say N.
+
+config SCSI_UFS_CRYPTO
+	bool "UFS Crypto Engine Support"
+	depends on SCSI_UFSHCD && BLK_INLINE_ENCRYPTION
+	help
+	  Enable Crypto Engine Support in UFS.
+	  Enabling this makes it possible for the kernel to use the crypto
+	  capabilities of the UFS device (if present) to perform crypto
+	  operations on data being transferred to/from the device.
diff --git a/drivers/scsi/ufs/Makefile b/drivers/scsi/ufs/Makefile
index 2c50f03..234a88b 100644
--- a/drivers/scsi/ufs/Makefile
+++ b/drivers/scsi/ufs/Makefile
@@ -8,3 +8,4 @@
 obj-$(CONFIG_SCSI_UFSHCD_PCI) += ufshcd-pci.o
 obj-$(CONFIG_SCSI_UFSHCD_PLATFORM) += ufshcd-pltfrm.o
 obj-$(CONFIG_SCSI_UFS_HISI) += ufs-hisi.o
+ufshcd-core-$(CONFIG_SCSI_UFS_CRYPTO) += ufshcd-crypto.o
diff --git a/drivers/scsi/ufs/ufs-hisi.c b/drivers/scsi/ufs/ufs-hisi.c
index c2cee73..71655be 100644
--- a/drivers/scsi/ufs/ufs-hisi.c
+++ b/drivers/scsi/ufs/ufs-hisi.c
@@ -540,6 +540,14 @@
 	if (!host)
 		return -ENOMEM;
 
+	/*
+	 * Inline crypto is currently broken with ufs-hisi because the keyslots
+	 * overlap with the vendor-specific SYS CTRL registers -- and even if
+	 * software uses only non-overlapping keyslots, the kernel crashes when
+	 * programming a key or a UFS error occurs on the first encrypted I/O.
+	 */
+	hba->quirks |= UFSHCD_QUIRK_BROKEN_CRYPTO;
+
 	host->hba = hba;
 	ufshcd_set_variant(hba, host);
 
diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
index 75ee590..e73fc3a 100644
--- a/drivers/scsi/ufs/ufs-qcom.c
+++ b/drivers/scsi/ufs/ufs-qcom.c
@@ -1098,6 +1098,13 @@
 				| UFSHCD_QUIRK_DME_PEER_ACCESS_AUTO_MODE
 				| UFSHCD_QUIRK_BROKEN_PA_RXHSUNTERMCAP);
 	}
+
+	/*
+	 * Inline crypto is currently broken with ufs-qcom at least because the
+	 * device tree doesn't include the crypto registers.  There are likely
+	 * to be other issues that will need to be addressed too.
+	 */
+	hba->quirks |= UFSHCD_QUIRK_BROKEN_CRYPTO;
 }
 
 static void ufs_qcom_set_caps(struct ufs_hba *hba)
diff --git a/drivers/scsi/ufs/ufshcd-crypto.c b/drivers/scsi/ufs/ufshcd-crypto.c
new file mode 100644
index 0000000..75d8341
--- /dev/null
+++ b/drivers/scsi/ufs/ufshcd-crypto.c
@@ -0,0 +1,521 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2019 Google LLC
+ */
+
+#include <crypto/algapi.h>
+
+#include "ufshcd.h"
+#include "ufshcd-crypto.h"
+
+static bool ufshcd_cap_idx_valid(struct ufs_hba *hba, unsigned int cap_idx)
+{
+	return cap_idx < hba->crypto_capabilities.num_crypto_cap;
+}
+
+static u8 get_data_unit_size_mask(unsigned int data_unit_size)
+{
+	if (data_unit_size < 512 || data_unit_size > 65536 ||
+	    !is_power_of_2(data_unit_size))
+		return 0;
+
+	return data_unit_size / 512;
+}
+
+static size_t get_keysize_bytes(enum ufs_crypto_key_size size)
+{
+	switch (size) {
+	case UFS_CRYPTO_KEY_SIZE_128: return 16;
+	case UFS_CRYPTO_KEY_SIZE_192: return 24;
+	case UFS_CRYPTO_KEY_SIZE_256: return 32;
+	case UFS_CRYPTO_KEY_SIZE_512: return 64;
+	default: return 0;
+	}
+}
+
+static int ufshcd_crypto_cap_find(void *hba_p,
+				  enum blk_crypto_mode_num crypto_mode,
+				  unsigned int data_unit_size)
+{
+	struct ufs_hba *hba = hba_p;
+	enum ufs_crypto_alg ufs_alg;
+	u8 data_unit_mask;
+	int cap_idx;
+	enum ufs_crypto_key_size ufs_key_size;
+	union ufs_crypto_cap_entry *ccap_array = hba->crypto_cap_array;
+
+	if (!ufshcd_hba_is_crypto_supported(hba))
+		return -EINVAL;
+
+	switch (crypto_mode) {
+	case BLK_ENCRYPTION_MODE_AES_256_XTS:
+		ufs_alg = UFS_CRYPTO_ALG_AES_XTS;
+		ufs_key_size = UFS_CRYPTO_KEY_SIZE_256;
+		break;
+	default: return -EINVAL;
+	}
+
+	data_unit_mask = get_data_unit_size_mask(data_unit_size);
+
+	for (cap_idx = 0; cap_idx < hba->crypto_capabilities.num_crypto_cap;
+	     cap_idx++) {
+		if (ccap_array[cap_idx].algorithm_id == ufs_alg &&
+		    (ccap_array[cap_idx].sdus_mask & data_unit_mask) &&
+		    ccap_array[cap_idx].key_size == ufs_key_size)
+			return cap_idx;
+	}
+
+	return -EINVAL;
+}
+
+/**
+ * ufshcd_crypto_cfg_entry_write_key - Write a key into a crypto_cfg_entry
+ *
+ *	Writes the key with the appropriate format - for AES_XTS,
+ *	the first half of the key is copied as is, the second half is
+ *	copied with an offset halfway into the cfg->crypto_key array.
+ *	For the other supported crypto algs, the key is just copied.
+ *
+ * @cfg: The crypto config to write to
+ * @key: The key to write
+ * @cap: The crypto capability (which specifies the crypto alg and key size)
+ *
+ * Returns 0 on success, or -EINVAL
+ */
+static int ufshcd_crypto_cfg_entry_write_key(union ufs_crypto_cfg_entry *cfg,
+					     const u8 *key,
+					     union ufs_crypto_cap_entry cap)
+{
+	size_t key_size_bytes = get_keysize_bytes(cap.key_size);
+
+	if (key_size_bytes == 0)
+		return -EINVAL;
+
+	switch (cap.algorithm_id) {
+	case UFS_CRYPTO_ALG_AES_XTS:
+		key_size_bytes *= 2;
+		if (key_size_bytes > UFS_CRYPTO_KEY_MAX_SIZE)
+			return -EINVAL;
+
+		memcpy(cfg->crypto_key, key, key_size_bytes/2);
+		memcpy(cfg->crypto_key + UFS_CRYPTO_KEY_MAX_SIZE/2,
+		       key + key_size_bytes/2, key_size_bytes/2);
+		return 0;
+	case UFS_CRYPTO_ALG_BITLOCKER_AES_CBC: // fallthrough
+	case UFS_CRYPTO_ALG_AES_ECB: // fallthrough
+	case UFS_CRYPTO_ALG_ESSIV_AES_CBC:
+		memcpy(cfg->crypto_key, key, key_size_bytes);
+		return 0;
+	}
+
+	return -EINVAL;
+}
+
+static void program_key(struct ufs_hba *hba,
+			const union ufs_crypto_cfg_entry *cfg,
+			int slot)
+{
+	int i;
+	u32 slot_offset = hba->crypto_cfg_register + slot * sizeof(*cfg);
+
+	/* Clear the dword 16 */
+	ufshcd_writel(hba, 0, slot_offset + 16 * sizeof(cfg->reg_val[0]));
+	/* Ensure that CFGE is cleared before programming the key */
+	wmb();
+	for (i = 0; i < 16; i++) {
+		ufshcd_writel(hba, le32_to_cpu(cfg->reg_val[i]),
+			      slot_offset + i * sizeof(cfg->reg_val[0]));
+		/* Spec says each dword in key must be written sequentially */
+		wmb();
+	}
+	/* Write dword 17 */
+	ufshcd_writel(hba, le32_to_cpu(cfg->reg_val[17]),
+		      slot_offset + 17 * sizeof(cfg->reg_val[0]));
+	/* Dword 16 must be written last */
+	wmb();
+	/* Write dword 16 */
+	ufshcd_writel(hba, le32_to_cpu(cfg->reg_val[16]),
+		      slot_offset + 16 * sizeof(cfg->reg_val[0]));
+	wmb();
+}
+
+static int ufshcd_crypto_keyslot_program(void *hba_p, const u8 *key,
+					 enum blk_crypto_mode_num crypto_mode,
+					 unsigned int data_unit_size,
+					 unsigned int slot)
+{
+	struct ufs_hba *hba = hba_p;
+	int err = 0;
+	u8 data_unit_mask;
+	union ufs_crypto_cfg_entry cfg;
+	union ufs_crypto_cfg_entry *cfg_arr = hba->crypto_cfgs;
+	int cap_idx;
+
+	cap_idx = ufshcd_crypto_cap_find(hba_p, crypto_mode,
+					       data_unit_size);
+
+	if (!ufshcd_is_crypto_enabled(hba) ||
+	    !ufshcd_keyslot_valid(hba, slot) ||
+	    !ufshcd_cap_idx_valid(hba, cap_idx))
+		return -EINVAL;
+
+	data_unit_mask = get_data_unit_size_mask(data_unit_size);
+
+	if (!(data_unit_mask & hba->crypto_cap_array[cap_idx].sdus_mask))
+		return -EINVAL;
+
+	memset(&cfg, 0, sizeof(cfg));
+	cfg.data_unit_size = data_unit_mask;
+	cfg.crypto_cap_idx = cap_idx;
+	cfg.config_enable |= UFS_CRYPTO_CONFIGURATION_ENABLE;
+
+	err = ufshcd_crypto_cfg_entry_write_key(&cfg, key,
+				hba->crypto_cap_array[cap_idx]);
+	if (err)
+		return err;
+
+	program_key(hba, &cfg, slot);
+
+	memcpy(&cfg_arr[slot], &cfg, sizeof(cfg));
+	memzero_explicit(&cfg, sizeof(cfg));
+
+	return 0;
+}
+
+static int ufshcd_crypto_keyslot_find(void *hba_p,
+				      const u8 *key,
+				      enum blk_crypto_mode_num crypto_mode,
+				      unsigned int data_unit_size)
+{
+	struct ufs_hba *hba = hba_p;
+	int err = 0;
+	int slot;
+	u8 data_unit_mask;
+	union ufs_crypto_cfg_entry cfg;
+	union ufs_crypto_cfg_entry *cfg_arr = hba->crypto_cfgs;
+	int cap_idx;
+
+	cap_idx = ufshcd_crypto_cap_find(hba_p, crypto_mode,
+					       data_unit_size);
+
+	if (!ufshcd_is_crypto_enabled(hba) ||
+	    !ufshcd_cap_idx_valid(hba, cap_idx))
+		return -EINVAL;
+
+	data_unit_mask = get_data_unit_size_mask(data_unit_size);
+
+	if (!(data_unit_mask & hba->crypto_cap_array[cap_idx].sdus_mask))
+		return -EINVAL;
+
+	memset(&cfg, 0, sizeof(cfg));
+	err = ufshcd_crypto_cfg_entry_write_key(&cfg, key,
+					hba->crypto_cap_array[cap_idx]);
+
+	if (err)
+		return -EINVAL;
+
+	for (slot = 0; slot < NUM_KEYSLOTS(hba); slot++) {
+		if ((cfg_arr[slot].config_enable &
+		     UFS_CRYPTO_CONFIGURATION_ENABLE) &&
+		    data_unit_mask == cfg_arr[slot].data_unit_size &&
+		    cap_idx == cfg_arr[slot].crypto_cap_idx &&
+		    !crypto_memneq(&cfg.crypto_key, cfg_arr[slot].crypto_key,
+				  UFS_CRYPTO_KEY_MAX_SIZE)) {
+			memzero_explicit(&cfg, sizeof(cfg));
+			return slot;
+		}
+	}
+
+	memzero_explicit(&cfg, sizeof(cfg));
+	return -ENOKEY;
+}
+
+static int ufshcd_crypto_keyslot_evict(void *hba_p, const u8 *key,
+				       enum blk_crypto_mode_num crypto_mode,
+				       unsigned int data_unit_size,
+				       unsigned int slot)
+{
+	struct ufs_hba *hba = hba_p;
+	int i = 0;
+	u32 reg_base;
+	union ufs_crypto_cfg_entry *cfg_arr = hba->crypto_cfgs;
+
+	if (!ufshcd_is_crypto_enabled(hba) ||
+	    !ufshcd_keyslot_valid(hba, slot))
+		return -EINVAL;
+
+	memset(&cfg_arr[slot], 0, sizeof(cfg_arr[slot]));
+	reg_base = hba->crypto_cfg_register + slot * sizeof(cfg_arr[0]);
+
+	/*
+	 * Clear the crypto cfg on the device. Clearing CFGE
+	 * might not be sufficient, so just clear the entire cfg.
+	 */
+	for (i = 0; i < sizeof(cfg_arr[0]); i += sizeof(__le32))
+		ufshcd_writel(hba, 0, reg_base + i);
+	wmb();
+
+	return 0;
+}
+
+static bool ufshcd_crypto_mode_supported(void *hba_p,
+					 enum blk_crypto_mode_num crypto_mode,
+					 unsigned int data_unit_size)
+{
+	return ufshcd_crypto_cap_find(hba_p, crypto_mode, data_unit_size) >= 0;
+}
+
+/* Functions implementing UFSHCI v2.1 specification behaviour */
+void ufshcd_crypto_enable_spec(struct ufs_hba *hba)
+{
+	union ufs_crypto_cfg_entry *cfg_arr = hba->crypto_cfgs;
+	int slot;
+
+	if (!ufshcd_hba_is_crypto_supported(hba))
+		return;
+
+	hba->caps |= UFSHCD_CAP_CRYPTO;
+	/*
+	 * Reset might clear all keys, so reprogram all the keys.
+	 * Also serves to clear keys on driver init.
+	 */
+	for (slot = 0; slot < NUM_KEYSLOTS(hba); slot++)
+		program_key(hba, &cfg_arr[slot], slot);
+}
+EXPORT_SYMBOL(ufshcd_crypto_enable_spec);
+
+void ufshcd_crypto_disable_spec(struct ufs_hba *hba)
+{
+	hba->caps &= ~UFSHCD_CAP_CRYPTO;
+}
+EXPORT_SYMBOL(ufshcd_crypto_disable_spec);
+
+static const struct keyslot_mgmt_ll_ops ufshcd_ksm_ops = {
+	.keyslot_program	= ufshcd_crypto_keyslot_program,
+	.keyslot_evict		= ufshcd_crypto_keyslot_evict,
+	.keyslot_find		= ufshcd_crypto_keyslot_find,
+	.crypto_mode_supported	= ufshcd_crypto_mode_supported,
+};
+
+/**
+ * ufshcd_hba_init_crypto - Read crypto capabilities, init crypto fields in hba
+ * @hba: Per adapter instance
+ *
+ * Return: 0 if crypto was initialized or is not supported, else a -errno value.
+ */
+int ufshcd_hba_init_crypto_spec(struct ufs_hba *hba,
+				const struct keyslot_mgmt_ll_ops *ksm_ops)
+{
+	int cap_idx = 0;
+	int err = 0;
+
+	/* Default to disabling crypto */
+	hba->caps &= ~UFSHCD_CAP_CRYPTO;
+
+	/* Return 0 if crypto support isn't present */
+	if (!(hba->capabilities & MASK_CRYPTO_SUPPORT) ||
+	    (hba->quirks & UFSHCD_QUIRK_BROKEN_CRYPTO))
+		goto out;
+
+	/*
+	 * Crypto Capabilities should never be 0, because the
+	 * config_array_ptr > 04h. So we use a 0 value to indicate that
+	 * crypto init failed, and can't be enabled.
+	 */
+	hba->crypto_capabilities.reg_val =
+			cpu_to_le32(ufshcd_readl(hba, REG_UFS_CCAP));
+	hba->crypto_cfg_register =
+		(u32)hba->crypto_capabilities.config_array_ptr * 0x100;
+	hba->crypto_cap_array =
+		devm_kcalloc(hba->dev,
+			     hba->crypto_capabilities.num_crypto_cap,
+			     sizeof(hba->crypto_cap_array[0]),
+			     GFP_KERNEL);
+	if (!hba->crypto_cap_array) {
+		err = -ENOMEM;
+		goto out;
+	}
+
+	hba->crypto_cfgs =
+		devm_kcalloc(hba->dev,
+			     NUM_KEYSLOTS(hba),
+			     sizeof(hba->crypto_cfgs[0]),
+			     GFP_KERNEL);
+	if (!hba->crypto_cfgs) {
+		err = -ENOMEM;
+		goto out_free_cfg_mem;
+	}
+
+	/*
+	 * Store all the capabilities now so that we don't need to repeatedly
+	 * access the device each time we want to know its capabilities
+	 */
+	for (cap_idx = 0; cap_idx < hba->crypto_capabilities.num_crypto_cap;
+	     cap_idx++) {
+		hba->crypto_cap_array[cap_idx].reg_val =
+			cpu_to_le32(ufshcd_readl(hba,
+						 REG_UFS_CRYPTOCAP +
+						 cap_idx * sizeof(__le32)));
+	}
+
+	hba->ksm = keyslot_manager_create(NUM_KEYSLOTS(hba), ksm_ops, hba);
+
+	if (!hba->ksm) {
+		err = -ENOMEM;
+		goto out_free_crypto_cfgs;
+	}
+
+	return 0;
+out_free_crypto_cfgs:
+	devm_kfree(hba->dev, hba->crypto_cfgs);
+out_free_cfg_mem:
+	devm_kfree(hba->dev, hba->crypto_cap_array);
+out:
+	/* Indicate that init failed by setting crypto_capabilities to 0 */
+	hba->crypto_capabilities.reg_val = 0;
+	return err;
+}
+EXPORT_SYMBOL(ufshcd_hba_init_crypto_spec);
+
+void ufshcd_crypto_setup_rq_keyslot_manager_spec(struct ufs_hba *hba,
+						 struct request_queue *q)
+{
+	if (!ufshcd_hba_is_crypto_supported(hba) || !q)
+		return;
+
+	q->ksm = hba->ksm;
+}
+EXPORT_SYMBOL(ufshcd_crypto_setup_rq_keyslot_manager_spec);
+
+void ufshcd_crypto_destroy_rq_keyslot_manager_spec(struct ufs_hba *hba,
+						   struct request_queue *q)
+{
+	keyslot_manager_destroy(hba->ksm);
+}
+EXPORT_SYMBOL(ufshcd_crypto_destroy_rq_keyslot_manager_spec);
+
+int ufshcd_prepare_lrbp_crypto_spec(struct ufs_hba *hba,
+				    struct scsi_cmnd *cmd,
+				    struct ufshcd_lrb *lrbp)
+{
+	int key_slot;
+
+	if (!cmd->request->bio ||
+	    !bio_crypt_should_process(cmd->request->bio, cmd->request->q)) {
+		lrbp->crypto_enable = false;
+		return 0;
+	}
+
+	if (WARN_ON(!ufshcd_is_crypto_enabled(hba))) {
+		/*
+		 * Upper layer asked us to do inline encryption
+		 * but that isn't enabled, so we fail this request.
+		 */
+		return -EINVAL;
+	}
+	key_slot = bio_crypt_get_keyslot(cmd->request->bio);
+	if (!ufshcd_keyslot_valid(hba, key_slot))
+		return -EINVAL;
+
+	lrbp->crypto_enable = true;
+	lrbp->crypto_key_slot = key_slot;
+	lrbp->data_unit_num = bio_crypt_data_unit_num(cmd->request->bio);
+
+	return 0;
+}
+EXPORT_SYMBOL(ufshcd_prepare_lrbp_crypto_spec);
+
+/* Crypto Variant Ops Support */
+
+void ufshcd_crypto_enable(struct ufs_hba *hba)
+{
+	if (hba->crypto_vops && hba->crypto_vops->enable)
+		return hba->crypto_vops->enable(hba);
+
+	return ufshcd_crypto_enable_spec(hba);
+}
+
+void ufshcd_crypto_disable(struct ufs_hba *hba)
+{
+	if (hba->crypto_vops && hba->crypto_vops->disable)
+		return hba->crypto_vops->disable(hba);
+
+	return ufshcd_crypto_disable_spec(hba);
+}
+
+int ufshcd_hba_init_crypto(struct ufs_hba *hba)
+{
+	if (hba->crypto_vops && hba->crypto_vops->hba_init_crypto)
+		return hba->crypto_vops->hba_init_crypto(hba,
+							 &ufshcd_ksm_ops);
+
+	return ufshcd_hba_init_crypto_spec(hba, &ufshcd_ksm_ops);
+}
+
+void ufshcd_crypto_setup_rq_keyslot_manager(struct ufs_hba *hba,
+					    struct request_queue *q)
+{
+	if (hba->crypto_vops && hba->crypto_vops->setup_rq_keyslot_manager)
+		return hba->crypto_vops->setup_rq_keyslot_manager(hba, q);
+
+	return ufshcd_crypto_setup_rq_keyslot_manager_spec(hba, q);
+}
+
+void ufshcd_crypto_destroy_rq_keyslot_manager(struct ufs_hba *hba,
+					      struct request_queue *q)
+{
+	if (hba->crypto_vops && hba->crypto_vops->destroy_rq_keyslot_manager)
+		return hba->crypto_vops->destroy_rq_keyslot_manager(hba, q);
+
+	return ufshcd_crypto_destroy_rq_keyslot_manager_spec(hba, q);
+}
+
+int ufshcd_prepare_lrbp_crypto(struct ufs_hba *hba,
+			       struct scsi_cmnd *cmd,
+			       struct ufshcd_lrb *lrbp)
+{
+	if (hba->crypto_vops && hba->crypto_vops->prepare_lrbp_crypto)
+		return hba->crypto_vops->prepare_lrbp_crypto(hba, cmd, lrbp);
+
+	return ufshcd_prepare_lrbp_crypto_spec(hba, cmd, lrbp);
+}
+
+int ufshcd_complete_lrbp_crypto(struct ufs_hba *hba,
+				struct scsi_cmnd *cmd,
+				struct ufshcd_lrb *lrbp)
+{
+	if (hba->crypto_vops && hba->crypto_vops->complete_lrbp_crypto)
+		return hba->crypto_vops->complete_lrbp_crypto(hba, cmd, lrbp);
+
+	return 0;
+}
+
+void ufshcd_crypto_debug(struct ufs_hba *hba)
+{
+	if (hba->crypto_vops && hba->crypto_vops->debug)
+		hba->crypto_vops->debug(hba);
+}
+
+int ufshcd_crypto_suspend(struct ufs_hba *hba,
+			  enum ufs_pm_op pm_op)
+{
+	if (hba->crypto_vops && hba->crypto_vops->suspend)
+		return hba->crypto_vops->suspend(hba, pm_op);
+
+	return 0;
+}
+
+int ufshcd_crypto_resume(struct ufs_hba *hba,
+			 enum ufs_pm_op pm_op)
+{
+	if (hba->crypto_vops && hba->crypto_vops->resume)
+		return hba->crypto_vops->resume(hba, pm_op);
+
+	return 0;
+}
+
+void ufshcd_crypto_set_vops(struct ufs_hba *hba,
+			    struct ufs_hba_crypto_variant_ops *crypto_vops)
+{
+	hba->crypto_vops = crypto_vops;
+}
diff --git a/drivers/scsi/ufs/ufshcd-crypto.h b/drivers/scsi/ufs/ufshcd-crypto.h
new file mode 100644
index 0000000..3c03d0e
--- /dev/null
+++ b/drivers/scsi/ufs/ufshcd-crypto.h
@@ -0,0 +1,151 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright 2019 Google LLC
+ */
+
+#ifndef _UFSHCD_CRYPTO_H
+#define _UFSHCD_CRYPTO_H
+
+#ifdef CONFIG_SCSI_UFS_CRYPTO
+#include <linux/keyslot-manager.h>
+#include "ufshcd.h"
+#include "ufshci.h"
+
+#define NUM_KEYSLOTS(hba) (hba->crypto_capabilities.config_count + 1)
+
+static inline bool ufshcd_keyslot_valid(struct ufs_hba *hba, unsigned int slot)
+{
+	/*
+	 * The actual number of configurations supported is (CFGC+1), so slot
+	 * numbers range from 0 to config_count inclusive.
+	 */
+	return slot < NUM_KEYSLOTS(hba);
+}
+
+static inline bool ufshcd_hba_is_crypto_supported(struct ufs_hba *hba)
+{
+	return hba->crypto_capabilities.reg_val != 0;
+}
+
+static inline bool ufshcd_is_crypto_enabled(struct ufs_hba *hba)
+{
+	return hba->caps & UFSHCD_CAP_CRYPTO;
+}
+
+/* Functions implementing UFSHCI v2.1 specification behaviour */
+int ufshcd_prepare_lrbp_crypto_spec(struct ufs_hba *hba,
+				    struct scsi_cmnd *cmd,
+				    struct ufshcd_lrb *lrbp);
+
+void ufshcd_crypto_enable_spec(struct ufs_hba *hba);
+
+void ufshcd_crypto_disable_spec(struct ufs_hba *hba);
+
+struct keyslot_mgmt_ll_ops;
+int ufshcd_hba_init_crypto_spec(struct ufs_hba *hba,
+				const struct keyslot_mgmt_ll_ops *ksm_ops);
+
+void ufshcd_crypto_setup_rq_keyslot_manager_spec(struct ufs_hba *hba,
+						 struct request_queue *q);
+
+void ufshcd_crypto_destroy_rq_keyslot_manager_spec(struct ufs_hba *hba,
+						   struct request_queue *q);
+
+/* Crypto Variant Ops Support */
+void ufshcd_crypto_enable(struct ufs_hba *hba);
+
+void ufshcd_crypto_disable(struct ufs_hba *hba);
+
+int ufshcd_hba_init_crypto(struct ufs_hba *hba);
+
+void ufshcd_crypto_setup_rq_keyslot_manager(struct ufs_hba *hba,
+					    struct request_queue *q);
+
+void ufshcd_crypto_destroy_rq_keyslot_manager(struct ufs_hba *hba,
+					      struct request_queue *q);
+
+int ufshcd_prepare_lrbp_crypto(struct ufs_hba *hba,
+			       struct scsi_cmnd *cmd,
+			       struct ufshcd_lrb *lrbp);
+
+int ufshcd_complete_lrbp_crypto(struct ufs_hba *hba,
+				struct scsi_cmnd *cmd,
+				struct ufshcd_lrb *lrbp);
+
+void ufshcd_crypto_debug(struct ufs_hba *hba);
+
+int ufshcd_crypto_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op);
+
+int ufshcd_crypto_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op);
+
+void ufshcd_crypto_set_vops(struct ufs_hba *hba,
+			    struct ufs_hba_crypto_variant_ops *crypto_vops);
+
+#else /* CONFIG_SCSI_UFS_CRYPTO */
+
+static inline bool ufshcd_keyslot_valid(struct ufs_hba *hba,
+					unsigned int slot)
+{
+	return false;
+}
+
+static inline bool ufshcd_hba_is_crypto_supported(struct ufs_hba *hba)
+{
+	return false;
+}
+
+static inline bool ufshcd_is_crypto_enabled(struct ufs_hba *hba)
+{
+	return false;
+}
+
+static inline void ufshcd_crypto_enable(struct ufs_hba *hba) { }
+
+static inline void ufshcd_crypto_disable(struct ufs_hba *hba) { }
+
+static inline int ufshcd_hba_init_crypto(struct ufs_hba *hba)
+{
+	return 0;
+}
+
+static inline void ufshcd_crypto_setup_rq_keyslot_manager(struct ufs_hba *hba,
+						struct request_queue *q) { }
+
+static inline void ufshcd_crypto_destroy_rq_keyslot_manager(struct ufs_hba *hba,
+						struct request_queue *q) { }
+
+static inline int ufshcd_prepare_lrbp_crypto(struct ufs_hba *hba,
+					     struct scsi_cmnd *cmd,
+					     struct ufshcd_lrb *lrbp)
+{
+	lrbp->crypto_enable = false;
+	return 0;
+}
+
+static inline int ufshcd_complete_lrbp_crypto(struct ufs_hba *hba,
+					      struct scsi_cmnd *cmd,
+					      struct ufshcd_lrb *lrbp)
+{
+	return 0;
+}
+
+static inline void ufshcd_crypto_debug(struct ufs_hba *hba) { }
+
+static inline int ufshcd_crypto_suspend(struct ufs_hba *hba,
+					enum ufs_pm_op pm_op)
+{
+	return 0;
+}
+
+static inline int ufshcd_crypto_resume(struct ufs_hba *hba,
+					enum ufs_pm_op pm_op)
+{
+	return 0;
+}
+
+static inline void ufshcd_crypto_set_vops(struct ufs_hba *hba,
+			struct ufs_hba_crypto_variant_ops *crypto_vops) { }
+
+#endif /* CONFIG_SCSI_UFS_CRYPTO */
+
+#endif /* _UFSHCD_CRYPTO_H */
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 8bce755..585f38b 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -46,6 +46,7 @@
 #include "ufs_quirks.h"
 #include "unipro.h"
 #include "ufs-sysfs.h"
+#include "ufshcd-crypto.h"
 
 #define CREATE_TRACE_POINTS
 #include <trace/events/ufs.h>
@@ -89,6 +90,9 @@
 /* Interrupt aggregation default timeout, unit: 40us */
 #define INT_AGGR_DEF_TO	0x02
 
+/* default delay of autosuspend: 2000 ms */
+#define RPM_AUTOSUSPEND_DELAY_MS 2000
+
 #define ufshcd_toggle_vreg(_dev, _vreg, _on)				\
 	({                                                              \
 		int _ret;                                               \
@@ -437,6 +441,8 @@
 
 	if (hba->vops && hba->vops->dbg_register_dump)
 		hba->vops->dbg_register_dump(hba);
+
+	ufshcd_crypto_debug(hba);
 }
 
 static
@@ -881,7 +887,14 @@
  */
 static inline void ufshcd_hba_start(struct ufs_hba *hba)
 {
-	ufshcd_writel(hba, CONTROLLER_ENABLE, REG_CONTROLLER_ENABLE);
+	u32 val = CONTROLLER_ENABLE;
+
+	if (ufshcd_hba_is_crypto_supported(hba)) {
+		ufshcd_crypto_enable(hba);
+		val |= CRYPTO_GENERAL_ENABLE;
+	}
+
+	ufshcd_writel(hba, val, REG_CONTROLLER_ENABLE);
 }
 
 /**
@@ -2235,9 +2248,21 @@
 		dword_0 |= UTP_REQ_DESC_INT_CMD;
 
 	/* Transfer request descriptor header fields */
+	if (lrbp->crypto_enable) {
+		dword_0 |= UTP_REQ_DESC_CRYPTO_ENABLE_CMD;
+		dword_0 |= lrbp->crypto_key_slot;
+		req_desc->header.dword_1 =
+			cpu_to_le32((u32)lrbp->data_unit_num);
+		req_desc->header.dword_3 =
+			cpu_to_le32((u32)(lrbp->data_unit_num >> 32));
+	} else {
+		/* dword_1 and dword_3 are reserved, hence they are set to 0 */
+		req_desc->header.dword_1 = 0;
+		req_desc->header.dword_3 = 0;
+	}
+
 	req_desc->header.dword_0 = cpu_to_le32(dword_0);
-	/* dword_1 is reserved, hence it is set to 0 */
-	req_desc->header.dword_1 = 0;
+
 	/*
 	 * assigning invalid value for command status. Controller
 	 * updates OCS on command completion, with the command
@@ -2245,8 +2270,6 @@
 	 */
 	req_desc->header.dword_2 =
 		cpu_to_le32(OCS_INVALID_COMMAND_STATUS);
-	/* dword_3 is reserved, hence it is set to 0 */
-	req_desc->header.dword_3 = 0;
 
 	req_desc->prd_table_length = 0;
 }
@@ -2494,6 +2517,13 @@
 	lrbp->task_tag = tag;
 	lrbp->lun = ufshcd_scsi_to_upiu_lun(cmd->device->lun);
 	lrbp->intr_cmd = !ufshcd_is_intr_aggr_allowed(hba) ? true : false;
+
+	err = ufshcd_prepare_lrbp_crypto(hba, cmd, lrbp);
+	if (err) {
+		lrbp->cmd = NULL;
+		clear_bit_unlock(tag, &hba->lrb_in_use);
+		goto out;
+	}
 	lrbp->req_abort_skip = false;
 
 	ufshcd_comp_scsi_upiu(hba, lrbp);
@@ -2527,6 +2557,7 @@
 	lrbp->task_tag = tag;
 	lrbp->lun = 0; /* device management cmd is not specific to any LUN */
 	lrbp->intr_cmd = true; /* No interrupt aggregation */
+	lrbp->crypto_enable = false; /* No crypto operations */
 	hba->dev_cmd.type = cmd_type;
 
 	return ufshcd_comp_devman_upiu(hba, lrbp);
@@ -4219,6 +4250,8 @@
 {
 	int err;
 
+	ufshcd_crypto_disable(hba);
+
 	ufshcd_writel(hba, CONTROLLER_DISABLE,  REG_CONTROLLER_ENABLE);
 	err = ufshcd_wait_for_register(hba, REG_CONTROLLER_ENABLE,
 					CONTROLLER_ENABLE, CONTROLLER_DISABLE,
@@ -4611,11 +4644,17 @@
  */
 static int ufshcd_slave_configure(struct scsi_device *sdev)
 {
+	struct ufs_hba *hba = shost_priv(sdev->host);
 	struct request_queue *q = sdev->request_queue;
 
 	blk_queue_update_dma_pad(q, PRDT_DATA_BYTE_COUNT_PAD - 1);
 	blk_queue_max_segment_size(q, PRDT_DATA_BYTE_COUNT_MAX);
 
+	if (ufshcd_is_rpm_autosuspend_allowed(hba))
+		sdev->rpm_autosuspend = 1;
+
+	ufshcd_crypto_setup_rq_keyslot_manager(hba, q);
+
 	return 0;
 }
 
@@ -4626,6 +4665,7 @@
 static void ufshcd_slave_destroy(struct scsi_device *sdev)
 {
 	struct ufs_hba *hba;
+	struct request_queue *q = sdev->request_queue;
 
 	hba = shost_priv(sdev->host);
 	/* Drop the reference as it won't be needed anymore */
@@ -4636,6 +4676,8 @@
 		hba->sdev_ufs_device = NULL;
 		spin_unlock_irqrestore(hba->host->host_lock, flags);
 	}
+
+	ufshcd_crypto_destroy_rq_keyslot_manager(hba, q);
 }
 
 /**
@@ -4790,6 +4832,8 @@
 	case OCS_MISMATCH_RESP_UPIU_SIZE:
 	case OCS_PEER_COMM_FAILURE:
 	case OCS_FATAL_ERROR:
+	case OCS_INVALID_CRYPTO_CONFIG:
+	case OCS_GENERAL_CRYPTO_ERROR:
 	default:
 		result |= DID_ERROR << 16;
 		dev_err(hba->dev,
@@ -4845,6 +4889,7 @@
 			result = ufshcd_transfer_rsp_status(hba, lrbp);
 			scsi_dma_unmap(cmd);
 			cmd->result = result;
+			ufshcd_complete_lrbp_crypto(hba, cmd, lrbp);
 			/* Mark completed command as NULL in LRB */
 			lrbp->cmd = NULL;
 			clear_bit_unlock(index, &hba->lrb_in_use);
@@ -6787,6 +6832,7 @@
 	.max_host_blocked	= 1,
 	.track_queue_depth	= 1,
 	.sdev_groups		= ufshcd_driver_groups,
+	.rpm_autosuspend_delay	= RPM_AUTOSUSPEND_DELAY_MS,
 };
 
 static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg,
@@ -7523,6 +7569,10 @@
 		req_link_state = UIC_LINK_OFF_STATE;
 	}
 
+	ret = ufshcd_crypto_suspend(hba, pm_op);
+	if (ret)
+		goto out;
+
 	/*
 	 * If we can't transition into any of the low power modes
 	 * just gate the clocks.
@@ -7626,6 +7676,7 @@
 		ufshcd_resume_clkscaling(hba);
 	hba->clk_gating.is_suspended = false;
 	ufshcd_release(hba);
+	ufshcd_crypto_resume(hba, pm_op);
 out:
 	hba->pm_op_in_progress = 0;
 	return ret;
@@ -7645,9 +7696,11 @@
 {
 	int ret;
 	enum uic_link_state old_link_state;
+	enum ufs_dev_pwr_mode old_pwr_mode;
 
 	hba->pm_op_in_progress = 1;
 	old_link_state = hba->uic_link_state;
+	old_pwr_mode = hba->curr_dev_pwr_mode;
 
 	ufshcd_hba_vreg_set_hpm(hba);
 	/* Make sure clocks are enabled before accessing controller */
@@ -7695,6 +7748,10 @@
 			goto set_old_link_state;
 	}
 
+	ret = ufshcd_crypto_resume(hba, pm_op);
+	if (ret)
+		goto set_old_dev_pwr_mode;
+
 	if (ufshcd_keep_autobkops_enabled_except_suspend(hba))
 		ufshcd_enable_auto_bkops(hba);
 	else
@@ -7717,6 +7774,9 @@
 
 	goto out;
 
+set_old_dev_pwr_mode:
+	if (old_pwr_mode != hba->curr_dev_pwr_mode)
+		ufshcd_set_dev_pwr_mode(hba, old_pwr_mode);
 set_old_link_state:
 	ufshcd_link_state_transition(hba, old_link_state, 0);
 vendor_suspend:
@@ -8137,6 +8197,13 @@
 		goto exit_gating;
 	}
 
+	/* Init crypto */
+	err = ufshcd_hba_init_crypto(hba);
+	if (err) {
+		dev_err(hba->dev, "crypto setup failed\n");
+		goto out_remove_scsi_host;
+	}
+
 	/* Host controller enable */
 	err = ufshcd_hba_enable(hba);
 	if (err) {
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 33fdd3f..80f8315 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -167,6 +167,9 @@
  * @intr_cmd: Interrupt command (doesn't participate in interrupt aggregation)
  * @issue_time_stamp: time stamp for debug purposes
  * @compl_time_stamp: time stamp for statistics
+ * @crypto_enable: whether or not the request needs inline crypto operations
+ * @crypto_key_slot: the key slot to use for inline crypto
+ * @data_unit_num: the data unit number for the first block for inline crypto
  * @req_abort_skip: skip request abort task flag
  */
 struct ufshcd_lrb {
@@ -191,6 +194,9 @@
 	bool intr_cmd;
 	ktime_t issue_time_stamp;
 	ktime_t compl_time_stamp;
+	bool crypto_enable;
+	u8 crypto_key_slot;
+	u64 data_unit_num;
 
 	bool req_abort_skip;
 };
@@ -328,6 +334,28 @@
 	int	(*phy_initialization)(struct ufs_hba *);
 };
 
+struct keyslot_mgmt_ll_ops;
+struct ufs_hba_crypto_variant_ops {
+	void (*setup_rq_keyslot_manager)(struct ufs_hba *hba,
+					 struct request_queue *q);
+	void (*destroy_rq_keyslot_manager)(struct ufs_hba *hba,
+					   struct request_queue *q);
+	int (*hba_init_crypto)(struct ufs_hba *hba,
+			       const struct keyslot_mgmt_ll_ops *ksm_ops);
+	void (*enable)(struct ufs_hba *hba);
+	void (*disable)(struct ufs_hba *hba);
+	int (*suspend)(struct ufs_hba *hba, enum ufs_pm_op pm_op);
+	int (*resume)(struct ufs_hba *hba, enum ufs_pm_op pm_op);
+	int (*debug)(struct ufs_hba *hba);
+	int (*prepare_lrbp_crypto)(struct ufs_hba *hba,
+				   struct scsi_cmnd *cmd,
+				   struct ufshcd_lrb *lrbp);
+	int (*complete_lrbp_crypto)(struct ufs_hba *hba,
+				    struct scsi_cmnd *cmd,
+				    struct ufshcd_lrb *lrbp);
+	void *priv;
+};
+
 /* clock gating state  */
 enum clk_gating_state {
 	CLKS_OFF,
@@ -501,6 +529,11 @@
  * @is_urgent_bkops_lvl_checked: keeps track if the urgent bkops level for
  *  device is known or not.
  * @scsi_block_reqs_cnt: reference counting for scsi block requests
+ * @crypto_capabilities: Content of crypto capabilities register (0x100)
+ * @crypto_cap_array: Array of crypto capabilities
+ * @crypto_cfg_register: Start of the crypto cfg array
+ * @crypto_cfgs: Array of crypto configurations (i.e. config for each slot)
+ * @ksm: the keyslot manager tied to this hba
  */
 struct ufs_hba {
 	void __iomem *mmio_base;
@@ -548,6 +581,7 @@
 	u32 ufs_version;
 	struct ufs_hba_variant_ops *vops;
 	void *priv;
+	const struct ufs_hba_crypto_variant_ops *crypto_vops;
 	unsigned int irq;
 	bool is_irq_enabled;
 
@@ -613,6 +647,13 @@
 	 * enabled via HCE register.
 	 */
 	#define UFSHCI_QUIRK_BROKEN_HCE				0x400
+
+	/*
+	 * This quirk needs to be enabled if the host controller advertises
+	 * inline encryption support but it doesn't work correctly.
+	 */
+	#define UFSHCD_QUIRK_BROKEN_CRYPTO			0x800
+
 	unsigned int quirks;	/* Deviations from standard UFSHCI spec. */
 
 	/* Device deviations from standard UFS device spec. */
@@ -691,6 +732,17 @@
 	 * the performance of ongoing read/write operations.
 	 */
 #define UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND (1 << 5)
+	/*
+	 * This capability allows host controller driver to automatically
+	 * enable runtime power management by itself instead of waiting
+	 * for userspace to control the power management.
+	 */
+#define UFSHCD_CAP_RPM_AUTOSUSPEND (1 << 6)
+	/*
+	 * This capability allows the host controller driver to use the
+	 * inline crypto engine, if it is present
+	 */
+#define UFSHCD_CAP_CRYPTO (1 << 7)
 
 	struct devfreq *devfreq;
 	struct ufs_clk_scaling clk_scaling;
@@ -702,6 +754,15 @@
 	struct rw_semaphore clk_scaling_lock;
 	struct ufs_desc_size desc_size;
 	atomic_t scsi_block_reqs_cnt;
+
+#ifdef CONFIG_SCSI_UFS_CRYPTO
+	/* crypto */
+	union ufs_crypto_capabilities crypto_capabilities;
+	union ufs_crypto_cap_entry *crypto_cap_array;
+	u32 crypto_cfg_register;
+	union ufs_crypto_cfg_entry *crypto_cfgs;
+	struct keyslot_manager *ksm;
+#endif /* CONFIG_SCSI_UFS_CRYPTO */
 };
 
 /* Returns true if clocks can be gated. Otherwise false */
@@ -721,6 +782,10 @@
 {
 	return hba->caps & UFSHCD_CAP_AUTO_BKOPS_SUSPEND;
 }
+static inline bool ufshcd_is_rpm_autosuspend_allowed(struct ufs_hba *hba)
+{
+	return hba->caps & UFSHCD_CAP_RPM_AUTOSUSPEND;
+}
 
 static inline bool ufshcd_is_intr_aggr_allowed(struct ufs_hba *hba)
 {
diff --git a/drivers/scsi/ufs/ufshci.h b/drivers/scsi/ufs/ufshci.h
index bb5d9c7..55e41a8 100644
--- a/drivers/scsi/ufs/ufshci.h
+++ b/drivers/scsi/ufs/ufshci.h
@@ -90,6 +90,7 @@
 	MASK_64_ADDRESSING_SUPPORT		= 0x01000000,
 	MASK_OUT_OF_ORDER_DATA_DELIVERY_SUPPORT	= 0x02000000,
 	MASK_UIC_DME_TEST_MODE_SUPPORT		= 0x04000000,
+	MASK_CRYPTO_SUPPORT			= 0x10000000,
 };
 
 #define UFS_MASK(mask, offset)		((mask) << (offset))
@@ -143,6 +144,7 @@
 #define DEVICE_FATAL_ERROR			0x800
 #define CONTROLLER_FATAL_ERROR			0x10000
 #define SYSTEM_BUS_FATAL_ERROR			0x20000
+#define CRYPTO_ENGINE_FATAL_ERROR		0x40000
 
 #define UFSHCD_UIC_PWR_MASK	(UIC_HIBERNATE_ENTER |\
 				UIC_HIBERNATE_EXIT |\
@@ -153,11 +155,13 @@
 #define UFSHCD_ERROR_MASK	(UIC_ERROR |\
 				DEVICE_FATAL_ERROR |\
 				CONTROLLER_FATAL_ERROR |\
-				SYSTEM_BUS_FATAL_ERROR)
+				SYSTEM_BUS_FATAL_ERROR |\
+				CRYPTO_ENGINE_FATAL_ERROR)
 
 #define INT_FATAL_ERRORS	(DEVICE_FATAL_ERROR |\
 				CONTROLLER_FATAL_ERROR |\
-				SYSTEM_BUS_FATAL_ERROR)
+				SYSTEM_BUS_FATAL_ERROR |\
+				CRYPTO_ENGINE_FATAL_ERROR)
 
 /* HCS - Host Controller Status 30h */
 #define DEVICE_PRESENT				0x1
@@ -316,6 +320,61 @@
 	INTERRUPT_MASK_ALL_VER_21	= 0x71FFF,
 };
 
+/* CCAP - Crypto Capability 100h */
+union ufs_crypto_capabilities {
+	__le32 reg_val;
+	struct {
+		u8 num_crypto_cap;
+		u8 config_count;
+		u8 reserved;
+		u8 config_array_ptr;
+	};
+};
+
+enum ufs_crypto_key_size {
+	UFS_CRYPTO_KEY_SIZE_INVALID	= 0x0,
+	UFS_CRYPTO_KEY_SIZE_128		= 0x1,
+	UFS_CRYPTO_KEY_SIZE_192		= 0x2,
+	UFS_CRYPTO_KEY_SIZE_256		= 0x3,
+	UFS_CRYPTO_KEY_SIZE_512		= 0x4,
+};
+
+enum ufs_crypto_alg {
+	UFS_CRYPTO_ALG_AES_XTS			= 0x0,
+	UFS_CRYPTO_ALG_BITLOCKER_AES_CBC	= 0x1,
+	UFS_CRYPTO_ALG_AES_ECB			= 0x2,
+	UFS_CRYPTO_ALG_ESSIV_AES_CBC		= 0x3,
+};
+
+/* x-CRYPTOCAP - Crypto Capability X */
+union ufs_crypto_cap_entry {
+	__le32 reg_val;
+	struct {
+		u8 algorithm_id;
+		u8 sdus_mask; /* Supported data unit size mask */
+		u8 key_size;
+		u8 reserved;
+	};
+};
+
+#define UFS_CRYPTO_CONFIGURATION_ENABLE (1 << 7)
+#define UFS_CRYPTO_KEY_MAX_SIZE 64
+/* x-CRYPTOCFG - Crypto Configuration X */
+union ufs_crypto_cfg_entry {
+	__le32 reg_val[32];
+	struct {
+		u8 crypto_key[UFS_CRYPTO_KEY_MAX_SIZE];
+		u8 data_unit_size;
+		u8 crypto_cap_idx;
+		u8 reserved_1;
+		u8 config_enable;
+		u8 reserved_multi_host;
+		u8 reserved_2;
+		u8 vsb[2];
+		u8 reserved_3[56];
+	};
+};
+
 /*
  * Request Descriptor Definitions
  */
@@ -337,6 +396,7 @@
 	UTP_NATIVE_UFS_COMMAND		= 0x10000000,
 	UTP_DEVICE_MANAGEMENT_FUNCTION	= 0x20000000,
 	UTP_REQ_DESC_INT_CMD		= 0x01000000,
+	UTP_REQ_DESC_CRYPTO_ENABLE_CMD	= 0x00800000,
 };
 
 /* UTP Transfer Request Data Direction (DD) */
@@ -356,6 +416,9 @@
 	OCS_PEER_COMM_FAILURE		= 0x5,
 	OCS_ABORTED			= 0x6,
 	OCS_FATAL_ERROR			= 0x7,
+	OCS_DEVICE_FATAL_ERROR		= 0x8,
+	OCS_INVALID_CRYPTO_CONFIG	= 0x9,
+	OCS_GENERAL_CRYPTO_ERROR	= 0xA,
 	OCS_INVALID_COMMAND_STATUS	= 0x0F,
 	MASK_OCS			= 0x0F,
 };
diff --git a/drivers/soc/tegra/Kconfig b/drivers/soc/tegra/Kconfig
index fe44816..8d05e9c 100644
--- a/drivers/soc/tegra/Kconfig
+++ b/drivers/soc/tegra/Kconfig
@@ -76,6 +76,7 @@
 	select PINCTRL_TEGRA210
 	select SOC_TEGRA_FLOWCTRL
 	select SOC_TEGRA_PMC
+	depends on !LTO_CLANG
 	help
 	  Enable support for the NVIDIA Tegra210 SoC. Also known as Tegra X1,
 	  the Tegra210 has four Cortex-A57 cores paired with four Cortex-A53
diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c
index 185bbdc..e054260 100644
--- a/drivers/spi/spi-rockchip.c
+++ b/drivers/spi/spi-rockchip.c
@@ -15,6 +15,7 @@
 
 #include <linux/clk.h>
 #include <linux/dmaengine.h>
+#include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/pinctrl/consumer.h>
diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index 45c7f82..639170c 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -32,6 +32,7 @@
 
 static struct ion_device *internal_dev;
 static int heap_id;
+static atomic_long_t total_heap_bytes;
 
 /* this function should only be called while dev->lock is held */
 static void ion_buffer_add(struct ion_device *dev,
@@ -100,6 +101,7 @@
 	mutex_lock(&dev->buffer_lock);
 	ion_buffer_add(dev, buffer);
 	mutex_unlock(&dev->buffer_lock);
+	atomic_long_add(len, &total_heap_bytes);
 	return buffer;
 
 err1:
@@ -128,6 +130,7 @@
 	mutex_lock(&dev->buffer_lock);
 	rb_erase(&buffer->node, &dev->buffers);
 	mutex_unlock(&dev->buffer_lock);
+	atomic_long_sub(buffer->size, &total_heap_bytes);
 
 	if (heap->flags & ION_HEAP_FLAG_DEFER_FREE)
 		ion_heap_freelist_add(heap, buffer);
@@ -568,6 +571,56 @@
 }
 EXPORT_SYMBOL(ion_device_add_heap);
 
+static ssize_t
+total_heaps_kb_show(struct kobject *kobj, struct kobj_attribute *attr,
+		    char *buf)
+{
+	u64 size_in_bytes = atomic_long_read(&total_heap_bytes);
+
+	return sprintf(buf, "%llu\n", div_u64(size_in_bytes, 1024));
+}
+
+static ssize_t
+total_pools_kb_show(struct kobject *kobj, struct kobj_attribute *attr,
+		    char *buf)
+{
+	u64 size_in_bytes = ion_page_pool_nr_pages() * PAGE_SIZE;
+
+	return sprintf(buf, "%llu\n", div_u64(size_in_bytes, 1024));
+}
+
+static struct kobj_attribute total_heaps_kb_attr =
+	__ATTR_RO(total_heaps_kb);
+
+static struct kobj_attribute total_pools_kb_attr =
+	__ATTR_RO(total_pools_kb);
+
+static struct attribute *ion_device_attrs[] = {
+	&total_heaps_kb_attr.attr,
+	&total_pools_kb_attr.attr,
+	NULL,
+};
+
+ATTRIBUTE_GROUPS(ion_device);
+
+static int ion_init_sysfs(void)
+{
+	struct kobject *ion_kobj;
+	int ret;
+
+	ion_kobj = kobject_create_and_add("ion", kernel_kobj);
+	if (!ion_kobj)
+		return -ENOMEM;
+
+	ret = sysfs_create_groups(ion_kobj, ion_device_groups);
+	if (ret) {
+		kobject_put(ion_kobj);
+		return ret;
+	}
+
+	return 0;
+}
+
 static int ion_device_create(void)
 {
 	struct ion_device *idev;
@@ -584,8 +637,13 @@
 	ret = misc_register(&idev->dev);
 	if (ret) {
 		pr_err("ion: failed to register misc device.\n");
-		kfree(idev);
-		return ret;
+		goto err_reg;
+	}
+
+	ret = ion_init_sysfs();
+	if (ret) {
+		pr_err("ion: failed to add sysfs attributes.\n");
+		goto err_sysfs;
 	}
 
 	idev->debug_root = debugfs_create_dir("ion", NULL);
@@ -595,5 +653,11 @@
 	plist_head_init(&idev->heaps);
 	internal_dev = idev;
 	return 0;
+
+err_sysfs:
+	misc_deregister(&idev->dev);
+err_reg:
+	kfree(idev);
+	return ret;
 }
 subsys_initcall(ion_device_create);
diff --git a/drivers/staging/android/ion/ion.h b/drivers/staging/android/ion/ion.h
index 16cbd38..6bd962c 100644
--- a/drivers/staging/android/ion/ion.h
+++ b/drivers/staging/android/ion/ion.h
@@ -316,6 +316,12 @@
 struct page *ion_page_pool_alloc(struct ion_page_pool *pool);
 void ion_page_pool_free(struct ion_page_pool *pool, struct page *page);
 
+#ifdef CONFIG_ION_SYSTEM_HEAP
+long ion_page_pool_nr_pages(void);
+#else
+static inline long ion_page_pool_nr_pages(void) { return 0; }
+#endif
+
 /** ion_page_pool_shrink - shrinks the size of the memory cached in the pool
  * @pool:		the pool
  * @gfp_mask:		the memory type to reclaim
diff --git a/drivers/staging/android/ion/ion_page_pool.c b/drivers/staging/android/ion/ion_page_pool.c
index 890d264..0ad1fb3 100644
--- a/drivers/staging/android/ion/ion_page_pool.c
+++ b/drivers/staging/android/ion/ion_page_pool.c
@@ -12,6 +12,13 @@
 
 #include "ion.h"
 
+/*
+ * We avoid atomic_long_t to minimize cache flushes at the cost of possible
+ * race which would result in a small accounting inaccuracy that we can
+ * tolerate.
+ */
+static long nr_total_pages;
+
 static inline struct page *ion_page_pool_alloc_pages(struct ion_page_pool *pool)
 {
 	if (fatal_signal_pending(current))
@@ -36,8 +43,9 @@
 		pool->low_count++;
 	}
 
-	mod_node_page_state(page_pgdat(page), NR_INDIRECTLY_RECLAIMABLE_BYTES,
-			    (1 << (PAGE_SHIFT + pool->order)));
+	nr_total_pages += 1 << pool->order;
+	mod_node_page_state(page_pgdat(page), NR_KERNEL_MISC_RECLAIMABLE,
+							1 << pool->order);
 	mutex_unlock(&pool->mutex);
 }
 
@@ -56,8 +64,9 @@
 	}
 
 	list_del(&page->lru);
-	mod_node_page_state(page_pgdat(page), NR_INDIRECTLY_RECLAIMABLE_BYTES,
-			    -(1 << (PAGE_SHIFT + pool->order)));
+	nr_total_pages -= 1 << pool->order;
+	mod_node_page_state(page_pgdat(page), NR_KERNEL_MISC_RECLAIMABLE,
+							-(1 << pool->order));
 	return page;
 }
 
@@ -97,6 +106,14 @@
 	return count << pool->order;
 }
 
+long ion_page_pool_nr_pages(void)
+{
+	/* Correct possible overflow caused by racing writes */
+	if (nr_total_pages < 0)
+		nr_total_pages = 0;
+	return nr_total_pages;
+}
+
 int ion_page_pool_shrink(struct ion_page_pool *pool, gfp_t gfp_mask,
 			 int nr_to_scan)
 {
diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
index 0b9ab1d..8e7b52a 100644
--- a/drivers/tee/tee_shm.c
+++ b/drivers/tee/tee_shm.c
@@ -263,6 +263,7 @@
 	shm->teedev = teedev;
 	shm->ctx = ctx;
 	shm->id = -1;
+	addr = untagged_addr(addr);
 	start = rounddown(addr, PAGE_SIZE);
 	shm->offset = addr - start;
 	shm->size = length;
diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
index dfd2324..5c15a63 100644
--- a/drivers/thermal/cpu_cooling.c
+++ b/drivers/thermal/cpu_cooling.c
@@ -31,6 +31,7 @@
 #include <linux/slab.h>
 #include <linux/cpu.h>
 #include <linux/cpu_cooling.h>
+#include <linux/energy_model.h>
 
 #include <trace/events/thermal.h>
 
@@ -49,19 +50,6 @@
  */
 
 /**
- * struct freq_table - frequency table along with power entries
- * @frequency:	frequency in KHz
- * @power:	power in mW
- *
- * This structure is built when the cooling device registers and helps
- * in translating frequency to power and vice versa.
- */
-struct freq_table {
-	u32 frequency;
-	u32 power;
-};
-
-/**
  * struct time_in_idle - Idle time stats
  * @time: previous reading of the absolute time that this cpu was idle
  * @timestamp: wall time of the last invocation of get_cpu_idle_time_us()
@@ -82,7 +70,7 @@
  *	frequency.
  * @max_level: maximum cooling level. One less than total number of valid
  *	cpufreq frequencies.
- * @freq_table: Freq table in descending order of frequencies
+ * @em: Reference on the Energy Model of the device
  * @cdev: thermal_cooling_device pointer to keep track of the
  *	registered cooling device.
  * @policy: cpufreq policy.
@@ -98,7 +86,7 @@
 	unsigned int cpufreq_state;
 	unsigned int clipped_freq;
 	unsigned int max_level;
-	struct freq_table *freq_table;	/* In descending order */
+	struct em_perf_domain *em;
 	struct thermal_cooling_device *cdev;
 	struct cpufreq_policy *policy;
 	struct list_head node;
@@ -112,26 +100,6 @@
 /* Below code defines functions to be used for cpufreq as cooling device */
 
 /**
- * get_level: Find the level for a particular frequency
- * @cpufreq_cdev: cpufreq_cdev for which the property is required
- * @freq: Frequency
- *
- * Return: level corresponding to the frequency.
- */
-static unsigned long get_level(struct cpufreq_cooling_device *cpufreq_cdev,
-			       unsigned int freq)
-{
-	struct freq_table *freq_table = cpufreq_cdev->freq_table;
-	unsigned long level;
-
-	for (level = 1; level <= cpufreq_cdev->max_level; level++)
-		if (freq > freq_table[level].frequency)
-			break;
-
-	return level - 1;
-}
-
-/**
  * cpufreq_thermal_notifier - notifier callback for cpufreq policy change.
  * @nb:	struct notifier_block * with callback info.
  * @event: value showing cpufreq event for which this function invoked.
@@ -184,105 +152,52 @@
 	return NOTIFY_OK;
 }
 
+#ifdef CONFIG_ENERGY_MODEL
 /**
- * update_freq_table() - Update the freq table with power numbers
- * @cpufreq_cdev:	the cpufreq cooling device in which to update the table
- * @capacitance: dynamic power coefficient for these cpus
+ * get_level: Find the level for a particular frequency
+ * @cpufreq_cdev: cpufreq_cdev for which the property is required
+ * @freq: Frequency
  *
- * Update the freq table with power numbers.  This table will be used in
- * cpu_power_to_freq() and cpu_freq_to_power() to convert between power and
- * frequency efficiently.  Power is stored in mW, frequency in KHz.  The
- * resulting table is in descending order.
- *
- * Return: 0 on success, -EINVAL if there are no OPPs for any CPUs,
- * or -ENOMEM if we run out of memory.
+ * Return: level corresponding to the frequency.
  */
-static int update_freq_table(struct cpufreq_cooling_device *cpufreq_cdev,
-			     u32 capacitance)
+static unsigned long get_level(struct cpufreq_cooling_device *cpufreq_cdev,
+			       unsigned int freq)
 {
-	struct freq_table *freq_table = cpufreq_cdev->freq_table;
-	struct dev_pm_opp *opp;
-	struct device *dev = NULL;
-	int num_opps = 0, cpu = cpufreq_cdev->policy->cpu, i;
+	int i;
 
-	dev = get_cpu_device(cpu);
-	if (unlikely(!dev)) {
-		dev_warn(&cpufreq_cdev->cdev->device,
-			 "No cpu device for cpu %d\n", cpu);
-		return -ENODEV;
+	for (i = cpufreq_cdev->max_level - 1; i >= 0; i--) {
+		if (freq > cpufreq_cdev->em->table[i].frequency)
+			break;
 	}
 
-	num_opps = dev_pm_opp_get_opp_count(dev);
-	if (num_opps < 0)
-		return num_opps;
-
-	/*
-	 * The cpufreq table is also built from the OPP table and so the count
-	 * should match.
-	 */
-	if (num_opps != cpufreq_cdev->max_level + 1) {
-		dev_warn(dev, "Number of OPPs not matching with max_levels\n");
-		return -EINVAL;
-	}
-
-	for (i = 0; i <= cpufreq_cdev->max_level; i++) {
-		unsigned long freq = freq_table[i].frequency * 1000;
-		u32 freq_mhz = freq_table[i].frequency / 1000;
-		u64 power;
-		u32 voltage_mv;
-
-		/*
-		 * Find ceil frequency as 'freq' may be slightly lower than OPP
-		 * freq due to truncation while converting to kHz.
-		 */
-		opp = dev_pm_opp_find_freq_ceil(dev, &freq);
-		if (IS_ERR(opp)) {
-			dev_err(dev, "failed to get opp for %lu frequency\n",
-				freq);
-			return -EINVAL;
-		}
-
-		voltage_mv = dev_pm_opp_get_voltage(opp) / 1000;
-		dev_pm_opp_put(opp);
-
-		/*
-		 * Do the multiplication with MHz and millivolt so as
-		 * to not overflow.
-		 */
-		power = (u64)capacitance * freq_mhz * voltage_mv * voltage_mv;
-		do_div(power, 1000000000);
-
-		/* power is stored in mW */
-		freq_table[i].power = power;
-	}
-
-	return 0;
+	return cpufreq_cdev->max_level - i - 1;
 }
 
+
 static u32 cpu_freq_to_power(struct cpufreq_cooling_device *cpufreq_cdev,
 			     u32 freq)
 {
 	int i;
-	struct freq_table *freq_table = cpufreq_cdev->freq_table;
 
-	for (i = 1; i <= cpufreq_cdev->max_level; i++)
-		if (freq > freq_table[i].frequency)
+	for (i = cpufreq_cdev->max_level - 1; i >= 0; i--) {
+		if (freq > cpufreq_cdev->em->table[i].frequency)
 			break;
+	}
 
-	return freq_table[i - 1].power;
+	return cpufreq_cdev->em->table[i + 1].power;
 }
 
 static u32 cpu_power_to_freq(struct cpufreq_cooling_device *cpufreq_cdev,
 			     u32 power)
 {
 	int i;
-	struct freq_table *freq_table = cpufreq_cdev->freq_table;
 
-	for (i = 1; i <= cpufreq_cdev->max_level; i++)
-		if (power > freq_table[i].power)
+	for (i = cpufreq_cdev->max_level - 1; i >= 0; i--) {
+		if (power > cpufreq_cdev->em->table[i].power)
 			break;
+	}
 
-	return freq_table[i - 1].frequency;
+	return cpufreq_cdev->em->table[i + 1].frequency;
 }
 
 /**
@@ -332,6 +247,7 @@
 	raw_cpu_power = cpu_freq_to_power(cpufreq_cdev, freq);
 	return (raw_cpu_power * cpufreq_cdev->last_load) / 100;
 }
+#endif
 
 /* cpufreq cooling device callback functions are defined below */
 
@@ -374,6 +290,30 @@
 	return 0;
 }
 
+static unsigned int get_state_freq(struct cpufreq_cooling_device *cpufreq_cdev,
+			      unsigned long state)
+{
+	struct cpufreq_policy *policy;
+	unsigned long idx;
+
+#ifdef CONFIG_ENERGY_MODEL
+	/* Use the Energy Model table if available */
+	if (cpufreq_cdev->em) {
+		idx = cpufreq_cdev->max_level - state;
+		return cpufreq_cdev->em->table[idx].frequency;
+	}
+#endif
+
+	/* Otherwise, fallback on the CPUFreq table */
+	policy = cpufreq_cdev->policy;
+	if (policy->freq_table_sorted == CPUFREQ_TABLE_SORTED_ASCENDING)
+		idx = cpufreq_cdev->max_level - state;
+	else
+		idx = state;
+
+	return policy->freq_table[idx].frequency;
+}
+
 /**
  * cpufreq_set_cur_state - callback function to set the current cooling state.
  * @cdev: thermal cooling device pointer.
@@ -398,7 +338,7 @@
 	if (cpufreq_cdev->cpufreq_state == state)
 		return 0;
 
-	clip_freq = cpufreq_cdev->freq_table[state].frequency;
+	clip_freq = get_state_freq(cpufreq_cdev, state);
 	cpufreq_cdev->cpufreq_state = state;
 	cpufreq_cdev->clipped_freq = clip_freq;
 
@@ -407,6 +347,7 @@
 	return 0;
 }
 
+#ifdef CONFIG_ENERGY_MODEL
 /**
  * cpufreq_get_requested_power() - get the current power
  * @cdev:	&thermal_cooling_device pointer
@@ -497,7 +438,7 @@
 			       struct thermal_zone_device *tz,
 			       unsigned long state, u32 *power)
 {
-	unsigned int freq, num_cpus;
+	unsigned int freq, num_cpus, idx;
 	struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata;
 
 	/* Request state should be less than max_level */
@@ -506,7 +447,8 @@
 
 	num_cpus = cpumask_weight(cpufreq_cdev->policy->cpus);
 
-	freq = cpufreq_cdev->freq_table[state].frequency;
+	idx = cpufreq_cdev->max_level - state;
+	freq = cpufreq_cdev->em->table[idx].frequency;
 	*power = cpu_freq_to_power(cpufreq_cdev, freq) * num_cpus;
 
 	return 0;
@@ -553,14 +495,6 @@
 	return 0;
 }
 
-/* Bind cpufreq callbacks to thermal cooling device ops */
-
-static struct thermal_cooling_device_ops cpufreq_cooling_ops = {
-	.get_max_state = cpufreq_get_max_state,
-	.get_cur_state = cpufreq_get_cur_state,
-	.set_cur_state = cpufreq_set_cur_state,
-};
-
 static struct thermal_cooling_device_ops cpufreq_power_cooling_ops = {
 	.get_max_state		= cpufreq_get_max_state,
 	.get_cur_state		= cpufreq_get_cur_state,
@@ -569,32 +503,27 @@
 	.state2power		= cpufreq_state2power,
 	.power2state		= cpufreq_power2state,
 };
+#endif
+
+/* Bind cpufreq callbacks to thermal cooling device ops */
+
+static struct thermal_cooling_device_ops cpufreq_cooling_ops = {
+	.get_max_state = cpufreq_get_max_state,
+	.get_cur_state = cpufreq_get_cur_state,
+	.set_cur_state = cpufreq_set_cur_state,
+};
 
 /* Notifier for cpufreq policy change */
 static struct notifier_block thermal_cpufreq_notifier_block = {
 	.notifier_call = cpufreq_thermal_notifier,
 };
 
-static unsigned int find_next_max(struct cpufreq_frequency_table *table,
-				  unsigned int prev_max)
-{
-	struct cpufreq_frequency_table *pos;
-	unsigned int max = 0;
-
-	cpufreq_for_each_valid_entry(pos, table) {
-		if (pos->frequency > max && pos->frequency < prev_max)
-			max = pos->frequency;
-	}
-
-	return max;
-}
-
 /**
  * __cpufreq_cooling_register - helper function to create cpufreq cooling device
  * @np: a valid struct device_node to the cooling device device tree node
  * @policy: cpufreq policy
  * Normally this should be same as cpufreq policy->related_cpus.
- * @capacitance: dynamic power coefficient for these cpus
+ * @try_model: true if a power model should be used
  *
  * This interface function registers the cpufreq cooling device with the name
  * "thermal-cpufreq-%x". This api can support multiple instances of cpufreq
@@ -606,12 +535,12 @@
  */
 static struct thermal_cooling_device *
 __cpufreq_cooling_register(struct device_node *np,
-			struct cpufreq_policy *policy, u32 capacitance)
+			struct cpufreq_policy *policy, bool try_model)
 {
 	struct thermal_cooling_device *cdev;
 	struct cpufreq_cooling_device *cpufreq_cdev;
 	char dev_name[THERMAL_NAME_LENGTH];
-	unsigned int freq, i, num_cpus;
+	unsigned int i, num_cpus;
 	int ret;
 	struct thermal_cooling_device_ops *cooling_ops;
 	bool first;
@@ -645,54 +574,37 @@
 	/* max_level is an index, not a counter */
 	cpufreq_cdev->max_level = i - 1;
 
-	cpufreq_cdev->freq_table = kmalloc_array(i,
-					sizeof(*cpufreq_cdev->freq_table),
-					GFP_KERNEL);
-	if (!cpufreq_cdev->freq_table) {
-		cdev = ERR_PTR(-ENOMEM);
-		goto free_idle_time;
-	}
+#ifdef CONFIG_ENERGY_MODEL
+	if (try_model) {
+		struct em_perf_domain *em = em_cpu_get(policy->cpu);
+
+		if (!em || !cpumask_equal(policy->related_cpus,
+					  to_cpumask(em->cpus))) {
+			cdev = ERR_PTR(-EINVAL);
+			goto free_idle_time;
+		}
+		cpufreq_cdev->em = em;
+		cooling_ops = &cpufreq_power_cooling_ops;
+	} else
+#endif
+		cooling_ops = &cpufreq_cooling_ops;
 
 	ret = ida_simple_get(&cpufreq_ida, 0, 0, GFP_KERNEL);
 	if (ret < 0) {
 		cdev = ERR_PTR(ret);
-		goto free_table;
+		goto free_idle_time;
 	}
 	cpufreq_cdev->id = ret;
 
 	snprintf(dev_name, sizeof(dev_name), "thermal-cpufreq-%d",
 		 cpufreq_cdev->id);
 
-	/* Fill freq-table in descending order of frequencies */
-	for (i = 0, freq = -1; i <= cpufreq_cdev->max_level; i++) {
-		freq = find_next_max(policy->freq_table, freq);
-		cpufreq_cdev->freq_table[i].frequency = freq;
-
-		/* Warn for duplicate entries */
-		if (!freq)
-			pr_warn("%s: table has duplicate entries\n", __func__);
-		else
-			pr_debug("%s: freq:%u KHz\n", __func__, freq);
-	}
-
-	if (capacitance) {
-		ret = update_freq_table(cpufreq_cdev, capacitance);
-		if (ret) {
-			cdev = ERR_PTR(ret);
-			goto remove_ida;
-		}
-
-		cooling_ops = &cpufreq_power_cooling_ops;
-	} else {
-		cooling_ops = &cpufreq_cooling_ops;
-	}
-
 	cdev = thermal_of_cooling_device_register(np, dev_name, cpufreq_cdev,
 						  cooling_ops);
 	if (IS_ERR(cdev))
 		goto remove_ida;
 
-	cpufreq_cdev->clipped_freq = cpufreq_cdev->freq_table[0].frequency;
+	cpufreq_cdev->clipped_freq = get_state_freq(cpufreq_cdev, 0);
 	cpufreq_cdev->cdev = cdev;
 
 	mutex_lock(&cooling_list_lock);
@@ -709,8 +621,6 @@
 
 remove_ida:
 	ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id);
-free_table:
-	kfree(cpufreq_cdev->freq_table);
 free_idle_time:
 	kfree(cpufreq_cdev->idle_time);
 free_cdev:
@@ -732,7 +642,7 @@
 struct thermal_cooling_device *
 cpufreq_cooling_register(struct cpufreq_policy *policy)
 {
-	return __cpufreq_cooling_register(NULL, policy, 0);
+	return __cpufreq_cooling_register(NULL, policy, false);
 }
 EXPORT_SYMBOL_GPL(cpufreq_cooling_register);
 
@@ -760,7 +670,6 @@
 {
 	struct device_node *np = of_get_cpu_node(policy->cpu, NULL);
 	struct thermal_cooling_device *cdev = NULL;
-	u32 capacitance = 0;
 
 	if (!np) {
 		pr_err("cpu_cooling: OF node not available for cpu%d\n",
@@ -769,10 +678,7 @@
 	}
 
 	if (of_find_property(np, "#cooling-cells", NULL)) {
-		of_property_read_u32(np, "dynamic-power-coefficient",
-				     &capacitance);
-
-		cdev = __cpufreq_cooling_register(np, policy, capacitance);
+		cdev = __cpufreq_cooling_register(np, policy, true);
 		if (IS_ERR(cdev)) {
 			pr_err("cpu_cooling: cpu%d is not running as cooling device: %ld\n",
 			       policy->cpu, PTR_ERR(cdev));
@@ -814,7 +720,6 @@
 	thermal_cooling_device_unregister(cpufreq_cdev->cdev);
 	ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id);
 	kfree(cpufreq_cdev->idle_time);
-	kfree(cpufreq_cdev->freq_table);
 	kfree(cpufreq_cdev);
 }
 EXPORT_SYMBOL_GPL(cpufreq_cooling_unregister);
diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c
index 9db93f5..21c6978 100644
--- a/drivers/tty/serdev/core.c
+++ b/drivers/tty/serdev/core.c
@@ -30,7 +30,18 @@
 	if (len != -ENODEV)
 		return len;
 
-	return of_device_modalias(dev, buf, PAGE_SIZE);
+	len = of_device_modalias(dev, buf, PAGE_SIZE);
+	if (len != -ENODEV)
+		return len;
+
+	if (dev->parent->parent->bus == &platform_bus_type) {
+		struct platform_device *pdev =
+			to_platform_device(dev->parent->parent);
+
+		len = snprintf(buf, PAGE_SIZE, "platform:%s\n", pdev->name);
+	}
+
+	return len;
 }
 static DEVICE_ATTR_RO(modalias);
 
@@ -44,13 +55,18 @@
 {
 	int rc;
 
-	/* TODO: platform modalias */
-
 	rc = acpi_device_uevent_modalias(dev, env);
 	if (rc != -ENODEV)
 		return rc;
 
-	return of_device_uevent_modalias(dev, env);
+	rc = of_device_uevent_modalias(dev, env);
+	if (rc != -ENODEV)
+		return rc;
+
+	if (dev->parent->parent->bus == &platform_bus_type)
+		rc = dev->parent->parent->bus->uevent(dev, env);
+
+	return rc;
 }
 
 static void serdev_device_release(struct device *dev)
@@ -86,11 +102,17 @@
 	if (!is_serdev_device(dev))
 		return 0;
 
-	/* TODO: platform matching */
 	if (acpi_driver_match_device(dev, drv))
 		return 1;
 
-	return of_driver_match_device(dev, drv);
+	if (of_driver_match_device(dev, drv))
+		return 1;
+
+	if (dev->parent->parent->bus == &platform_bus_type &&
+	    dev->parent->parent->bus->match(dev, drv))
+		return 1;
+
+	return 0;
 }
 
 /**
@@ -564,6 +586,33 @@
 }
 #endif /* CONFIG_ACPI */
 
+static int platform_serdev_register_devices(struct serdev_controller *ctrl)
+{
+	struct serdev_device *serdev;
+	int err;
+
+	if (ctrl->dev.parent->bus != &platform_bus_type)
+		return -ENODEV;
+
+	serdev = serdev_device_alloc(ctrl);
+	if (!serdev) {
+		dev_err(&ctrl->dev, "failed to allocate serdev device for %s\n",
+				    dev_name(ctrl->dev.parent));
+		return -ENOMEM;
+	}
+
+	pm_runtime_no_callbacks(&serdev->dev);
+
+	err = serdev_device_add(serdev);
+	if (err) {
+		dev_err(&serdev->dev,
+			"failure adding device. status %d\n", err);
+		serdev_device_put(serdev);
+	}
+
+	return err;
+}
+
 /**
  * serdev_controller_add() - Add an serdev controller
  * @ctrl:	controller to be registered.
@@ -573,7 +622,7 @@
  */
 int serdev_controller_add(struct serdev_controller *ctrl)
 {
-	int ret_of, ret_acpi, ret;
+	int ret_of, ret_acpi, ret_platform, ret;
 
 	/* Can't register until after driver model init */
 	if (WARN_ON(!is_registered))
@@ -587,9 +636,11 @@
 
 	ret_of = of_serdev_register_devices(ctrl);
 	ret_acpi = acpi_serdev_register_devices(ctrl);
-	if (ret_of && ret_acpi) {
-		dev_dbg(&ctrl->dev, "no devices registered: of:%d acpi:%d\n",
-			ret_of, ret_acpi);
+	ret_platform = platform_serdev_register_devices(ctrl);
+	if (ret_of && ret_acpi && ret_platform) {
+		dev_dbg(&ctrl->dev, "no devices registered: of:%d acpi:%d "
+				    "platform:%d\n",
+				    ret_of, ret_acpi, ret_platform);
 		ret = -ENODEV;
 		goto err_rpm_disable;
 	}
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index 31cce78..88b9e75d 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -215,6 +215,12 @@
 config USB_F_TCM
 	tristate
 
+config USB_F_ACC
+	tristate
+
+config USB_F_AUDIO_SRC
+	tristate
+
 # this first set of drivers all depend on bulk-capable hardware.
 
 config USB_CONFIGFS
@@ -229,6 +235,14 @@
 	  appropriate symbolic links.
 	  For more information see Documentation/usb/gadget_configfs.txt.
 
+config USB_CONFIGFS_UEVENT
+	bool "Uevent notification of Gadget state"
+	depends on USB_CONFIGFS
+	help
+	  Enable uevent notifications to userspace when the gadget
+	  state changes. The gadget can be in any of the following
+	  three states: "CONNECTED/DISCONNECTED/CONFIGURED"
+
 config USB_CONFIGFS_SERIAL
 	bool "Generic serial bulk in/out"
 	depends on USB_CONFIGFS
@@ -368,6 +382,23 @@
 	  implemented in kernel space (for instance Ethernet, serial or
 	  mass storage) and other are implemented in user space.
 
+config USB_CONFIGFS_F_ACC
+	bool "Accessory gadget"
+	depends on USB_CONFIGFS
+	depends on HID=y
+	select USB_F_ACC
+	help
+	  USB gadget Accessory support
+
+config USB_CONFIGFS_F_AUDIO_SRC
+	bool "Audio Source gadget"
+	depends on USB_CONFIGFS
+	depends on SND
+	select SND_PCM
+	select USB_F_AUDIO_SRC
+	help
+	  USB gadget Audio Source support
+
 config USB_CONFIGFS_F_UAC1
 	bool "Audio Class 1.0"
 	depends on USB_CONFIGFS
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index ab9ac48..a47a958 100644
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -10,6 +10,31 @@
 #include "u_f.h"
 #include "u_os_desc.h"
 
+#ifdef CONFIG_USB_CONFIGFS_UEVENT
+#include <linux/platform_device.h>
+#include <linux/kdev_t.h>
+#include <linux/usb/ch9.h>
+
+#ifdef CONFIG_USB_CONFIGFS_F_ACC
+extern int acc_ctrlrequest(struct usb_composite_dev *cdev,
+				const struct usb_ctrlrequest *ctrl);
+void acc_disconnect(void);
+#endif
+static struct class *android_class;
+static struct device *android_device;
+static int index;
+
+struct device *create_function_device(char *name)
+{
+	if (android_device && !IS_ERR(android_device))
+		return device_create(android_class, android_device,
+			MKDEV(0, index++), NULL, name);
+	else
+		return ERR_PTR(-EINVAL);
+}
+EXPORT_SYMBOL_GPL(create_function_device);
+#endif
+
 int check_user_usb_string(const char *name,
 		struct usb_gadget_strings *stringtab_dev)
 {
@@ -63,6 +88,12 @@
 	char qw_sign[OS_STRING_QW_SIGN_LEN];
 	spinlock_t spinlock;
 	bool unbind;
+#ifdef CONFIG_USB_CONFIGFS_UEVENT
+	bool connected;
+	bool sw_connected;
+	struct work_struct work;
+	struct device *dev;
+#endif
 };
 
 static inline struct gadget_info *to_gadget_info(struct config_item *item)
@@ -268,7 +299,7 @@
 
 	mutex_lock(&gi->lock);
 
-	if (!strlen(name)) {
+	if (!strlen(name) || strcmp(name, "none") == 0) {
 		ret = unregister_gadget(gi);
 		if (ret)
 			goto err;
@@ -1375,6 +1406,60 @@
 	return ret;
 }
 
+#ifdef CONFIG_USB_CONFIGFS_UEVENT
+static void android_work(struct work_struct *data)
+{
+	struct gadget_info *gi = container_of(data, struct gadget_info, work);
+	struct usb_composite_dev *cdev = &gi->cdev;
+	char *disconnected[2] = { "USB_STATE=DISCONNECTED", NULL };
+	char *connected[2]    = { "USB_STATE=CONNECTED", NULL };
+	char *configured[2]   = { "USB_STATE=CONFIGURED", NULL };
+	/* 0-connected 1-configured 2-disconnected*/
+	bool status[3] = { false, false, false };
+	unsigned long flags;
+	bool uevent_sent = false;
+
+	spin_lock_irqsave(&cdev->lock, flags);
+	if (cdev->config)
+		status[1] = true;
+
+	if (gi->connected != gi->sw_connected) {
+		if (gi->connected)
+			status[0] = true;
+		else
+			status[2] = true;
+		gi->sw_connected = gi->connected;
+	}
+	spin_unlock_irqrestore(&cdev->lock, flags);
+
+	if (status[0]) {
+		kobject_uevent_env(&android_device->kobj,
+					KOBJ_CHANGE, connected);
+		pr_info("%s: sent uevent %s\n", __func__, connected[0]);
+		uevent_sent = true;
+	}
+
+	if (status[1]) {
+		kobject_uevent_env(&android_device->kobj,
+					KOBJ_CHANGE, configured);
+		pr_info("%s: sent uevent %s\n", __func__, configured[0]);
+		uevent_sent = true;
+	}
+
+	if (status[2]) {
+		kobject_uevent_env(&android_device->kobj,
+					KOBJ_CHANGE, disconnected);
+		pr_info("%s: sent uevent %s\n", __func__, disconnected[0]);
+		uevent_sent = true;
+	}
+
+	if (!uevent_sent) {
+		pr_info("%s: did not send uevent (%d %d %p)\n", __func__,
+			gi->connected, gi->sw_connected, cdev->config);
+	}
+}
+#endif
+
 static void configfs_composite_unbind(struct usb_gadget *gadget)
 {
 	struct usb_composite_dev	*cdev;
@@ -1491,14 +1576,91 @@
 	spin_unlock_irqrestore(&gi->spinlock, flags);
 }
 
+#ifdef CONFIG_USB_CONFIGFS_UEVENT
+static int android_setup(struct usb_gadget *gadget,
+			const struct usb_ctrlrequest *c)
+{
+	struct usb_composite_dev *cdev = get_gadget_data(gadget);
+	unsigned long flags;
+	struct gadget_info *gi = container_of(cdev, struct gadget_info, cdev);
+	int value = -EOPNOTSUPP;
+	struct usb_function_instance *fi;
+
+	spin_lock_irqsave(&cdev->lock, flags);
+	if (!gi->connected) {
+		gi->connected = 1;
+		schedule_work(&gi->work);
+	}
+	spin_unlock_irqrestore(&cdev->lock, flags);
+	list_for_each_entry(fi, &gi->available_func, cfs_list) {
+		if (fi != NULL && fi->f != NULL && fi->f->setup != NULL) {
+			value = fi->f->setup(fi->f, c);
+			if (value >= 0)
+				break;
+		}
+	}
+
+#ifdef CONFIG_USB_CONFIGFS_F_ACC
+	if (value < 0)
+		value = acc_ctrlrequest(cdev, c);
+#endif
+
+	if (value < 0)
+		value = composite_setup(gadget, c);
+
+	spin_lock_irqsave(&cdev->lock, flags);
+	if (c->bRequest == USB_REQ_SET_CONFIGURATION &&
+						cdev->config) {
+		schedule_work(&gi->work);
+	}
+	spin_unlock_irqrestore(&cdev->lock, flags);
+
+	return value;
+}
+
+static void android_disconnect(struct usb_gadget *gadget)
+{
+	struct usb_composite_dev        *cdev = get_gadget_data(gadget);
+	struct gadget_info *gi = container_of(cdev, struct gadget_info, cdev);
+
+	/* FIXME: There's a race between usb_gadget_udc_stop() which is likely
+	 * to set the gadget driver to NULL in the udc driver and this drivers
+	 * gadget disconnect fn which likely checks for the gadget driver to
+	 * be a null ptr. It happens that unbind (doing set_gadget_data(NULL))
+	 * is called before the gadget driver is set to NULL and the udc driver
+	 * calls disconnect fn which results in cdev being a null ptr.
+	 */
+	if (cdev == NULL) {
+		WARN(1, "%s: gadget driver already disconnected\n", __func__);
+		return;
+	}
+
+	/* accessory HID support can be active while the
+		accessory function is not actually enabled,
+		so we need to inform it when we are disconnected.
+	*/
+
+#ifdef CONFIG_USB_CONFIGFS_F_ACC
+	acc_disconnect();
+#endif
+	gi->connected = 0;
+	schedule_work(&gi->work);
+	composite_disconnect(gadget);
+}
+#endif
+
 static const struct usb_gadget_driver configfs_driver_template = {
 	.bind           = configfs_composite_bind,
 	.unbind         = configfs_composite_unbind,
-
+#ifdef CONFIG_USB_CONFIGFS_UEVENT
+	.setup          = android_setup,
+	.reset          = android_disconnect,
+	.disconnect     = android_disconnect,
+#else
 	.setup          = configfs_composite_setup,
 	.reset          = configfs_composite_disconnect,
 	.disconnect     = configfs_composite_disconnect,
-
+#endif
 	.suspend	= configfs_composite_suspend,
 	.resume		= configfs_composite_resume,
 
@@ -1510,6 +1672,89 @@
 	.match_existing_only = 1,
 };
 
+#ifdef CONFIG_USB_CONFIGFS_UEVENT
+static ssize_t state_show(struct device *pdev, struct device_attribute *attr,
+			char *buf)
+{
+	struct gadget_info *dev = dev_get_drvdata(pdev);
+	struct usb_composite_dev *cdev;
+	char *state = "DISCONNECTED";
+	unsigned long flags;
+
+	if (!dev)
+		goto out;
+
+	cdev = &dev->cdev;
+
+	if (!cdev)
+		goto out;
+
+	spin_lock_irqsave(&cdev->lock, flags);
+	if (cdev->config)
+		state = "CONFIGURED";
+	else if (dev->connected)
+		state = "CONNECTED";
+	spin_unlock_irqrestore(&cdev->lock, flags);
+out:
+	return sprintf(buf, "%s\n", state);
+}
+
+static DEVICE_ATTR(state, S_IRUGO, state_show, NULL);
+
+static struct device_attribute *android_usb_attributes[] = {
+	&dev_attr_state,
+	NULL
+};
+
+static int android_device_create(struct gadget_info *gi)
+{
+	struct device_attribute **attrs;
+	struct device_attribute *attr;
+
+	INIT_WORK(&gi->work, android_work);
+	android_device = device_create(android_class, NULL,
+				MKDEV(0, 0), NULL, "android0");
+	if (IS_ERR(android_device))
+		return PTR_ERR(android_device);
+
+	dev_set_drvdata(android_device, gi);
+
+	attrs = android_usb_attributes;
+	while ((attr = *attrs++)) {
+		int err;
+
+		err = device_create_file(android_device, attr);
+		if (err) {
+			device_destroy(android_device->class,
+				       android_device->devt);
+			return err;
+		}
+	}
+
+	return 0;
+}
+
+static void android_device_destroy(void)
+{
+	struct device_attribute **attrs;
+	struct device_attribute *attr;
+
+	attrs = android_usb_attributes;
+	while ((attr = *attrs++))
+		device_remove_file(android_device, attr);
+	device_destroy(android_device->class, android_device->devt);
+}
+#else
+static inline int android_device_create(struct gadget_info *gi)
+{
+	return 0;
+}
+
+static inline void android_device_destroy(void)
+{
+}
+#endif
+
 static struct config_group *gadgets_make(
 		struct config_group *group,
 		const char *name)
@@ -1562,7 +1807,11 @@
 	if (!gi->composite.gadget_driver.function)
 		goto err;
 
+	if (android_device_create(gi) < 0)
+		goto err;
+
 	return &gi->group;
+
 err:
 	kfree(gi);
 	return ERR_PTR(-ENOMEM);
@@ -1571,6 +1820,7 @@
 static void gadgets_drop(struct config_group *group, struct config_item *item)
 {
 	config_item_put(item);
+	android_device_destroy();
 }
 
 static struct configfs_group_operations gadgets_ops = {
@@ -1610,6 +1860,13 @@
 	config_group_init(&gadget_subsys.su_group);
 
 	ret = configfs_register_subsystem(&gadget_subsys);
+
+#ifdef CONFIG_USB_CONFIGFS_UEVENT
+	android_class = class_create(THIS_MODULE, "android_usb");
+	if (IS_ERR(android_class))
+		return PTR_ERR(android_class);
+#endif
+
 	return ret;
 }
 module_init(gadget_cfs_init);
@@ -1617,5 +1874,10 @@
 static void __exit gadget_cfs_exit(void)
 {
 	configfs_unregister_subsystem(&gadget_subsys);
+#ifdef CONFIG_USB_CONFIGFS_UEVENT
+	if (!IS_ERR(android_class))
+		class_destroy(android_class);
+#endif
+
 }
 module_exit(gadget_cfs_exit);
diff --git a/drivers/usb/gadget/function/Makefile b/drivers/usb/gadget/function/Makefile
index 5d3a6cf..dd33a12 100644
--- a/drivers/usb/gadget/function/Makefile
+++ b/drivers/usb/gadget/function/Makefile
@@ -50,3 +50,7 @@
 obj-$(CONFIG_USB_F_PRINTER)	+= usb_f_printer.o
 usb_f_tcm-y			:= f_tcm.o
 obj-$(CONFIG_USB_F_TCM)		+= usb_f_tcm.o
+usb_f_accessory-y		:= f_accessory.o
+obj-$(CONFIG_USB_F_ACC)		+= usb_f_accessory.o
+usb_f_audio_source-y		:= f_audio_source.o
+obj-$(CONFIG_USB_F_AUDIO_SRC)	+= usb_f_audio_source.o
diff --git a/drivers/usb/gadget/function/f_accessory.c b/drivers/usb/gadget/function/f_accessory.c
new file mode 100644
index 0000000..7aa2656
--- /dev/null
+++ b/drivers/usb/gadget/function/f_accessory.c
@@ -0,0 +1,1352 @@
+/*
+ * Gadget Function Driver for Android USB accessories
+ *
+ * Copyright (C) 2011 Google, Inc.
+ * Author: Mike Lockwood <lockwood@android.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ *
+ */
+
+/* #define DEBUG */
+/* #define VERBOSE_DEBUG */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/poll.h>
+#include <linux/delay.h>
+#include <linux/wait.h>
+#include <linux/err.h>
+#include <linux/interrupt.h>
+#include <linux/kthread.h>
+#include <linux/freezer.h>
+
+#include <linux/types.h>
+#include <linux/file.h>
+#include <linux/device.h>
+#include <linux/miscdevice.h>
+
+#include <linux/hid.h>
+#include <linux/hiddev.h>
+#include <linux/usb.h>
+#include <linux/usb/ch9.h>
+#include <linux/usb/f_accessory.h>
+
+#include <linux/configfs.h>
+#include <linux/usb/composite.h>
+
+#define MAX_INST_NAME_LEN        40
+#define BULK_BUFFER_SIZE    16384
+#define ACC_STRING_SIZE     256
+
+#define PROTOCOL_VERSION    2
+
+/* String IDs */
+#define INTERFACE_STRING_INDEX	0
+
+/* number of tx and rx requests to allocate */
+#define TX_REQ_MAX 4
+#define RX_REQ_MAX 2
+
+struct acc_hid_dev {
+	struct list_head	list;
+	struct hid_device *hid;
+	struct acc_dev *dev;
+	/* accessory defined ID */
+	int id;
+	/* HID report descriptor */
+	u8 *report_desc;
+	/* length of HID report descriptor */
+	int report_desc_len;
+	/* number of bytes of report_desc we have received so far */
+	int report_desc_offset;
+};
+
+struct acc_dev {
+	struct usb_function function;
+	struct usb_composite_dev *cdev;
+	spinlock_t lock;
+
+	struct usb_ep *ep_in;
+	struct usb_ep *ep_out;
+
+	/* online indicates state of function_set_alt & function_unbind
+	 * set to 1 when we connect
+	 */
+	int online:1;
+
+	/* disconnected indicates state of open & release
+	 * Set to 1 when we disconnect.
+	 * Not cleared until our file is closed.
+	 */
+	int disconnected:1;
+
+	/* strings sent by the host */
+	char manufacturer[ACC_STRING_SIZE];
+	char model[ACC_STRING_SIZE];
+	char description[ACC_STRING_SIZE];
+	char version[ACC_STRING_SIZE];
+	char uri[ACC_STRING_SIZE];
+	char serial[ACC_STRING_SIZE];
+
+	/* for acc_complete_set_string */
+	int string_index;
+
+	/* set to 1 if we have a pending start request */
+	int start_requested;
+
+	int audio_mode;
+
+	/* synchronize access to our device file */
+	atomic_t open_excl;
+
+	struct list_head tx_idle;
+
+	wait_queue_head_t read_wq;
+	wait_queue_head_t write_wq;
+	struct usb_request *rx_req[RX_REQ_MAX];
+	int rx_done;
+
+	/* delayed work for handling ACCESSORY_START */
+	struct delayed_work start_work;
+
+	/* worker for registering and unregistering hid devices */
+	struct work_struct hid_work;
+
+	/* list of active HID devices */
+	struct list_head	hid_list;
+
+	/* list of new HID devices to register */
+	struct list_head	new_hid_list;
+
+	/* list of dead HID devices to unregister */
+	struct list_head	dead_hid_list;
+};
+
+static struct usb_interface_descriptor acc_interface_desc = {
+	.bLength                = USB_DT_INTERFACE_SIZE,
+	.bDescriptorType        = USB_DT_INTERFACE,
+	.bInterfaceNumber       = 0,
+	.bNumEndpoints          = 2,
+	.bInterfaceClass        = USB_CLASS_VENDOR_SPEC,
+	.bInterfaceSubClass     = USB_SUBCLASS_VENDOR_SPEC,
+	.bInterfaceProtocol     = 0,
+};
+
+static struct usb_endpoint_descriptor acc_highspeed_in_desc = {
+	.bLength                = USB_DT_ENDPOINT_SIZE,
+	.bDescriptorType        = USB_DT_ENDPOINT,
+	.bEndpointAddress       = USB_DIR_IN,
+	.bmAttributes           = USB_ENDPOINT_XFER_BULK,
+	.wMaxPacketSize         = __constant_cpu_to_le16(512),
+};
+
+static struct usb_endpoint_descriptor acc_highspeed_out_desc = {
+	.bLength                = USB_DT_ENDPOINT_SIZE,
+	.bDescriptorType        = USB_DT_ENDPOINT,
+	.bEndpointAddress       = USB_DIR_OUT,
+	.bmAttributes           = USB_ENDPOINT_XFER_BULK,
+	.wMaxPacketSize         = __constant_cpu_to_le16(512),
+};
+
+static struct usb_endpoint_descriptor acc_fullspeed_in_desc = {
+	.bLength                = USB_DT_ENDPOINT_SIZE,
+	.bDescriptorType        = USB_DT_ENDPOINT,
+	.bEndpointAddress       = USB_DIR_IN,
+	.bmAttributes           = USB_ENDPOINT_XFER_BULK,
+};
+
+static struct usb_endpoint_descriptor acc_fullspeed_out_desc = {
+	.bLength                = USB_DT_ENDPOINT_SIZE,
+	.bDescriptorType        = USB_DT_ENDPOINT,
+	.bEndpointAddress       = USB_DIR_OUT,
+	.bmAttributes           = USB_ENDPOINT_XFER_BULK,
+};
+
+static struct usb_descriptor_header *fs_acc_descs[] = {
+	(struct usb_descriptor_header *) &acc_interface_desc,
+	(struct usb_descriptor_header *) &acc_fullspeed_in_desc,
+	(struct usb_descriptor_header *) &acc_fullspeed_out_desc,
+	NULL,
+};
+
+static struct usb_descriptor_header *hs_acc_descs[] = {
+	(struct usb_descriptor_header *) &acc_interface_desc,
+	(struct usb_descriptor_header *) &acc_highspeed_in_desc,
+	(struct usb_descriptor_header *) &acc_highspeed_out_desc,
+	NULL,
+};
+
+static struct usb_string acc_string_defs[] = {
+	[INTERFACE_STRING_INDEX].s	= "Android Accessory Interface",
+	{  },	/* end of list */
+};
+
+static struct usb_gadget_strings acc_string_table = {
+	.language		= 0x0409,	/* en-US */
+	.strings		= acc_string_defs,
+};
+
+static struct usb_gadget_strings *acc_strings[] = {
+	&acc_string_table,
+	NULL,
+};
+
+/* temporary variable used between acc_open() and acc_gadget_bind() */
+static struct acc_dev *_acc_dev;
+
+struct acc_instance {
+	struct usb_function_instance func_inst;
+	const char *name;
+};
+
+static inline struct acc_dev *func_to_dev(struct usb_function *f)
+{
+	return container_of(f, struct acc_dev, function);
+}
+
+static struct usb_request *acc_request_new(struct usb_ep *ep, int buffer_size)
+{
+	struct usb_request *req = usb_ep_alloc_request(ep, GFP_KERNEL);
+
+	if (!req)
+		return NULL;
+
+	/* now allocate buffers for the requests */
+	req->buf = kmalloc(buffer_size, GFP_KERNEL);
+	if (!req->buf) {
+		usb_ep_free_request(ep, req);
+		return NULL;
+	}
+
+	return req;
+}
+
+static void acc_request_free(struct usb_request *req, struct usb_ep *ep)
+{
+	if (req) {
+		kfree(req->buf);
+		usb_ep_free_request(ep, req);
+	}
+}
+
+/* add a request to the tail of a list */
+static void req_put(struct acc_dev *dev, struct list_head *head,
+		struct usb_request *req)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&dev->lock, flags);
+	list_add_tail(&req->list, head);
+	spin_unlock_irqrestore(&dev->lock, flags);
+}
+
+/* remove a request from the head of a list */
+static struct usb_request *req_get(struct acc_dev *dev, struct list_head *head)
+{
+	unsigned long flags;
+	struct usb_request *req;
+
+	spin_lock_irqsave(&dev->lock, flags);
+	if (list_empty(head)) {
+		req = 0;
+	} else {
+		req = list_first_entry(head, struct usb_request, list);
+		list_del(&req->list);
+	}
+	spin_unlock_irqrestore(&dev->lock, flags);
+	return req;
+}
+
+static void acc_set_disconnected(struct acc_dev *dev)
+{
+	dev->disconnected = 1;
+}
+
+static void acc_complete_in(struct usb_ep *ep, struct usb_request *req)
+{
+	struct acc_dev *dev = _acc_dev;
+
+	if (req->status == -ESHUTDOWN) {
+		pr_debug("acc_complete_in set disconnected");
+		acc_set_disconnected(dev);
+	}
+
+	req_put(dev, &dev->tx_idle, req);
+
+	wake_up(&dev->write_wq);
+}
+
+static void acc_complete_out(struct usb_ep *ep, struct usb_request *req)
+{
+	struct acc_dev *dev = _acc_dev;
+
+	dev->rx_done = 1;
+	if (req->status == -ESHUTDOWN) {
+		pr_debug("acc_complete_out set disconnected");
+		acc_set_disconnected(dev);
+	}
+
+	wake_up(&dev->read_wq);
+}
+
+static void acc_complete_set_string(struct usb_ep *ep, struct usb_request *req)
+{
+	struct acc_dev	*dev = ep->driver_data;
+	char *string_dest = NULL;
+	int length = req->actual;
+
+	if (req->status != 0) {
+		pr_err("acc_complete_set_string, err %d\n", req->status);
+		return;
+	}
+
+	switch (dev->string_index) {
+	case ACCESSORY_STRING_MANUFACTURER:
+		string_dest = dev->manufacturer;
+		break;
+	case ACCESSORY_STRING_MODEL:
+		string_dest = dev->model;
+		break;
+	case ACCESSORY_STRING_DESCRIPTION:
+		string_dest = dev->description;
+		break;
+	case ACCESSORY_STRING_VERSION:
+		string_dest = dev->version;
+		break;
+	case ACCESSORY_STRING_URI:
+		string_dest = dev->uri;
+		break;
+	case ACCESSORY_STRING_SERIAL:
+		string_dest = dev->serial;
+		break;
+	}
+	if (string_dest) {
+		unsigned long flags;
+
+		if (length >= ACC_STRING_SIZE)
+			length = ACC_STRING_SIZE - 1;
+
+		spin_lock_irqsave(&dev->lock, flags);
+		memcpy(string_dest, req->buf, length);
+		/* ensure zero termination */
+		string_dest[length] = 0;
+		spin_unlock_irqrestore(&dev->lock, flags);
+	} else {
+		pr_err("unknown accessory string index %d\n",
+			dev->string_index);
+	}
+}
+
+static void acc_complete_set_hid_report_desc(struct usb_ep *ep,
+		struct usb_request *req)
+{
+	struct acc_hid_dev *hid = req->context;
+	struct acc_dev *dev = hid->dev;
+	int length = req->actual;
+
+	if (req->status != 0) {
+		pr_err("acc_complete_set_hid_report_desc, err %d\n",
+			req->status);
+		return;
+	}
+
+	memcpy(hid->report_desc + hid->report_desc_offset, req->buf, length);
+	hid->report_desc_offset += length;
+	if (hid->report_desc_offset == hid->report_desc_len) {
+		/* After we have received the entire report descriptor
+		 * we schedule work to initialize the HID device
+		 */
+		schedule_work(&dev->hid_work);
+	}
+}
+
+static void acc_complete_send_hid_event(struct usb_ep *ep,
+		struct usb_request *req)
+{
+	struct acc_hid_dev *hid = req->context;
+	int length = req->actual;
+
+	if (req->status != 0) {
+		pr_err("acc_complete_send_hid_event, err %d\n", req->status);
+		return;
+	}
+
+	hid_report_raw_event(hid->hid, HID_INPUT_REPORT, req->buf, length, 1);
+}
+
+static int acc_hid_parse(struct hid_device *hid)
+{
+	struct acc_hid_dev *hdev = hid->driver_data;
+
+	hid_parse_report(hid, hdev->report_desc, hdev->report_desc_len);
+	return 0;
+}
+
+static int acc_hid_start(struct hid_device *hid)
+{
+	return 0;
+}
+
+static void acc_hid_stop(struct hid_device *hid)
+{
+}
+
+static int acc_hid_open(struct hid_device *hid)
+{
+	return 0;
+}
+
+static void acc_hid_close(struct hid_device *hid)
+{
+}
+
+static int acc_hid_raw_request(struct hid_device *hid, unsigned char reportnum,
+	__u8 *buf, size_t len, unsigned char rtype, int reqtype)
+{
+	return 0;
+}
+
+static struct hid_ll_driver acc_hid_ll_driver = {
+	.parse = acc_hid_parse,
+	.start = acc_hid_start,
+	.stop = acc_hid_stop,
+	.open = acc_hid_open,
+	.close = acc_hid_close,
+	.raw_request = acc_hid_raw_request,
+};
+
+static struct acc_hid_dev *acc_hid_new(struct acc_dev *dev,
+		int id, int desc_len)
+{
+	struct acc_hid_dev *hdev;
+
+	hdev = kzalloc(sizeof(*hdev), GFP_ATOMIC);
+	if (!hdev)
+		return NULL;
+	hdev->report_desc = kzalloc(desc_len, GFP_ATOMIC);
+	if (!hdev->report_desc) {
+		kfree(hdev);
+		return NULL;
+	}
+	hdev->dev = dev;
+	hdev->id = id;
+	hdev->report_desc_len = desc_len;
+
+	return hdev;
+}
+
+static struct acc_hid_dev *acc_hid_get(struct list_head *list, int id)
+{
+	struct acc_hid_dev *hid;
+
+	list_for_each_entry(hid, list, list) {
+		if (hid->id == id)
+			return hid;
+	}
+	return NULL;
+}
+
+static int acc_register_hid(struct acc_dev *dev, int id, int desc_length)
+{
+	struct acc_hid_dev *hid;
+	unsigned long flags;
+
+	/* report descriptor length must be > 0 */
+	if (desc_length <= 0)
+		return -EINVAL;
+
+	spin_lock_irqsave(&dev->lock, flags);
+	/* replace HID if one already exists with this ID */
+	hid = acc_hid_get(&dev->hid_list, id);
+	if (!hid)
+		hid = acc_hid_get(&dev->new_hid_list, id);
+	if (hid)
+		list_move(&hid->list, &dev->dead_hid_list);
+
+	hid = acc_hid_new(dev, id, desc_length);
+	if (!hid) {
+		spin_unlock_irqrestore(&dev->lock, flags);
+		return -ENOMEM;
+	}
+
+	list_add(&hid->list, &dev->new_hid_list);
+	spin_unlock_irqrestore(&dev->lock, flags);
+
+	/* schedule work to register the HID device */
+	schedule_work(&dev->hid_work);
+	return 0;
+}
+
+static int acc_unregister_hid(struct acc_dev *dev, int id)
+{
+	struct acc_hid_dev *hid;
+	unsigned long flags;
+
+	spin_lock_irqsave(&dev->lock, flags);
+	hid = acc_hid_get(&dev->hid_list, id);
+	if (!hid)
+		hid = acc_hid_get(&dev->new_hid_list, id);
+	if (!hid) {
+		spin_unlock_irqrestore(&dev->lock, flags);
+		return -EINVAL;
+	}
+
+	list_move(&hid->list, &dev->dead_hid_list);
+	spin_unlock_irqrestore(&dev->lock, flags);
+
+	schedule_work(&dev->hid_work);
+	return 0;
+}
+
+static int create_bulk_endpoints(struct acc_dev *dev,
+				struct usb_endpoint_descriptor *in_desc,
+				struct usb_endpoint_descriptor *out_desc)
+{
+	struct usb_composite_dev *cdev = dev->cdev;
+	struct usb_request *req;
+	struct usb_ep *ep;
+	int i;
+
+	DBG(cdev, "create_bulk_endpoints dev: %p\n", dev);
+
+	ep = usb_ep_autoconfig(cdev->gadget, in_desc);
+	if (!ep) {
+		DBG(cdev, "usb_ep_autoconfig for ep_in failed\n");
+		return -ENODEV;
+	}
+	DBG(cdev, "usb_ep_autoconfig for ep_in got %s\n", ep->name);
+	ep->driver_data = dev;		/* claim the endpoint */
+	dev->ep_in = ep;
+
+	ep = usb_ep_autoconfig(cdev->gadget, out_desc);
+	if (!ep) {
+		DBG(cdev, "usb_ep_autoconfig for ep_out failed\n");
+		return -ENODEV;
+	}
+	DBG(cdev, "usb_ep_autoconfig for ep_out got %s\n", ep->name);
+	ep->driver_data = dev;		/* claim the endpoint */
+	dev->ep_out = ep;
+
+	/* now allocate requests for our endpoints */
+	for (i = 0; i < TX_REQ_MAX; i++) {
+		req = acc_request_new(dev->ep_in, BULK_BUFFER_SIZE);
+		if (!req)
+			goto fail;
+		req->complete = acc_complete_in;
+		req_put(dev, &dev->tx_idle, req);
+	}
+	for (i = 0; i < RX_REQ_MAX; i++) {
+		req = acc_request_new(dev->ep_out, BULK_BUFFER_SIZE);
+		if (!req)
+			goto fail;
+		req->complete = acc_complete_out;
+		dev->rx_req[i] = req;
+	}
+
+	return 0;
+
+fail:
+	pr_err("acc_bind() could not allocate requests\n");
+	while ((req = req_get(dev, &dev->tx_idle)))
+		acc_request_free(req, dev->ep_in);
+	for (i = 0; i < RX_REQ_MAX; i++)
+		acc_request_free(dev->rx_req[i], dev->ep_out);
+	return -1;
+}
+
+static ssize_t acc_read(struct file *fp, char __user *buf,
+	size_t count, loff_t *pos)
+{
+	struct acc_dev *dev = fp->private_data;
+	struct usb_request *req;
+	ssize_t r = count;
+	unsigned xfer;
+	int ret = 0;
+
+	pr_debug("acc_read(%zu)\n", count);
+
+	if (dev->disconnected) {
+		pr_debug("acc_read disconnected");
+		return -ENODEV;
+	}
+
+	if (count > BULK_BUFFER_SIZE)
+		count = BULK_BUFFER_SIZE;
+
+	/* we will block until we're online */
+	pr_debug("acc_read: waiting for online\n");
+	ret = wait_event_interruptible(dev->read_wq, dev->online);
+	if (ret < 0) {
+		r = ret;
+		goto done;
+	}
+
+	if (dev->rx_done) {
+		// last req cancelled. try to get it.
+		req = dev->rx_req[0];
+		goto copy_data;
+	}
+
+requeue_req:
+	/* queue a request */
+	req = dev->rx_req[0];
+	req->length = count;
+	dev->rx_done = 0;
+	ret = usb_ep_queue(dev->ep_out, req, GFP_KERNEL);
+	if (ret < 0) {
+		r = -EIO;
+		goto done;
+	} else {
+		pr_debug("rx %p queue\n", req);
+	}
+
+	/* wait for a request to complete */
+	ret = wait_event_interruptible(dev->read_wq, dev->rx_done);
+	if (ret < 0) {
+		r = ret;
+		ret = usb_ep_dequeue(dev->ep_out, req);
+		if (ret != 0) {
+			// cancel failed. There can be a data already received.
+			// it will be retrieved in the next read.
+			pr_debug("acc_read: cancelling failed %d", ret);
+		}
+		goto done;
+	}
+
+copy_data:
+	dev->rx_done = 0;
+	if (dev->online) {
+		/* If we got a 0-len packet, throw it back and try again. */
+		if (req->actual == 0)
+			goto requeue_req;
+
+		pr_debug("rx %p %u\n", req, req->actual);
+		xfer = (req->actual < count) ? req->actual : count;
+		r = xfer;
+		if (copy_to_user(buf, req->buf, xfer))
+			r = -EFAULT;
+	} else
+		r = -EIO;
+
+done:
+	pr_debug("acc_read returning %zd\n", r);
+	return r;
+}
+
+static ssize_t acc_write(struct file *fp, const char __user *buf,
+	size_t count, loff_t *pos)
+{
+	struct acc_dev *dev = fp->private_data;
+	struct usb_request *req = 0;
+	ssize_t r = count;
+	unsigned xfer;
+	int ret;
+
+	pr_debug("acc_write(%zu)\n", count);
+
+	if (!dev->online || dev->disconnected) {
+		pr_debug("acc_write disconnected or not online");
+		return -ENODEV;
+	}
+
+	while (count > 0) {
+		if (!dev->online) {
+			pr_debug("acc_write dev->error\n");
+			r = -EIO;
+			break;
+		}
+
+		/* get an idle tx request to use */
+		req = 0;
+		ret = wait_event_interruptible(dev->write_wq,
+			((req = req_get(dev, &dev->tx_idle)) || !dev->online));
+		if (!req) {
+			r = ret;
+			break;
+		}
+
+		if (count > BULK_BUFFER_SIZE) {
+			xfer = BULK_BUFFER_SIZE;
+			/* ZLP, They will be more TX requests so not yet. */
+			req->zero = 0;
+		} else {
+			xfer = count;
+			/* If the data length is a multple of the
+			 * maxpacket size then send a zero length packet(ZLP).
+			*/
+			req->zero = ((xfer % dev->ep_in->maxpacket) == 0);
+		}
+		if (copy_from_user(req->buf, buf, xfer)) {
+			r = -EFAULT;
+			break;
+		}
+
+		req->length = xfer;
+		ret = usb_ep_queue(dev->ep_in, req, GFP_KERNEL);
+		if (ret < 0) {
+			pr_debug("acc_write: xfer error %d\n", ret);
+			r = -EIO;
+			break;
+		}
+
+		buf += xfer;
+		count -= xfer;
+
+		/* zero this so we don't try to free it on error exit */
+		req = 0;
+	}
+
+	if (req)
+		req_put(dev, &dev->tx_idle, req);
+
+	pr_debug("acc_write returning %zd\n", r);
+	return r;
+}
+
+static long acc_ioctl(struct file *fp, unsigned code, unsigned long value)
+{
+	struct acc_dev *dev = fp->private_data;
+	char *src = NULL;
+	int ret;
+
+	switch (code) {
+	case ACCESSORY_GET_STRING_MANUFACTURER:
+		src = dev->manufacturer;
+		break;
+	case ACCESSORY_GET_STRING_MODEL:
+		src = dev->model;
+		break;
+	case ACCESSORY_GET_STRING_DESCRIPTION:
+		src = dev->description;
+		break;
+	case ACCESSORY_GET_STRING_VERSION:
+		src = dev->version;
+		break;
+	case ACCESSORY_GET_STRING_URI:
+		src = dev->uri;
+		break;
+	case ACCESSORY_GET_STRING_SERIAL:
+		src = dev->serial;
+		break;
+	case ACCESSORY_IS_START_REQUESTED:
+		return dev->start_requested;
+	case ACCESSORY_GET_AUDIO_MODE:
+		return dev->audio_mode;
+	}
+	if (!src)
+		return -EINVAL;
+
+	ret = strlen(src) + 1;
+	if (copy_to_user((void __user *)value, src, ret))
+		ret = -EFAULT;
+	return ret;
+}
+
+static int acc_open(struct inode *ip, struct file *fp)
+{
+	printk(KERN_INFO "acc_open\n");
+	if (atomic_xchg(&_acc_dev->open_excl, 1))
+		return -EBUSY;
+
+	_acc_dev->disconnected = 0;
+	fp->private_data = _acc_dev;
+	return 0;
+}
+
+static int acc_release(struct inode *ip, struct file *fp)
+{
+	printk(KERN_INFO "acc_release\n");
+
+	WARN_ON(!atomic_xchg(&_acc_dev->open_excl, 0));
+	/* indicate that we are disconnected
+	 * still could be online so don't touch online flag
+	 */
+	_acc_dev->disconnected = 1;
+	return 0;
+}
+
+/* file operations for /dev/usb_accessory */
+static const struct file_operations acc_fops = {
+	.owner = THIS_MODULE,
+	.read = acc_read,
+	.write = acc_write,
+	.unlocked_ioctl = acc_ioctl,
+	.open = acc_open,
+	.release = acc_release,
+};
+
+static int acc_hid_probe(struct hid_device *hdev,
+		const struct hid_device_id *id)
+{
+	int ret;
+
+	ret = hid_parse(hdev);
+	if (ret)
+		return ret;
+	return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
+}
+
+static struct miscdevice acc_device = {
+	.minor = MISC_DYNAMIC_MINOR,
+	.name = "usb_accessory",
+	.fops = &acc_fops,
+};
+
+static const struct hid_device_id acc_hid_table[] = {
+	{ HID_USB_DEVICE(HID_ANY_ID, HID_ANY_ID) },
+	{ }
+};
+
+static struct hid_driver acc_hid_driver = {
+	.name = "USB accessory",
+	.id_table = acc_hid_table,
+	.probe = acc_hid_probe,
+};
+
+static void acc_complete_setup_noop(struct usb_ep *ep, struct usb_request *req)
+{
+	/*
+	 * Default no-op function when nothing needs to be done for the
+	 * setup request
+	 */
+}
+
+int acc_ctrlrequest(struct usb_composite_dev *cdev,
+				const struct usb_ctrlrequest *ctrl)
+{
+	struct acc_dev	*dev = _acc_dev;
+	int	value = -EOPNOTSUPP;
+	struct acc_hid_dev *hid;
+	int offset;
+	u8 b_requestType = ctrl->bRequestType;
+	u8 b_request = ctrl->bRequest;
+	u16	w_index = le16_to_cpu(ctrl->wIndex);
+	u16	w_value = le16_to_cpu(ctrl->wValue);
+	u16	w_length = le16_to_cpu(ctrl->wLength);
+	unsigned long flags;
+
+/*
+	printk(KERN_INFO "acc_ctrlrequest "
+			"%02x.%02x v%04x i%04x l%u\n",
+			b_requestType, b_request,
+			w_value, w_index, w_length);
+*/
+
+	if (b_requestType == (USB_DIR_OUT | USB_TYPE_VENDOR)) {
+		if (b_request == ACCESSORY_START) {
+			dev->start_requested = 1;
+			schedule_delayed_work(
+				&dev->start_work, msecs_to_jiffies(10));
+			value = 0;
+			cdev->req->complete = acc_complete_setup_noop;
+		} else if (b_request == ACCESSORY_SEND_STRING) {
+			dev->string_index = w_index;
+			cdev->gadget->ep0->driver_data = dev;
+			cdev->req->complete = acc_complete_set_string;
+			value = w_length;
+		} else if (b_request == ACCESSORY_SET_AUDIO_MODE &&
+				w_index == 0 && w_length == 0) {
+			dev->audio_mode = w_value;
+			cdev->req->complete = acc_complete_setup_noop;
+			value = 0;
+		} else if (b_request == ACCESSORY_REGISTER_HID) {
+			cdev->req->complete = acc_complete_setup_noop;
+			value = acc_register_hid(dev, w_value, w_index);
+		} else if (b_request == ACCESSORY_UNREGISTER_HID) {
+			cdev->req->complete = acc_complete_setup_noop;
+			value = acc_unregister_hid(dev, w_value);
+		} else if (b_request == ACCESSORY_SET_HID_REPORT_DESC) {
+			spin_lock_irqsave(&dev->lock, flags);
+			hid = acc_hid_get(&dev->new_hid_list, w_value);
+			spin_unlock_irqrestore(&dev->lock, flags);
+			if (!hid) {
+				value = -EINVAL;
+				goto err;
+			}
+			offset = w_index;
+			if (offset != hid->report_desc_offset
+				|| offset + w_length > hid->report_desc_len) {
+				value = -EINVAL;
+				goto err;
+			}
+			cdev->req->context = hid;
+			cdev->req->complete = acc_complete_set_hid_report_desc;
+			value = w_length;
+		} else if (b_request == ACCESSORY_SEND_HID_EVENT) {
+			spin_lock_irqsave(&dev->lock, flags);
+			hid = acc_hid_get(&dev->hid_list, w_value);
+			spin_unlock_irqrestore(&dev->lock, flags);
+			if (!hid) {
+				value = -EINVAL;
+				goto err;
+			}
+			cdev->req->context = hid;
+			cdev->req->complete = acc_complete_send_hid_event;
+			value = w_length;
+		}
+	} else if (b_requestType == (USB_DIR_IN | USB_TYPE_VENDOR)) {
+		if (b_request == ACCESSORY_GET_PROTOCOL) {
+			*((u16 *)cdev->req->buf) = PROTOCOL_VERSION;
+			value = sizeof(u16);
+			cdev->req->complete = acc_complete_setup_noop;
+			/* clear any string left over from a previous session */
+			memset(dev->manufacturer, 0, sizeof(dev->manufacturer));
+			memset(dev->model, 0, sizeof(dev->model));
+			memset(dev->description, 0, sizeof(dev->description));
+			memset(dev->version, 0, sizeof(dev->version));
+			memset(dev->uri, 0, sizeof(dev->uri));
+			memset(dev->serial, 0, sizeof(dev->serial));
+			dev->start_requested = 0;
+			dev->audio_mode = 0;
+		}
+	}
+
+	if (value >= 0) {
+		cdev->req->zero = 0;
+		cdev->req->length = value;
+		value = usb_ep_queue(cdev->gadget->ep0, cdev->req, GFP_ATOMIC);
+		if (value < 0)
+			ERROR(cdev, "%s setup response queue error\n",
+				__func__);
+	}
+
+err:
+	if (value == -EOPNOTSUPP)
+		VDBG(cdev,
+			"unknown class-specific control req "
+			"%02x.%02x v%04x i%04x l%u\n",
+			ctrl->bRequestType, ctrl->bRequest,
+			w_value, w_index, w_length);
+	return value;
+}
+EXPORT_SYMBOL_GPL(acc_ctrlrequest);
+
+static int
+__acc_function_bind(struct usb_configuration *c,
+			struct usb_function *f, bool configfs)
+{
+	struct usb_composite_dev *cdev = c->cdev;
+	struct acc_dev	*dev = func_to_dev(f);
+	int			id;
+	int			ret;
+
+	DBG(cdev, "acc_function_bind dev: %p\n", dev);
+
+	if (configfs) {
+		if (acc_string_defs[INTERFACE_STRING_INDEX].id == 0) {
+			ret = usb_string_id(c->cdev);
+			if (ret < 0)
+				return ret;
+			acc_string_defs[INTERFACE_STRING_INDEX].id = ret;
+			acc_interface_desc.iInterface = ret;
+		}
+		dev->cdev = c->cdev;
+	}
+	ret = hid_register_driver(&acc_hid_driver);
+	if (ret)
+		return ret;
+
+	dev->start_requested = 0;
+
+	/* allocate interface ID(s) */
+	id = usb_interface_id(c, f);
+	if (id < 0)
+		return id;
+	acc_interface_desc.bInterfaceNumber = id;
+
+	/* allocate endpoints */
+	ret = create_bulk_endpoints(dev, &acc_fullspeed_in_desc,
+			&acc_fullspeed_out_desc);
+	if (ret)
+		return ret;
+
+	/* support high speed hardware */
+	if (gadget_is_dualspeed(c->cdev->gadget)) {
+		acc_highspeed_in_desc.bEndpointAddress =
+			acc_fullspeed_in_desc.bEndpointAddress;
+		acc_highspeed_out_desc.bEndpointAddress =
+			acc_fullspeed_out_desc.bEndpointAddress;
+	}
+
+	DBG(cdev, "%s speed %s: IN/%s, OUT/%s\n",
+			gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
+			f->name, dev->ep_in->name, dev->ep_out->name);
+	return 0;
+}
+
+static int
+acc_function_bind_configfs(struct usb_configuration *c,
+			struct usb_function *f) {
+	return __acc_function_bind(c, f, true);
+}
+
+static void
+kill_all_hid_devices(struct acc_dev *dev)
+{
+	struct acc_hid_dev *hid;
+	struct list_head *entry, *temp;
+	unsigned long flags;
+
+	/* do nothing if usb accessory device doesn't exist */
+	if (!dev)
+		return;
+
+	spin_lock_irqsave(&dev->lock, flags);
+	list_for_each_safe(entry, temp, &dev->hid_list) {
+		hid = list_entry(entry, struct acc_hid_dev, list);
+		list_del(&hid->list);
+		list_add(&hid->list, &dev->dead_hid_list);
+	}
+	list_for_each_safe(entry, temp, &dev->new_hid_list) {
+		hid = list_entry(entry, struct acc_hid_dev, list);
+		list_del(&hid->list);
+		list_add(&hid->list, &dev->dead_hid_list);
+	}
+	spin_unlock_irqrestore(&dev->lock, flags);
+
+	schedule_work(&dev->hid_work);
+}
+
+static void
+acc_hid_unbind(struct acc_dev *dev)
+{
+	hid_unregister_driver(&acc_hid_driver);
+	kill_all_hid_devices(dev);
+}
+
+static void
+acc_function_unbind(struct usb_configuration *c, struct usb_function *f)
+{
+	struct acc_dev	*dev = func_to_dev(f);
+	struct usb_request *req;
+	int i;
+
+	dev->online = 0;		/* clear online flag */
+	wake_up(&dev->read_wq);		/* unblock reads on closure */
+	wake_up(&dev->write_wq);	/* likewise for writes */
+
+	while ((req = req_get(dev, &dev->tx_idle)))
+		acc_request_free(req, dev->ep_in);
+	for (i = 0; i < RX_REQ_MAX; i++)
+		acc_request_free(dev->rx_req[i], dev->ep_out);
+
+	acc_hid_unbind(dev);
+}
+
+static void acc_start_work(struct work_struct *data)
+{
+	char *envp[2] = { "ACCESSORY=START", NULL };
+
+	kobject_uevent_env(&acc_device.this_device->kobj, KOBJ_CHANGE, envp);
+}
+
+static int acc_hid_init(struct acc_hid_dev *hdev)
+{
+	struct hid_device *hid;
+	int ret;
+
+	hid = hid_allocate_device();
+	if (IS_ERR(hid))
+		return PTR_ERR(hid);
+
+	hid->ll_driver = &acc_hid_ll_driver;
+	hid->dev.parent = acc_device.this_device;
+
+	hid->bus = BUS_USB;
+	hid->vendor = HID_ANY_ID;
+	hid->product = HID_ANY_ID;
+	hid->driver_data = hdev;
+	ret = hid_add_device(hid);
+	if (ret) {
+		pr_err("can't add hid device: %d\n", ret);
+		hid_destroy_device(hid);
+		return ret;
+	}
+
+	hdev->hid = hid;
+	return 0;
+}
+
+static void acc_hid_delete(struct acc_hid_dev *hid)
+{
+	kfree(hid->report_desc);
+	kfree(hid);
+}
+
+static void acc_hid_work(struct work_struct *data)
+{
+	struct acc_dev *dev = _acc_dev;
+	struct list_head	*entry, *temp;
+	struct acc_hid_dev *hid;
+	struct list_head	new_list, dead_list;
+	unsigned long flags;
+
+	INIT_LIST_HEAD(&new_list);
+
+	spin_lock_irqsave(&dev->lock, flags);
+
+	/* copy hids that are ready for initialization to new_list */
+	list_for_each_safe(entry, temp, &dev->new_hid_list) {
+		hid = list_entry(entry, struct acc_hid_dev, list);
+		if (hid->report_desc_offset == hid->report_desc_len)
+			list_move(&hid->list, &new_list);
+	}
+
+	if (list_empty(&dev->dead_hid_list)) {
+		INIT_LIST_HEAD(&dead_list);
+	} else {
+		/* move all of dev->dead_hid_list to dead_list */
+		dead_list.prev = dev->dead_hid_list.prev;
+		dead_list.next = dev->dead_hid_list.next;
+		dead_list.next->prev = &dead_list;
+		dead_list.prev->next = &dead_list;
+		INIT_LIST_HEAD(&dev->dead_hid_list);
+	}
+
+	spin_unlock_irqrestore(&dev->lock, flags);
+
+	/* register new HID devices */
+	list_for_each_safe(entry, temp, &new_list) {
+		hid = list_entry(entry, struct acc_hid_dev, list);
+		if (acc_hid_init(hid)) {
+			pr_err("can't add HID device %p\n", hid);
+			acc_hid_delete(hid);
+		} else {
+			spin_lock_irqsave(&dev->lock, flags);
+			list_move(&hid->list, &dev->hid_list);
+			spin_unlock_irqrestore(&dev->lock, flags);
+		}
+	}
+
+	/* remove dead HID devices */
+	list_for_each_safe(entry, temp, &dead_list) {
+		hid = list_entry(entry, struct acc_hid_dev, list);
+		list_del(&hid->list);
+		if (hid->hid)
+			hid_destroy_device(hid->hid);
+		acc_hid_delete(hid);
+	}
+}
+
+static int acc_function_set_alt(struct usb_function *f,
+		unsigned intf, unsigned alt)
+{
+	struct acc_dev	*dev = func_to_dev(f);
+	struct usb_composite_dev *cdev = f->config->cdev;
+	int ret;
+
+	DBG(cdev, "acc_function_set_alt intf: %d alt: %d\n", intf, alt);
+
+	ret = config_ep_by_speed(cdev->gadget, f, dev->ep_in);
+	if (ret)
+		return ret;
+
+	ret = usb_ep_enable(dev->ep_in);
+	if (ret)
+		return ret;
+
+	ret = config_ep_by_speed(cdev->gadget, f, dev->ep_out);
+	if (ret)
+		return ret;
+
+	ret = usb_ep_enable(dev->ep_out);
+	if (ret) {
+		usb_ep_disable(dev->ep_in);
+		return ret;
+	}
+
+	dev->online = 1;
+	dev->disconnected = 0; /* if online then not disconnected */
+
+	/* readers may be blocked waiting for us to go online */
+	wake_up(&dev->read_wq);
+	return 0;
+}
+
+static void acc_function_disable(struct usb_function *f)
+{
+	struct acc_dev	*dev = func_to_dev(f);
+	struct usb_composite_dev	*cdev = dev->cdev;
+
+	DBG(cdev, "acc_function_disable\n");
+	acc_set_disconnected(dev); /* this now only sets disconnected */
+	dev->online = 0; /* so now need to clear online flag here too */
+	usb_ep_disable(dev->ep_in);
+	usb_ep_disable(dev->ep_out);
+
+	/* readers may be blocked waiting for us to go online */
+	wake_up(&dev->read_wq);
+
+	VDBG(cdev, "%s disabled\n", dev->function.name);
+}
+
+static int acc_setup(void)
+{
+	struct acc_dev *dev;
+	int ret;
+
+	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+	if (!dev)
+		return -ENOMEM;
+
+	spin_lock_init(&dev->lock);
+	init_waitqueue_head(&dev->read_wq);
+	init_waitqueue_head(&dev->write_wq);
+	atomic_set(&dev->open_excl, 0);
+	INIT_LIST_HEAD(&dev->tx_idle);
+	INIT_LIST_HEAD(&dev->hid_list);
+	INIT_LIST_HEAD(&dev->new_hid_list);
+	INIT_LIST_HEAD(&dev->dead_hid_list);
+	INIT_DELAYED_WORK(&dev->start_work, acc_start_work);
+	INIT_WORK(&dev->hid_work, acc_hid_work);
+
+	/* _acc_dev must be set before calling usb_gadget_register_driver */
+	_acc_dev = dev;
+
+	ret = misc_register(&acc_device);
+	if (ret)
+		goto err;
+
+	return 0;
+
+err:
+	kfree(dev);
+	pr_err("USB accessory gadget driver failed to initialize\n");
+	return ret;
+}
+
+void acc_disconnect(void)
+{
+	/* unregister all HID devices if USB is disconnected */
+	kill_all_hid_devices(_acc_dev);
+}
+EXPORT_SYMBOL_GPL(acc_disconnect);
+
+static void acc_cleanup(void)
+{
+	misc_deregister(&acc_device);
+	kfree(_acc_dev);
+	_acc_dev = NULL;
+}
+static struct acc_instance *to_acc_instance(struct config_item *item)
+{
+	return container_of(to_config_group(item), struct acc_instance,
+		func_inst.group);
+}
+
+static void acc_attr_release(struct config_item *item)
+{
+	struct acc_instance *fi_acc = to_acc_instance(item);
+
+	usb_put_function_instance(&fi_acc->func_inst);
+}
+
+static struct configfs_item_operations acc_item_ops = {
+	.release        = acc_attr_release,
+};
+
+static struct config_item_type acc_func_type = {
+	.ct_item_ops    = &acc_item_ops,
+	.ct_owner       = THIS_MODULE,
+};
+
+static struct acc_instance *to_fi_acc(struct usb_function_instance *fi)
+{
+	return container_of(fi, struct acc_instance, func_inst);
+}
+
+static int acc_set_inst_name(struct usb_function_instance *fi, const char *name)
+{
+	struct acc_instance *fi_acc;
+	char *ptr;
+	int name_len;
+
+	name_len = strlen(name) + 1;
+	if (name_len > MAX_INST_NAME_LEN)
+		return -ENAMETOOLONG;
+
+	ptr = kstrndup(name, name_len, GFP_KERNEL);
+	if (!ptr)
+		return -ENOMEM;
+
+	fi_acc = to_fi_acc(fi);
+	fi_acc->name = ptr;
+	return 0;
+}
+
+static void acc_free_inst(struct usb_function_instance *fi)
+{
+	struct acc_instance *fi_acc;
+
+	fi_acc = to_fi_acc(fi);
+	kfree(fi_acc->name);
+	acc_cleanup();
+}
+
+static struct usb_function_instance *acc_alloc_inst(void)
+{
+	struct acc_instance *fi_acc;
+	struct acc_dev *dev;
+	int err;
+
+	fi_acc = kzalloc(sizeof(*fi_acc), GFP_KERNEL);
+	if (!fi_acc)
+		return ERR_PTR(-ENOMEM);
+	fi_acc->func_inst.set_inst_name = acc_set_inst_name;
+	fi_acc->func_inst.free_func_inst = acc_free_inst;
+
+	err = acc_setup();
+	if (err) {
+		kfree(fi_acc);
+		pr_err("Error setting ACCESSORY\n");
+		return ERR_PTR(err);
+	}
+
+	config_group_init_type_name(&fi_acc->func_inst.group,
+					"", &acc_func_type);
+	dev = _acc_dev;
+	return  &fi_acc->func_inst;
+}
+
+static void acc_free(struct usb_function *f)
+{
+/*NO-OP: no function specific resource allocation in mtp_alloc*/
+}
+
+int acc_ctrlrequest_configfs(struct usb_function *f,
+			const struct usb_ctrlrequest *ctrl) {
+	if (f->config != NULL && f->config->cdev != NULL)
+		return acc_ctrlrequest(f->config->cdev, ctrl);
+	else
+		return -1;
+}
+
+static struct usb_function *acc_alloc(struct usb_function_instance *fi)
+{
+	struct acc_dev *dev = _acc_dev;
+
+	pr_info("acc_alloc\n");
+
+	dev->function.name = "accessory";
+	dev->function.strings = acc_strings,
+	dev->function.fs_descriptors = fs_acc_descs;
+	dev->function.hs_descriptors = hs_acc_descs;
+	dev->function.bind = acc_function_bind_configfs;
+	dev->function.unbind = acc_function_unbind;
+	dev->function.set_alt = acc_function_set_alt;
+	dev->function.disable = acc_function_disable;
+	dev->function.free_func = acc_free;
+	dev->function.setup = acc_ctrlrequest_configfs;
+
+	return &dev->function;
+}
+DECLARE_USB_FUNCTION_INIT(accessory, acc_alloc_inst, acc_alloc);
+MODULE_LICENSE("GPL");
diff --git a/drivers/usb/gadget/function/f_audio_source.c b/drivers/usb/gadget/function/f_audio_source.c
new file mode 100644
index 0000000..8124af3
--- /dev/null
+++ b/drivers/usb/gadget/function/f_audio_source.c
@@ -0,0 +1,1071 @@
+/*
+ * Gadget Function Driver for USB audio source device
+ *
+ * Copyright (C) 2012 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ *
+ */
+
+#include <linux/device.h>
+#include <linux/usb/audio.h>
+#include <linux/wait.h>
+#include <linux/pm_qos.h>
+#include <sound/core.h>
+#include <sound/initval.h>
+#include <sound/pcm.h>
+
+#include <linux/usb.h>
+#include <linux/usb_usual.h>
+#include <linux/usb/ch9.h>
+#include <linux/configfs.h>
+#include <linux/usb/composite.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#define SAMPLE_RATE 44100
+#define FRAMES_PER_MSEC (SAMPLE_RATE / 1000)
+
+#define IN_EP_MAX_PACKET_SIZE 256
+
+/* Number of requests to allocate */
+#define IN_EP_REQ_COUNT 4
+
+#define AUDIO_AC_INTERFACE	0
+#define AUDIO_AS_INTERFACE	1
+#define AUDIO_NUM_INTERFACES	2
+#define MAX_INST_NAME_LEN     40
+
+/* B.3.1  Standard AC Interface Descriptor */
+static struct usb_interface_descriptor ac_interface_desc = {
+	.bLength =		USB_DT_INTERFACE_SIZE,
+	.bDescriptorType =	USB_DT_INTERFACE,
+	.bNumEndpoints =	0,
+	.bInterfaceClass =	USB_CLASS_AUDIO,
+	.bInterfaceSubClass =	USB_SUBCLASS_AUDIOCONTROL,
+};
+
+DECLARE_UAC_AC_HEADER_DESCRIPTOR(2);
+
+#define UAC_DT_AC_HEADER_LENGTH	UAC_DT_AC_HEADER_SIZE(AUDIO_NUM_INTERFACES)
+/* 1 input terminal, 1 output terminal and 1 feature unit */
+#define UAC_DT_TOTAL_LENGTH (UAC_DT_AC_HEADER_LENGTH \
+	+ UAC_DT_INPUT_TERMINAL_SIZE + UAC_DT_OUTPUT_TERMINAL_SIZE \
+	+ UAC_DT_FEATURE_UNIT_SIZE(0))
+/* B.3.2  Class-Specific AC Interface Descriptor */
+static struct uac1_ac_header_descriptor_2 ac_header_desc = {
+	.bLength =		UAC_DT_AC_HEADER_LENGTH,
+	.bDescriptorType =	USB_DT_CS_INTERFACE,
+	.bDescriptorSubtype =	UAC_HEADER,
+	.bcdADC =		__constant_cpu_to_le16(0x0100),
+	.wTotalLength =		__constant_cpu_to_le16(UAC_DT_TOTAL_LENGTH),
+	.bInCollection =	AUDIO_NUM_INTERFACES,
+	.baInterfaceNr = {
+		[0] =		AUDIO_AC_INTERFACE,
+		[1] =		AUDIO_AS_INTERFACE,
+	}
+};
+
+#define INPUT_TERMINAL_ID	1
+static struct uac_input_terminal_descriptor input_terminal_desc = {
+	.bLength =		UAC_DT_INPUT_TERMINAL_SIZE,
+	.bDescriptorType =	USB_DT_CS_INTERFACE,
+	.bDescriptorSubtype =	UAC_INPUT_TERMINAL,
+	.bTerminalID =		INPUT_TERMINAL_ID,
+	.wTerminalType =	UAC_INPUT_TERMINAL_MICROPHONE,
+	.bAssocTerminal =	0,
+	.wChannelConfig =	0x3,
+};
+
+DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(0);
+
+#define FEATURE_UNIT_ID		2
+static struct uac_feature_unit_descriptor_0 feature_unit_desc = {
+	.bLength		= UAC_DT_FEATURE_UNIT_SIZE(0),
+	.bDescriptorType	= USB_DT_CS_INTERFACE,
+	.bDescriptorSubtype	= UAC_FEATURE_UNIT,
+	.bUnitID		= FEATURE_UNIT_ID,
+	.bSourceID		= INPUT_TERMINAL_ID,
+	.bControlSize		= 2,
+};
+
+#define OUTPUT_TERMINAL_ID	3
+static struct uac1_output_terminal_descriptor output_terminal_desc = {
+	.bLength		= UAC_DT_OUTPUT_TERMINAL_SIZE,
+	.bDescriptorType	= USB_DT_CS_INTERFACE,
+	.bDescriptorSubtype	= UAC_OUTPUT_TERMINAL,
+	.bTerminalID		= OUTPUT_TERMINAL_ID,
+	.wTerminalType		= UAC_TERMINAL_STREAMING,
+	.bAssocTerminal		= FEATURE_UNIT_ID,
+	.bSourceID		= FEATURE_UNIT_ID,
+};
+
+/* B.4.1  Standard AS Interface Descriptor */
+static struct usb_interface_descriptor as_interface_alt_0_desc = {
+	.bLength =		USB_DT_INTERFACE_SIZE,
+	.bDescriptorType =	USB_DT_INTERFACE,
+	.bAlternateSetting =	0,
+	.bNumEndpoints =	0,
+	.bInterfaceClass =	USB_CLASS_AUDIO,
+	.bInterfaceSubClass =	USB_SUBCLASS_AUDIOSTREAMING,
+};
+
+static struct usb_interface_descriptor as_interface_alt_1_desc = {
+	.bLength =		USB_DT_INTERFACE_SIZE,
+	.bDescriptorType =	USB_DT_INTERFACE,
+	.bAlternateSetting =	1,
+	.bNumEndpoints =	1,
+	.bInterfaceClass =	USB_CLASS_AUDIO,
+	.bInterfaceSubClass =	USB_SUBCLASS_AUDIOSTREAMING,
+};
+
+/* B.4.2  Class-Specific AS Interface Descriptor */
+static struct uac1_as_header_descriptor as_header_desc = {
+	.bLength =		UAC_DT_AS_HEADER_SIZE,
+	.bDescriptorType =	USB_DT_CS_INTERFACE,
+	.bDescriptorSubtype =	UAC_AS_GENERAL,
+	.bTerminalLink =	INPUT_TERMINAL_ID,
+	.bDelay =		1,
+	.wFormatTag =		UAC_FORMAT_TYPE_I_PCM,
+};
+
+DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(1);
+
+static struct uac_format_type_i_discrete_descriptor_1 as_type_i_desc = {
+	.bLength =		UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
+	.bDescriptorType =	USB_DT_CS_INTERFACE,
+	.bDescriptorSubtype =	UAC_FORMAT_TYPE,
+	.bFormatType =		UAC_FORMAT_TYPE_I,
+	.bSubframeSize =	2,
+	.bBitResolution =	16,
+	.bSamFreqType =		1,
+};
+
+/* Standard ISO IN Endpoint Descriptor for highspeed */
+static struct usb_endpoint_descriptor hs_as_in_ep_desc  = {
+	.bLength =		USB_DT_ENDPOINT_AUDIO_SIZE,
+	.bDescriptorType =	USB_DT_ENDPOINT,
+	.bEndpointAddress =	USB_DIR_IN,
+	.bmAttributes =		USB_ENDPOINT_SYNC_SYNC
+				| USB_ENDPOINT_XFER_ISOC,
+	.wMaxPacketSize =	__constant_cpu_to_le16(IN_EP_MAX_PACKET_SIZE),
+	.bInterval =		4, /* poll 1 per millisecond */
+};
+
+/* Standard ISO IN Endpoint Descriptor for highspeed */
+static struct usb_endpoint_descriptor fs_as_in_ep_desc  = {
+	.bLength =		USB_DT_ENDPOINT_AUDIO_SIZE,
+	.bDescriptorType =	USB_DT_ENDPOINT,
+	.bEndpointAddress =	USB_DIR_IN,
+	.bmAttributes =		USB_ENDPOINT_SYNC_SYNC
+				| USB_ENDPOINT_XFER_ISOC,
+	.wMaxPacketSize =	__constant_cpu_to_le16(IN_EP_MAX_PACKET_SIZE),
+	.bInterval =		1, /* poll 1 per millisecond */
+};
+
+/* Class-specific AS ISO OUT Endpoint Descriptor */
+static struct uac_iso_endpoint_descriptor as_iso_in_desc = {
+	.bLength =		UAC_ISO_ENDPOINT_DESC_SIZE,
+	.bDescriptorType =	USB_DT_CS_ENDPOINT,
+	.bDescriptorSubtype =	UAC_EP_GENERAL,
+	.bmAttributes =		1,
+	.bLockDelayUnits =	1,
+	.wLockDelay =		__constant_cpu_to_le16(1),
+};
+
+static struct usb_descriptor_header *hs_audio_desc[] = {
+	(struct usb_descriptor_header *)&ac_interface_desc,
+	(struct usb_descriptor_header *)&ac_header_desc,
+
+	(struct usb_descriptor_header *)&input_terminal_desc,
+	(struct usb_descriptor_header *)&output_terminal_desc,
+	(struct usb_descriptor_header *)&feature_unit_desc,
+
+	(struct usb_descriptor_header *)&as_interface_alt_0_desc,
+	(struct usb_descriptor_header *)&as_interface_alt_1_desc,
+	(struct usb_descriptor_header *)&as_header_desc,
+
+	(struct usb_descriptor_header *)&as_type_i_desc,
+
+	(struct usb_descriptor_header *)&hs_as_in_ep_desc,
+	(struct usb_descriptor_header *)&as_iso_in_desc,
+	NULL,
+};
+
+static struct usb_descriptor_header *fs_audio_desc[] = {
+	(struct usb_descriptor_header *)&ac_interface_desc,
+	(struct usb_descriptor_header *)&ac_header_desc,
+
+	(struct usb_descriptor_header *)&input_terminal_desc,
+	(struct usb_descriptor_header *)&output_terminal_desc,
+	(struct usb_descriptor_header *)&feature_unit_desc,
+
+	(struct usb_descriptor_header *)&as_interface_alt_0_desc,
+	(struct usb_descriptor_header *)&as_interface_alt_1_desc,
+	(struct usb_descriptor_header *)&as_header_desc,
+
+	(struct usb_descriptor_header *)&as_type_i_desc,
+
+	(struct usb_descriptor_header *)&fs_as_in_ep_desc,
+	(struct usb_descriptor_header *)&as_iso_in_desc,
+	NULL,
+};
+
+static struct snd_pcm_hardware audio_hw_info = {
+	.info =			SNDRV_PCM_INFO_MMAP |
+				SNDRV_PCM_INFO_MMAP_VALID |
+				SNDRV_PCM_INFO_BATCH |
+				SNDRV_PCM_INFO_INTERLEAVED |
+				SNDRV_PCM_INFO_BLOCK_TRANSFER,
+
+	.formats		= SNDRV_PCM_FMTBIT_S16_LE,
+	.channels_min		= 2,
+	.channels_max		= 2,
+	.rate_min		= SAMPLE_RATE,
+	.rate_max		= SAMPLE_RATE,
+
+	.buffer_bytes_max =	1024 * 1024,
+	.period_bytes_min =	64,
+	.period_bytes_max =	512 * 1024,
+	.periods_min =		2,
+	.periods_max =		1024,
+};
+
+/*-------------------------------------------------------------------------*/
+
+struct audio_source_config {
+	int	card;
+	int	device;
+};
+
+struct audio_dev {
+	struct usb_function		func;
+	struct snd_card			*card;
+	struct snd_pcm			*pcm;
+	struct snd_pcm_substream *substream;
+
+	struct list_head		idle_reqs;
+	struct usb_ep			*in_ep;
+
+	spinlock_t			lock;
+
+	/* beginning, end and current position in our buffer */
+	void				*buffer_start;
+	void				*buffer_end;
+	void				*buffer_pos;
+
+	/* byte size of a "period" */
+	unsigned int			period;
+	/* bytes sent since last call to snd_pcm_period_elapsed */
+	unsigned int			period_offset;
+	/* time we started playing */
+	ktime_t				start_time;
+	/* number of frames sent since start_time */
+	s64				frames_sent;
+	struct audio_source_config	*config;
+	/* for creating and issuing QoS requests */
+	struct pm_qos_request pm_qos;
+};
+
+static inline struct audio_dev *func_to_audio(struct usb_function *f)
+{
+	return container_of(f, struct audio_dev, func);
+}
+
+/*-------------------------------------------------------------------------*/
+
+struct audio_source_instance {
+	struct usb_function_instance func_inst;
+	const char *name;
+	struct audio_source_config *config;
+	struct device *audio_device;
+};
+
+static void audio_source_attr_release(struct config_item *item);
+
+static struct configfs_item_operations audio_source_item_ops = {
+	.release        = audio_source_attr_release,
+};
+
+static struct config_item_type audio_source_func_type = {
+	.ct_item_ops    = &audio_source_item_ops,
+	.ct_owner       = THIS_MODULE,
+};
+
+static ssize_t audio_source_pcm_show(struct device *dev,
+		struct device_attribute *attr, char *buf);
+
+static DEVICE_ATTR(pcm, S_IRUGO, audio_source_pcm_show, NULL);
+
+static struct device_attribute *audio_source_function_attributes[] = {
+	&dev_attr_pcm,
+	NULL
+};
+
+/*--------------------------------------------------------------------------*/
+
+static struct usb_request *audio_request_new(struct usb_ep *ep, int buffer_size)
+{
+	struct usb_request *req = usb_ep_alloc_request(ep, GFP_KERNEL);
+
+	if (!req)
+		return NULL;
+
+	req->buf = kmalloc(buffer_size, GFP_KERNEL);
+	if (!req->buf) {
+		usb_ep_free_request(ep, req);
+		return NULL;
+	}
+	req->length = buffer_size;
+	return req;
+}
+
+static void audio_request_free(struct usb_request *req, struct usb_ep *ep)
+{
+	if (req) {
+		kfree(req->buf);
+		usb_ep_free_request(ep, req);
+	}
+}
+
+static void audio_req_put(struct audio_dev *audio, struct usb_request *req)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&audio->lock, flags);
+	list_add_tail(&req->list, &audio->idle_reqs);
+	spin_unlock_irqrestore(&audio->lock, flags);
+}
+
+static struct usb_request *audio_req_get(struct audio_dev *audio)
+{
+	unsigned long flags;
+	struct usb_request *req;
+
+	spin_lock_irqsave(&audio->lock, flags);
+	if (list_empty(&audio->idle_reqs)) {
+		req = 0;
+	} else {
+		req = list_first_entry(&audio->idle_reqs, struct usb_request,
+				list);
+		list_del(&req->list);
+	}
+	spin_unlock_irqrestore(&audio->lock, flags);
+	return req;
+}
+
+/* send the appropriate number of packets to match our bitrate */
+static void audio_send(struct audio_dev *audio)
+{
+	struct snd_pcm_runtime *runtime;
+	struct usb_request *req;
+	int length, length1, length2, ret;
+	s64 msecs;
+	s64 frames;
+	ktime_t now;
+
+	/* audio->substream will be null if we have been closed */
+	if (!audio->substream)
+		return;
+	/* audio->buffer_pos will be null if we have been stopped */
+	if (!audio->buffer_pos)
+		return;
+
+	runtime = audio->substream->runtime;
+
+	/* compute number of frames to send */
+	now = ktime_get();
+	msecs = div_s64((ktime_to_ns(now) - ktime_to_ns(audio->start_time)),
+			1000000);
+	frames = div_s64((msecs * SAMPLE_RATE), 1000);
+
+	/* Readjust our frames_sent if we fall too far behind.
+	 * If we get too far behind it is better to drop some frames than
+	 * to keep sending data too fast in an attempt to catch up.
+	 */
+	if (frames - audio->frames_sent > 10 * FRAMES_PER_MSEC)
+		audio->frames_sent = frames - FRAMES_PER_MSEC;
+
+	frames -= audio->frames_sent;
+
+	/* We need to send something to keep the pipeline going */
+	if (frames <= 0)
+		frames = FRAMES_PER_MSEC;
+
+	while (frames > 0) {
+		req = audio_req_get(audio);
+		if (!req)
+			break;
+
+		length = frames_to_bytes(runtime, frames);
+		if (length > IN_EP_MAX_PACKET_SIZE)
+			length = IN_EP_MAX_PACKET_SIZE;
+
+		if (audio->buffer_pos + length > audio->buffer_end)
+			length1 = audio->buffer_end - audio->buffer_pos;
+		else
+			length1 = length;
+		memcpy(req->buf, audio->buffer_pos, length1);
+		if (length1 < length) {
+			/* Wrap around and copy remaining length
+			 * at beginning of buffer.
+			 */
+			length2 = length - length1;
+			memcpy(req->buf + length1, audio->buffer_start,
+					length2);
+			audio->buffer_pos = audio->buffer_start + length2;
+		} else {
+			audio->buffer_pos += length1;
+			if (audio->buffer_pos >= audio->buffer_end)
+				audio->buffer_pos = audio->buffer_start;
+		}
+
+		req->length = length;
+		ret = usb_ep_queue(audio->in_ep, req, GFP_ATOMIC);
+		if (ret < 0) {
+			pr_err("usb_ep_queue failed ret: %d\n", ret);
+			audio_req_put(audio, req);
+			break;
+		}
+
+		frames -= bytes_to_frames(runtime, length);
+		audio->frames_sent += bytes_to_frames(runtime, length);
+	}
+}
+
+static void audio_control_complete(struct usb_ep *ep, struct usb_request *req)
+{
+	/* nothing to do here */
+}
+
+static void audio_data_complete(struct usb_ep *ep, struct usb_request *req)
+{
+	struct audio_dev *audio = req->context;
+
+	pr_debug("audio_data_complete req->status %d req->actual %d\n",
+		req->status, req->actual);
+
+	audio_req_put(audio, req);
+
+	if (!audio->buffer_start || req->status)
+		return;
+
+	audio->period_offset += req->actual;
+	if (audio->period_offset >= audio->period) {
+		snd_pcm_period_elapsed(audio->substream);
+		audio->period_offset = 0;
+	}
+	audio_send(audio);
+}
+
+static int audio_set_endpoint_req(struct usb_function *f,
+		const struct usb_ctrlrequest *ctrl)
+{
+	int value = -EOPNOTSUPP;
+	u16 ep = le16_to_cpu(ctrl->wIndex);
+	u16 len = le16_to_cpu(ctrl->wLength);
+	u16 w_value = le16_to_cpu(ctrl->wValue);
+
+	pr_debug("bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
+			ctrl->bRequest, w_value, len, ep);
+
+	switch (ctrl->bRequest) {
+	case UAC_SET_CUR:
+	case UAC_SET_MIN:
+	case UAC_SET_MAX:
+	case UAC_SET_RES:
+		value = len;
+		break;
+	default:
+		break;
+	}
+
+	return value;
+}
+
+static int audio_get_endpoint_req(struct usb_function *f,
+		const struct usb_ctrlrequest *ctrl)
+{
+	struct usb_composite_dev *cdev = f->config->cdev;
+	int value = -EOPNOTSUPP;
+	u8 ep = ((le16_to_cpu(ctrl->wIndex) >> 8) & 0xFF);
+	u16 len = le16_to_cpu(ctrl->wLength);
+	u16 w_value = le16_to_cpu(ctrl->wValue);
+	u8 *buf = cdev->req->buf;
+
+	pr_debug("bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
+			ctrl->bRequest, w_value, len, ep);
+
+	if (w_value == UAC_EP_CS_ATTR_SAMPLE_RATE << 8) {
+		switch (ctrl->bRequest) {
+		case UAC_GET_CUR:
+		case UAC_GET_MIN:
+		case UAC_GET_MAX:
+		case UAC_GET_RES:
+			/* return our sample rate */
+			buf[0] = (u8)SAMPLE_RATE;
+			buf[1] = (u8)(SAMPLE_RATE >> 8);
+			buf[2] = (u8)(SAMPLE_RATE >> 16);
+			value = 3;
+			break;
+		default:
+			break;
+		}
+	}
+
+	return value;
+}
+
+static int
+audio_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
+{
+	struct usb_composite_dev *cdev = f->config->cdev;
+	struct usb_request *req = cdev->req;
+	int value = -EOPNOTSUPP;
+	u16 w_index = le16_to_cpu(ctrl->wIndex);
+	u16 w_value = le16_to_cpu(ctrl->wValue);
+	u16 w_length = le16_to_cpu(ctrl->wLength);
+
+	/* composite driver infrastructure handles everything; interface
+	 * activation uses set_alt().
+	 */
+	switch (ctrl->bRequestType) {
+	case USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
+		value = audio_set_endpoint_req(f, ctrl);
+		break;
+
+	case USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
+		value = audio_get_endpoint_req(f, ctrl);
+		break;
+	}
+
+	/* respond with data transfer or status phase? */
+	if (value >= 0) {
+		pr_debug("audio req%02x.%02x v%04x i%04x l%d\n",
+			ctrl->bRequestType, ctrl->bRequest,
+			w_value, w_index, w_length);
+		req->zero = 0;
+		req->length = value;
+		req->complete = audio_control_complete;
+		value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
+		if (value < 0)
+			pr_err("audio response on err %d\n", value);
+	}
+
+	/* device either stalls (value < 0) or reports success */
+	return value;
+}
+
+static int audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
+{
+	struct audio_dev *audio = func_to_audio(f);
+	struct usb_composite_dev *cdev = f->config->cdev;
+	int ret;
+
+	pr_debug("audio_set_alt intf %d, alt %d\n", intf, alt);
+
+	ret = config_ep_by_speed(cdev->gadget, f, audio->in_ep);
+	if (ret)
+		return ret;
+
+	usb_ep_enable(audio->in_ep);
+	return 0;
+}
+
+static void audio_disable(struct usb_function *f)
+{
+	struct audio_dev	*audio = func_to_audio(f);
+
+	pr_debug("audio_disable\n");
+	usb_ep_disable(audio->in_ep);
+}
+
+static void audio_free_func(struct usb_function *f)
+{
+	/* no-op */
+}
+
+/*-------------------------------------------------------------------------*/
+
+static void audio_build_desc(struct audio_dev *audio)
+{
+	u8 *sam_freq;
+	int rate;
+
+	/* Set channel numbers */
+	input_terminal_desc.bNrChannels = 2;
+	as_type_i_desc.bNrChannels = 2;
+
+	/* Set sample rates */
+	rate = SAMPLE_RATE;
+	sam_freq = as_type_i_desc.tSamFreq[0];
+	memcpy(sam_freq, &rate, 3);
+}
+
+
+static int snd_card_setup(struct usb_configuration *c,
+	struct audio_source_config *config);
+static struct audio_source_instance *to_fi_audio_source(
+	const struct usb_function_instance *fi);
+
+
+/* audio function driver setup/binding */
+static int
+audio_bind(struct usb_configuration *c, struct usb_function *f)
+{
+	struct usb_composite_dev *cdev = c->cdev;
+	struct audio_dev *audio = func_to_audio(f);
+	int status;
+	struct usb_ep *ep;
+	struct usb_request *req;
+	int i;
+	int err;
+
+	if (IS_ENABLED(CONFIG_USB_CONFIGFS)) {
+		struct audio_source_instance *fi_audio =
+				to_fi_audio_source(f->fi);
+		struct audio_source_config *config =
+				fi_audio->config;
+
+		err = snd_card_setup(c, config);
+		if (err)
+			return err;
+	}
+
+	audio_build_desc(audio);
+
+	/* allocate instance-specific interface IDs, and patch descriptors */
+	status = usb_interface_id(c, f);
+	if (status < 0)
+		goto fail;
+	ac_interface_desc.bInterfaceNumber = status;
+
+	/* AUDIO_AC_INTERFACE */
+	ac_header_desc.baInterfaceNr[0] = status;
+
+	status = usb_interface_id(c, f);
+	if (status < 0)
+		goto fail;
+	as_interface_alt_0_desc.bInterfaceNumber = status;
+	as_interface_alt_1_desc.bInterfaceNumber = status;
+
+	/* AUDIO_AS_INTERFACE */
+	ac_header_desc.baInterfaceNr[1] = status;
+
+	status = -ENODEV;
+
+	/* allocate our endpoint */
+	ep = usb_ep_autoconfig(cdev->gadget, &fs_as_in_ep_desc);
+	if (!ep)
+		goto fail;
+	audio->in_ep = ep;
+	ep->driver_data = audio; /* claim */
+
+	if (gadget_is_dualspeed(c->cdev->gadget))
+		hs_as_in_ep_desc.bEndpointAddress =
+			fs_as_in_ep_desc.bEndpointAddress;
+
+	f->fs_descriptors = fs_audio_desc;
+	f->hs_descriptors = hs_audio_desc;
+
+	for (i = 0, status = 0; i < IN_EP_REQ_COUNT && status == 0; i++) {
+		req = audio_request_new(ep, IN_EP_MAX_PACKET_SIZE);
+		if (req) {
+			req->context = audio;
+			req->complete = audio_data_complete;
+			audio_req_put(audio, req);
+		} else
+			status = -ENOMEM;
+	}
+
+fail:
+	return status;
+}
+
+static void
+audio_unbind(struct usb_configuration *c, struct usb_function *f)
+{
+	struct audio_dev *audio = func_to_audio(f);
+	struct usb_request *req;
+
+	while ((req = audio_req_get(audio)))
+		audio_request_free(req, audio->in_ep);
+
+	snd_card_free_when_closed(audio->card);
+	audio->card = NULL;
+	audio->pcm = NULL;
+	audio->substream = NULL;
+	audio->in_ep = NULL;
+
+	if (IS_ENABLED(CONFIG_USB_CONFIGFS)) {
+		struct audio_source_instance *fi_audio =
+				to_fi_audio_source(f->fi);
+		struct audio_source_config *config =
+				fi_audio->config;
+
+		config->card = -1;
+		config->device = -1;
+	}
+}
+
+static void audio_pcm_playback_start(struct audio_dev *audio)
+{
+	audio->start_time = ktime_get();
+	audio->frames_sent = 0;
+	audio_send(audio);
+}
+
+static void audio_pcm_playback_stop(struct audio_dev *audio)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&audio->lock, flags);
+	audio->buffer_start = 0;
+	audio->buffer_end = 0;
+	audio->buffer_pos = 0;
+	spin_unlock_irqrestore(&audio->lock, flags);
+}
+
+static int audio_pcm_open(struct snd_pcm_substream *substream)
+{
+	struct snd_pcm_runtime *runtime = substream->runtime;
+	struct audio_dev *audio = substream->private_data;
+
+	runtime->private_data = audio;
+	runtime->hw = audio_hw_info;
+	snd_pcm_limit_hw_rates(runtime);
+	runtime->hw.channels_max = 2;
+
+	audio->substream = substream;
+
+	/* Add the QoS request and set the latency to 0 */
+	pm_qos_add_request(&audio->pm_qos, PM_QOS_CPU_DMA_LATENCY, 0);
+
+	return 0;
+}
+
+static int audio_pcm_close(struct snd_pcm_substream *substream)
+{
+	struct audio_dev *audio = substream->private_data;
+	unsigned long flags;
+
+	spin_lock_irqsave(&audio->lock, flags);
+
+	/* Remove the QoS request */
+	pm_qos_remove_request(&audio->pm_qos);
+
+	audio->substream = NULL;
+	spin_unlock_irqrestore(&audio->lock, flags);
+
+	return 0;
+}
+
+static int audio_pcm_hw_params(struct snd_pcm_substream *substream,
+				struct snd_pcm_hw_params *params)
+{
+	unsigned int channels = params_channels(params);
+	unsigned int rate = params_rate(params);
+
+	if (rate != SAMPLE_RATE)
+		return -EINVAL;
+	if (channels != 2)
+		return -EINVAL;
+
+	return snd_pcm_lib_alloc_vmalloc_buffer(substream,
+		params_buffer_bytes(params));
+}
+
+static int audio_pcm_hw_free(struct snd_pcm_substream *substream)
+{
+	return snd_pcm_lib_free_vmalloc_buffer(substream);
+}
+
+static int audio_pcm_prepare(struct snd_pcm_substream *substream)
+{
+	struct snd_pcm_runtime *runtime = substream->runtime;
+	struct audio_dev *audio = runtime->private_data;
+
+	audio->period = snd_pcm_lib_period_bytes(substream);
+	audio->period_offset = 0;
+	audio->buffer_start = runtime->dma_area;
+	audio->buffer_end = audio->buffer_start
+		+ snd_pcm_lib_buffer_bytes(substream);
+	audio->buffer_pos = audio->buffer_start;
+
+	return 0;
+}
+
+static snd_pcm_uframes_t audio_pcm_pointer(struct snd_pcm_substream *substream)
+{
+	struct snd_pcm_runtime *runtime = substream->runtime;
+	struct audio_dev *audio = runtime->private_data;
+	ssize_t bytes = audio->buffer_pos - audio->buffer_start;
+
+	/* return offset of next frame to fill in our buffer */
+	return bytes_to_frames(runtime, bytes);
+}
+
+static int audio_pcm_playback_trigger(struct snd_pcm_substream *substream,
+					int cmd)
+{
+	struct audio_dev *audio = substream->runtime->private_data;
+	int ret = 0;
+
+	switch (cmd) {
+	case SNDRV_PCM_TRIGGER_START:
+	case SNDRV_PCM_TRIGGER_RESUME:
+		audio_pcm_playback_start(audio);
+		break;
+
+	case SNDRV_PCM_TRIGGER_STOP:
+	case SNDRV_PCM_TRIGGER_SUSPEND:
+		audio_pcm_playback_stop(audio);
+		break;
+
+	default:
+		ret = -EINVAL;
+	}
+
+	return ret;
+}
+
+static struct audio_dev _audio_dev = {
+	.func = {
+		.name = "audio_source",
+		.bind = audio_bind,
+		.unbind = audio_unbind,
+		.set_alt = audio_set_alt,
+		.setup = audio_setup,
+		.disable = audio_disable,
+		.free_func = audio_free_func,
+	},
+	.lock = __SPIN_LOCK_UNLOCKED(_audio_dev.lock),
+	.idle_reqs = LIST_HEAD_INIT(_audio_dev.idle_reqs),
+};
+
+static struct snd_pcm_ops audio_playback_ops = {
+	.open		= audio_pcm_open,
+	.close		= audio_pcm_close,
+	.ioctl		= snd_pcm_lib_ioctl,
+	.hw_params	= audio_pcm_hw_params,
+	.hw_free	= audio_pcm_hw_free,
+	.prepare	= audio_pcm_prepare,
+	.trigger	= audio_pcm_playback_trigger,
+	.pointer	= audio_pcm_pointer,
+};
+
+int audio_source_bind_config(struct usb_configuration *c,
+		struct audio_source_config *config)
+{
+	struct audio_dev *audio;
+	int err;
+
+	config->card = -1;
+	config->device = -1;
+
+	audio = &_audio_dev;
+
+	err = snd_card_setup(c, config);
+	if (err)
+		return err;
+
+	err = usb_add_function(c, &audio->func);
+	if (err)
+		goto add_fail;
+
+	return 0;
+
+add_fail:
+	snd_card_free(audio->card);
+	return err;
+}
+
+static int snd_card_setup(struct usb_configuration *c,
+		struct audio_source_config *config)
+{
+	struct audio_dev *audio;
+	struct snd_card *card;
+	struct snd_pcm *pcm;
+	int err;
+
+	audio = &_audio_dev;
+
+	err = snd_card_new(&c->cdev->gadget->dev,
+			SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
+			THIS_MODULE, 0, &card);
+	if (err)
+		return err;
+
+	err = snd_pcm_new(card, "USB audio source", 0, 1, 0, &pcm);
+	if (err)
+		goto pcm_fail;
+
+	pcm->private_data = audio;
+	pcm->info_flags = 0;
+	audio->pcm = pcm;
+
+	strlcpy(pcm->name, "USB gadget audio", sizeof(pcm->name));
+
+	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &audio_playback_ops);
+	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
+				NULL, 0, 64 * 1024);
+
+	strlcpy(card->driver, "audio_source", sizeof(card->driver));
+	strlcpy(card->shortname, card->driver, sizeof(card->shortname));
+	strlcpy(card->longname, "USB accessory audio source",
+		sizeof(card->longname));
+
+	err = snd_card_register(card);
+	if (err)
+		goto register_fail;
+
+	config->card = pcm->card->number;
+	config->device = pcm->device;
+	audio->card = card;
+	return 0;
+
+register_fail:
+pcm_fail:
+	snd_card_free(audio->card);
+	return err;
+}
+
+static struct audio_source_instance *to_audio_source_instance(
+					struct config_item *item)
+{
+	return container_of(to_config_group(item), struct audio_source_instance,
+		func_inst.group);
+}
+
+static struct audio_source_instance *to_fi_audio_source(
+					const struct usb_function_instance *fi)
+{
+	return container_of(fi, struct audio_source_instance, func_inst);
+}
+
+static void audio_source_attr_release(struct config_item *item)
+{
+	struct audio_source_instance *fi_audio = to_audio_source_instance(item);
+
+	usb_put_function_instance(&fi_audio->func_inst);
+}
+
+static int audio_source_set_inst_name(struct usb_function_instance *fi,
+					const char *name)
+{
+	struct audio_source_instance *fi_audio;
+	char *ptr;
+	int name_len;
+
+	name_len = strlen(name) + 1;
+	if (name_len > MAX_INST_NAME_LEN)
+		return -ENAMETOOLONG;
+
+	ptr = kstrndup(name, name_len, GFP_KERNEL);
+	if (!ptr)
+		return -ENOMEM;
+
+	fi_audio = to_fi_audio_source(fi);
+	fi_audio->name = ptr;
+
+	return 0;
+}
+
+static void audio_source_free_inst(struct usb_function_instance *fi)
+{
+	struct audio_source_instance *fi_audio;
+
+	fi_audio = to_fi_audio_source(fi);
+	device_destroy(fi_audio->audio_device->class,
+			fi_audio->audio_device->devt);
+	kfree(fi_audio->name);
+	kfree(fi_audio->config);
+}
+
+static ssize_t audio_source_pcm_show(struct device *dev,
+		struct device_attribute *attr, char *buf)
+{
+	struct audio_source_instance *fi_audio = dev_get_drvdata(dev);
+	struct audio_source_config *config = fi_audio->config;
+
+	/* print PCM card and device numbers */
+	return sprintf(buf, "%d %d\n", config->card, config->device);
+}
+
+struct device *create_function_device(char *name);
+
+static struct usb_function_instance *audio_source_alloc_inst(void)
+{
+	struct audio_source_instance *fi_audio;
+	struct device_attribute **attrs;
+	struct device_attribute *attr;
+	struct device *dev;
+	void *err_ptr;
+	int err = 0;
+
+	fi_audio = kzalloc(sizeof(*fi_audio), GFP_KERNEL);
+	if (!fi_audio)
+		return ERR_PTR(-ENOMEM);
+
+	fi_audio->func_inst.set_inst_name = audio_source_set_inst_name;
+	fi_audio->func_inst.free_func_inst = audio_source_free_inst;
+
+	fi_audio->config = kzalloc(sizeof(struct audio_source_config),
+							GFP_KERNEL);
+	if (!fi_audio->config) {
+		err_ptr = ERR_PTR(-ENOMEM);
+		goto fail_audio;
+	}
+
+	config_group_init_type_name(&fi_audio->func_inst.group, "",
+						&audio_source_func_type);
+	dev = create_function_device("f_audio_source");
+
+	if (IS_ERR(dev)) {
+		err_ptr = dev;
+		goto fail_audio_config;
+	}
+
+	fi_audio->config->card = -1;
+	fi_audio->config->device = -1;
+	fi_audio->audio_device = dev;
+
+	attrs = audio_source_function_attributes;
+	if (attrs) {
+		while ((attr = *attrs++) && !err)
+			err = device_create_file(dev, attr);
+		if (err) {
+			err_ptr = ERR_PTR(-EINVAL);
+			goto fail_device;
+		}
+	}
+
+	dev_set_drvdata(dev, fi_audio);
+	_audio_dev.config = fi_audio->config;
+
+	return  &fi_audio->func_inst;
+
+fail_device:
+	device_destroy(dev->class, dev->devt);
+fail_audio_config:
+	kfree(fi_audio->config);
+fail_audio:
+	kfree(fi_audio);
+	return err_ptr;
+
+}
+
+static struct usb_function *audio_source_alloc(struct usb_function_instance *fi)
+{
+	return &_audio_dev.func;
+}
+
+DECLARE_USB_FUNCTION_INIT(audio_source, audio_source_alloc_inst,
+			audio_source_alloc);
+MODULE_LICENSE("GPL");
diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c
index 46af0aa..4713a1c 100644
--- a/drivers/usb/gadget/function/f_midi.c
+++ b/drivers/usb/gadget/function/f_midi.c
@@ -1216,6 +1216,65 @@
 	}
 }
 
+#ifdef CONFIG_USB_CONFIGFS_UEVENT
+extern struct device *create_function_device(char *name);
+static ssize_t alsa_show(struct device *dev,
+		struct device_attribute *attr, char *buf)
+{
+	struct usb_function_instance *fi_midi = dev_get_drvdata(dev);
+	struct f_midi *midi;
+
+	if (!fi_midi->f)
+		dev_warn(dev, "f_midi: function not set\n");
+
+	if (fi_midi && fi_midi->f) {
+		midi = func_to_midi(fi_midi->f);
+		if (midi->rmidi && midi->rmidi->card)
+			return sprintf(buf, "%d %d\n",
+			midi->rmidi->card->number, midi->rmidi->device);
+	}
+
+	/* print PCM card and device numbers */
+	return sprintf(buf, "%d %d\n", -1, -1);
+}
+
+static DEVICE_ATTR(alsa, S_IRUGO, alsa_show, NULL);
+
+static struct device_attribute *alsa_function_attributes[] = {
+	&dev_attr_alsa,
+	NULL
+};
+
+static int create_alsa_device(struct usb_function_instance *fi)
+{
+	struct device *dev;
+	struct device_attribute **attrs;
+	struct device_attribute *attr;
+	int err = 0;
+
+	dev = create_function_device("f_midi");
+	if (IS_ERR(dev))
+		return PTR_ERR(dev);
+
+	attrs = alsa_function_attributes;
+	if (attrs) {
+		while ((attr = *attrs++) && !err)
+			err = device_create_file(dev, attr);
+		if (err) {
+			device_destroy(dev->class, dev->devt);
+			return -EINVAL;
+		}
+	}
+	dev_set_drvdata(dev, fi);
+	return 0;
+}
+#else
+static int create_alsa_device(struct usb_function_instance *fi)
+{
+	return 0;
+}
+#endif
+
 static struct usb_function_instance *f_midi_alloc_inst(void)
 {
 	struct f_midi_opts *opts;
@@ -1234,6 +1293,11 @@
 	opts->out_ports = 1;
 	opts->refcnt = 1;
 
+	if (create_alsa_device(&opts->func_inst)) {
+		kfree(opts);
+		return ERR_PTR(-ENODEV);
+	}
+
 	config_group_init_type_name(&opts->func_inst.group, "",
 				    &midi_func_type);
 
@@ -1254,6 +1318,7 @@
 		kfifo_free(&midi->in_req_fifo);
 		kfree(midi);
 		free = true;
+		opts->func_inst.f = NULL;
 	}
 	mutex_unlock(&opts->lock);
 
@@ -1341,6 +1406,7 @@
 	midi->func.disable	= f_midi_disable;
 	midi->func.free_func	= f_midi_free;
 
+	fi->f = &midi->func;
 	return &midi->func;
 
 setup_fail:
diff --git a/drivers/vfio/Kconfig b/drivers/vfio/Kconfig
index c84333e..9aa91e7 100644
--- a/drivers/vfio/Kconfig
+++ b/drivers/vfio/Kconfig
@@ -22,7 +22,6 @@
 	tristate "VFIO Non-Privileged userspace driver framework"
 	depends on IOMMU_API
 	select VFIO_IOMMU_TYPE1 if (X86 || S390 || ARM_SMMU || ARM_SMMU_V3)
-	select ANON_INODES
 	help
 	  VFIO provides a framework for secure userspace device drivers.
 	  See Documentation/vfio.txt for more details.
diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index c362757..e93ce1c 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -382,6 +382,8 @@
 
 	down_read(&mm->mmap_sem);
 
+	vaddr = untagged_addr(vaddr);
+
 	vma = find_vma_intersection(mm, vaddr, vaddr + 1);
 
 	if (vma && vma->vm_flags & VM_PFNMAP) {
diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
index 3a0468f..89e14b0 100644
--- a/drivers/virtio/virtio_input.c
+++ b/drivers/virtio/virtio_input.c
@@ -2,6 +2,7 @@
 #include <linux/virtio.h>
 #include <linux/virtio_config.h>
 #include <linux/input.h>
+#include <linux/input/mt.h>
 
 #include <uapi/linux/virtio_ids.h>
 #include <uapi/linux/virtio_input.h>
@@ -163,6 +164,12 @@
 	virtio_cread(vi->vdev, struct virtio_input_config, u.abs.flat, &fl);
 	input_set_abs_params(vi->idev, abs, mi, ma, fu, fl);
 	input_abs_set_res(vi->idev, abs, re);
+	if (abs == ABS_MT_TRACKING_ID)
+		input_mt_init_slots(vi->idev,
+				    ma, /* input max finger */
+				    INPUT_MT_DIRECT
+					| INPUT_MT_DROP_UNUSED
+					| INPUT_MT_TRACK);
 }
 
 static int virtinput_init_vqs(struct virtio_input *vi)
diff --git a/fs/Kconfig b/fs/Kconfig
index ac474a6..f0dde0d 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -105,6 +105,8 @@
 
 source "fs/crypto/Kconfig"
 
+source "fs/verity/Kconfig"
+
 source "fs/notify/Kconfig"
 
 source "fs/quota/Kconfig"
@@ -234,6 +236,7 @@
 source "fs/adfs/Kconfig"
 source "fs/affs/Kconfig"
 source "fs/ecryptfs/Kconfig"
+source "fs/sdcardfs/Kconfig"
 source "fs/hfs/Kconfig"
 source "fs/hfsplus/Kconfig"
 source "fs/befs/Kconfig"
@@ -313,5 +316,6 @@
 
 source "fs/nls/Kconfig"
 source "fs/dlm/Kconfig"
+source "fs/unicode/Kconfig"
 
 endmenu
diff --git a/fs/Makefile b/fs/Makefile
index 293733f..1174899 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -24,7 +24,7 @@
 
 obj-y				+= notify/
 obj-$(CONFIG_EPOLL)		+= eventpoll.o
-obj-$(CONFIG_ANON_INODES)	+= anon_inodes.o
+obj-y				+= anon_inodes.o
 obj-$(CONFIG_SIGNALFD)		+= signalfd.o
 obj-$(CONFIG_TIMERFD)		+= timerfd.o
 obj-$(CONFIG_EVENTFD)		+= eventfd.o
@@ -32,6 +32,7 @@
 obj-$(CONFIG_AIO)               += aio.o
 obj-$(CONFIG_FS_DAX)		+= dax.o
 obj-$(CONFIG_FS_ENCRYPTION)	+= crypto/
+obj-$(CONFIG_FS_VERITY)		+= verity/
 obj-$(CONFIG_FILE_LOCKING)      += locks.o
 obj-$(CONFIG_COMPAT)		+= compat.o compat_ioctl.o
 obj-$(CONFIG_BINFMT_AOUT)	+= binfmt_aout.o
@@ -84,12 +85,14 @@
 obj-$(CONFIG_HFSPLUS_FS)	+= hfsplus/ # Before hfs to find wrapped HFS+
 obj-$(CONFIG_HFS_FS)		+= hfs/
 obj-$(CONFIG_ECRYPT_FS)		+= ecryptfs/
+obj-$(CONFIG_SDCARD_FS)		+= sdcardfs/
 obj-$(CONFIG_VXFS_FS)		+= freevxfs/
 obj-$(CONFIG_NFS_FS)		+= nfs/
 obj-$(CONFIG_EXPORTFS)		+= exportfs/
 obj-$(CONFIG_NFSD)		+= nfsd/
 obj-$(CONFIG_LOCKD)		+= lockd/
 obj-$(CONFIG_NLS)		+= nls/
+obj-$(CONFIG_UNICODE)		+= unicode/
 obj-$(CONFIG_SYSV_FS)		+= sysv/
 obj-$(CONFIG_CIFS)		+= cifs/
 obj-$(CONFIG_HPFS_FS)		+= hpfs/
diff --git a/fs/attr.c b/fs/attr.c
index d22e818..bea2f7c 100644
--- a/fs/attr.c
+++ b/fs/attr.c
@@ -223,7 +223,7 @@
  * the file open for write, as there can be no conflicting delegation in
  * that case.
  */
-int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **delegated_inode)
+int notify_change2(struct vfsmount *mnt, struct dentry * dentry, struct iattr * attr, struct inode **delegated_inode)
 {
 	struct inode *inode = dentry->d_inode;
 	umode_t mode = inode->i_mode;
@@ -247,7 +247,7 @@
 			return -EPERM;
 
 		if (!inode_owner_or_capable(inode)) {
-			error = inode_permission(inode, MAY_WRITE);
+			error = inode_permission2(mnt, inode, MAY_WRITE);
 			if (error)
 				return error;
 		}
@@ -330,7 +330,9 @@
 	if (error)
 		return error;
 
-	if (inode->i_op->setattr)
+	if (mnt && inode->i_op->setattr2)
+		error = inode->i_op->setattr2(mnt, dentry, attr);
+	else if (inode->i_op->setattr)
 		error = inode->i_op->setattr(dentry, attr);
 	else
 		error = simple_setattr(dentry, attr);
@@ -343,4 +345,10 @@
 
 	return error;
 }
+EXPORT_SYMBOL(notify_change2);
+
+int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **delegated_inode)
+{
+	return notify_change2(NULL, dentry, attr, delegated_inode);
+}
 EXPORT_SYMBOL(notify_change);
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 1c25dae..8cf0f8f 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1909,6 +1909,9 @@
 	if (bdev_read_only(I_BDEV(bd_inode)))
 		return -EPERM;
 
+	if (IS_SWAPFILE(bd_inode))
+		return -ETXTBSY;
+
 	if (!iov_iter_count(from))
 		return 0;
 
diff --git a/fs/buffer.c b/fs/buffer.c
index a550e0d..88d222f 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -46,6 +46,7 @@
 #include <linux/pagevec.h>
 #include <linux/sched/mm.h>
 #include <trace/events/block.h>
+#include <linux/fscrypt.h>
 
 static int fsync_buffers_list(spinlock_t *lock, struct list_head *list);
 static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,
@@ -3068,6 +3069,8 @@
 	 */
 	bio = bio_alloc(GFP_NOIO, 1);
 
+	fscrypt_set_bio_crypt_ctx_bh(bio, bh, GFP_NOIO | __GFP_NOFAIL);
+
 	if (wbc) {
 		wbc_init_bio(wbc, bio);
 		wbc_account_io(wbc, bh->b_page, bh->b_size);
diff --git a/fs/coredump.c b/fs/coredump.c
index 1e2c87a..d9b3ba0 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -742,7 +742,7 @@
 			goto close_fail;
 		if (!(cprm.file->f_mode & FMODE_CAN_WRITE))
 			goto close_fail;
-		if (do_truncate(cprm.file->f_path.dentry, 0, 0, cprm.file))
+		if (do_truncate2(cprm.file->f_path.mnt, cprm.file->f_path.dentry, 0, 0, cprm.file))
 			goto close_fail;
 	}
 
diff --git a/fs/crypto/Kconfig b/fs/crypto/Kconfig
index 02b7d91..0701bb9 100644
--- a/fs/crypto/Kconfig
+++ b/fs/crypto/Kconfig
@@ -1,16 +1,23 @@
 config FS_ENCRYPTION
-	tristate "FS Encryption (Per-file encryption)"
+	bool "FS Encryption (Per-file encryption)"
 	select CRYPTO
 	select CRYPTO_AES
 	select CRYPTO_CBC
 	select CRYPTO_ECB
 	select CRYPTO_XTS
 	select CRYPTO_CTS
-	select CRYPTO_CTR
-	select CRYPTO_SHA256
+	select CRYPTO_SHA512
+	select CRYPTO_HMAC
 	select KEYS
 	help
 	  Enable encryption of files and directories.  This
 	  feature is similar to ecryptfs, but it is more memory
 	  efficient since it avoids caching the encrypted and
-	  decrypted pages in the page cache.
+	  decrypted pages in the page cache.  Currently Ext4,
+	  F2FS and UBIFS make use of this feature.
+
+config FS_ENCRYPTION_INLINE_CRYPT
+	bool "Enable fscrypt to use inline crypto"
+	depends on FS_ENCRYPTION && BLK_INLINE_ENCRYPTION
+	help
+	  Enable fscrypt to use inline encryption hardware if available.
diff --git a/fs/crypto/Makefile b/fs/crypto/Makefile
index cb49698..1a6b077 100644
--- a/fs/crypto/Makefile
+++ b/fs/crypto/Makefile
@@ -1,4 +1,13 @@
 obj-$(CONFIG_FS_ENCRYPTION)	+= fscrypto.o
 
-fscrypto-y := crypto.o fname.o hooks.o keyinfo.o policy.o
+fscrypto-y := crypto.o \
+	      fname.o \
+	      hkdf.o \
+	      hooks.o \
+	      keyring.o \
+	      keysetup.o \
+	      keysetup_v1.o \
+	      policy.o
+
 fscrypto-$(CONFIG_BLOCK) += bio.o
+fscrypto-$(CONFIG_FS_ENCRYPTION_INLINE_CRYPT) += inline_crypt.o
diff --git a/fs/crypto/bio.c b/fs/crypto/bio.c
index 0959044..9dcb570 100644
--- a/fs/crypto/bio.c
+++ b/fs/crypto/bio.c
@@ -26,114 +26,64 @@
 #include <linux/namei.h>
 #include "fscrypt_private.h"
 
-static void __fscrypt_decrypt_bio(struct bio *bio, bool done)
+void fscrypt_decrypt_bio(struct bio *bio)
 {
 	struct bio_vec *bv;
 	int i;
 
 	bio_for_each_segment_all(bv, bio, i) {
 		struct page *page = bv->bv_page;
-		int ret = fscrypt_decrypt_page(page->mapping->host, page,
-				PAGE_SIZE, 0, page->index);
-
-		if (ret) {
-			WARN_ON_ONCE(1);
+		int ret = fscrypt_decrypt_pagecache_blocks(page, bv->bv_len,
+							   bv->bv_offset);
+		if (ret)
 			SetPageError(page);
-		} else if (done) {
-			SetPageUptodate(page);
-		}
-		if (done)
-			unlock_page(page);
 	}
 }
-
-void fscrypt_decrypt_bio(struct bio *bio)
-{
-	__fscrypt_decrypt_bio(bio, false);
-}
 EXPORT_SYMBOL(fscrypt_decrypt_bio);
 
-static void completion_pages(struct work_struct *work)
-{
-	struct fscrypt_ctx *ctx =
-		container_of(work, struct fscrypt_ctx, r.work);
-	struct bio *bio = ctx->r.bio;
-
-	__fscrypt_decrypt_bio(bio, true);
-	fscrypt_release_ctx(ctx);
-	bio_put(bio);
-}
-
-void fscrypt_enqueue_decrypt_bio(struct fscrypt_ctx *ctx, struct bio *bio)
-{
-	INIT_WORK(&ctx->r.work, completion_pages);
-	ctx->r.bio = bio;
-	fscrypt_enqueue_decrypt_work(&ctx->r.work);
-}
-EXPORT_SYMBOL(fscrypt_enqueue_decrypt_bio);
-
-void fscrypt_pullback_bio_page(struct page **page, bool restore)
-{
-	struct fscrypt_ctx *ctx;
-	struct page *bounce_page;
-
-	/* The bounce data pages are unmapped. */
-	if ((*page)->mapping)
-		return;
-
-	/* The bounce data page is unmapped. */
-	bounce_page = *page;
-	ctx = (struct fscrypt_ctx *)page_private(bounce_page);
-
-	/* restore control page */
-	*page = ctx->w.control_page;
-
-	if (restore)
-		fscrypt_restore_control_page(bounce_page);
-}
-EXPORT_SYMBOL(fscrypt_pullback_bio_page);
-
 int fscrypt_zeroout_range(const struct inode *inode, pgoff_t lblk,
 				sector_t pblk, unsigned int len)
 {
-	struct fscrypt_ctx *ctx;
-	struct page *ciphertext_page = NULL;
+	const unsigned int blockbits = inode->i_blkbits;
+	const unsigned int blocksize = 1 << blockbits;
+	const bool inlinecrypt = fscrypt_inode_uses_inline_crypto(inode);
+	struct page *ciphertext_page;
 	struct bio *bio;
 	int ret, err = 0;
 
-	BUG_ON(inode->i_sb->s_blocksize != PAGE_SIZE);
-
-	ctx = fscrypt_get_ctx(inode, GFP_NOFS);
-	if (IS_ERR(ctx))
-		return PTR_ERR(ctx);
-
-	ciphertext_page = fscrypt_alloc_bounce_page(ctx, GFP_NOWAIT);
-	if (IS_ERR(ciphertext_page)) {
-		err = PTR_ERR(ciphertext_page);
-		goto errout;
+	if (inlinecrypt) {
+		ciphertext_page = ZERO_PAGE(0);
+	} else {
+		ciphertext_page = fscrypt_alloc_bounce_page(GFP_NOWAIT);
+		if (!ciphertext_page)
+			return -ENOMEM;
 	}
 
 	while (len--) {
-		err = fscrypt_do_page_crypto(inode, FS_ENCRYPT, lblk,
-					     ZERO_PAGE(0), ciphertext_page,
-					     PAGE_SIZE, 0, GFP_NOFS);
-		if (err)
-			goto errout;
+		if (!inlinecrypt) {
+			err = fscrypt_crypt_block(inode, FS_ENCRYPT, lblk,
+						  ZERO_PAGE(0), ciphertext_page,
+						  blocksize, 0, GFP_NOFS);
+			if (err)
+				goto errout;
+		}
 
 		bio = bio_alloc(GFP_NOWAIT, 1);
 		if (!bio) {
 			err = -ENOMEM;
 			goto errout;
 		}
+		err = fscrypt_set_bio_crypt_ctx(bio, inode, lblk, GFP_NOIO);
+		if (err) {
+			bio_put(bio);
+			goto errout;
+		}
 		bio_set_dev(bio, inode->i_sb->s_bdev);
-		bio->bi_iter.bi_sector =
-			pblk << (inode->i_sb->s_blocksize_bits - 9);
+		bio->bi_iter.bi_sector = pblk << (blockbits - 9);
 		bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
-		ret = bio_add_page(bio, ciphertext_page,
-					inode->i_sb->s_blocksize, 0);
-		if (ret != inode->i_sb->s_blocksize) {
+		ret = bio_add_page(bio, ciphertext_page, blocksize, 0);
+		if (WARN_ON(ret != blocksize)) {
 			/* should never happen! */
-			WARN_ON(1);
 			bio_put(bio);
 			err = -EIO;
 			goto errout;
@@ -149,7 +99,8 @@
 	}
 	err = 0;
 errout:
-	fscrypt_release_ctx(ctx);
+	if (!inlinecrypt)
+		fscrypt_free_bounce_page(ciphertext_page);
 	return err;
 }
 EXPORT_SYMBOL(fscrypt_zeroout_range);
diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c
index c83ddff..6e6f39e 100644
--- a/fs/crypto/crypto.c
+++ b/fs/crypto/crypto.c
@@ -26,29 +26,20 @@
 #include <linux/ratelimit.h>
 #include <linux/dcache.h>
 #include <linux/namei.h>
-#include <crypto/aes.h>
 #include <crypto/skcipher.h>
 #include "fscrypt_private.h"
 
 static unsigned int num_prealloc_crypto_pages = 32;
-static unsigned int num_prealloc_crypto_ctxs = 128;
 
 module_param(num_prealloc_crypto_pages, uint, 0444);
 MODULE_PARM_DESC(num_prealloc_crypto_pages,
 		"Number of crypto pages to preallocate");
-module_param(num_prealloc_crypto_ctxs, uint, 0444);
-MODULE_PARM_DESC(num_prealloc_crypto_ctxs,
-		"Number of crypto contexts to preallocate");
 
 static mempool_t *fscrypt_bounce_page_pool = NULL;
 
-static LIST_HEAD(fscrypt_free_ctxs);
-static DEFINE_SPINLOCK(fscrypt_ctx_lock);
-
 static struct workqueue_struct *fscrypt_read_workqueue;
 static DEFINE_MUTEX(fscrypt_init_mutex);
 
-static struct kmem_cache *fscrypt_ctx_cachep;
 struct kmem_cache *fscrypt_info_cachep;
 
 void fscrypt_enqueue_decrypt_work(struct work_struct *work)
@@ -57,91 +48,50 @@
 }
 EXPORT_SYMBOL(fscrypt_enqueue_decrypt_work);
 
-/**
- * fscrypt_release_ctx() - Releases an encryption context
- * @ctx: The encryption context to release.
- *
- * If the encryption context was allocated from the pre-allocated pool, returns
- * it to that pool. Else, frees it.
- *
- * If there's a bounce page in the context, this frees that.
- */
-void fscrypt_release_ctx(struct fscrypt_ctx *ctx)
+struct page *fscrypt_alloc_bounce_page(gfp_t gfp_flags)
 {
-	unsigned long flags;
-
-	if (ctx->flags & FS_CTX_HAS_BOUNCE_BUFFER_FL && ctx->w.bounce_page) {
-		mempool_free(ctx->w.bounce_page, fscrypt_bounce_page_pool);
-		ctx->w.bounce_page = NULL;
-	}
-	ctx->w.control_page = NULL;
-	if (ctx->flags & FS_CTX_REQUIRES_FREE_ENCRYPT_FL) {
-		kmem_cache_free(fscrypt_ctx_cachep, ctx);
-	} else {
-		spin_lock_irqsave(&fscrypt_ctx_lock, flags);
-		list_add(&ctx->free_list, &fscrypt_free_ctxs);
-		spin_unlock_irqrestore(&fscrypt_ctx_lock, flags);
-	}
+	return mempool_alloc(fscrypt_bounce_page_pool, gfp_flags);
 }
-EXPORT_SYMBOL(fscrypt_release_ctx);
 
 /**
- * fscrypt_get_ctx() - Gets an encryption context
- * @inode:       The inode for which we are doing the crypto
- * @gfp_flags:   The gfp flag for memory allocation
+ * fscrypt_free_bounce_page() - free a ciphertext bounce page
  *
- * Allocates and initializes an encryption context.
- *
- * Return: An allocated and initialized encryption context on success; error
- * value or NULL otherwise.
+ * Free a bounce page that was allocated by fscrypt_encrypt_pagecache_blocks(),
+ * or by fscrypt_alloc_bounce_page() directly.
  */
-struct fscrypt_ctx *fscrypt_get_ctx(const struct inode *inode, gfp_t gfp_flags)
+void fscrypt_free_bounce_page(struct page *bounce_page)
 {
-	struct fscrypt_ctx *ctx = NULL;
-	struct fscrypt_info *ci = inode->i_crypt_info;
-	unsigned long flags;
-
-	if (ci == NULL)
-		return ERR_PTR(-ENOKEY);
-
-	/*
-	 * We first try getting the ctx from a free list because in
-	 * the common case the ctx will have an allocated and
-	 * initialized crypto tfm, so it's probably a worthwhile
-	 * optimization. For the bounce page, we first try getting it
-	 * from the kernel allocator because that's just about as fast
-	 * as getting it from a list and because a cache of free pages
-	 * should generally be a "last resort" option for a filesystem
-	 * to be able to do its job.
-	 */
-	spin_lock_irqsave(&fscrypt_ctx_lock, flags);
-	ctx = list_first_entry_or_null(&fscrypt_free_ctxs,
-					struct fscrypt_ctx, free_list);
-	if (ctx)
-		list_del(&ctx->free_list);
-	spin_unlock_irqrestore(&fscrypt_ctx_lock, flags);
-	if (!ctx) {
-		ctx = kmem_cache_zalloc(fscrypt_ctx_cachep, gfp_flags);
-		if (!ctx)
-			return ERR_PTR(-ENOMEM);
-		ctx->flags |= FS_CTX_REQUIRES_FREE_ENCRYPT_FL;
-	} else {
-		ctx->flags &= ~FS_CTX_REQUIRES_FREE_ENCRYPT_FL;
-	}
-	ctx->flags &= ~FS_CTX_HAS_BOUNCE_BUFFER_FL;
-	return ctx;
+	if (!bounce_page)
+		return;
+	set_page_private(bounce_page, (unsigned long)NULL);
+	ClearPagePrivate(bounce_page);
+	mempool_free(bounce_page, fscrypt_bounce_page_pool);
 }
-EXPORT_SYMBOL(fscrypt_get_ctx);
+EXPORT_SYMBOL(fscrypt_free_bounce_page);
 
-int fscrypt_do_page_crypto(const struct inode *inode, fscrypt_direction_t rw,
-			   u64 lblk_num, struct page *src_page,
-			   struct page *dest_page, unsigned int len,
-			   unsigned int offs, gfp_t gfp_flags)
+void fscrypt_generate_iv(union fscrypt_iv *iv, u64 lblk_num,
+			 const struct fscrypt_info *ci)
 {
-	struct {
-		__le64 index;
-		u8 padding[FS_IV_SIZE - sizeof(__le64)];
-	} iv;
+	u8 flags = fscrypt_policy_flags(&ci->ci_policy);
+
+	memset(iv, 0, ci->ci_mode->ivsize);
+
+	if (flags & FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64) {
+		WARN_ON_ONCE((u32)lblk_num != lblk_num);
+		lblk_num |= (u64)ci->ci_inode->i_ino << 32;
+	} else if (flags & FSCRYPT_POLICY_FLAG_DIRECT_KEY) {
+		memcpy(iv->nonce, ci->ci_nonce, FS_KEY_DERIVATION_NONCE_SIZE);
+	}
+	iv->lblk_num = cpu_to_le64(lblk_num);
+}
+
+/* Encrypt or decrypt a single filesystem block of file contents */
+int fscrypt_crypt_block(const struct inode *inode, fscrypt_direction_t rw,
+			u64 lblk_num, struct page *src_page,
+			struct page *dest_page, unsigned int len,
+			unsigned int offs, gfp_t gfp_flags)
+{
+	union fscrypt_iv iv;
 	struct skcipher_request *req = NULL;
 	DECLARE_CRYPTO_WAIT(wait);
 	struct scatterlist dst, src;
@@ -154,15 +104,7 @@
 	if (WARN_ON_ONCE(len % FS_CRYPTO_BLOCK_SIZE != 0))
 		return -EINVAL;
 
-	BUILD_BUG_ON(sizeof(iv) != FS_IV_SIZE);
-	BUILD_BUG_ON(AES_BLOCK_SIZE != FS_IV_SIZE);
-	iv.index = cpu_to_le64(lblk_num);
-	memset(iv.padding, 0, sizeof(iv.padding));
-
-	if (ci->ci_essiv_tfm != NULL) {
-		crypto_cipher_encrypt_one(ci->ci_essiv_tfm, (u8 *)&iv,
-					  (u8 *)&iv);
-	}
+	fscrypt_generate_iv(&iv, lblk_num, ci);
 
 	req = skcipher_request_alloc(tfm, gfp_flags);
 	if (!req)
@@ -183,205 +125,214 @@
 		res = crypto_wait_req(crypto_skcipher_encrypt(req), &wait);
 	skcipher_request_free(req);
 	if (res) {
-		fscrypt_err(inode->i_sb,
-			    "%scryption failed for inode %lu, block %llu: %d",
-			    (rw == FS_DECRYPT ? "de" : "en"),
-			    inode->i_ino, lblk_num, res);
+		fscrypt_err(inode, "%scryption failed for block %llu: %d",
+			    (rw == FS_DECRYPT ? "De" : "En"), lblk_num, res);
 		return res;
 	}
 	return 0;
 }
 
-struct page *fscrypt_alloc_bounce_page(struct fscrypt_ctx *ctx,
-				       gfp_t gfp_flags)
-{
-	ctx->w.bounce_page = mempool_alloc(fscrypt_bounce_page_pool, gfp_flags);
-	if (ctx->w.bounce_page == NULL)
-		return ERR_PTR(-ENOMEM);
-	ctx->flags |= FS_CTX_HAS_BOUNCE_BUFFER_FL;
-	return ctx->w.bounce_page;
-}
-
 /**
- * fscypt_encrypt_page() - Encrypts a page
- * @inode:     The inode for which the encryption should take place
- * @page:      The page to encrypt. Must be locked for bounce-page
- *             encryption.
- * @len:       Length of data to encrypt in @page and encrypted
- *             data in returned page.
- * @offs:      Offset of data within @page and returned
- *             page holding encrypted data.
- * @lblk_num:  Logical block number. This must be unique for multiple
- *             calls with same inode, except when overwriting
- *             previously written data.
- * @gfp_flags: The gfp flag for memory allocation
+ * fscrypt_encrypt_pagecache_blocks() - Encrypt filesystem blocks from a pagecache page
+ * @page:      The locked pagecache page containing the block(s) to encrypt
+ * @len:       Total size of the block(s) to encrypt.  Must be a nonzero
+ *		multiple of the filesystem's block size.
+ * @offs:      Byte offset within @page of the first block to encrypt.  Must be
+ *		a multiple of the filesystem's block size.
+ * @gfp_flags: Memory allocation flags
  *
- * Encrypts @page using the ctx encryption context. Performs encryption
- * either in-place or into a newly allocated bounce page.
- * Called on the page write path.
+ * A new bounce page is allocated, and the specified block(s) are encrypted into
+ * it.  In the bounce page, the ciphertext block(s) will be located at the same
+ * offsets at which the plaintext block(s) were located in the source page; any
+ * other parts of the bounce page will be left uninitialized.  However, normally
+ * blocksize == PAGE_SIZE and the whole page is encrypted at once.
  *
- * Bounce page allocation is the default.
- * In this case, the contents of @page are encrypted and stored in an
- * allocated bounce page. @page has to be locked and the caller must call
- * fscrypt_restore_control_page() on the returned ciphertext page to
- * release the bounce buffer and the encryption context.
+ * This is for use by the filesystem's ->writepages() method.
  *
- * In-place encryption is used by setting the FS_CFLG_OWN_PAGES flag in
- * fscrypt_operations. Here, the input-page is returned with its content
- * encrypted.
- *
- * Return: A page with the encrypted content on success. Else, an
- * error value or NULL.
+ * Return: the new encrypted bounce page on success; an ERR_PTR() on failure
  */
-struct page *fscrypt_encrypt_page(const struct inode *inode,
-				struct page *page,
-				unsigned int len,
-				unsigned int offs,
-				u64 lblk_num, gfp_t gfp_flags)
+struct page *fscrypt_encrypt_pagecache_blocks(struct page *page,
+					      unsigned int len,
+					      unsigned int offs,
+					      gfp_t gfp_flags)
 
 {
-	struct fscrypt_ctx *ctx;
-	struct page *ciphertext_page = page;
+	const struct inode *inode = page->mapping->host;
+	const unsigned int blockbits = inode->i_blkbits;
+	const unsigned int blocksize = 1 << blockbits;
+	struct page *ciphertext_page;
+	u64 lblk_num = ((u64)page->index << (PAGE_SHIFT - blockbits)) +
+		       (offs >> blockbits);
+	unsigned int i;
 	int err;
 
-	if (inode->i_sb->s_cop->flags & FS_CFLG_OWN_PAGES) {
-		/* with inplace-encryption we just encrypt the page */
-		err = fscrypt_do_page_crypto(inode, FS_ENCRYPT, lblk_num, page,
-					     ciphertext_page, len, offs,
-					     gfp_flags);
-		if (err)
-			return ERR_PTR(err);
-
-		return ciphertext_page;
-	}
-
 	if (WARN_ON_ONCE(!PageLocked(page)))
 		return ERR_PTR(-EINVAL);
 
-	ctx = fscrypt_get_ctx(inode, gfp_flags);
-	if (IS_ERR(ctx))
-		return (struct page *)ctx;
+	if (WARN_ON_ONCE(len <= 0 || !IS_ALIGNED(len | offs, blocksize)))
+		return ERR_PTR(-EINVAL);
 
-	/* The encryption operation will require a bounce page. */
-	ciphertext_page = fscrypt_alloc_bounce_page(ctx, gfp_flags);
-	if (IS_ERR(ciphertext_page))
-		goto errout;
+	ciphertext_page = fscrypt_alloc_bounce_page(gfp_flags);
+	if (!ciphertext_page)
+		return ERR_PTR(-ENOMEM);
 
-	ctx->w.control_page = page;
-	err = fscrypt_do_page_crypto(inode, FS_ENCRYPT, lblk_num,
-				     page, ciphertext_page, len, offs,
-				     gfp_flags);
-	if (err) {
-		ciphertext_page = ERR_PTR(err);
-		goto errout;
+	for (i = offs; i < offs + len; i += blocksize, lblk_num++) {
+		err = fscrypt_crypt_block(inode, FS_ENCRYPT, lblk_num,
+					  page, ciphertext_page,
+					  blocksize, i, gfp_flags);
+		if (err) {
+			fscrypt_free_bounce_page(ciphertext_page);
+			return ERR_PTR(err);
+		}
 	}
 	SetPagePrivate(ciphertext_page);
-	set_page_private(ciphertext_page, (unsigned long)ctx);
-	lock_page(ciphertext_page);
-	return ciphertext_page;
-
-errout:
-	fscrypt_release_ctx(ctx);
+	set_page_private(ciphertext_page, (unsigned long)page);
 	return ciphertext_page;
 }
-EXPORT_SYMBOL(fscrypt_encrypt_page);
+EXPORT_SYMBOL(fscrypt_encrypt_pagecache_blocks);
 
 /**
- * fscrypt_decrypt_page() - Decrypts a page in-place
- * @inode:     The corresponding inode for the page to decrypt.
- * @page:      The page to decrypt. Must be locked in case
- *             it is a writeback page (FS_CFLG_OWN_PAGES unset).
- * @len:       Number of bytes in @page to be decrypted.
- * @offs:      Start of data in @page.
- * @lblk_num:  Logical block number.
+ * fscrypt_encrypt_block_inplace() - Encrypt a filesystem block in-place
+ * @inode:     The inode to which this block belongs
+ * @page:      The page containing the block to encrypt
+ * @len:       Size of block to encrypt.  Doesn't need to be a multiple of the
+ *		fs block size, but must be a multiple of FS_CRYPTO_BLOCK_SIZE.
+ * @offs:      Byte offset within @page at which the block to encrypt begins
+ * @lblk_num:  Filesystem logical block number of the block, i.e. the 0-based
+ *		number of the block within the file
+ * @gfp_flags: Memory allocation flags
  *
- * Decrypts page in-place using the ctx encryption context.
+ * Encrypt a possibly-compressed filesystem block that is located in an
+ * arbitrary page, not necessarily in the original pagecache page.  The @inode
+ * and @lblk_num must be specified, as they can't be determined from @page.
  *
- * Called from the read completion callback.
- *
- * Return: Zero on success, non-zero otherwise.
+ * Return: 0 on success; -errno on failure
  */
-int fscrypt_decrypt_page(const struct inode *inode, struct page *page,
-			unsigned int len, unsigned int offs, u64 lblk_num)
+int fscrypt_encrypt_block_inplace(const struct inode *inode, struct page *page,
+				  unsigned int len, unsigned int offs,
+				  u64 lblk_num, gfp_t gfp_flags)
 {
-	if (WARN_ON_ONCE(!PageLocked(page) &&
-			 !(inode->i_sb->s_cop->flags & FS_CFLG_OWN_PAGES)))
+	return fscrypt_crypt_block(inode, FS_ENCRYPT, lblk_num, page, page,
+				   len, offs, gfp_flags);
+}
+EXPORT_SYMBOL(fscrypt_encrypt_block_inplace);
+
+/**
+ * fscrypt_decrypt_pagecache_blocks() - Decrypt filesystem blocks in a pagecache page
+ * @page:      The locked pagecache page containing the block(s) to decrypt
+ * @len:       Total size of the block(s) to decrypt.  Must be a nonzero
+ *		multiple of the filesystem's block size.
+ * @offs:      Byte offset within @page of the first block to decrypt.  Must be
+ *		a multiple of the filesystem's block size.
+ *
+ * The specified block(s) are decrypted in-place within the pagecache page,
+ * which must still be locked and not uptodate.  Normally, blocksize ==
+ * PAGE_SIZE and the whole page is decrypted at once.
+ *
+ * This is for use by the filesystem's ->readpages() method.
+ *
+ * Return: 0 on success; -errno on failure
+ */
+int fscrypt_decrypt_pagecache_blocks(struct page *page, unsigned int len,
+				     unsigned int offs)
+{
+	const struct inode *inode = page->mapping->host;
+	const unsigned int blockbits = inode->i_blkbits;
+	const unsigned int blocksize = 1 << blockbits;
+	u64 lblk_num = ((u64)page->index << (PAGE_SHIFT - blockbits)) +
+		       (offs >> blockbits);
+	unsigned int i;
+	int err;
+
+	if (WARN_ON_ONCE(!PageLocked(page)))
 		return -EINVAL;
 
-	return fscrypt_do_page_crypto(inode, FS_DECRYPT, lblk_num, page, page,
-				      len, offs, GFP_NOFS);
+	if (WARN_ON_ONCE(len <= 0 || !IS_ALIGNED(len | offs, blocksize)))
+		return -EINVAL;
+
+	for (i = offs; i < offs + len; i += blocksize, lblk_num++) {
+		err = fscrypt_crypt_block(inode, FS_DECRYPT, lblk_num, page,
+					  page, blocksize, i, GFP_NOFS);
+		if (err)
+			return err;
+	}
+	return 0;
 }
-EXPORT_SYMBOL(fscrypt_decrypt_page);
+EXPORT_SYMBOL(fscrypt_decrypt_pagecache_blocks);
+
+/**
+ * fscrypt_decrypt_block_inplace() - Decrypt a filesystem block in-place
+ * @inode:     The inode to which this block belongs
+ * @page:      The page containing the block to decrypt
+ * @len:       Size of block to decrypt.  Doesn't need to be a multiple of the
+ *		fs block size, but must be a multiple of FS_CRYPTO_BLOCK_SIZE.
+ * @offs:      Byte offset within @page at which the block to decrypt begins
+ * @lblk_num:  Filesystem logical block number of the block, i.e. the 0-based
+ *		number of the block within the file
+ *
+ * Decrypt a possibly-compressed filesystem block that is located in an
+ * arbitrary page, not necessarily in the original pagecache page.  The @inode
+ * and @lblk_num must be specified, as they can't be determined from @page.
+ *
+ * Return: 0 on success; -errno on failure
+ */
+int fscrypt_decrypt_block_inplace(const struct inode *inode, struct page *page,
+				  unsigned int len, unsigned int offs,
+				  u64 lblk_num)
+{
+	return fscrypt_crypt_block(inode, FS_DECRYPT, lblk_num, page, page,
+				   len, offs, GFP_NOFS);
+}
+EXPORT_SYMBOL(fscrypt_decrypt_block_inplace);
 
 /*
- * Validate dentries for encrypted directories to make sure we aren't
- * potentially caching stale data after a key has been added or
- * removed.
+ * Validate dentries in encrypted directories to make sure we aren't potentially
+ * caching stale dentries after a key has been added.
  */
 static int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags)
 {
 	struct dentry *dir;
-	int dir_has_key, cached_with_key;
+	int err;
+	int valid;
+
+	/*
+	 * Plaintext names are always valid, since fscrypt doesn't support
+	 * reverting to ciphertext names without evicting the directory's inode
+	 * -- which implies eviction of the dentries in the directory.
+	 */
+	if (!(dentry->d_flags & DCACHE_ENCRYPTED_NAME))
+		return 1;
+
+	/*
+	 * Ciphertext name; valid if the directory's key is still unavailable.
+	 *
+	 * Although fscrypt forbids rename() on ciphertext names, we still must
+	 * use dget_parent() here rather than use ->d_parent directly.  That's
+	 * because a corrupted fs image may contain directory hard links, which
+	 * the VFS handles by moving the directory's dentry tree in the dcache
+	 * each time ->lookup() finds the directory and it already has a dentry
+	 * elsewhere.  Thus ->d_parent can be changing, and we must safely grab
+	 * a reference to some ->d_parent to prevent it from being freed.
+	 */
 
 	if (flags & LOOKUP_RCU)
 		return -ECHILD;
 
 	dir = dget_parent(dentry);
-	if (!IS_ENCRYPTED(d_inode(dir))) {
-		dput(dir);
-		return 0;
-	}
-
-	spin_lock(&dentry->d_lock);
-	cached_with_key = dentry->d_flags & DCACHE_ENCRYPTED_WITH_KEY;
-	spin_unlock(&dentry->d_lock);
-	dir_has_key = (d_inode(dir)->i_crypt_info != NULL);
+	err = fscrypt_get_encryption_info(d_inode(dir));
+	valid = !fscrypt_has_encryption_key(d_inode(dir));
 	dput(dir);
 
-	/*
-	 * If the dentry was cached without the key, and it is a
-	 * negative dentry, it might be a valid name.  We can't check
-	 * if the key has since been made available due to locking
-	 * reasons, so we fail the validation so ext4_lookup() can do
-	 * this check.
-	 *
-	 * We also fail the validation if the dentry was created with
-	 * the key present, but we no longer have the key, or vice versa.
-	 */
-	if ((!cached_with_key && d_is_negative(dentry)) ||
-			(!cached_with_key && dir_has_key) ||
-			(cached_with_key && !dir_has_key))
-		return 0;
-	return 1;
+	if (err < 0)
+		return err;
+
+	return valid;
 }
 
 const struct dentry_operations fscrypt_d_ops = {
 	.d_revalidate = fscrypt_d_revalidate,
 };
 
-void fscrypt_restore_control_page(struct page *page)
-{
-	struct fscrypt_ctx *ctx;
-
-	ctx = (struct fscrypt_ctx *)page_private(page);
-	set_page_private(page, (unsigned long)NULL);
-	ClearPagePrivate(page);
-	unlock_page(page);
-	fscrypt_release_ctx(ctx);
-}
-EXPORT_SYMBOL(fscrypt_restore_control_page);
-
-static void fscrypt_destroy(void)
-{
-	struct fscrypt_ctx *pos, *n;
-
-	list_for_each_entry_safe(pos, n, &fscrypt_free_ctxs, free_list)
-		kmem_cache_free(fscrypt_ctx_cachep, pos);
-	INIT_LIST_HEAD(&fscrypt_free_ctxs);
-	mempool_destroy(fscrypt_bounce_page_pool);
-	fscrypt_bounce_page_pool = NULL;
-}
-
 /**
  * fscrypt_initialize() - allocate major buffers for fs encryption.
  * @cop_flags:  fscrypt operations flags
@@ -389,11 +340,11 @@
  * We only call this when we start accessing encrypted files, since it
  * results in memory getting allocated that wouldn't otherwise be used.
  *
- * Return: Zero on success, non-zero otherwise.
+ * Return: 0 on success; -errno on failure
  */
 int fscrypt_initialize(unsigned int cop_flags)
 {
-	int i, res = -ENOMEM;
+	int err = 0;
 
 	/* No need to allocate a bounce page pool if this FS won't use it. */
 	if (cop_flags & FS_CFLG_OWN_PAGES)
@@ -401,32 +352,21 @@
 
 	mutex_lock(&fscrypt_init_mutex);
 	if (fscrypt_bounce_page_pool)
-		goto already_initialized;
+		goto out_unlock;
 
-	for (i = 0; i < num_prealloc_crypto_ctxs; i++) {
-		struct fscrypt_ctx *ctx;
-
-		ctx = kmem_cache_zalloc(fscrypt_ctx_cachep, GFP_NOFS);
-		if (!ctx)
-			goto fail;
-		list_add(&ctx->free_list, &fscrypt_free_ctxs);
-	}
-
+	err = -ENOMEM;
 	fscrypt_bounce_page_pool =
 		mempool_create_page_pool(num_prealloc_crypto_pages, 0);
 	if (!fscrypt_bounce_page_pool)
-		goto fail;
+		goto out_unlock;
 
-already_initialized:
+	err = 0;
+out_unlock:
 	mutex_unlock(&fscrypt_init_mutex);
-	return 0;
-fail:
-	fscrypt_destroy();
-	mutex_unlock(&fscrypt_init_mutex);
-	return res;
+	return err;
 }
 
-void fscrypt_msg(struct super_block *sb, const char *level,
+void fscrypt_msg(const struct inode *inode, const char *level,
 		 const char *fmt, ...)
 {
 	static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL,
@@ -440,8 +380,9 @@
 	va_start(args, fmt);
 	vaf.fmt = fmt;
 	vaf.va = &args;
-	if (sb)
-		printk("%sfscrypt (%s): %pV\n", level, sb->s_id, &vaf);
+	if (inode)
+		printk("%sfscrypt (%s, inode %lu): %pV\n",
+		       level, inode->i_sb->s_id, inode->i_ino, &vaf);
 	else
 		printk("%sfscrypt: %pV\n", level, &vaf);
 	va_end(args);
@@ -452,6 +393,8 @@
  */
 static int __init fscrypt_init(void)
 {
+	int err = -ENOMEM;
+
 	/*
 	 * Use an unbound workqueue to allow bios to be decrypted in parallel
 	 * even when they happen to complete on the same CPU.  This sacrifices
@@ -466,39 +409,21 @@
 	if (!fscrypt_read_workqueue)
 		goto fail;
 
-	fscrypt_ctx_cachep = KMEM_CACHE(fscrypt_ctx, SLAB_RECLAIM_ACCOUNT);
-	if (!fscrypt_ctx_cachep)
-		goto fail_free_queue;
-
 	fscrypt_info_cachep = KMEM_CACHE(fscrypt_info, SLAB_RECLAIM_ACCOUNT);
 	if (!fscrypt_info_cachep)
-		goto fail_free_ctx;
+		goto fail_free_queue;
+
+	err = fscrypt_init_keyring();
+	if (err)
+		goto fail_free_info;
 
 	return 0;
 
-fail_free_ctx:
-	kmem_cache_destroy(fscrypt_ctx_cachep);
+fail_free_info:
+	kmem_cache_destroy(fscrypt_info_cachep);
 fail_free_queue:
 	destroy_workqueue(fscrypt_read_workqueue);
 fail:
-	return -ENOMEM;
+	return err;
 }
-module_init(fscrypt_init)
-
-/**
- * fscrypt_exit() - Shutdown the fs encryption system
- */
-static void __exit fscrypt_exit(void)
-{
-	fscrypt_destroy();
-
-	if (fscrypt_read_workqueue)
-		destroy_workqueue(fscrypt_read_workqueue);
-	kmem_cache_destroy(fscrypt_ctx_cachep);
-	kmem_cache_destroy(fscrypt_info_cachep);
-
-	fscrypt_essiv_cleanup();
-}
-module_exit(fscrypt_exit);
-
-MODULE_LICENSE("GPL");
+late_initcall(fscrypt_init)
diff --git a/fs/crypto/fname.c b/fs/crypto/fname.c
index d7a0f68..3da3707 100644
--- a/fs/crypto/fname.c
+++ b/fs/crypto/fname.c
@@ -12,7 +12,6 @@
  */
 
 #include <linux/scatterlist.h>
-#include <linux/ratelimit.h>
 #include <crypto/skcipher.h>
 #include "fscrypt_private.h"
 
@@ -40,10 +39,11 @@
 {
 	struct skcipher_request *req = NULL;
 	DECLARE_CRYPTO_WAIT(wait);
-	struct crypto_skcipher *tfm = inode->i_crypt_info->ci_ctfm;
-	int res = 0;
-	char iv[FS_CRYPTO_BLOCK_SIZE];
+	struct fscrypt_info *ci = inode->i_crypt_info;
+	struct crypto_skcipher *tfm = ci->ci_ctfm;
+	union fscrypt_iv iv;
 	struct scatterlist sg;
+	int res;
 
 	/*
 	 * Copy the filename to the output buffer for encrypting in-place and
@@ -55,7 +55,7 @@
 	memset(out + iname->len, 0, olen - iname->len);
 
 	/* Initialize the IV */
-	memset(iv, 0, FS_CRYPTO_BLOCK_SIZE);
+	fscrypt_generate_iv(&iv, 0, ci);
 
 	/* Set up the encryption request */
 	req = skcipher_request_alloc(tfm, GFP_NOFS);
@@ -65,15 +65,13 @@
 			CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
 			crypto_req_done, &wait);
 	sg_init_one(&sg, out, olen);
-	skcipher_request_set_crypt(req, &sg, &sg, olen, iv);
+	skcipher_request_set_crypt(req, &sg, &sg, olen, &iv);
 
 	/* Do the encryption */
 	res = crypto_wait_req(crypto_skcipher_encrypt(req), &wait);
 	skcipher_request_free(req);
 	if (res < 0) {
-		fscrypt_err(inode->i_sb,
-			    "Filename encryption failed for inode %lu: %d",
-			    inode->i_ino, res);
+		fscrypt_err(inode, "Filename encryption failed: %d", res);
 		return res;
 	}
 
@@ -94,9 +92,10 @@
 	struct skcipher_request *req = NULL;
 	DECLARE_CRYPTO_WAIT(wait);
 	struct scatterlist src_sg, dst_sg;
-	struct crypto_skcipher *tfm = inode->i_crypt_info->ci_ctfm;
-	int res = 0;
-	char iv[FS_CRYPTO_BLOCK_SIZE];
+	struct fscrypt_info *ci = inode->i_crypt_info;
+	struct crypto_skcipher *tfm = ci->ci_ctfm;
+	union fscrypt_iv iv;
+	int res;
 
 	/* Allocate request */
 	req = skcipher_request_alloc(tfm, GFP_NOFS);
@@ -107,18 +106,16 @@
 		crypto_req_done, &wait);
 
 	/* Initialize IV */
-	memset(iv, 0, FS_CRYPTO_BLOCK_SIZE);
+	fscrypt_generate_iv(&iv, 0, ci);
 
 	/* Create decryption request */
 	sg_init_one(&src_sg, iname->name, iname->len);
 	sg_init_one(&dst_sg, oname->name, oname->len);
-	skcipher_request_set_crypt(req, &src_sg, &dst_sg, iname->len, iv);
+	skcipher_request_set_crypt(req, &src_sg, &dst_sg, iname->len, &iv);
 	res = crypto_wait_req(crypto_skcipher_decrypt(req), &wait);
 	skcipher_request_free(req);
 	if (res < 0) {
-		fscrypt_err(inode->i_sb,
-			    "Filename decryption failed for inode %lu: %d",
-			    inode->i_ino, res);
+		fscrypt_err(inode, "Filename decryption failed: %d", res);
 		return res;
 	}
 
@@ -126,44 +123,45 @@
 	return 0;
 }
 
-static const char *lookup_table =
+static const char lookup_table[65] =
 	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,";
 
 #define BASE64_CHARS(nbytes)	DIV_ROUND_UP((nbytes) * 4, 3)
 
 /**
- * digest_encode() -
+ * base64_encode() -
  *
- * Encodes the input digest using characters from the set [a-zA-Z0-9_+].
+ * Encodes the input string using characters from the set [A-Za-z0-9+,].
  * The encoded string is roughly 4/3 times the size of the input string.
+ *
+ * Return: length of the encoded string
  */
-static int digest_encode(const char *src, int len, char *dst)
+static int base64_encode(const u8 *src, int len, char *dst)
 {
-	int i = 0, bits = 0, ac = 0;
+	int i, bits = 0, ac = 0;
 	char *cp = dst;
 
-	while (i < len) {
-		ac += (((unsigned char) src[i]) << bits);
+	for (i = 0; i < len; i++) {
+		ac += src[i] << bits;
 		bits += 8;
 		do {
 			*cp++ = lookup_table[ac & 0x3f];
 			ac >>= 6;
 			bits -= 6;
 		} while (bits >= 6);
-		i++;
 	}
 	if (bits)
 		*cp++ = lookup_table[ac & 0x3f];
 	return cp - dst;
 }
 
-static int digest_decode(const char *src, int len, char *dst)
+static int base64_decode(const char *src, int len, u8 *dst)
 {
-	int i = 0, bits = 0, ac = 0;
+	int i, bits = 0, ac = 0;
 	const char *p;
-	char *cp = dst;
+	u8 *cp = dst;
 
-	while (i < len) {
+	for (i = 0; i < len; i++) {
 		p = strchr(lookup_table, src[i]);
 		if (p == NULL || src[i] == 0)
 			return -2;
@@ -174,7 +172,6 @@
 			ac >>= 8;
 			bits -= 8;
 		}
-		i++;
 	}
 	if (ac)
 		return -1;
@@ -184,8 +181,9 @@
 bool fscrypt_fname_encrypted_size(const struct inode *inode, u32 orig_len,
 				  u32 max_len, u32 *encrypted_len_ret)
 {
-	int padding = 4 << (inode->i_crypt_info->ci_flags &
-			    FS_POLICY_FLAGS_PAD_MASK);
+	const struct fscrypt_info *ci = inode->i_crypt_info;
+	int padding = 4 << (fscrypt_policy_flags(&ci->ci_policy) &
+			    FSCRYPT_POLICY_FLAGS_PAD_MASK);
 	u32 encrypted_len;
 
 	if (orig_len > max_len)
@@ -267,11 +265,11 @@
 	if (iname->len < FS_CRYPTO_BLOCK_SIZE)
 		return -EUCLEAN;
 
-	if (inode->i_crypt_info)
+	if (fscrypt_has_encryption_key(inode))
 		return fname_decrypt(inode, iname, oname);
 
 	if (iname->len <= FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE) {
-		oname->len = digest_encode(iname->name, iname->len,
+		oname->len = base64_encode(iname->name, iname->len,
 					   oname->name);
 		return 0;
 	}
@@ -286,7 +284,7 @@
 	       FSCRYPT_FNAME_DIGEST(iname->name, iname->len),
 	       FSCRYPT_FNAME_DIGEST_SIZE);
 	oname->name[0] = '_';
-	oname->len = 1 + digest_encode((const char *)&digested_name,
+	oname->len = 1 + base64_encode((const u8 *)&digested_name,
 				       sizeof(digested_name), oname->name + 1);
 	return 0;
 }
@@ -334,7 +332,7 @@
 	if (ret)
 		return ret;
 
-	if (dir->i_crypt_info) {
+	if (fscrypt_has_encryption_key(dir)) {
 		if (!fscrypt_fname_encrypted_size(dir, iname->len,
 						  dir->i_sb->s_cop->max_namelen,
 						  &fname->crypto_buf.len))
@@ -354,6 +352,7 @@
 	}
 	if (!lookup)
 		return -ENOKEY;
+	fname->is_ciphertext_name = true;
 
 	/*
 	 * We don't have the key and we are doing a lookup; decode the
@@ -378,8 +377,8 @@
 	if (fname->crypto_buf.name == NULL)
 		return -ENOMEM;
 
-	ret = digest_decode(iname->name + digested, iname->len - digested,
-				fname->crypto_buf.name);
+	ret = base64_decode(iname->name + digested, iname->len - digested,
+			    fname->crypto_buf.name);
 	if (ret < 0) {
 		ret = -ENOENT;
 		goto errout;
diff --git a/fs/crypto/fscrypt_private.h b/fs/crypto/fscrypt_private.h
index 79debfc..c731bd4 100644
--- a/fs/crypto/fscrypt_private.h
+++ b/fs/crypto/fscrypt_private.h
@@ -4,43 +4,146 @@
  *
  * Copyright (C) 2015, Google, Inc.
  *
- * This contains encryption key functions.
- *
- * Written by Michael Halcrow, Ildar Muslukhov, and Uday Savagaonkar, 2015.
+ * Originally written by Michael Halcrow, Ildar Muslukhov, and Uday Savagaonkar.
+ * Heavily modified since then.
  */
 
 #ifndef _FSCRYPT_PRIVATE_H
 #define _FSCRYPT_PRIVATE_H
 
-#define __FS_HAS_ENCRYPTION 1
 #include <linux/fscrypt.h>
 #include <crypto/hash.h>
+#include <linux/bio-crypt-ctx.h>
 
-/* Encryption parameters */
-#define FS_IV_SIZE			16
+struct fscrypt_master_key;
+
+#define CONST_STRLEN(str)	(sizeof(str) - 1)
+
 #define FS_KEY_DERIVATION_NONCE_SIZE	16
 
-/**
- * Encryption context for inode
- *
- * Protector format:
- *  1 byte: Protector format (1 = this version)
- *  1 byte: File contents encryption mode
- *  1 byte: File names encryption mode
- *  1 byte: Flags
- *  8 bytes: Master Key descriptor
- *  16 bytes: Encryption Key derivation nonce
- */
-struct fscrypt_context {
-	u8 format;
+#define FSCRYPT_MIN_KEY_SIZE		16
+
+#define FSCRYPT_CONTEXT_V1	1
+#define FSCRYPT_CONTEXT_V2	2
+
+struct fscrypt_context_v1 {
+	u8 version; /* FSCRYPT_CONTEXT_V1 */
 	u8 contents_encryption_mode;
 	u8 filenames_encryption_mode;
 	u8 flags;
-	u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
+	u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
 	u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
-} __packed;
+};
 
-#define FS_ENCRYPTION_CONTEXT_FORMAT_V1		1
+struct fscrypt_context_v2 {
+	u8 version; /* FSCRYPT_CONTEXT_V2 */
+	u8 contents_encryption_mode;
+	u8 filenames_encryption_mode;
+	u8 flags;
+	u8 __reserved[4];
+	u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
+	u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
+};
+
+/**
+ * fscrypt_context - the encryption context of an inode
+ *
+ * This is the on-disk equivalent of an fscrypt_policy, stored alongside each
+ * encrypted file usually in a hidden extended attribute.  It contains the
+ * fields from the fscrypt_policy, in order to identify the encryption algorithm
+ * and key with which the file is encrypted.  It also contains a nonce that was
+ * randomly generated by fscrypt itself; this is used as KDF input or as a tweak
+ * to cause different files to be encrypted differently.
+ */
+union fscrypt_context {
+	u8 version;
+	struct fscrypt_context_v1 v1;
+	struct fscrypt_context_v2 v2;
+};
+
+/*
+ * Return the size expected for the given fscrypt_context based on its version
+ * number, or 0 if the context version is unrecognized.
+ */
+static inline int fscrypt_context_size(const union fscrypt_context *ctx)
+{
+	switch (ctx->version) {
+	case FSCRYPT_CONTEXT_V1:
+		BUILD_BUG_ON(sizeof(ctx->v1) != 28);
+		return sizeof(ctx->v1);
+	case FSCRYPT_CONTEXT_V2:
+		BUILD_BUG_ON(sizeof(ctx->v2) != 40);
+		return sizeof(ctx->v2);
+	}
+	return 0;
+}
+
+#undef fscrypt_policy
+union fscrypt_policy {
+	u8 version;
+	struct fscrypt_policy_v1 v1;
+	struct fscrypt_policy_v2 v2;
+};
+
+/*
+ * Return the size expected for the given fscrypt_policy based on its version
+ * number, or 0 if the policy version is unrecognized.
+ */
+static inline int fscrypt_policy_size(const union fscrypt_policy *policy)
+{
+	switch (policy->version) {
+	case FSCRYPT_POLICY_V1:
+		return sizeof(policy->v1);
+	case FSCRYPT_POLICY_V2:
+		return sizeof(policy->v2);
+	}
+	return 0;
+}
+
+/* Return the contents encryption mode of a valid encryption policy */
+static inline u8
+fscrypt_policy_contents_mode(const union fscrypt_policy *policy)
+{
+	switch (policy->version) {
+	case FSCRYPT_POLICY_V1:
+		return policy->v1.contents_encryption_mode;
+	case FSCRYPT_POLICY_V2:
+		return policy->v2.contents_encryption_mode;
+	}
+	BUG();
+}
+
+/* Return the filenames encryption mode of a valid encryption policy */
+static inline u8
+fscrypt_policy_fnames_mode(const union fscrypt_policy *policy)
+{
+	switch (policy->version) {
+	case FSCRYPT_POLICY_V1:
+		return policy->v1.filenames_encryption_mode;
+	case FSCRYPT_POLICY_V2:
+		return policy->v2.filenames_encryption_mode;
+	}
+	BUG();
+}
+
+/* Return the flags (FSCRYPT_POLICY_FLAG*) of a valid encryption policy */
+static inline u8
+fscrypt_policy_flags(const union fscrypt_policy *policy)
+{
+	switch (policy->version) {
+	case FSCRYPT_POLICY_V1:
+		return policy->v1.flags;
+	case FSCRYPT_POLICY_V2:
+		return policy->v2.flags;
+	}
+	BUG();
+}
+
+static inline bool
+fscrypt_is_direct_key_policy(const union fscrypt_policy *policy)
+{
+	return fscrypt_policy_flags(policy) & FSCRYPT_POLICY_FLAG_DIRECT_KEY;
+}
 
 /**
  * For encrypted symlinks, the ciphertext length is stored at the beginning
@@ -52,16 +155,61 @@
 } __packed;
 
 /*
- * A pointer to this structure is stored in the file system's in-core
- * representation of an inode.
+ * fscrypt_info - the "encryption key" for an inode
+ *
+ * When an encrypted file's key is made available, an instance of this struct is
+ * allocated and stored in ->i_crypt_info.  Once created, it remains until the
+ * inode is evicted.
  */
 struct fscrypt_info {
-	u8 ci_data_mode;
-	u8 ci_filename_mode;
-	u8 ci_flags;
+
+	/* The actual crypto transform used for encryption and decryption */
 	struct crypto_skcipher *ci_ctfm;
-	struct crypto_cipher *ci_essiv_tfm;
-	u8 ci_master_key[FS_KEY_DESCRIPTOR_SIZE];
+
+#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
+	/*
+	 * The raw key for inline encryption, if this file is using inline
+	 * encryption rather than the traditional filesystem layer encryption.
+	 */
+	const u8 *ci_inline_crypt_key;
+#endif
+
+	/* True if the key should be freed when this fscrypt_info is freed */
+	bool ci_owns_key;
+
+	/*
+	 * Encryption mode used for this inode.  It corresponds to either the
+	 * contents or filenames encryption mode, depending on the inode type.
+	 */
+	struct fscrypt_mode *ci_mode;
+
+	/* Back-pointer to the inode */
+	struct inode *ci_inode;
+
+	/*
+	 * The master key with which this inode was unlocked (decrypted).  This
+	 * will be NULL if the master key was found in a process-subscribed
+	 * keyring rather than in the filesystem-level keyring.
+	 */
+	struct key *ci_master_key;
+
+	/*
+	 * Link in list of inodes that were unlocked with the master key.
+	 * Only used when ->ci_master_key is set.
+	 */
+	struct list_head ci_master_key_link;
+
+	/*
+	 * If non-NULL, then encryption is done using the master key directly
+	 * and ci_ctfm will equal ci_direct_key->dk_ctfm.
+	 */
+	struct fscrypt_direct_key *ci_direct_key;
+
+	/* The encryption policy used by this inode */
+	union fscrypt_policy ci_policy;
+
+	/* This inode's nonce, copied from the fscrypt_context */
+	u8 ci_nonce[FS_KEY_DERIVATION_NONCE_SIZE];
 };
 
 typedef enum {
@@ -69,18 +217,19 @@
 	FS_ENCRYPT,
 } fscrypt_direction_t;
 
-#define FS_CTX_REQUIRES_FREE_ENCRYPT_FL		0x00000001
-#define FS_CTX_HAS_BOUNCE_BUFFER_FL		0x00000002
-
 static inline bool fscrypt_valid_enc_modes(u32 contents_mode,
 					   u32 filenames_mode)
 {
-	if (contents_mode == FS_ENCRYPTION_MODE_AES_128_CBC &&
-	    filenames_mode == FS_ENCRYPTION_MODE_AES_128_CTS)
+	if (contents_mode == FSCRYPT_MODE_AES_128_CBC &&
+	    filenames_mode == FSCRYPT_MODE_AES_128_CTS)
 		return true;
 
-	if (contents_mode == FS_ENCRYPTION_MODE_AES_256_XTS &&
-	    filenames_mode == FS_ENCRYPTION_MODE_AES_256_CTS)
+	if (contents_mode == FSCRYPT_MODE_AES_256_XTS &&
+	    filenames_mode == FSCRYPT_MODE_AES_256_CTS)
+		return true;
+
+	if (contents_mode == FSCRYPT_MODE_ADIANTUM &&
+	    filenames_mode == FSCRYPT_MODE_ADIANTUM)
 		return true;
 
 	return false;
@@ -89,23 +238,37 @@
 /* crypto.c */
 extern struct kmem_cache *fscrypt_info_cachep;
 extern int fscrypt_initialize(unsigned int cop_flags);
-extern int fscrypt_do_page_crypto(const struct inode *inode,
-				  fscrypt_direction_t rw, u64 lblk_num,
-				  struct page *src_page,
-				  struct page *dest_page,
-				  unsigned int len, unsigned int offs,
-				  gfp_t gfp_flags);
-extern struct page *fscrypt_alloc_bounce_page(struct fscrypt_ctx *ctx,
-					      gfp_t gfp_flags);
+extern int fscrypt_crypt_block(const struct inode *inode,
+			       fscrypt_direction_t rw, u64 lblk_num,
+			       struct page *src_page, struct page *dest_page,
+			       unsigned int len, unsigned int offs,
+			       gfp_t gfp_flags);
+extern struct page *fscrypt_alloc_bounce_page(gfp_t gfp_flags);
 extern const struct dentry_operations fscrypt_d_ops;
 
 extern void __printf(3, 4) __cold
-fscrypt_msg(struct super_block *sb, const char *level, const char *fmt, ...);
+fscrypt_msg(const struct inode *inode, const char *level, const char *fmt, ...);
 
-#define fscrypt_warn(sb, fmt, ...)		\
-	fscrypt_msg(sb, KERN_WARNING, fmt, ##__VA_ARGS__)
-#define fscrypt_err(sb, fmt, ...)		\
-	fscrypt_msg(sb, KERN_ERR, fmt, ##__VA_ARGS__)
+#define fscrypt_warn(inode, fmt, ...)		\
+	fscrypt_msg((inode), KERN_WARNING, fmt, ##__VA_ARGS__)
+#define fscrypt_err(inode, fmt, ...)		\
+	fscrypt_msg((inode), KERN_ERR, fmt, ##__VA_ARGS__)
+
+#define FSCRYPT_MAX_IV_SIZE	32
+
+union fscrypt_iv {
+	struct {
+		/* logical block number within the file */
+		__le64 lblk_num;
+
+		/* per-file nonce; only set in DIRECT_KEY mode */
+		u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
+	};
+	u8 raw[FSCRYPT_MAX_IV_SIZE];
+};
+
+void fscrypt_generate_iv(union fscrypt_iv *iv, u64 lblk_num,
+			 const struct fscrypt_info *ci);
 
 /* fname.c */
 extern int fname_encrypt(struct inode *inode, const struct qstr *iname,
@@ -114,7 +277,279 @@
 					 u32 orig_len, u32 max_len,
 					 u32 *encrypted_len_ret);
 
-/* keyinfo.c */
-extern void __exit fscrypt_essiv_cleanup(void);
+/* hkdf.c */
+
+struct fscrypt_hkdf {
+	struct crypto_shash *hmac_tfm;
+};
+
+extern int fscrypt_init_hkdf(struct fscrypt_hkdf *hkdf, const u8 *master_key,
+			     unsigned int master_key_size);
+
+/*
+ * The list of contexts in which fscrypt uses HKDF.  These values are used as
+ * the first byte of the HKDF application-specific info string to guarantee that
+ * info strings are never repeated between contexts.  This ensures that all HKDF
+ * outputs are unique and cryptographically isolated, i.e. knowledge of one
+ * output doesn't reveal another.
+ */
+#define HKDF_CONTEXT_KEY_IDENTIFIER	1
+#define HKDF_CONTEXT_PER_FILE_KEY	2
+#define HKDF_CONTEXT_DIRECT_KEY		3
+#define HKDF_CONTEXT_IV_INO_LBLK_64_KEY	4
+
+extern int fscrypt_hkdf_expand(struct fscrypt_hkdf *hkdf, u8 context,
+			       const u8 *info, unsigned int infolen,
+			       u8 *okm, unsigned int okmlen);
+
+extern void fscrypt_destroy_hkdf(struct fscrypt_hkdf *hkdf);
+
+/* inline_crypt.c */
+#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
+extern bool fscrypt_should_use_inline_encryption(const struct fscrypt_info *ci);
+
+extern int fscrypt_set_inline_crypt_key(struct fscrypt_info *ci,
+					const u8 *derived_key);
+
+extern void fscrypt_free_inline_crypt_key(struct fscrypt_info *ci);
+
+extern int fscrypt_setup_per_mode_inline_crypt_key(
+					struct fscrypt_info *ci,
+					struct fscrypt_master_key *mk);
+
+extern void fscrypt_evict_inline_crypt_keys(struct fscrypt_master_key *mk);
+
+#else /* CONFIG_FS_ENCRYPTION_INLINE_CRYPT */
+
+static inline bool fscrypt_should_use_inline_encryption(
+					const struct fscrypt_info *ci)
+{
+	return false;
+}
+
+static inline int fscrypt_set_inline_crypt_key(struct fscrypt_info *ci,
+					       const u8 *derived_key)
+{
+	WARN_ON(1);
+	return -EOPNOTSUPP;
+}
+
+static inline void fscrypt_free_inline_crypt_key(struct fscrypt_info *ci)
+{
+}
+
+static inline int fscrypt_setup_per_mode_inline_crypt_key(
+					struct fscrypt_info *ci,
+					struct fscrypt_master_key *mk)
+{
+	WARN_ON(1);
+	return -EOPNOTSUPP;
+}
+
+static inline void fscrypt_evict_inline_crypt_keys(
+					struct fscrypt_master_key *mk)
+{
+}
+#endif /* !CONFIG_FS_ENCRYPTION_INLINE_CRYPT */
+
+/* keyring.c */
+
+/*
+ * fscrypt_master_key_secret - secret key material of an in-use master key
+ */
+struct fscrypt_master_key_secret {
+
+	/*
+	 * For v2 policy keys: HKDF context keyed by this master key.
+	 * For v1 policy keys: not set (hkdf.hmac_tfm == NULL).
+	 */
+	struct fscrypt_hkdf	hkdf;
+
+	/* Size of the raw key in bytes.  Set even if ->raw isn't set. */
+	u32			size;
+
+	/* For v1 policy keys: the raw key.  Wiped for v2 policy keys. */
+	u8			raw[FSCRYPT_MAX_KEY_SIZE];
+
+} __randomize_layout;
+
+/*
+ * fscrypt_master_key - an in-use master key
+ *
+ * This represents a master encryption key which has been added to the
+ * filesystem and can be used to "unlock" the encrypted files which were
+ * encrypted with it.
+ */
+struct fscrypt_master_key {
+
+	/*
+	 * The secret key material.  After FS_IOC_REMOVE_ENCRYPTION_KEY is
+	 * executed, this is wiped and no new inodes can be unlocked with this
+	 * key; however, there may still be inodes in ->mk_decrypted_inodes
+	 * which could not be evicted.  As long as some inodes still remain,
+	 * FS_IOC_REMOVE_ENCRYPTION_KEY can be retried, or
+	 * FS_IOC_ADD_ENCRYPTION_KEY can add the secret again.
+	 *
+	 * Locking: protected by key->sem (outer) and mk_secret_sem (inner).
+	 * The reason for two locks is that key->sem also protects modifying
+	 * mk_users, which ranks it above the semaphore for the keyring key
+	 * type, which is in turn above page faults (via keyring_read).  But
+	 * sometimes filesystems call fscrypt_get_encryption_info() from within
+	 * a transaction, which ranks it below page faults.  So we need a
+	 * separate lock which protects mk_secret but not also mk_users.
+	 */
+	struct fscrypt_master_key_secret	mk_secret;
+	struct rw_semaphore			mk_secret_sem;
+
+	/*
+	 * For v1 policy keys: an arbitrary key descriptor which was assigned by
+	 * userspace (->descriptor).
+	 *
+	 * For v2 policy keys: a cryptographic hash of this key (->identifier).
+	 */
+	struct fscrypt_key_specifier		mk_spec;
+
+	/*
+	 * Keyring which contains a key of type 'key_type_fscrypt_user' for each
+	 * user who has added this key.  Normally each key will be added by just
+	 * one user, but it's possible that multiple users share a key, and in
+	 * that case we need to keep track of those users so that one user can't
+	 * remove the key before the others want it removed too.
+	 *
+	 * This is NULL for v1 policy keys; those can only be added by root.
+	 *
+	 * Locking: in addition to this keyrings own semaphore, this is
+	 * protected by the master key's key->sem, so we can do atomic
+	 * search+insert.  It can also be searched without taking any locks, but
+	 * in that case the returned key may have already been removed.
+	 */
+	struct key		*mk_users;
+
+	/*
+	 * Length of ->mk_decrypted_inodes, plus one if mk_secret is present.
+	 * Once this goes to 0, the master key is removed from ->s_master_keys.
+	 * The 'struct fscrypt_master_key' will continue to live as long as the
+	 * 'struct key' whose payload it is, but we won't let this reference
+	 * count rise again.
+	 */
+	refcount_t		mk_refcount;
+
+	/*
+	 * List of inodes that were unlocked using this key.  This allows the
+	 * inodes to be evicted efficiently if the key is removed.
+	 */
+	struct list_head	mk_decrypted_inodes;
+	spinlock_t		mk_decrypted_inodes_lock;
+
+	/* Crypto API transforms for DIRECT_KEY policies, allocated on-demand */
+	struct crypto_skcipher	*mk_direct_tfms[__FSCRYPT_MODE_MAX + 1];
+
+	/*
+	 * Crypto API transforms for filesystem-layer implementation of
+	 * IV_INO_LBLK_64 policies, allocated on-demand.
+	 */
+	struct crypto_skcipher	*mk_iv_ino_lblk_64_tfms[__FSCRYPT_MODE_MAX + 1];
+
+#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
+	/* Raw keys for IV_INO_LBLK_64 policies, allocated on-demand */
+	u8			*mk_iv_ino_lblk_64_raw_keys[__FSCRYPT_MODE_MAX + 1];
+
+	/* The data unit size being used for inline encryption */
+	unsigned int		mk_data_unit_size;
+
+	/* The filesystem's block device */
+	struct block_device	*mk_bdev;
+#endif
+} __randomize_layout;
+
+static inline bool
+is_master_key_secret_present(const struct fscrypt_master_key_secret *secret)
+{
+	/*
+	 * The READ_ONCE() is only necessary for fscrypt_drop_inode() and
+	 * fscrypt_key_describe().  These run in atomic context, so they can't
+	 * take ->mk_secret_sem and thus 'secret' can change concurrently which
+	 * would be a data race.  But they only need to know whether the secret
+	 * *was* present at the time of check, so READ_ONCE() suffices.
+	 */
+	return READ_ONCE(secret->size) != 0;
+}
+
+static inline const char *master_key_spec_type(
+				const struct fscrypt_key_specifier *spec)
+{
+	switch (spec->type) {
+	case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR:
+		return "descriptor";
+	case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER:
+		return "identifier";
+	}
+	return "[unknown]";
+}
+
+static inline int master_key_spec_len(const struct fscrypt_key_specifier *spec)
+{
+	switch (spec->type) {
+	case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR:
+		return FSCRYPT_KEY_DESCRIPTOR_SIZE;
+	case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER:
+		return FSCRYPT_KEY_IDENTIFIER_SIZE;
+	}
+	return 0;
+}
+
+extern struct key *
+fscrypt_find_master_key(struct super_block *sb,
+			const struct fscrypt_key_specifier *mk_spec);
+
+extern int fscrypt_verify_key_added(struct super_block *sb,
+				    const u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE]);
+
+extern int __init fscrypt_init_keyring(void);
+
+/* keysetup.c */
+
+struct fscrypt_mode {
+	const char *friendly_name;
+	const char *cipher_str;
+	int keysize;
+	int ivsize;
+	enum blk_crypto_mode_num blk_crypto_mode;
+	bool logged_impl_name;
+};
+
+extern struct fscrypt_mode fscrypt_modes[];
+
+static inline bool
+fscrypt_mode_supports_direct_key(const struct fscrypt_mode *mode)
+{
+	return mode->ivsize >= offsetofend(union fscrypt_iv, nonce);
+}
+
+extern struct crypto_skcipher *
+fscrypt_allocate_skcipher(struct fscrypt_mode *mode, const u8 *raw_key,
+			  const struct inode *inode);
+
+extern int fscrypt_set_derived_key(struct fscrypt_info *ci,
+				   const u8 *derived_key);
+
+/* keysetup_v1.c */
+
+extern void fscrypt_put_direct_key(struct fscrypt_direct_key *dk);
+
+extern int fscrypt_setup_v1_file_key(struct fscrypt_info *ci,
+				     const u8 *raw_master_key);
+
+extern int fscrypt_setup_v1_file_key_via_subscribed_keyrings(
+					struct fscrypt_info *ci);
+/* policy.c */
+
+extern bool fscrypt_policies_equal(const union fscrypt_policy *policy1,
+				   const union fscrypt_policy *policy2);
+extern bool fscrypt_supported_policy(const union fscrypt_policy *policy_u,
+				     const struct inode *inode);
+extern int fscrypt_policy_from_context(union fscrypt_policy *policy_u,
+				       const union fscrypt_context *ctx_u,
+				       int ctx_size);
 
 #endif /* _FSCRYPT_PRIVATE_H */
diff --git a/fs/crypto/hkdf.c b/fs/crypto/hkdf.c
new file mode 100644
index 0000000..2c02600
--- /dev/null
+++ b/fs/crypto/hkdf.c
@@ -0,0 +1,183 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Implementation of HKDF ("HMAC-based Extract-and-Expand Key Derivation
+ * Function"), aka RFC 5869.  See also the original paper (Krawczyk 2010):
+ * "Cryptographic Extraction and Key Derivation: The HKDF Scheme".
+ *
+ * This is used to derive keys from the fscrypt master keys.
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include <crypto/hash.h>
+#include <crypto/sha.h>
+
+#include "fscrypt_private.h"
+
+/*
+ * HKDF supports any unkeyed cryptographic hash algorithm, but fscrypt uses
+ * SHA-512 because it is reasonably secure and efficient; and since it produces
+ * a 64-byte digest, deriving an AES-256-XTS key preserves all 64 bytes of
+ * entropy from the master key and requires only one iteration of HKDF-Expand.
+ */
+#define HKDF_HMAC_ALG		"hmac(sha512)"
+#define HKDF_HASHLEN		SHA512_DIGEST_SIZE
+
+/*
+ * HKDF consists of two steps:
+ *
+ * 1. HKDF-Extract: extract a pseudorandom key of length HKDF_HASHLEN bytes from
+ *    the input keying material and optional salt.
+ * 2. HKDF-Expand: expand the pseudorandom key into output keying material of
+ *    any length, parameterized by an application-specific info string.
+ *
+ * HKDF-Extract can be skipped if the input is already a pseudorandom key of
+ * length HKDF_HASHLEN bytes.  However, cipher modes other than AES-256-XTS take
+ * shorter keys, and we don't want to force users of those modes to provide
+ * unnecessarily long master keys.  Thus fscrypt still does HKDF-Extract.  No
+ * salt is used, since fscrypt master keys should already be pseudorandom and
+ * there's no way to persist a random salt per master key from kernel mode.
+ */
+
+/* HKDF-Extract (RFC 5869 section 2.2), unsalted */
+static int hkdf_extract(struct crypto_shash *hmac_tfm, const u8 *ikm,
+			unsigned int ikmlen, u8 prk[HKDF_HASHLEN])
+{
+	static const u8 default_salt[HKDF_HASHLEN];
+	SHASH_DESC_ON_STACK(desc, hmac_tfm);
+	int err;
+
+	err = crypto_shash_setkey(hmac_tfm, default_salt, HKDF_HASHLEN);
+	if (err)
+		return err;
+
+	desc->tfm = hmac_tfm;
+	desc->flags = 0;
+	err = crypto_shash_digest(desc, ikm, ikmlen, prk);
+	shash_desc_zero(desc);
+	return err;
+}
+
+/*
+ * Compute HKDF-Extract using the given master key as the input keying material,
+ * and prepare an HMAC transform object keyed by the resulting pseudorandom key.
+ *
+ * Afterwards, the keyed HMAC transform object can be used for HKDF-Expand many
+ * times without having to recompute HKDF-Extract each time.
+ */
+int fscrypt_init_hkdf(struct fscrypt_hkdf *hkdf, const u8 *master_key,
+		      unsigned int master_key_size)
+{
+	struct crypto_shash *hmac_tfm;
+	u8 prk[HKDF_HASHLEN];
+	int err;
+
+	hmac_tfm = crypto_alloc_shash(HKDF_HMAC_ALG, 0, 0);
+	if (IS_ERR(hmac_tfm)) {
+		fscrypt_err(NULL, "Error allocating " HKDF_HMAC_ALG ": %ld",
+			    PTR_ERR(hmac_tfm));
+		return PTR_ERR(hmac_tfm);
+	}
+
+	if (WARN_ON(crypto_shash_digestsize(hmac_tfm) != sizeof(prk))) {
+		err = -EINVAL;
+		goto err_free_tfm;
+	}
+
+	err = hkdf_extract(hmac_tfm, master_key, master_key_size, prk);
+	if (err)
+		goto err_free_tfm;
+
+	err = crypto_shash_setkey(hmac_tfm, prk, sizeof(prk));
+	if (err)
+		goto err_free_tfm;
+
+	hkdf->hmac_tfm = hmac_tfm;
+	goto out;
+
+err_free_tfm:
+	crypto_free_shash(hmac_tfm);
+out:
+	memzero_explicit(prk, sizeof(prk));
+	return err;
+}
+
+/*
+ * HKDF-Expand (RFC 5869 section 2.3).  This expands the pseudorandom key, which
+ * was already keyed into 'hkdf->hmac_tfm' by fscrypt_init_hkdf(), into 'okmlen'
+ * bytes of output keying material parameterized by the application-specific
+ * 'info' of length 'infolen' bytes, prefixed by "fscrypt\0" and the 'context'
+ * byte.  This is thread-safe and may be called by multiple threads in parallel.
+ *
+ * ('context' isn't part of the HKDF specification; it's just a prefix fscrypt
+ * adds to its application-specific info strings to guarantee that it doesn't
+ * accidentally repeat an info string when using HKDF for different purposes.)
+ */
+int fscrypt_hkdf_expand(struct fscrypt_hkdf *hkdf, u8 context,
+			const u8 *info, unsigned int infolen,
+			u8 *okm, unsigned int okmlen)
+{
+	SHASH_DESC_ON_STACK(desc, hkdf->hmac_tfm);
+	u8 prefix[9];
+	unsigned int i;
+	int err;
+	const u8 *prev = NULL;
+	u8 counter = 1;
+	u8 tmp[HKDF_HASHLEN];
+
+	if (WARN_ON(okmlen > 255 * HKDF_HASHLEN))
+		return -EINVAL;
+
+	desc->tfm = hkdf->hmac_tfm;
+	desc->flags = 0;
+
+	memcpy(prefix, "fscrypt\0", 8);
+	prefix[8] = context;
+
+	for (i = 0; i < okmlen; i += HKDF_HASHLEN) {
+
+		err = crypto_shash_init(desc);
+		if (err)
+			goto out;
+
+		if (prev) {
+			err = crypto_shash_update(desc, prev, HKDF_HASHLEN);
+			if (err)
+				goto out;
+		}
+
+		err = crypto_shash_update(desc, prefix, sizeof(prefix));
+		if (err)
+			goto out;
+
+		err = crypto_shash_update(desc, info, infolen);
+		if (err)
+			goto out;
+
+		BUILD_BUG_ON(sizeof(counter) != 1);
+		if (okmlen - i < HKDF_HASHLEN) {
+			err = crypto_shash_finup(desc, &counter, 1, tmp);
+			if (err)
+				goto out;
+			memcpy(&okm[i], tmp, okmlen - i);
+			memzero_explicit(tmp, sizeof(tmp));
+		} else {
+			err = crypto_shash_finup(desc, &counter, 1, &okm[i]);
+			if (err)
+				goto out;
+		}
+		counter++;
+		prev = &okm[i];
+	}
+	err = 0;
+out:
+	if (unlikely(err))
+		memzero_explicit(okm, okmlen); /* so caller doesn't need to */
+	shash_desc_zero(desc);
+	return err;
+}
+
+void fscrypt_destroy_hkdf(struct fscrypt_hkdf *hkdf)
+{
+	crypto_free_shash(hkdf->hmac_tfm);
+}
diff --git a/fs/crypto/hooks.c b/fs/crypto/hooks.c
index 926e5df..30b1ca6 100644
--- a/fs/crypto/hooks.c
+++ b/fs/crypto/hooks.c
@@ -4,7 +4,6 @@
  * Encryption hooks for higher-level filesystem operations.
  */
 
-#include <linux/ratelimit.h>
 #include "fscrypt_private.h"
 
 /**
@@ -39,9 +38,9 @@
 	dir = dget_parent(file_dentry(filp));
 	if (IS_ENCRYPTED(d_inode(dir)) &&
 	    !fscrypt_has_permitted_context(d_inode(dir), inode)) {
-		fscrypt_warn(inode->i_sb,
-			     "inconsistent encryption contexts: %lu/%lu",
-			     d_inode(dir)->i_ino, inode->i_ino);
+		fscrypt_warn(inode,
+			     "Inconsistent encryption context (parent directory: %lu)",
+			     d_inode(dir)->i_ino);
 		err = -EPERM;
 	}
 	dput(dir);
@@ -49,7 +48,8 @@
 }
 EXPORT_SYMBOL_GPL(fscrypt_file_open);
 
-int __fscrypt_prepare_link(struct inode *inode, struct inode *dir)
+int __fscrypt_prepare_link(struct inode *inode, struct inode *dir,
+			   struct dentry *dentry)
 {
 	int err;
 
@@ -57,8 +57,12 @@
 	if (err)
 		return err;
 
+	/* ... in case we looked up ciphertext name before key was added */
+	if (dentry->d_flags & DCACHE_ENCRYPTED_NAME)
+		return -ENOKEY;
+
 	if (!fscrypt_has_permitted_context(dir, inode))
-		return -EPERM;
+		return -EXDEV;
 
 	return 0;
 }
@@ -78,37 +82,42 @@
 	if (err)
 		return err;
 
+	/* ... in case we looked up ciphertext name(s) before key was added */
+	if ((old_dentry->d_flags | new_dentry->d_flags) &
+	    DCACHE_ENCRYPTED_NAME)
+		return -ENOKEY;
+
 	if (old_dir != new_dir) {
 		if (IS_ENCRYPTED(new_dir) &&
 		    !fscrypt_has_permitted_context(new_dir,
 						   d_inode(old_dentry)))
-			return -EPERM;
+			return -EXDEV;
 
 		if ((flags & RENAME_EXCHANGE) &&
 		    IS_ENCRYPTED(old_dir) &&
 		    !fscrypt_has_permitted_context(old_dir,
 						   d_inode(new_dentry)))
-			return -EPERM;
+			return -EXDEV;
 	}
 	return 0;
 }
 EXPORT_SYMBOL_GPL(__fscrypt_prepare_rename);
 
-int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry)
+int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry,
+			     struct fscrypt_name *fname)
 {
-	int err = fscrypt_get_encryption_info(dir);
+	int err = fscrypt_setup_filename(dir, &dentry->d_name, 1, fname);
 
-	if (err)
+	if (err && err != -ENOENT)
 		return err;
 
-	if (fscrypt_has_encryption_key(dir)) {
+	if (fname->is_ciphertext_name) {
 		spin_lock(&dentry->d_lock);
-		dentry->d_flags |= DCACHE_ENCRYPTED_WITH_KEY;
+		dentry->d_flags |= DCACHE_ENCRYPTED_NAME;
 		spin_unlock(&dentry->d_lock);
+		d_set_d_op(dentry, &fscrypt_d_ops);
 	}
-
-	d_set_d_op(dentry, &fscrypt_d_ops);
-	return 0;
+	return err;
 }
 EXPORT_SYMBOL_GPL(__fscrypt_prepare_lookup);
 
@@ -179,11 +188,9 @@
 	sd->len = cpu_to_le16(ciphertext_len);
 
 	err = fname_encrypt(inode, &iname, sd->encrypted_path, ciphertext_len);
-	if (err) {
-		if (!disk_link->name)
-			kfree(sd);
-		return err;
-	}
+	if (err)
+		goto err_free_sd;
+
 	/*
 	 * Null-terminating the ciphertext doesn't make sense, but we still
 	 * count the null terminator in the length, so we might as well
@@ -191,9 +198,20 @@
 	 */
 	sd->encrypted_path[ciphertext_len] = '\0';
 
+	/* Cache the plaintext symlink target for later use by get_link() */
+	err = -ENOMEM;
+	inode->i_link = kmemdup(target, len + 1, GFP_NOFS);
+	if (!inode->i_link)
+		goto err_free_sd;
+
 	if (!disk_link->name)
 		disk_link->name = (unsigned char *)sd;
 	return 0;
+
+err_free_sd:
+	if (!disk_link->name)
+		kfree(sd);
+	return err;
 }
 EXPORT_SYMBOL_GPL(__fscrypt_encrypt_symlink);
 
@@ -202,7 +220,7 @@
  * @inode: the symlink inode
  * @caddr: the on-disk contents of the symlink
  * @max_size: size of @caddr buffer
- * @done: if successful, will be set up to free the returned target
+ * @done: if successful, will be set up to free the returned target if needed
  *
  * If the symlink's encryption key is available, we decrypt its target.
  * Otherwise, we encode its target for presentation.
@@ -217,12 +235,18 @@
 {
 	const struct fscrypt_symlink_data *sd;
 	struct fscrypt_str cstr, pstr;
+	bool has_key;
 	int err;
 
 	/* This is for encrypted symlinks only */
 	if (WARN_ON(!IS_ENCRYPTED(inode)))
 		return ERR_PTR(-EINVAL);
 
+	/* If the decrypted target is already cached, just return it. */
+	pstr.name = READ_ONCE(inode->i_link);
+	if (pstr.name)
+		return pstr.name;
+
 	/*
 	 * Try to set up the symlink's encryption key, but we can continue
 	 * regardless of whether the key is available or not.
@@ -230,6 +254,7 @@
 	err = fscrypt_get_encryption_info(inode);
 	if (err)
 		return ERR_PTR(err);
+	has_key = fscrypt_has_encryption_key(inode);
 
 	/*
 	 * For historical reasons, encrypted symlink targets are prefixed with
@@ -261,7 +286,17 @@
 		goto err_kfree;
 
 	pstr.name[pstr.len] = '\0';
-	set_delayed_call(done, kfree_link, pstr.name);
+
+	/*
+	 * Cache decrypted symlink targets in i_link for later use.  Don't cache
+	 * symlink targets encoded without the key, since those become outdated
+	 * once the key is added.  This pairs with the READ_ONCE() above and in
+	 * the VFS path lookup code.
+	 */
+	if (!has_key ||
+	    cmpxchg_release(&inode->i_link, NULL, pstr.name) != NULL)
+		set_delayed_call(done, kfree_link, pstr.name);
+
 	return pstr.name;
 
 err_kfree:
diff --git a/fs/crypto/inline_crypt.c b/fs/crypto/inline_crypt.c
new file mode 100644
index 0000000..e41c6d66
--- /dev/null
+++ b/fs/crypto/inline_crypt.c
@@ -0,0 +1,390 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Inline encryption support for fscrypt
+ *
+ * Copyright 2019 Google LLC
+ */
+
+/*
+ * With "inline encryption", the block layer handles the decryption/encryption
+ * as part of the bio, instead of the filesystem doing the crypto itself via
+ * crypto API.  See Documentation/block/inline-encryption.rst.  fscrypt still
+ * provides the key and IV to use.
+ */
+
+#include <linux/blk-crypto.h>
+#include <linux/blkdev.h>
+#include <linux/buffer_head.h>
+#include <linux/keyslot-manager.h>
+
+#include "fscrypt_private.h"
+
+/* Return true iff inline encryption should be used for this file */
+bool fscrypt_should_use_inline_encryption(const struct fscrypt_info *ci)
+{
+	const struct inode *inode = ci->ci_inode;
+	struct super_block *sb = inode->i_sb;
+
+	/* The file must need contents encryption, not filenames encryption */
+	if (!S_ISREG(inode->i_mode))
+		return false;
+
+	/* blk-crypto must implement the needed encryption algorithm */
+	if (ci->ci_mode->blk_crypto_mode == BLK_ENCRYPTION_MODE_INVALID)
+		return false;
+
+	/* DIRECT_KEY needs a 24+ byte IV, so it can't work with 8-byte DUNs */
+	if (fscrypt_is_direct_key_policy(&ci->ci_policy))
+		return false;
+
+	/* The filesystem must be mounted with -o inlinecrypt */
+	if (!sb->s_cop->inline_crypt_enabled ||
+	    !sb->s_cop->inline_crypt_enabled(sb))
+		return false;
+
+	return true;
+}
+
+/* Set a per-file inline encryption key (for passing to blk-crypto) */
+int fscrypt_set_inline_crypt_key(struct fscrypt_info *ci, const u8 *derived_key)
+{
+	const struct fscrypt_mode *mode = ci->ci_mode;
+	const struct super_block *sb = ci->ci_inode->i_sb;
+
+	ci->ci_inline_crypt_key = kmemdup(derived_key, mode->keysize, GFP_NOFS);
+	if (!ci->ci_inline_crypt_key)
+		return -ENOMEM;
+	ci->ci_owns_key = true;
+
+	return blk_crypto_start_using_mode(mode->blk_crypto_mode,
+					   sb->s_blocksize,
+					   sb->s_bdev->bd_queue);
+}
+
+/* Free a per-file inline encryption key and evict it from blk-crypto */
+void fscrypt_free_inline_crypt_key(struct fscrypt_info *ci)
+{
+	if (ci->ci_inline_crypt_key != NULL) {
+		const struct fscrypt_mode *mode = ci->ci_mode;
+		const struct super_block *sb = ci->ci_inode->i_sb;
+
+		blk_crypto_evict_key(sb->s_bdev->bd_queue,
+				     ci->ci_inline_crypt_key,
+				     mode->blk_crypto_mode, sb->s_blocksize);
+		kzfree(ci->ci_inline_crypt_key);
+	}
+}
+
+/*
+ * Set up ->inline_crypt_key (for passing to blk-crypto) for inodes which use an
+ * IV_INO_LBLK_64 encryption policy.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+int fscrypt_setup_per_mode_inline_crypt_key(struct fscrypt_info *ci,
+					    struct fscrypt_master_key *mk)
+{
+	static DEFINE_MUTEX(inline_crypt_setup_mutex);
+	const struct super_block *sb = ci->ci_inode->i_sb;
+	struct block_device *bdev = sb->s_bdev;
+	const struct fscrypt_mode *mode = ci->ci_mode;
+	const u8 mode_num = mode - fscrypt_modes;
+	u8 *raw_key;
+	u8 hkdf_info[sizeof(mode_num) + sizeof(sb->s_uuid)];
+	int err;
+
+	if (WARN_ON(mode_num > __FSCRYPT_MODE_MAX))
+		return -EINVAL;
+
+	/* pairs with smp_store_release() below */
+	raw_key = smp_load_acquire(&mk->mk_iv_ino_lblk_64_raw_keys[mode_num]);
+	if (raw_key) {
+		err = 0;
+		goto out;
+	}
+
+	mutex_lock(&inline_crypt_setup_mutex);
+
+	raw_key = mk->mk_iv_ino_lblk_64_raw_keys[mode_num];
+	if (raw_key) {
+		err = 0;
+		goto out_unlock;
+	}
+
+	raw_key = kmalloc(mode->keysize, GFP_NOFS);
+	if (!raw_key) {
+		err = -ENOMEM;
+		goto out_unlock;
+	}
+
+	BUILD_BUG_ON(sizeof(mode_num) != 1);
+	BUILD_BUG_ON(sizeof(sb->s_uuid) != 16);
+	BUILD_BUG_ON(sizeof(hkdf_info) != 17);
+	hkdf_info[0] = mode_num;
+	memcpy(&hkdf_info[1], &sb->s_uuid, sizeof(sb->s_uuid));
+
+	err = fscrypt_hkdf_expand(&mk->mk_secret.hkdf,
+				  HKDF_CONTEXT_IV_INO_LBLK_64_KEY,
+				  hkdf_info, sizeof(hkdf_info),
+				  raw_key, mode->keysize);
+	if (err)
+		goto out_unlock;
+
+	err = blk_crypto_start_using_mode(mode->blk_crypto_mode,
+					  sb->s_blocksize, bdev->bd_queue);
+	if (err)
+		goto out_unlock;
+
+	/*
+	 * When a master key's first inline encryption key is set up, save a
+	 * reference to the filesystem's block device so that the inline
+	 * encryption keys can be evicted when the master key is destroyed.
+	 */
+	if (!mk->mk_bdev) {
+		mk->mk_bdev = bdgrab(bdev);
+		mk->mk_data_unit_size = sb->s_blocksize;
+	}
+
+	/* pairs with smp_load_acquire() above */
+	smp_store_release(&mk->mk_iv_ino_lblk_64_raw_keys[mode_num], raw_key);
+	err = 0;
+out_unlock:
+	mutex_unlock(&inline_crypt_setup_mutex);
+out:
+	if (err == 0) {
+		ci->ci_inline_crypt_key = raw_key;
+		/*
+		 * Since each struct fscrypt_master_key belongs to a particular
+		 * filesystem (a struct super_block), there should be only one
+		 * block device, and only one data unit size as it should equal
+		 * the filesystem's blocksize (i.e. s_blocksize).
+		 */
+		if (WARN_ON(mk->mk_bdev != bdev))
+			err = -EINVAL;
+		if (WARN_ON(mk->mk_data_unit_size != sb->s_blocksize))
+			err = -EINVAL;
+	} else {
+		kzfree(raw_key);
+	}
+	return err;
+}
+
+/*
+ * Evict per-mode inline encryption keys from blk-crypto when a master key is
+ * destroyed.
+ */
+void fscrypt_evict_inline_crypt_keys(struct fscrypt_master_key *mk)
+{
+	struct block_device *bdev = mk->mk_bdev;
+	size_t i;
+
+	if (!bdev) /* No inline encryption keys? */
+		return;
+
+	for (i = 0; i < ARRAY_SIZE(mk->mk_iv_ino_lblk_64_raw_keys); i++) {
+		u8 *raw_key = mk->mk_iv_ino_lblk_64_raw_keys[i];
+
+		if (raw_key != NULL) {
+			blk_crypto_evict_key(bdev->bd_queue, raw_key,
+					     fscrypt_modes[i].blk_crypto_mode,
+					     mk->mk_data_unit_size);
+			kzfree(raw_key);
+		}
+	}
+	bdput(bdev);
+}
+
+/**
+ * fscrypt_inode_uses_inline_crypto - test whether an inode uses inline encryption
+ * @inode: an inode
+ *
+ * Return: true if the inode requires file contents encryption and if the
+ *	   encryption should be done in the block layer via blk-crypto rather
+ *	   than in the filesystem layer.
+ */
+bool fscrypt_inode_uses_inline_crypto(const struct inode *inode)
+{
+	return IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode) &&
+		inode->i_crypt_info->ci_inline_crypt_key != NULL;
+}
+EXPORT_SYMBOL_GPL(fscrypt_inode_uses_inline_crypto);
+
+/**
+ * fscrypt_inode_uses_fs_layer_crypto - test whether an inode uses fs-layer encryption
+ * @inode: an inode
+ *
+ * Return: true if the inode requires file contents encryption and if the
+ *	   encryption should be done in the filesystem layer rather than in the
+ *	   block layer via blk-crypto.
+ */
+bool fscrypt_inode_uses_fs_layer_crypto(const struct inode *inode)
+{
+	return IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode) &&
+		inode->i_crypt_info->ci_inline_crypt_key == NULL;
+}
+EXPORT_SYMBOL_GPL(fscrypt_inode_uses_fs_layer_crypto);
+
+static inline u64 fscrypt_generate_dun(const struct fscrypt_info *ci,
+				       u64 lblk_num)
+{
+	union fscrypt_iv iv;
+
+	fscrypt_generate_iv(&iv, lblk_num, ci);
+	/*
+	 * fscrypt_should_use_inline_encryption() ensures we never get here if
+	 * more than the first 8 bytes of the IV are nonzero.
+	 */
+	BUG_ON(memchr_inv(&iv.raw[8], 0, ci->ci_mode->ivsize - 8));
+	return le64_to_cpu(iv.lblk_num);
+}
+
+/**
+ * fscrypt_set_bio_crypt_ctx - prepare a file contents bio for inline encryption
+ * @bio: a bio which will eventually be submitted to the file
+ * @inode: the file's inode
+ * @first_lblk: the first file logical block number in the I/O
+ * @gfp_mask: memory allocation flags
+ *
+ * If the contents of the file should be encrypted (or decrypted) with inline
+ * encryption, then assign the appropriate encryption context to the bio.
+ *
+ * Normally the bio should be newly allocated (i.e. no pages added yet), as
+ * otherwise fscrypt_mergeable_bio() won't work as intended.
+ *
+ * The encryption context will be freed automatically when the bio is freed.
+ *
+ * Return: 0 on success, -errno on failure.  If __GFP_NOFAIL is specified, this
+ *	   is guaranteed to succeed.
+ */
+int fscrypt_set_bio_crypt_ctx(struct bio *bio, const struct inode *inode,
+			      u64 first_lblk, gfp_t gfp_mask)
+{
+	const struct fscrypt_info *ci = inode->i_crypt_info;
+	u64 dun;
+
+	if (!fscrypt_inode_uses_inline_crypto(inode))
+		return 0;
+
+	dun = fscrypt_generate_dun(ci, first_lblk);
+
+	return bio_crypt_set_ctx(bio, ci->ci_inline_crypt_key,
+				 ci->ci_mode->blk_crypto_mode,
+				 dun, inode->i_blkbits, gfp_mask);
+}
+EXPORT_SYMBOL_GPL(fscrypt_set_bio_crypt_ctx);
+
+/* Extract the inode and logical block number from a buffer_head. */
+static bool bh_get_inode_and_lblk_num(const struct buffer_head *bh,
+				      const struct inode **inode_ret,
+				      u64 *lblk_num_ret)
+{
+	struct page *page = bh->b_page;
+	const struct address_space *mapping;
+	const struct inode *inode;
+
+	/*
+	 * The ext4 journal (jbd2) can submit a buffer_head it directly created
+	 * for a non-pagecache page.  fscrypt doesn't care about these.
+	 */
+	mapping = page_mapping(page);
+	if (!mapping)
+		return false;
+	inode = mapping->host;
+
+	*inode_ret = inode;
+	*lblk_num_ret = ((u64)page->index << (PAGE_SHIFT - inode->i_blkbits)) +
+			(bh_offset(bh) >> inode->i_blkbits);
+	return true;
+}
+
+/**
+ * fscrypt_set_bio_crypt_ctx_bh - prepare a file contents bio for inline encryption
+ * @bio: a bio which will eventually be submitted to the file
+ * @first_bh: the first buffer_head for which I/O will be submitted
+ * @gfp_mask: memory allocation flags
+ *
+ * Same as fscrypt_set_bio_crypt_ctx(), except this takes a buffer_head instead
+ * of an inode and block number directly.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+int fscrypt_set_bio_crypt_ctx_bh(struct bio *bio,
+				 const struct buffer_head *first_bh,
+				 gfp_t gfp_mask)
+{
+	const struct inode *inode;
+	u64 first_lblk;
+
+	if (!bh_get_inode_and_lblk_num(first_bh, &inode, &first_lblk))
+		return 0;
+
+	return fscrypt_set_bio_crypt_ctx(bio, inode, first_lblk, gfp_mask);
+}
+EXPORT_SYMBOL_GPL(fscrypt_set_bio_crypt_ctx_bh);
+
+/**
+ * fscrypt_mergeable_bio - test whether data can be added to a bio
+ * @bio: the bio being built up
+ * @inode: the inode for the next part of the I/O
+ * @next_lblk: the next file logical block number in the I/O
+ *
+ * When building a bio which may contain data which should undergo inline
+ * encryption (or decryption) via fscrypt, filesystems should call this function
+ * to ensure that the resulting bio contains only logically contiguous data.
+ * This will return false if the next part of the I/O cannot be merged with the
+ * bio because either the encryption key would be different or the encryption
+ * data unit numbers would be discontiguous.
+ *
+ * fscrypt_set_bio_crypt_ctx() must have already been called on the bio.
+ *
+ * Return: true iff the I/O is mergeable
+ */
+bool fscrypt_mergeable_bio(struct bio *bio, const struct inode *inode,
+			   u64 next_lblk)
+{
+	const struct bio_crypt_ctx *bc;
+	const u8 *next_key;
+	u64 next_dun;
+
+	if (bio_has_crypt_ctx(bio) != fscrypt_inode_uses_inline_crypto(inode))
+		return false;
+	if (!bio_has_crypt_ctx(bio))
+		return true;
+	bc = bio->bi_crypt_context;
+	next_key = inode->i_crypt_info->ci_inline_crypt_key;
+	next_dun = fscrypt_generate_dun(inode->i_crypt_info, next_lblk);
+
+	/*
+	 * Comparing the key pointers is good enough, as all I/O for each key
+	 * uses the same pointer.  I.e., there's currently no need to support
+	 * merging requests where the keys are the same but the pointers differ.
+	 */
+	return next_key == bc->raw_key &&
+		next_dun == bc->data_unit_num +
+			    (bio_sectors(bio) >>
+			     (bc->data_unit_size_bits - SECTOR_SHIFT));
+}
+EXPORT_SYMBOL_GPL(fscrypt_mergeable_bio);
+
+/**
+ * fscrypt_mergeable_bio_bh - test whether data can be added to a bio
+ * @bio: the bio being built up
+ * @next_bh: the next buffer_head for which I/O will be submitted
+ *
+ * Same as fscrypt_mergeable_bio(), except this takes a buffer_head instead of
+ * an inode and block number directly.
+ *
+ * Return: true iff the I/O is mergeable
+ */
+bool fscrypt_mergeable_bio_bh(struct bio *bio,
+			      const struct buffer_head *next_bh)
+{
+	const struct inode *inode;
+	u64 next_lblk;
+
+	if (!bh_get_inode_and_lblk_num(next_bh, &inode, &next_lblk))
+		return !bio_has_crypt_ctx(bio);
+
+	return fscrypt_mergeable_bio(bio, inode, next_lblk);
+}
+EXPORT_SYMBOL_GPL(fscrypt_mergeable_bio_bh);
diff --git a/fs/crypto/keyinfo.c b/fs/crypto/keyinfo.c
deleted file mode 100644
index 7874c9b..0000000
--- a/fs/crypto/keyinfo.c
+++ /dev/null
@@ -1,399 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * key management facility for FS encryption support.
- *
- * Copyright (C) 2015, Google, Inc.
- *
- * This contains encryption key functions.
- *
- * Written by Michael Halcrow, Ildar Muslukhov, and Uday Savagaonkar, 2015.
- */
-
-#include <keys/user-type.h>
-#include <linux/scatterlist.h>
-#include <linux/ratelimit.h>
-#include <crypto/aes.h>
-#include <crypto/sha.h>
-#include <crypto/skcipher.h>
-#include "fscrypt_private.h"
-
-static struct crypto_shash *essiv_hash_tfm;
-
-/*
- * Key derivation function.  This generates the derived key by encrypting the
- * master key with AES-128-ECB using the inode's nonce as the AES key.
- *
- * The master key must be at least as long as the derived key.  If the master
- * key is longer, then only the first 'derived_keysize' bytes are used.
- */
-static int derive_key_aes(const u8 *master_key,
-			  const struct fscrypt_context *ctx,
-			  u8 *derived_key, unsigned int derived_keysize)
-{
-	int res = 0;
-	struct skcipher_request *req = NULL;
-	DECLARE_CRYPTO_WAIT(wait);
-	struct scatterlist src_sg, dst_sg;
-	struct crypto_skcipher *tfm = crypto_alloc_skcipher("ecb(aes)", 0, 0);
-
-	if (IS_ERR(tfm)) {
-		res = PTR_ERR(tfm);
-		tfm = NULL;
-		goto out;
-	}
-	crypto_skcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
-	req = skcipher_request_alloc(tfm, GFP_NOFS);
-	if (!req) {
-		res = -ENOMEM;
-		goto out;
-	}
-	skcipher_request_set_callback(req,
-			CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
-			crypto_req_done, &wait);
-	res = crypto_skcipher_setkey(tfm, ctx->nonce, sizeof(ctx->nonce));
-	if (res < 0)
-		goto out;
-
-	sg_init_one(&src_sg, master_key, derived_keysize);
-	sg_init_one(&dst_sg, derived_key, derived_keysize);
-	skcipher_request_set_crypt(req, &src_sg, &dst_sg, derived_keysize,
-				   NULL);
-	res = crypto_wait_req(crypto_skcipher_encrypt(req), &wait);
-out:
-	skcipher_request_free(req);
-	crypto_free_skcipher(tfm);
-	return res;
-}
-
-/*
- * Search the current task's subscribed keyrings for a "logon" key with
- * description prefix:descriptor, and if found acquire a read lock on it and
- * return a pointer to its validated payload in *payload_ret.
- */
-static struct key *
-find_and_lock_process_key(const char *prefix,
-			  const u8 descriptor[FS_KEY_DESCRIPTOR_SIZE],
-			  unsigned int min_keysize,
-			  const struct fscrypt_key **payload_ret)
-{
-	char *description;
-	struct key *key;
-	const struct user_key_payload *ukp;
-	const struct fscrypt_key *payload;
-
-	description = kasprintf(GFP_NOFS, "%s%*phN", prefix,
-				FS_KEY_DESCRIPTOR_SIZE, descriptor);
-	if (!description)
-		return ERR_PTR(-ENOMEM);
-
-	key = request_key(&key_type_logon, description, NULL);
-	kfree(description);
-	if (IS_ERR(key))
-		return key;
-
-	down_read(&key->sem);
-	ukp = user_key_payload_locked(key);
-
-	if (!ukp) /* was the key revoked before we acquired its semaphore? */
-		goto invalid;
-
-	payload = (const struct fscrypt_key *)ukp->data;
-
-	if (ukp->datalen != sizeof(struct fscrypt_key) ||
-	    payload->size < 1 || payload->size > FS_MAX_KEY_SIZE) {
-		fscrypt_warn(NULL,
-			     "key with description '%s' has invalid payload",
-			     key->description);
-		goto invalid;
-	}
-
-	if (payload->size < min_keysize) {
-		fscrypt_warn(NULL,
-			     "key with description '%s' is too short (got %u bytes, need %u+ bytes)",
-			     key->description, payload->size, min_keysize);
-		goto invalid;
-	}
-
-	*payload_ret = payload;
-	return key;
-
-invalid:
-	up_read(&key->sem);
-	key_put(key);
-	return ERR_PTR(-ENOKEY);
-}
-
-/* Find the master key, then derive the inode's actual encryption key */
-static int find_and_derive_key(const struct inode *inode,
-			       const struct fscrypt_context *ctx,
-			       u8 *derived_key, unsigned int derived_keysize)
-{
-	struct key *key;
-	const struct fscrypt_key *payload;
-	int err;
-
-	key = find_and_lock_process_key(FS_KEY_DESC_PREFIX,
-					ctx->master_key_descriptor,
-					derived_keysize, &payload);
-	if (key == ERR_PTR(-ENOKEY) && inode->i_sb->s_cop->key_prefix) {
-		key = find_and_lock_process_key(inode->i_sb->s_cop->key_prefix,
-						ctx->master_key_descriptor,
-						derived_keysize, &payload);
-	}
-	if (IS_ERR(key))
-		return PTR_ERR(key);
-	err = derive_key_aes(payload->raw, ctx, derived_key, derived_keysize);
-	up_read(&key->sem);
-	key_put(key);
-	return err;
-}
-
-static struct fscrypt_mode {
-	const char *friendly_name;
-	const char *cipher_str;
-	int keysize;
-	bool logged_impl_name;
-} available_modes[] = {
-	[FS_ENCRYPTION_MODE_AES_256_XTS] = {
-		.friendly_name = "AES-256-XTS",
-		.cipher_str = "xts(aes)",
-		.keysize = 64,
-	},
-	[FS_ENCRYPTION_MODE_AES_256_CTS] = {
-		.friendly_name = "AES-256-CTS-CBC",
-		.cipher_str = "cts(cbc(aes))",
-		.keysize = 32,
-	},
-	[FS_ENCRYPTION_MODE_AES_128_CBC] = {
-		.friendly_name = "AES-128-CBC",
-		.cipher_str = "cbc(aes)",
-		.keysize = 16,
-	},
-	[FS_ENCRYPTION_MODE_AES_128_CTS] = {
-		.friendly_name = "AES-128-CTS-CBC",
-		.cipher_str = "cts(cbc(aes))",
-		.keysize = 16,
-	},
-};
-
-static struct fscrypt_mode *
-select_encryption_mode(const struct fscrypt_info *ci, const struct inode *inode)
-{
-	if (!fscrypt_valid_enc_modes(ci->ci_data_mode, ci->ci_filename_mode)) {
-		fscrypt_warn(inode->i_sb,
-			     "inode %lu uses unsupported encryption modes (contents mode %d, filenames mode %d)",
-			     inode->i_ino, ci->ci_data_mode,
-			     ci->ci_filename_mode);
-		return ERR_PTR(-EINVAL);
-	}
-
-	if (S_ISREG(inode->i_mode))
-		return &available_modes[ci->ci_data_mode];
-
-	if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))
-		return &available_modes[ci->ci_filename_mode];
-
-	WARN_ONCE(1, "fscrypt: filesystem tried to load encryption info for inode %lu, which is not encryptable (file type %d)\n",
-		  inode->i_ino, (inode->i_mode & S_IFMT));
-	return ERR_PTR(-EINVAL);
-}
-
-static void put_crypt_info(struct fscrypt_info *ci)
-{
-	if (!ci)
-		return;
-
-	crypto_free_skcipher(ci->ci_ctfm);
-	crypto_free_cipher(ci->ci_essiv_tfm);
-	kmem_cache_free(fscrypt_info_cachep, ci);
-}
-
-static int derive_essiv_salt(const u8 *key, int keysize, u8 *salt)
-{
-	struct crypto_shash *tfm = READ_ONCE(essiv_hash_tfm);
-
-	/* init hash transform on demand */
-	if (unlikely(!tfm)) {
-		struct crypto_shash *prev_tfm;
-
-		tfm = crypto_alloc_shash("sha256", 0, 0);
-		if (IS_ERR(tfm)) {
-			fscrypt_warn(NULL,
-				     "error allocating SHA-256 transform: %ld",
-				     PTR_ERR(tfm));
-			return PTR_ERR(tfm);
-		}
-		prev_tfm = cmpxchg(&essiv_hash_tfm, NULL, tfm);
-		if (prev_tfm) {
-			crypto_free_shash(tfm);
-			tfm = prev_tfm;
-		}
-	}
-
-	{
-		SHASH_DESC_ON_STACK(desc, tfm);
-		desc->tfm = tfm;
-		desc->flags = 0;
-
-		return crypto_shash_digest(desc, key, keysize, salt);
-	}
-}
-
-static int init_essiv_generator(struct fscrypt_info *ci, const u8 *raw_key,
-				int keysize)
-{
-	int err;
-	struct crypto_cipher *essiv_tfm;
-	u8 salt[SHA256_DIGEST_SIZE];
-
-	essiv_tfm = crypto_alloc_cipher("aes", 0, 0);
-	if (IS_ERR(essiv_tfm))
-		return PTR_ERR(essiv_tfm);
-
-	ci->ci_essiv_tfm = essiv_tfm;
-
-	err = derive_essiv_salt(raw_key, keysize, salt);
-	if (err)
-		goto out;
-
-	/*
-	 * Using SHA256 to derive the salt/key will result in AES-256 being
-	 * used for IV generation. File contents encryption will still use the
-	 * configured keysize (AES-128) nevertheless.
-	 */
-	err = crypto_cipher_setkey(essiv_tfm, salt, sizeof(salt));
-	if (err)
-		goto out;
-
-out:
-	memzero_explicit(salt, sizeof(salt));
-	return err;
-}
-
-void __exit fscrypt_essiv_cleanup(void)
-{
-	crypto_free_shash(essiv_hash_tfm);
-}
-
-int fscrypt_get_encryption_info(struct inode *inode)
-{
-	struct fscrypt_info *crypt_info;
-	struct fscrypt_context ctx;
-	struct crypto_skcipher *ctfm;
-	struct fscrypt_mode *mode;
-	u8 *raw_key = NULL;
-	int res;
-
-	if (inode->i_crypt_info)
-		return 0;
-
-	res = fscrypt_initialize(inode->i_sb->s_cop->flags);
-	if (res)
-		return res;
-
-	res = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx));
-	if (res < 0) {
-		if (!fscrypt_dummy_context_enabled(inode) ||
-		    IS_ENCRYPTED(inode))
-			return res;
-		/* Fake up a context for an unencrypted directory */
-		memset(&ctx, 0, sizeof(ctx));
-		ctx.format = FS_ENCRYPTION_CONTEXT_FORMAT_V1;
-		ctx.contents_encryption_mode = FS_ENCRYPTION_MODE_AES_256_XTS;
-		ctx.filenames_encryption_mode = FS_ENCRYPTION_MODE_AES_256_CTS;
-		memset(ctx.master_key_descriptor, 0x42, FS_KEY_DESCRIPTOR_SIZE);
-	} else if (res != sizeof(ctx)) {
-		return -EINVAL;
-	}
-
-	if (ctx.format != FS_ENCRYPTION_CONTEXT_FORMAT_V1)
-		return -EINVAL;
-
-	if (ctx.flags & ~FS_POLICY_FLAGS_VALID)
-		return -EINVAL;
-
-	crypt_info = kmem_cache_alloc(fscrypt_info_cachep, GFP_NOFS);
-	if (!crypt_info)
-		return -ENOMEM;
-
-	crypt_info->ci_flags = ctx.flags;
-	crypt_info->ci_data_mode = ctx.contents_encryption_mode;
-	crypt_info->ci_filename_mode = ctx.filenames_encryption_mode;
-	crypt_info->ci_ctfm = NULL;
-	crypt_info->ci_essiv_tfm = NULL;
-	memcpy(crypt_info->ci_master_key, ctx.master_key_descriptor,
-				sizeof(crypt_info->ci_master_key));
-
-	mode = select_encryption_mode(crypt_info, inode);
-	if (IS_ERR(mode)) {
-		res = PTR_ERR(mode);
-		goto out;
-	}
-
-	/*
-	 * This cannot be a stack buffer because it is passed to the scatterlist
-	 * crypto API as part of key derivation.
-	 */
-	res = -ENOMEM;
-	raw_key = kmalloc(mode->keysize, GFP_NOFS);
-	if (!raw_key)
-		goto out;
-
-	res = find_and_derive_key(inode, &ctx, raw_key, mode->keysize);
-	if (res)
-		goto out;
-
-	ctfm = crypto_alloc_skcipher(mode->cipher_str, 0, 0);
-	if (IS_ERR(ctfm)) {
-		res = PTR_ERR(ctfm);
-		fscrypt_warn(inode->i_sb,
-			     "error allocating '%s' transform for inode %lu: %d",
-			     mode->cipher_str, inode->i_ino, res);
-		goto out;
-	}
-	if (unlikely(!mode->logged_impl_name)) {
-		/*
-		 * fscrypt performance can vary greatly depending on which
-		 * crypto algorithm implementation is used.  Help people debug
-		 * performance problems by logging the ->cra_driver_name the
-		 * first time a mode is used.  Note that multiple threads can
-		 * race here, but it doesn't really matter.
-		 */
-		mode->logged_impl_name = true;
-		pr_info("fscrypt: %s using implementation \"%s\"\n",
-			mode->friendly_name,
-			crypto_skcipher_alg(ctfm)->base.cra_driver_name);
-	}
-	crypt_info->ci_ctfm = ctfm;
-	crypto_skcipher_set_flags(ctfm, CRYPTO_TFM_REQ_WEAK_KEY);
-	res = crypto_skcipher_setkey(ctfm, raw_key, mode->keysize);
-	if (res)
-		goto out;
-
-	if (S_ISREG(inode->i_mode) &&
-	    crypt_info->ci_data_mode == FS_ENCRYPTION_MODE_AES_128_CBC) {
-		res = init_essiv_generator(crypt_info, raw_key, mode->keysize);
-		if (res) {
-			fscrypt_warn(inode->i_sb,
-				     "error initializing ESSIV generator for inode %lu: %d",
-				     inode->i_ino, res);
-			goto out;
-		}
-	}
-	if (cmpxchg(&inode->i_crypt_info, NULL, crypt_info) == NULL)
-		crypt_info = NULL;
-out:
-	if (res == -ENOKEY)
-		res = 0;
-	put_crypt_info(crypt_info);
-	kzfree(raw_key);
-	return res;
-}
-EXPORT_SYMBOL(fscrypt_get_encryption_info);
-
-void fscrypt_put_encryption_info(struct inode *inode)
-{
-	put_crypt_info(inode->i_crypt_info);
-	inode->i_crypt_info = NULL;
-}
-EXPORT_SYMBOL(fscrypt_put_encryption_info);
diff --git a/fs/crypto/keyring.c b/fs/crypto/keyring.c
new file mode 100644
index 0000000..48d3a0c
--- /dev/null
+++ b/fs/crypto/keyring.c
@@ -0,0 +1,1010 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Filesystem-level keyring for fscrypt
+ *
+ * Copyright 2019 Google LLC
+ */
+
+/*
+ * This file implements management of fscrypt master keys in the
+ * filesystem-level keyring, including the ioctls:
+ *
+ * - FS_IOC_ADD_ENCRYPTION_KEY
+ * - FS_IOC_REMOVE_ENCRYPTION_KEY
+ * - FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS
+ * - FS_IOC_GET_ENCRYPTION_KEY_STATUS
+ *
+ * See the "User API" section of Documentation/filesystems/fscrypt.rst for more
+ * information about these ioctls.
+ */
+
+#include <crypto/skcipher.h>
+#include <linux/key-type.h>
+#include <linux/seq_file.h>
+
+#include "fscrypt_private.h"
+
+static void wipe_master_key_secret(struct fscrypt_master_key_secret *secret)
+{
+	fscrypt_destroy_hkdf(&secret->hkdf);
+	memzero_explicit(secret, sizeof(*secret));
+}
+
+static void move_master_key_secret(struct fscrypt_master_key_secret *dst,
+				   struct fscrypt_master_key_secret *src)
+{
+	memcpy(dst, src, sizeof(*dst));
+	memzero_explicit(src, sizeof(*src));
+}
+
+static void free_master_key(struct fscrypt_master_key *mk)
+{
+	size_t i;
+
+	wipe_master_key_secret(&mk->mk_secret);
+
+	for (i = 0; i <= __FSCRYPT_MODE_MAX; i++) {
+		crypto_free_skcipher(mk->mk_direct_tfms[i]);
+		crypto_free_skcipher(mk->mk_iv_ino_lblk_64_tfms[i]);
+	}
+
+	fscrypt_evict_inline_crypt_keys(mk);
+
+	key_put(mk->mk_users);
+	kzfree(mk);
+}
+
+static inline bool valid_key_spec(const struct fscrypt_key_specifier *spec)
+{
+	if (spec->__reserved)
+		return false;
+	return master_key_spec_len(spec) != 0;
+}
+
+static int fscrypt_key_instantiate(struct key *key,
+				   struct key_preparsed_payload *prep)
+{
+	key->payload.data[0] = (struct fscrypt_master_key *)prep->data;
+	return 0;
+}
+
+static void fscrypt_key_destroy(struct key *key)
+{
+	free_master_key(key->payload.data[0]);
+}
+
+static void fscrypt_key_describe(const struct key *key, struct seq_file *m)
+{
+	seq_puts(m, key->description);
+
+	if (key_is_positive(key)) {
+		const struct fscrypt_master_key *mk = key->payload.data[0];
+
+		if (!is_master_key_secret_present(&mk->mk_secret))
+			seq_puts(m, ": secret removed");
+	}
+}
+
+/*
+ * Type of key in ->s_master_keys.  Each key of this type represents a master
+ * key which has been added to the filesystem.  Its payload is a
+ * 'struct fscrypt_master_key'.  The "." prefix in the key type name prevents
+ * users from adding keys of this type via the keyrings syscalls rather than via
+ * the intended method of FS_IOC_ADD_ENCRYPTION_KEY.
+ */
+static struct key_type key_type_fscrypt = {
+	.name			= "._fscrypt",
+	.instantiate		= fscrypt_key_instantiate,
+	.destroy		= fscrypt_key_destroy,
+	.describe		= fscrypt_key_describe,
+};
+
+static int fscrypt_user_key_instantiate(struct key *key,
+					struct key_preparsed_payload *prep)
+{
+	/*
+	 * We just charge FSCRYPT_MAX_KEY_SIZE bytes to the user's key quota for
+	 * each key, regardless of the exact key size.  The amount of memory
+	 * actually used is greater than the size of the raw key anyway.
+	 */
+	return key_payload_reserve(key, FSCRYPT_MAX_KEY_SIZE);
+}
+
+static void fscrypt_user_key_describe(const struct key *key, struct seq_file *m)
+{
+	seq_puts(m, key->description);
+}
+
+/*
+ * Type of key in ->mk_users.  Each key of this type represents a particular
+ * user who has added a particular master key.
+ *
+ * Note that the name of this key type really should be something like
+ * ".fscrypt-user" instead of simply ".fscrypt".  But the shorter name is chosen
+ * mainly for simplicity of presentation in /proc/keys when read by a non-root
+ * user.  And it is expected to be rare that a key is actually added by multiple
+ * users, since users should keep their encryption keys confidential.
+ */
+static struct key_type key_type_fscrypt_user = {
+	.name			= ".fscrypt",
+	.instantiate		= fscrypt_user_key_instantiate,
+	.describe		= fscrypt_user_key_describe,
+};
+
+/* Search ->s_master_keys or ->mk_users */
+static struct key *search_fscrypt_keyring(struct key *keyring,
+					  struct key_type *type,
+					  const char *description)
+{
+	/*
+	 * We need to mark the keyring reference as "possessed" so that we
+	 * acquire permission to search it, via the KEY_POS_SEARCH permission.
+	 */
+	key_ref_t keyref = make_key_ref(keyring, true /* possessed */);
+
+	keyref = keyring_search(keyref, type, description);
+	if (IS_ERR(keyref)) {
+		if (PTR_ERR(keyref) == -EAGAIN || /* not found */
+		    PTR_ERR(keyref) == -EKEYREVOKED) /* recently invalidated */
+			keyref = ERR_PTR(-ENOKEY);
+		return ERR_CAST(keyref);
+	}
+	return key_ref_to_ptr(keyref);
+}
+
+#define FSCRYPT_FS_KEYRING_DESCRIPTION_SIZE	\
+	(CONST_STRLEN("fscrypt-") + FIELD_SIZEOF(struct super_block, s_id))
+
+#define FSCRYPT_MK_DESCRIPTION_SIZE	(2 * FSCRYPT_KEY_IDENTIFIER_SIZE + 1)
+
+#define FSCRYPT_MK_USERS_DESCRIPTION_SIZE	\
+	(CONST_STRLEN("fscrypt-") + 2 * FSCRYPT_KEY_IDENTIFIER_SIZE + \
+	 CONST_STRLEN("-users") + 1)
+
+#define FSCRYPT_MK_USER_DESCRIPTION_SIZE	\
+	(2 * FSCRYPT_KEY_IDENTIFIER_SIZE + CONST_STRLEN(".uid.") + 10 + 1)
+
+static void format_fs_keyring_description(
+			char description[FSCRYPT_FS_KEYRING_DESCRIPTION_SIZE],
+			const struct super_block *sb)
+{
+	sprintf(description, "fscrypt-%s", sb->s_id);
+}
+
+static void format_mk_description(
+			char description[FSCRYPT_MK_DESCRIPTION_SIZE],
+			const struct fscrypt_key_specifier *mk_spec)
+{
+	sprintf(description, "%*phN",
+		master_key_spec_len(mk_spec), (u8 *)&mk_spec->u);
+}
+
+static void format_mk_users_keyring_description(
+			char description[FSCRYPT_MK_USERS_DESCRIPTION_SIZE],
+			const u8 mk_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE])
+{
+	sprintf(description, "fscrypt-%*phN-users",
+		FSCRYPT_KEY_IDENTIFIER_SIZE, mk_identifier);
+}
+
+static void format_mk_user_description(
+			char description[FSCRYPT_MK_USER_DESCRIPTION_SIZE],
+			const u8 mk_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE])
+{
+
+	sprintf(description, "%*phN.uid.%u", FSCRYPT_KEY_IDENTIFIER_SIZE,
+		mk_identifier, __kuid_val(current_fsuid()));
+}
+
+/* Create ->s_master_keys if needed.  Synchronized by fscrypt_add_key_mutex. */
+static int allocate_filesystem_keyring(struct super_block *sb)
+{
+	char description[FSCRYPT_FS_KEYRING_DESCRIPTION_SIZE];
+	struct key *keyring;
+
+	if (sb->s_master_keys)
+		return 0;
+
+	format_fs_keyring_description(description, sb);
+	keyring = keyring_alloc(description, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
+				current_cred(), KEY_POS_SEARCH |
+				  KEY_USR_SEARCH | KEY_USR_READ | KEY_USR_VIEW,
+				KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
+	if (IS_ERR(keyring))
+		return PTR_ERR(keyring);
+
+	/* Pairs with READ_ONCE() in fscrypt_find_master_key() */
+	smp_store_release(&sb->s_master_keys, keyring);
+	return 0;
+}
+
+void fscrypt_sb_free(struct super_block *sb)
+{
+	key_put(sb->s_master_keys);
+	sb->s_master_keys = NULL;
+}
+
+/*
+ * Find the specified master key in ->s_master_keys.
+ * Returns ERR_PTR(-ENOKEY) if not found.
+ */
+struct key *fscrypt_find_master_key(struct super_block *sb,
+				    const struct fscrypt_key_specifier *mk_spec)
+{
+	struct key *keyring;
+	char description[FSCRYPT_MK_DESCRIPTION_SIZE];
+
+	/* pairs with smp_store_release() in allocate_filesystem_keyring() */
+	keyring = READ_ONCE(sb->s_master_keys);
+	if (keyring == NULL)
+		return ERR_PTR(-ENOKEY); /* No keyring yet, so no keys yet. */
+
+	format_mk_description(description, mk_spec);
+	return search_fscrypt_keyring(keyring, &key_type_fscrypt, description);
+}
+
+static int allocate_master_key_users_keyring(struct fscrypt_master_key *mk)
+{
+	char description[FSCRYPT_MK_USERS_DESCRIPTION_SIZE];
+	struct key *keyring;
+
+	format_mk_users_keyring_description(description,
+					    mk->mk_spec.u.identifier);
+	keyring = keyring_alloc(description, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
+				current_cred(), KEY_POS_SEARCH |
+				  KEY_USR_SEARCH | KEY_USR_READ | KEY_USR_VIEW,
+				KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
+	if (IS_ERR(keyring))
+		return PTR_ERR(keyring);
+
+	mk->mk_users = keyring;
+	return 0;
+}
+
+/*
+ * Find the current user's "key" in the master key's ->mk_users.
+ * Returns ERR_PTR(-ENOKEY) if not found.
+ */
+static struct key *find_master_key_user(struct fscrypt_master_key *mk)
+{
+	char description[FSCRYPT_MK_USER_DESCRIPTION_SIZE];
+
+	format_mk_user_description(description, mk->mk_spec.u.identifier);
+	return search_fscrypt_keyring(mk->mk_users, &key_type_fscrypt_user,
+				      description);
+}
+
+/*
+ * Give the current user a "key" in ->mk_users.  This charges the user's quota
+ * and marks the master key as added by the current user, so that it cannot be
+ * removed by another user with the key.  Either the master key's key->sem must
+ * be held for write, or the master key must be still undergoing initialization.
+ */
+static int add_master_key_user(struct fscrypt_master_key *mk)
+{
+	char description[FSCRYPT_MK_USER_DESCRIPTION_SIZE];
+	struct key *mk_user;
+	int err;
+
+	format_mk_user_description(description, mk->mk_spec.u.identifier);
+	mk_user = key_alloc(&key_type_fscrypt_user, description,
+			    current_fsuid(), current_gid(), current_cred(),
+			    KEY_POS_SEARCH | KEY_USR_VIEW, 0, NULL);
+	if (IS_ERR(mk_user))
+		return PTR_ERR(mk_user);
+
+	err = key_instantiate_and_link(mk_user, NULL, 0, mk->mk_users, NULL);
+	key_put(mk_user);
+	return err;
+}
+
+/*
+ * Remove the current user's "key" from ->mk_users.
+ * The master key's key->sem must be held for write.
+ *
+ * Returns 0 if removed, -ENOKEY if not found, or another -errno code.
+ */
+static int remove_master_key_user(struct fscrypt_master_key *mk)
+{
+	struct key *mk_user;
+	int err;
+
+	mk_user = find_master_key_user(mk);
+	if (IS_ERR(mk_user))
+		return PTR_ERR(mk_user);
+	err = key_unlink(mk->mk_users, mk_user);
+	key_put(mk_user);
+	return err;
+}
+
+/*
+ * Allocate a new fscrypt_master_key which contains the given secret, set it as
+ * the payload of a new 'struct key' of type fscrypt, and link the 'struct key'
+ * into the given keyring.  Synchronized by fscrypt_add_key_mutex.
+ */
+static int add_new_master_key(struct fscrypt_master_key_secret *secret,
+			      const struct fscrypt_key_specifier *mk_spec,
+			      struct key *keyring)
+{
+	struct fscrypt_master_key *mk;
+	char description[FSCRYPT_MK_DESCRIPTION_SIZE];
+	struct key *key;
+	int err;
+
+	mk = kzalloc(sizeof(*mk), GFP_KERNEL);
+	if (!mk)
+		return -ENOMEM;
+
+	mk->mk_spec = *mk_spec;
+
+	move_master_key_secret(&mk->mk_secret, secret);
+	init_rwsem(&mk->mk_secret_sem);
+
+	refcount_set(&mk->mk_refcount, 1); /* secret is present */
+	INIT_LIST_HEAD(&mk->mk_decrypted_inodes);
+	spin_lock_init(&mk->mk_decrypted_inodes_lock);
+
+	if (mk_spec->type == FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER) {
+		err = allocate_master_key_users_keyring(mk);
+		if (err)
+			goto out_free_mk;
+		err = add_master_key_user(mk);
+		if (err)
+			goto out_free_mk;
+	}
+
+	/*
+	 * Note that we don't charge this key to anyone's quota, since when
+	 * ->mk_users is in use those keys are charged instead, and otherwise
+	 * (when ->mk_users isn't in use) only root can add these keys.
+	 */
+	format_mk_description(description, mk_spec);
+	key = key_alloc(&key_type_fscrypt, description,
+			GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, current_cred(),
+			KEY_POS_SEARCH | KEY_USR_SEARCH | KEY_USR_VIEW,
+			KEY_ALLOC_NOT_IN_QUOTA, NULL);
+	if (IS_ERR(key)) {
+		err = PTR_ERR(key);
+		goto out_free_mk;
+	}
+	err = key_instantiate_and_link(key, mk, sizeof(*mk), keyring, NULL);
+	key_put(key);
+	if (err)
+		goto out_free_mk;
+
+	return 0;
+
+out_free_mk:
+	free_master_key(mk);
+	return err;
+}
+
+#define KEY_DEAD	1
+
+static int add_existing_master_key(struct fscrypt_master_key *mk,
+				   struct fscrypt_master_key_secret *secret)
+{
+	struct key *mk_user;
+	bool rekey;
+	int err;
+
+	/*
+	 * If the current user is already in ->mk_users, then there's nothing to
+	 * do.  (Not applicable for v1 policy keys, which have NULL ->mk_users.)
+	 */
+	if (mk->mk_users) {
+		mk_user = find_master_key_user(mk);
+		if (mk_user != ERR_PTR(-ENOKEY)) {
+			if (IS_ERR(mk_user))
+				return PTR_ERR(mk_user);
+			key_put(mk_user);
+			return 0;
+		}
+	}
+
+	/* If we'll be re-adding ->mk_secret, try to take the reference. */
+	rekey = !is_master_key_secret_present(&mk->mk_secret);
+	if (rekey && !refcount_inc_not_zero(&mk->mk_refcount))
+		return KEY_DEAD;
+
+	/* Add the current user to ->mk_users, if applicable. */
+	if (mk->mk_users) {
+		err = add_master_key_user(mk);
+		if (err) {
+			if (rekey && refcount_dec_and_test(&mk->mk_refcount))
+				return KEY_DEAD;
+			return err;
+		}
+	}
+
+	/* Re-add the secret if needed. */
+	if (rekey) {
+		down_write(&mk->mk_secret_sem);
+		move_master_key_secret(&mk->mk_secret, secret);
+		up_write(&mk->mk_secret_sem);
+	}
+	return 0;
+}
+
+static int add_master_key(struct super_block *sb,
+			  struct fscrypt_master_key_secret *secret,
+			  const struct fscrypt_key_specifier *mk_spec)
+{
+	static DEFINE_MUTEX(fscrypt_add_key_mutex);
+	struct key *key;
+	int err;
+
+	mutex_lock(&fscrypt_add_key_mutex); /* serialize find + link */
+retry:
+	key = fscrypt_find_master_key(sb, mk_spec);
+	if (IS_ERR(key)) {
+		err = PTR_ERR(key);
+		if (err != -ENOKEY)
+			goto out_unlock;
+		/* Didn't find the key in ->s_master_keys.  Add it. */
+		err = allocate_filesystem_keyring(sb);
+		if (err)
+			goto out_unlock;
+		err = add_new_master_key(secret, mk_spec, sb->s_master_keys);
+	} else {
+		/*
+		 * Found the key in ->s_master_keys.  Re-add the secret if
+		 * needed, and add the user to ->mk_users if needed.
+		 */
+		down_write(&key->sem);
+		err = add_existing_master_key(key->payload.data[0], secret);
+		up_write(&key->sem);
+		if (err == KEY_DEAD) {
+			/* Key being removed or needs to be removed */
+			key_invalidate(key);
+			key_put(key);
+			goto retry;
+		}
+		key_put(key);
+	}
+out_unlock:
+	mutex_unlock(&fscrypt_add_key_mutex);
+	return err;
+}
+
+/*
+ * Add a master encryption key to the filesystem, causing all files which were
+ * encrypted with it to appear "unlocked" (decrypted) when accessed.
+ *
+ * When adding a key for use by v1 encryption policies, this ioctl is
+ * privileged, and userspace must provide the 'key_descriptor'.
+ *
+ * When adding a key for use by v2+ encryption policies, this ioctl is
+ * unprivileged.  This is needed, in general, to allow non-root users to use
+ * encryption without encountering the visibility problems of process-subscribed
+ * keyrings and the inability to properly remove keys.  This works by having
+ * each key identified by its cryptographically secure hash --- the
+ * 'key_identifier'.  The cryptographic hash ensures that a malicious user
+ * cannot add the wrong key for a given identifier.  Furthermore, each added key
+ * is charged to the appropriate user's quota for the keyrings service, which
+ * prevents a malicious user from adding too many keys.  Finally, we forbid a
+ * user from removing a key while other users have added it too, which prevents
+ * a user who knows another user's key from causing a denial-of-service by
+ * removing it at an inopportune time.  (We tolerate that a user who knows a key
+ * can prevent other users from removing it.)
+ *
+ * For more details, see the "FS_IOC_ADD_ENCRYPTION_KEY" section of
+ * Documentation/filesystems/fscrypt.rst.
+ */
+int fscrypt_ioctl_add_key(struct file *filp, void __user *_uarg)
+{
+	struct super_block *sb = file_inode(filp)->i_sb;
+	struct fscrypt_add_key_arg __user *uarg = _uarg;
+	struct fscrypt_add_key_arg arg;
+	struct fscrypt_master_key_secret secret;
+	int err;
+
+	if (copy_from_user(&arg, uarg, sizeof(arg)))
+		return -EFAULT;
+
+	if (!valid_key_spec(&arg.key_spec))
+		return -EINVAL;
+
+	if (arg.raw_size < FSCRYPT_MIN_KEY_SIZE ||
+	    arg.raw_size > FSCRYPT_MAX_KEY_SIZE)
+		return -EINVAL;
+
+	if (memchr_inv(arg.__reserved, 0, sizeof(arg.__reserved)))
+		return -EINVAL;
+
+	memset(&secret, 0, sizeof(secret));
+	secret.size = arg.raw_size;
+	err = -EFAULT;
+	if (copy_from_user(secret.raw, uarg->raw, secret.size))
+		goto out_wipe_secret;
+
+	switch (arg.key_spec.type) {
+	case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR:
+		/*
+		 * Only root can add keys that are identified by an arbitrary
+		 * descriptor rather than by a cryptographic hash --- since
+		 * otherwise a malicious user could add the wrong key.
+		 */
+		err = -EACCES;
+		if (!capable(CAP_SYS_ADMIN))
+			goto out_wipe_secret;
+		break;
+	case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER:
+		err = fscrypt_init_hkdf(&secret.hkdf, secret.raw, secret.size);
+		if (err)
+			goto out_wipe_secret;
+
+		/*
+		 * Now that the HKDF context is initialized, the raw key is no
+		 * longer needed.
+		 */
+		memzero_explicit(secret.raw, secret.size);
+
+		/* Calculate the key identifier and return it to userspace. */
+		err = fscrypt_hkdf_expand(&secret.hkdf,
+					  HKDF_CONTEXT_KEY_IDENTIFIER,
+					  NULL, 0, arg.key_spec.u.identifier,
+					  FSCRYPT_KEY_IDENTIFIER_SIZE);
+		if (err)
+			goto out_wipe_secret;
+		err = -EFAULT;
+		if (copy_to_user(uarg->key_spec.u.identifier,
+				 arg.key_spec.u.identifier,
+				 FSCRYPT_KEY_IDENTIFIER_SIZE))
+			goto out_wipe_secret;
+		break;
+	default:
+		WARN_ON(1);
+		err = -EINVAL;
+		goto out_wipe_secret;
+	}
+
+	err = add_master_key(sb, &secret, &arg.key_spec);
+out_wipe_secret:
+	wipe_master_key_secret(&secret);
+	return err;
+}
+EXPORT_SYMBOL_GPL(fscrypt_ioctl_add_key);
+
+/*
+ * Verify that the current user has added a master key with the given identifier
+ * (returns -ENOKEY if not).  This is needed to prevent a user from encrypting
+ * their files using some other user's key which they don't actually know.
+ * Cryptographically this isn't much of a problem, but the semantics of this
+ * would be a bit weird, so it's best to just forbid it.
+ *
+ * The system administrator (CAP_FOWNER) can override this, which should be
+ * enough for any use cases where encryption policies are being set using keys
+ * that were chosen ahead of time but aren't available at the moment.
+ *
+ * Note that the key may have already removed by the time this returns, but
+ * that's okay; we just care whether the key was there at some point.
+ *
+ * Return: 0 if the key is added, -ENOKEY if it isn't, or another -errno code
+ */
+int fscrypt_verify_key_added(struct super_block *sb,
+			     const u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE])
+{
+	struct fscrypt_key_specifier mk_spec;
+	struct key *key, *mk_user;
+	struct fscrypt_master_key *mk;
+	int err;
+
+	mk_spec.type = FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER;
+	memcpy(mk_spec.u.identifier, identifier, FSCRYPT_KEY_IDENTIFIER_SIZE);
+
+	key = fscrypt_find_master_key(sb, &mk_spec);
+	if (IS_ERR(key)) {
+		err = PTR_ERR(key);
+		goto out;
+	}
+	mk = key->payload.data[0];
+	mk_user = find_master_key_user(mk);
+	if (IS_ERR(mk_user)) {
+		err = PTR_ERR(mk_user);
+	} else {
+		key_put(mk_user);
+		err = 0;
+	}
+	key_put(key);
+out:
+	if (err == -ENOKEY && capable(CAP_FOWNER))
+		err = 0;
+	return err;
+}
+
+/*
+ * Try to evict the inode's dentries from the dentry cache.  If the inode is a
+ * directory, then it can have at most one dentry; however, that dentry may be
+ * pinned by child dentries, so first try to evict the children too.
+ */
+static void shrink_dcache_inode(struct inode *inode)
+{
+	struct dentry *dentry;
+
+	if (S_ISDIR(inode->i_mode)) {
+		dentry = d_find_any_alias(inode);
+		if (dentry) {
+			shrink_dcache_parent(dentry);
+			dput(dentry);
+		}
+	}
+	d_prune_aliases(inode);
+}
+
+static void evict_dentries_for_decrypted_inodes(struct fscrypt_master_key *mk)
+{
+	struct fscrypt_info *ci;
+	struct inode *inode;
+	struct inode *toput_inode = NULL;
+
+	spin_lock(&mk->mk_decrypted_inodes_lock);
+
+	list_for_each_entry(ci, &mk->mk_decrypted_inodes, ci_master_key_link) {
+		inode = ci->ci_inode;
+		spin_lock(&inode->i_lock);
+		if (inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) {
+			spin_unlock(&inode->i_lock);
+			continue;
+		}
+		__iget(inode);
+		spin_unlock(&inode->i_lock);
+		spin_unlock(&mk->mk_decrypted_inodes_lock);
+
+		shrink_dcache_inode(inode);
+		iput(toput_inode);
+		toput_inode = inode;
+
+		spin_lock(&mk->mk_decrypted_inodes_lock);
+	}
+
+	spin_unlock(&mk->mk_decrypted_inodes_lock);
+	iput(toput_inode);
+}
+
+static int check_for_busy_inodes(struct super_block *sb,
+				 struct fscrypt_master_key *mk)
+{
+	struct list_head *pos;
+	size_t busy_count = 0;
+	unsigned long ino;
+	struct dentry *dentry;
+	char _path[256];
+	char *path = NULL;
+
+	spin_lock(&mk->mk_decrypted_inodes_lock);
+
+	list_for_each(pos, &mk->mk_decrypted_inodes)
+		busy_count++;
+
+	if (busy_count == 0) {
+		spin_unlock(&mk->mk_decrypted_inodes_lock);
+		return 0;
+	}
+
+	{
+		/* select an example file to show for debugging purposes */
+		struct inode *inode =
+			list_first_entry(&mk->mk_decrypted_inodes,
+					 struct fscrypt_info,
+					 ci_master_key_link)->ci_inode;
+		ino = inode->i_ino;
+		dentry = d_find_alias(inode);
+	}
+	spin_unlock(&mk->mk_decrypted_inodes_lock);
+
+	if (dentry) {
+		path = dentry_path(dentry, _path, sizeof(_path));
+		dput(dentry);
+	}
+	if (IS_ERR_OR_NULL(path))
+		path = "(unknown)";
+
+	fscrypt_warn(NULL,
+		     "%s: %zu inode(s) still busy after removing key with %s %*phN, including ino %lu (%s)",
+		     sb->s_id, busy_count, master_key_spec_type(&mk->mk_spec),
+		     master_key_spec_len(&mk->mk_spec), (u8 *)&mk->mk_spec.u,
+		     ino, path);
+	return -EBUSY;
+}
+
+static BLOCKING_NOTIFIER_HEAD(fscrypt_key_removal_notifiers);
+
+/*
+ * Register a function to be executed when the FS_IOC_REMOVE_ENCRYPTION_KEY
+ * ioctl has removed a key and is about to try evicting inodes.
+ */
+int fscrypt_register_key_removal_notifier(struct notifier_block *nb)
+{
+	return blocking_notifier_chain_register(&fscrypt_key_removal_notifiers,
+						nb);
+}
+EXPORT_SYMBOL_GPL(fscrypt_register_key_removal_notifier);
+
+int fscrypt_unregister_key_removal_notifier(struct notifier_block *nb)
+{
+	return blocking_notifier_chain_unregister(&fscrypt_key_removal_notifiers,
+						  nb);
+}
+EXPORT_SYMBOL_GPL(fscrypt_unregister_key_removal_notifier);
+
+static int try_to_lock_encrypted_files(struct super_block *sb,
+				       struct fscrypt_master_key *mk)
+{
+	int err1;
+	int err2;
+
+	blocking_notifier_call_chain(&fscrypt_key_removal_notifiers, 0, NULL);
+
+	/*
+	 * An inode can't be evicted while it is dirty or has dirty pages.
+	 * Thus, we first have to clean the inodes in ->mk_decrypted_inodes.
+	 *
+	 * Just do it the easy way: call sync_filesystem().  It's overkill, but
+	 * it works, and it's more important to minimize the amount of caches we
+	 * drop than the amount of data we sync.  Also, unprivileged users can
+	 * already call sync_filesystem() via sys_syncfs() or sys_sync().
+	 */
+	down_read(&sb->s_umount);
+	err1 = sync_filesystem(sb);
+	up_read(&sb->s_umount);
+	/* If a sync error occurs, still try to evict as much as possible. */
+
+	/*
+	 * Inodes are pinned by their dentries, so we have to evict their
+	 * dentries.  shrink_dcache_sb() would suffice, but would be overkill
+	 * and inappropriate for use by unprivileged users.  So instead go
+	 * through the inodes' alias lists and try to evict each dentry.
+	 */
+	evict_dentries_for_decrypted_inodes(mk);
+
+	/*
+	 * evict_dentries_for_decrypted_inodes() already iput() each inode in
+	 * the list; any inodes for which that dropped the last reference will
+	 * have been evicted due to fscrypt_drop_inode() detecting the key
+	 * removal and telling the VFS to evict the inode.  So to finish, we
+	 * just need to check whether any inodes couldn't be evicted.
+	 */
+	err2 = check_for_busy_inodes(sb, mk);
+
+	return err1 ?: err2;
+}
+
+/*
+ * Try to remove an fscrypt master encryption key.
+ *
+ * FS_IOC_REMOVE_ENCRYPTION_KEY (all_users=false) removes the current user's
+ * claim to the key, then removes the key itself if no other users have claims.
+ * FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS (all_users=true) always removes the
+ * key itself.
+ *
+ * To "remove the key itself", first we wipe the actual master key secret, so
+ * that no more inodes can be unlocked with it.  Then we try to evict all cached
+ * inodes that had been unlocked with the key.
+ *
+ * If all inodes were evicted, then we unlink the fscrypt_master_key from the
+ * keyring.  Otherwise it remains in the keyring in the "incompletely removed"
+ * state (without the actual secret key) where it tracks the list of remaining
+ * inodes.  Userspace can execute the ioctl again later to retry eviction, or
+ * alternatively can re-add the secret key again.
+ *
+ * For more details, see the "Removing keys" section of
+ * Documentation/filesystems/fscrypt.rst.
+ */
+static int do_remove_key(struct file *filp, void __user *_uarg, bool all_users)
+{
+	struct super_block *sb = file_inode(filp)->i_sb;
+	struct fscrypt_remove_key_arg __user *uarg = _uarg;
+	struct fscrypt_remove_key_arg arg;
+	struct key *key;
+	struct fscrypt_master_key *mk;
+	u32 status_flags = 0;
+	int err;
+	bool dead;
+
+	if (copy_from_user(&arg, uarg, sizeof(arg)))
+		return -EFAULT;
+
+	if (!valid_key_spec(&arg.key_spec))
+		return -EINVAL;
+
+	if (memchr_inv(arg.__reserved, 0, sizeof(arg.__reserved)))
+		return -EINVAL;
+
+	/*
+	 * Only root can add and remove keys that are identified by an arbitrary
+	 * descriptor rather than by a cryptographic hash.
+	 */
+	if (arg.key_spec.type == FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR &&
+	    !capable(CAP_SYS_ADMIN))
+		return -EACCES;
+
+	/* Find the key being removed. */
+	key = fscrypt_find_master_key(sb, &arg.key_spec);
+	if (IS_ERR(key))
+		return PTR_ERR(key);
+	mk = key->payload.data[0];
+
+	down_write(&key->sem);
+
+	/* If relevant, remove current user's (or all users) claim to the key */
+	if (mk->mk_users && mk->mk_users->keys.nr_leaves_on_tree != 0) {
+		if (all_users)
+			err = keyring_clear(mk->mk_users);
+		else
+			err = remove_master_key_user(mk);
+		if (err) {
+			up_write(&key->sem);
+			goto out_put_key;
+		}
+		if (mk->mk_users->keys.nr_leaves_on_tree != 0) {
+			/*
+			 * Other users have still added the key too.  We removed
+			 * the current user's claim to the key, but we still
+			 * can't remove the key itself.
+			 */
+			status_flags |=
+				FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS;
+			err = 0;
+			up_write(&key->sem);
+			goto out_put_key;
+		}
+	}
+
+	/* No user claims remaining.  Go ahead and wipe the secret. */
+	dead = false;
+	if (is_master_key_secret_present(&mk->mk_secret)) {
+		down_write(&mk->mk_secret_sem);
+		wipe_master_key_secret(&mk->mk_secret);
+		dead = refcount_dec_and_test(&mk->mk_refcount);
+		up_write(&mk->mk_secret_sem);
+	}
+	up_write(&key->sem);
+	if (dead) {
+		/*
+		 * No inodes reference the key, and we wiped the secret, so the
+		 * key object is free to be removed from the keyring.
+		 */
+		key_invalidate(key);
+		err = 0;
+	} else {
+		/* Some inodes still reference this key; try to evict them. */
+		err = try_to_lock_encrypted_files(sb, mk);
+		if (err == -EBUSY) {
+			status_flags |=
+				FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY;
+			err = 0;
+		}
+	}
+	/*
+	 * We return 0 if we successfully did something: removed a claim to the
+	 * key, wiped the secret, or tried locking the files again.  Users need
+	 * to check the informational status flags if they care whether the key
+	 * has been fully removed including all files locked.
+	 */
+out_put_key:
+	key_put(key);
+	if (err == 0)
+		err = put_user(status_flags, &uarg->removal_status_flags);
+	return err;
+}
+
+int fscrypt_ioctl_remove_key(struct file *filp, void __user *uarg)
+{
+	return do_remove_key(filp, uarg, false);
+}
+EXPORT_SYMBOL_GPL(fscrypt_ioctl_remove_key);
+
+int fscrypt_ioctl_remove_key_all_users(struct file *filp, void __user *uarg)
+{
+	if (!capable(CAP_SYS_ADMIN))
+		return -EACCES;
+	return do_remove_key(filp, uarg, true);
+}
+EXPORT_SYMBOL_GPL(fscrypt_ioctl_remove_key_all_users);
+
+/*
+ * Retrieve the status of an fscrypt master encryption key.
+ *
+ * We set ->status to indicate whether the key is absent, present, or
+ * incompletely removed.  "Incompletely removed" means that the master key
+ * secret has been removed, but some files which had been unlocked with it are
+ * still in use.  This field allows applications to easily determine the state
+ * of an encrypted directory without using a hack such as trying to open a
+ * regular file in it (which can confuse the "incompletely removed" state with
+ * absent or present).
+ *
+ * In addition, for v2 policy keys we allow applications to determine, via
+ * ->status_flags and ->user_count, whether the key has been added by the
+ * current user, by other users, or by both.  Most applications should not need
+ * this, since ordinarily only one user should know a given key.  However, if a
+ * secret key is shared by multiple users, applications may wish to add an
+ * already-present key to prevent other users from removing it.  This ioctl can
+ * be used to check whether that really is the case before the work is done to
+ * add the key --- which might e.g. require prompting the user for a passphrase.
+ *
+ * For more details, see the "FS_IOC_GET_ENCRYPTION_KEY_STATUS" section of
+ * Documentation/filesystems/fscrypt.rst.
+ */
+int fscrypt_ioctl_get_key_status(struct file *filp, void __user *uarg)
+{
+	struct super_block *sb = file_inode(filp)->i_sb;
+	struct fscrypt_get_key_status_arg arg;
+	struct key *key;
+	struct fscrypt_master_key *mk;
+	int err;
+
+	if (copy_from_user(&arg, uarg, sizeof(arg)))
+		return -EFAULT;
+
+	if (!valid_key_spec(&arg.key_spec))
+		return -EINVAL;
+
+	if (memchr_inv(arg.__reserved, 0, sizeof(arg.__reserved)))
+		return -EINVAL;
+
+	arg.status_flags = 0;
+	arg.user_count = 0;
+	memset(arg.__out_reserved, 0, sizeof(arg.__out_reserved));
+
+	key = fscrypt_find_master_key(sb, &arg.key_spec);
+	if (IS_ERR(key)) {
+		if (key != ERR_PTR(-ENOKEY))
+			return PTR_ERR(key);
+		arg.status = FSCRYPT_KEY_STATUS_ABSENT;
+		err = 0;
+		goto out;
+	}
+	mk = key->payload.data[0];
+	down_read(&key->sem);
+
+	if (!is_master_key_secret_present(&mk->mk_secret)) {
+		arg.status = FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED;
+		err = 0;
+		goto out_release_key;
+	}
+
+	arg.status = FSCRYPT_KEY_STATUS_PRESENT;
+	if (mk->mk_users) {
+		struct key *mk_user;
+
+		arg.user_count = mk->mk_users->keys.nr_leaves_on_tree;
+		mk_user = find_master_key_user(mk);
+		if (!IS_ERR(mk_user)) {
+			arg.status_flags |=
+				FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF;
+			key_put(mk_user);
+		} else if (mk_user != ERR_PTR(-ENOKEY)) {
+			err = PTR_ERR(mk_user);
+			goto out_release_key;
+		}
+	}
+	err = 0;
+out_release_key:
+	up_read(&key->sem);
+	key_put(key);
+out:
+	if (!err && copy_to_user(uarg, &arg, sizeof(arg)))
+		err = -EFAULT;
+	return err;
+}
+EXPORT_SYMBOL_GPL(fscrypt_ioctl_get_key_status);
+
+int __init fscrypt_init_keyring(void)
+{
+	int err;
+
+	err = register_key_type(&key_type_fscrypt);
+	if (err)
+		return err;
+
+	err = register_key_type(&key_type_fscrypt_user);
+	if (err)
+		goto err_unregister_fscrypt;
+
+	return 0;
+
+err_unregister_fscrypt:
+	unregister_key_type(&key_type_fscrypt);
+	return err;
+}
diff --git a/fs/crypto/keysetup.c b/fs/crypto/keysetup.c
new file mode 100644
index 0000000..3734ccc
--- /dev/null
+++ b/fs/crypto/keysetup.c
@@ -0,0 +1,537 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Key setup facility for FS encryption support.
+ *
+ * Copyright (C) 2015, Google, Inc.
+ *
+ * Originally written by Michael Halcrow, Ildar Muslukhov, and Uday Savagaonkar.
+ * Heavily modified since then.
+ */
+
+#include <crypto/skcipher.h>
+#include <linux/key.h>
+
+#include "fscrypt_private.h"
+
+struct fscrypt_mode fscrypt_modes[] = {
+	[FSCRYPT_MODE_AES_256_XTS] = {
+		.friendly_name = "AES-256-XTS",
+		.cipher_str = "xts(aes)",
+		.keysize = 64,
+		.ivsize = 16,
+		.blk_crypto_mode = BLK_ENCRYPTION_MODE_AES_256_XTS,
+	},
+	[FSCRYPT_MODE_AES_256_CTS] = {
+		.friendly_name = "AES-256-CTS-CBC",
+		.cipher_str = "cts(cbc(aes))",
+		.keysize = 32,
+		.ivsize = 16,
+	},
+	[FSCRYPT_MODE_AES_128_CBC] = {
+		.friendly_name = "AES-128-CBC-ESSIV",
+		.cipher_str = "essiv(cbc(aes),sha256)",
+		.keysize = 16,
+		.ivsize = 16,
+	},
+	[FSCRYPT_MODE_AES_128_CTS] = {
+		.friendly_name = "AES-128-CTS-CBC",
+		.cipher_str = "cts(cbc(aes))",
+		.keysize = 16,
+		.ivsize = 16,
+	},
+	[FSCRYPT_MODE_ADIANTUM] = {
+		.friendly_name = "Adiantum",
+		.cipher_str = "adiantum(xchacha12,aes)",
+		.keysize = 32,
+		.ivsize = 32,
+	},
+};
+
+static struct fscrypt_mode *
+select_encryption_mode(const union fscrypt_policy *policy,
+		       const struct inode *inode)
+{
+	if (S_ISREG(inode->i_mode))
+		return &fscrypt_modes[fscrypt_policy_contents_mode(policy)];
+
+	if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))
+		return &fscrypt_modes[fscrypt_policy_fnames_mode(policy)];
+
+	WARN_ONCE(1, "fscrypt: filesystem tried to load encryption info for inode %lu, which is not encryptable (file type %d)\n",
+		  inode->i_ino, (inode->i_mode & S_IFMT));
+	return ERR_PTR(-EINVAL);
+}
+
+/* Create a symmetric cipher object for the given encryption mode and key */
+struct crypto_skcipher *fscrypt_allocate_skcipher(struct fscrypt_mode *mode,
+						  const u8 *raw_key,
+						  const struct inode *inode)
+{
+	struct crypto_skcipher *tfm;
+	int err;
+
+	tfm = crypto_alloc_skcipher(mode->cipher_str, 0, 0);
+	if (IS_ERR(tfm)) {
+		if (PTR_ERR(tfm) == -ENOENT) {
+			fscrypt_warn(inode,
+				     "Missing crypto API support for %s (API name: \"%s\")",
+				     mode->friendly_name, mode->cipher_str);
+			return ERR_PTR(-ENOPKG);
+		}
+		fscrypt_err(inode, "Error allocating '%s' transform: %ld",
+			    mode->cipher_str, PTR_ERR(tfm));
+		return tfm;
+	}
+	if (unlikely(!mode->logged_impl_name)) {
+		/*
+		 * fscrypt performance can vary greatly depending on which
+		 * crypto algorithm implementation is used.  Help people debug
+		 * performance problems by logging the ->cra_driver_name the
+		 * first time a mode is used.  Note that multiple threads can
+		 * race here, but it doesn't really matter.
+		 */
+		mode->logged_impl_name = true;
+		pr_info("fscrypt: %s using implementation \"%s\"\n",
+			mode->friendly_name,
+			crypto_skcipher_alg(tfm)->base.cra_driver_name);
+	}
+	crypto_skcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
+	err = crypto_skcipher_setkey(tfm, raw_key, mode->keysize);
+	if (err)
+		goto err_free_tfm;
+
+	return tfm;
+
+err_free_tfm:
+	crypto_free_skcipher(tfm);
+	return ERR_PTR(err);
+}
+
+/* Given the per-file key, set up the file's crypto transform object */
+int fscrypt_set_derived_key(struct fscrypt_info *ci, const u8 *derived_key)
+{
+	struct crypto_skcipher *tfm;
+
+	if (fscrypt_should_use_inline_encryption(ci))
+		return fscrypt_set_inline_crypt_key(ci, derived_key);
+
+	tfm = fscrypt_allocate_skcipher(ci->ci_mode, derived_key, ci->ci_inode);
+	if (IS_ERR(tfm))
+		return PTR_ERR(tfm);
+
+	ci->ci_ctfm = tfm;
+	ci->ci_owns_key = true;
+	return 0;
+}
+
+static int setup_per_mode_key(struct fscrypt_info *ci,
+			      struct fscrypt_master_key *mk,
+			      struct crypto_skcipher **tfms,
+			      u8 hkdf_context, bool include_fs_uuid)
+{
+	const struct inode *inode = ci->ci_inode;
+	const struct super_block *sb = inode->i_sb;
+	struct fscrypt_mode *mode = ci->ci_mode;
+	const u8 mode_num = mode - fscrypt_modes;
+	struct crypto_skcipher *tfm, *prev_tfm;
+	u8 mode_key[FSCRYPT_MAX_KEY_SIZE];
+	u8 hkdf_info[sizeof(mode_num) + sizeof(sb->s_uuid)];
+	unsigned int hkdf_infolen = 0;
+	int err;
+
+	if (WARN_ON(mode_num > __FSCRYPT_MODE_MAX))
+		return -EINVAL;
+
+	/* pairs with cmpxchg() below */
+	tfm = READ_ONCE(tfms[mode_num]);
+	if (likely(tfm != NULL))
+		goto done;
+
+	BUILD_BUG_ON(sizeof(mode_num) != 1);
+	BUILD_BUG_ON(sizeof(sb->s_uuid) != 16);
+	BUILD_BUG_ON(sizeof(hkdf_info) != 17);
+	hkdf_info[hkdf_infolen++] = mode_num;
+	if (include_fs_uuid) {
+		memcpy(&hkdf_info[hkdf_infolen], &sb->s_uuid,
+		       sizeof(sb->s_uuid));
+		hkdf_infolen += sizeof(sb->s_uuid);
+	}
+	err = fscrypt_hkdf_expand(&mk->mk_secret.hkdf,
+				  hkdf_context, hkdf_info, hkdf_infolen,
+				  mode_key, mode->keysize);
+	if (err)
+		return err;
+	tfm = fscrypt_allocate_skcipher(mode, mode_key, inode);
+	memzero_explicit(mode_key, mode->keysize);
+	if (IS_ERR(tfm))
+		return PTR_ERR(tfm);
+
+	/* pairs with READ_ONCE() above */
+	prev_tfm = cmpxchg(&tfms[mode_num], NULL, tfm);
+	if (prev_tfm != NULL) {
+		crypto_free_skcipher(tfm);
+		tfm = prev_tfm;
+	}
+done:
+	ci->ci_ctfm = tfm;
+	return 0;
+}
+
+static int fscrypt_setup_v2_file_key(struct fscrypt_info *ci,
+				     struct fscrypt_master_key *mk)
+{
+	u8 derived_key[FSCRYPT_MAX_KEY_SIZE];
+	int err;
+
+	if (ci->ci_policy.v2.flags & FSCRYPT_POLICY_FLAG_DIRECT_KEY) {
+		/*
+		 * DIRECT_KEY: instead of deriving per-file keys, the per-file
+		 * nonce will be included in all the IVs.  But unlike v1
+		 * policies, for v2 policies in this case we don't encrypt with
+		 * the master key directly but rather derive a per-mode key.
+		 * This ensures that the master key is consistently used only
+		 * for HKDF, avoiding key reuse issues.
+		 */
+		if (!fscrypt_mode_supports_direct_key(ci->ci_mode)) {
+			fscrypt_warn(ci->ci_inode,
+				     "Direct key flag not allowed with %s",
+				     ci->ci_mode->friendly_name);
+			return -EINVAL;
+		}
+		return setup_per_mode_key(ci, mk, mk->mk_direct_tfms,
+					  HKDF_CONTEXT_DIRECT_KEY, false);
+	} else if (ci->ci_policy.v2.flags &
+		   FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64) {
+		/*
+		 * IV_INO_LBLK_64: encryption keys are derived from (master_key,
+		 * mode_num, filesystem_uuid), and inode number is included in
+		 * the IVs.  This format is optimized for use with inline
+		 * encryption hardware compliant with the UFS or eMMC standards.
+		 */
+		if (fscrypt_should_use_inline_encryption(ci))
+			return fscrypt_setup_per_mode_inline_crypt_key(ci, mk);
+		return setup_per_mode_key(ci, mk, mk->mk_iv_ino_lblk_64_tfms,
+					  HKDF_CONTEXT_IV_INO_LBLK_64_KEY,
+					  true);
+	}
+
+	err = fscrypt_hkdf_expand(&mk->mk_secret.hkdf,
+				  HKDF_CONTEXT_PER_FILE_KEY,
+				  ci->ci_nonce, FS_KEY_DERIVATION_NONCE_SIZE,
+				  derived_key, ci->ci_mode->keysize);
+	if (err)
+		return err;
+
+	err = fscrypt_set_derived_key(ci, derived_key);
+	memzero_explicit(derived_key, ci->ci_mode->keysize);
+	return err;
+}
+
+/*
+ * Find the master key, then set up the inode's actual encryption key.
+ *
+ * If the master key is found in the filesystem-level keyring, then the
+ * corresponding 'struct key' is returned in *master_key_ret with
+ * ->mk_secret_sem read-locked.  This is needed to ensure that only one task
+ * links the fscrypt_info into ->mk_decrypted_inodes (as multiple tasks may race
+ * to create an fscrypt_info for the same inode), and to synchronize the master
+ * key being removed with a new inode starting to use it.
+ */
+static int setup_file_encryption_key(struct fscrypt_info *ci,
+				     struct key **master_key_ret)
+{
+	struct key *key;
+	struct fscrypt_master_key *mk = NULL;
+	struct fscrypt_key_specifier mk_spec;
+	int err;
+
+	switch (ci->ci_policy.version) {
+	case FSCRYPT_POLICY_V1:
+		mk_spec.type = FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR;
+		memcpy(mk_spec.u.descriptor,
+		       ci->ci_policy.v1.master_key_descriptor,
+		       FSCRYPT_KEY_DESCRIPTOR_SIZE);
+		break;
+	case FSCRYPT_POLICY_V2:
+		mk_spec.type = FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER;
+		memcpy(mk_spec.u.identifier,
+		       ci->ci_policy.v2.master_key_identifier,
+		       FSCRYPT_KEY_IDENTIFIER_SIZE);
+		break;
+	default:
+		WARN_ON(1);
+		return -EINVAL;
+	}
+
+	key = fscrypt_find_master_key(ci->ci_inode->i_sb, &mk_spec);
+	if (IS_ERR(key)) {
+		if (key != ERR_PTR(-ENOKEY) ||
+		    ci->ci_policy.version != FSCRYPT_POLICY_V1)
+			return PTR_ERR(key);
+
+		/*
+		 * As a legacy fallback for v1 policies, search for the key in
+		 * the current task's subscribed keyrings too.  Don't move this
+		 * to before the search of ->s_master_keys, since users
+		 * shouldn't be able to override filesystem-level keys.
+		 */
+		return fscrypt_setup_v1_file_key_via_subscribed_keyrings(ci);
+	}
+
+	mk = key->payload.data[0];
+	down_read(&mk->mk_secret_sem);
+
+	/* Has the secret been removed (via FS_IOC_REMOVE_ENCRYPTION_KEY)? */
+	if (!is_master_key_secret_present(&mk->mk_secret)) {
+		err = -ENOKEY;
+		goto out_release_key;
+	}
+
+	/*
+	 * Require that the master key be at least as long as the derived key.
+	 * Otherwise, the derived key cannot possibly contain as much entropy as
+	 * that required by the encryption mode it will be used for.  For v1
+	 * policies it's also required for the KDF to work at all.
+	 */
+	if (mk->mk_secret.size < ci->ci_mode->keysize) {
+		fscrypt_warn(NULL,
+			     "key with %s %*phN is too short (got %u bytes, need %u+ bytes)",
+			     master_key_spec_type(&mk_spec),
+			     master_key_spec_len(&mk_spec), (u8 *)&mk_spec.u,
+			     mk->mk_secret.size, ci->ci_mode->keysize);
+		err = -ENOKEY;
+		goto out_release_key;
+	}
+
+	switch (ci->ci_policy.version) {
+	case FSCRYPT_POLICY_V1:
+		err = fscrypt_setup_v1_file_key(ci, mk->mk_secret.raw);
+		break;
+	case FSCRYPT_POLICY_V2:
+		err = fscrypt_setup_v2_file_key(ci, mk);
+		break;
+	default:
+		WARN_ON(1);
+		err = -EINVAL;
+		break;
+	}
+	if (err)
+		goto out_release_key;
+
+	*master_key_ret = key;
+	return 0;
+
+out_release_key:
+	up_read(&mk->mk_secret_sem);
+	key_put(key);
+	return err;
+}
+
+static void put_crypt_info(struct fscrypt_info *ci)
+{
+	struct key *key;
+
+	if (!ci)
+		return;
+
+	if (ci->ci_direct_key)
+		fscrypt_put_direct_key(ci->ci_direct_key);
+	else if (ci->ci_owns_key) {
+		crypto_free_skcipher(ci->ci_ctfm);
+		fscrypt_free_inline_crypt_key(ci);
+	}
+
+	key = ci->ci_master_key;
+	if (key) {
+		struct fscrypt_master_key *mk = key->payload.data[0];
+
+		/*
+		 * Remove this inode from the list of inodes that were unlocked
+		 * with the master key.
+		 *
+		 * In addition, if we're removing the last inode from a key that
+		 * already had its secret removed, invalidate the key so that it
+		 * gets removed from ->s_master_keys.
+		 */
+		spin_lock(&mk->mk_decrypted_inodes_lock);
+		list_del(&ci->ci_master_key_link);
+		spin_unlock(&mk->mk_decrypted_inodes_lock);
+		if (refcount_dec_and_test(&mk->mk_refcount))
+			key_invalidate(key);
+		key_put(key);
+	}
+	memzero_explicit(ci, sizeof(*ci));
+	kmem_cache_free(fscrypt_info_cachep, ci);
+}
+
+int fscrypt_get_encryption_info(struct inode *inode)
+{
+	struct fscrypt_info *crypt_info;
+	union fscrypt_context ctx;
+	struct fscrypt_mode *mode;
+	struct key *master_key = NULL;
+	int res;
+
+	if (fscrypt_has_encryption_key(inode))
+		return 0;
+
+	res = fscrypt_initialize(inode->i_sb->s_cop->flags);
+	if (res)
+		return res;
+
+	res = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx));
+	if (res < 0) {
+		if (!fscrypt_dummy_context_enabled(inode) ||
+		    IS_ENCRYPTED(inode)) {
+			fscrypt_warn(inode,
+				     "Error %d getting encryption context",
+				     res);
+			return res;
+		}
+		/* Fake up a context for an unencrypted directory */
+		memset(&ctx, 0, sizeof(ctx));
+		ctx.version = FSCRYPT_CONTEXT_V1;
+		ctx.v1.contents_encryption_mode = FSCRYPT_MODE_AES_256_XTS;
+		ctx.v1.filenames_encryption_mode = FSCRYPT_MODE_AES_256_CTS;
+		memset(ctx.v1.master_key_descriptor, 0x42,
+		       FSCRYPT_KEY_DESCRIPTOR_SIZE);
+		res = sizeof(ctx.v1);
+	}
+
+	crypt_info = kmem_cache_zalloc(fscrypt_info_cachep, GFP_NOFS);
+	if (!crypt_info)
+		return -ENOMEM;
+
+	crypt_info->ci_inode = inode;
+
+	res = fscrypt_policy_from_context(&crypt_info->ci_policy, &ctx, res);
+	if (res) {
+		fscrypt_warn(inode,
+			     "Unrecognized or corrupt encryption context");
+		goto out;
+	}
+
+	switch (ctx.version) {
+	case FSCRYPT_CONTEXT_V1:
+		memcpy(crypt_info->ci_nonce, ctx.v1.nonce,
+		       FS_KEY_DERIVATION_NONCE_SIZE);
+		break;
+	case FSCRYPT_CONTEXT_V2:
+		memcpy(crypt_info->ci_nonce, ctx.v2.nonce,
+		       FS_KEY_DERIVATION_NONCE_SIZE);
+		break;
+	default:
+		WARN_ON(1);
+		res = -EINVAL;
+		goto out;
+	}
+
+	if (!fscrypt_supported_policy(&crypt_info->ci_policy, inode)) {
+		res = -EINVAL;
+		goto out;
+	}
+
+	mode = select_encryption_mode(&crypt_info->ci_policy, inode);
+	if (IS_ERR(mode)) {
+		res = PTR_ERR(mode);
+		goto out;
+	}
+	WARN_ON(mode->ivsize > FSCRYPT_MAX_IV_SIZE);
+	crypt_info->ci_mode = mode;
+
+	res = setup_file_encryption_key(crypt_info, &master_key);
+	if (res)
+		goto out;
+
+	if (cmpxchg_release(&inode->i_crypt_info, NULL, crypt_info) == NULL) {
+		if (master_key) {
+			struct fscrypt_master_key *mk =
+				master_key->payload.data[0];
+
+			refcount_inc(&mk->mk_refcount);
+			crypt_info->ci_master_key = key_get(master_key);
+			spin_lock(&mk->mk_decrypted_inodes_lock);
+			list_add(&crypt_info->ci_master_key_link,
+				 &mk->mk_decrypted_inodes);
+			spin_unlock(&mk->mk_decrypted_inodes_lock);
+		}
+		crypt_info = NULL;
+	}
+	res = 0;
+out:
+	if (master_key) {
+		struct fscrypt_master_key *mk = master_key->payload.data[0];
+
+		up_read(&mk->mk_secret_sem);
+		key_put(master_key);
+	}
+	if (res == -ENOKEY)
+		res = 0;
+	put_crypt_info(crypt_info);
+	return res;
+}
+EXPORT_SYMBOL(fscrypt_get_encryption_info);
+
+/**
+ * fscrypt_put_encryption_info - free most of an inode's fscrypt data
+ *
+ * Free the inode's fscrypt_info.  Filesystems must call this when the inode is
+ * being evicted.  An RCU grace period need not have elapsed yet.
+ */
+void fscrypt_put_encryption_info(struct inode *inode)
+{
+	put_crypt_info(inode->i_crypt_info);
+	inode->i_crypt_info = NULL;
+}
+EXPORT_SYMBOL(fscrypt_put_encryption_info);
+
+/**
+ * fscrypt_free_inode - free an inode's fscrypt data requiring RCU delay
+ *
+ * Free the inode's cached decrypted symlink target, if any.  Filesystems must
+ * call this after an RCU grace period, just before they free the inode.
+ */
+void fscrypt_free_inode(struct inode *inode)
+{
+	if (IS_ENCRYPTED(inode) && S_ISLNK(inode->i_mode)) {
+		kfree(inode->i_link);
+		inode->i_link = NULL;
+	}
+}
+EXPORT_SYMBOL(fscrypt_free_inode);
+
+/**
+ * fscrypt_drop_inode - check whether the inode's master key has been removed
+ *
+ * Filesystems supporting fscrypt must call this from their ->drop_inode()
+ * method so that encrypted inodes are evicted as soon as they're no longer in
+ * use and their master key has been removed.
+ *
+ * Return: 1 if fscrypt wants the inode to be evicted now, otherwise 0
+ */
+int fscrypt_drop_inode(struct inode *inode)
+{
+	const struct fscrypt_info *ci = READ_ONCE(inode->i_crypt_info);
+	const struct fscrypt_master_key *mk;
+
+	/*
+	 * If ci is NULL, then the inode doesn't have an encryption key set up
+	 * so it's irrelevant.  If ci_master_key is NULL, then the master key
+	 * was provided via the legacy mechanism of the process-subscribed
+	 * keyrings, so we don't know whether it's been removed or not.
+	 */
+	if (!ci || !ci->ci_master_key)
+		return 0;
+	mk = ci->ci_master_key->payload.data[0];
+
+	/*
+	 * Note: since we aren't holding ->mk_secret_sem, the result here can
+	 * immediately become outdated.  But there's no correctness problem with
+	 * unnecessarily evicting.  Nor is there a correctness problem with not
+	 * evicting while iput() is racing with the key being removed, since
+	 * then the thread removing the key will either evict the inode itself
+	 * or will correctly detect that it wasn't evicted due to the race.
+	 */
+	return !is_master_key_secret_present(&mk->mk_secret);
+}
+EXPORT_SYMBOL_GPL(fscrypt_drop_inode);
diff --git a/fs/crypto/keysetup_v1.c b/fs/crypto/keysetup_v1.c
new file mode 100644
index 0000000..454fb03
--- /dev/null
+++ b/fs/crypto/keysetup_v1.c
@@ -0,0 +1,336 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Key setup for v1 encryption policies
+ *
+ * Copyright 2015, 2019 Google LLC
+ */
+
+/*
+ * This file implements compatibility functions for the original encryption
+ * policy version ("v1"), including:
+ *
+ * - Deriving per-file keys using the AES-128-ECB based KDF
+ *   (rather than the new method of using HKDF-SHA512)
+ *
+ * - Retrieving fscrypt master keys from process-subscribed keyrings
+ *   (rather than the new method of using a filesystem-level keyring)
+ *
+ * - Handling policies with the DIRECT_KEY flag set using a master key table
+ *   (rather than the new method of implementing DIRECT_KEY with per-mode keys
+ *    managed alongside the master keys in the filesystem-level keyring)
+ */
+
+#include <crypto/algapi.h>
+#include <crypto/skcipher.h>
+#include <keys/user-type.h>
+#include <linux/hashtable.h>
+#include <linux/scatterlist.h>
+
+#include "fscrypt_private.h"
+
+/* Table of keys referenced by DIRECT_KEY policies */
+static DEFINE_HASHTABLE(fscrypt_direct_keys, 6); /* 6 bits = 64 buckets */
+static DEFINE_SPINLOCK(fscrypt_direct_keys_lock);
+
+/*
+ * v1 key derivation function.  This generates the derived key by encrypting the
+ * master key with AES-128-ECB using the nonce as the AES key.  This provides a
+ * unique derived key with sufficient entropy for each inode.  However, it's
+ * nonstandard, non-extensible, doesn't evenly distribute the entropy from the
+ * master key, and is trivially reversible: an attacker who compromises a
+ * derived key can "decrypt" it to get back to the master key, then derive any
+ * other key.  For all new code, use HKDF instead.
+ *
+ * The master key must be at least as long as the derived key.  If the master
+ * key is longer, then only the first 'derived_keysize' bytes are used.
+ */
+static int derive_key_aes(const u8 *master_key,
+			  const u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE],
+			  u8 *derived_key, unsigned int derived_keysize)
+{
+	int res = 0;
+	struct skcipher_request *req = NULL;
+	DECLARE_CRYPTO_WAIT(wait);
+	struct scatterlist src_sg, dst_sg;
+	struct crypto_skcipher *tfm = crypto_alloc_skcipher("ecb(aes)", 0, 0);
+
+	if (IS_ERR(tfm)) {
+		res = PTR_ERR(tfm);
+		tfm = NULL;
+		goto out;
+	}
+	crypto_skcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
+	req = skcipher_request_alloc(tfm, GFP_NOFS);
+	if (!req) {
+		res = -ENOMEM;
+		goto out;
+	}
+	skcipher_request_set_callback(req,
+			CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
+			crypto_req_done, &wait);
+	res = crypto_skcipher_setkey(tfm, nonce, FS_KEY_DERIVATION_NONCE_SIZE);
+	if (res < 0)
+		goto out;
+
+	sg_init_one(&src_sg, master_key, derived_keysize);
+	sg_init_one(&dst_sg, derived_key, derived_keysize);
+	skcipher_request_set_crypt(req, &src_sg, &dst_sg, derived_keysize,
+				   NULL);
+	res = crypto_wait_req(crypto_skcipher_encrypt(req), &wait);
+out:
+	skcipher_request_free(req);
+	crypto_free_skcipher(tfm);
+	return res;
+}
+
+/*
+ * Search the current task's subscribed keyrings for a "logon" key with
+ * description prefix:descriptor, and if found acquire a read lock on it and
+ * return a pointer to its validated payload in *payload_ret.
+ */
+static struct key *
+find_and_lock_process_key(const char *prefix,
+			  const u8 descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE],
+			  unsigned int min_keysize,
+			  const struct fscrypt_key **payload_ret)
+{
+	char *description;
+	struct key *key;
+	const struct user_key_payload *ukp;
+	const struct fscrypt_key *payload;
+
+	description = kasprintf(GFP_NOFS, "%s%*phN", prefix,
+				FSCRYPT_KEY_DESCRIPTOR_SIZE, descriptor);
+	if (!description)
+		return ERR_PTR(-ENOMEM);
+
+	key = request_key(&key_type_logon, description, NULL);
+	kfree(description);
+	if (IS_ERR(key))
+		return key;
+
+	down_read(&key->sem);
+	ukp = user_key_payload_locked(key);
+
+	if (!ukp) /* was the key revoked before we acquired its semaphore? */
+		goto invalid;
+
+	payload = (const struct fscrypt_key *)ukp->data;
+
+	if (ukp->datalen != sizeof(struct fscrypt_key) ||
+	    payload->size < 1 || payload->size > FSCRYPT_MAX_KEY_SIZE) {
+		fscrypt_warn(NULL,
+			     "key with description '%s' has invalid payload",
+			     key->description);
+		goto invalid;
+	}
+
+	if (payload->size < min_keysize) {
+		fscrypt_warn(NULL,
+			     "key with description '%s' is too short (got %u bytes, need %u+ bytes)",
+			     key->description, payload->size, min_keysize);
+		goto invalid;
+	}
+
+	*payload_ret = payload;
+	return key;
+
+invalid:
+	up_read(&key->sem);
+	key_put(key);
+	return ERR_PTR(-ENOKEY);
+}
+
+/* Master key referenced by DIRECT_KEY policy */
+struct fscrypt_direct_key {
+	struct hlist_node		dk_node;
+	refcount_t			dk_refcount;
+	const struct fscrypt_mode	*dk_mode;
+	struct crypto_skcipher		*dk_ctfm;
+	u8				dk_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
+	u8				dk_raw[FSCRYPT_MAX_KEY_SIZE];
+};
+
+static void free_direct_key(struct fscrypt_direct_key *dk)
+{
+	if (dk) {
+		crypto_free_skcipher(dk->dk_ctfm);
+		kzfree(dk);
+	}
+}
+
+void fscrypt_put_direct_key(struct fscrypt_direct_key *dk)
+{
+	if (!refcount_dec_and_lock(&dk->dk_refcount, &fscrypt_direct_keys_lock))
+		return;
+	hash_del(&dk->dk_node);
+	spin_unlock(&fscrypt_direct_keys_lock);
+
+	free_direct_key(dk);
+}
+
+/*
+ * Find/insert the given key into the fscrypt_direct_keys table.  If found, it
+ * is returned with elevated refcount, and 'to_insert' is freed if non-NULL.  If
+ * not found, 'to_insert' is inserted and returned if it's non-NULL; otherwise
+ * NULL is returned.
+ */
+static struct fscrypt_direct_key *
+find_or_insert_direct_key(struct fscrypt_direct_key *to_insert,
+			  const u8 *raw_key, const struct fscrypt_info *ci)
+{
+	unsigned long hash_key;
+	struct fscrypt_direct_key *dk;
+
+	/*
+	 * Careful: to avoid potentially leaking secret key bytes via timing
+	 * information, we must key the hash table by descriptor rather than by
+	 * raw key, and use crypto_memneq() when comparing raw keys.
+	 */
+
+	BUILD_BUG_ON(sizeof(hash_key) > FSCRYPT_KEY_DESCRIPTOR_SIZE);
+	memcpy(&hash_key, ci->ci_policy.v1.master_key_descriptor,
+	       sizeof(hash_key));
+
+	spin_lock(&fscrypt_direct_keys_lock);
+	hash_for_each_possible(fscrypt_direct_keys, dk, dk_node, hash_key) {
+		if (memcmp(ci->ci_policy.v1.master_key_descriptor,
+			   dk->dk_descriptor, FSCRYPT_KEY_DESCRIPTOR_SIZE) != 0)
+			continue;
+		if (ci->ci_mode != dk->dk_mode)
+			continue;
+		if (crypto_memneq(raw_key, dk->dk_raw, ci->ci_mode->keysize))
+			continue;
+		/* using existing tfm with same (descriptor, mode, raw_key) */
+		refcount_inc(&dk->dk_refcount);
+		spin_unlock(&fscrypt_direct_keys_lock);
+		free_direct_key(to_insert);
+		return dk;
+	}
+	if (to_insert)
+		hash_add(fscrypt_direct_keys, &to_insert->dk_node, hash_key);
+	spin_unlock(&fscrypt_direct_keys_lock);
+	return to_insert;
+}
+
+/* Prepare to encrypt directly using the master key in the given mode */
+static struct fscrypt_direct_key *
+fscrypt_get_direct_key(const struct fscrypt_info *ci, const u8 *raw_key)
+{
+	struct fscrypt_direct_key *dk;
+	int err;
+
+	/* Is there already a tfm for this key? */
+	dk = find_or_insert_direct_key(NULL, raw_key, ci);
+	if (dk)
+		return dk;
+
+	/* Nope, allocate one. */
+	dk = kzalloc(sizeof(*dk), GFP_NOFS);
+	if (!dk)
+		return ERR_PTR(-ENOMEM);
+	refcount_set(&dk->dk_refcount, 1);
+	dk->dk_mode = ci->ci_mode;
+	dk->dk_ctfm = fscrypt_allocate_skcipher(ci->ci_mode, raw_key,
+						ci->ci_inode);
+	if (IS_ERR(dk->dk_ctfm)) {
+		err = PTR_ERR(dk->dk_ctfm);
+		dk->dk_ctfm = NULL;
+		goto err_free_dk;
+	}
+	memcpy(dk->dk_descriptor, ci->ci_policy.v1.master_key_descriptor,
+	       FSCRYPT_KEY_DESCRIPTOR_SIZE);
+	memcpy(dk->dk_raw, raw_key, ci->ci_mode->keysize);
+
+	return find_or_insert_direct_key(dk, raw_key, ci);
+
+err_free_dk:
+	free_direct_key(dk);
+	return ERR_PTR(err);
+}
+
+/* v1 policy, DIRECT_KEY: use the master key directly */
+static int setup_v1_file_key_direct(struct fscrypt_info *ci,
+				    const u8 *raw_master_key)
+{
+	const struct fscrypt_mode *mode = ci->ci_mode;
+	struct fscrypt_direct_key *dk;
+
+	if (!fscrypt_mode_supports_direct_key(mode)) {
+		fscrypt_warn(ci->ci_inode,
+			     "Direct key mode not allowed with %s",
+			     mode->friendly_name);
+		return -EINVAL;
+	}
+
+	if (ci->ci_policy.v1.contents_encryption_mode !=
+	    ci->ci_policy.v1.filenames_encryption_mode) {
+		fscrypt_warn(ci->ci_inode,
+			     "Direct key mode not allowed with different contents and filenames modes");
+		return -EINVAL;
+	}
+
+	dk = fscrypt_get_direct_key(ci, raw_master_key);
+	if (IS_ERR(dk))
+		return PTR_ERR(dk);
+	ci->ci_direct_key = dk;
+	ci->ci_ctfm = dk->dk_ctfm;
+	return 0;
+}
+
+/* v1 policy, !DIRECT_KEY: derive the file's encryption key */
+static int setup_v1_file_key_derived(struct fscrypt_info *ci,
+				     const u8 *raw_master_key)
+{
+	u8 *derived_key;
+	int err;
+
+	/*
+	 * This cannot be a stack buffer because it will be passed to the
+	 * scatterlist crypto API during derive_key_aes().
+	 */
+	derived_key = kmalloc(ci->ci_mode->keysize, GFP_NOFS);
+	if (!derived_key)
+		return -ENOMEM;
+
+	err = derive_key_aes(raw_master_key, ci->ci_nonce,
+			     derived_key, ci->ci_mode->keysize);
+	if (err)
+		goto out;
+
+	err = fscrypt_set_derived_key(ci, derived_key);
+out:
+	kzfree(derived_key);
+	return err;
+}
+
+int fscrypt_setup_v1_file_key(struct fscrypt_info *ci, const u8 *raw_master_key)
+{
+	if (ci->ci_policy.v1.flags & FSCRYPT_POLICY_FLAG_DIRECT_KEY)
+		return setup_v1_file_key_direct(ci, raw_master_key);
+	else
+		return setup_v1_file_key_derived(ci, raw_master_key);
+}
+
+int fscrypt_setup_v1_file_key_via_subscribed_keyrings(struct fscrypt_info *ci)
+{
+	struct key *key;
+	const struct fscrypt_key *payload;
+	int err;
+
+	key = find_and_lock_process_key(FSCRYPT_KEY_DESC_PREFIX,
+					ci->ci_policy.v1.master_key_descriptor,
+					ci->ci_mode->keysize, &payload);
+	if (key == ERR_PTR(-ENOKEY) && ci->ci_inode->i_sb->s_cop->key_prefix) {
+		key = find_and_lock_process_key(ci->ci_inode->i_sb->s_cop->key_prefix,
+						ci->ci_policy.v1.master_key_descriptor,
+						ci->ci_mode->keysize, &payload);
+	}
+	if (IS_ERR(key))
+		return PTR_ERR(key);
+
+	err = fscrypt_setup_v1_file_key(ci, payload->raw);
+	up_read(&key->sem);
+	key_put(key);
+	return err;
+}
diff --git a/fs/crypto/policy.c b/fs/crypto/policy.c
index 4288839..96f5280 100644
--- a/fs/crypto/policy.c
+++ b/fs/crypto/policy.c
@@ -5,8 +5,9 @@
  * Copyright (C) 2015, Google, Inc.
  * Copyright (C) 2015, Motorola Mobility.
  *
- * Written by Michael Halcrow, 2015.
+ * Originally written by Michael Halcrow, 2015.
  * Modified by Jaegeuk Kim, 2015.
+ * Modified by Eric Biggers, 2019 for v2 policy support.
  */
 
 #include <linux/random.h>
@@ -14,70 +15,342 @@
 #include <linux/mount.h>
 #include "fscrypt_private.h"
 
-/*
- * check whether an encryption policy is consistent with an encryption context
+/**
+ * fscrypt_policies_equal - check whether two encryption policies are the same
+ *
+ * Return: %true if equal, else %false
  */
-static bool is_encryption_context_consistent_with_policy(
-				const struct fscrypt_context *ctx,
-				const struct fscrypt_policy *policy)
+bool fscrypt_policies_equal(const union fscrypt_policy *policy1,
+			    const union fscrypt_policy *policy2)
 {
-	return memcmp(ctx->master_key_descriptor, policy->master_key_descriptor,
-		      FS_KEY_DESCRIPTOR_SIZE) == 0 &&
-		(ctx->flags == policy->flags) &&
-		(ctx->contents_encryption_mode ==
-		 policy->contents_encryption_mode) &&
-		(ctx->filenames_encryption_mode ==
-		 policy->filenames_encryption_mode);
+	if (policy1->version != policy2->version)
+		return false;
+
+	return !memcmp(policy1, policy2, fscrypt_policy_size(policy1));
 }
 
-static int create_encryption_context_from_policy(struct inode *inode,
-				const struct fscrypt_policy *policy)
+static bool supported_iv_ino_lblk_64_policy(
+					const struct fscrypt_policy_v2 *policy,
+					const struct inode *inode)
 {
-	struct fscrypt_context ctx;
+	struct super_block *sb = inode->i_sb;
+	int ino_bits = 64, lblk_bits = 64;
 
-	ctx.format = FS_ENCRYPTION_CONTEXT_FORMAT_V1;
-	memcpy(ctx.master_key_descriptor, policy->master_key_descriptor,
-					FS_KEY_DESCRIPTOR_SIZE);
+	if (policy->flags & FSCRYPT_POLICY_FLAG_DIRECT_KEY) {
+		fscrypt_warn(inode,
+			     "The DIRECT_KEY and IV_INO_LBLK_64 flags are mutually exclusive");
+		return false;
+	}
+	/*
+	 * It's unsafe to include inode numbers in the IVs if the filesystem can
+	 * potentially renumber inodes, e.g. via filesystem shrinking.
+	 */
+	if (!sb->s_cop->has_stable_inodes ||
+	    !sb->s_cop->has_stable_inodes(sb)) {
+		fscrypt_warn(inode,
+			     "Can't use IV_INO_LBLK_64 policy on filesystem '%s' because it doesn't have stable inode numbers",
+			     sb->s_id);
+		return false;
+	}
+	if (sb->s_cop->get_ino_and_lblk_bits)
+		sb->s_cop->get_ino_and_lblk_bits(sb, &ino_bits, &lblk_bits);
+	if (ino_bits > 32 || lblk_bits > 32) {
+		fscrypt_warn(inode,
+			     "Can't use IV_INO_LBLK_64 policy on filesystem '%s' because it doesn't use 32-bit inode and block numbers",
+			     sb->s_id);
+		return false;
+	}
+	return true;
+}
 
-	if (!fscrypt_valid_enc_modes(policy->contents_encryption_mode,
-				     policy->filenames_encryption_mode))
+/**
+ * fscrypt_supported_policy - check whether an encryption policy is supported
+ *
+ * Given an encryption policy, check whether all its encryption modes and other
+ * settings are supported by this kernel.  (But we don't currently don't check
+ * for crypto API support here, so attempting to use an algorithm not configured
+ * into the crypto API will still fail later.)
+ *
+ * Return: %true if supported, else %false
+ */
+bool fscrypt_supported_policy(const union fscrypt_policy *policy_u,
+			      const struct inode *inode)
+{
+	switch (policy_u->version) {
+	case FSCRYPT_POLICY_V1: {
+		const struct fscrypt_policy_v1 *policy = &policy_u->v1;
+
+		if (!fscrypt_valid_enc_modes(policy->contents_encryption_mode,
+					     policy->filenames_encryption_mode)) {
+			fscrypt_warn(inode,
+				     "Unsupported encryption modes (contents %d, filenames %d)",
+				     policy->contents_encryption_mode,
+				     policy->filenames_encryption_mode);
+			return false;
+		}
+
+		if (policy->flags & ~(FSCRYPT_POLICY_FLAGS_PAD_MASK |
+				      FSCRYPT_POLICY_FLAG_DIRECT_KEY)) {
+			fscrypt_warn(inode,
+				     "Unsupported encryption flags (0x%02x)",
+				     policy->flags);
+			return false;
+		}
+
+		return true;
+	}
+	case FSCRYPT_POLICY_V2: {
+		const struct fscrypt_policy_v2 *policy = &policy_u->v2;
+
+		if (!fscrypt_valid_enc_modes(policy->contents_encryption_mode,
+					     policy->filenames_encryption_mode)) {
+			fscrypt_warn(inode,
+				     "Unsupported encryption modes (contents %d, filenames %d)",
+				     policy->contents_encryption_mode,
+				     policy->filenames_encryption_mode);
+			return false;
+		}
+
+		if (policy->flags & ~FSCRYPT_POLICY_FLAGS_VALID) {
+			fscrypt_warn(inode,
+				     "Unsupported encryption flags (0x%02x)",
+				     policy->flags);
+			return false;
+		}
+
+		if ((policy->flags & FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64) &&
+		    !supported_iv_ino_lblk_64_policy(policy, inode))
+			return false;
+
+		if (memchr_inv(policy->__reserved, 0,
+			       sizeof(policy->__reserved))) {
+			fscrypt_warn(inode,
+				     "Reserved bits set in encryption policy");
+			return false;
+		}
+
+		return true;
+	}
+	}
+	return false;
+}
+
+/**
+ * fscrypt_new_context_from_policy - create a new fscrypt_context from a policy
+ *
+ * Create an fscrypt_context for an inode that is being assigned the given
+ * encryption policy.  A new nonce is randomly generated.
+ *
+ * Return: the size of the new context in bytes.
+ */
+static int fscrypt_new_context_from_policy(union fscrypt_context *ctx_u,
+					   const union fscrypt_policy *policy_u)
+{
+	memset(ctx_u, 0, sizeof(*ctx_u));
+
+	switch (policy_u->version) {
+	case FSCRYPT_POLICY_V1: {
+		const struct fscrypt_policy_v1 *policy = &policy_u->v1;
+		struct fscrypt_context_v1 *ctx = &ctx_u->v1;
+
+		ctx->version = FSCRYPT_CONTEXT_V1;
+		ctx->contents_encryption_mode =
+			policy->contents_encryption_mode;
+		ctx->filenames_encryption_mode =
+			policy->filenames_encryption_mode;
+		ctx->flags = policy->flags;
+		memcpy(ctx->master_key_descriptor,
+		       policy->master_key_descriptor,
+		       sizeof(ctx->master_key_descriptor));
+		get_random_bytes(ctx->nonce, sizeof(ctx->nonce));
+		return sizeof(*ctx);
+	}
+	case FSCRYPT_POLICY_V2: {
+		const struct fscrypt_policy_v2 *policy = &policy_u->v2;
+		struct fscrypt_context_v2 *ctx = &ctx_u->v2;
+
+		ctx->version = FSCRYPT_CONTEXT_V2;
+		ctx->contents_encryption_mode =
+			policy->contents_encryption_mode;
+		ctx->filenames_encryption_mode =
+			policy->filenames_encryption_mode;
+		ctx->flags = policy->flags;
+		memcpy(ctx->master_key_identifier,
+		       policy->master_key_identifier,
+		       sizeof(ctx->master_key_identifier));
+		get_random_bytes(ctx->nonce, sizeof(ctx->nonce));
+		return sizeof(*ctx);
+	}
+	}
+	BUG();
+}
+
+/**
+ * fscrypt_policy_from_context - convert an fscrypt_context to an fscrypt_policy
+ *
+ * Given an fscrypt_context, build the corresponding fscrypt_policy.
+ *
+ * Return: 0 on success, or -EINVAL if the fscrypt_context has an unrecognized
+ * version number or size.
+ *
+ * This does *not* validate the settings within the policy itself, e.g. the
+ * modes, flags, and reserved bits.  Use fscrypt_supported_policy() for that.
+ */
+int fscrypt_policy_from_context(union fscrypt_policy *policy_u,
+				const union fscrypt_context *ctx_u,
+				int ctx_size)
+{
+	memset(policy_u, 0, sizeof(*policy_u));
+
+	if (ctx_size <= 0 || ctx_size != fscrypt_context_size(ctx_u))
 		return -EINVAL;
 
-	if (policy->flags & ~FS_POLICY_FLAGS_VALID)
+	switch (ctx_u->version) {
+	case FSCRYPT_CONTEXT_V1: {
+		const struct fscrypt_context_v1 *ctx = &ctx_u->v1;
+		struct fscrypt_policy_v1 *policy = &policy_u->v1;
+
+		policy->version = FSCRYPT_POLICY_V1;
+		policy->contents_encryption_mode =
+			ctx->contents_encryption_mode;
+		policy->filenames_encryption_mode =
+			ctx->filenames_encryption_mode;
+		policy->flags = ctx->flags;
+		memcpy(policy->master_key_descriptor,
+		       ctx->master_key_descriptor,
+		       sizeof(policy->master_key_descriptor));
+		return 0;
+	}
+	case FSCRYPT_CONTEXT_V2: {
+		const struct fscrypt_context_v2 *ctx = &ctx_u->v2;
+		struct fscrypt_policy_v2 *policy = &policy_u->v2;
+
+		policy->version = FSCRYPT_POLICY_V2;
+		policy->contents_encryption_mode =
+			ctx->contents_encryption_mode;
+		policy->filenames_encryption_mode =
+			ctx->filenames_encryption_mode;
+		policy->flags = ctx->flags;
+		memcpy(policy->__reserved, ctx->__reserved,
+		       sizeof(policy->__reserved));
+		memcpy(policy->master_key_identifier,
+		       ctx->master_key_identifier,
+		       sizeof(policy->master_key_identifier));
+		return 0;
+	}
+	}
+	/* unreachable */
+	return -EINVAL;
+}
+
+/* Retrieve an inode's encryption policy */
+static int fscrypt_get_policy(struct inode *inode, union fscrypt_policy *policy)
+{
+	const struct fscrypt_info *ci;
+	union fscrypt_context ctx;
+	int ret;
+
+	ci = READ_ONCE(inode->i_crypt_info);
+	if (ci) {
+		/* key available, use the cached policy */
+		*policy = ci->ci_policy;
+		return 0;
+	}
+
+	if (!IS_ENCRYPTED(inode))
+		return -ENODATA;
+
+	ret = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx));
+	if (ret < 0)
+		return (ret == -ERANGE) ? -EINVAL : ret;
+
+	return fscrypt_policy_from_context(policy, &ctx, ret);
+}
+
+static int set_encryption_policy(struct inode *inode,
+				 const union fscrypt_policy *policy)
+{
+	union fscrypt_context ctx;
+	int ctxsize;
+	int err;
+
+	if (!fscrypt_supported_policy(policy, inode))
 		return -EINVAL;
 
-	ctx.contents_encryption_mode = policy->contents_encryption_mode;
-	ctx.filenames_encryption_mode = policy->filenames_encryption_mode;
-	ctx.flags = policy->flags;
-	BUILD_BUG_ON(sizeof(ctx.nonce) != FS_KEY_DERIVATION_NONCE_SIZE);
-	get_random_bytes(ctx.nonce, FS_KEY_DERIVATION_NONCE_SIZE);
+	switch (policy->version) {
+	case FSCRYPT_POLICY_V1:
+		/*
+		 * The original encryption policy version provided no way of
+		 * verifying that the correct master key was supplied, which was
+		 * insecure in scenarios where multiple users have access to the
+		 * same encrypted files (even just read-only access).  The new
+		 * encryption policy version fixes this and also implies use of
+		 * an improved key derivation function and allows non-root users
+		 * to securely remove keys.  So as long as compatibility with
+		 * old kernels isn't required, it is recommended to use the new
+		 * policy version for all new encrypted directories.
+		 */
+		pr_warn_once("%s (pid %d) is setting deprecated v1 encryption policy; recommend upgrading to v2.\n",
+			     current->comm, current->pid);
+		break;
+	case FSCRYPT_POLICY_V2:
+		err = fscrypt_verify_key_added(inode->i_sb,
+					       policy->v2.master_key_identifier);
+		if (err)
+			return err;
+		break;
+	default:
+		WARN_ON(1);
+		return -EINVAL;
+	}
 
-	return inode->i_sb->s_cop->set_context(inode, &ctx, sizeof(ctx), NULL);
+	ctxsize = fscrypt_new_context_from_policy(&ctx, policy);
+
+	return inode->i_sb->s_cop->set_context(inode, &ctx, ctxsize, NULL);
 }
 
 int fscrypt_ioctl_set_policy(struct file *filp, const void __user *arg)
 {
-	struct fscrypt_policy policy;
+	union fscrypt_policy policy;
+	union fscrypt_policy existing_policy;
 	struct inode *inode = file_inode(filp);
+	u8 version;
+	int size;
 	int ret;
-	struct fscrypt_context ctx;
 
-	if (copy_from_user(&policy, arg, sizeof(policy)))
+	if (get_user(policy.version, (const u8 __user *)arg))
 		return -EFAULT;
 
+	size = fscrypt_policy_size(&policy);
+	if (size <= 0)
+		return -EINVAL;
+
+	/*
+	 * We should just copy the remaining 'size - 1' bytes here, but a
+	 * bizarre bug in gcc 7 and earlier (fixed by gcc r255731) causes gcc to
+	 * think that size can be 0 here (despite the check above!) *and* that
+	 * it's a compile-time constant.  Thus it would think copy_from_user()
+	 * is passed compile-time constant ULONG_MAX, causing the compile-time
+	 * buffer overflow check to fail, breaking the build. This only occurred
+	 * when building an i386 kernel with -Os and branch profiling enabled.
+	 *
+	 * Work around it by just copying the first byte again...
+	 */
+	version = policy.version;
+	if (copy_from_user(&policy, arg, size))
+		return -EFAULT;
+	policy.version = version;
+
 	if (!inode_owner_or_capable(inode))
 		return -EACCES;
 
-	if (policy.version != 0)
-		return -EINVAL;
-
 	ret = mnt_want_write_file(filp);
 	if (ret)
 		return ret;
 
 	inode_lock(inode);
 
-	ret = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx));
+	ret = fscrypt_get_policy(inode, &existing_policy);
 	if (ret == -ENODATA) {
 		if (!S_ISDIR(inode->i_mode))
 			ret = -ENOTDIR;
@@ -86,14 +359,10 @@
 		else if (!inode->i_sb->s_cop->empty_dir(inode))
 			ret = -ENOTEMPTY;
 		else
-			ret = create_encryption_context_from_policy(inode,
-								    &policy);
-	} else if (ret == sizeof(ctx) &&
-		   is_encryption_context_consistent_with_policy(&ctx,
-								&policy)) {
-		/* The file already uses the same encryption policy. */
-		ret = 0;
-	} else if (ret >= 0 || ret == -ERANGE) {
+			ret = set_encryption_policy(inode, &policy);
+	} else if (ret == -EINVAL ||
+		   (ret == 0 && !fscrypt_policies_equal(&policy,
+							&existing_policy))) {
 		/* The file already uses a different encryption policy. */
 		ret = -EEXIST;
 	}
@@ -105,37 +374,57 @@
 }
 EXPORT_SYMBOL(fscrypt_ioctl_set_policy);
 
+/* Original ioctl version; can only get the original policy version */
 int fscrypt_ioctl_get_policy(struct file *filp, void __user *arg)
 {
-	struct inode *inode = file_inode(filp);
-	struct fscrypt_context ctx;
-	struct fscrypt_policy policy;
-	int res;
+	union fscrypt_policy policy;
+	int err;
 
-	if (!IS_ENCRYPTED(inode))
-		return -ENODATA;
+	err = fscrypt_get_policy(file_inode(filp), &policy);
+	if (err)
+		return err;
 
-	res = inode->i_sb->s_cop->get_context(inode, &ctx, sizeof(ctx));
-	if (res < 0 && res != -ERANGE)
-		return res;
-	if (res != sizeof(ctx))
-		return -EINVAL;
-	if (ctx.format != FS_ENCRYPTION_CONTEXT_FORMAT_V1)
+	if (policy.version != FSCRYPT_POLICY_V1)
 		return -EINVAL;
 
-	policy.version = 0;
-	policy.contents_encryption_mode = ctx.contents_encryption_mode;
-	policy.filenames_encryption_mode = ctx.filenames_encryption_mode;
-	policy.flags = ctx.flags;
-	memcpy(policy.master_key_descriptor, ctx.master_key_descriptor,
-				FS_KEY_DESCRIPTOR_SIZE);
-
-	if (copy_to_user(arg, &policy, sizeof(policy)))
+	if (copy_to_user(arg, &policy, sizeof(policy.v1)))
 		return -EFAULT;
 	return 0;
 }
 EXPORT_SYMBOL(fscrypt_ioctl_get_policy);
 
+/* Extended ioctl version; can get policies of any version */
+int fscrypt_ioctl_get_policy_ex(struct file *filp, void __user *uarg)
+{
+	struct fscrypt_get_policy_ex_arg arg;
+	union fscrypt_policy *policy = (union fscrypt_policy *)&arg.policy;
+	size_t policy_size;
+	int err;
+
+	/* arg is policy_size, then policy */
+	BUILD_BUG_ON(offsetof(typeof(arg), policy_size) != 0);
+	BUILD_BUG_ON(offsetofend(typeof(arg), policy_size) !=
+		     offsetof(typeof(arg), policy));
+	BUILD_BUG_ON(sizeof(arg.policy) != sizeof(*policy));
+
+	err = fscrypt_get_policy(file_inode(filp), policy);
+	if (err)
+		return err;
+	policy_size = fscrypt_policy_size(policy);
+
+	if (copy_from_user(&arg, uarg, sizeof(arg.policy_size)))
+		return -EFAULT;
+
+	if (policy_size > arg.policy_size)
+		return -EOVERFLOW;
+	arg.policy_size = policy_size;
+
+	if (copy_to_user(uarg, &arg, sizeof(arg.policy_size) + policy_size))
+		return -EFAULT;
+	return 0;
+}
+EXPORT_SYMBOL_GPL(fscrypt_ioctl_get_policy_ex);
+
 /**
  * fscrypt_has_permitted_context() - is a file's encryption policy permitted
  *				     within its directory?
@@ -153,15 +442,12 @@
  * malicious offline violations of this constraint, while the link and rename
  * checks are needed to prevent online violations of this constraint.
  *
- * Return: 1 if permitted, 0 if forbidden.  If forbidden, the caller must fail
- * the filesystem operation with EPERM.
+ * Return: 1 if permitted, 0 if forbidden.
  */
 int fscrypt_has_permitted_context(struct inode *parent, struct inode *child)
 {
-	const struct fscrypt_operations *cops = parent->i_sb->s_cop;
-	const struct fscrypt_info *parent_ci, *child_ci;
-	struct fscrypt_context parent_ctx, child_ctx;
-	int res;
+	union fscrypt_policy parent_policy, child_policy;
+	int err;
 
 	/* No restrictions on file types which are never encrypted */
 	if (!S_ISREG(child->i_mode) && !S_ISDIR(child->i_mode) &&
@@ -191,40 +477,22 @@
 	 * In any case, if an unexpected error occurs, fall back to "forbidden".
 	 */
 
-	res = fscrypt_get_encryption_info(parent);
-	if (res)
+	err = fscrypt_get_encryption_info(parent);
+	if (err)
 		return 0;
-	res = fscrypt_get_encryption_info(child);
-	if (res)
-		return 0;
-	parent_ci = parent->i_crypt_info;
-	child_ci = child->i_crypt_info;
-
-	if (parent_ci && child_ci) {
-		return memcmp(parent_ci->ci_master_key, child_ci->ci_master_key,
-			      FS_KEY_DESCRIPTOR_SIZE) == 0 &&
-			(parent_ci->ci_data_mode == child_ci->ci_data_mode) &&
-			(parent_ci->ci_filename_mode ==
-			 child_ci->ci_filename_mode) &&
-			(parent_ci->ci_flags == child_ci->ci_flags);
-	}
-
-	res = cops->get_context(parent, &parent_ctx, sizeof(parent_ctx));
-	if (res != sizeof(parent_ctx))
+	err = fscrypt_get_encryption_info(child);
+	if (err)
 		return 0;
 
-	res = cops->get_context(child, &child_ctx, sizeof(child_ctx));
-	if (res != sizeof(child_ctx))
+	err = fscrypt_get_policy(parent, &parent_policy);
+	if (err)
 		return 0;
 
-	return memcmp(parent_ctx.master_key_descriptor,
-		      child_ctx.master_key_descriptor,
-		      FS_KEY_DESCRIPTOR_SIZE) == 0 &&
-		(parent_ctx.contents_encryption_mode ==
-		 child_ctx.contents_encryption_mode) &&
-		(parent_ctx.filenames_encryption_mode ==
-		 child_ctx.filenames_encryption_mode) &&
-		(parent_ctx.flags == child_ctx.flags);
+	err = fscrypt_get_policy(child, &child_policy);
+	if (err)
+		return 0;
+
+	return fscrypt_policies_equal(&parent_policy, &child_policy);
 }
 EXPORT_SYMBOL(fscrypt_has_permitted_context);
 
@@ -240,7 +508,8 @@
 int fscrypt_inherit_context(struct inode *parent, struct inode *child,
 						void *fs_data, bool preload)
 {
-	struct fscrypt_context ctx;
+	union fscrypt_context ctx;
+	int ctxsize;
 	struct fscrypt_info *ci;
 	int res;
 
@@ -248,20 +517,14 @@
 	if (res < 0)
 		return res;
 
-	ci = parent->i_crypt_info;
+	ci = READ_ONCE(parent->i_crypt_info);
 	if (ci == NULL)
 		return -ENOKEY;
 
-	ctx.format = FS_ENCRYPTION_CONTEXT_FORMAT_V1;
-	ctx.contents_encryption_mode = ci->ci_data_mode;
-	ctx.filenames_encryption_mode = ci->ci_filename_mode;
-	ctx.flags = ci->ci_flags;
-	memcpy(ctx.master_key_descriptor, ci->ci_master_key,
-	       FS_KEY_DESCRIPTOR_SIZE);
-	get_random_bytes(ctx.nonce, FS_KEY_DERIVATION_NONCE_SIZE);
+	ctxsize = fscrypt_new_context_from_policy(&ctx, &ci->ci_policy);
+
 	BUILD_BUG_ON(sizeof(ctx) != FSCRYPT_SET_CONTEXT_MAX_SIZE);
-	res = parent->i_sb->s_cop->set_context(child, &ctx,
-						sizeof(ctx), fs_data);
+	res = parent->i_sb->s_cop->set_context(child, &ctx, ctxsize, fs_data);
 	if (res)
 		return res;
 	return preload ? fscrypt_get_encryption_info(child): 0;
diff --git a/fs/dcache.c b/fs/dcache.c
index 6e00223..34f3b2c 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -18,6 +18,7 @@
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/fs.h>
+#include <linux/fscrypt.h>
 #include <linux/fsnotify.h>
 #include <linux/slab.h>
 #include <linux/init.h>
@@ -257,24 +258,10 @@
 	kmem_cache_free(dentry_cache, dentry); 
 }
 
-static void __d_free_external_name(struct rcu_head *head)
-{
-	struct external_name *name = container_of(head, struct external_name,
-						  u.head);
-
-	mod_node_page_state(page_pgdat(virt_to_page(name)),
-			    NR_INDIRECTLY_RECLAIMABLE_BYTES,
-			    -ksize(name));
-
-	kfree(name);
-}
-
 static void __d_free_external(struct rcu_head *head)
 {
 	struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
-
-	__d_free_external_name(&external_name(dentry)->u.head);
-
+	kfree(external_name(dentry));
 	kmem_cache_free(dentry_cache, dentry);
 }
 
@@ -306,7 +293,7 @@
 		struct external_name *p;
 		p = container_of(name->name, struct external_name, name[0]);
 		if (unlikely(atomic_dec_and_test(&p->u.count)))
-			call_rcu(&p->u.head, __d_free_external_name);
+			kfree_rcu(p, u.head);
 	}
 }
 EXPORT_SYMBOL(release_dentry_name_snapshot);
@@ -1602,7 +1589,6 @@
  
 struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
 {
-	struct external_name *ext = NULL;
 	struct dentry *dentry;
 	char *dname;
 	int err;
@@ -1623,14 +1609,15 @@
 		dname = dentry->d_iname;
 	} else if (name->len > DNAME_INLINE_LEN-1) {
 		size_t size = offsetof(struct external_name, name[1]);
-
-		ext = kmalloc(size + name->len, GFP_KERNEL_ACCOUNT);
-		if (!ext) {
+		struct external_name *p = kmalloc(size + name->len,
+						  GFP_KERNEL_ACCOUNT |
+						  __GFP_RECLAIMABLE);
+		if (!p) {
 			kmem_cache_free(dentry_cache, dentry); 
 			return NULL;
 		}
-		atomic_set(&ext->u.count, 1);
-		dname = ext->name;
+		atomic_set(&p->u.count, 1);
+		dname = p->name;
 	} else  {
 		dname = dentry->d_iname;
 	}	
@@ -1669,12 +1656,6 @@
 		}
 	}
 
-	if (unlikely(ext)) {
-		pg_data_t *pgdat = page_pgdat(virt_to_page(ext));
-		mod_node_page_state(pgdat, NR_INDIRECTLY_RECLAIMABLE_BYTES,
-				    ksize(ext));
-	}
-
 	this_cpu_inc(nr_dentry);
 
 	return dentry;
@@ -2707,7 +2688,7 @@
 		dentry->d_name.hash_len = target->d_name.hash_len;
 	}
 	if (old_name && likely(atomic_dec_and_test(&old_name->u.count)))
-		call_rcu(&old_name->u.head, __d_free_external_name);
+		kfree_rcu(old_name, u.head);
 }
 
 /*
@@ -2785,6 +2766,7 @@
 	list_move(&dentry->d_child, &dentry->d_parent->d_subdirs);
 	__d_rehash(dentry);
 	fsnotify_update_flags(dentry);
+	fscrypt_handle_d_move(dentry);
 
 	write_seqcount_end(&target->d_seq);
 	write_seqcount_end(&dentry->d_seq);
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 58f48ea..4760c2b 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -34,6 +34,7 @@
 #include <linux/mutex.h>
 #include <linux/anon_inodes.h>
 #include <linux/device.h>
+#include <linux/freezer.h>
 #include <linux/uaccess.h>
 #include <asm/io.h>
 #include <asm/mman.h>
@@ -1382,13 +1383,13 @@
 	struct wakeup_source *ws;
 
 	if (!epi->ep->ws) {
-		epi->ep->ws = wakeup_source_register("eventpoll");
+		epi->ep->ws = wakeup_source_register(NULL, "eventpoll");
 		if (!epi->ep->ws)
 			return -ENOMEM;
 	}
 
 	name = epi->ffd.file->f_path.dentry->d_name.name;
-	ws = wakeup_source_register(name);
+	ws = wakeup_source_register(NULL, name);
 
 	if (!ws)
 		return -ENOMEM;
@@ -1816,7 +1817,8 @@
 			}
 
 			spin_unlock_irq(&ep->wq.lock);
-			if (!schedule_hrtimeout_range(to, slack, HRTIMER_MODE_ABS))
+			if (!freezable_schedule_hrtimeout_range(to, slack,
+								HRTIMER_MODE_ABS))
 				timed_out = 1;
 
 			spin_lock_irq(&ep->wq.lock);
diff --git a/fs/exec.c b/fs/exec.c
index 561ea64..aa9d20c 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1308,7 +1308,7 @@
 void would_dump(struct linux_binprm *bprm, struct file *file)
 {
 	struct inode *inode = file_inode(file);
-	if (inode_permission(inode, MAY_READ) < 0) {
+	if (inode_permission2(file->f_path.mnt, inode, MAY_READ) < 0) {
 		struct user_namespace *old, *user_ns;
 		bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP;
 
diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig
index a453cc8..037358b 100644
--- a/fs/ext4/Kconfig
+++ b/fs/ext4/Kconfig
@@ -101,10 +101,9 @@
 	depends on EXT4_FS
 	select FS_ENCRYPTION
 	help
-	  Enable encryption of ext4 files and directories.  This
-	  feature is similar to ecryptfs, but it is more memory
-	  efficient since it avoids caching the encrypted and
-	  decrypted pages in the page cache.
+	  This kconfig symbol is deprecated; now it just selects
+	  FS_ENCRYPTION.  Use CONFIG_FS_ENCRYPTION=y in new config
+	  files
 
 config EXT4_FS_ENCRYPTION
 	bool
diff --git a/fs/ext4/Makefile b/fs/ext4/Makefile
index 8fdfcd3..b17ddc2 100644
--- a/fs/ext4/Makefile
+++ b/fs/ext4/Makefile
@@ -13,3 +13,4 @@
 
 ext4-$(CONFIG_EXT4_FS_POSIX_ACL)	+= acl.o
 ext4-$(CONFIG_EXT4_FS_SECURITY)		+= xattr_security.o
+ext4-$(CONFIG_FS_VERITY)		+= verity.o
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c
index d947c5e..2770af6 100644
--- a/fs/ext4/dir.c
+++ b/fs/ext4/dir.c
@@ -26,6 +26,7 @@
 #include <linux/buffer_head.h>
 #include <linux/slab.h>
 #include <linux/iversion.h>
+#include <linux/unicode.h>
 #include "ext4.h"
 #include "xattr.h"
 
@@ -115,7 +116,7 @@
 	struct buffer_head *bh = NULL;
 	struct fscrypt_str fstr = FSTR_INIT(NULL, 0);
 
-	if (ext4_encrypted_inode(inode)) {
+	if (IS_ENCRYPTED(inode)) {
 		err = fscrypt_get_encryption_info(inode);
 		if (err && err != -ENOKEY)
 			return err;
@@ -142,7 +143,7 @@
 			return err;
 	}
 
-	if (ext4_encrypted_inode(inode)) {
+	if (IS_ENCRYPTED(inode)) {
 		err = fscrypt_fname_alloc_buffer(inode, EXT4_NAME_LEN, &fstr);
 		if (err < 0)
 			return err;
@@ -249,7 +250,7 @@
 			offset += ext4_rec_len_from_disk(de->rec_len,
 					sb->s_blocksize);
 			if (le32_to_cpu(de->inode)) {
-				if (!ext4_encrypted_inode(inode)) {
+				if (!IS_ENCRYPTED(inode)) {
 					if (!dir_emit(ctx, de->name,
 					    de->name_len,
 					    le32_to_cpu(de->inode),
@@ -287,9 +288,7 @@
 done:
 	err = 0;
 errout:
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
 	fscrypt_fname_free_buffer(&fstr);
-#endif
 	brelse(bh);
 	return err;
 }
@@ -617,7 +616,7 @@
 
 static int ext4_dir_open(struct inode * inode, struct file * filp)
 {
-	if (ext4_encrypted_inode(inode))
+	if (IS_ENCRYPTED(inode))
 		return fscrypt_get_encryption_info(inode) ? -EACCES : 0;
 	return 0;
 }
@@ -666,3 +665,51 @@
 	.open		= ext4_dir_open,
 	.release	= ext4_release_dir,
 };
+
+#ifdef CONFIG_UNICODE
+static int ext4_d_compare(const struct dentry *dentry, unsigned int len,
+			  const char *str, const struct qstr *name)
+{
+	struct qstr qstr = {.name = str, .len = len };
+	struct inode *inode = dentry->d_parent->d_inode;
+
+	if (!IS_CASEFOLDED(inode) || !EXT4_SB(inode->i_sb)->s_encoding) {
+		if (len != name->len)
+			return -1;
+		return memcmp(str, name->name, len);
+	}
+
+	return ext4_ci_compare(inode, name, &qstr, false);
+}
+
+static int ext4_d_hash(const struct dentry *dentry, struct qstr *str)
+{
+	const struct ext4_sb_info *sbi = EXT4_SB(dentry->d_sb);
+	const struct unicode_map *um = sbi->s_encoding;
+	unsigned char *norm;
+	int len, ret = 0;
+
+	if (!IS_CASEFOLDED(dentry->d_inode) || !um)
+		return 0;
+
+	norm = kmalloc(PATH_MAX, GFP_ATOMIC);
+	if (!norm)
+		return -ENOMEM;
+
+	len = utf8_casefold(um, str, norm, PATH_MAX);
+	if (len < 0) {
+		if (ext4_has_strict_mode(sbi))
+			ret = -EINVAL;
+		goto out;
+	}
+	str->hash = full_name_hash(dentry, norm, len);
+out:
+	kfree(norm);
+	return ret;
+}
+
+const struct dentry_operations ext4_dentry_ops = {
+	.d_hash = ext4_d_hash,
+	.d_compare = ext4_d_compare,
+};
+#endif
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index f8456a4..56f9de2 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -40,8 +40,8 @@
 #include <linux/compat.h>
 #endif
 
-#define __FS_HAS_ENCRYPTION IS_ENABLED(CONFIG_EXT4_FS_ENCRYPTION)
 #include <linux/fscrypt.h>
+#include <linux/fsverity.h>
 
 #include <linux/compiler.h>
 
@@ -413,14 +413,16 @@
 #define EXT4_TOPDIR_FL			0x00020000 /* Top of directory hierarchies*/
 #define EXT4_HUGE_FILE_FL               0x00040000 /* Set to each huge file */
 #define EXT4_EXTENTS_FL			0x00080000 /* Inode uses extents */
+#define EXT4_VERITY_FL			0x00100000 /* Verity protected inode */
 #define EXT4_EA_INODE_FL	        0x00200000 /* Inode used for large EA */
 #define EXT4_EOFBLOCKS_FL		0x00400000 /* Blocks allocated beyond EOF */
 #define EXT4_INLINE_DATA_FL		0x10000000 /* Inode has inline data. */
 #define EXT4_PROJINHERIT_FL		0x20000000 /* Create with parents projid */
+#define EXT4_CASEFOLD_FL		0x40000000 /* Casefolded file */
 #define EXT4_RESERVED_FL		0x80000000 /* reserved for ext4 lib */
 
-#define EXT4_FL_USER_VISIBLE		0x304BDFFF /* User visible flags */
-#define EXT4_FL_USER_MODIFIABLE		0x204BC0FF /* User modifiable flags */
+#define EXT4_FL_USER_VISIBLE		0x705BDFFF /* User visible flags */
+#define EXT4_FL_USER_MODIFIABLE		0x604BC0FF /* User modifiable flags */
 
 /* Flags we can manipulate with through EXT4_IOC_FSSETXATTR */
 #define EXT4_FL_XFLAG_VISIBLE		(EXT4_SYNC_FL | \
@@ -435,10 +437,10 @@
 			   EXT4_SYNC_FL | EXT4_NODUMP_FL | EXT4_NOATIME_FL |\
 			   EXT4_NOCOMPR_FL | EXT4_JOURNAL_DATA_FL |\
 			   EXT4_NOTAIL_FL | EXT4_DIRSYNC_FL |\
-			   EXT4_PROJINHERIT_FL)
+			   EXT4_PROJINHERIT_FL | EXT4_CASEFOLD_FL)
 
 /* Flags that are appropriate for regular files (all but dir-specific ones). */
-#define EXT4_REG_FLMASK (~(EXT4_DIRSYNC_FL | EXT4_TOPDIR_FL))
+#define EXT4_REG_FLMASK (~(EXT4_DIRSYNC_FL | EXT4_TOPDIR_FL | EXT4_CASEFOLD_FL))
 
 /* Flags that are appropriate for non-directories/regular files. */
 #define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL)
@@ -483,6 +485,7 @@
 	EXT4_INODE_TOPDIR	= 17,	/* Top of directory hierarchies*/
 	EXT4_INODE_HUGE_FILE	= 18,	/* Set to each huge file */
 	EXT4_INODE_EXTENTS	= 19,	/* Inode uses extents */
+	EXT4_INODE_VERITY	= 20,	/* Verity protected inode */
 	EXT4_INODE_EA_INODE	= 21,	/* Inode used for large EA */
 	EXT4_INODE_EOFBLOCKS	= 22,	/* Blocks allocated beyond EOF */
 	EXT4_INODE_INLINE_DATA	= 28,	/* Data in inode. */
@@ -528,6 +531,7 @@
 	CHECK_FLAG_VALUE(TOPDIR);
 	CHECK_FLAG_VALUE(HUGE_FILE);
 	CHECK_FLAG_VALUE(EXTENTS);
+	CHECK_FLAG_VALUE(VERITY);
 	CHECK_FLAG_VALUE(EA_INODE);
 	CHECK_FLAG_VALUE(EOFBLOCKS);
 	CHECK_FLAG_VALUE(INLINE_DATA);
@@ -1136,6 +1140,7 @@
 #define EXT4_MOUNT_JOURNAL_CHECKSUM	0x800000 /* Journal checksums */
 #define EXT4_MOUNT_JOURNAL_ASYNC_COMMIT	0x1000000 /* Journal Async Commit */
 #define EXT4_MOUNT_WARN_ON_ERROR	0x2000000 /* Trigger WARN_ON on error */
+#define EXT4_MOUNT_INLINECRYPT		0x4000000 /* Inline encryption support */
 #define EXT4_MOUNT_DELALLOC		0x8000000 /* Delalloc support */
 #define EXT4_MOUNT_DATA_ERR_ABORT	0x10000000 /* Abort on file data write */
 #define EXT4_MOUNT_BLOCK_VALIDITY	0x20000000 /* Block validity checking */
@@ -1327,7 +1332,9 @@
 	__u8	s_first_error_time_hi;
 	__u8	s_last_error_time_hi;
 	__u8	s_pad[2];
-	__le32	s_reserved[96];		/* Padding to the end of the block */
+	__le16  s_encoding;		/* Filename charset encoding */
+	__le16  s_encoding_flags;	/* Filename charset encoding flags */
+	__le32	s_reserved[95];		/* Padding to the end of the block */
 	__le32	s_checksum;		/* crc32c(superblock) */
 };
 
@@ -1342,7 +1349,7 @@
 #define EXT4_MF_FS_ABORTED		0x0002	/* Fatal error detected */
 #define EXT4_MF_TEST_DUMMY_ENCRYPTION	0x0004
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 #define DUMMY_ENCRYPTION_ENABLED(sbi) (unlikely((sbi)->s_mount_flags & \
 						EXT4_MF_TEST_DUMMY_ENCRYPTION))
 #else
@@ -1352,6 +1359,16 @@
 /* Number of quota types we support */
 #define EXT4_MAXQUOTAS 3
 
+#define EXT4_ENC_UTF8_12_1	1
+
+/*
+ * Flags for ext4_sb_info.s_encoding_flags.
+ */
+#define EXT4_ENC_STRICT_MODE_FL	(1 << 0)
+
+#define ext4_has_strict_mode(sbi) \
+	(sbi->s_encoding_flags & EXT4_ENC_STRICT_MODE_FL)
+
 /*
  * fourth extended-fs super-block data in memory
  */
@@ -1401,6 +1418,10 @@
 	struct kobject s_kobj;
 	struct completion s_kobj_unregister;
 	struct super_block *s_sb;
+#ifdef CONFIG_UNICODE
+	struct unicode_map *s_encoding;
+	__u16 s_encoding_flags;
+#endif
 
 	/* Journaling */
 	struct journal_s *s_journal;
@@ -1556,6 +1577,7 @@
 	EXT4_STATE_MAY_INLINE_DATA,	/* may have in-inode data */
 	EXT4_STATE_EXT_PRECACHED,	/* extents have been precached */
 	EXT4_STATE_LUSTRE_EA_INODE,	/* Lustre-style ea_inode */
+	EXT4_STATE_VERITY_IN_PROGRESS,	/* building fs-verity Merkle tree */
 };
 
 #define EXT4_INODE_BIT_FNS(name, field, offset)				\
@@ -1606,9 +1628,12 @@
 #define EXT4_SB(sb)	(sb)
 #endif
 
-/*
- * Returns true if the inode is inode is encrypted
- */
+static inline bool ext4_verity_in_progress(struct inode *inode)
+{
+	return IS_ENABLED(CONFIG_FS_VERITY) &&
+	       ext4_test_inode_state(inode, EXT4_STATE_VERITY_IN_PROGRESS);
+}
+
 #define NEXT_ORPHAN(inode) EXT4_I(inode)->i_dtime
 
 /*
@@ -1642,6 +1667,7 @@
 #define EXT4_FEATURE_COMPAT_RESIZE_INODE	0x0010
 #define EXT4_FEATURE_COMPAT_DIR_INDEX		0x0020
 #define EXT4_FEATURE_COMPAT_SPARSE_SUPER2	0x0200
+#define EXT4_FEATURE_COMPAT_STABLE_INODES	0x0800
 
 #define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER	0x0001
 #define EXT4_FEATURE_RO_COMPAT_LARGE_FILE	0x0002
@@ -1661,6 +1687,7 @@
 #define EXT4_FEATURE_RO_COMPAT_METADATA_CSUM	0x0400
 #define EXT4_FEATURE_RO_COMPAT_READONLY		0x1000
 #define EXT4_FEATURE_RO_COMPAT_PROJECT		0x2000
+#define EXT4_FEATURE_RO_COMPAT_VERITY		0x8000
 
 #define EXT4_FEATURE_INCOMPAT_COMPRESSION	0x0001
 #define EXT4_FEATURE_INCOMPAT_FILETYPE		0x0002
@@ -1677,6 +1704,7 @@
 #define EXT4_FEATURE_INCOMPAT_LARGEDIR		0x4000 /* >2GB or 3-lvl htree */
 #define EXT4_FEATURE_INCOMPAT_INLINE_DATA	0x8000 /* data in inode */
 #define EXT4_FEATURE_INCOMPAT_ENCRYPT		0x10000
+#define EXT4_FEATURE_INCOMPAT_CASEFOLD		0x20000
 
 extern void ext4_update_dynamic_rev(struct super_block *sb);
 
@@ -1741,6 +1769,7 @@
 EXT4_FEATURE_COMPAT_FUNCS(resize_inode,		RESIZE_INODE)
 EXT4_FEATURE_COMPAT_FUNCS(dir_index,		DIR_INDEX)
 EXT4_FEATURE_COMPAT_FUNCS(sparse_super2,	SPARSE_SUPER2)
+EXT4_FEATURE_COMPAT_FUNCS(stable_inodes,	STABLE_INODES)
 
 EXT4_FEATURE_RO_COMPAT_FUNCS(sparse_super,	SPARSE_SUPER)
 EXT4_FEATURE_RO_COMPAT_FUNCS(large_file,	LARGE_FILE)
@@ -1754,6 +1783,7 @@
 EXT4_FEATURE_RO_COMPAT_FUNCS(metadata_csum,	METADATA_CSUM)
 EXT4_FEATURE_RO_COMPAT_FUNCS(readonly,		READONLY)
 EXT4_FEATURE_RO_COMPAT_FUNCS(project,		PROJECT)
+EXT4_FEATURE_RO_COMPAT_FUNCS(verity,		VERITY)
 
 EXT4_FEATURE_INCOMPAT_FUNCS(compression,	COMPRESSION)
 EXT4_FEATURE_INCOMPAT_FUNCS(filetype,		FILETYPE)
@@ -1770,6 +1800,7 @@
 EXT4_FEATURE_INCOMPAT_FUNCS(largedir,		LARGEDIR)
 EXT4_FEATURE_INCOMPAT_FUNCS(inline_data,	INLINE_DATA)
 EXT4_FEATURE_INCOMPAT_FUNCS(encrypt,		ENCRYPT)
+EXT4_FEATURE_INCOMPAT_FUNCS(casefold,		CASEFOLD)
 
 #define EXT2_FEATURE_COMPAT_SUPP	EXT4_FEATURE_COMPAT_EXT_ATTR
 #define EXT2_FEATURE_INCOMPAT_SUPP	(EXT4_FEATURE_INCOMPAT_FILETYPE| \
@@ -1797,6 +1828,7 @@
 					 EXT4_FEATURE_INCOMPAT_MMP | \
 					 EXT4_FEATURE_INCOMPAT_INLINE_DATA | \
 					 EXT4_FEATURE_INCOMPAT_ENCRYPT | \
+					 EXT4_FEATURE_INCOMPAT_CASEFOLD | \
 					 EXT4_FEATURE_INCOMPAT_CSUM_SEED | \
 					 EXT4_FEATURE_INCOMPAT_LARGEDIR)
 #define EXT4_FEATURE_RO_COMPAT_SUPP	(EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \
@@ -1809,7 +1841,8 @@
 					 EXT4_FEATURE_RO_COMPAT_BIGALLOC |\
 					 EXT4_FEATURE_RO_COMPAT_METADATA_CSUM|\
 					 EXT4_FEATURE_RO_COMPAT_QUOTA |\
-					 EXT4_FEATURE_RO_COMPAT_PROJECT)
+					 EXT4_FEATURE_RO_COMPAT_PROJECT |\
+					 EXT4_FEATURE_RO_COMPAT_VERITY)
 
 #define EXTN_FEATURE_FUNCS(ver) \
 static inline bool ext4_has_unknown_ext##ver##_compat_features(struct super_block *sb) \
@@ -2072,9 +2105,12 @@
 	const struct qstr *usr_fname;
 	struct fscrypt_str disk_name;
 	struct dx_hash_info hinfo;
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	struct fscrypt_str crypto_buf;
 #endif
+#ifdef CONFIG_UNICODE
+	struct fscrypt_str cf_name;
+#endif
 };
 
 #define fname_name(p) ((p)->disk_name.name)
@@ -2300,29 +2336,62 @@
 					      struct ext4_group_desc *gdp);
 ext4_fsblk_t ext4_inode_to_goal_block(struct inode *);
 
-static inline bool ext4_encrypted_inode(struct inode *inode)
+#ifdef CONFIG_UNICODE
+extern void ext4_fname_setup_ci_filename(struct inode *dir,
+					 const struct qstr *iname,
+					 struct fscrypt_str *fname);
+#endif
+
+#ifdef CONFIG_FS_ENCRYPTION
+static inline void ext4_fname_from_fscrypt_name(struct ext4_filename *dst,
+						const struct fscrypt_name *src)
 {
-	return ext4_test_inode_flag(inode, EXT4_INODE_ENCRYPT);
+	memset(dst, 0, sizeof(*dst));
+
+	dst->usr_fname = src->usr_fname;
+	dst->disk_name = src->disk_name;
+	dst->hinfo.hash = src->hash;
+	dst->hinfo.minor_hash = src->minor_hash;
+	dst->crypto_buf = src->crypto_buf;
 }
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
 static inline int ext4_fname_setup_filename(struct inode *dir,
-			const struct qstr *iname,
-			int lookup, struct ext4_filename *fname)
+					    const struct qstr *iname,
+					    int lookup,
+					    struct ext4_filename *fname)
 {
 	struct fscrypt_name name;
 	int err;
 
-	memset(fname, 0, sizeof(struct ext4_filename));
-
 	err = fscrypt_setup_filename(dir, iname, lookup, &name);
+	if (err)
+		return err;
 
-	fname->usr_fname = name.usr_fname;
-	fname->disk_name = name.disk_name;
-	fname->hinfo.hash = name.hash;
-	fname->hinfo.minor_hash = name.minor_hash;
-	fname->crypto_buf = name.crypto_buf;
-	return err;
+	ext4_fname_from_fscrypt_name(fname, &name);
+
+#ifdef CONFIG_UNICODE
+	ext4_fname_setup_ci_filename(dir, iname, &fname->cf_name);
+#endif
+	return 0;
+}
+
+static inline int ext4_fname_prepare_lookup(struct inode *dir,
+					    struct dentry *dentry,
+					    struct ext4_filename *fname)
+{
+	struct fscrypt_name name;
+	int err;
+
+	err = fscrypt_prepare_lookup(dir, dentry, &name);
+	if (err)
+		return err;
+
+	ext4_fname_from_fscrypt_name(fname, &name);
+
+#ifdef CONFIG_UNICODE
+	ext4_fname_setup_ci_filename(dir, &dentry->d_name, &fname->cf_name);
+#endif
+	return 0;
 }
 
 static inline void ext4_fname_free_filename(struct ext4_filename *fname)
@@ -2335,20 +2404,44 @@
 	fname->crypto_buf.name = NULL;
 	fname->usr_fname = NULL;
 	fname->disk_name.name = NULL;
+
+#ifdef CONFIG_UNICODE
+	kfree(fname->cf_name.name);
+	fname->cf_name.name = NULL;
+#endif
 }
-#else
+#else /* !CONFIG_FS_ENCRYPTION */
 static inline int ext4_fname_setup_filename(struct inode *dir,
-		const struct qstr *iname,
-		int lookup, struct ext4_filename *fname)
+					    const struct qstr *iname,
+					    int lookup,
+					    struct ext4_filename *fname)
 {
 	fname->usr_fname = iname;
 	fname->disk_name.name = (unsigned char *) iname->name;
 	fname->disk_name.len = iname->len;
+
+#ifdef CONFIG_UNICODE
+	ext4_fname_setup_ci_filename(dir, iname, &fname->cf_name);
+#endif
+
 	return 0;
 }
-static inline void ext4_fname_free_filename(struct ext4_filename *fname) { }
 
+static inline int ext4_fname_prepare_lookup(struct inode *dir,
+					    struct dentry *dentry,
+					    struct ext4_filename *fname)
+{
+	return ext4_fname_setup_filename(dir, &dentry->d_name, 1, fname);
+}
+
+static inline void ext4_fname_free_filename(struct ext4_filename *fname)
+{
+#ifdef CONFIG_UNICODE
+	kfree(fname->cf_name.name);
+	fname->cf_name.name = NULL;
 #endif
+}
+#endif /* !CONFIG_FS_ENCRYPTION */
 
 /* dir.c */
 extern int __ext4_check_dir_entry(const char *, unsigned int, struct inode *,
@@ -2396,8 +2489,8 @@
 extern int ext4_sync_file(struct file *, loff_t, loff_t, int);
 
 /* hash.c */
-extern int ext4fs_dirhash(const char *name, int len, struct
-			  dx_hash_info *hinfo);
+extern int ext4fs_dirhash(const struct inode *dir, const char *name, int len,
+			  struct dx_hash_info *hinfo);
 
 /* ialloc.c */
 extern struct inode *__ext4_new_inode(handle_t *, struct inode *, umode_t,
@@ -2992,6 +3085,10 @@
 /* dir.c */
 extern const struct file_operations ext4_dir_operations;
 
+#ifdef CONFIG_UNICODE
+extern const struct dentry_operations ext4_dentry_ops;
+#endif
+
 /* file.c */
 extern const struct inode_operations ext4_file_inode_operations;
 extern const struct file_operations ext4_file_operations;
@@ -3084,6 +3181,10 @@
 extern int ext4_handle_dirty_dirent_node(handle_t *handle,
 					 struct inode *inode,
 					 struct buffer_head *bh);
+extern int ext4_ci_compare(const struct inode *parent,
+			   const struct qstr *fname,
+			   const struct qstr *entry, bool quick);
+
 #define S_SHIFT 12
 static const unsigned char ext4_type_by_mode[(S_IFMT >> S_SHIFT) + 1] = {
 	[S_IFREG >> S_SHIFT]	= EXT4_FT_REG_FILE,
@@ -3106,6 +3207,8 @@
 extern int ext4_mpage_readpages(struct address_space *mapping,
 				struct list_head *pages, struct page *page,
 				unsigned nr_pages, bool is_readahead);
+extern int __init ext4_init_post_read_processing(void);
+extern void ext4_exit_post_read_processing(void);
 
 /* symlink.c */
 extern const struct inode_operations ext4_encrypted_symlink_inode_operations;
@@ -3215,6 +3318,9 @@
 /* mmp.c */
 extern int ext4_multi_mount_protect(struct super_block *, ext4_fsblk_t);
 
+/* verity.c */
+extern const struct fsverity_operations ext4_verityops;
+
 /*
  * Add new method to test whether block and inode bitmaps are properly
  * initialized. With uninit_bg reading the block from disk is not enough
diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h
index 402dc36..ef8fcf7 100644
--- a/fs/ext4/ext4_jbd2.h
+++ b/fs/ext4/ext4_jbd2.h
@@ -411,7 +411,7 @@
 	    (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA) &&
 	    !test_opt(inode->i_sb, DELALLOC))) {
 		/* We do not support data journalling for encrypted data */
-		if (S_ISREG(inode->i_mode) && ext4_encrypted_inode(inode))
+		if (S_ISREG(inode->i_mode) && IS_ENCRYPTED(inode))
 			return EXT4_INODE_ORDERED_DATA_MODE;  /* ordered */
 		return EXT4_INODE_JOURNAL_DATA_MODE;	/* journal data */
 	}
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index f81eb17..cf6bd0d 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3586,7 +3586,7 @@
 		max_zeroout = sbi->s_extent_max_zeroout_kb >>
 			(inode->i_sb->s_blocksize_bits - 10);
 
-	if (ext4_encrypted_inode(inode))
+	if (IS_ENCRYPTED(inode))
 		max_zeroout = 0;
 
 	/*
@@ -4936,7 +4936,7 @@
 	 * leave it disabled for encrypted inodes for now.  This is a
 	 * bug we should fix....
 	 */
-	if (ext4_encrypted_inode(inode) &&
+	if (IS_ENCRYPTED(inode) &&
 	    (mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE |
 		     FALLOC_FL_ZERO_RANGE)))
 		return -EOPNOTSUPP;
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index f4a24a4..7ad36a9 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -455,6 +455,10 @@
 	if (ret)
 		return ret;
 
+	ret = fsverity_file_open(inode, filp);
+	if (ret)
+		return ret;
+
 	/*
 	 * Set up the jbd2_inode if we are opening the inode for
 	 * writing and the journal is present
diff --git a/fs/ext4/hash.c b/fs/ext4/hash.c
index e22dcfa..b934206 100644
--- a/fs/ext4/hash.c
+++ b/fs/ext4/hash.c
@@ -6,6 +6,7 @@
  */
 
 #include <linux/fs.h>
+#include <linux/unicode.h>
 #include <linux/compiler.h>
 #include <linux/bitops.h>
 #include "ext4.h"
@@ -196,7 +197,8 @@
  * represented, and whether or not the returned hash is 32 bits or 64
  * bits.  32 bit hashes will return 0 for the minor hash.
  */
-int ext4fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo)
+static int __ext4fs_dirhash(const char *name, int len,
+			    struct dx_hash_info *hinfo)
 {
 	__u32	hash;
 	__u32	minor_hash = 0;
@@ -266,3 +268,33 @@
 	hinfo->minor_hash = minor_hash;
 	return 0;
 }
+
+int ext4fs_dirhash(const struct inode *dir, const char *name, int len,
+		   struct dx_hash_info *hinfo)
+{
+#ifdef CONFIG_UNICODE
+	const struct unicode_map *um = EXT4_SB(dir->i_sb)->s_encoding;
+	int r, dlen;
+	unsigned char *buff;
+	struct qstr qstr = {.name = name, .len = len };
+
+	if (len && IS_CASEFOLDED(dir) && um) {
+		buff = kzalloc(sizeof(char) * PATH_MAX, GFP_KERNEL);
+		if (!buff)
+			return -ENOMEM;
+
+		dlen = utf8_casefold(um, &qstr, buff, PATH_MAX);
+		if (dlen < 0) {
+			kfree(buff);
+			goto opaque_seq;
+		}
+
+		r = __ext4fs_dirhash(buff, dlen, hinfo);
+
+		kfree(buff);
+		return r;
+	}
+opaque_seq:
+#endif
+	return __ext4fs_dirhash(name, len, hinfo);
+}
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
index 091a18a..47cea9c 100644
--- a/fs/ext4/ialloc.c
+++ b/fs/ext4/ialloc.c
@@ -455,7 +455,7 @@
 		if (qstr) {
 			hinfo.hash_version = DX_HASH_HALF_MD4;
 			hinfo.seed = sbi->s_hash_seed;
-			ext4fs_dirhash(qstr->name, qstr->len, &hinfo);
+			ext4fs_dirhash(parent, qstr->name, qstr->len, &hinfo);
 			grp = hinfo.hash;
 		} else
 			grp = prandom_u32();
@@ -771,7 +771,7 @@
 	if (unlikely(ext4_forced_shutdown(sbi)))
 		return ERR_PTR(-EIO);
 
-	if ((ext4_encrypted_inode(dir) || DUMMY_ENCRYPTION_ENABLED(sbi)) &&
+	if ((IS_ENCRYPTED(dir) || DUMMY_ENCRYPTION_ENABLED(sbi)) &&
 	    (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) &&
 	    !(i_flags & EXT4_EA_INODE_FL)) {
 		err = fscrypt_get_encryption_info(dir);
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
index 56f6e17..d065634 100644
--- a/fs/ext4/inline.c
+++ b/fs/ext4/inline.c
@@ -12,6 +12,7 @@
 #include "ext4.h"
 #include "xattr.h"
 #include "truncate.h"
+#include <trace/events/android_fs.h>
 
 #define EXT4_XATTR_SYSTEM_DATA	"data"
 #define EXT4_MIN_INLINE_DATA_SIZE	((sizeof(__le32) * EXT4_N_BLOCKS))
@@ -505,6 +506,17 @@
 		return -EAGAIN;
 	}
 
+	if (trace_android_fs_dataread_start_enabled()) {
+		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+		path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    inode);
+		trace_android_fs_dataread_start(inode, page_offset(page),
+						PAGE_SIZE, current->pid,
+						path, current->comm);
+	}
+
 	/*
 	 * Current inline data can only exist in the 1st page,
 	 * So for all the other pages, just set them uptodate.
@@ -516,6 +528,8 @@
 		SetPageUptodate(page);
 	}
 
+	trace_android_fs_dataread_end(inode, page_offset(page), PAGE_SIZE);
+
 	up_read(&EXT4_I(inode)->xattr_sem);
 
 	unlock_page(page);
@@ -1407,7 +1421,7 @@
 			}
 		}
 
-		ext4fs_dirhash(de->name, de->name_len, hinfo);
+		ext4fs_dirhash(dir, de->name, de->name_len, hinfo);
 		if ((hinfo->hash < start_hash) ||
 		    ((hinfo->hash == start_hash) &&
 		     (hinfo->minor_hash < start_minor_hash)))
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 215802c..af97b97 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -47,6 +47,7 @@
 #include "truncate.h"
 
 #include <trace/events/ext4.h>
+#include <trace/events/android_fs.h>
 
 #define MPAGE_DA_EXTENT_TAIL 0x01
 
@@ -428,7 +429,7 @@
 {
 	int ret;
 
-	if (ext4_encrypted_inode(inode))
+	if (IS_ENCRYPTED(inode))
 		return fscrypt_zeroout_range(inode, lblk, pblk, len);
 
 	ret = sb_issue_zeroout(inode->i_sb, pblk, len, GFP_NOFS);
@@ -1169,7 +1170,7 @@
 	return ret;
 }
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len,
 				  get_block_t *get_block)
 {
@@ -1236,8 +1237,7 @@
 		    (block_start < from || block_end > to)) {
 			ll_rw_block(REQ_OP_READ, 0, 1, &bh);
 			*wait_bh++ = bh;
-			decrypt = ext4_encrypted_inode(inode) &&
-				S_ISREG(inode->i_mode);
+			decrypt = fscrypt_inode_uses_fs_layer_crypto(inode);
 		}
 	}
 	/*
@@ -1251,8 +1251,7 @@
 	if (unlikely(err))
 		page_zero_new_buffers(page, from, to);
 	else if (decrypt)
-		err = fscrypt_decrypt_page(page->mapping->host, page,
-				PAGE_SIZE, 0, page->index);
+		err = fscrypt_decrypt_pagecache_blocks(page, PAGE_SIZE, 0);
 	return err;
 }
 #endif
@@ -1272,6 +1271,16 @@
 	if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))
 		return -EIO;
 
+	if (trace_android_fs_datawrite_start_enabled()) {
+		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+		path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    inode);
+		trace_android_fs_datawrite_start(inode, pos, len,
+						 current->pid, path,
+						 current->comm);
+	}
 	trace_ext4_write_begin(inode, pos, len, flags);
 	/*
 	 * Reserve one block more for addition to orphan list in case
@@ -1322,7 +1331,7 @@
 	/* In case writeback began while the page was unlocked */
 	wait_for_stable_page(page);
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	if (ext4_should_dioread_nolock(inode))
 		ret = ext4_block_write_begin(page, pos, len,
 					     ext4_get_block_unwritten);
@@ -1343,6 +1352,9 @@
 	}
 
 	if (ret) {
+		bool extended = (pos + len > inode->i_size) &&
+				!ext4_verity_in_progress(inode);
+
 		unlock_page(page);
 		/*
 		 * __block_write_begin may have instantiated a few blocks
@@ -1352,11 +1364,11 @@
 		 * Add inode to orphan list in case we crash before
 		 * truncate finishes
 		 */
-		if (pos + len > inode->i_size && ext4_can_truncate(inode))
+		if (extended && ext4_can_truncate(inode))
 			ext4_orphan_add(handle, inode);
 
 		ext4_journal_stop(handle);
-		if (pos + len > inode->i_size) {
+		if (extended) {
 			ext4_truncate_failed_write(inode);
 			/*
 			 * If truncate failed early the inode might
@@ -1409,7 +1421,9 @@
 	int ret = 0, ret2;
 	int i_size_changed = 0;
 	int inline_data = ext4_has_inline_data(inode);
+	bool verity = ext4_verity_in_progress(inode);
 
+	trace_android_fs_datawrite_end(inode, pos, len);
 	trace_ext4_write_end(inode, pos, len, copied);
 	if (inline_data) {
 		ret = ext4_write_inline_data_end(inode, pos, len,
@@ -1426,12 +1440,16 @@
 	/*
 	 * it's important to update i_size while still holding page lock:
 	 * page writeout could otherwise come in and zero beyond i_size.
+	 *
+	 * If FS_IOC_ENABLE_VERITY is running on this inode, then Merkle tree
+	 * blocks are being written past EOF, so skip the i_size update.
 	 */
-	i_size_changed = ext4_update_inode_size(inode, pos + copied);
+	if (!verity)
+		i_size_changed = ext4_update_inode_size(inode, pos + copied);
 	unlock_page(page);
 	put_page(page);
 
-	if (old_size < pos)
+	if (old_size < pos && !verity)
 		pagecache_isize_extended(inode, old_size, pos);
 	/*
 	 * Don't mark the inode dirty under page lock. First, it unnecessarily
@@ -1442,7 +1460,7 @@
 	if (i_size_changed || inline_data)
 		ext4_mark_inode_dirty(handle, inode);
 
-	if (pos + len > inode->i_size && ext4_can_truncate(inode))
+	if (pos + len > inode->i_size && !verity && ext4_can_truncate(inode))
 		/* if we have allocated more blocks and copied
 		 * less. We will have blocks allocated outside
 		 * inode->i_size. So truncate them
@@ -1453,7 +1471,7 @@
 	if (!ret)
 		ret = ret2;
 
-	if (pos + len > inode->i_size) {
+	if (pos + len > inode->i_size && !verity) {
 		ext4_truncate_failed_write(inode);
 		/*
 		 * If truncate failed early the inode might still be
@@ -1514,7 +1532,9 @@
 	unsigned from, to;
 	int size_changed = 0;
 	int inline_data = ext4_has_inline_data(inode);
+	bool verity = ext4_verity_in_progress(inode);
 
+	trace_android_fs_datawrite_end(inode, pos, len);
 	trace_ext4_journalled_write_end(inode, pos, len, copied);
 	from = pos & (PAGE_SIZE - 1);
 	to = from + len;
@@ -1543,13 +1563,14 @@
 		if (!partial)
 			SetPageUptodate(page);
 	}
-	size_changed = ext4_update_inode_size(inode, pos + copied);
+	if (!verity)
+		size_changed = ext4_update_inode_size(inode, pos + copied);
 	ext4_set_inode_state(inode, EXT4_STATE_JDATA);
 	EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid;
 	unlock_page(page);
 	put_page(page);
 
-	if (old_size < pos)
+	if (old_size < pos && !verity)
 		pagecache_isize_extended(inode, old_size, pos);
 
 	if (size_changed || inline_data) {
@@ -1558,7 +1579,7 @@
 			ret = ret2;
 	}
 
-	if (pos + len > inode->i_size && ext4_can_truncate(inode))
+	if (pos + len > inode->i_size && !verity && ext4_can_truncate(inode))
 		/* if we have allocated more blocks and copied
 		 * less. We will have blocks allocated outside
 		 * inode->i_size. So truncate them
@@ -1569,7 +1590,7 @@
 	ret2 = ext4_journal_stop(handle);
 	if (!ret)
 		ret = ret2;
-	if (pos + len > inode->i_size) {
+	if (pos + len > inode->i_size && !verity) {
 		ext4_truncate_failed_write(inode);
 		/*
 		 * If truncate failed early the inode might still be
@@ -2135,7 +2156,8 @@
 
 	trace_ext4_writepage(page);
 	size = i_size_read(inode);
-	if (page->index == size >> PAGE_SHIFT)
+	if (page->index == size >> PAGE_SHIFT &&
+	    !ext4_verity_in_progress(inode))
 		len = size & ~PAGE_MASK;
 	else
 		len = PAGE_SIZE;
@@ -2219,7 +2241,8 @@
 	 * after page tables are updated.
 	 */
 	size = i_size_read(mpd->inode);
-	if (page->index == size >> PAGE_SHIFT)
+	if (page->index == size >> PAGE_SHIFT &&
+	    !ext4_verity_in_progress(mpd->inode))
 		len = size & ~PAGE_MASK;
 	else
 		len = PAGE_SIZE;
@@ -2318,6 +2341,9 @@
 	ext4_lblk_t blocks = (i_size_read(inode) + i_blocksize(inode) - 1)
 							>> inode->i_blkbits;
 
+	if (ext4_verity_in_progress(inode))
+		blocks = EXT_MAX_BLOCKS;
+
 	do {
 		BUG_ON(buffer_locked(bh));
 
@@ -3037,13 +3063,23 @@
 
 	index = pos >> PAGE_SHIFT;
 
-	if (ext4_nonda_switch(inode->i_sb) ||
-	    S_ISLNK(inode->i_mode)) {
+	if (ext4_nonda_switch(inode->i_sb) || S_ISLNK(inode->i_mode) ||
+	    ext4_verity_in_progress(inode)) {
 		*fsdata = (void *)FALL_BACK_TO_NONDELALLOC;
 		return ext4_write_begin(file, mapping, pos,
 					len, flags, pagep, fsdata);
 	}
 	*fsdata = (void *)0;
+	if (trace_android_fs_datawrite_start_enabled()) {
+		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+		path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    inode);
+		trace_android_fs_datawrite_start(inode, pos, len,
+						 current->pid,
+						 path, current->comm);
+	}
 	trace_ext4_da_write_begin(inode, pos, len, flags);
 
 	if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) {
@@ -3094,7 +3130,7 @@
 	/* In case writeback began while the page was unlocked */
 	wait_for_stable_page(page);
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	ret = ext4_block_write_begin(page, pos, len,
 				     ext4_da_get_block_prep);
 #else
@@ -3162,6 +3198,7 @@
 		return ext4_write_end(file, mapping, pos,
 				      len, copied, page, fsdata);
 
+	trace_android_fs_datawrite_end(inode, pos, len);
 	trace_ext4_da_write_end(inode, pos, len, copied);
 	start = pos & (PAGE_SIZE - 1);
 	end = start + copied - 1;
@@ -3867,11 +3904,14 @@
 	size_t count = iov_iter_count(iter);
 	loff_t offset = iocb->ki_pos;
 	ssize_t ret;
+	int rw = iov_iter_rw(iter);
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-	if (ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode))
+#ifdef CONFIG_FS_ENCRYPTION
+	if (IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode))
 		return 0;
 #endif
+	if (fsverity_active(inode))
+		return 0;
 
 	/*
 	 * If we are doing data journalling we don't support O_DIRECT
@@ -3883,12 +3923,42 @@
 	if (ext4_has_inline_data(inode))
 		return 0;
 
+	if (trace_android_fs_dataread_start_enabled() &&
+	    (rw == READ)) {
+		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+		path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    inode);
+		trace_android_fs_dataread_start(inode, offset, count,
+						current->pid, path,
+						current->comm);
+	}
+	if (trace_android_fs_datawrite_start_enabled() &&
+	    (rw == WRITE)) {
+		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+		path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    inode);
+		trace_android_fs_datawrite_start(inode, offset, count,
+						 current->pid, path,
+						 current->comm);
+	}
 	trace_ext4_direct_IO_enter(inode, offset, count, iov_iter_rw(iter));
 	if (iov_iter_rw(iter) == READ)
 		ret = ext4_direct_IO_read(iocb, iter);
 	else
 		ret = ext4_direct_IO_write(iocb, iter);
 	trace_ext4_direct_IO_exit(inode, offset, count, iov_iter_rw(iter), ret);
+
+	if (trace_android_fs_dataread_start_enabled() &&
+	    (rw == READ))
+		trace_android_fs_dataread_end(inode, offset, count);
+	if (trace_android_fs_datawrite_start_enabled() &&
+	    (rw == WRITE))
+		trace_android_fs_datawrite_end(inode, offset, count);
+
 	return ret;
 }
 
@@ -4053,13 +4123,12 @@
 		/* Uhhuh. Read error. Complain and punt. */
 		if (!buffer_uptodate(bh))
 			goto unlock;
-		if (S_ISREG(inode->i_mode) &&
-		    ext4_encrypted_inode(inode)) {
+		if (fscrypt_inode_uses_fs_layer_crypto(inode)) {
 			/* We expect the key to be set. */
 			BUG_ON(!fscrypt_has_encryption_key(inode));
 			BUG_ON(blocksize != PAGE_SIZE);
-			WARN_ON_ONCE(fscrypt_decrypt_page(page->mapping->host,
-						page, PAGE_SIZE, 0, page->index));
+			WARN_ON_ONCE(fscrypt_decrypt_pagecache_blocks(
+						page, PAGE_SIZE, 0));
 		}
 	}
 	if (ext4_should_journal_data(inode)) {
@@ -4131,7 +4200,7 @@
 	struct inode *inode = mapping->host;
 
 	/* If we are processing an encrypted inode during orphan list handling */
-	if (ext4_encrypted_inode(inode) && !fscrypt_has_encryption_key(inode))
+	if (IS_ENCRYPTED(inode) && !fscrypt_has_encryption_key(inode))
 		return 0;
 
 	blocksize = inode->i_sb->s_blocksize;
@@ -4720,7 +4789,9 @@
 		return false;
 	if (ext4_has_inline_data(inode))
 		return false;
-	if (ext4_encrypted_inode(inode))
+	if (ext4_test_inode_flag(inode, EXT4_INODE_ENCRYPT))
+		return false;
+	if (ext4_test_inode_flag(inode, EXT4_INODE_VERITY))
 		return false;
 	return true;
 }
@@ -4744,9 +4815,13 @@
 		new_fl |= S_DAX;
 	if (flags & EXT4_ENCRYPT_FL)
 		new_fl |= S_ENCRYPTED;
+	if (flags & EXT4_CASEFOLD_FL)
+		new_fl |= S_CASEFOLD;
+	if (flags & EXT4_VERITY_FL)
+		new_fl |= S_VERITY;
 	inode_set_flags(inode, new_fl,
 			S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC|S_DAX|
-			S_ENCRYPTED);
+			S_ENCRYPTED|S_CASEFOLD|S_VERITY);
 }
 
 static blkcnt_t ext4_inode_blocks(struct ext4_inode *raw_inode,
@@ -5070,7 +5145,7 @@
 			ret = -EFSCORRUPTED;
 			goto bad_inode;
 		}
-		if (ext4_encrypted_inode(inode)) {
+		if (IS_ENCRYPTED(inode)) {
 			inode->i_op = &ext4_encrypted_symlink_inode_operations;
 			ext4_set_aops(inode);
 		} else if (ext4_inode_is_fast_symlink(inode)) {
@@ -5100,6 +5175,9 @@
 				 "iget: bogus i_mode (%o)", inode->i_mode);
 		goto bad_inode;
 	}
+	if (IS_CASEFOLDED(inode) && !ext4_has_feature_casefold(inode->i_sb))
+		EXT4_ERROR_INODE(inode,
+				 "casefold flag without casefold feature");
 	brelse(iloc.bh);
 
 	unlock_new_inode(inode);
@@ -5540,6 +5618,10 @@
 	if (error)
 		return error;
 
+	error = fsverity_prepare_setattr(dentry, attr);
+	if (error)
+		return error;
+
 	if (is_quota_modification(inode, attr)) {
 		error = dquot_initialize(inode);
 		if (error)
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
index 783c54b..96f8329 100644
--- a/fs/ext4/ioctl.c
+++ b/fs/ext4/ioctl.c
@@ -257,7 +257,7 @@
 	return err;
 }
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 static int uuid_is_zero(__u8 u[16])
 {
 	int	i;
@@ -301,6 +301,7 @@
 	struct ext4_iloc iloc;
 	unsigned int oldflags, mask, i;
 	unsigned int jflag;
+	struct super_block *sb = inode->i_sb;
 
 	/* Is it quota file? Do not allow user to mess with it */
 	if (ext4_is_quota_file(inode))
@@ -345,6 +346,23 @@
 			goto flags_out;
 	}
 
+	if ((flags ^ oldflags) & EXT4_CASEFOLD_FL) {
+		if (!ext4_has_feature_casefold(sb)) {
+			err = -EOPNOTSUPP;
+			goto flags_out;
+		}
+
+		if (!S_ISDIR(inode->i_mode)) {
+			err = -ENOTDIR;
+			goto flags_out;
+		}
+
+		if (!ext4_empty_dir(inode)) {
+			err = -ENOTEMPTY;
+			goto flags_out;
+		}
+	}
+
 	/*
 	 * Wait for all pending directio and then flush all the dirty pages
 	 * for this file.  The flush marks all the pages readonly, so any
@@ -1073,7 +1091,7 @@
 		return fscrypt_ioctl_set_policy(filp, (const void __user *)arg);
 
 	case EXT4_IOC_GET_ENCRYPTION_PWSALT: {
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 		int err, err2;
 		struct ext4_sb_info *sbi = EXT4_SB(sb);
 		handle_t *handle;
@@ -1113,8 +1131,35 @@
 #endif
 	}
 	case EXT4_IOC_GET_ENCRYPTION_POLICY:
+		if (!ext4_has_feature_encrypt(sb))
+			return -EOPNOTSUPP;
 		return fscrypt_ioctl_get_policy(filp, (void __user *)arg);
 
+	case FS_IOC_GET_ENCRYPTION_POLICY_EX:
+		if (!ext4_has_feature_encrypt(sb))
+			return -EOPNOTSUPP;
+		return fscrypt_ioctl_get_policy_ex(filp, (void __user *)arg);
+
+	case FS_IOC_ADD_ENCRYPTION_KEY:
+		if (!ext4_has_feature_encrypt(sb))
+			return -EOPNOTSUPP;
+		return fscrypt_ioctl_add_key(filp, (void __user *)arg);
+
+	case FS_IOC_REMOVE_ENCRYPTION_KEY:
+		if (!ext4_has_feature_encrypt(sb))
+			return -EOPNOTSUPP;
+		return fscrypt_ioctl_remove_key(filp, (void __user *)arg);
+
+	case FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS:
+		if (!ext4_has_feature_encrypt(sb))
+			return -EOPNOTSUPP;
+		return fscrypt_ioctl_remove_key_all_users(filp,
+							  (void __user *)arg);
+	case FS_IOC_GET_ENCRYPTION_KEY_STATUS:
+		if (!ext4_has_feature_encrypt(sb))
+			return -EOPNOTSUPP;
+		return fscrypt_ioctl_get_key_status(filp, (void __user *)arg);
+
 	case EXT4_IOC_FSGETXATTR:
 	{
 		struct fsxattr fa;
@@ -1176,6 +1221,17 @@
 	}
 	case EXT4_IOC_SHUTDOWN:
 		return ext4_shutdown(sb, arg);
+
+	case FS_IOC_ENABLE_VERITY:
+		if (!ext4_has_feature_verity(sb))
+			return -EOPNOTSUPP;
+		return fsverity_ioctl_enable(filp, (const void __user *)arg);
+
+	case FS_IOC_MEASURE_VERITY:
+		if (!ext4_has_feature_verity(sb))
+			return -EOPNOTSUPP;
+		return fsverity_ioctl_measure(filp, (void __user *)arg);
+
 	default:
 		return -ENOTTY;
 	}
@@ -1236,8 +1292,15 @@
 	case EXT4_IOC_SET_ENCRYPTION_POLICY:
 	case EXT4_IOC_GET_ENCRYPTION_PWSALT:
 	case EXT4_IOC_GET_ENCRYPTION_POLICY:
+	case FS_IOC_GET_ENCRYPTION_POLICY_EX:
+	case FS_IOC_ADD_ENCRYPTION_KEY:
+	case FS_IOC_REMOVE_ENCRYPTION_KEY:
+	case FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS:
+	case FS_IOC_GET_ENCRYPTION_KEY_STATUS:
 	case EXT4_IOC_SHUTDOWN:
 	case FS_IOC_GETFSMAP:
+	case FS_IOC_ENABLE_VERITY:
+	case FS_IOC_MEASURE_VERITY:
 		break;
 	default:
 		return -ENOIOCTLCMD;
diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c
index 287631b..c7ded4e2 100644
--- a/fs/ext4/move_extent.c
+++ b/fs/ext4/move_extent.c
@@ -593,8 +593,7 @@
 		return -EOPNOTSUPP;
 	}
 
-	if (ext4_encrypted_inode(orig_inode) ||
-	    ext4_encrypted_inode(donor_inode)) {
+	if (IS_ENCRYPTED(orig_inode) || IS_ENCRYPTED(donor_inode)) {
 		ext4_msg(orig_inode->i_sb, KERN_ERR,
 			 "Online defrag not supported for encrypted files");
 		return -EOPNOTSUPP;
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 43dcb91..37cc47a 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -35,6 +35,7 @@
 #include <linux/buffer_head.h>
 #include <linux/bio.h>
 #include <linux/iversion.h>
+#include <linux/unicode.h>
 #include "ext4.h"
 #include "ext4_jbd2.h"
 
@@ -625,7 +626,7 @@
 		{
 			if (show_names)
 			{
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 				int len;
 				char *name;
 				struct fscrypt_str fname_crypto_str =
@@ -634,7 +635,7 @@
 
 				name  = de->name;
 				len = de->name_len;
-				if (ext4_encrypted_inode(dir))
+				if (IS_ENCRYPTED(dir))
 					res = fscrypt_get_encryption_info(dir);
 				if (res) {
 					printk(KERN_WARNING "Error setting up"
@@ -642,7 +643,7 @@
 				}
 				if (!fscrypt_has_encryption_key(dir)) {
 					/* Directory is not encrypted */
-					ext4fs_dirhash(de->name,
+					ext4fs_dirhash(dir, de->name,
 						de->name_len, &h);
 					printk("%*.s:(U)%x.%u ", len,
 					       name, h.hash,
@@ -675,8 +676,8 @@
 						name = fname_crypto_str.name;
 						len = fname_crypto_str.len;
 					}
-					ext4fs_dirhash(de->name, de->name_len,
-						       &h);
+					ext4fs_dirhash(dir, de->name,
+						       de->name_len, &h);
 					printk("%*.s:(E)%x.%u ", len, name,
 					       h.hash, (unsigned) ((char *) de
 								   - base));
@@ -686,7 +687,7 @@
 #else
 				int len = de->name_len;
 				char *name = de->name;
-				ext4fs_dirhash(de->name, de->name_len, &h);
+				ext4fs_dirhash(dir, de->name, de->name_len, &h);
 				printk("%*.s:%x.%u ", len, name, h.hash,
 				       (unsigned) ((char *) de - base));
 #endif
@@ -775,7 +776,7 @@
 		hinfo->hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned;
 	hinfo->seed = EXT4_SB(dir->i_sb)->s_hash_seed;
 	if (fname && fname_name(fname))
-		ext4fs_dirhash(fname_name(fname), fname_len(fname), hinfo);
+		ext4fs_dirhash(dir, fname_name(fname), fname_len(fname), hinfo);
 	hash = hinfo->hash;
 
 	if (root->info.unused_flags & 1) {
@@ -1000,9 +1001,9 @@
 	top = (struct ext4_dir_entry_2 *) ((char *) de +
 					   dir->i_sb->s_blocksize -
 					   EXT4_DIR_REC_LEN(0));
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	/* Check if the directory is encrypted */
-	if (ext4_encrypted_inode(dir)) {
+	if (IS_ENCRYPTED(dir)) {
 		err = fscrypt_get_encryption_info(dir);
 		if (err < 0) {
 			brelse(bh);
@@ -1024,14 +1025,14 @@
 			/* silently ignore the rest of the block */
 			break;
 		}
-		ext4fs_dirhash(de->name, de->name_len, hinfo);
+		ext4fs_dirhash(dir, de->name, de->name_len, hinfo);
 		if ((hinfo->hash < start_hash) ||
 		    ((hinfo->hash == start_hash) &&
 		     (hinfo->minor_hash < start_minor_hash)))
 			continue;
 		if (de->inode == 0)
 			continue;
-		if (!ext4_encrypted_inode(dir)) {
+		if (!IS_ENCRYPTED(dir)) {
 			tmp_str.name = de->name;
 			tmp_str.len = de->name_len;
 			err = ext4_htree_store_dirent(dir_file,
@@ -1063,7 +1064,7 @@
 	}
 errout:
 	brelse(bh);
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	fscrypt_fname_free_buffer(&fname_crypto_str);
 #endif
 	return count;
@@ -1213,7 +1214,7 @@
 
 	while ((char *) de < base + blocksize) {
 		if (de->name_len && de->inode) {
-			ext4fs_dirhash(de->name, de->name_len, &h);
+			ext4fs_dirhash(dir, de->name, de->name_len, &h);
 			map_tail--;
 			map_tail->hash = h.hash;
 			map_tail->offs = ((char *) de - base)>>2;
@@ -1268,24 +1269,105 @@
 	dx_set_count(entries, count + 1);
 }
 
+#ifdef CONFIG_UNICODE
+/*
+ * Test whether a case-insensitive directory entry matches the filename
+ * being searched for.  If quick is set, assume the name being looked up
+ * is already in the casefolded form.
+ *
+ * Returns: 0 if the directory entry matches, more than 0 if it
+ * doesn't match or less than zero on error.
+ */
+int ext4_ci_compare(const struct inode *parent, const struct qstr *name,
+		    const struct qstr *entry, bool quick)
+{
+	const struct ext4_sb_info *sbi = EXT4_SB(parent->i_sb);
+	const struct unicode_map *um = sbi->s_encoding;
+	int ret;
+
+	if (quick)
+		ret = utf8_strncasecmp_folded(um, name, entry);
+	else
+		ret = utf8_strncasecmp(um, name, entry);
+
+	if (ret < 0) {
+		/* Handle invalid character sequence as either an error
+		 * or as an opaque byte sequence.
+		 */
+		if (ext4_has_strict_mode(sbi))
+			return -EINVAL;
+
+		if (name->len != entry->len)
+			return 1;
+
+		return !!memcmp(name->name, entry->name, name->len);
+	}
+
+	return ret;
+}
+
+void ext4_fname_setup_ci_filename(struct inode *dir, const struct qstr *iname,
+				  struct fscrypt_str *cf_name)
+{
+	int len;
+
+	if (!IS_CASEFOLDED(dir) || !EXT4_SB(dir->i_sb)->s_encoding) {
+		cf_name->name = NULL;
+		return;
+	}
+
+	cf_name->name = kmalloc(EXT4_NAME_LEN, GFP_NOFS);
+	if (!cf_name->name)
+		return;
+
+	len = utf8_casefold(EXT4_SB(dir->i_sb)->s_encoding,
+			    iname, cf_name->name,
+			    EXT4_NAME_LEN);
+	if (len <= 0) {
+		kfree(cf_name->name);
+		cf_name->name = NULL;
+		return;
+	}
+	cf_name->len = (unsigned) len;
+
+}
+#endif
+
 /*
  * Test whether a directory entry matches the filename being searched for.
  *
  * Return: %true if the directory entry matches, otherwise %false.
  */
-static inline bool ext4_match(const struct ext4_filename *fname,
+static inline bool ext4_match(const struct inode *parent,
+			      const struct ext4_filename *fname,
 			      const struct ext4_dir_entry_2 *de)
 {
 	struct fscrypt_name f;
+#ifdef CONFIG_UNICODE
+	const struct qstr entry = {.name = de->name, .len = de->name_len};
+#endif
 
 	if (!de->inode)
 		return false;
 
 	f.usr_fname = fname->usr_fname;
 	f.disk_name = fname->disk_name;
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	f.crypto_buf = fname->crypto_buf;
 #endif
+
+#ifdef CONFIG_UNICODE
+	if (EXT4_SB(parent->i_sb)->s_encoding && IS_CASEFOLDED(parent)) {
+		if (fname->cf_name.name) {
+			struct qstr cf = {.name = fname->cf_name.name,
+					  .len = fname->cf_name.len};
+			return !ext4_ci_compare(parent, &cf, &entry, true);
+		}
+		return !ext4_ci_compare(parent, fname->usr_fname, &entry,
+					false);
+	}
+#endif
+
 	return fscrypt_match_name(&f, de->name, de->name_len);
 }
 
@@ -1306,7 +1388,7 @@
 		/* this code is executed quadratically often */
 		/* do minimal checking `by hand' */
 		if ((char *) de + de->name_len <= dlimit &&
-		    ext4_match(fname, de)) {
+		    ext4_match(dir, fname, de)) {
 			/* found a match - just to be sure, do
 			 * a full check */
 			if (ext4_check_dir_entry(dir, NULL, de, bh, bh->b_data,
@@ -1343,7 +1425,7 @@
 }
 
 /*
- *	ext4_find_entry()
+ *	__ext4_find_entry()
  *
  * finds an entry in the specified directory with the wanted name. It
  * returns the cache buffer in which the entry was found, and the entry
@@ -1353,39 +1435,32 @@
  * The returned buffer_head has ->b_count elevated.  The caller is expected
  * to brelse() it when appropriate.
  */
-static struct buffer_head * ext4_find_entry (struct inode *dir,
-					const struct qstr *d_name,
-					struct ext4_dir_entry_2 **res_dir,
-					int *inlined)
+static struct buffer_head *__ext4_find_entry(struct inode *dir,
+					     struct ext4_filename *fname,
+					     struct ext4_dir_entry_2 **res_dir,
+					     int *inlined)
 {
 	struct super_block *sb;
 	struct buffer_head *bh_use[NAMEI_RA_SIZE];
 	struct buffer_head *bh, *ret = NULL;
 	ext4_lblk_t start, block;
-	const u8 *name = d_name->name;
+	const u8 *name = fname->usr_fname->name;
 	size_t ra_max = 0;	/* Number of bh's in the readahead
 				   buffer, bh_use[] */
 	size_t ra_ptr = 0;	/* Current index into readahead
 				   buffer */
 	ext4_lblk_t  nblocks;
 	int i, namelen, retval;
-	struct ext4_filename fname;
 
 	*res_dir = NULL;
 	sb = dir->i_sb;
-	namelen = d_name->len;
+	namelen = fname->usr_fname->len;
 	if (namelen > EXT4_NAME_LEN)
 		return NULL;
 
-	retval = ext4_fname_setup_filename(dir, d_name, 1, &fname);
-	if (retval == -ENOENT)
-		return NULL;
-	if (retval)
-		return ERR_PTR(retval);
-
 	if (ext4_has_inline_data(dir)) {
 		int has_inline_data = 1;
-		ret = ext4_find_inline_entry(dir, &fname, res_dir,
+		ret = ext4_find_inline_entry(dir, fname, res_dir,
 					     &has_inline_data);
 		if (has_inline_data) {
 			if (inlined)
@@ -1405,7 +1480,7 @@
 		goto restart;
 	}
 	if (is_dx(dir)) {
-		ret = ext4_dx_find_entry(dir, &fname, res_dir);
+		ret = ext4_dx_find_entry(dir, fname, res_dir);
 		/*
 		 * On success, or if the error was file not found,
 		 * return.  Otherwise, fall back to doing a search the
@@ -1469,7 +1544,7 @@
 			goto cleanup_and_exit;
 		}
 		set_buffer_verified(bh);
-		i = search_dirblock(bh, dir, &fname,
+		i = search_dirblock(bh, dir, fname,
 			    block << EXT4_BLOCK_SIZE_BITS(sb), res_dir);
 		if (i == 1) {
 			EXT4_I(dir)->i_dir_start_lookup = block;
@@ -1500,10 +1575,50 @@
 	/* Clean up the read-ahead blocks */
 	for (; ra_ptr < ra_max; ra_ptr++)
 		brelse(bh_use[ra_ptr]);
-	ext4_fname_free_filename(&fname);
 	return ret;
 }
 
+static struct buffer_head *ext4_find_entry(struct inode *dir,
+					   const struct qstr *d_name,
+					   struct ext4_dir_entry_2 **res_dir,
+					   int *inlined)
+{
+	int err;
+	struct ext4_filename fname;
+	struct buffer_head *bh;
+
+	err = ext4_fname_setup_filename(dir, d_name, 1, &fname);
+	if (err == -ENOENT)
+		return NULL;
+	if (err)
+		return ERR_PTR(err);
+
+	bh = __ext4_find_entry(dir, &fname, res_dir, inlined);
+
+	ext4_fname_free_filename(&fname);
+	return bh;
+}
+
+static struct buffer_head *ext4_lookup_entry(struct inode *dir,
+					     struct dentry *dentry,
+					     struct ext4_dir_entry_2 **res_dir)
+{
+	int err;
+	struct ext4_filename fname;
+	struct buffer_head *bh;
+
+	err = ext4_fname_prepare_lookup(dir, dentry, &fname);
+	if (err == -ENOENT)
+		return NULL;
+	if (err)
+		return ERR_PTR(err);
+
+	bh = __ext4_find_entry(dir, &fname, res_dir, NULL);
+
+	ext4_fname_free_filename(&fname);
+	return bh;
+}
+
 static struct buffer_head * ext4_dx_find_entry(struct inode *dir,
 			struct ext4_filename *fname,
 			struct ext4_dir_entry_2 **res_dir)
@@ -1514,7 +1629,7 @@
 	ext4_lblk_t block;
 	int retval;
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	*res_dir = NULL;
 #endif
 	frame = dx_probe(fname, dir, NULL, frames);
@@ -1562,16 +1677,11 @@
 	struct inode *inode;
 	struct ext4_dir_entry_2 *de;
 	struct buffer_head *bh;
-	int err;
-
-	err = fscrypt_prepare_lookup(dir, dentry, flags);
-	if (err)
-		return ERR_PTR(err);
 
 	if (dentry->d_name.len > EXT4_NAME_LEN)
 		return ERR_PTR(-ENAMETOOLONG);
 
-	bh = ext4_find_entry(dir, &dentry->d_name, &de, NULL);
+	bh = ext4_lookup_entry(dir, dentry, &de);
 	if (IS_ERR(bh))
 		return (struct dentry *) bh;
 	inode = NULL;
@@ -1594,7 +1704,7 @@
 					 ino);
 			return ERR_PTR(-EFSCORRUPTED);
 		}
-		if (!IS_ERR(inode) && ext4_encrypted_inode(dir) &&
+		if (!IS_ERR(inode) && IS_ENCRYPTED(dir) &&
 		    (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
 		    !fscrypt_has_permitted_context(dir, inode)) {
 			ext4_warning(inode->i_sb,
@@ -1604,6 +1714,17 @@
 			return ERR_PTR(-EPERM);
 		}
 	}
+
+#ifdef CONFIG_UNICODE
+	if (!inode && IS_CASEFOLDED(dir)) {
+		/* Eventually we want to call d_add_ci(dentry, NULL)
+		 * for negative dentries in the encoding case as
+		 * well.  For now, prevent the negative dentry
+		 * from being cached.
+		 */
+		return NULL;
+	}
+#endif
 	return d_splice_alias(inode, dentry);
 }
 
@@ -1814,7 +1935,7 @@
 		if (ext4_check_dir_entry(dir, NULL, de, bh,
 					 buf, buf_size, offset))
 			return -EFSCORRUPTED;
-		if (ext4_match(fname, de))
+		if (ext4_match(dir, fname, de))
 			return -EEXIST;
 		nlen = EXT4_DIR_REC_LEN(de->name_len);
 		rlen = ext4_rec_len_from_disk(de->rec_len, buf_size);
@@ -1999,7 +2120,7 @@
 	if (fname->hinfo.hash_version <= DX_HASH_TEA)
 		fname->hinfo.hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned;
 	fname->hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;
-	ext4fs_dirhash(fname_name(fname), fname_len(fname), &fname->hinfo);
+	ext4fs_dirhash(dir, fname_name(fname), fname_len(fname), &fname->hinfo);
 
 	memset(frames, 0, sizeof(frames));
 	frame = frames;
@@ -2052,6 +2173,7 @@
 	struct ext4_dir_entry_2 *de;
 	struct ext4_dir_entry_tail *t;
 	struct super_block *sb;
+	struct ext4_sb_info *sbi;
 	struct ext4_filename fname;
 	int	retval;
 	int	dx_fallback=0;
@@ -2063,10 +2185,17 @@
 		csum_size = sizeof(struct ext4_dir_entry_tail);
 
 	sb = dir->i_sb;
+	sbi = EXT4_SB(sb);
 	blocksize = sb->s_blocksize;
 	if (!dentry->d_name.len)
 		return -EINVAL;
 
+#ifdef CONFIG_UNICODE
+	if (ext4_has_strict_mode(sbi) && IS_CASEFOLDED(dir) &&
+	    sbi->s_encoding && utf8_validate(sbi->s_encoding, &dentry->d_name))
+		return -EINVAL;
+#endif
+
 	retval = ext4_fname_setup_filename(dir, &dentry->d_name, 0, &fname);
 	if (retval)
 		return retval;
@@ -3008,6 +3137,17 @@
 	ext4_update_dx_flag(dir);
 	ext4_mark_inode_dirty(handle, dir);
 
+#ifdef CONFIG_UNICODE
+	/* VFS negative dentries are incompatible with Encoding and
+	 * Case-insensitiveness. Eventually we'll want avoid
+	 * invalidating the dentries here, alongside with returning the
+	 * negative dentries at ext4_lookup(), when it is better
+	 * supported by the VFS for the CI case.
+	 */
+	if (IS_CASEFOLDED(dir))
+		d_invalidate(dentry);
+#endif
+
 end_rmdir:
 	brelse(bh);
 	if (handle)
@@ -3076,6 +3216,17 @@
 	inode->i_ctime = current_time(inode);
 	ext4_mark_inode_dirty(handle, inode);
 
+#ifdef CONFIG_UNICODE
+	/* VFS negative dentries are incompatible with Encoding and
+	 * Case-insensitiveness. Eventually we'll want avoid
+	 * invalidating the dentries here, alongside with returning the
+	 * negative dentries at ext4_lookup(), when it is  better
+	 * supported by the VFS for the CI case.
+	 */
+	if (IS_CASEFOLDED(dir))
+		d_invalidate(dentry);
+#endif
+
 end_unlink:
 	brelse(bh);
 	if (handle)
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c
index db75901..9d547ba 100644
--- a/fs/ext4/page-io.c
+++ b/fs/ext4/page-io.c
@@ -66,9 +66,7 @@
 
 	bio_for_each_segment_all(bvec, bio, i) {
 		struct page *page = bvec->bv_page;
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-		struct page *data_page = NULL;
-#endif
+		struct page *bounce_page = NULL;
 		struct buffer_head *bh, *head;
 		unsigned bio_start = bvec->bv_offset;
 		unsigned bio_end = bio_start + bvec->bv_len;
@@ -78,13 +76,10 @@
 		if (!page)
 			continue;
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-		if (!page->mapping) {
-			/* The bounce data pages are unmapped. */
-			data_page = page;
-			fscrypt_pullback_bio_page(&page, false);
+		if (fscrypt_is_bounce_page(page)) {
+			bounce_page = page;
+			page = fscrypt_pagecache_page(bounce_page);
 		}
-#endif
 
 		if (bio->bi_status) {
 			SetPageError(page);
@@ -111,10 +106,7 @@
 		bit_spin_unlock(BH_Uptodate_Lock, &head->b_state);
 		local_irq_restore(flags);
 		if (!under_io) {
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-			if (data_page)
-				fscrypt_restore_control_page(data_page);
-#endif
+			fscrypt_free_bounce_page(bounce_page);
 			end_page_writeback(page);
 		}
 	}
@@ -370,10 +362,16 @@
 			      struct buffer_head *bh)
 {
 	struct bio *bio;
+	int err;
 
 	bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);
 	if (!bio)
 		return -ENOMEM;
+	err = fscrypt_set_bio_crypt_ctx_bh(bio, bh, GFP_NOIO);
+	if (err) {
+		bio_put(bio);
+		return err;
+	}
 	wbc_init_bio(io->io_wbc, bio);
 	bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);
 	bio_set_dev(bio, bh->b_bdev);
@@ -391,7 +389,8 @@
 {
 	int ret;
 
-	if (io->io_bio && bh->b_blocknr != io->io_next_block) {
+	if (io->io_bio && (bh->b_blocknr != io->io_next_block ||
+			   !fscrypt_mergeable_bio_bh(io->io_bio, bh))) {
 submit_and_retry:
 		ext4_io_submit(io);
 	}
@@ -415,7 +414,7 @@
 			struct writeback_control *wbc,
 			bool keep_towrite)
 {
-	struct page *data_page = NULL;
+	struct page *bounce_page = NULL;
 	struct inode *inode = page->mapping->host;
 	unsigned block_start;
 	struct buffer_head *bh, *head;
@@ -477,15 +476,14 @@
 
 	bh = head = page_buffers(page);
 
-	if (ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode) &&
-	    nr_to_submit) {
+	if (fscrypt_inode_uses_fs_layer_crypto(inode) && nr_to_submit) {
 		gfp_t gfp_flags = GFP_NOFS;
 
 	retry_encrypt:
-		data_page = fscrypt_encrypt_page(inode, page, PAGE_SIZE, 0,
-						page->index, gfp_flags);
-		if (IS_ERR(data_page)) {
-			ret = PTR_ERR(data_page);
+		bounce_page = fscrypt_encrypt_pagecache_blocks(page, PAGE_SIZE,
+							       0, gfp_flags);
+		if (IS_ERR(bounce_page)) {
+			ret = PTR_ERR(bounce_page);
 			if (ret == -ENOMEM && wbc->sync_mode == WB_SYNC_ALL) {
 				if (io->io_bio) {
 					ext4_io_submit(io);
@@ -494,7 +492,7 @@
 				gfp_flags |= __GFP_NOFAIL;
 				goto retry_encrypt;
 			}
-			data_page = NULL;
+			bounce_page = NULL;
 			goto out;
 		}
 	}
@@ -503,8 +501,7 @@
 	do {
 		if (!buffer_async_write(bh))
 			continue;
-		ret = io_submit_add_bh(io, inode,
-				       data_page ? data_page : page, bh);
+		ret = io_submit_add_bh(io, inode, bounce_page ?: page, bh);
 		if (ret) {
 			/*
 			 * We only get here on ENOMEM.  Not much else
@@ -520,8 +517,7 @@
 	/* Error stopped previous loop? Clean up buffers... */
 	if (ret) {
 	out:
-		if (data_page)
-			fscrypt_restore_control_page(data_page);
+		fscrypt_free_bounce_page(bounce_page);
 		printk_ratelimited(KERN_ERR "%s: ret = %d\n", __func__, ret);
 		redirty_page_for_writepage(wbc, page);
 		do {
diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c
index f461d75..19b5009 100644
--- a/fs/ext4/readpage.c
+++ b/fs/ext4/readpage.c
@@ -46,14 +46,116 @@
 #include <linux/cleancache.h>
 
 #include "ext4.h"
+#include <trace/events/android_fs.h>
 
-static inline bool ext4_bio_encrypted(struct bio *bio)
+#define NUM_PREALLOC_POST_READ_CTXS	128
+
+static struct kmem_cache *bio_post_read_ctx_cache;
+static mempool_t *bio_post_read_ctx_pool;
+
+/* postprocessing steps for read bios */
+enum bio_post_read_step {
+	STEP_INITIAL = 0,
+	STEP_DECRYPT,
+	STEP_VERITY,
+};
+
+struct bio_post_read_ctx {
+	struct bio *bio;
+	struct work_struct work;
+	unsigned int cur_step;
+	unsigned int enabled_steps;
+};
+
+static void __read_end_io(struct bio *bio)
 {
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-	return unlikely(bio->bi_private != NULL);
-#else
-	return false;
-#endif
+	struct page *page;
+	struct bio_vec *bv;
+	int i;
+
+	bio_for_each_segment_all(bv, bio, i) {
+		page = bv->bv_page;
+
+		/* PG_error was set if any post_read step failed */
+		if (bio->bi_status || PageError(page)) {
+			ClearPageUptodate(page);
+			/* will re-read again later */
+			ClearPageError(page);
+		} else {
+			SetPageUptodate(page);
+		}
+		unlock_page(page);
+	}
+	if (bio->bi_private)
+		mempool_free(bio->bi_private, bio_post_read_ctx_pool);
+	bio_put(bio);
+}
+
+static void bio_post_read_processing(struct bio_post_read_ctx *ctx);
+
+static void decrypt_work(struct work_struct *work)
+{
+	struct bio_post_read_ctx *ctx =
+		container_of(work, struct bio_post_read_ctx, work);
+
+	fscrypt_decrypt_bio(ctx->bio);
+
+	bio_post_read_processing(ctx);
+}
+
+static void verity_work(struct work_struct *work)
+{
+	struct bio_post_read_ctx *ctx =
+		container_of(work, struct bio_post_read_ctx, work);
+
+	fsverity_verify_bio(ctx->bio);
+
+	bio_post_read_processing(ctx);
+}
+
+static void bio_post_read_processing(struct bio_post_read_ctx *ctx)
+{
+	/*
+	 * We use different work queues for decryption and for verity because
+	 * verity may require reading metadata pages that need decryption, and
+	 * we shouldn't recurse to the same workqueue.
+	 */
+	switch (++ctx->cur_step) {
+	case STEP_DECRYPT:
+		if (ctx->enabled_steps & (1 << STEP_DECRYPT)) {
+			INIT_WORK(&ctx->work, decrypt_work);
+			fscrypt_enqueue_decrypt_work(&ctx->work);
+			return;
+		}
+		ctx->cur_step++;
+		/* fall-through */
+	case STEP_VERITY:
+		if (ctx->enabled_steps & (1 << STEP_VERITY)) {
+			INIT_WORK(&ctx->work, verity_work);
+			fsverity_enqueue_verify_work(&ctx->work);
+			return;
+		}
+		ctx->cur_step++;
+		/* fall-through */
+	default:
+		__read_end_io(ctx->bio);
+	}
+}
+
+static bool bio_post_read_required(struct bio *bio)
+{
+	return bio->bi_private && !bio->bi_status;
+}
+
+static void
+ext4_trace_read_completion(struct bio *bio)
+{
+	struct page *first_page = bio->bi_io_vec[0].bv_page;
+
+	if (first_page != NULL)
+		trace_android_fs_dataread_end(first_page->mapping->host,
+					      page_offset(first_page),
+					      bio->bi_iter.bi_size);
 }
 
 /*
@@ -70,30 +172,80 @@
  */
 static void mpage_end_io(struct bio *bio)
 {
-	struct bio_vec *bv;
-	int i;
+	if (trace_android_fs_dataread_start_enabled())
+		ext4_trace_read_completion(bio);
 
-	if (ext4_bio_encrypted(bio)) {
-		if (bio->bi_status) {
-			fscrypt_release_ctx(bio->bi_private);
-		} else {
-			fscrypt_enqueue_decrypt_bio(bio->bi_private, bio);
-			return;
+	if (bio_post_read_required(bio)) {
+		struct bio_post_read_ctx *ctx = bio->bi_private;
+
+		ctx->cur_step = STEP_INITIAL;
+		bio_post_read_processing(ctx);
+		return;
+	}
+	__read_end_io(bio);
+}
+
+static inline bool ext4_need_verity(const struct inode *inode, pgoff_t idx)
+{
+	return fsverity_active(inode) &&
+	       idx < DIV_ROUND_UP(inode->i_size, PAGE_SIZE);
+}
+
+static struct bio_post_read_ctx *get_bio_post_read_ctx(struct inode *inode,
+						       struct bio *bio,
+						       pgoff_t first_idx)
+{
+	unsigned int post_read_steps = 0;
+	struct bio_post_read_ctx *ctx = NULL;
+
+	if (fscrypt_inode_uses_fs_layer_crypto(inode))
+		post_read_steps |= 1 << STEP_DECRYPT;
+
+	if (ext4_need_verity(inode, first_idx))
+		post_read_steps |= 1 << STEP_VERITY;
+
+	if (post_read_steps) {
+		ctx = mempool_alloc(bio_post_read_ctx_pool, GFP_NOFS);
+		if (!ctx)
+			return ERR_PTR(-ENOMEM);
+		ctx->bio = bio;
+		ctx->enabled_steps = post_read_steps;
+		bio->bi_private = ctx;
+	}
+	return ctx;
+}
+
+static inline loff_t ext4_readpage_limit(struct inode *inode)
+{
+	if (IS_ENABLED(CONFIG_FS_VERITY) &&
+	    (IS_VERITY(inode) || ext4_verity_in_progress(inode)))
+		return inode->i_sb->s_maxbytes;
+
+	return i_size_read(inode);
+}
+
+static void
+ext4_submit_bio_read(struct bio *bio)
+{
+	if (trace_android_fs_dataread_start_enabled()) {
+		struct page *first_page = bio->bi_io_vec[0].bv_page;
+
+		if (first_page != NULL) {
+			char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+			path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    first_page->mapping->host);
+			trace_android_fs_dataread_start(
+				first_page->mapping->host,
+				page_offset(first_page),
+				bio->bi_iter.bi_size,
+				current->pid,
+				path,
+				current->comm);
 		}
 	}
-	bio_for_each_segment_all(bv, bio, i) {
-		struct page *page = bv->bv_page;
-
-		if (!bio->bi_status) {
-			SetPageUptodate(page);
-		} else {
-			ClearPageUptodate(page);
-			SetPageError(page);
-		}
-		unlock_page(page);
-	}
-
-	bio_put(bio);
+	submit_bio(bio);
 }
 
 int ext4_mpage_readpages(struct address_space *mapping,
@@ -107,6 +259,7 @@
 	const unsigned blkbits = inode->i_blkbits;
 	const unsigned blocks_per_page = PAGE_SIZE >> blkbits;
 	const unsigned blocksize = 1 << blkbits;
+	sector_t next_block;
 	sector_t block_in_file;
 	sector_t last_block;
 	sector_t last_block_in_file;
@@ -138,9 +291,11 @@
 		if (page_has_buffers(page))
 			goto confused;
 
-		block_in_file = (sector_t)page->index << (PAGE_SHIFT - blkbits);
+		block_in_file = next_block =
+			(sector_t)page->index << (PAGE_SHIFT - blkbits);
 		last_block = block_in_file + nr_pages * blocks_per_page;
-		last_block_in_file = (i_size_read(inode) + blocksize - 1) >> blkbits;
+		last_block_in_file = (ext4_readpage_limit(inode) +
+				      blocksize - 1) >> blkbits;
 		if (last_block > last_block_in_file)
 			last_block = last_block_in_file;
 		page_block = 0;
@@ -217,6 +372,9 @@
 			zero_user_segment(page, first_hole << blkbits,
 					  PAGE_SIZE);
 			if (first_hole == 0) {
+				if (ext4_need_verity(inode, page->index) &&
+				    !fsverity_verify_page(page))
+					goto set_error_page;
 				SetPageUptodate(page);
 				unlock_page(page);
 				goto next_page;
@@ -234,25 +392,29 @@
 		 * This page will go to BIO.  Do we need to send this
 		 * BIO off first?
 		 */
-		if (bio && (last_block_in_bio != blocks[0] - 1)) {
+		if (bio && (last_block_in_bio != blocks[0] - 1 ||
+			    !fscrypt_mergeable_bio(bio, inode, next_block))) {
 		submit_and_realloc:
-			submit_bio(bio);
+			ext4_submit_bio_read(bio);
 			bio = NULL;
 		}
 		if (bio == NULL) {
-			struct fscrypt_ctx *ctx = NULL;
+			struct bio_post_read_ctx *ctx;
 
-			if (ext4_encrypted_inode(inode) &&
-			    S_ISREG(inode->i_mode)) {
-				ctx = fscrypt_get_ctx(inode, GFP_NOFS);
-				if (IS_ERR(ctx))
-					goto set_error_page;
-			}
 			bio = bio_alloc(GFP_KERNEL,
 				min_t(int, nr_pages, BIO_MAX_PAGES));
-			if (!bio) {
-				if (ctx)
-					fscrypt_release_ctx(ctx);
+			if (!bio)
+				goto set_error_page;
+			if (fscrypt_set_bio_crypt_ctx(bio, inode, next_block,
+						      GFP_KERNEL) != 0) {
+				bio_put(bio);
+				bio = NULL;
+				goto set_error_page;
+			}
+			ctx = get_bio_post_read_ctx(inode, bio, page->index);
+			if (IS_ERR(ctx)) {
+				bio_put(bio);
+				bio = NULL;
 				goto set_error_page;
 			}
 			bio_set_dev(bio, bdev);
@@ -270,14 +432,14 @@
 		if (((map.m_flags & EXT4_MAP_BOUNDARY) &&
 		     (relative_block == map.m_len)) ||
 		    (first_hole != blocks_per_page)) {
-			submit_bio(bio);
+			ext4_submit_bio_read(bio);
 			bio = NULL;
 		} else
 			last_block_in_bio = blocks[blocks_per_page - 1];
 		goto next_page;
 	confused:
 		if (bio) {
-			submit_bio(bio);
+			ext4_submit_bio_read(bio);
 			bio = NULL;
 		}
 		if (!PageUptodate(page))
@@ -290,6 +452,32 @@
 	}
 	BUG_ON(pages && !list_empty(pages));
 	if (bio)
-		submit_bio(bio);
+		ext4_submit_bio_read(bio);
 	return 0;
 }
+
+int __init ext4_init_post_read_processing(void)
+{
+	bio_post_read_ctx_cache =
+		kmem_cache_create("ext4_bio_post_read_ctx",
+				  sizeof(struct bio_post_read_ctx), 0, 0, NULL);
+	if (!bio_post_read_ctx_cache)
+		goto fail;
+	bio_post_read_ctx_pool =
+		mempool_create_slab_pool(NUM_PREALLOC_POST_READ_CTXS,
+					 bio_post_read_ctx_cache);
+	if (!bio_post_read_ctx_pool)
+		goto fail_free_cache;
+	return 0;
+
+fail_free_cache:
+	kmem_cache_destroy(bio_post_read_ctx_cache);
+fail:
+	return -ENOMEM;
+}
+
+void ext4_exit_post_read_processing(void)
+{
+	mempool_destroy(bio_post_read_ctx_pool);
+	kmem_cache_destroy(bio_post_read_ctx_cache);
+}
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 1a8d57f..efcb091 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -42,6 +42,7 @@
 #include <linux/cleancache.h>
 #include <linux/uaccess.h>
 #include <linux/iversion.h>
+#include <linux/unicode.h>
 
 #include <linux/kthread.h>
 #include <linux/freezer.h>
@@ -1055,6 +1056,9 @@
 		crypto_free_shash(sbi->s_chksum_driver);
 	kfree(sbi->s_blockgroup_lock);
 	fs_put_dax(sbi->s_daxdev);
+#ifdef CONFIG_UNICODE
+	utf8_unload(sbi->s_encoding);
+#endif
 	kfree(sbi);
 }
 
@@ -1103,6 +1107,9 @@
 {
 	int drop = generic_drop_inode(inode);
 
+	if (!drop)
+		drop = fscrypt_drop_inode(inode);
+
 	trace_ext4_drop_inode(inode, drop);
 	return drop;
 }
@@ -1110,6 +1117,9 @@
 static void ext4_i_callback(struct rcu_head *head)
 {
 	struct inode *inode = container_of(head, struct inode, i_rcu);
+
+	fscrypt_free_inode(inode);
+
 	kmem_cache_free(ext4_inode_cachep, EXT4_I(inode));
 }
 
@@ -1176,6 +1186,7 @@
 		EXT4_I(inode)->jinode = NULL;
 	}
 	fscrypt_put_encryption_info(inode);
+	fsverity_cleanup_inode(inode);
 }
 
 static struct inode *ext4_nfs_get_inode(struct super_block *sb,
@@ -1242,7 +1253,7 @@
 	return try_to_free_buffers(page);
 }
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 static int ext4_get_context(struct inode *inode, void *ctx, size_t len)
 {
 	return ext4_xattr_get(inode, EXT4_XATTR_INDEX_ENCRYPTION,
@@ -1338,6 +1349,23 @@
 	return DUMMY_ENCRYPTION_ENABLED(EXT4_SB(inode->i_sb));
 }
 
+static bool ext4_has_stable_inodes(struct super_block *sb)
+{
+	return ext4_has_feature_stable_inodes(sb);
+}
+
+static void ext4_get_ino_and_lblk_bits(struct super_block *sb,
+				       int *ino_bits_ret, int *lblk_bits_ret)
+{
+	*ino_bits_ret = 8 * sizeof(EXT4_SB(sb)->s_es->s_inodes_count);
+	*lblk_bits_ret = 8 * sizeof(ext4_lblk_t);
+}
+
+static bool ext4_inline_crypt_enabled(struct super_block *sb)
+{
+	return test_opt(sb, INLINECRYPT);
+}
+
 static const struct fscrypt_operations ext4_cryptops = {
 	.key_prefix		= "ext4:",
 	.get_context		= ext4_get_context,
@@ -1345,6 +1373,9 @@
 	.dummy_context		= ext4_dummy_context,
 	.empty_dir		= ext4_empty_dir,
 	.max_namelen		= EXT4_NAME_LEN,
+	.has_stable_inodes	= ext4_has_stable_inodes,
+	.get_ino_and_lblk_bits	= ext4_get_ino_and_lblk_bits,
+	.inline_crypt_enabled	= ext4_inline_crypt_enabled,
 };
 #endif
 
@@ -1439,6 +1470,7 @@
 	Opt_journal_path, Opt_journal_checksum, Opt_journal_async_commit,
 	Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
 	Opt_data_err_abort, Opt_data_err_ignore, Opt_test_dummy_encryption,
+	Opt_inlinecrypt,
 	Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
 	Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_jqfmt_vfsv1, Opt_quota,
 	Opt_noquota, Opt_barrier, Opt_nobarrier, Opt_err,
@@ -1535,6 +1567,7 @@
 	{Opt_noinit_itable, "noinit_itable"},
 	{Opt_max_dir_size_kb, "max_dir_size_kb=%u"},
 	{Opt_test_dummy_encryption, "test_dummy_encryption"},
+	{Opt_inlinecrypt, "inlinecrypt"},
 	{Opt_nombcache, "nombcache"},
 	{Opt_nombcache, "no_mbcache"},	/* for backward compatibility */
 	{Opt_removed, "check=none"},	/* mount option from ext2/3 */
@@ -1746,10 +1779,45 @@
 	{Opt_jqfmt_vfsv1, QFMT_VFS_V1, MOPT_QFMT},
 	{Opt_max_dir_size_kb, 0, MOPT_GTE0},
 	{Opt_test_dummy_encryption, 0, MOPT_GTE0},
+#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
+	{Opt_inlinecrypt, EXT4_MOUNT_INLINECRYPT, MOPT_SET},
+#else
+	{Opt_inlinecrypt, EXT4_MOUNT_INLINECRYPT, MOPT_NOSUPPORT},
+#endif
 	{Opt_nombcache, EXT4_MOUNT_NO_MBCACHE, MOPT_SET},
 	{Opt_err, 0, 0}
 };
 
+#ifdef CONFIG_UNICODE
+static const struct ext4_sb_encodings {
+	__u16 magic;
+	char *name;
+	char *version;
+} ext4_sb_encoding_map[] = {
+	{EXT4_ENC_UTF8_12_1, "utf8", "12.1.0"},
+};
+
+static int ext4_sb_read_encoding(const struct ext4_super_block *es,
+				 const struct ext4_sb_encodings **encoding,
+				 __u16 *flags)
+{
+	__u16 magic = le16_to_cpu(es->s_encoding);
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(ext4_sb_encoding_map); i++)
+		if (magic == ext4_sb_encoding_map[i].magic)
+			break;
+
+	if (i >= ARRAY_SIZE(ext4_sb_encoding_map))
+		return -EINVAL;
+
+	*encoding = &ext4_sb_encoding_map[i];
+	*flags = le16_to_cpu(es->s_encoding_flags);
+
+	return 0;
+}
+#endif
+
 static int handle_mount_opt(struct super_block *sb, char *opt, int token,
 			    substring_t *args, unsigned long *journal_devnum,
 			    unsigned int *journal_ioprio, int is_remount)
@@ -1932,7 +2000,7 @@
 		*journal_ioprio =
 			IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, arg);
 	} else if (token == Opt_test_dummy_encryption) {
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 		sbi->s_mount_flags |= EXT4_MF_TEST_DUMMY_ENCRYPTION;
 		ext4_msg(sb, KERN_WARNING,
 			 "Test dummy encryption mode enabled");
@@ -2880,6 +2948,15 @@
 		return 0;
 	}
 
+#ifndef CONFIG_UNICODE
+	if (ext4_has_feature_casefold(sb)) {
+		ext4_msg(sb, KERN_ERR,
+			 "Filesystem with casefold feature cannot be "
+			 "mounted without CONFIG_UNICODE");
+		return 0;
+	}
+#endif
+
 	if (readonly)
 		return 1;
 
@@ -3773,6 +3850,43 @@
 			   &journal_ioprio, 0))
 		goto failed_mount;
 
+#ifdef CONFIG_UNICODE
+	if (ext4_has_feature_casefold(sb) && !sbi->s_encoding) {
+		const struct ext4_sb_encodings *encoding_info;
+		struct unicode_map *encoding;
+		__u16 encoding_flags;
+
+		if (ext4_has_feature_encrypt(sb)) {
+			ext4_msg(sb, KERN_ERR,
+				 "Can't mount with encoding and encryption");
+			goto failed_mount;
+		}
+
+		if (ext4_sb_read_encoding(es, &encoding_info,
+					  &encoding_flags)) {
+			ext4_msg(sb, KERN_ERR,
+				 "Encoding requested by superblock is unknown");
+			goto failed_mount;
+		}
+
+		encoding = utf8_load(encoding_info->version);
+		if (IS_ERR(encoding)) {
+			ext4_msg(sb, KERN_ERR,
+				 "can't mount with superblock charset: %s-%s "
+				 "not supported by the kernel. flags: 0x%x.",
+				 encoding_info->name, encoding_info->version,
+				 encoding_flags);
+			goto failed_mount;
+		}
+		ext4_msg(sb, KERN_INFO,"Using encoding defined by superblock: "
+			 "%s-%s with flags 0x%hx", encoding_info->name,
+			 encoding_info->version?:"\b", encoding_flags);
+
+		sbi->s_encoding = encoding;
+		sbi->s_encoding_flags = encoding_flags;
+	}
+#endif
+
 	if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) {
 		printk_once(KERN_WARNING "EXT4-fs: Warning: mounting "
 			    "with data=journal disables delayed "
@@ -4210,9 +4324,12 @@
 	sb->s_op = &ext4_sops;
 	sb->s_export_op = &ext4_export_ops;
 	sb->s_xattr = ext4_xattr_handlers;
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	sb->s_cop = &ext4_cryptops;
 #endif
+#ifdef CONFIG_FS_VERITY
+	sb->s_vop = &ext4_verityops;
+#endif
 #ifdef CONFIG_QUOTA
 	sb->dq_op = &ext4_quota_operations;
 	if (ext4_has_feature_quota(sb))
@@ -4360,6 +4477,11 @@
 		goto failed_mount_wq;
 	}
 
+	if (ext4_has_feature_verity(sb) && blocksize != PAGE_SIZE) {
+		ext4_msg(sb, KERN_ERR, "Unsupported blocksize for fs-verity");
+		goto failed_mount_wq;
+	}
+
 	if (DUMMY_ENCRYPTION_ENABLED(sbi) && !sb_rdonly(sb) &&
 	    !ext4_has_feature_encrypt(sb)) {
 		ext4_set_feature_encrypt(sb);
@@ -4407,6 +4529,12 @@
 		iput(root);
 		goto failed_mount4;
 	}
+
+#ifdef CONFIG_UNICODE
+	if (sbi->s_encoding)
+		sb->s_d_op = &ext4_dentry_ops;
+#endif
+
 	sb->s_root = d_make_root(root);
 	if (!sb->s_root) {
 		ext4_msg(sb, KERN_ERR, "get root dentry failed");
@@ -4591,6 +4719,11 @@
 failed_mount:
 	if (sbi->s_chksum_driver)
 		crypto_free_shash(sbi->s_chksum_driver);
+
+#ifdef CONFIG_UNICODE
+	utf8_unload(sbi->s_encoding);
+#endif
+
 #ifdef CONFIG_QUOTA
 	for (i = 0; i < EXT4_MAXQUOTAS; i++)
 		kfree(sbi->s_qf_names[i]);
@@ -6025,6 +6158,10 @@
 	if (err)
 		return err;
 
+	err = ext4_init_post_read_processing();
+	if (err)
+		goto out6;
+
 	err = ext4_init_pageio();
 	if (err)
 		goto out5;
@@ -6063,6 +6200,8 @@
 out4:
 	ext4_exit_pageio();
 out5:
+	ext4_exit_post_read_processing();
+out6:
 	ext4_exit_es();
 
 	return err;
@@ -6079,6 +6218,7 @@
 	ext4_exit_sysfs();
 	ext4_exit_system_zone();
 	ext4_exit_pageio();
+	ext4_exit_post_read_processing();
 	ext4_exit_es();
 }
 
diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c
index 9212a02..1eecc3c 100644
--- a/fs/ext4/sysfs.c
+++ b/fs/ext4/sysfs.c
@@ -224,18 +224,30 @@
 EXT4_ATTR_FEATURE(lazy_itable_init);
 EXT4_ATTR_FEATURE(batched_discard);
 EXT4_ATTR_FEATURE(meta_bg_resize);
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 EXT4_ATTR_FEATURE(encryption);
 #endif
+#ifdef CONFIG_UNICODE
+EXT4_ATTR_FEATURE(casefold);
+#endif
+#ifdef CONFIG_FS_VERITY
+EXT4_ATTR_FEATURE(verity);
+#endif
 EXT4_ATTR_FEATURE(metadata_csum_seed);
 
 static struct attribute *ext4_feat_attrs[] = {
 	ATTR_LIST(lazy_itable_init),
 	ATTR_LIST(batched_discard),
 	ATTR_LIST(meta_bg_resize),
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	ATTR_LIST(encryption),
 #endif
+#ifdef CONFIG_UNICODE
+	ATTR_LIST(casefold),
+#endif
+#ifdef CONFIG_FS_VERITY
+	ATTR_LIST(verity),
+#endif
 	ATTR_LIST(metadata_csum_seed),
 	NULL,
 };
diff --git a/fs/ext4/verity.c b/fs/ext4/verity.c
new file mode 100644
index 0000000..d0d8a97
--- /dev/null
+++ b/fs/ext4/verity.c
@@ -0,0 +1,367 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * fs/ext4/verity.c: fs-verity support for ext4
+ *
+ * Copyright 2019 Google LLC
+ */
+
+/*
+ * Implementation of fsverity_operations for ext4.
+ *
+ * ext4 stores the verity metadata (Merkle tree and fsverity_descriptor) past
+ * the end of the file, starting at the first 64K boundary beyond i_size.  This
+ * approach works because (a) verity files are readonly, and (b) pages fully
+ * beyond i_size aren't visible to userspace but can be read/written internally
+ * by ext4 with only some relatively small changes to ext4.  This approach
+ * avoids having to depend on the EA_INODE feature and on rearchitecturing
+ * ext4's xattr support to support paging multi-gigabyte xattrs into memory, and
+ * to support encrypting xattrs.  Note that the verity metadata *must* be
+ * encrypted when the file is, since it contains hashes of the plaintext data.
+ *
+ * Using a 64K boundary rather than a 4K one keeps things ready for
+ * architectures with 64K pages, and it doesn't necessarily waste space on-disk
+ * since there can be a hole between i_size and the start of the Merkle tree.
+ */
+
+#include <linux/quotaops.h>
+
+#include "ext4.h"
+#include "ext4_extents.h"
+#include "ext4_jbd2.h"
+
+static inline loff_t ext4_verity_metadata_pos(const struct inode *inode)
+{
+	return round_up(inode->i_size, 65536);
+}
+
+/*
+ * Read some verity metadata from the inode.  __vfs_read() can't be used because
+ * we need to read beyond i_size.
+ */
+static int pagecache_read(struct inode *inode, void *buf, size_t count,
+			  loff_t pos)
+{
+	while (count) {
+		size_t n = min_t(size_t, count,
+				 PAGE_SIZE - offset_in_page(pos));
+		struct page *page;
+		void *addr;
+
+		page = read_mapping_page(inode->i_mapping, pos >> PAGE_SHIFT,
+					 NULL);
+		if (IS_ERR(page))
+			return PTR_ERR(page);
+
+		addr = kmap_atomic(page);
+		memcpy(buf, addr + offset_in_page(pos), n);
+		kunmap_atomic(addr);
+
+		put_page(page);
+
+		buf += n;
+		pos += n;
+		count -= n;
+	}
+	return 0;
+}
+
+/*
+ * Write some verity metadata to the inode for FS_IOC_ENABLE_VERITY.
+ * kernel_write() can't be used because the file descriptor is readonly.
+ */
+static int pagecache_write(struct inode *inode, const void *buf, size_t count,
+			   loff_t pos)
+{
+	if (pos + count > inode->i_sb->s_maxbytes)
+		return -EFBIG;
+
+	while (count) {
+		size_t n = min_t(size_t, count,
+				 PAGE_SIZE - offset_in_page(pos));
+		struct page *page;
+		void *fsdata;
+		void *addr;
+		int res;
+
+		res = pagecache_write_begin(NULL, inode->i_mapping, pos, n, 0,
+					    &page, &fsdata);
+		if (res)
+			return res;
+
+		addr = kmap_atomic(page);
+		memcpy(addr + offset_in_page(pos), buf, n);
+		kunmap_atomic(addr);
+
+		res = pagecache_write_end(NULL, inode->i_mapping, pos, n, n,
+					  page, fsdata);
+		if (res < 0)
+			return res;
+		if (res != n)
+			return -EIO;
+
+		buf += n;
+		pos += n;
+		count -= n;
+	}
+	return 0;
+}
+
+static int ext4_begin_enable_verity(struct file *filp)
+{
+	struct inode *inode = file_inode(filp);
+	const int credits = 2; /* superblock and inode for ext4_orphan_add() */
+	handle_t *handle;
+	int err;
+
+	if (ext4_verity_in_progress(inode))
+		return -EBUSY;
+
+	/*
+	 * Since the file was opened readonly, we have to initialize the jbd
+	 * inode and quotas here and not rely on ->open() doing it.  This must
+	 * be done before evicting the inline data.
+	 */
+
+	err = ext4_inode_attach_jinode(inode);
+	if (err)
+		return err;
+
+	err = dquot_initialize(inode);
+	if (err)
+		return err;
+
+	err = ext4_convert_inline_data(inode);
+	if (err)
+		return err;
+
+	if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) {
+		ext4_warning_inode(inode,
+				   "verity is only allowed on extent-based files");
+		return -EOPNOTSUPP;
+	}
+
+	/*
+	 * ext4 uses the last allocated block to find the verity descriptor, so
+	 * we must remove any other blocks past EOF which might confuse things.
+	 */
+	err = ext4_truncate(inode);
+	if (err)
+		return err;
+
+	handle = ext4_journal_start(inode, EXT4_HT_INODE, credits);
+	if (IS_ERR(handle))
+		return PTR_ERR(handle);
+
+	err = ext4_orphan_add(handle, inode);
+	if (err == 0)
+		ext4_set_inode_state(inode, EXT4_STATE_VERITY_IN_PROGRESS);
+
+	ext4_journal_stop(handle);
+	return err;
+}
+
+/*
+ * ext4 stores the verity descriptor beginning on the next filesystem block
+ * boundary after the Merkle tree.  Then, the descriptor size is stored in the
+ * last 4 bytes of the last allocated filesystem block --- which is either the
+ * block in which the descriptor ends, or the next block after that if there
+ * weren't at least 4 bytes remaining.
+ *
+ * We can't simply store the descriptor in an xattr because it *must* be
+ * encrypted when ext4 encryption is used, but ext4 encryption doesn't encrypt
+ * xattrs.  Also, if the descriptor includes a large signature blob it may be
+ * too large to store in an xattr without the EA_INODE feature.
+ */
+static int ext4_write_verity_descriptor(struct inode *inode, const void *desc,
+					size_t desc_size, u64 merkle_tree_size)
+{
+	const u64 desc_pos = round_up(ext4_verity_metadata_pos(inode) +
+				      merkle_tree_size, i_blocksize(inode));
+	const u64 desc_end = desc_pos + desc_size;
+	const __le32 desc_size_disk = cpu_to_le32(desc_size);
+	const u64 desc_size_pos = round_up(desc_end + sizeof(desc_size_disk),
+					   i_blocksize(inode)) -
+				  sizeof(desc_size_disk);
+	int err;
+
+	err = pagecache_write(inode, desc, desc_size, desc_pos);
+	if (err)
+		return err;
+
+	return pagecache_write(inode, &desc_size_disk, sizeof(desc_size_disk),
+			       desc_size_pos);
+}
+
+static int ext4_end_enable_verity(struct file *filp, const void *desc,
+				  size_t desc_size, u64 merkle_tree_size)
+{
+	struct inode *inode = file_inode(filp);
+	const int credits = 2; /* superblock and inode for ext4_orphan_del() */
+	handle_t *handle;
+	int err = 0;
+	int err2;
+
+	if (desc != NULL) {
+		/* Succeeded; write the verity descriptor. */
+		err = ext4_write_verity_descriptor(inode, desc, desc_size,
+						   merkle_tree_size);
+
+		/* Write all pages before clearing VERITY_IN_PROGRESS. */
+		if (!err)
+			err = filemap_write_and_wait(inode->i_mapping);
+	}
+
+	/* If we failed, truncate anything we wrote past i_size. */
+	if (desc == NULL || err)
+		ext4_truncate(inode);
+
+	/*
+	 * We must always clean up by clearing EXT4_STATE_VERITY_IN_PROGRESS and
+	 * deleting the inode from the orphan list, even if something failed.
+	 * If everything succeeded, we'll also set the verity bit in the same
+	 * transaction.
+	 */
+
+	ext4_clear_inode_state(inode, EXT4_STATE_VERITY_IN_PROGRESS);
+
+	handle = ext4_journal_start(inode, EXT4_HT_INODE, credits);
+	if (IS_ERR(handle)) {
+		ext4_orphan_del(NULL, inode);
+		return PTR_ERR(handle);
+	}
+
+	err2 = ext4_orphan_del(handle, inode);
+	if (err2)
+		goto out_stop;
+
+	if (desc != NULL && !err) {
+		struct ext4_iloc iloc;
+
+		err = ext4_reserve_inode_write(handle, inode, &iloc);
+		if (err)
+			goto out_stop;
+		ext4_set_inode_flag(inode, EXT4_INODE_VERITY);
+		ext4_set_inode_flags(inode);
+		err = ext4_mark_iloc_dirty(handle, inode, &iloc);
+	}
+out_stop:
+	ext4_journal_stop(handle);
+	return err ?: err2;
+}
+
+static int ext4_get_verity_descriptor_location(struct inode *inode,
+					       size_t *desc_size_ret,
+					       u64 *desc_pos_ret)
+{
+	struct ext4_ext_path *path;
+	struct ext4_extent *last_extent;
+	u32 end_lblk;
+	u64 desc_size_pos;
+	__le32 desc_size_disk;
+	u32 desc_size;
+	u64 desc_pos;
+	int err;
+
+	/*
+	 * Descriptor size is in last 4 bytes of last allocated block.
+	 * See ext4_write_verity_descriptor().
+	 */
+
+	if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) {
+		EXT4_ERROR_INODE(inode, "verity file doesn't use extents");
+		return -EFSCORRUPTED;
+	}
+
+	path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0);
+	if (IS_ERR(path))
+		return PTR_ERR(path);
+
+	last_extent = path[path->p_depth].p_ext;
+	if (!last_extent) {
+		EXT4_ERROR_INODE(inode, "verity file has no extents");
+		ext4_ext_drop_refs(path);
+		kfree(path);
+		return -EFSCORRUPTED;
+	}
+
+	end_lblk = le32_to_cpu(last_extent->ee_block) +
+		   ext4_ext_get_actual_len(last_extent);
+	desc_size_pos = (u64)end_lblk << inode->i_blkbits;
+	ext4_ext_drop_refs(path);
+	kfree(path);
+
+	if (desc_size_pos < sizeof(desc_size_disk))
+		goto bad;
+	desc_size_pos -= sizeof(desc_size_disk);
+
+	err = pagecache_read(inode, &desc_size_disk, sizeof(desc_size_disk),
+			     desc_size_pos);
+	if (err)
+		return err;
+	desc_size = le32_to_cpu(desc_size_disk);
+
+	/*
+	 * The descriptor is stored just before the desc_size_disk, but starting
+	 * on a filesystem block boundary.
+	 */
+
+	if (desc_size > INT_MAX || desc_size > desc_size_pos)
+		goto bad;
+
+	desc_pos = round_down(desc_size_pos - desc_size, i_blocksize(inode));
+	if (desc_pos < ext4_verity_metadata_pos(inode))
+		goto bad;
+
+	*desc_size_ret = desc_size;
+	*desc_pos_ret = desc_pos;
+	return 0;
+
+bad:
+	EXT4_ERROR_INODE(inode, "verity file corrupted; can't find descriptor");
+	return -EFSCORRUPTED;
+}
+
+static int ext4_get_verity_descriptor(struct inode *inode, void *buf,
+				      size_t buf_size)
+{
+	size_t desc_size = 0;
+	u64 desc_pos = 0;
+	int err;
+
+	err = ext4_get_verity_descriptor_location(inode, &desc_size, &desc_pos);
+	if (err)
+		return err;
+
+	if (buf_size) {
+		if (desc_size > buf_size)
+			return -ERANGE;
+		err = pagecache_read(inode, buf, desc_size, desc_pos);
+		if (err)
+			return err;
+	}
+	return desc_size;
+}
+
+static struct page *ext4_read_merkle_tree_page(struct inode *inode,
+					       pgoff_t index)
+{
+	index += ext4_verity_metadata_pos(inode) >> PAGE_SHIFT;
+
+	return read_mapping_page(inode->i_mapping, index, NULL);
+}
+
+static int ext4_write_merkle_tree_block(struct inode *inode, const void *buf,
+					u64 index, int log_blocksize)
+{
+	loff_t pos = ext4_verity_metadata_pos(inode) + (index << log_blocksize);
+
+	return pagecache_write(inode, buf, 1 << log_blocksize, pos);
+}
+
+const struct fsverity_operations ext4_verityops = {
+	.begin_enable_verity	= ext4_begin_enable_verity,
+	.end_enable_verity	= ext4_end_enable_verity,
+	.get_verity_descriptor	= ext4_get_verity_descriptor,
+	.read_merkle_tree_page	= ext4_read_merkle_tree_page,
+	.write_merkle_tree_block = ext4_write_merkle_tree_block,
+};
diff --git a/fs/f2fs/Kconfig b/fs/f2fs/Kconfig
index 9a20ef42..f3414f2 100644
--- a/fs/f2fs/Kconfig
+++ b/fs/f2fs/Kconfig
@@ -1,8 +1,10 @@
 config F2FS_FS
 	tristate "F2FS filesystem support"
 	depends on BLOCK
+	select NLS
 	select CRYPTO
 	select CRYPTO_CRC32
+	select F2FS_FS_XATTR if FS_ENCRYPTION
 	help
 	  F2FS is based on Log-structured File System (LFS), which supports
 	  versatile "flash-friendly" features. The design has been focused on
@@ -58,7 +60,9 @@
 	  Security Models (LSMs) accepted by AppArmor, SELinux, Smack and TOMOYO
 	  Linux. This option enables an extended attribute handler for file
 	  security labels in the f2fs filesystem, so that it requires enabling
-	  the extended attribute support in advance.
+	  the extended attribute support in advance. In particular you need this
+	  option if you use the setcap command to assign initial process capabi-
+	  lities to executables (the security.* extended attributes).
 
 	  If you are not using a security module, say N.
 
@@ -73,13 +77,11 @@
 config F2FS_FS_ENCRYPTION
 	bool "F2FS Encryption"
 	depends on F2FS_FS
-	depends on F2FS_FS_XATTR
 	select FS_ENCRYPTION
 	help
-	  Enable encryption of f2fs files and directories.  This
-	  feature is similar to ecryptfs, but it is more memory
-	  efficient since it avoids caching the encrypted and
-	  decrypted pages in the page cache.
+	  This kconfig symbol is deprecated; now it just selects
+	  FS_ENCRYPTION.  Use CONFIG_FS_ENCRYPTION=y in new config
+	  files.
 
 config F2FS_IO_TRACE
 	bool "F2FS IO tracer"
diff --git a/fs/f2fs/Makefile b/fs/f2fs/Makefile
index 776c4b9..2aaecc6 100644
--- a/fs/f2fs/Makefile
+++ b/fs/f2fs/Makefile
@@ -8,3 +8,4 @@
 f2fs-$(CONFIG_F2FS_FS_XATTR) += xattr.o
 f2fs-$(CONFIG_F2FS_FS_POSIX_ACL) += acl.o
 f2fs-$(CONFIG_F2FS_IO_TRACE) += trace.o
+f2fs-$(CONFIG_FS_VERITY) += verity.o
diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c
index b9fe937..217b290 100644
--- a/fs/f2fs/acl.c
+++ b/fs/f2fs/acl.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/acl.c
  *
@@ -7,10 +8,6 @@
  * Portions of this code from linux/fs/ext2/acl.c
  *
  * Copyright (C) 2001-2003 Andreas Gruenbacher, <agruen@suse.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/f2fs_fs.h>
 #include "f2fs.h"
@@ -53,6 +50,9 @@
 	struct f2fs_acl_entry *entry = (struct f2fs_acl_entry *)(hdr + 1);
 	const char *end = value + size;
 
+	if (size < sizeof(struct f2fs_acl_header))
+		return ERR_PTR(-EINVAL);
+
 	if (hdr->a_version != cpu_to_le32(F2FS_ACL_VERSION))
 		return ERR_PTR(-EINVAL);
 
@@ -160,7 +160,7 @@
 	return (void *)f2fs_acl;
 
 fail:
-	kfree(f2fs_acl);
+	kvfree(f2fs_acl);
 	return ERR_PTR(-EINVAL);
 }
 
@@ -190,7 +190,7 @@
 		acl = NULL;
 	else
 		acl = ERR_PTR(retval);
-	kfree(value);
+	kvfree(value);
 
 	return acl;
 }
@@ -240,7 +240,7 @@
 
 	error = f2fs_setxattr(inode, name_index, "", value, size, ipage, 0);
 
-	kfree(value);
+	kvfree(value);
 	if (!error)
 		set_cached_acl(inode, type, acl);
 
@@ -285,7 +285,7 @@
 	/* assert(atomic_read(acl->a_refcount) == 1); */
 
 	FOREACH_ACL_ENTRY(pa, acl, pe) {
-		switch(pa->e_tag) {
+		switch (pa->e_tag) {
 		case ACL_USER_OBJ:
 			pa->e_perm &= (mode >> 6) | ~S_IRWXO;
 			mode &= (pa->e_perm << 6) | ~S_IRWXU;
@@ -326,7 +326,7 @@
 	}
 
 	*mode_p = (*mode_p & ~S_IRWXUGO) | mode;
-        return not_equiv;
+	return not_equiv;
 }
 
 static int f2fs_acl_create(struct inode *dir, umode_t *mode,
@@ -396,12 +396,16 @@
 		error = __f2fs_set_acl(inode, ACL_TYPE_DEFAULT, default_acl,
 				       ipage);
 		posix_acl_release(default_acl);
+	} else {
+		inode->i_default_acl = NULL;
 	}
 	if (acl) {
 		if (!error)
 			error = __f2fs_set_acl(inode, ACL_TYPE_ACCESS, acl,
 					       ipage);
 		posix_acl_release(acl);
+	} else {
+		inode->i_acl = NULL;
 	}
 
 	return error;
diff --git a/fs/f2fs/acl.h b/fs/f2fs/acl.h
index 2c68518..b96823c 100644
--- a/fs/f2fs/acl.h
+++ b/fs/f2fs/acl.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/acl.h
  *
@@ -7,10 +8,6 @@
  * Portions of this code from linux/fs/ext2/acl.h
  *
  * Copyright (C) 2001-2003 Andreas Gruenbacher, <agruen@suse.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #ifndef __F2FS_ACL_H__
 #define __F2FS_ACL_H__
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index 388500e..ffdaba0 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/checkpoint.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/bio.h>
@@ -47,7 +44,7 @@
 		cond_resched();
 		goto repeat;
 	}
-	f2fs_wait_on_page_writeback(page, META, true);
+	f2fs_wait_on_page_writeback(page, META, true, true);
 	if (!PageUptodate(page))
 		SetPageUptodate(page);
 	return page;
@@ -69,7 +66,7 @@
 		.old_blkaddr = index,
 		.new_blkaddr = index,
 		.encrypted_page = NULL,
-		.is_meta = is_meta,
+		.is_por = !is_meta,
 	};
 	int err;
 
@@ -122,11 +119,8 @@
 		if (PTR_ERR(page) == -EIO &&
 				++count <= DEFAULT_RETRY_IO_COUNT)
 			goto retry;
-
 		f2fs_stop_checkpoint(sbi, false);
-		f2fs_bug_on(sbi, 1);
 	}
-
 	return page;
 }
 
@@ -136,6 +130,30 @@
 	return __get_meta_page(sbi, index, false);
 }
 
+static bool __is_bitmap_valid(struct f2fs_sb_info *sbi, block_t blkaddr,
+							int type)
+{
+	struct seg_entry *se;
+	unsigned int segno, offset;
+	bool exist;
+
+	if (type != DATA_GENERIC_ENHANCE && type != DATA_GENERIC_ENHANCE_READ)
+		return true;
+
+	segno = GET_SEGNO(sbi, blkaddr);
+	offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr);
+	se = get_seg_entry(sbi, segno);
+
+	exist = f2fs_test_bit(offset, se->cur_valid_map);
+	if (!exist && type == DATA_GENERIC_ENHANCE) {
+		f2fs_err(sbi, "Inconsistent error blkaddr:%u, sit bitmap:%d",
+			 blkaddr, exist);
+		set_sbi_flag(sbi, SBI_NEED_FSCK);
+		WARN_ON(1);
+	}
+	return exist;
+}
+
 bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi,
 					block_t blkaddr, int type)
 {
@@ -157,15 +175,22 @@
 			return false;
 		break;
 	case META_POR:
-	case DATA_GENERIC:
 		if (unlikely(blkaddr >= MAX_BLKADDR(sbi) ||
-			blkaddr < MAIN_BLKADDR(sbi))) {
-			if (type == DATA_GENERIC) {
-				f2fs_msg(sbi->sb, KERN_WARNING,
-					"access invalid blkaddr:%u", blkaddr);
-				WARN_ON(1);
-			}
+			blkaddr < MAIN_BLKADDR(sbi)))
 			return false;
+		break;
+	case DATA_GENERIC:
+	case DATA_GENERIC_ENHANCE:
+	case DATA_GENERIC_ENHANCE_READ:
+		if (unlikely(blkaddr >= MAX_BLKADDR(sbi) ||
+				blkaddr < MAIN_BLKADDR(sbi))) {
+			f2fs_warn(sbi, "access invalid blkaddr:%u",
+				  blkaddr);
+			set_sbi_flag(sbi, SBI_NEED_FSCK);
+			WARN_ON(1);
+			return false;
+		} else {
+			return __is_bitmap_valid(sbi, blkaddr, type);
 		}
 		break;
 	case META_GENERIC:
@@ -195,7 +220,7 @@
 		.op_flags = sync ? (REQ_META | REQ_PRIO) : REQ_RAHEAD,
 		.encrypted_page = NULL,
 		.in_list = false,
-		.is_meta = (type != META_POR),
+		.is_por = (type == META_POR),
 	};
 	struct blk_plug plug;
 
@@ -282,8 +307,7 @@
 	dec_page_count(sbi, F2FS_DIRTY_META);
 
 	if (wbc->for_reclaim)
-		f2fs_submit_merged_write_cond(sbi, page->mapping->host,
-						0, page->index, META);
+		f2fs_submit_merged_write_cond(sbi, NULL, page, 0, META);
 
 	unlock_page(page);
 
@@ -313,8 +337,9 @@
 		goto skip_write;
 
 	/* collect a number of dirty meta pages and write together */
-	if (wbc->for_kupdate ||
-		get_pages(sbi, F2FS_DIRTY_META) < nr_pages_to_skip(sbi, META))
+	if (wbc->sync_mode != WB_SYNC_ALL &&
+			get_pages(sbi, F2FS_DIRTY_META) <
+					nr_pages_to_skip(sbi, META))
 		goto skip_write;
 
 	/* if locked failed, cp will flush dirty pages instead */
@@ -377,9 +402,8 @@
 				goto continue_unlock;
 			}
 
-			f2fs_wait_on_page_writeback(page, META, true);
+			f2fs_wait_on_page_writeback(page, META, true, true);
 
-			BUG_ON(PageWriteback(page));
 			if (!clear_page_dirty_for_io(page))
 				goto continue_unlock;
 
@@ -413,7 +437,7 @@
 	if (!PageDirty(page)) {
 		__set_page_dirty_nobuffers(page);
 		inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_META);
-		SetPagePrivate(page);
+		f2fs_set_page_private(page, 0);
 		f2fs_trace_pid(page);
 		return 1;
 	}
@@ -557,7 +581,7 @@
 
 	if (time_to_inject(sbi, FAULT_ORPHAN)) {
 		spin_unlock(&im->ino_lock);
-		f2fs_show_injection_info(FAULT_ORPHAN);
+		f2fs_show_injection_info(sbi, FAULT_ORPHAN);
 		return -ENOSPC;
 	}
 
@@ -633,9 +657,8 @@
 
 err_out:
 	set_sbi_flag(sbi, SBI_NEED_FSCK);
-	f2fs_msg(sbi->sb, KERN_WARNING,
-			"%s: orphan failed (ino=%x), run fsck to fix.",
-			__func__, ino);
+	f2fs_warn(sbi, "%s: orphan failed (ino=%x), run fsck to fix.",
+		  __func__, ino);
 	return err;
 }
 
@@ -651,8 +674,13 @@
 	if (!is_set_ckpt_flags(sbi, CP_ORPHAN_PRESENT_FLAG))
 		return 0;
 
+	if (bdev_read_only(sbi->sb->s_bdev)) {
+		f2fs_info(sbi, "write access unavailable, skipping orphan cleanup");
+		return 0;
+	}
+
 	if (s_flags & SB_RDONLY) {
-		f2fs_msg(sbi->sb, KERN_INFO, "orphan cleanup on readonly fs");
+		f2fs_info(sbi, "orphan cleanup on readonly fs");
 		sbi->sb->s_flags &= ~SB_RDONLY;
 	}
 
@@ -765,13 +793,27 @@
 	}
 }
 
+static __u32 f2fs_checkpoint_chksum(struct f2fs_sb_info *sbi,
+						struct f2fs_checkpoint *ckpt)
+{
+	unsigned int chksum_ofs = le32_to_cpu(ckpt->checksum_offset);
+	__u32 chksum;
+
+	chksum = f2fs_crc32(sbi, ckpt, chksum_ofs);
+	if (chksum_ofs < CP_CHKSUM_OFFSET) {
+		chksum_ofs += sizeof(chksum);
+		chksum = f2fs_chksum(sbi, chksum, (__u8 *)ckpt + chksum_ofs,
+						F2FS_BLKSIZE - chksum_ofs);
+	}
+	return chksum;
+}
+
 static int get_checkpoint_version(struct f2fs_sb_info *sbi, block_t cp_addr,
 		struct f2fs_checkpoint **cp_block, struct page **cp_page,
 		unsigned long long *version)
 {
-	unsigned long blk_size = sbi->blocksize;
 	size_t crc_offset = 0;
-	__u32 crc = 0;
+	__u32 crc;
 
 	*cp_page = f2fs_get_meta_page(sbi, cp_addr);
 	if (IS_ERR(*cp_page))
@@ -780,17 +822,17 @@
 	*cp_block = (struct f2fs_checkpoint *)page_address(*cp_page);
 
 	crc_offset = le32_to_cpu((*cp_block)->checksum_offset);
-	if (crc_offset > (blk_size - sizeof(__le32))) {
+	if (crc_offset < CP_MIN_CHKSUM_OFFSET ||
+			crc_offset > CP_CHKSUM_OFFSET) {
 		f2fs_put_page(*cp_page, 1);
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"invalid crc_offset: %zu", crc_offset);
+		f2fs_warn(sbi, "invalid crc_offset: %zu", crc_offset);
 		return -EINVAL;
 	}
 
-	crc = cur_cp_crc(*cp_block);
-	if (!f2fs_crc_valid(sbi, crc, *cp_block, crc_offset)) {
+	crc = f2fs_checkpoint_chksum(sbi, *cp_block);
+	if (crc != cur_cp_crc(*cp_block)) {
 		f2fs_put_page(*cp_page, 1);
-		f2fs_msg(sbi->sb, KERN_WARNING, "invalid crc value");
+		f2fs_warn(sbi, "invalid crc value");
 		return -EINVAL;
 	}
 
@@ -813,9 +855,8 @@
 
 	if (le32_to_cpu(cp_block->cp_pack_total_block_count) >
 					sbi->blocks_per_seg) {
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"invalid cp_pack_total_block_count:%u",
-			le32_to_cpu(cp_block->cp_pack_total_block_count));
+		f2fs_warn(sbi, "invalid cp_pack_total_block_count:%u",
+			  le32_to_cpu(cp_block->cp_pack_total_block_count));
 		goto invalid_cp;
 	}
 	pre_version = *version;
@@ -924,7 +965,7 @@
 	f2fs_put_page(cp1, 1);
 	f2fs_put_page(cp2, 1);
 fail_no_cp:
-	kfree(sbi->ckpt);
+	kvfree(sbi->ckpt);
 	return err;
 }
 
@@ -970,7 +1011,7 @@
 	inode_inc_dirty_pages(inode);
 	spin_unlock(&sbi->inode_lock[type]);
 
-	SetPagePrivate(page);
+	f2fs_set_page_private(page, 0);
 	f2fs_trace_pid(page);
 }
 
@@ -1022,13 +1063,11 @@
 	if (inode) {
 		unsigned long cur_ino = inode->i_ino;
 
-		if (is_dir)
-			F2FS_I(inode)->cp_task = current;
+		F2FS_I(inode)->cp_task = current;
 
 		filemap_fdatawrite(inode->i_mapping);
 
-		if (is_dir)
-			F2FS_I(inode)->cp_task = NULL;
+		F2FS_I(inode)->cp_task = NULL;
 
 		iput(inode);
 		/* We need to give cpu to another writers. */
@@ -1092,6 +1131,28 @@
 	ckpt->next_free_nid = cpu_to_le32(last_nid);
 }
 
+static bool __need_flush_quota(struct f2fs_sb_info *sbi)
+{
+	bool ret = false;
+
+	if (!is_journalled_quota(sbi))
+		return false;
+
+	down_write(&sbi->quota_sem);
+	if (is_sbi_flag_set(sbi, SBI_QUOTA_SKIP_FLUSH)) {
+		ret = false;
+	} else if (is_sbi_flag_set(sbi, SBI_QUOTA_NEED_REPAIR)) {
+		ret = false;
+	} else if (is_sbi_flag_set(sbi, SBI_QUOTA_NEED_FLUSH)) {
+		clear_sbi_flag(sbi, SBI_QUOTA_NEED_FLUSH);
+		ret = true;
+	} else if (get_pages(sbi, F2FS_DIRTY_QDATA)) {
+		ret = true;
+	}
+	up_write(&sbi->quota_sem);
+	return ret;
+}
+
 /*
  * Freeze all the FS-operations for checkpoint.
  */
@@ -1103,12 +1164,32 @@
 		.for_reclaim = 0,
 	};
 	struct blk_plug plug;
-	int err = 0;
+	int err = 0, cnt = 0;
 
 	blk_start_plug(&plug);
 
-retry_flush_dents:
+retry_flush_quotas:
 	f2fs_lock_all(sbi);
+	if (__need_flush_quota(sbi)) {
+		int locked;
+
+		if (++cnt > DEFAULT_RETRY_QUOTA_FLUSH_COUNT) {
+			set_sbi_flag(sbi, SBI_QUOTA_SKIP_FLUSH);
+			set_sbi_flag(sbi, SBI_QUOTA_NEED_FLUSH);
+			goto retry_flush_dents;
+		}
+		f2fs_unlock_all(sbi);
+
+		/* only failed during mount/umount/freeze/quotactl */
+		locked = down_read_trylock(&sbi->sb->s_umount);
+		f2fs_quota_sync(sbi->sb, -1);
+		if (locked)
+			up_read(&sbi->sb->s_umount);
+		cond_resched();
+		goto retry_flush_quotas;
+	}
+
+retry_flush_dents:
 	/* write all the dirty dentry pages */
 	if (get_pages(sbi, F2FS_DIRTY_DENTS)) {
 		f2fs_unlock_all(sbi);
@@ -1116,7 +1197,7 @@
 		if (err)
 			goto out;
 		cond_resched();
-		goto retry_flush_dents;
+		goto retry_flush_quotas;
 	}
 
 	/*
@@ -1132,7 +1213,7 @@
 		if (err)
 			goto out;
 		cond_resched();
-		goto retry_flush_dents;
+		goto retry_flush_quotas;
 	}
 
 retry_flush_nodes:
@@ -1220,9 +1301,28 @@
 	else
 		__clear_ckpt_flags(ckpt, CP_ORPHAN_PRESENT_FLAG);
 
-	if (is_sbi_flag_set(sbi, SBI_NEED_FSCK))
+	if (is_sbi_flag_set(sbi, SBI_NEED_FSCK) ||
+		is_sbi_flag_set(sbi, SBI_IS_RESIZEFS))
 		__set_ckpt_flags(ckpt, CP_FSCK_FLAG);
 
+	if (is_sbi_flag_set(sbi, SBI_CP_DISABLED))
+		__set_ckpt_flags(ckpt, CP_DISABLED_FLAG);
+	else
+		__clear_ckpt_flags(ckpt, CP_DISABLED_FLAG);
+
+	if (is_sbi_flag_set(sbi, SBI_CP_DISABLED_QUICK))
+		__set_ckpt_flags(ckpt, CP_DISABLED_QUICK_FLAG);
+	else
+		__clear_ckpt_flags(ckpt, CP_DISABLED_QUICK_FLAG);
+
+	if (is_sbi_flag_set(sbi, SBI_QUOTA_SKIP_FLUSH))
+		__set_ckpt_flags(ckpt, CP_QUOTA_NEED_FSCK_FLAG);
+	else
+		__clear_ckpt_flags(ckpt, CP_QUOTA_NEED_FSCK_FLAG);
+
+	if (is_sbi_flag_set(sbi, SBI_QUOTA_NEED_REPAIR))
+		__set_ckpt_flags(ckpt, CP_QUOTA_NEED_FSCK_FLAG);
+
 	/* set this flag to activate crc|cp_ver for recovery */
 	__set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG);
 	__clear_ckpt_flags(ckpt, CP_NOCRC_RECOVERY_FLAG);
@@ -1245,11 +1345,11 @@
 	struct page *page = f2fs_grab_meta_page(sbi, blk_addr);
 	int err;
 
-	memcpy(page_address(page), src, PAGE_SIZE);
-	set_page_dirty(page);
+	f2fs_wait_on_page_writeback(page, META, true, true);
 
-	f2fs_wait_on_page_writeback(page, META, true);
-	f2fs_bug_on(sbi, PageWriteback(page));
+	memcpy(page_address(page), src, PAGE_SIZE);
+
+	set_page_dirty(page);
 	if (unlikely(!clear_page_dirty_for_io(page)))
 		f2fs_bug_on(sbi, 1);
 
@@ -1283,11 +1383,9 @@
 	int err;
 
 	/* Flush all the NAT/SIT pages */
-	while (get_pages(sbi, F2FS_DIRTY_META)) {
-		f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO);
-		if (unlikely(f2fs_cp_error(sbi)))
-			break;
-	}
+	f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO);
+	f2fs_bug_on(sbi, get_pages(sbi, F2FS_DIRTY_META) &&
+					!f2fs_cp_error(sbi));
 
 	/*
 	 * modify checkpoint
@@ -1341,7 +1439,7 @@
 	get_sit_bitmap(sbi, __bitmap_ptr(sbi, SIT_BITMAP));
 	get_nat_bitmap(sbi, __bitmap_ptr(sbi, NAT_BITMAP));
 
-	crc32 = f2fs_crc32(sbi, ckpt, le32_to_cpu(ckpt->checksum_offset));
+	crc32 = f2fs_checkpoint_chksum(sbi, ckpt);
 	*((__le32 *)((unsigned char *)ckpt +
 				le32_to_cpu(ckpt->checksum_offset)))
 				= cpu_to_le32(crc32);
@@ -1360,14 +1458,6 @@
 		for (i = 0; i < nm_i->nat_bits_blocks; i++)
 			f2fs_update_meta_page(sbi, nm_i->nat_bits +
 					(i << F2FS_BLKSIZE_BITS), blk + i);
-
-		/* Flush all the NAT BITS pages */
-		while (get_pages(sbi, F2FS_DIRTY_META)) {
-			f2fs_sync_meta_pages(sbi, META, LONG_MAX,
-							FS_CP_META_IO);
-			if (unlikely(f2fs_cp_error(sbi)))
-				break;
-		}
 	}
 
 	/* write out checkpoint buffer at block 0 */
@@ -1403,6 +1493,8 @@
 
 	/* Here, we have one bio having CP pack except cp pack 2 page */
 	f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO);
+	f2fs_bug_on(sbi, get_pages(sbi, F2FS_DIRTY_META) &&
+					!f2fs_cp_error(sbi));
 
 	/* wait for previous submitted meta pages writeback */
 	f2fs_wait_on_all_pages_writeback(sbi);
@@ -1420,7 +1512,7 @@
 	 * invalidate intermediate page cache borrowed from meta inode
 	 * which are used for migration of encrypted inode's blocks.
 	 */
-	if (f2fs_sb_has_encrypt(sbi->sb))
+	if (f2fs_sb_has_encrypt(sbi))
 		invalidate_mapping_pages(META_MAPPING(sbi),
 				MAIN_BLKADDR(sbi), MAX_BLKADDR(sbi) - 1);
 
@@ -1430,6 +1522,12 @@
 
 	clear_sbi_flag(sbi, SBI_IS_DIRTY);
 	clear_sbi_flag(sbi, SBI_NEED_CP);
+	clear_sbi_flag(sbi, SBI_QUOTA_SKIP_FLUSH);
+
+	spin_lock(&sbi->stat_lock);
+	sbi->unusable_block_count = 0;
+	spin_unlock(&sbi->stat_lock);
+
 	__set_cp_next_pack(sbi);
 
 	/*
@@ -1454,6 +1552,14 @@
 	unsigned long long ckpt_ver;
 	int err = 0;
 
+	if (f2fs_readonly(sbi->sb) || f2fs_hw_is_readonly(sbi))
+		return -EROFS;
+
+	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
+		if (cpc->reason != CP_PAUSE)
+			return 0;
+		f2fs_warn(sbi, "Start checkpoint disabled!");
+	}
 	mutex_lock(&sbi->cp_mutex);
 
 	if (!is_sbi_flag_set(sbi, SBI_IS_DIRTY) &&
@@ -1464,10 +1570,6 @@
 		err = -EIO;
 		goto out;
 	}
-	if (f2fs_readonly(sbi->sb)) {
-		err = -EROFS;
-		goto out;
-	}
 
 	trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "start block_ops");
 
@@ -1505,7 +1607,10 @@
 	ckpt->checkpoint_ver = cpu_to_le64(++ckpt_ver);
 
 	/* write cached NAT/SIT entries to NAT/SIT area */
-	f2fs_flush_nat_entries(sbi, cpc);
+	err = f2fs_flush_nat_entries(sbi, cpc);
+	if (err)
+		goto stop;
+
 	f2fs_flush_sit_entries(sbi, cpc);
 
 	/* unlock all the fs_lock[] in do_checkpoint() */
@@ -1514,13 +1619,12 @@
 		f2fs_release_discard_addrs(sbi);
 	else
 		f2fs_clear_prefree_segments(sbi, cpc);
-
+stop:
 	unblock_operations(sbi);
 	stat_inc_cp_count(sbi->stat_info);
 
 	if (cpc->reason & CP_RECOVERY)
-		f2fs_msg(sbi->sb, KERN_NOTICE,
-			"checkpoint: version = %llx", ckpt_ver);
+		f2fs_notice(sbi, "checkpoint: version = %llx", ckpt_ver);
 
 	/* do checkpoint periodically */
 	f2fs_update_time(sbi, CP_TIME);
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index a7436ad..953ea27 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/data.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
@@ -17,6 +14,7 @@
 #include <linux/pagevec.h>
 #include <linux/blkdev.h>
 #include <linux/bio.h>
+#include <linux/swap.h>
 #include <linux/prefetch.h>
 #include <linux/uio.h>
 #include <linux/cleancache.h>
@@ -27,10 +25,12 @@
 #include "segment.h"
 #include "trace.h"
 #include <trace/events/f2fs.h>
+#include <trace/events/android_fs.h>
 
 #define NUM_PREALLOC_POST_READ_CTXS	128
 
 static struct kmem_cache *bio_post_read_ctx_cache;
+static struct kmem_cache *bio_entry_slab;
 static mempool_t *bio_post_read_ctx_pool;
 
 static bool __is_cp_guaranteed(struct page *page)
@@ -49,16 +49,34 @@
 			inode->i_ino ==  F2FS_NODE_INO(sbi) ||
 			S_ISDIR(inode->i_mode) ||
 			(S_ISREG(inode->i_mode) &&
-			is_inode_flag_set(inode, FI_ATOMIC_FILE)) ||
+			(f2fs_is_atomic_file(inode) || IS_NOQUOTA(inode))) ||
 			is_cold_data(page))
 		return true;
 	return false;
 }
 
+static enum count_type __read_io_type(struct page *page)
+{
+	struct address_space *mapping = page_file_mapping(page);
+
+	if (mapping) {
+		struct inode *inode = mapping->host;
+		struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+
+		if (inode->i_ino == F2FS_META_INO(sbi))
+			return F2FS_RD_META;
+
+		if (inode->i_ino == F2FS_NODE_INO(sbi))
+			return F2FS_RD_NODE;
+	}
+	return F2FS_RD_DATA;
+}
+
 /* postprocessing steps for read bios */
 enum bio_post_read_step {
 	STEP_INITIAL = 0,
 	STEP_DECRYPT,
+	STEP_VERITY,
 };
 
 struct bio_post_read_ctx {
@@ -85,6 +103,7 @@
 		} else {
 			SetPageUptodate(page);
 		}
+		dec_page_count(F2FS_P_SB(page), __read_io_type(page));
 		unlock_page(page);
 	}
 	if (bio->bi_private)
@@ -104,8 +123,23 @@
 	bio_post_read_processing(ctx);
 }
 
+static void verity_work(struct work_struct *work)
+{
+	struct bio_post_read_ctx *ctx =
+		container_of(work, struct bio_post_read_ctx, work);
+
+	fsverity_verify_bio(ctx->bio);
+
+	bio_post_read_processing(ctx);
+}
+
 static void bio_post_read_processing(struct bio_post_read_ctx *ctx)
 {
+	/*
+	 * We use different work queues for decryption and for verity because
+	 * verity may require reading metadata pages that need decryption, and
+	 * we shouldn't recurse to the same workqueue.
+	 */
 	switch (++ctx->cur_step) {
 	case STEP_DECRYPT:
 		if (ctx->enabled_steps & (1 << STEP_DECRYPT)) {
@@ -115,6 +149,14 @@
 		}
 		ctx->cur_step++;
 		/* fall-through */
+	case STEP_VERITY:
+		if (ctx->enabled_steps & (1 << STEP_VERITY)) {
+			INIT_WORK(&ctx->work, verity_work);
+			fsverity_enqueue_verify_work(&ctx->work);
+			return;
+		}
+		ctx->cur_step++;
+		/* fall-through */
 	default:
 		__read_end_io(ctx->bio);
 	}
@@ -127,8 +169,11 @@
 
 static void f2fs_read_end_io(struct bio *bio)
 {
-	if (time_to_inject(F2FS_P_SB(bio_first_page_all(bio)), FAULT_IO)) {
-		f2fs_show_injection_info(FAULT_IO);
+	struct page *first_page = bio->bi_io_vec[0].bv_page;
+	struct f2fs_sb_info *sbi = F2FS_P_SB(first_page);
+
+	if (time_to_inject(sbi, FAULT_READ_IO)) {
+		f2fs_show_injection_info(sbi, FAULT_READ_IO);
 		bio->bi_status = BLK_STS_IOERR;
 	}
 
@@ -140,6 +185,13 @@
 		return;
 	}
 
+	if (first_page != NULL &&
+		__read_io_type(first_page) == F2FS_RD_DATA) {
+		trace_android_fs_dataread_end(first_page->mapping->host,
+						page_offset(first_page),
+						bio->bi_iter.bi_size);
+	}
+
 	__read_end_io(bio);
 }
 
@@ -149,6 +201,11 @@
 	struct bio_vec *bvec;
 	int i;
 
+	if (time_to_inject(sbi, FAULT_WRITE_IO)) {
+		f2fs_show_injection_info(sbi, FAULT_WRITE_IO);
+		bio->bi_status = BLK_STS_IOERR;
+	}
+
 	bio_for_each_segment_all(bvec, bio, i) {
 		struct page *page = bvec->bv_page;
 		enum count_type type = WB_DATA_TYPE(page);
@@ -164,7 +221,7 @@
 			continue;
 		}
 
-		fscrypt_pullback_bio_page(&page, true);
+		fscrypt_finalize_bounce_page(&page);
 
 		if (unlikely(bio->bi_status)) {
 			mapping_set_error(page->mapping, -EIO);
@@ -237,30 +294,58 @@
 /*
  * Low-level block read/write IO operations.
  */
-static struct bio *__bio_alloc(struct f2fs_sb_info *sbi, block_t blk_addr,
-				struct writeback_control *wbc,
-				int npages, bool is_read,
-				enum page_type type, enum temp_type temp)
+static struct bio *__bio_alloc(struct f2fs_io_info *fio, int npages)
 {
+	struct f2fs_sb_info *sbi = fio->sbi;
 	struct bio *bio;
 
 	bio = f2fs_bio_alloc(sbi, npages, true);
 
-	f2fs_target_device(sbi, blk_addr, bio);
-	if (is_read) {
+	f2fs_target_device(sbi, fio->new_blkaddr, bio);
+	if (is_read_io(fio->op)) {
 		bio->bi_end_io = f2fs_read_end_io;
 		bio->bi_private = NULL;
 	} else {
 		bio->bi_end_io = f2fs_write_end_io;
 		bio->bi_private = sbi;
-		bio->bi_write_hint = f2fs_io_type_to_rw_hint(sbi, type, temp);
+		bio->bi_write_hint = f2fs_io_type_to_rw_hint(sbi,
+						fio->type, fio->temp);
 	}
-	if (wbc)
-		wbc_init_bio(wbc, bio);
+	if (fio->io_wbc)
+		wbc_init_bio(fio->io_wbc, bio);
 
 	return bio;
 }
 
+static int f2fs_set_bio_crypt_ctx(struct bio *bio, const struct inode *inode,
+				  pgoff_t first_idx,
+				  const struct f2fs_io_info *fio,
+				  gfp_t gfp_mask)
+{
+	/*
+	 * The f2fs garbage collector sets ->encrypted_page when it wants to
+	 * read/write raw data without encryption.
+	 */
+	if (fio && fio->encrypted_page)
+		return 0;
+
+	return fscrypt_set_bio_crypt_ctx(bio, inode, first_idx, gfp_mask);
+}
+
+static bool f2fs_crypt_mergeable_bio(struct bio *bio, const struct inode *inode,
+				     pgoff_t next_idx,
+				     const struct f2fs_io_info *fio)
+{
+	/*
+	 * The f2fs garbage collector sets ->encrypted_page when it wants to
+	 * read/write raw data without encryption.
+	 */
+	if (fio && fio->encrypted_page)
+		return !bio_has_crypt_ctx(bio);
+
+	return fscrypt_mergeable_bio(bio, inode, next_idx);
+}
+
 static inline void __submit_bio(struct f2fs_sb_info *sbi,
 				struct bio *bio, enum page_type type)
 {
@@ -273,6 +358,9 @@
 		if (test_opt(sbi, LFS) && current->plug)
 			blk_finish_plug(current->plug);
 
+		if (F2FS_IO_ALIGNED(sbi))
+			goto submit_io;
+
 		start = bio->bi_iter.bi_size >> F2FS_BLKSIZE_BITS;
 		start %= F2FS_IO_SIZE(sbi);
 
@@ -283,9 +371,10 @@
 		for (; start < F2FS_IO_SIZE(sbi); start++) {
 			struct page *page =
 				mempool_alloc(sbi->write_io_dummy,
-					GFP_NOIO | __GFP_ZERO | __GFP_NOFAIL);
+					      GFP_NOIO | __GFP_NOFAIL);
 			f2fs_bug_on(sbi, !page);
 
+			zero_user_segment(page, 0, PAGE_SIZE);
 			SetPagePrivate(page);
 			set_page_private(page, (unsigned long)DUMMY_WRITTEN_PAGE);
 			lock_page(page);
@@ -307,6 +396,32 @@
 	submit_bio(bio);
 }
 
+static void __f2fs_submit_read_bio(struct f2fs_sb_info *sbi,
+				struct bio *bio, enum page_type type)
+{
+	if (trace_android_fs_dataread_start_enabled() && (type == DATA)) {
+		struct page *first_page = bio->bi_io_vec[0].bv_page;
+
+		if (first_page != NULL &&
+			__read_io_type(first_page) == F2FS_RD_DATA) {
+			char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+			path = android_fstrace_get_pathname(pathbuf,
+						MAX_TRACE_PATHBUF_LEN,
+						first_page->mapping->host);
+
+			trace_android_fs_dataread_start(
+				first_page->mapping->host,
+				page_offset(first_page),
+				bio->bi_iter.bi_size,
+				current->pid,
+				path,
+				current->comm);
+		}
+	}
+	__submit_bio(sbi, bio, type);
+}
+
 static void __submit_merged_bio(struct f2fs_bio_info *io)
 {
 	struct f2fs_io_info *fio = &io->fio;
@@ -325,31 +440,29 @@
 	io->bio = NULL;
 }
 
-static bool __has_merged_page(struct f2fs_bio_info *io,
-				struct inode *inode, nid_t ino, pgoff_t idx)
+static bool __has_merged_page(struct bio *bio, struct inode *inode,
+						struct page *page, nid_t ino)
 {
 	struct bio_vec *bvec;
 	struct page *target;
 	int i;
 
-	if (!io->bio)
+	if (!bio)
 		return false;
 
-	if (!inode && !ino)
+	if (!inode && !page && !ino)
 		return true;
 
-	bio_for_each_segment_all(bvec, io->bio, i) {
+	bio_for_each_segment_all(bvec, bio, i) {
 
-		if (bvec->bv_page->mapping)
-			target = bvec->bv_page;
-		else
-			target = fscrypt_control_page(bvec->bv_page);
-
-		if (idx != target->index)
-			continue;
+		target = bvec->bv_page;
+		if (fscrypt_is_bounce_page(target))
+			target = fscrypt_pagecache_page(target);
 
 		if (inode && inode == target->mapping->host)
 			return true;
+		if (page && page == target)
+			return true;
 		if (ino && ino == ino_of_node(target))
 			return true;
 	}
@@ -357,28 +470,6 @@
 	return false;
 }
 
-static bool has_merged_page(struct f2fs_sb_info *sbi, struct inode *inode,
-				nid_t ino, pgoff_t idx, enum page_type type)
-{
-	enum page_type btype = PAGE_TYPE_OF_BIO(type);
-	enum temp_type temp;
-	struct f2fs_bio_info *io;
-	bool ret = false;
-
-	for (temp = HOT; temp < NR_TEMP_TYPE; temp++) {
-		io = sbi->write_io[btype] + temp;
-
-		down_read(&io->io_rwsem);
-		ret = __has_merged_page(io, inode, ino, idx);
-		up_read(&io->io_rwsem);
-
-		/* TODO: use HOT temp only for meta pages now. */
-		if (ret || btype == META)
-			break;
-	}
-	return ret;
-}
-
 static void __f2fs_submit_merged_write(struct f2fs_sb_info *sbi,
 				enum page_type type, enum temp_type temp)
 {
@@ -400,17 +491,23 @@
 }
 
 static void __submit_merged_write_cond(struct f2fs_sb_info *sbi,
-				struct inode *inode, nid_t ino, pgoff_t idx,
-				enum page_type type, bool force)
+				struct inode *inode, struct page *page,
+				nid_t ino, enum page_type type, bool force)
 {
 	enum temp_type temp;
-
-	if (!force && !has_merged_page(sbi, inode, ino, idx, type))
-		return;
+	bool ret = true;
 
 	for (temp = HOT; temp < NR_TEMP_TYPE; temp++) {
+		if (!force)	{
+			enum page_type btype = PAGE_TYPE_OF_BIO(type);
+			struct f2fs_bio_info *io = sbi->write_io[btype] + temp;
 
-		__f2fs_submit_merged_write(sbi, type, temp);
+			down_read(&io->io_rwsem);
+			ret = __has_merged_page(io->bio, inode, page, ino);
+			up_read(&io->io_rwsem);
+		}
+		if (ret)
+			__f2fs_submit_merged_write(sbi, type, temp);
 
 		/* TODO: use HOT temp only for meta pages now. */
 		if (type >= META)
@@ -420,14 +517,14 @@
 
 void f2fs_submit_merged_write(struct f2fs_sb_info *sbi, enum page_type type)
 {
-	__submit_merged_write_cond(sbi, NULL, 0, 0, type, true);
+	__submit_merged_write_cond(sbi, NULL, NULL, 0, type, true);
 }
 
 void f2fs_submit_merged_write_cond(struct f2fs_sb_info *sbi,
-				struct inode *inode, nid_t ino, pgoff_t idx,
-				enum page_type type)
+				struct inode *inode, struct page *page,
+				nid_t ino, enum page_type type)
 {
-	__submit_merged_write_cond(sbi, inode, ino, idx, type, false);
+	__submit_merged_write_cond(sbi, inode, page, ino, type, false);
 }
 
 void f2fs_flush_merged_writes(struct f2fs_sb_info *sbi)
@@ -446,17 +543,25 @@
 	struct bio *bio;
 	struct page *page = fio->encrypted_page ?
 			fio->encrypted_page : fio->page;
+	int err;
 
 	if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr,
-			__is_meta_io(fio) ? META_GENERIC : DATA_GENERIC))
+			fio->is_por ? META_POR : (__is_meta_io(fio) ?
+			META_GENERIC : DATA_GENERIC_ENHANCE)))
 		return -EFSCORRUPTED;
 
 	trace_f2fs_submit_page_bio(page, fio);
 	f2fs_trace_ios(fio, 0);
 
 	/* Allocate a new bio */
-	bio = __bio_alloc(fio->sbi, fio->new_blkaddr, fio->io_wbc,
-				1, is_read_io(fio->op), fio->type, fio->temp);
+	bio = __bio_alloc(fio, 1);
+
+	err = f2fs_set_bio_crypt_ctx(bio, fio->page->mapping->host,
+				     fio->page->index, fio, GFP_NOIO);
+	if (err) {
+		bio_put(bio);
+		return err;
+	}
 
 	if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) {
 		bio_put(bio);
@@ -468,10 +573,213 @@
 
 	bio_set_op_attrs(bio, fio->op, fio->op_flags);
 
-	if (!is_read_io(fio->op))
-		inc_page_count(fio->sbi, WB_DATA_TYPE(fio->page));
+	inc_page_count(fio->sbi, is_read_io(fio->op) ?
+			__read_io_type(page): WB_DATA_TYPE(fio->page));
 
-	__submit_bio(fio->sbi, bio, fio->type);
+	if (is_read_io(fio->op))
+		__f2fs_submit_read_bio(fio->sbi, bio, fio->type);
+	else
+		__submit_bio(fio->sbi, bio, fio->type);
+	return 0;
+}
+
+static bool page_is_mergeable(struct f2fs_sb_info *sbi, struct bio *bio,
+				block_t last_blkaddr, block_t cur_blkaddr)
+{
+	if (last_blkaddr + 1 != cur_blkaddr)
+		return false;
+	return __same_bdev(sbi, cur_blkaddr, bio);
+}
+
+static bool io_type_is_mergeable(struct f2fs_bio_info *io,
+						struct f2fs_io_info *fio)
+{
+	if (io->fio.op != fio->op)
+		return false;
+	return io->fio.op_flags == fio->op_flags;
+}
+
+static bool io_is_mergeable(struct f2fs_sb_info *sbi, struct bio *bio,
+					struct f2fs_bio_info *io,
+					struct f2fs_io_info *fio,
+					block_t last_blkaddr,
+					block_t cur_blkaddr)
+{
+	if (F2FS_IO_ALIGNED(sbi) && (fio->type == DATA || fio->type == NODE)) {
+		unsigned int filled_blocks =
+				F2FS_BYTES_TO_BLK(bio->bi_iter.bi_size);
+		unsigned int io_size = F2FS_IO_SIZE(sbi);
+		unsigned int left_vecs = bio->bi_max_vecs - bio->bi_vcnt;
+
+		/* IOs in bio is aligned and left space of vectors is not enough */
+		if (!(filled_blocks % io_size) && left_vecs < io_size)
+			return false;
+	}
+	if (!page_is_mergeable(sbi, bio, last_blkaddr, cur_blkaddr))
+		return false;
+	return io_type_is_mergeable(io, fio);
+}
+
+static void add_bio_entry(struct f2fs_sb_info *sbi, struct bio *bio,
+				struct page *page, enum temp_type temp)
+{
+	struct f2fs_bio_info *io = sbi->write_io[DATA] + temp;
+	struct bio_entry *be;
+
+	be = f2fs_kmem_cache_alloc(bio_entry_slab, GFP_NOFS);
+	be->bio = bio;
+	bio_get(bio);
+
+	if (bio_add_page(bio, page, PAGE_SIZE, 0) != PAGE_SIZE)
+		f2fs_bug_on(sbi, 1);
+
+	down_write(&io->bio_list_lock);
+	list_add_tail(&be->list, &io->bio_list);
+	up_write(&io->bio_list_lock);
+}
+
+static void del_bio_entry(struct bio_entry *be)
+{
+	list_del(&be->list);
+	kmem_cache_free(bio_entry_slab, be);
+}
+
+static int add_ipu_page(struct f2fs_sb_info *sbi, struct bio **bio,
+							struct page *page)
+{
+	enum temp_type temp;
+	bool found = false;
+	int ret = -EAGAIN;
+
+	for (temp = HOT; temp < NR_TEMP_TYPE && !found; temp++) {
+		struct f2fs_bio_info *io = sbi->write_io[DATA] + temp;
+		struct list_head *head = &io->bio_list;
+		struct bio_entry *be;
+
+		down_write(&io->bio_list_lock);
+		list_for_each_entry(be, head, list) {
+			if (be->bio != *bio)
+				continue;
+
+			found = true;
+
+			if (bio_add_page(*bio, page, PAGE_SIZE, 0) == PAGE_SIZE) {
+				ret = 0;
+				break;
+			}
+
+			/* bio is full */
+			del_bio_entry(be);
+			__submit_bio(sbi, *bio, DATA);
+			break;
+		}
+		up_write(&io->bio_list_lock);
+	}
+
+	if (ret) {
+		bio_put(*bio);
+		*bio = NULL;
+	}
+
+	return ret;
+}
+
+void f2fs_submit_merged_ipu_write(struct f2fs_sb_info *sbi,
+					struct bio **bio, struct page *page)
+{
+	enum temp_type temp;
+	bool found = false;
+	struct bio *target = bio ? *bio : NULL;
+
+	for (temp = HOT; temp < NR_TEMP_TYPE && !found; temp++) {
+		struct f2fs_bio_info *io = sbi->write_io[DATA] + temp;
+		struct list_head *head = &io->bio_list;
+		struct bio_entry *be;
+
+		if (list_empty(head))
+			continue;
+
+		down_read(&io->bio_list_lock);
+		list_for_each_entry(be, head, list) {
+			if (target)
+				found = (target == be->bio);
+			else
+				found = __has_merged_page(be->bio, NULL,
+								page, 0);
+			if (found)
+				break;
+		}
+		up_read(&io->bio_list_lock);
+
+		if (!found)
+			continue;
+
+		found = false;
+
+		down_write(&io->bio_list_lock);
+		list_for_each_entry(be, head, list) {
+			if (target)
+				found = (target == be->bio);
+			else
+				found = __has_merged_page(be->bio, NULL,
+								page, 0);
+			if (found) {
+				target = be->bio;
+				del_bio_entry(be);
+				break;
+			}
+		}
+		up_write(&io->bio_list_lock);
+	}
+
+	if (found)
+		__submit_bio(sbi, target, DATA);
+	if (bio && *bio) {
+		bio_put(*bio);
+		*bio = NULL;
+	}
+}
+
+int f2fs_merge_page_bio(struct f2fs_io_info *fio)
+{
+	struct bio *bio = *fio->bio;
+	struct page *page = fio->encrypted_page ?
+			fio->encrypted_page : fio->page;
+
+	if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr,
+			__is_meta_io(fio) ? META_GENERIC : DATA_GENERIC))
+		return -EFSCORRUPTED;
+
+	trace_f2fs_submit_page_bio(page, fio);
+	f2fs_trace_ios(fio, 0);
+
+	if (bio && (!page_is_mergeable(fio->sbi, bio, *fio->last_block,
+						fio->new_blkaddr) ||
+		    !f2fs_crypt_mergeable_bio(bio, fio->page->mapping->host,
+					      fio->page->index, fio)))
+		f2fs_submit_merged_ipu_write(fio->sbi, &bio, NULL);
+alloc_new:
+	if (!bio) {
+		bio = __bio_alloc(fio, BIO_MAX_PAGES);
+		f2fs_set_bio_crypt_ctx(bio, fio->page->mapping->host,
+				       fio->page->index, fio,
+				       GFP_NOIO | __GFP_NOFAIL);
+		bio_set_op_attrs(bio, fio->op, fio->op_flags);
+
+		add_bio_entry(fio->sbi, bio, page, fio->temp);
+	} else {
+		if (add_ipu_page(fio->sbi, &bio, page))
+			goto alloc_new;
+	}
+
+	if (fio->io_wbc)
+		wbc_account_io(fio->io_wbc, page, PAGE_SIZE);
+
+	inc_page_count(fio->sbi, WB_DATA_TYPE(page));
+
+	*fio->last_block = fio->new_blkaddr;
+	*fio->bio = bio;
+
 	return 0;
 }
 
@@ -498,9 +806,7 @@
 		spin_unlock(&io->io_lock);
 	}
 
-	if (__is_valid_data_blkaddr(fio->old_blkaddr))
-		verify_block_addr(fio, fio->old_blkaddr);
-	verify_block_addr(fio, fio->new_blkaddr);
+	verify_fio_blkaddr(fio);
 
 	bio_page = fio->encrypted_page ? fio->encrypted_page : fio->page;
 
@@ -509,21 +815,25 @@
 
 	inc_page_count(sbi, WB_DATA_TYPE(bio_page));
 
-	if (io->bio && (io->last_block_in_bio != fio->new_blkaddr - 1 ||
-	    (io->fio.op != fio->op || io->fio.op_flags != fio->op_flags) ||
-			!__same_bdev(sbi, fio->new_blkaddr, io->bio)))
+	if (io->bio &&
+	    (!io_is_mergeable(sbi, io->bio, io, fio, io->last_block_in_bio,
+			      fio->new_blkaddr) ||
+	     !f2fs_crypt_mergeable_bio(io->bio, fio->page->mapping->host,
+				       fio->page->index, fio)))
 		__submit_merged_bio(io);
 alloc_new:
 	if (io->bio == NULL) {
-		if ((fio->type == DATA || fio->type == NODE) &&
+		if (F2FS_IO_ALIGNED(sbi) &&
+				(fio->type == DATA || fio->type == NODE) &&
 				fio->new_blkaddr & F2FS_IO_SIZE_MASK(sbi)) {
 			dec_page_count(sbi, WB_DATA_TYPE(bio_page));
 			fio->retry = true;
 			goto skip;
 		}
-		io->bio = __bio_alloc(sbi, fio->new_blkaddr, fio->io_wbc,
-						BIO_MAX_PAGES, false,
-						fio->type, fio->temp);
+		io->bio = __bio_alloc(fio, BIO_MAX_PAGES);
+		f2fs_set_bio_crypt_ctx(io->bio, fio->page->mapping->host,
+				       fio->page->index, fio,
+				       GFP_NOIO | __GFP_NOFAIL);
 		io->fio = *fio;
 	}
 
@@ -543,31 +853,48 @@
 	if (fio->in_list)
 		goto next;
 out:
-	if (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN))
+	if (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN) ||
+				!f2fs_is_checkpoint_ready(sbi))
 		__submit_merged_bio(io);
 	up_write(&io->io_rwsem);
 }
 
+static inline bool f2fs_need_verity(const struct inode *inode, pgoff_t idx)
+{
+	return fsverity_active(inode) &&
+	       idx < DIV_ROUND_UP(inode->i_size, PAGE_SIZE);
+}
+
 static struct bio *f2fs_grab_read_bio(struct inode *inode, block_t blkaddr,
-					unsigned nr_pages, unsigned op_flag)
+				      unsigned nr_pages, unsigned op_flag,
+				      pgoff_t first_idx)
 {
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 	struct bio *bio;
 	struct bio_post_read_ctx *ctx;
 	unsigned int post_read_steps = 0;
-
-	if (!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC))
-		return ERR_PTR(-EFAULT);
+	int err;
 
 	bio = f2fs_bio_alloc(sbi, min_t(int, nr_pages, BIO_MAX_PAGES), false);
 	if (!bio)
 		return ERR_PTR(-ENOMEM);
+
+	err = f2fs_set_bio_crypt_ctx(bio, inode, first_idx, NULL, GFP_NOFS);
+	if (err) {
+		bio_put(bio);
+		return ERR_PTR(err);
+	}
+
 	f2fs_target_device(sbi, blkaddr, bio);
 	bio->bi_end_io = f2fs_read_end_io;
 	bio_set_op_attrs(bio, REQ_OP_READ, op_flag);
 
-	if (f2fs_encrypted_file(inode))
+	if (fscrypt_inode_uses_fs_layer_crypto(inode))
 		post_read_steps |= 1 << STEP_DECRYPT;
+
+	if (f2fs_need_verity(inode, first_idx))
+		post_read_steps |= 1 << STEP_VERITY;
+
 	if (post_read_steps) {
 		ctx = mempool_alloc(bio_post_read_ctx_pool, GFP_NOFS);
 		if (!ctx) {
@@ -586,8 +913,10 @@
 static int f2fs_submit_page_read(struct inode *inode, struct page *page,
 							block_t blkaddr)
 {
-	struct bio *bio = f2fs_grab_read_bio(inode, blkaddr, 1, 0);
+	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+	struct bio *bio;
 
+	bio = f2fs_grab_read_bio(inode, blkaddr, 1, 0, page->index);
 	if (IS_ERR(bio))
 		return PTR_ERR(bio);
 
@@ -599,7 +928,8 @@
 		return -EFAULT;
 	}
 	ClearPageError(page);
-	__submit_bio(F2FS_I_SB(inode), bio, DATA);
+	inc_page_count(sbi, F2FS_RD_DATA);
+	__f2fs_submit_read_bio(sbi, bio, DATA);
 	return 0;
 }
 
@@ -625,7 +955,7 @@
  */
 void f2fs_set_data_blkaddr(struct dnode_of_data *dn)
 {
-	f2fs_wait_on_page_writeback(dn->node_page, NODE, true);
+	f2fs_wait_on_page_writeback(dn->node_page, NODE, true, true);
 	__set_data_blkaddr(dn);
 	if (set_page_dirty(dn->node_page))
 		dn->node_changed = true;
@@ -655,7 +985,7 @@
 	trace_f2fs_reserve_new_blocks(dn->inode, dn->nid,
 						dn->ofs_in_node, count);
 
-	f2fs_wait_on_page_writeback(dn->node_page, NODE, true);
+	f2fs_wait_on_page_writeback(dn->node_page, NODE, true, true);
 
 	for (; count > 0; dn->ofs_in_node++) {
 		block_t blkaddr = datablock_addr(dn->inode,
@@ -727,6 +1057,11 @@
 
 	if (f2fs_lookup_extent_cache(inode, index, &ei)) {
 		dn.data_blkaddr = ei.blk + index - ei.fofs;
+		if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), dn.data_blkaddr,
+						DATA_GENERIC_ENHANCE_READ)) {
+			err = -EFSCORRUPTED;
+			goto put_err;
+		}
 		goto got_it;
 	}
 
@@ -740,6 +1075,13 @@
 		err = -ENOENT;
 		goto put_err;
 	}
+	if (dn.data_blkaddr != NEW_ADDR &&
+			!f2fs_is_valid_blkaddr(F2FS_I_SB(inode),
+						dn.data_blkaddr,
+						DATA_GENERIC_ENHANCE)) {
+		err = -EFSCORRUPTED;
+		goto put_err;
+	}
 got_it:
 	if (PageUptodate(page)) {
 		unlock_page(page);
@@ -901,7 +1243,7 @@
 
 	dn->data_blkaddr = datablock_addr(dn->inode,
 				dn->node_page, dn->ofs_in_node);
-	if (dn->data_blkaddr == NEW_ADDR)
+	if (dn->data_blkaddr != NULL_ADDR)
 		goto alloc;
 
 	if (unlikely((err = inc_valid_block_count(sbi, dn->inode, &count))))
@@ -915,7 +1257,7 @@
 	if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO)
 		invalidate_mapping_pages(META_MAPPING(sbi),
 					old_blkaddr, old_blkaddr);
-	f2fs_set_data_blkaddr(dn);
+	f2fs_update_data_blkaddr(dn, dn->data_blkaddr);
 
 	/*
 	 * i_size will be updated by direct_IO. Otherwise, we'll get stale
@@ -939,6 +1281,9 @@
 			return err;
 	}
 
+	if (direct_io && allow_outplace_dio(inode, iocb, from))
+		return 0;
+
 	if (is_inode_flag_set(inode, FI_NO_PREALLOC))
 		return 0;
 
@@ -952,10 +1297,11 @@
 	map.m_next_pgofs = NULL;
 	map.m_next_extent = NULL;
 	map.m_seg_type = NO_CHECK_TYPE;
+	map.m_may_create = true;
 
 	if (direct_io) {
 		map.m_seg_type = f2fs_rw_hint_to_seg_type(iocb->ki_hint);
-		flag = f2fs_force_buffered_io(inode, WRITE) ?
+		flag = f2fs_force_buffered_io(inode, iocb, from) ?
 					F2FS_GET_BLOCK_PRE_AIO :
 					F2FS_GET_BLOCK_PRE_DIO;
 		goto map_blocks;
@@ -980,7 +1326,7 @@
 	return err;
 }
 
-static inline void __do_map_lock(struct f2fs_sb_info *sbi, int flag, bool lock)
+void __do_map_lock(struct f2fs_sb_info *sbi, int flag, bool lock)
 {
 	if (flag == F2FS_GET_BLOCK_PRE_AIO) {
 		if (lock)
@@ -1010,7 +1356,7 @@
 	unsigned int maxblocks = map->m_len;
 	struct dnode_of_data dn;
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
-	int mode = create ? ALLOC_NODE : LOOKUP_NODE;
+	int mode = map->m_may_create ? ALLOC_NODE : LOOKUP_NODE;
 	pgoff_t pgofs, end_offset, end;
 	int err = 0, ofs = 1;
 	unsigned int ofs_in_node, last_ofs_in_node;
@@ -1030,16 +1376,25 @@
 	end = pgofs + maxblocks;
 
 	if (!create && f2fs_lookup_extent_cache(inode, pgofs, &ei)) {
+		if (test_opt(sbi, LFS) && flag == F2FS_GET_BLOCK_DIO &&
+							map->m_may_create)
+			goto next_dnode;
+
 		map->m_pblk = ei.blk + pgofs - ei.fofs;
 		map->m_len = min((pgoff_t)maxblocks, ei.fofs + ei.len - pgofs);
 		map->m_flags = F2FS_MAP_MAPPED;
 		if (map->m_next_extent)
 			*map->m_next_extent = pgofs + map->m_len;
+
+		/* for hardware encryption, but to avoid potential issue in future */
+		if (flag == F2FS_GET_BLOCK_DIO)
+			f2fs_wait_on_block_writeback_range(inode,
+						map->m_pblk, map->m_len);
 		goto out;
 	}
 
 next_dnode:
-	if (create)
+	if (map->m_may_create)
 		__do_map_lock(sbi, flag, true);
 
 	/* When reading holes, we need its node page */
@@ -1069,12 +1424,22 @@
 	blkaddr = datablock_addr(dn.inode, dn.node_page, dn.ofs_in_node);
 
 	if (__is_valid_data_blkaddr(blkaddr) &&
-		!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC)) {
+		!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE)) {
 		err = -EFSCORRUPTED;
 		goto sync_out;
 	}
 
-	if (!is_valid_data_blkaddr(sbi, blkaddr)) {
+	if (__is_valid_data_blkaddr(blkaddr)) {
+		/* use out-place-update for driect IO under LFS mode */
+		if (test_opt(sbi, LFS) && flag == F2FS_GET_BLOCK_DIO &&
+							map->m_may_create) {
+			err = __allocate_data_block(&dn, map->m_seg_type);
+			if (err)
+				goto sync_out;
+			blkaddr = dn.data_blkaddr;
+			set_inode_flag(inode, FI_APPEND_WRITE);
+		}
+	} else {
 		if (create) {
 			if (unlikely(f2fs_cp_error(sbi))) {
 				err = -EIO;
@@ -1178,13 +1543,19 @@
 
 	f2fs_put_dnode(&dn);
 
-	if (create) {
+	if (map->m_may_create) {
 		__do_map_lock(sbi, flag, false);
 		f2fs_balance_fs(sbi, dn.node_changed);
 	}
 	goto next_dnode;
 
 sync_out:
+
+	/* for hardware encryption, but to avoid potential issue in future */
+	if (flag == F2FS_GET_BLOCK_DIO && map->m_flags & F2FS_MAP_MAPPED)
+		f2fs_wait_on_block_writeback_range(inode,
+						map->m_pblk, map->m_len);
+
 	if (flag == F2FS_GET_BLOCK_PRECACHE) {
 		if (map->m_flags & F2FS_MAP_MAPPED) {
 			unsigned int ofs = start_pgofs - map->m_lblk;
@@ -1198,7 +1569,7 @@
 	}
 	f2fs_put_dnode(&dn);
 unlock_out:
-	if (create) {
+	if (map->m_may_create) {
 		__do_map_lock(sbi, flag, false);
 		f2fs_balance_fs(sbi, dn.node_changed);
 	}
@@ -1220,6 +1591,7 @@
 	map.m_next_pgofs = NULL;
 	map.m_next_extent = NULL;
 	map.m_seg_type = NO_CHECK_TYPE;
+	map.m_may_create = false;
 	last_lblk = F2FS_BLK_ALIGN(pos + len);
 
 	while (map.m_lblk < last_lblk) {
@@ -1234,7 +1606,7 @@
 
 static int __get_data_block(struct inode *inode, sector_t iblock,
 			struct buffer_head *bh, int create, int flag,
-			pgoff_t *next_pgofs, int seg_type)
+			pgoff_t *next_pgofs, int seg_type, bool may_write)
 {
 	struct f2fs_map_blocks map;
 	int err;
@@ -1244,6 +1616,7 @@
 	map.m_next_pgofs = next_pgofs;
 	map.m_next_extent = NULL;
 	map.m_seg_type = seg_type;
+	map.m_may_create = may_write;
 
 	err = f2fs_map_blocks(inode, &map, create, flag);
 	if (!err) {
@@ -1260,16 +1633,25 @@
 {
 	return __get_data_block(inode, iblock, bh_result, create,
 							flag, next_pgofs,
-							NO_CHECK_TYPE);
+							NO_CHECK_TYPE, create);
+}
+
+static int get_data_block_dio_write(struct inode *inode, sector_t iblock,
+			struct buffer_head *bh_result, int create)
+{
+	return __get_data_block(inode, iblock, bh_result, create,
+				F2FS_GET_BLOCK_DIO, NULL,
+				f2fs_rw_hint_to_seg_type(inode->i_write_hint),
+				IS_SWAPFILE(inode) ? false : true);
 }
 
 static int get_data_block_dio(struct inode *inode, sector_t iblock,
 			struct buffer_head *bh_result, int create)
 {
 	return __get_data_block(inode, iblock, bh_result, create,
-						F2FS_GET_BLOCK_DIO, NULL,
-						f2fs_rw_hint_to_seg_type(
-							inode->i_write_hint));
+				F2FS_GET_BLOCK_DIO, NULL,
+				f2fs_rw_hint_to_seg_type(inode->i_write_hint),
+				false);
 }
 
 static int get_data_block_bmap(struct inode *inode, sector_t iblock,
@@ -1281,7 +1663,7 @@
 
 	return __get_data_block(inode, iblock, bh_result, create,
 						F2FS_GET_BLOCK_BMAP, NULL,
-						NO_CHECK_TYPE);
+						NO_CHECK_TYPE, create);
 }
 
 static inline sector_t logical_to_blk(struct inode *inode, loff_t offset)
@@ -1391,7 +1773,7 @@
 		goto out;
 	}
 
-	if (f2fs_has_inline_data(inode)) {
+	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode)) {
 		ret = f2fs_inline_data_fiemap(inode, fieinfo, start, len);
 		if (ret != -EAGAIN)
 			goto out;
@@ -1424,7 +1806,7 @@
 	}
 
 	if (size) {
-		if (f2fs_encrypted_inode(inode))
+		if (IS_ENCRYPTED(inode))
 			flags |= FIEMAP_EXTENT_DATA_ENCRYPTED;
 
 		ret = fiemap_fill_next_extent(fieinfo, logical,
@@ -1457,6 +1839,134 @@
 	return ret;
 }
 
+static inline loff_t f2fs_readpage_limit(struct inode *inode)
+{
+	if (IS_ENABLED(CONFIG_FS_VERITY) &&
+	    (IS_VERITY(inode) || f2fs_verity_in_progress(inode)))
+		return inode->i_sb->s_maxbytes;
+
+	return i_size_read(inode);
+}
+
+static int f2fs_read_single_page(struct inode *inode, struct page *page,
+					unsigned nr_pages,
+					struct f2fs_map_blocks *map,
+					struct bio **bio_ret,
+					sector_t *last_block_in_bio,
+					bool is_readahead)
+{
+	struct bio *bio = *bio_ret;
+	const unsigned blkbits = inode->i_blkbits;
+	const unsigned blocksize = 1 << blkbits;
+	sector_t block_in_file;
+	sector_t last_block;
+	sector_t last_block_in_file;
+	sector_t block_nr;
+	int ret = 0;
+
+	block_in_file = (sector_t)page_index(page);
+	last_block = block_in_file + nr_pages;
+	last_block_in_file = (f2fs_readpage_limit(inode) + blocksize - 1) >>
+							blkbits;
+	if (last_block > last_block_in_file)
+		last_block = last_block_in_file;
+
+	/* just zeroing out page which is beyond EOF */
+	if (block_in_file >= last_block)
+		goto zero_out;
+	/*
+	 * Map blocks using the previous result first.
+	 */
+	if ((map->m_flags & F2FS_MAP_MAPPED) &&
+			block_in_file > map->m_lblk &&
+			block_in_file < (map->m_lblk + map->m_len))
+		goto got_it;
+
+	/*
+	 * Then do more f2fs_map_blocks() calls until we are
+	 * done with this page.
+	 */
+	map->m_lblk = block_in_file;
+	map->m_len = last_block - block_in_file;
+
+	ret = f2fs_map_blocks(inode, map, 0, F2FS_GET_BLOCK_DEFAULT);
+	if (ret)
+		goto out;
+got_it:
+	if ((map->m_flags & F2FS_MAP_MAPPED)) {
+		block_nr = map->m_pblk + block_in_file - map->m_lblk;
+		SetPageMappedToDisk(page);
+
+		if (!PageUptodate(page) && (!PageSwapCache(page) &&
+					!cleancache_get_page(page))) {
+			SetPageUptodate(page);
+			goto confused;
+		}
+
+		if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), block_nr,
+						DATA_GENERIC_ENHANCE_READ)) {
+			ret = -EFSCORRUPTED;
+			goto out;
+		}
+	} else {
+zero_out:
+		zero_user_segment(page, 0, PAGE_SIZE);
+		if (f2fs_need_verity(inode, page->index) &&
+		    !fsverity_verify_page(page)) {
+			ret = -EIO;
+			goto out;
+		}
+		if (!PageUptodate(page))
+			SetPageUptodate(page);
+		unlock_page(page);
+		goto out;
+	}
+
+	/*
+	 * This page will go to BIO.  Do we need to send this
+	 * BIO off first?
+	 */
+	if (bio && (!page_is_mergeable(F2FS_I_SB(inode), bio,
+				       *last_block_in_bio, block_nr) ||
+		    !f2fs_crypt_mergeable_bio(bio, inode, page->index, NULL))) {
+submit_and_realloc:
+		__f2fs_submit_read_bio(F2FS_I_SB(inode), bio, DATA);
+		bio = NULL;
+	}
+	if (bio == NULL) {
+		bio = f2fs_grab_read_bio(inode, block_nr, nr_pages,
+				is_readahead ? REQ_RAHEAD : 0, page->index);
+		if (IS_ERR(bio)) {
+			ret = PTR_ERR(bio);
+			bio = NULL;
+			goto out;
+		}
+	}
+
+	/*
+	 * If the page is under writeback, we need to wait for
+	 * its completion to see the correct decrypted data.
+	 */
+	f2fs_wait_on_block_writeback(inode, block_nr);
+
+	if (bio_add_page(bio, page, blocksize, 0) < blocksize)
+		goto submit_and_realloc;
+
+	inc_page_count(F2FS_I_SB(inode), F2FS_RD_DATA);
+	ClearPageError(page);
+	*last_block_in_bio = block_nr;
+	goto out;
+confused:
+	if (bio) {
+		__f2fs_submit_read_bio(F2FS_I_SB(inode), bio, DATA);
+		bio = NULL;
+	}
+	unlock_page(page);
+out:
+	*bio_ret = bio;
+	return ret;
+}
+
 /*
  * This function was originally taken from fs/mpage.c, and customized for f2fs.
  * Major change was from block_size == page_size in f2fs by default.
@@ -1473,13 +1983,8 @@
 	struct bio *bio = NULL;
 	sector_t last_block_in_bio = 0;
 	struct inode *inode = mapping->host;
-	const unsigned blkbits = inode->i_blkbits;
-	const unsigned blocksize = 1 << blkbits;
-	sector_t block_in_file;
-	sector_t last_block;
-	sector_t last_block_in_file;
-	sector_t block_nr;
 	struct f2fs_map_blocks map;
+	int ret = 0;
 
 	map.m_pblk = 0;
 	map.m_lblk = 0;
@@ -1488,6 +1993,7 @@
 	map.m_next_pgofs = NULL;
 	map.m_next_extent = NULL;
 	map.m_seg_type = NO_CHECK_TYPE;
+	map.m_may_create = false;
 
 	for (; nr_pages; nr_pages--) {
 		if (pages) {
@@ -1496,116 +2002,31 @@
 			prefetchw(&page->flags);
 			list_del(&page->lru);
 			if (add_to_page_cache_lru(page, mapping,
-						  page->index,
+						  page_index(page),
 						  readahead_gfp_mask(mapping)))
 				goto next_page;
 		}
 
-		block_in_file = (sector_t)page->index;
-		last_block = block_in_file + nr_pages;
-		last_block_in_file = (i_size_read(inode) + blocksize - 1) >>
-								blkbits;
-		if (last_block > last_block_in_file)
-			last_block = last_block_in_file;
-
-		/*
-		 * Map blocks using the previous result first.
-		 */
-		if ((map.m_flags & F2FS_MAP_MAPPED) &&
-				block_in_file > map.m_lblk &&
-				block_in_file < (map.m_lblk + map.m_len))
-			goto got_it;
-
-		/*
-		 * Then do more f2fs_map_blocks() calls until we are
-		 * done with this page.
-		 */
-		map.m_flags = 0;
-
-		if (block_in_file < last_block) {
-			map.m_lblk = block_in_file;
-			map.m_len = last_block - block_in_file;
-
-			if (f2fs_map_blocks(inode, &map, 0,
-						F2FS_GET_BLOCK_DEFAULT))
-				goto set_error_page;
-		}
-got_it:
-		if ((map.m_flags & F2FS_MAP_MAPPED)) {
-			block_nr = map.m_pblk + block_in_file - map.m_lblk;
-			SetPageMappedToDisk(page);
-
-			if (!PageUptodate(page) && !cleancache_get_page(page)) {
-				SetPageUptodate(page);
-				goto confused;
-			}
-
-			if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), block_nr,
-								DATA_GENERIC))
-				goto set_error_page;
-		} else {
+		ret = f2fs_read_single_page(inode, page, nr_pages, &map, &bio,
+					&last_block_in_bio, is_readahead);
+		if (ret) {
+			SetPageError(page);
 			zero_user_segment(page, 0, PAGE_SIZE);
-			if (!PageUptodate(page))
-				SetPageUptodate(page);
 			unlock_page(page);
-			goto next_page;
 		}
-
-		/*
-		 * This page will go to BIO.  Do we need to send this
-		 * BIO off first?
-		 */
-		if (bio && (last_block_in_bio != block_nr - 1 ||
-			!__same_bdev(F2FS_I_SB(inode), block_nr, bio))) {
-submit_and_realloc:
-			__submit_bio(F2FS_I_SB(inode), bio, DATA);
-			bio = NULL;
-		}
-		if (bio == NULL) {
-			bio = f2fs_grab_read_bio(inode, block_nr, nr_pages,
-					is_readahead ? REQ_RAHEAD : 0);
-			if (IS_ERR(bio)) {
-				bio = NULL;
-				goto set_error_page;
-			}
-		}
-
-		/*
-		 * If the page is under writeback, we need to wait for
-		 * its completion to see the correct decrypted data.
-		 */
-		f2fs_wait_on_block_writeback(inode, block_nr);
-
-		if (bio_add_page(bio, page, blocksize, 0) < blocksize)
-			goto submit_and_realloc;
-
-		ClearPageError(page);
-		last_block_in_bio = block_nr;
-		goto next_page;
-set_error_page:
-		SetPageError(page);
-		zero_user_segment(page, 0, PAGE_SIZE);
-		unlock_page(page);
-		goto next_page;
-confused:
-		if (bio) {
-			__submit_bio(F2FS_I_SB(inode), bio, DATA);
-			bio = NULL;
-		}
-		unlock_page(page);
 next_page:
 		if (pages)
 			put_page(page);
 	}
 	BUG_ON(pages && !list_empty(pages));
 	if (bio)
-		__submit_bio(F2FS_I_SB(inode), bio, DATA);
-	return 0;
+		__f2fs_submit_read_bio(F2FS_I_SB(inode), bio, DATA);
+	return pages ? 0 : ret;
 }
 
 static int f2fs_read_data_page(struct file *file, struct page *page)
 {
-	struct inode *inode = page->mapping->host;
+	struct inode *inode = page_file_mapping(page)->host;
 	int ret = -EAGAIN;
 
 	trace_f2fs_readpage(page, DATA);
@@ -1614,7 +2035,8 @@
 	if (f2fs_has_inline_data(inode))
 		ret = f2fs_read_inline_data(inode, page);
 	if (ret == -EAGAIN)
-		ret = f2fs_mpage_readpages(page->mapping, NULL, page, 1, false);
+		ret = f2fs_mpage_readpages(page_file_mapping(page),
+						NULL, page, 1, false);
 	return ret;
 }
 
@@ -1646,9 +2068,13 @@
 	/* wait for GCed page writeback via META_MAPPING */
 	f2fs_wait_on_block_writeback(inode, fio->old_blkaddr);
 
+	if (fscrypt_inode_uses_inline_crypto(inode))
+		return 0;
+
 retry_encrypt:
-	fio->encrypted_page = fscrypt_encrypt_page(inode, fio->page,
-			PAGE_SIZE, 0, fio->page->index, gfp_flags);
+	fio->encrypted_page = fscrypt_encrypt_pagecache_blocks(fio->page,
+							       PAGE_SIZE, 0,
+							       gfp_flags);
 	if (IS_ERR(fio->encrypted_page)) {
 		/* flush pending IOs and wait for a while in the ENOMEM case */
 		if (PTR_ERR(fio->encrypted_page) == -ENOMEM) {
@@ -1693,7 +2119,7 @@
 	if (policy & (0x1 << F2FS_IPU_ASYNC) &&
 			fio && fio->op == REQ_OP_WRITE &&
 			!(fio->op_flags & REQ_SYNC) &&
-			!f2fs_encrypted_inode(inode))
+			!IS_ENCRYPTED(inode))
 		return true;
 
 	/* this is only set during fdatasync */
@@ -1701,6 +2127,10 @@
 			is_inode_flag_set(inode, FI_NEED_IPU))
 		return true;
 
+	if (unlikely(fio && is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
+			!f2fs_is_checkpointed_data(sbi, fio->old_blkaddr)))
+		return true;
+
 	return false;
 }
 
@@ -1724,6 +2154,8 @@
 		return true;
 	if (S_ISDIR(inode->i_mode))
 		return true;
+	if (IS_NOQUOTA(inode))
+		return true;
 	if (f2fs_is_atomic_file(inode))
 		return true;
 	if (fio) {
@@ -1731,6 +2163,9 @@
 			return true;
 		if (IS_ATOMIC_WRITTEN_PAGE(fio->page))
 			return true;
+		if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
+			f2fs_is_checkpointed_data(sbi, fio->old_blkaddr)))
+			return true;
 	}
 	return false;
 }
@@ -1761,7 +2196,7 @@
 		fio->old_blkaddr = ei.blk + page->index - ei.fofs;
 
 		if (!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr,
-							DATA_GENERIC))
+						DATA_GENERIC_ENHANCE))
 			return -EFSCORRUPTED;
 
 		ipu_force = true;
@@ -1788,7 +2223,7 @@
 got_it:
 	if (__is_valid_data_blkaddr(fio->old_blkaddr) &&
 		!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr,
-							DATA_GENERIC)) {
+						DATA_GENERIC_ENHANCE)) {
 		err = -EFSCORRUPTED;
 		goto out_writepage;
 	}
@@ -1796,7 +2231,8 @@
 	 * If current allocation needs SSR,
 	 * it had better in-place writes for updated data.
 	 */
-	if (ipu_force || (is_valid_data_blkaddr(fio->sbi, fio->old_blkaddr) &&
+	if (ipu_force ||
+		(__is_valid_data_blkaddr(fio->old_blkaddr) &&
 					need_inplace_update(fio))) {
 		err = encrypt_one_page(fio);
 		if (err)
@@ -1808,8 +2244,15 @@
 		if (fio->need_lock == LOCK_REQ)
 			f2fs_unlock_op(fio->sbi);
 		err = f2fs_inplace_write_data(fio);
+		if (err) {
+			if (fscrypt_inode_uses_fs_layer_crypto(inode))
+				fscrypt_finalize_bounce_page(&fio->encrypted_page);
+			if (PageWriteback(page))
+				end_page_writeback(page);
+		} else {
+			set_inode_flag(inode, FI_UPDATE_WRITE);
+		}
 		trace_f2fs_do_write_data_page(fio->page, IPU);
-		set_inode_flag(inode, FI_UPDATE_WRITE);
 		return err;
 	}
 
@@ -1849,6 +2292,8 @@
 }
 
 static int __write_data_page(struct page *page, bool *submitted,
+				struct bio **bio,
+				sector_t *last_block,
 				struct writeback_control *wbc,
 				enum iostat_type io_type)
 {
@@ -1857,7 +2302,7 @@
 	loff_t i_size = i_size_read(inode);
 	const pgoff_t end_index = ((unsigned long long) i_size)
 							>> PAGE_SHIFT;
-	loff_t psize = (page->index + 1) << PAGE_SHIFT;
+	loff_t psize = (loff_t)(page->index + 1) << PAGE_SHIFT;
 	unsigned offset = 0;
 	bool need_balance_fs = false;
 	int err = 0;
@@ -1874,6 +2319,8 @@
 		.need_lock = LOCK_RETRY,
 		.io_type = io_type,
 		.io_wbc = wbc,
+		.bio = bio,
+		.last_block = last_block,
 	};
 
 	trace_f2fs_writepage(page, DATA);
@@ -1893,7 +2340,7 @@
 	if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
 		goto redirty_out;
 
-	if (page->index < end_index)
+	if (page->index < end_index || f2fs_verity_in_progress(inode))
 		goto write;
 
 	/*
@@ -1964,18 +2411,20 @@
 	}
 
 	if (wbc->for_reclaim) {
-		f2fs_submit_merged_write_cond(sbi, inode, 0, page->index, DATA);
+		f2fs_submit_merged_write_cond(sbi, NULL, page, 0, DATA);
 		clear_inode_flag(inode, FI_HOT_DATA);
 		f2fs_remove_dirty_inode(inode);
 		submitted = NULL;
 	}
 
 	unlock_page(page);
-	if (!S_ISDIR(inode->i_mode))
+	if (!S_ISDIR(inode->i_mode) && !IS_NOQUOTA(inode) &&
+					!F2FS_I(inode)->cp_task)
 		f2fs_balance_fs(sbi, need_balance_fs);
 
 	if (unlikely(f2fs_cp_error(sbi))) {
 		f2fs_submit_merged_write(sbi, DATA);
+		f2fs_submit_merged_ipu_write(sbi, bio, NULL);
 		submitted = NULL;
 	}
 
@@ -2001,7 +2450,7 @@
 static int f2fs_write_data_page(struct page *page,
 					struct writeback_control *wbc)
 {
-	return __write_data_page(page, NULL, wbc, FS_DATA_IO);
+	return __write_data_page(page, NULL, NULL, NULL, wbc, FS_DATA_IO);
 }
 
 /*
@@ -2017,15 +2466,17 @@
 	int done = 0;
 	struct pagevec pvec;
 	struct f2fs_sb_info *sbi = F2FS_M_SB(mapping);
+	struct bio *bio = NULL;
+	sector_t last_block;
 	int nr_pages;
 	pgoff_t uninitialized_var(writeback_index);
 	pgoff_t index;
 	pgoff_t end;		/* Inclusive */
 	pgoff_t done_index;
-	pgoff_t last_idx = ULONG_MAX;
 	int cycled;
 	int range_whole = 0;
 	int tag;
+	int nwritten = 0;
 
 	pagevec_init(&pvec);
 
@@ -2095,16 +2546,16 @@
 			if (PageWriteback(page)) {
 				if (wbc->sync_mode != WB_SYNC_NONE)
 					f2fs_wait_on_page_writeback(page,
-								DATA, true);
+							DATA, true, true);
 				else
 					goto continue_unlock;
 			}
 
-			BUG_ON(PageWriteback(page));
 			if (!clear_page_dirty_for_io(page))
 				goto continue_unlock;
 
-			ret = __write_data_page(page, &submitted, wbc, io_type);
+			ret = __write_data_page(page, &submitted, &bio,
+					&last_block, wbc, io_type);
 			if (unlikely(ret)) {
 				/*
 				 * keep nr_to_write, since vfs uses this to
@@ -2128,7 +2579,7 @@
 				done = 1;
 				break;
 			} else if (submitted) {
-				last_idx = page->index;
+				nwritten++;
 			}
 
 			if (--wbc->nr_to_write <= 0 &&
@@ -2150,9 +2601,12 @@
 	if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
 		mapping->writeback_index = done_index;
 
-	if (last_idx != ULONG_MAX)
+	if (nwritten)
 		f2fs_submit_merged_write_cond(F2FS_M_SB(mapping), mapping->host,
-						0, last_idx, DATA);
+								NULL, 0, DATA);
+	/* submit cached bio of IPU write */
+	if (bio)
+		f2fs_submit_merged_ipu_write(sbi, &bio, NULL);
 
 	return ret;
 }
@@ -2162,6 +2616,11 @@
 {
 	if (!S_ISREG(inode->i_mode))
 		return false;
+	if (IS_NOQUOTA(inode))
+		return false;
+	/* to avoid deadlock in path of data flush */
+	if (F2FS_I(inode)->cp_task)
+		return false;
 	if (wbc->sync_mode != WB_SYNC_ALL)
 		return true;
 	if (get_dirty_pages(inode) >= SM_I(F2FS_I_SB(inode))->min_seq_blocks)
@@ -2191,7 +2650,8 @@
 	if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
 		goto skip_write;
 
-	if (S_ISDIR(inode->i_mode) && wbc->sync_mode == WB_SYNC_NONE &&
+	if ((S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) &&
+			wbc->sync_mode == WB_SYNC_NONE &&
 			get_dirty_pages(inode) < nr_pages_to_skip(sbi, DATA) &&
 			f2fs_available_free_memory(sbi, DIRTY_DENTS))
 		goto skip_write;
@@ -2251,12 +2711,14 @@
 	struct inode *inode = mapping->host;
 	loff_t i_size = i_size_read(inode);
 
-	if (to > i_size) {
+	/* In the fs-verity case, f2fs_end_enable_verity() does the truncate */
+	if (to > i_size && !f2fs_verity_in_progress(inode)) {
 		down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
 		down_write(&F2FS_I(inode)->i_mmap_sem);
 
 		truncate_pagecache(inode, i_size);
-		f2fs_truncate_blocks(inode, i_size, true);
+		if (!IS_NOQUOTA(inode))
+			f2fs_truncate_blocks(inode, i_size, true);
 
 		up_write(&F2FS_I(inode)->i_mmap_sem);
 		up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
@@ -2281,7 +2743,8 @@
 	 * the block addresses when there is no need to fill the page.
 	 */
 	if (!f2fs_has_inline_data(inode) && len == PAGE_SIZE &&
-			!is_inode_flag_set(inode, FI_NO_PREALLOC))
+	    !is_inode_flag_set(inode, FI_NO_PREALLOC) &&
+	    !f2fs_verity_in_progress(inode))
 		return 0;
 
 	/* f2fs_lock_op avoids race between write CP and convert_inline_page */
@@ -2360,8 +2823,23 @@
 	block_t blkaddr = NULL_ADDR;
 	int err = 0;
 
+	if (trace_android_fs_datawrite_start_enabled()) {
+		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+		path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    inode);
+		trace_android_fs_datawrite_start(inode, pos, len,
+						 current->pid, path,
+						 current->comm);
+	}
 	trace_f2fs_write_begin(inode, pos, len, flags);
 
+	if (!f2fs_is_checkpoint_ready(sbi)) {
+		err = -ENOSPC;
+		goto fail;
+	}
+
 	if ((f2fs_is_atomic_file(inode) &&
 			!f2fs_available_free_memory(sbi, INMEM_PAGES)) ||
 			is_inode_flag_set(inode, FI_ATOMIC_REVOKE_REQUEST)) {
@@ -2399,7 +2877,8 @@
 	if (err)
 		goto fail;
 
-	if (need_balance && has_not_enough_free_secs(sbi, 0, 0)) {
+	if (need_balance && !IS_NOQUOTA(inode) &&
+			has_not_enough_free_secs(sbi, 0, 0)) {
 		unlock_page(page);
 		f2fs_balance_fs(sbi, true);
 		lock_page(page);
@@ -2410,12 +2889,13 @@
 		}
 	}
 
-	f2fs_wait_on_page_writeback(page, DATA, false);
+	f2fs_wait_on_page_writeback(page, DATA, false, true);
 
 	if (len == PAGE_SIZE || PageUptodate(page))
 		return 0;
 
-	if (!(pos & (PAGE_SIZE - 1)) && (pos + len) >= i_size_read(inode)) {
+	if (!(pos & (PAGE_SIZE - 1)) && (pos + len) >= i_size_read(inode) &&
+	    !f2fs_verity_in_progress(inode)) {
 		zero_user_segment(page, len, PAGE_SIZE);
 		return 0;
 	}
@@ -2424,6 +2904,11 @@
 		zero_user_segment(page, 0, PAGE_SIZE);
 		SetPageUptodate(page);
 	} else {
+		if (!f2fs_is_valid_blkaddr(sbi, blkaddr,
+				DATA_GENERIC_ENHANCE_READ)) {
+			err = -EFSCORRUPTED;
+			goto fail;
+		}
 		err = f2fs_submit_page_read(inode, page, blkaddr);
 		if (err)
 			goto fail;
@@ -2455,6 +2940,7 @@
 {
 	struct inode *inode = page->mapping->host;
 
+	trace_android_fs_datawrite_end(inode, pos, len);
 	trace_f2fs_write_end(inode, pos, len, copied);
 
 	/*
@@ -2473,7 +2959,8 @@
 
 	set_page_dirty(page);
 
-	if (pos + copied > i_size_read(inode))
+	if (pos + copied > i_size_read(inode) &&
+	    !f2fs_verity_in_progress(inode))
 		f2fs_i_size_write(inode, pos + copied);
 unlock_out:
 	f2fs_put_page(page, 1);
@@ -2501,41 +2988,128 @@
 	return 0;
 }
 
+static void f2fs_dio_end_io(struct bio *bio)
+{
+	struct f2fs_private_dio *dio = bio->bi_private;
+
+	dec_page_count(F2FS_I_SB(dio->inode),
+			dio->write ? F2FS_DIO_WRITE : F2FS_DIO_READ);
+
+	bio->bi_private = dio->orig_private;
+	bio->bi_end_io = dio->orig_end_io;
+
+	kvfree(dio);
+
+	bio_endio(bio);
+}
+
+static void f2fs_dio_submit_bio(struct bio *bio, struct inode *inode,
+							loff_t file_offset)
+{
+	struct f2fs_private_dio *dio;
+	bool write = (bio_op(bio) == REQ_OP_WRITE);
+
+	dio = f2fs_kzalloc(F2FS_I_SB(inode),
+			sizeof(struct f2fs_private_dio), GFP_NOFS);
+	if (!dio)
+		goto out;
+
+	dio->inode = inode;
+	dio->orig_end_io = bio->bi_end_io;
+	dio->orig_private = bio->bi_private;
+	dio->write = write;
+
+	bio->bi_end_io = f2fs_dio_end_io;
+	bio->bi_private = dio;
+
+	inc_page_count(F2FS_I_SB(inode),
+			write ? F2FS_DIO_WRITE : F2FS_DIO_READ);
+
+	submit_bio(bio);
+	return;
+out:
+	bio->bi_status = BLK_STS_IOERR;
+	bio_endio(bio);
+}
+
 static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
 {
 	struct address_space *mapping = iocb->ki_filp->f_mapping;
 	struct inode *inode = mapping->host;
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+	struct f2fs_inode_info *fi = F2FS_I(inode);
 	size_t count = iov_iter_count(iter);
 	loff_t offset = iocb->ki_pos;
 	int rw = iov_iter_rw(iter);
 	int err;
 	enum rw_hint hint = iocb->ki_hint;
 	int whint_mode = F2FS_OPTION(sbi).whint_mode;
+	bool do_opu;
 
 	err = check_direct_IO(inode, iter, offset);
 	if (err)
 		return err < 0 ? err : 0;
 
-	if (f2fs_force_buffered_io(inode, rw))
+	if (f2fs_force_buffered_io(inode, iocb, iter))
 		return 0;
 
+	do_opu = allow_outplace_dio(inode, iocb, iter);
+
 	trace_f2fs_direct_IO_enter(inode, offset, count, rw);
 
+	if (trace_android_fs_dataread_start_enabled() &&
+	    (rw == READ)) {
+		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+		path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    inode);
+		trace_android_fs_dataread_start(inode, offset,
+						count, current->pid, path,
+						current->comm);
+	}
+	if (trace_android_fs_datawrite_start_enabled() &&
+	    (rw == WRITE)) {
+		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+		path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    inode);
+		trace_android_fs_datawrite_start(inode, offset, count,
+						 current->pid, path,
+						 current->comm);
+	}
+
 	if (rw == WRITE && whint_mode == WHINT_MODE_OFF)
 		iocb->ki_hint = WRITE_LIFE_NOT_SET;
 
-	if (!down_read_trylock(&F2FS_I(inode)->i_gc_rwsem[rw])) {
-		if (iocb->ki_flags & IOCB_NOWAIT) {
+	if (iocb->ki_flags & IOCB_NOWAIT) {
+		if (!down_read_trylock(&fi->i_gc_rwsem[rw])) {
 			iocb->ki_hint = hint;
 			err = -EAGAIN;
 			goto out;
 		}
-		down_read(&F2FS_I(inode)->i_gc_rwsem[rw]);
+		if (do_opu && !down_read_trylock(&fi->i_gc_rwsem[READ])) {
+			up_read(&fi->i_gc_rwsem[rw]);
+			iocb->ki_hint = hint;
+			err = -EAGAIN;
+			goto out;
+		}
+	} else {
+		down_read(&fi->i_gc_rwsem[rw]);
+		if (do_opu)
+			down_read(&fi->i_gc_rwsem[READ]);
 	}
 
-	err = blockdev_direct_IO(iocb, inode, iter, get_data_block_dio);
-	up_read(&F2FS_I(inode)->i_gc_rwsem[rw]);
+	err = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev,
+			iter, rw == WRITE ? get_data_block_dio_write :
+			get_data_block_dio, NULL, f2fs_dio_submit_bio,
+			DIO_LOCKING | DIO_SKIP_HOLES);
+
+	if (do_opu)
+		up_read(&fi->i_gc_rwsem[READ]);
+
+	up_read(&fi->i_gc_rwsem[rw]);
 
 	if (rw == WRITE) {
 		if (whint_mode == WHINT_MODE_OFF)
@@ -2543,13 +3117,21 @@
 		if (err > 0) {
 			f2fs_update_iostat(F2FS_I_SB(inode), APP_DIRECT_IO,
 									err);
-			set_inode_flag(inode, FI_UPDATE_WRITE);
+			if (!do_opu)
+				set_inode_flag(inode, FI_UPDATE_WRITE);
 		} else if (err < 0) {
 			f2fs_write_failed(mapping, offset + count);
 		}
 	}
 
 out:
+	if (trace_android_fs_dataread_start_enabled() &&
+	    (rw == READ))
+		trace_android_fs_dataread_end(inode, offset, count);
+	if (trace_android_fs_datawrite_start_enabled() &&
+	    (rw == WRITE))
+		trace_android_fs_datawrite_end(inode, offset, count);
+
 	trace_f2fs_direct_IO_exit(inode, offset, count, rw, err);
 
 	return err;
@@ -2578,12 +3160,10 @@
 
 	clear_cold_data(page);
 
-	/* This is atomic written page, keep Private */
 	if (IS_ATOMIC_WRITTEN_PAGE(page))
 		return f2fs_drop_inmem_page(inode, page);
 
-	set_page_private(page, 0);
-	ClearPagePrivate(page);
+	f2fs_clear_page_private(page);
 }
 
 int f2fs_release_page(struct page *page, gfp_t wait)
@@ -2597,20 +3177,20 @@
 		return 0;
 
 	clear_cold_data(page);
-	set_page_private(page, 0);
-	ClearPagePrivate(page);
+	f2fs_clear_page_private(page);
 	return 1;
 }
 
 static int f2fs_set_data_page_dirty(struct page *page)
 {
-	struct address_space *mapping = page->mapping;
-	struct inode *inode = mapping->host;
+	struct inode *inode = page_file_mapping(page)->host;
 
 	trace_f2fs_set_page_dirty(page, DATA);
 
 	if (!PageUptodate(page))
 		SetPageUptodate(page);
+	if (PageSwapCache(page))
+		return __set_page_dirty_nobuffers(page);
 
 	if (f2fs_is_atomic_file(inode) && !f2fs_is_commit_atomic_write(inode)) {
 		if (!IS_ATOMIC_WRITTEN_PAGE(page)) {
@@ -2666,12 +3246,8 @@
 			return -EAGAIN;
 	}
 
-	/*
-	 * A reference is expected if PagePrivate set when move mapping,
-	 * however F2FS breaks this for maintaining dirty page counts when
-	 * truncating pages. So here adjusting the 'extra_count' make it work.
-	 */
-	extra_count = (atomic_written ? 1 : 0) - page_has_private(page);
+	/* one extra reference was held for atomic_write page */
+	extra_count = atomic_written ? 1 : 0;
 	rc = migrate_page_move_mapping(mapping, newpage,
 				page, NULL, mode, extra_count);
 	if (rc != MIGRATEPAGE_SUCCESS) {
@@ -2692,9 +3268,10 @@
 		get_page(newpage);
 	}
 
-	if (PagePrivate(page))
-		SetPagePrivate(newpage);
-	set_page_private(newpage, page_private(page));
+	if (PagePrivate(page)) {
+		f2fs_set_page_private(newpage, page_private(page));
+		f2fs_clear_page_private(page);
+	}
 
 	if (mode != MIGRATE_SYNC_NO_COPY)
 		migrate_page_copy(newpage, page);
@@ -2705,6 +3282,126 @@
 }
 #endif
 
+#ifdef CONFIG_SWAP
+/* Copied from generic_swapfile_activate() to check any holes */
+static int check_swap_activate(struct file *swap_file, unsigned int max)
+{
+	struct address_space *mapping = swap_file->f_mapping;
+	struct inode *inode = mapping->host;
+	unsigned blocks_per_page;
+	unsigned long page_no;
+	unsigned blkbits;
+	sector_t probe_block;
+	sector_t last_block;
+	sector_t lowest_block = -1;
+	sector_t highest_block = 0;
+
+	blkbits = inode->i_blkbits;
+	blocks_per_page = PAGE_SIZE >> blkbits;
+
+	/*
+	 * Map all the blocks into the extent list.  This code doesn't try
+	 * to be very smart.
+	 */
+	probe_block = 0;
+	page_no = 0;
+	last_block = i_size_read(inode) >> blkbits;
+	while ((probe_block + blocks_per_page) <= last_block && page_no < max) {
+		unsigned block_in_page;
+		sector_t first_block;
+
+		cond_resched();
+
+		first_block = bmap(inode, probe_block);
+		if (first_block == 0)
+			goto bad_bmap;
+
+		/*
+		 * It must be PAGE_SIZE aligned on-disk
+		 */
+		if (first_block & (blocks_per_page - 1)) {
+			probe_block++;
+			goto reprobe;
+		}
+
+		for (block_in_page = 1; block_in_page < blocks_per_page;
+					block_in_page++) {
+			sector_t block;
+
+			block = bmap(inode, probe_block + block_in_page);
+			if (block == 0)
+				goto bad_bmap;
+			if (block != first_block + block_in_page) {
+				/* Discontiguity */
+				probe_block++;
+				goto reprobe;
+			}
+		}
+
+		first_block >>= (PAGE_SHIFT - blkbits);
+		if (page_no) {	/* exclude the header page */
+			if (first_block < lowest_block)
+				lowest_block = first_block;
+			if (first_block > highest_block)
+				highest_block = first_block;
+		}
+
+		page_no++;
+		probe_block += blocks_per_page;
+reprobe:
+		continue;
+	}
+	return 0;
+
+bad_bmap:
+	pr_err("swapon: swapfile has holes\n");
+	return -EINVAL;
+}
+
+static int f2fs_swap_activate(struct swap_info_struct *sis, struct file *file,
+				sector_t *span)
+{
+	struct inode *inode = file_inode(file);
+	int ret;
+
+	if (!S_ISREG(inode->i_mode))
+		return -EINVAL;
+
+	if (f2fs_readonly(F2FS_I_SB(inode)->sb))
+		return -EROFS;
+
+	ret = f2fs_convert_inline_inode(inode);
+	if (ret)
+		return ret;
+
+	ret = check_swap_activate(file, sis->max);
+	if (ret)
+		return ret;
+
+	set_inode_flag(inode, FI_PIN_FILE);
+	f2fs_precache_extents(inode);
+	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
+	return 0;
+}
+
+static void f2fs_swap_deactivate(struct file *file)
+{
+	struct inode *inode = file_inode(file);
+
+	clear_inode_flag(inode, FI_PIN_FILE);
+}
+#else
+static int f2fs_swap_activate(struct swap_info_struct *sis, struct file *file,
+				sector_t *span)
+{
+	return -EOPNOTSUPP;
+}
+
+static void f2fs_swap_deactivate(struct file *file)
+{
+}
+#endif
+
 const struct address_space_operations f2fs_dblock_aops = {
 	.readpage	= f2fs_read_data_page,
 	.readpages	= f2fs_read_data_pages,
@@ -2717,6 +3414,8 @@
 	.releasepage	= f2fs_release_page,
 	.direct_IO	= f2fs_direct_IO,
 	.bmap		= f2fs_bmap,
+	.swap_activate  = f2fs_swap_activate,
+	.swap_deactivate = f2fs_swap_deactivate,
 #ifdef CONFIG_MIGRATION
 	.migratepage    = f2fs_migrate_page,
 #endif
@@ -2735,7 +3434,9 @@
 
 int __init f2fs_init_post_read_processing(void)
 {
-	bio_post_read_ctx_cache = KMEM_CACHE(bio_post_read_ctx, 0);
+	bio_post_read_ctx_cache =
+		kmem_cache_create("f2fs_bio_post_read_ctx",
+				  sizeof(struct bio_post_read_ctx), 0, 0, NULL);
 	if (!bio_post_read_ctx_cache)
 		goto fail;
 	bio_post_read_ctx_pool =
@@ -2751,8 +3452,22 @@
 	return -ENOMEM;
 }
 
-void __exit f2fs_destroy_post_read_processing(void)
+void f2fs_destroy_post_read_processing(void)
 {
 	mempool_destroy(bio_post_read_ctx_pool);
 	kmem_cache_destroy(bio_post_read_ctx_cache);
 }
+
+int __init f2fs_init_bio_entry_cache(void)
+{
+	bio_entry_slab = f2fs_kmem_cache_create("bio_entry_slab",
+			sizeof(struct bio_entry));
+	if (!bio_entry_slab)
+		return -ENOMEM;
+	return 0;
+}
+
+void __exit f2fs_destroy_bio_entry_cache(void)
+{
+	kmem_cache_destroy(bio_entry_slab);
+}
diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c
index bbe1554..9b0bedd 100644
--- a/fs/f2fs/debug.c
+++ b/fs/f2fs/debug.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * f2fs debugging statistics
  *
@@ -5,10 +6,6 @@
  *             http://www.samsung.com/
  * Copyright (c) 2012 Linux Foundation
  * Copyright (c) 2012 Greg Kroah-Hartman <gregkh@linuxfoundation.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 
 #include <linux/fs.h>
@@ -30,8 +27,15 @@
 static void update_general_status(struct f2fs_sb_info *sbi)
 {
 	struct f2fs_stat_info *si = F2FS_STAT(sbi);
+	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
 	int i;
 
+	/* these will be changed if online resize is done */
+	si->main_area_segs = le32_to_cpu(raw_super->segment_count_main);
+	si->main_area_sections = le32_to_cpu(raw_super->section_count);
+	si->main_area_zones = si->main_area_sections /
+				le32_to_cpu(raw_super->secs_per_zone);
+
 	/* validation check of the segment numbers */
 	si->hit_largest = atomic64_read(&sbi->read_hit_largest);
 	si->hit_cached = atomic64_read(&sbi->read_hit_cached);
@@ -56,21 +60,26 @@
 	si->vw_cnt = atomic_read(&sbi->vw_cnt);
 	si->max_aw_cnt = atomic_read(&sbi->max_aw_cnt);
 	si->max_vw_cnt = atomic_read(&sbi->max_vw_cnt);
+	si->nr_dio_read = get_pages(sbi, F2FS_DIO_READ);
+	si->nr_dio_write = get_pages(sbi, F2FS_DIO_WRITE);
 	si->nr_wb_cp_data = get_pages(sbi, F2FS_WB_CP_DATA);
 	si->nr_wb_data = get_pages(sbi, F2FS_WB_DATA);
-	if (SM_I(sbi) && SM_I(sbi)->fcc_info) {
+	si->nr_rd_data = get_pages(sbi, F2FS_RD_DATA);
+	si->nr_rd_node = get_pages(sbi, F2FS_RD_NODE);
+	si->nr_rd_meta = get_pages(sbi, F2FS_RD_META);
+	if (SM_I(sbi)->fcc_info) {
 		si->nr_flushed =
 			atomic_read(&SM_I(sbi)->fcc_info->issued_flush);
 		si->nr_flushing =
-			atomic_read(&SM_I(sbi)->fcc_info->issing_flush);
+			atomic_read(&SM_I(sbi)->fcc_info->queued_flush);
 		si->flush_list_empty =
 			llist_empty(&SM_I(sbi)->fcc_info->issue_list);
 	}
-	if (SM_I(sbi) && SM_I(sbi)->dcc_info) {
+	if (SM_I(sbi)->dcc_info) {
 		si->nr_discarded =
 			atomic_read(&SM_I(sbi)->dcc_info->issued_discard);
 		si->nr_discarding =
-			atomic_read(&SM_I(sbi)->dcc_info->issing_discard);
+			atomic_read(&SM_I(sbi)->dcc_info->queued_discard);
 		si->nr_discard_cmd =
 			atomic_read(&SM_I(sbi)->dcc_info->discard_cmd_cnt);
 		si->undiscard_blks = SM_I(sbi)->dcc_info->undiscard_blks;
@@ -106,6 +115,8 @@
 	si->avail_nids = NM_I(sbi)->available_nids;
 	si->alloc_nids = NM_I(sbi)->nid_cnt[PREALLOC_NID];
 	si->bg_gc = sbi->bg_gc;
+	si->io_skip_bggc = sbi->io_skip_bggc;
+	si->other_skip_bggc = sbi->other_skip_bggc;
 	si->skipped_atomic_files[BG_GC] = sbi->skipped_atomic_files[BG_GC];
 	si->skipped_atomic_files[FG_GC] = sbi->skipped_atomic_files[FG_GC];
 	si->util_free = (int)(free_user_blocks(sbi) >> sbi->log_blocks_per_seg)
@@ -123,6 +134,9 @@
 		si->curzone[i] = GET_ZONE_FROM_SEC(sbi, si->cursec[i]);
 	}
 
+	for (i = META_CP; i < META_MAX; i++)
+		si->meta_count[i] = atomic_read(&sbi->meta_count[i]);
+
 	for (i = 0; i < 2; i++) {
 		si->segment_count[i] = sbi->segment_count[i];
 		si->block_count[i] = sbi->block_count[i];
@@ -193,7 +207,7 @@
 	si->base_mem += 2 * SIT_VBLOCK_MAP_SIZE * MAIN_SEGS(sbi);
 	si->base_mem += SIT_VBLOCK_MAP_SIZE * MAIN_SEGS(sbi);
 	si->base_mem += SIT_VBLOCK_MAP_SIZE;
-	if (sbi->segs_per_sec > 1)
+	if (__is_large_section(sbi))
 		si->base_mem += MAIN_SECS(sbi) * sizeof(struct sec_entry);
 	si->base_mem += __bitmap_size(sbi, SIT_BITMAP);
 
@@ -275,7 +289,8 @@
 		seq_printf(s, "\n=====[ partition info(%pg). #%d, %s, CP: %s]=====\n",
 			si->sbi->sb->s_bdev, i++,
 			f2fs_readonly(si->sbi->sb) ? "RO": "RW",
-			f2fs_cp_error(si->sbi) ? "Error": "Good");
+			is_set_ckpt_flags(si->sbi, CP_DISABLED_FLAG) ?
+			"Disabled": (f2fs_cp_error(si->sbi) ? "Error": "Good"));
 		seq_printf(s, "[SB: 1] [CP: 2] [SIT: %d] [NAT: %d] ",
 			   si->sit_area_segs, si->nat_area_segs);
 		seq_printf(s, "[SSA: %d] [MAIN: %d",
@@ -337,6 +352,13 @@
 			   si->prefree_count, si->free_segs, si->free_secs);
 		seq_printf(s, "CP calls: %d (BG: %d)\n",
 				si->cp_count, si->bg_cp_count);
+		seq_printf(s, "  - cp blocks : %u\n", si->meta_count[META_CP]);
+		seq_printf(s, "  - sit blocks : %u\n",
+				si->meta_count[META_SIT]);
+		seq_printf(s, "  - nat blocks : %u\n",
+				si->meta_count[META_NAT]);
+		seq_printf(s, "  - ssa blocks : %u\n",
+				si->meta_count[META_SSA]);
 		seq_printf(s, "GC calls: %d (BG: %d)\n",
 			   si->call_count, si->bg_gc);
 		seq_printf(s, "  - data segments : %d (%d)\n",
@@ -353,6 +375,8 @@
 				si->skipped_atomic_files[BG_GC] +
 				si->skipped_atomic_files[FG_GC],
 				si->skipped_atomic_files[BG_GC]);
+		seq_printf(s, "BG skip : IO: %u, Other: %u\n",
+				si->io_skip_bggc, si->other_skip_bggc);
 		seq_puts(s, "\nExtent Cache:\n");
 		seq_printf(s, "  - Hit Count: L1-1:%llu L1-2:%llu L2:%llu\n",
 				si->hit_largest, si->hit_cached,
@@ -364,7 +388,11 @@
 		seq_printf(s, "  - Inner Struct Count: tree: %d(%d), node: %d\n",
 				si->ext_tree, si->zombie_tree, si->ext_node);
 		seq_puts(s, "\nBalancing F2FS Async:\n");
-		seq_printf(s, "  - IO (CP: %4d, Data: %4d, Flush: (%4d %4d %4d), "
+		seq_printf(s, "  - DIO (R: %4d, W: %4d)\n",
+			   si->nr_dio_read, si->nr_dio_write);
+		seq_printf(s, "  - IO_R (Data: %4d, Node: %4d, Meta: %4d\n",
+			   si->nr_rd_data, si->nr_rd_node, si->nr_rd_meta);
+		seq_printf(s, "  - IO_W (CP: %4d, Data: %4d, Flush: (%4d %4d %4d), "
 			"Discard: (%4d %4d)) cmd: %4d undiscard:%4u\n",
 			   si->nr_wb_cp_data, si->nr_wb_data,
 			   si->nr_flushing, si->nr_flushed,
@@ -432,23 +460,13 @@
 	return 0;
 }
 
-static int stat_open(struct inode *inode, struct file *file)
-{
-	return single_open(file, stat_show, inode->i_private);
-}
-
-static const struct file_operations stat_fops = {
-	.owner = THIS_MODULE,
-	.open = stat_open,
-	.read = seq_read,
-	.llseek = seq_lseek,
-	.release = single_release,
-};
+DEFINE_SHOW_ATTRIBUTE(stat);
 
 int f2fs_build_stats(struct f2fs_sb_info *sbi)
 {
 	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
 	struct f2fs_stat_info *si;
+	int i;
 
 	si = f2fs_kzalloc(sbi, sizeof(struct f2fs_stat_info), GFP_KERNEL);
 	if (!si)
@@ -474,6 +492,8 @@
 	atomic_set(&sbi->inline_inode, 0);
 	atomic_set(&sbi->inline_dir, 0);
 	atomic_set(&sbi->inplace_count, 0);
+	for (i = META_CP; i < META_MAX; i++)
+		atomic_set(&sbi->meta_count[i], 0);
 
 	atomic_set(&sbi->aw_cnt, 0);
 	atomic_set(&sbi->vw_cnt, 0);
@@ -495,33 +515,19 @@
 	list_del(&si->stat_list);
 	mutex_unlock(&f2fs_stat_mutex);
 
-	kfree(si);
+	kvfree(si);
 }
 
-int __init f2fs_create_root_stats(void)
+void __init f2fs_create_root_stats(void)
 {
-	struct dentry *file;
-
 	f2fs_debugfs_root = debugfs_create_dir("f2fs", NULL);
-	if (!f2fs_debugfs_root)
-		return -ENOMEM;
 
-	file = debugfs_create_file("status", S_IRUGO, f2fs_debugfs_root,
-			NULL, &stat_fops);
-	if (!file) {
-		debugfs_remove(f2fs_debugfs_root);
-		f2fs_debugfs_root = NULL;
-		return -ENOMEM;
-	}
-
-	return 0;
+	debugfs_create_file("status", S_IRUGO, f2fs_debugfs_root, NULL,
+			    &stat_fops);
 }
 
 void f2fs_destroy_root_stats(void)
 {
-	if (!f2fs_debugfs_root)
-		return;
-
 	debugfs_remove_recursive(f2fs_debugfs_root);
 	f2fs_debugfs_root = NULL;
 }
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index cd611a5..dbb9f5a 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -1,16 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/dir.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
 #include <linux/sched/signal.h>
+#include <linux/unicode.h>
 #include "f2fs.h"
 #include "node.h"
 #include "acl.h"
@@ -84,7 +82,8 @@
 	return bidx;
 }
 
-static struct f2fs_dir_entry *find_in_block(struct page *dentry_page,
+static struct f2fs_dir_entry *find_in_block(struct inode *dir,
+				struct page *dentry_page,
 				struct fscrypt_name *fname,
 				f2fs_hash_t namehash,
 				int *max_slots,
@@ -96,7 +95,7 @@
 
 	dentry_blk = (struct f2fs_dentry_block *)page_address(dentry_page);
 
-	make_dentry_ptr_block(NULL, &d, dentry_blk);
+	make_dentry_ptr_block(dir, &d, dentry_blk);
 	de = f2fs_find_target_dentry(fname, namehash, max_slots, &d);
 	if (de)
 		*res_page = dentry_page;
@@ -104,14 +103,116 @@
 	return de;
 }
 
+#ifdef CONFIG_UNICODE
+/*
+ * Test whether a case-insensitive directory entry matches the filename
+ * being searched for.
+ *
+ * Returns: 0 if the directory entry matches, more than 0 if it
+ * doesn't match or less than zero on error.
+ */
+int f2fs_ci_compare(const struct inode *parent, const struct qstr *name,
+				const struct qstr *entry, bool quick)
+{
+	const struct f2fs_sb_info *sbi = F2FS_SB(parent->i_sb);
+	const struct unicode_map *um = sbi->s_encoding;
+	int ret;
+
+	if (quick)
+		ret = utf8_strncasecmp_folded(um, name, entry);
+	else
+		ret = utf8_strncasecmp(um, name, entry);
+
+	if (ret < 0) {
+		/* Handle invalid character sequence as either an error
+		 * or as an opaque byte sequence.
+		 */
+		if (f2fs_has_strict_mode(sbi))
+			return -EINVAL;
+
+		if (name->len != entry->len)
+			return 1;
+
+		return !!memcmp(name->name, entry->name, name->len);
+	}
+
+	return ret;
+}
+
+static void f2fs_fname_setup_ci_filename(struct inode *dir,
+					const struct qstr *iname,
+					struct fscrypt_str *cf_name)
+{
+	struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
+
+	if (!IS_CASEFOLDED(dir)) {
+		cf_name->name = NULL;
+		return;
+	}
+
+	cf_name->name = f2fs_kmalloc(sbi, F2FS_NAME_LEN, GFP_NOFS);
+	if (!cf_name->name)
+		return;
+
+	cf_name->len = utf8_casefold(sbi->s_encoding,
+					iname, cf_name->name,
+					F2FS_NAME_LEN);
+	if ((int)cf_name->len <= 0) {
+		kvfree(cf_name->name);
+		cf_name->name = NULL;
+	}
+}
+#endif
+
+static inline bool f2fs_match_name(struct f2fs_dentry_ptr *d,
+					struct f2fs_dir_entry *de,
+					struct fscrypt_name *fname,
+					struct fscrypt_str *cf_str,
+					unsigned long bit_pos,
+					f2fs_hash_t namehash)
+{
+#ifdef CONFIG_UNICODE
+	struct inode *parent = d->inode;
+	struct f2fs_sb_info *sbi = F2FS_I_SB(parent);
+	struct qstr entry;
+#endif
+
+	if (de->hash_code != namehash)
+		return false;
+
+#ifdef CONFIG_UNICODE
+	entry.name = d->filename[bit_pos];
+	entry.len = de->name_len;
+
+	if (sbi->s_encoding && IS_CASEFOLDED(parent)) {
+		if (cf_str->name) {
+			struct qstr cf = {.name = cf_str->name,
+					  .len = cf_str->len};
+			return !f2fs_ci_compare(parent, &cf, &entry, true);
+		}
+		return !f2fs_ci_compare(parent, fname->usr_fname, &entry,
+					false);
+	}
+#endif
+	if (fscrypt_match_name(fname, d->filename[bit_pos],
+				le16_to_cpu(de->name_len)))
+		return true;
+	return false;
+}
+
 struct f2fs_dir_entry *f2fs_find_target_dentry(struct fscrypt_name *fname,
 			f2fs_hash_t namehash, int *max_slots,
 			struct f2fs_dentry_ptr *d)
 {
 	struct f2fs_dir_entry *de;
+	struct fscrypt_str cf_str = { .name = NULL, .len = 0 };
 	unsigned long bit_pos = 0;
 	int max_len = 0;
 
+#ifdef CONFIG_UNICODE
+	f2fs_fname_setup_ci_filename(d->inode, fname->usr_fname, &cf_str);
+#endif
+
 	if (max_slots)
 		*max_slots = 0;
 	while (bit_pos < d->max) {
@@ -128,9 +229,7 @@
 			continue;
 		}
 
-		if (de->hash_code == namehash &&
-		    fscrypt_match_name(fname, d->filename[bit_pos],
-				       le16_to_cpu(de->name_len)))
+		if (f2fs_match_name(d, de, fname, &cf_str, bit_pos, namehash))
 			goto found;
 
 		if (max_slots && max_len > *max_slots)
@@ -144,6 +243,10 @@
 found:
 	if (max_slots && max_len > *max_slots)
 		*max_slots = max_len;
+
+#ifdef CONFIG_UNICODE
+	kvfree(cf_str.name);
+#endif
 	return de;
 }
 
@@ -160,7 +263,7 @@
 	struct f2fs_dir_entry *de = NULL;
 	bool room = false;
 	int max_slots;
-	f2fs_hash_t namehash = f2fs_dentry_hash(&name, fname);
+	f2fs_hash_t namehash = f2fs_dentry_hash(dir, &name, fname);
 
 	nbucket = dir_buckets(level, F2FS_I(dir)->i_dir_level);
 	nblock = bucket_blocks(level);
@@ -182,8 +285,8 @@
 			}
 		}
 
-		de = find_in_block(dentry_page, fname, namehash, &max_slots,
-								res_page);
+		de = find_in_block(dir, dentry_page, fname, namehash,
+							&max_slots, res_page);
 		if (de)
 			break;
 
@@ -221,9 +324,8 @@
 
 	max_depth = F2FS_I(dir)->i_current_depth;
 	if (unlikely(max_depth > MAX_DIR_HASH_DEPTH)) {
-		f2fs_msg(F2FS_I_SB(dir)->sb, KERN_WARNING,
-				"Corrupted max_depth of %lu: %u",
-				dir->i_ino, max_depth);
+		f2fs_warn(F2FS_I_SB(dir), "Corrupted max_depth of %lu: %u",
+			  dir->i_ino, max_depth);
 		max_depth = MAX_DIR_HASH_DEPTH;
 		f2fs_i_depth_write(dir, max_depth);
 	}
@@ -254,6 +356,14 @@
 	struct fscrypt_name fname;
 	int err;
 
+#ifdef CONFIG_UNICODE
+	if (f2fs_has_strict_mode(F2FS_I_SB(dir)) && IS_CASEFOLDED(dir) &&
+			utf8_validate(F2FS_I_SB(dir)->s_encoding, child)) {
+		*res_page = ERR_PTR(-EINVAL);
+		return NULL;
+	}
+#endif
+
 	err = fscrypt_setup_filename(dir, child, 1, &fname);
 	if (err) {
 		if (err == -ENOENT)
@@ -296,7 +406,7 @@
 {
 	enum page_type type = f2fs_has_inline_dentry(dir) ? NODE : DATA;
 	lock_page(page);
-	f2fs_wait_on_page_writeback(page, type, true);
+	f2fs_wait_on_page_writeback(page, type, true, true);
 	de->ino = cpu_to_le32(inode->i_ino);
 	set_de_type(de, inode->i_mode);
 	set_page_dirty(page);
@@ -310,7 +420,7 @@
 {
 	struct f2fs_inode *ri;
 
-	f2fs_wait_on_page_writeback(ipage, NODE, true);
+	f2fs_wait_on_page_writeback(ipage, NODE, true, true);
 
 	/* copy name info. to this inode page */
 	ri = F2FS_INODE(ipage);
@@ -388,7 +498,7 @@
 		if (err)
 			goto put_error;
 
-		if ((f2fs_encrypted_inode(dir) || dummy_encrypt) &&
+		if ((IS_ENCRYPTED(dir) || dummy_encrypt) &&
 					f2fs_may_encrypt(inode)) {
 			err = fscrypt_inherit_context(dir, inode, page, false);
 			if (err)
@@ -402,7 +512,7 @@
 
 	if (new_name) {
 		init_dent_inode(new_name, page);
-		if (f2fs_encrypted_inode(dir))
+		if (IS_ENCRYPTED(dir))
 			file_set_enc_name(inode);
 	}
 
@@ -508,7 +618,7 @@
 
 	level = 0;
 	slots = GET_DENTRY_SLOTS(new_name->len);
-	dentry_hash = f2fs_dentry_hash(new_name, NULL);
+	dentry_hash = f2fs_dentry_hash(dir, new_name, NULL);
 
 	current_depth = F2FS_I(dir)->i_current_depth;
 	if (F2FS_I(dir)->chash == dentry_hash) {
@@ -518,7 +628,7 @@
 
 start:
 	if (time_to_inject(F2FS_I_SB(dir), FAULT_DIR_DEPTH)) {
-		f2fs_show_injection_info(FAULT_DIR_DEPTH);
+		f2fs_show_injection_info(F2FS_I_SB(dir), FAULT_DIR_DEPTH);
 		return -ENOSPC;
 	}
 
@@ -553,7 +663,7 @@
 	++level;
 	goto start;
 add_dentry:
-	f2fs_wait_on_page_writeback(dentry_page, DATA, true);
+	f2fs_wait_on_page_writeback(dentry_page, DATA, true, true);
 
 	if (inode) {
 		down_write(&F2FS_I(inode)->i_sem);
@@ -572,6 +682,11 @@
 
 	if (inode) {
 		f2fs_i_pino_write(inode, dir->i_ino);
+
+		/* synchronize inode page's data from inode cache */
+		if (is_inode_flag_set(inode, FI_NEW_INODE))
+			f2fs_update_inode(inode, page);
+
 		f2fs_put_page(page, 1);
 	}
 
@@ -658,9 +773,9 @@
 	f2fs_put_page(page, 1);
 
 	clear_inode_flag(inode, FI_NEW_INODE);
+	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
 fail:
 	up_write(&F2FS_I(inode)->i_sem);
-	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
 	return err;
 }
 
@@ -708,7 +823,7 @@
 		return f2fs_delete_inline_entry(dentry, page, dir, inode);
 
 	lock_page(page);
-	f2fs_wait_on_page_writeback(page, DATA, true);
+	f2fs_wait_on_page_writeback(page, DATA, true, true);
 
 	dentry_blk = page_address(page);
 	bit_pos = dentry - dentry_blk->dentry;
@@ -731,7 +846,7 @@
 		!f2fs_truncate_hole(dir, page->index, page->index + 1)) {
 		f2fs_clear_radix_tree_dirty_tag(page);
 		clear_page_dirty_for_io(page);
-		ClearPagePrivate(page);
+		f2fs_clear_page_private(page);
 		ClearPageUptodate(page);
 		clear_cold_data(page);
 		inode_dec_dirty_pages(dir);
@@ -785,9 +900,15 @@
 	struct f2fs_dir_entry *de = NULL;
 	struct fscrypt_str de_name = FSTR_INIT(NULL, 0);
 	struct f2fs_sb_info *sbi = F2FS_I_SB(d->inode);
+	struct blk_plug plug;
+	bool readdir_ra = sbi->readdir_ra == 1;
+	int err = 0;
 
 	bit_pos = ((unsigned long)ctx->pos % d->max);
 
+	if (readdir_ra)
+		blk_start_plug(&plug);
+
 	while (bit_pos < d->max) {
 		bit_pos = find_next_bit_le(d->bitmap, d->max, bit_pos);
 		if (bit_pos >= d->max)
@@ -797,6 +918,11 @@
 		if (de->name_len == 0) {
 			bit_pos++;
 			ctx->pos = start_pos + bit_pos;
+			printk_ratelimited(
+				"%sF2FS-fs (%s): invalid namelen(0), ino:%u, run fsck to fix.",
+				KERN_WARNING, sbi->sb->s_id,
+				le32_to_cpu(de->ino));
+			set_sbi_flag(sbi, SBI_NEED_FSCK);
 			continue;
 		}
 
@@ -805,31 +931,45 @@
 		de_name.name = d->filename[bit_pos];
 		de_name.len = le16_to_cpu(de->name_len);
 
-		if (f2fs_encrypted_inode(d->inode)) {
+		/* check memory boundary before moving forward */
+		bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
+		if (unlikely(bit_pos > d->max ||
+				le16_to_cpu(de->name_len) > F2FS_NAME_LEN)) {
+			f2fs_warn(sbi, "%s: corrupted namelen=%d, run fsck to fix.",
+				  __func__, le16_to_cpu(de->name_len));
+			set_sbi_flag(sbi, SBI_NEED_FSCK);
+			err = -EFSCORRUPTED;
+			goto out;
+		}
+
+		if (IS_ENCRYPTED(d->inode)) {
 			int save_len = fstr->len;
-			int err;
 
 			err = fscrypt_fname_disk_to_usr(d->inode,
-						(u32)de->hash_code, 0,
-						&de_name, fstr);
+						(u32)le32_to_cpu(de->hash_code),
+						0, &de_name, fstr);
 			if (err)
-				return err;
+				goto out;
 
 			de_name = *fstr;
 			fstr->len = save_len;
 		}
 
 		if (!dir_emit(ctx, de_name.name, de_name.len,
-					le32_to_cpu(de->ino), d_type))
-			return 1;
+					le32_to_cpu(de->ino), d_type)) {
+			err = 1;
+			goto out;
+		}
 
-		if (sbi->readdir_ra == 1)
+		if (readdir_ra)
 			f2fs_ra_node_page(sbi, le32_to_cpu(de->ino));
 
-		bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
 		ctx->pos = start_pos + bit_pos;
 	}
-	return 0;
+out:
+	if (readdir_ra)
+		blk_finish_plug(&plug);
+	return err;
 }
 
 static int f2fs_readdir(struct file *file, struct dir_context *ctx)
@@ -845,7 +985,7 @@
 	struct fscrypt_str fstr = FSTR_INIT(NULL, 0);
 	int err = 0;
 
-	if (f2fs_encrypted_inode(inode)) {
+	if (IS_ENCRYPTED(inode)) {
 		err = fscrypt_get_encryption_info(inode);
 		if (err && err != -ENOKEY)
 			goto out;
@@ -874,7 +1014,7 @@
 			page_cache_sync_readahead(inode->i_mapping, ra, file, n,
 				min(npages - n, (pgoff_t)MAX_DIR_RA_PAGES));
 
-		dentry_page = f2fs_get_lock_data_page(inode, n, false);
+		dentry_page = f2fs_find_data_page(inode, n);
 		if (IS_ERR(dentry_page)) {
 			err = PTR_ERR(dentry_page);
 			if (err == -ENOENT) {
@@ -892,11 +1032,11 @@
 		err = f2fs_fill_dentries(ctx, &d,
 				n * NR_DENTRY_IN_BLOCK, &fstr);
 		if (err) {
-			f2fs_put_page(dentry_page, 1);
+			f2fs_put_page(dentry_page, 0);
 			break;
 		}
 
-		f2fs_put_page(dentry_page, 1);
+		f2fs_put_page(dentry_page, 0);
 	}
 out_free:
 	fscrypt_fname_free_buffer(&fstr);
@@ -907,7 +1047,7 @@
 
 static int f2fs_dir_open(struct inode *inode, struct file *filp)
 {
-	if (f2fs_encrypted_inode(inode))
+	if (IS_ENCRYPTED(inode))
 		return fscrypt_get_encryption_info(inode) ? -EACCES : 0;
 	return 0;
 }
@@ -923,3 +1063,50 @@
 	.compat_ioctl   = f2fs_compat_ioctl,
 #endif
 };
+
+#ifdef CONFIG_UNICODE
+static int f2fs_d_compare(const struct dentry *dentry, unsigned int len,
+			  const char *str, const struct qstr *name)
+{
+	struct qstr qstr = {.name = str, .len = len };
+
+	if (!IS_CASEFOLDED(dentry->d_parent->d_inode)) {
+		if (len != name->len)
+			return -1;
+		return memcmp(str, name, len);
+	}
+
+	return f2fs_ci_compare(dentry->d_parent->d_inode, name, &qstr, false);
+}
+
+static int f2fs_d_hash(const struct dentry *dentry, struct qstr *str)
+{
+	struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
+	const struct unicode_map *um = sbi->s_encoding;
+	unsigned char *norm;
+	int len, ret = 0;
+
+	if (!IS_CASEFOLDED(dentry->d_inode))
+		return 0;
+
+	norm = f2fs_kmalloc(sbi, PATH_MAX, GFP_ATOMIC);
+	if (!norm)
+		return -ENOMEM;
+
+	len = utf8_casefold(um, str, norm, PATH_MAX);
+	if (len < 0) {
+		if (f2fs_has_strict_mode(sbi))
+			ret = -EINVAL;
+		goto out;
+	}
+	str->hash = full_name_hash(dentry, norm, len);
+out:
+	kvfree(norm);
+	return ret;
+}
+
+const struct dentry_operations f2fs_dentry_ops = {
+	.d_hash = f2fs_d_hash,
+	.d_compare = f2fs_d_compare,
+};
+#endif
diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c
index a70cd25..e600784 100644
--- a/fs/f2fs/extent_cache.c
+++ b/fs/f2fs/extent_cache.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * f2fs extent cache support
  *
@@ -5,10 +6,6 @@
  * Copyright (c) 2015 Samsung Electronics
  * Authors: Jaegeuk Kim <jaegeuk@kernel.org>
  *          Chao Yu <chao2.yu@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 
 #include <linux/fs.h>
@@ -30,10 +27,10 @@
 	return NULL;
 }
 
-static struct rb_entry *__lookup_rb_tree_slow(struct rb_root *root,
+static struct rb_entry *__lookup_rb_tree_slow(struct rb_root_cached *root,
 							unsigned int ofs)
 {
-	struct rb_node *node = root->rb_node;
+	struct rb_node *node = root->rb_root.rb_node;
 	struct rb_entry *re;
 
 	while (node) {
@@ -49,7 +46,7 @@
 	return NULL;
 }
 
-struct rb_entry *f2fs_lookup_rb_tree(struct rb_root *root,
+struct rb_entry *f2fs_lookup_rb_tree(struct rb_root_cached *root,
 				struct rb_entry *cached_re, unsigned int ofs)
 {
 	struct rb_entry *re;
@@ -62,22 +59,25 @@
 }
 
 struct rb_node **f2fs_lookup_rb_tree_for_insert(struct f2fs_sb_info *sbi,
-				struct rb_root *root, struct rb_node **parent,
-				unsigned int ofs)
+				struct rb_root_cached *root,
+				struct rb_node **parent,
+				unsigned int ofs, bool *leftmost)
 {
-	struct rb_node **p = &root->rb_node;
+	struct rb_node **p = &root->rb_root.rb_node;
 	struct rb_entry *re;
 
 	while (*p) {
 		*parent = *p;
 		re = rb_entry(*parent, struct rb_entry, rb_node);
 
-		if (ofs < re->ofs)
+		if (ofs < re->ofs) {
 			p = &(*p)->rb_left;
-		else if (ofs >= re->ofs + re->len)
+		} else if (ofs >= re->ofs + re->len) {
 			p = &(*p)->rb_right;
-		else
+			*leftmost = false;
+		} else {
 			f2fs_bug_on(sbi, 1);
+		}
 	}
 
 	return p;
@@ -92,16 +92,16 @@
  * in order to simpfy the insertion after.
  * tree must stay unchanged between lookup and insertion.
  */
-struct rb_entry *f2fs_lookup_rb_tree_ret(struct rb_root *root,
+struct rb_entry *f2fs_lookup_rb_tree_ret(struct rb_root_cached *root,
 				struct rb_entry *cached_re,
 				unsigned int ofs,
 				struct rb_entry **prev_entry,
 				struct rb_entry **next_entry,
 				struct rb_node ***insert_p,
 				struct rb_node **insert_parent,
-				bool force)
+				bool force, bool *leftmost)
 {
-	struct rb_node **pnode = &root->rb_node;
+	struct rb_node **pnode = &root->rb_root.rb_node;
 	struct rb_node *parent = NULL, *tmp_node;
 	struct rb_entry *re = cached_re;
 
@@ -110,7 +110,7 @@
 	*prev_entry = NULL;
 	*next_entry = NULL;
 
-	if (RB_EMPTY_ROOT(root))
+	if (RB_EMPTY_ROOT(&root->rb_root))
 		return NULL;
 
 	if (re) {
@@ -118,16 +118,22 @@
 			goto lookup_neighbors;
 	}
 
+	if (leftmost)
+		*leftmost = true;
+
 	while (*pnode) {
 		parent = *pnode;
 		re = rb_entry(*pnode, struct rb_entry, rb_node);
 
-		if (ofs < re->ofs)
+		if (ofs < re->ofs) {
 			pnode = &(*pnode)->rb_left;
-		else if (ofs >= re->ofs + re->len)
+		} else if (ofs >= re->ofs + re->len) {
 			pnode = &(*pnode)->rb_right;
-		else
+			if (leftmost)
+				*leftmost = false;
+		} else {
 			goto lookup_neighbors;
+		}
 	}
 
 	*insert_p = pnode;
@@ -160,10 +166,10 @@
 }
 
 bool f2fs_check_rb_tree_consistence(struct f2fs_sb_info *sbi,
-						struct rb_root *root)
+						struct rb_root_cached *root)
 {
 #ifdef CONFIG_F2FS_CHECK_FS
-	struct rb_node *cur = rb_first(root), *next;
+	struct rb_node *cur = rb_first_cached(root), *next;
 	struct rb_entry *cur_re, *next_re;
 
 	if (!cur)
@@ -178,10 +184,9 @@
 		next_re = rb_entry(next, struct rb_entry, rb_node);
 
 		if (cur_re->ofs + cur_re->len > next_re->ofs) {
-			f2fs_msg(sbi->sb, KERN_INFO, "inconsistent rbtree, "
-				"cur(%u, %u) next(%u, %u)",
-				cur_re->ofs, cur_re->len,
-				next_re->ofs, next_re->len);
+			f2fs_info(sbi, "inconsistent rbtree, cur(%u, %u) next(%u, %u)",
+				  cur_re->ofs, cur_re->len,
+				  next_re->ofs, next_re->len);
 			return false;
 		}
 
@@ -196,7 +201,8 @@
 
 static struct extent_node *__attach_extent_node(struct f2fs_sb_info *sbi,
 				struct extent_tree *et, struct extent_info *ei,
-				struct rb_node *parent, struct rb_node **p)
+				struct rb_node *parent, struct rb_node **p,
+				bool leftmost)
 {
 	struct extent_node *en;
 
@@ -209,7 +215,7 @@
 	en->et = et;
 
 	rb_link_node(&en->rb_node, parent, p);
-	rb_insert_color(&en->rb_node, &et->root);
+	rb_insert_color_cached(&en->rb_node, &et->root, leftmost);
 	atomic_inc(&et->node_cnt);
 	atomic_inc(&sbi->total_ext_node);
 	return en;
@@ -218,7 +224,7 @@
 static void __detach_extent_node(struct f2fs_sb_info *sbi,
 				struct extent_tree *et, struct extent_node *en)
 {
-	rb_erase(&en->rb_node, &et->root);
+	rb_erase_cached(&en->rb_node, &et->root);
 	atomic_dec(&et->node_cnt);
 	atomic_dec(&sbi->total_ext_node);
 
@@ -257,7 +263,7 @@
 		f2fs_radix_tree_insert(&sbi->extent_tree_root, ino, et);
 		memset(et, 0, sizeof(struct extent_tree));
 		et->ino = ino;
-		et->root = RB_ROOT;
+		et->root = RB_ROOT_CACHED;
 		et->cached_en = NULL;
 		rwlock_init(&et->lock);
 		INIT_LIST_HEAD(&et->list);
@@ -278,10 +284,10 @@
 static struct extent_node *__init_extent_tree(struct f2fs_sb_info *sbi,
 				struct extent_tree *et, struct extent_info *ei)
 {
-	struct rb_node **p = &et->root.rb_node;
+	struct rb_node **p = &et->root.rb_root.rb_node;
 	struct extent_node *en;
 
-	en = __attach_extent_node(sbi, et, ei, NULL, p);
+	en = __attach_extent_node(sbi, et, ei, NULL, p, true);
 	if (!en)
 		return NULL;
 
@@ -297,7 +303,7 @@
 	struct extent_node *en;
 	unsigned int count = atomic_read(&et->node_cnt);
 
-	node = rb_first(&et->root);
+	node = rb_first_cached(&et->root);
 	while (node) {
 		next = rb_next(node);
 		en = rb_entry(node, struct extent_node, rb_node);
@@ -455,7 +461,8 @@
 static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi,
 				struct extent_tree *et, struct extent_info *ei,
 				struct rb_node **insert_p,
-				struct rb_node *insert_parent)
+				struct rb_node *insert_parent,
+				bool leftmost)
 {
 	struct rb_node **p;
 	struct rb_node *parent = NULL;
@@ -467,9 +474,12 @@
 		goto do_insert;
 	}
 
-	p = f2fs_lookup_rb_tree_for_insert(sbi, &et->root, &parent, ei->fofs);
+	leftmost = true;
+
+	p = f2fs_lookup_rb_tree_for_insert(sbi, &et->root, &parent,
+						ei->fofs, &leftmost);
 do_insert:
-	en = __attach_extent_node(sbi, et, ei, parent, p);
+	en = __attach_extent_node(sbi, et, ei, parent, p, leftmost);
 	if (!en)
 		return NULL;
 
@@ -495,6 +505,7 @@
 	unsigned int end = fofs + len;
 	unsigned int pos = (unsigned int)fofs;
 	bool updated = false;
+	bool leftmost = false;
 
 	if (!et)
 		return;
@@ -522,7 +533,8 @@
 					(struct rb_entry *)et->cached_en, fofs,
 					(struct rb_entry **)&prev_en,
 					(struct rb_entry **)&next_en,
-					&insert_p, &insert_parent, false);
+					&insert_p, &insert_parent, false,
+					&leftmost);
 	if (!en)
 		en = next_en;
 
@@ -549,7 +561,7 @@
 						end - dei.fofs + dei.blk,
 						org_end - end);
 				en1 = __insert_extent_tree(sbi, et, &ei,
-							NULL, NULL);
+							NULL, NULL, true);
 				next_en = en1;
 			} else {
 				en->ei.fofs = end;
@@ -590,7 +602,7 @@
 		set_extent_info(&ei, fofs, blkaddr, len);
 		if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
 			__insert_extent_tree(sbi, et, &ei,
-						insert_p, insert_parent);
+					insert_p, insert_parent, leftmost);
 
 		/* give up extent_cache, if split and small updates happen */
 		if (dei.len >= 1 &&
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 34e48bcf..8db50dd 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1,16 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/f2fs.h
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #ifndef _LINUX_F2FS_H
 #define _LINUX_F2FS_H
 
+#include <linux/uio.h>
 #include <linux/types.h>
 #include <linux/page-flags.h>
 #include <linux/buffer_head.h>
@@ -26,8 +24,8 @@
 #include <linux/quotaops.h>
 #include <crypto/hash.h>
 
-#define __FS_HAS_ENCRYPTION IS_ENABLED(CONFIG_F2FS_FS_ENCRYPTION)
 #include <linux/fscrypt.h>
+#include <linux/fsverity.h>
 
 #ifdef CONFIG_F2FS_CHECK_FS
 #define f2fs_bug_on(sbi, condition)	BUG_ON(condition)
@@ -53,9 +51,10 @@
 	FAULT_DIR_DEPTH,
 	FAULT_EVICT_INODE,
 	FAULT_TRUNCATE,
-	FAULT_IO,
+	FAULT_READ_IO,
 	FAULT_CHECKPOINT,
 	FAULT_DISCARD,
+	FAULT_WRITE_IO,
 	FAULT_MAX,
 };
 
@@ -68,7 +67,7 @@
 	unsigned int inject_type;
 };
 
-extern char *f2fs_fault_name[FAULT_MAX];
+extern const char *f2fs_fault_name[FAULT_MAX];
 #define IS_FAULT_SET(fi, type) ((fi)->inject_type & (1 << (type)))
 #endif
 
@@ -100,6 +99,7 @@
 #define F2FS_MOUNT_QUOTA		0x00400000
 #define F2FS_MOUNT_INLINE_XATTR_SIZE	0x00800000
 #define F2FS_MOUNT_RESERVE_ROOT		0x01000000
+#define F2FS_MOUNT_DISABLE_CHECKPOINT	0x02000000
 
 #define F2FS_OPTION(sbi)	((sbi)->mount_opt)
 #define clear_opt(sbi, option)	(F2FS_OPTION(sbi).opt &= ~F2FS_MOUNT_##option)
@@ -137,6 +137,12 @@
 	int alloc_mode;			/* segment allocation policy */
 	int fsync_mode;			/* fsync policy */
 	bool test_dummy_encryption;	/* test dummy encryption */
+#ifdef CONFIG_FS_ENCRYPTION
+	bool inlinecrypt;		/* inline encryption enabled */
+#endif
+	block_t unusable_cap;		/* Amount of space allowed to be
+					 * unusable when disabling checkpoint
+					 */
 };
 
 #define F2FS_FEATURE_ENCRYPT		0x0001
@@ -149,14 +155,17 @@
 #define F2FS_FEATURE_QUOTA_INO		0x0080
 #define F2FS_FEATURE_INODE_CRTIME	0x0100
 #define F2FS_FEATURE_LOST_FOUND		0x0200
-#define F2FS_FEATURE_VERITY		0x0400	/* reserved */
+#define F2FS_FEATURE_VERITY		0x0400
+#define F2FS_FEATURE_SB_CHKSUM		0x0800
+#define F2FS_FEATURE_CASEFOLD		0x1000
 
-#define F2FS_HAS_FEATURE(sb, mask)					\
-	((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0)
-#define F2FS_SET_FEATURE(sb, mask)					\
-	(F2FS_SB(sb)->raw_super->feature |= cpu_to_le32(mask))
-#define F2FS_CLEAR_FEATURE(sb, mask)					\
-	(F2FS_SB(sb)->raw_super->feature &= ~cpu_to_le32(mask))
+#define __F2FS_HAS_FEATURE(raw_super, mask)				\
+	((raw_super->feature & cpu_to_le32(mask)) != 0)
+#define F2FS_HAS_FEATURE(sbi, mask)	__F2FS_HAS_FEATURE(sbi->raw_super, mask)
+#define F2FS_SET_FEATURE(sbi, mask)					\
+	(sbi->raw_super->feature |= cpu_to_le32(mask))
+#define F2FS_CLEAR_FEATURE(sbi, mask)					\
+	(sbi->raw_super->feature &= ~cpu_to_le32(mask))
 
 /*
  * Default values for user and/or group using reserved blocks
@@ -178,6 +187,7 @@
 #define	CP_RECOVERY	0x00000008
 #define	CP_DISCARD	0x00000010
 #define CP_TRIMMED	0x00000020
+#define CP_PAUSE	0x00000040
 
 #define MAX_DISCARD_BLOCKS(sbi)		BLKS_PER_SEC(sbi)
 #define DEF_MAX_DISCARD_REQUEST		8	/* issue 8 discards per round */
@@ -187,6 +197,9 @@
 #define DEF_DISCARD_URGENT_UTIL		80	/* do more discard over 80% */
 #define DEF_CP_INTERVAL			60	/* 60 secs */
 #define DEF_IDLE_INTERVAL		5	/* 5 secs */
+#define DEF_DISABLE_INTERVAL		5	/* 5 secs */
+#define DEF_DISABLE_QUICK_INTERVAL	1	/* 1 secs */
+#define DEF_UMOUNT_DISCARD_TIMEOUT	5	/* 5 secs */
 
 struct cp_control {
 	int reason;
@@ -203,8 +216,16 @@
 	META_NAT,
 	META_SIT,
 	META_SSA,
+	META_MAX,
 	META_POR,
-	DATA_GENERIC,
+	DATA_GENERIC,		/* check range only */
+	DATA_GENERIC_ENHANCE,	/* strong check on range and segment bitmap */
+	DATA_GENERIC_ENHANCE_READ,	/*
+					 * strong check on range and segment
+					 * bitmap but no warning due to race
+					 * condition of read on truncated area
+					 * by extent_cache
+					 */
 	META_GENERIC,
 };
 
@@ -249,7 +270,7 @@
 /* max discard pend list number */
 #define MAX_PLIST_NUM		512
 #define plist_idx(blk_num)	((blk_num) >= MAX_PLIST_NUM ?		\
-					(MAX_PLIST_NUM - 1) : (blk_num - 1))
+					(MAX_PLIST_NUM - 1) : ((blk_num) - 1))
 
 enum {
 	D_PREP,			/* initial */
@@ -280,7 +301,7 @@
 	struct block_device *bdev;	/* bdev */
 	unsigned short ref;		/* reference count */
 	unsigned char state;		/* state */
-	unsigned char issuing;		/* issuing discard */
+	unsigned char queued;		/* queued discard */
 	int error;			/* bio error */
 	spinlock_t lock;		/* for state/bio_ref updating */
 	unsigned short bio_ref;		/* bio reference count */
@@ -305,6 +326,7 @@
 	bool sync;			/* submit discard with REQ_SYNC flag */
 	bool ordered;			/* issue discard by lba order */
 	unsigned int granularity;	/* discard granularity */
+	int timeout;			/* discard timeout for put_super */
 };
 
 struct discard_cmd_control {
@@ -322,9 +344,9 @@
 	unsigned int undiscard_blks;		/* # of undiscard blocks */
 	unsigned int next_pos;			/* next discard position */
 	atomic_t issued_discard;		/* # of issued discard */
-	atomic_t issing_discard;		/* # of issing discard */
+	atomic_t queued_discard;		/* # of queued discard */
 	atomic_t discard_cmd_cnt;		/* # of cached cmd count */
-	struct rb_root root;			/* root of discard rb-tree */
+	struct rb_root_cached root;		/* root of discard rb-tree */
 	bool rbtree_check;			/* config for consistence check */
 };
 
@@ -398,6 +420,10 @@
 #define F2FS_IOC_SET_PIN_FILE		_IOW(F2FS_IOCTL_MAGIC, 13, __u32)
 #define F2FS_IOC_GET_PIN_FILE		_IOR(F2FS_IOCTL_MAGIC, 14, __u32)
 #define F2FS_IOC_PRECACHE_EXTENTS	_IO(F2FS_IOCTL_MAGIC, 15)
+#define F2FS_IOC_RESIZE_FS		_IOW(F2FS_IOCTL_MAGIC, 16, __u64)
+
+#define F2FS_IOC_GET_VOLUME_NAME	FS_IOC_GETFSLABEL
+#define F2FS_IOC_SET_VOLUME_NAME	FS_IOC_SETFSLABEL
 
 #define F2FS_IOC_SET_ENCRYPTION_POLICY	FS_IOC_SET_ENCRYPTION_POLICY
 #define F2FS_IOC_GET_ENCRYPTION_POLICY	FS_IOC_GET_ENCRYPTION_POLICY
@@ -412,6 +438,7 @@
 #define F2FS_GOING_DOWN_METASYNC	0x1	/* going down with metadata */
 #define F2FS_GOING_DOWN_NOSYNC		0x2	/* going down */
 #define F2FS_GOING_DOWN_METAFLUSH	0x3	/* going down with meta flush */
+#define F2FS_GOING_DOWN_NEED_FSCK	0x4	/* going down to trigger fsck */
 
 #if defined(__KERNEL__) && defined(CONFIG_COMPAT)
 /*
@@ -461,8 +488,8 @@
 #define NR_INLINE_DENTRY(inode)	(MAX_INLINE_DATA(inode) * BITS_PER_BYTE / \
 				((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
 				BITS_PER_BYTE + 1))
-#define INLINE_DENTRY_BITMAP_SIZE(inode)	((NR_INLINE_DENTRY(inode) + \
-					BITS_PER_BYTE - 1) / BITS_PER_BYTE)
+#define INLINE_DENTRY_BITMAP_SIZE(inode) \
+	DIV_ROUND_UP(NR_INLINE_DENTRY(inode), BITS_PER_BYTE)
 #define INLINE_RESERVED_SIZE(inode)	(MAX_INLINE_DATA(inode) - \
 				((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \
 				NR_INLINE_DENTRY(inode) + \
@@ -526,6 +553,9 @@
 
 #define DEFAULT_RETRY_IO_COUNT	8	/* maximum retry read IO count */
 
+/* maximum retry quota flush count */
+#define DEFAULT_RETRY_QUOTA_FLUSH_COUNT		8
+
 #define F2FS_LINK_MAX	0xffffffff	/* maximum link count per file */
 
 #define MAX_DIR_RA_PAGES	4	/* maximum ra pages of dir */
@@ -549,23 +579,15 @@
 };
 
 struct extent_node {
-	struct rb_node rb_node;
-	union {
-		struct {
-			unsigned int fofs;
-			unsigned int len;
-			u32 blk;
-		};
-		struct extent_info ei;	/* extent info */
-
-	};
+	struct rb_node rb_node;		/* rb node located in rb-tree */
+	struct extent_info ei;		/* extent info */
 	struct list_head list;		/* node in global extent list of sbi */
 	struct extent_tree *et;		/* extent tree pointer */
 };
 
 struct extent_tree {
 	nid_t ino;			/* inode number */
-	struct rb_root root;		/* root of extent info rb-tree */
+	struct rb_root_cached root;	/* root of extent info rb-tree */
 	struct extent_node *cached_en;	/* recently accessed extent node */
 	struct extent_info largest;	/* largested extent info */
 	struct list_head list;		/* to be used by sbi->zombie_list */
@@ -593,6 +615,7 @@
 	pgoff_t *m_next_pgofs;		/* point next possible non-hole pgofs */
 	pgoff_t *m_next_extent;		/* point to next possible extent */
 	int m_seg_type;
+	bool m_may_create;		/* indicate it is from write path */
 };
 
 /* for flag in get_data_block */
@@ -615,7 +638,7 @@
 #define FADVISE_ENC_NAME_BIT	0x08
 #define FADVISE_KEEP_SIZE_BIT	0x10
 #define FADVISE_HOT_BIT		0x20
-#define FADVISE_VERITY_BIT	0x40	/* reserved */
+#define FADVISE_VERITY_BIT	0x40
 
 #define FADVISE_MODIFIABLE_BITS	(FADVISE_COLD_BIT | FADVISE_HOT_BIT)
 
@@ -635,6 +658,8 @@
 #define file_is_hot(inode)	is_file(inode, FADVISE_HOT_BIT)
 #define file_set_hot(inode)	set_file(inode, FADVISE_HOT_BIT)
 #define file_clear_hot(inode)	clear_file(inode, FADVISE_HOT_BIT)
+#define file_is_verity(inode)	is_file(inode, FADVISE_VERITY_BIT)
+#define file_set_verity(inode)	set_file(inode, FADVISE_VERITY_BIT)
 
 #define DEF_DIR_LEVEL		0
 
@@ -868,6 +893,7 @@
 	CURSEG_WARM_NODE,	/* direct node blocks of normal files */
 	CURSEG_COLD_NODE,	/* indirect node blocks */
 	NO_CHECK_TYPE,
+	CURSEG_COLD_DATA_PINNED,/* cold data for pinned file */
 };
 
 struct flush_cmd {
@@ -881,7 +907,7 @@
 	struct task_struct *f2fs_issue_flush;	/* flush thread */
 	wait_queue_head_t flush_wait_queue;	/* waiting queue for wake-up */
 	atomic_t issued_flush;			/* # of issued flushes */
-	atomic_t issing_flush;			/* # of issing flushes */
+	atomic_t queued_flush;			/* # of queued flushes */
 	struct llist_head issue_list;		/* list for command issue */
 	struct llist_node *dispatch_list;	/* list for command dispatch */
 };
@@ -945,6 +971,11 @@
 	F2FS_DIRTY_IMETA,
 	F2FS_WB_CP_DATA,
 	F2FS_WB_DATA,
+	F2FS_RD_DATA,
+	F2FS_RD_NODE,
+	F2FS_RD_META,
+	F2FS_DIO_WRITE,
+	F2FS_DIO_READ,
 	NR_COUNT_TYPE,
 };
 
@@ -1032,13 +1063,20 @@
 	bool submitted;		/* indicate IO submission */
 	int need_lock;		/* indicate we need to lock cp_rwsem */
 	bool in_list;		/* indicate fio is in io_list */
-	bool is_meta;		/* indicate borrow meta inode mapping or not */
+	bool is_por;		/* indicate IO is from recovery or not */
 	bool retry;		/* need to reallocate block address */
 	enum iostat_type io_type;	/* io type */
 	struct writeback_control *io_wbc; /* writeback control */
+	struct bio **bio;		/* bio for ipu */
+	sector_t *last_block;		/* last block number in bio */
 	unsigned char version;		/* version of the node */
 };
 
+struct bio_entry {
+	struct bio *bio;
+	struct list_head list;
+};
+
 #define is_read_io(rw) ((rw) == READ)
 struct f2fs_bio_info {
 	struct f2fs_sb_info *sbi;	/* f2fs superblock */
@@ -1048,6 +1086,8 @@
 	struct rw_semaphore io_rwsem;	/* blocking op for bio */
 	spinlock_t io_lock;		/* serialize DATA/NODE IOs */
 	struct list_head io_list;	/* track fios */
+	struct list_head bio_list;	/* bio entry list head */
+	struct rw_semaphore bio_list_lock;	/* lock to protect bio entry list */
 };
 
 #define FDEV(i)				(sbi->devs[i])
@@ -1059,8 +1099,8 @@
 	block_t start_blk;
 	block_t end_blk;
 #ifdef CONFIG_BLK_DEV_ZONED
-	unsigned int nr_blkz;			/* Total number of zones */
-	u8 *blkz_type;				/* Array of zones type */
+	unsigned int nr_blkz;		/* Total number of zones */
+	unsigned long *blkz_seq;	/* Bitmap indicating sequential zones */
 #endif
 };
 
@@ -1090,11 +1130,21 @@
 	SBI_NEED_CP,				/* need to checkpoint */
 	SBI_IS_SHUTDOWN,			/* shutdown by ioctl */
 	SBI_IS_RECOVERED,			/* recovered orphan/data */
+	SBI_CP_DISABLED,			/* CP was disabled last mount */
+	SBI_CP_DISABLED_QUICK,			/* CP was disabled quickly */
+	SBI_QUOTA_NEED_FLUSH,			/* need to flush quota info in CP */
+	SBI_QUOTA_SKIP_FLUSH,			/* skip flushing quota in current CP */
+	SBI_QUOTA_NEED_REPAIR,			/* quota file may be corrupted */
+	SBI_IS_RESIZEFS,			/* resizefs is in process */
 };
 
 enum {
 	CP_TIME,
 	REQ_TIME,
+	DISCARD_TIME,
+	GC_TIME,
+	DISABLE_TIME,
+	UMOUNT_DISCARD_TIMEOUT,
 	MAX_TIME,
 };
 
@@ -1122,7 +1172,7 @@
 	FSYNC_MODE_NOBARRIER,	/* fsync behaves nobarrier based on posix */
 };
 
-#ifdef CONFIG_F2FS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 #define DUMMY_ENCRYPTION_ENABLED(sbi) \
 			(unlikely(F2FS_OPTION(sbi).test_dummy_encryption))
 #else
@@ -1137,6 +1187,10 @@
 	int valid_super_block;			/* valid super block no */
 	unsigned long s_flag;				/* flags for sbi */
 	struct mutex writepages;		/* mutex for writepages() */
+#ifdef CONFIG_UNICODE
+	struct unicode_map *s_encoding;
+	__u16 s_encoding_flags;
+#endif
 
 #ifdef CONFIG_BLK_DEV_ZONED
 	unsigned int blocks_per_blkz;		/* F2FS blocks per zone */
@@ -1152,8 +1206,6 @@
 
 	/* for bio operations */
 	struct f2fs_bio_info *write_io[NR_PAGE_TYPE];	/* for write bios */
-	struct mutex wio_mutex[NR_PAGE_TYPE - 1][NR_TEMP_TYPE];
-						/* bio ordering for NODE/DATA */
 	/* keep migration IO order for LFS mode */
 	struct rw_semaphore io_order_lock;
 	mempool_t *write_io_dummy;		/* Dummy pages */
@@ -1184,6 +1236,7 @@
 	/* for inode management */
 	struct list_head inode_list[NR_INODE_TYPE];	/* dirty inode list */
 	spinlock_t inode_lock[NR_INODE_TYPE];	/* for dirty inode list lock */
+	struct mutex flush_lock;		/* for flush exclusion */
 
 	/* for extent tree cache */
 	struct radix_tree_root extent_tree_root;/* cache extent cache entries */
@@ -1207,11 +1260,11 @@
 	unsigned int segs_per_sec;		/* segments per section */
 	unsigned int secs_per_zone;		/* sections per zone */
 	unsigned int total_sections;		/* total section count */
+	struct mutex resize_mutex;		/* for resize exclusion */
 	unsigned int total_node_count;		/* total node block count */
 	unsigned int total_valid_node_count;	/* valid node block count */
 	loff_t max_file_blocks;			/* max block index of file */
 	int dir_level;				/* directory level */
-	unsigned int trigger_ssr_threshold;	/* threshold to trigger ssr */
 	int readdir_ra;				/* readahead inode in readdir */
 
 	block_t user_block_count;		/* # of user blocks */
@@ -1221,9 +1274,11 @@
 	block_t reserved_blocks;		/* configurable reserved blocks */
 	block_t current_reserved_blocks;	/* current reserved blocks */
 
-	unsigned int nquota_files;		/* # of quota sysfile */
+	/* Additional tracking for no checkpoint mode */
+	block_t unusable_block_count;		/* # of blocks saved by last cp */
 
-	u32 s_next_generation;			/* for NFS support */
+	unsigned int nquota_files;		/* # of quota sysfile */
+	struct rw_semaphore quota_sem;		/* blocking cp for flags */
 
 	/* # of pages, see count_type */
 	atomic_t nr_pages[NR_COUNT_TYPE];
@@ -1243,15 +1298,20 @@
 	struct f2fs_gc_kthread	*gc_thread;	/* GC thread */
 	unsigned int cur_victim_sec;		/* current victim section num */
 	unsigned int gc_mode;			/* current GC state */
+	unsigned int next_victim_seg[2];	/* next segment in victim section */
 	/* for skip statistic */
+	unsigned int atomic_files;              /* # of opened atomic file */
 	unsigned long long skipped_atomic_files[2];	/* FG_GC and BG_GC */
 	unsigned long long skipped_gc_rwsem;		/* FG_GC only */
 
 	/* threshold for gc trials on pinned files */
 	u64 gc_pin_file_threshold;
+	struct rw_semaphore pin_sem;
 
 	/* maximum # of trials to find a victim segment for SSR and GC */
 	unsigned int max_victim_search;
+	/* migration granularity of garbage collection, unit: segment */
+	unsigned int migration_granularity;
 
 	/*
 	 * for stat information.
@@ -1259,6 +1319,7 @@
 	 */
 #ifdef CONFIG_F2FS_STAT_FS
 	struct f2fs_stat_info *stat_info;	/* FS status information */
+	atomic_t meta_count[META_MAX];		/* # of meta blocks */
 	unsigned int segment_count[2];		/* # of allocated segments */
 	unsigned int block_count[2];		/* # of allocated blocks */
 	atomic_t inplace_count;		/* # of inplace update */
@@ -1274,6 +1335,8 @@
 	atomic_t max_aw_cnt;			/* max # of atomic writes */
 	atomic_t max_vw_cnt;			/* max # of volatile writes */
 	int bg_gc;				/* background gc calls */
+	unsigned int io_skip_bggc;		/* skip background gc for in-flight IO */
+	unsigned int other_skip_bggc;		/* skip background gc for other reasons */
 	unsigned int ndirty_inode[NR_INODE_TYPE];	/* # of dirty inodes */
 #endif
 	spinlock_t stat_lock;			/* lock for stat operations */
@@ -1307,10 +1370,18 @@
 	__u32 s_chksum_seed;
 };
 
+struct f2fs_private_dio {
+	struct inode *inode;
+	void *orig_private;
+	bio_end_io_t *orig_end_io;
+	bool write;
+};
+
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-#define f2fs_show_injection_info(type)				\
-	printk("%sF2FS-fs : inject %s in %s of %pF\n",		\
-		KERN_INFO, f2fs_fault_name[type],		\
+#define f2fs_show_injection_info(sbi, type)					\
+	printk_ratelimited("%sF2FS-fs (%s) : inject %s in %s of %pS\n",	\
+		KERN_INFO, sbi->sb->s_id,				\
+		f2fs_fault_name[type],					\
 		__func__, __builtin_return_address(0))
 static inline bool time_to_inject(struct f2fs_sb_info *sbi, int type)
 {
@@ -1330,7 +1401,7 @@
 	return false;
 }
 #else
-#define f2fs_show_injection_info(type) do { } while (0)
+#define f2fs_show_injection_info(sbi, type) do { } while (0)
 static inline bool time_to_inject(struct f2fs_sb_info *sbi, int type)
 {
 	return false;
@@ -1357,7 +1428,15 @@
 
 static inline void f2fs_update_time(struct f2fs_sb_info *sbi, int type)
 {
-	sbi->last_time[type] = jiffies;
+	unsigned long now = jiffies;
+
+	sbi->last_time[type] = now;
+
+	/* DISCARD_TIME and GC_TIME are based on REQ_TIME */
+	if (type == REQ_TIME) {
+		sbi->last_time[DISCARD_TIME] = now;
+		sbi->last_time[GC_TIME] = now;
+	}
 }
 
 static inline bool f2fs_time_over(struct f2fs_sb_info *sbi, int type)
@@ -1367,16 +1446,18 @@
 	return time_after(jiffies, sbi->last_time[type] + interval);
 }
 
-static inline bool is_idle(struct f2fs_sb_info *sbi)
+static inline unsigned int f2fs_time_to_wait(struct f2fs_sb_info *sbi,
+						int type)
 {
-	struct block_device *bdev = sbi->sb->s_bdev;
-	struct request_queue *q = bdev_get_queue(bdev);
-	struct request_list *rl = &q->root_rl;
+	unsigned long interval = sbi->interval_time[type] * HZ;
+	unsigned int wait_ms = 0;
+	long delta;
 
-	if (rl->count[BLK_RW_SYNC] || rl->count[BLK_RW_ASYNC])
-		return false;
+	delta = (sbi->last_time[type] + interval) - jiffies;
+	if (delta > 0)
+		wait_ms = jiffies_to_msecs(delta);
 
-	return f2fs_time_over(sbi, REQ_TIME);
+	return wait_ms;
 }
 
 /*
@@ -1443,7 +1524,7 @@
 
 static inline struct f2fs_sb_info *F2FS_P_SB(struct page *page)
 {
-	return F2FS_M_SB(page->mapping);
+	return F2FS_M_SB(page_file_mapping(page));
 }
 
 static inline struct f2fs_super_block *F2FS_RAW_SUPER(struct f2fs_sb_info *sbi)
@@ -1585,16 +1666,23 @@
 static inline void disable_nat_bits(struct f2fs_sb_info *sbi, bool lock)
 {
 	unsigned long flags;
+	unsigned char *nat_bits;
 
-	set_sbi_flag(sbi, SBI_NEED_FSCK);
+	/*
+	 * In order to re-enable nat_bits we need to call fsck.f2fs by
+	 * set_sbi_flag(sbi, SBI_NEED_FSCK). But it may give huge cost,
+	 * so let's rely on regular fsck or unclean shutdown.
+	 */
 
 	if (lock)
 		spin_lock_irqsave(&sbi->cp_lock, flags);
 	__clear_ckpt_flags(F2FS_CKPT(sbi), CP_NAT_BITS_FLAG);
-	kfree(NM_I(sbi)->nat_bits);
+	nat_bits = NM_I(sbi)->nat_bits;
 	NM_I(sbi)->nat_bits = NULL;
 	if (lock)
 		spin_unlock_irqrestore(&sbi->cp_lock, flags);
+
+	kvfree(nat_bits);
 }
 
 static inline bool enabled_nat_bits(struct f2fs_sb_info *sbi,
@@ -1699,9 +1787,9 @@
 		return ret;
 
 	if (time_to_inject(sbi, FAULT_BLOCK)) {
-		f2fs_show_injection_info(FAULT_BLOCK);
+		f2fs_show_injection_info(sbi, FAULT_BLOCK);
 		release = *count;
-		goto enospc;
+		goto release_quota;
 	}
 
 	/*
@@ -1717,7 +1805,12 @@
 
 	if (!__allow_reserved_blocks(sbi, inode, true))
 		avail_user_block_count -= F2FS_OPTION(sbi).root_reserved_blocks;
-
+	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
+		if (avail_user_block_count > sbi->unusable_block_count)
+			avail_user_block_count -= sbi->unusable_block_count;
+		else
+			avail_user_block_count = 0;
+	}
 	if (unlikely(sbi->total_valid_block_count > avail_user_block_count)) {
 		diff = sbi->total_valid_block_count - avail_user_block_count;
 		if (diff > *count)
@@ -1741,11 +1834,25 @@
 
 enospc:
 	percpu_counter_sub(&sbi->alloc_valid_block_count, release);
+release_quota:
 	dquot_release_reservation_block(inode, release);
 	return -ENOSPC;
 }
 
-void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...);
+__printf(2, 3)
+void f2fs_printk(struct f2fs_sb_info *sbi, const char *fmt, ...);
+
+#define f2fs_err(sbi, fmt, ...)						\
+	f2fs_printk(sbi, KERN_ERR fmt, ##__VA_ARGS__)
+#define f2fs_warn(sbi, fmt, ...)					\
+	f2fs_printk(sbi, KERN_WARNING fmt, ##__VA_ARGS__)
+#define f2fs_notice(sbi, fmt, ...)					\
+	f2fs_printk(sbi, KERN_NOTICE fmt, ##__VA_ARGS__)
+#define f2fs_info(sbi, fmt, ...)					\
+	f2fs_printk(sbi, KERN_INFO fmt, ##__VA_ARGS__)
+#define f2fs_debug(sbi, fmt, ...)					\
+	f2fs_printk(sbi, KERN_DEBUG fmt, ##__VA_ARGS__)
+
 static inline void dec_valid_block_count(struct f2fs_sb_info *sbi,
 						struct inode *inode,
 						block_t count)
@@ -1761,11 +1868,10 @@
 					sbi->current_reserved_blocks + count);
 	spin_unlock(&sbi->stat_lock);
 	if (unlikely(inode->i_blocks < sectors)) {
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"Inconsistent i_blocks, ino:%lu, iblocks:%llu, sectors:%llu",
-			inode->i_ino,
-			(unsigned long long)inode->i_blocks,
-			(unsigned long long)sectors);
+		f2fs_warn(sbi, "Inconsistent i_blocks, ino:%lu, iblocks:%llu, sectors:%llu",
+			  inode->i_ino,
+			  (unsigned long long)inode->i_blocks,
+			  (unsigned long long)sectors);
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
 		return;
 	}
@@ -1776,11 +1882,12 @@
 {
 	atomic_inc(&sbi->nr_pages[count_type]);
 
-	if (count_type == F2FS_DIRTY_DATA || count_type == F2FS_INMEM_PAGES ||
-		count_type == F2FS_WB_CP_DATA || count_type == F2FS_WB_DATA)
-		return;
-
-	set_sbi_flag(sbi, SBI_IS_DIRTY);
+	if (count_type == F2FS_DIRTY_DENTS ||
+			count_type == F2FS_DIRTY_NODES ||
+			count_type == F2FS_DIRTY_META ||
+			count_type == F2FS_DIRTY_QDATA ||
+			count_type == F2FS_DIRTY_IMETA)
+		set_sbi_flag(sbi, SBI_IS_DIRTY);
 }
 
 static inline void inode_inc_dirty_pages(struct inode *inode)
@@ -1865,7 +1972,11 @@
 	if (is_set_ckpt_flags(sbi, CP_LARGE_NAT_BITMAP_FLAG)) {
 		offset = (flag == SIT_BITMAP) ?
 			le32_to_cpu(ckpt->nat_ver_bitmap_bytesize) : 0;
-		return &ckpt->sit_nat_version_bitmap + offset;
+		/*
+		 * if large_nat_bitmap feature is enabled, leave checksum
+		 * protection for all nat/sit bitmaps.
+		 */
+		return &ckpt->sit_nat_version_bitmap + offset + sizeof(__le32);
 	}
 
 	if (__cp_payload(sbi) > 0) {
@@ -1912,17 +2023,23 @@
 					struct inode *inode, bool is_inode)
 {
 	block_t	valid_block_count;
-	unsigned int valid_node_count;
-	bool quota = inode && !is_inode;
+	unsigned int valid_node_count, user_block_count;
+	int err;
 
-	if (quota) {
-		int ret = dquot_reserve_block(inode, 1);
-		if (ret)
-			return ret;
+	if (is_inode) {
+		if (inode) {
+			err = dquot_alloc_inode(inode);
+			if (err)
+				return err;
+		}
+	} else {
+		err = dquot_reserve_block(inode, 1);
+		if (err)
+			return err;
 	}
 
 	if (time_to_inject(sbi, FAULT_BLOCK)) {
-		f2fs_show_injection_info(FAULT_BLOCK);
+		f2fs_show_injection_info(sbi, FAULT_BLOCK);
 		goto enospc;
 	}
 
@@ -1933,8 +2050,11 @@
 
 	if (!__allow_reserved_blocks(sbi, inode, false))
 		valid_block_count += F2FS_OPTION(sbi).root_reserved_blocks;
+	user_block_count = sbi->user_block_count;
+	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
+		user_block_count -= sbi->unusable_block_count;
 
-	if (unlikely(valid_block_count > sbi->user_block_count)) {
+	if (unlikely(valid_block_count > user_block_count)) {
 		spin_unlock(&sbi->stat_lock);
 		goto enospc;
 	}
@@ -1960,8 +2080,12 @@
 	return 0;
 
 enospc:
-	if (quota)
+	if (is_inode) {
+		if (inode)
+			dquot_free_inode(inode);
+	} else {
 		dquot_release_reservation_block(inode, 1);
+	}
 	return -ENOSPC;
 }
 
@@ -1972,7 +2096,6 @@
 
 	f2fs_bug_on(sbi, !sbi->total_valid_block_count);
 	f2fs_bug_on(sbi, !sbi->total_valid_node_count);
-	f2fs_bug_on(sbi, !is_inode && !inode->i_blocks);
 
 	sbi->total_valid_node_count--;
 	sbi->total_valid_block_count--;
@@ -1982,8 +2105,18 @@
 
 	spin_unlock(&sbi->stat_lock);
 
-	if (!is_inode)
+	if (is_inode) {
+		dquot_free_inode(inode);
+	} else {
+		if (unlikely(inode->i_blocks == 0)) {
+			f2fs_warn(sbi, "Inconsistent i_blocks, ino:%lu, iblocks:%llu",
+				  inode->i_ino,
+				  (unsigned long long)inode->i_blocks);
+			set_sbi_flag(sbi, SBI_NEED_FSCK);
+			return;
+		}
 		f2fs_i_blocks_write(inode, 1, false, true);
+	}
 }
 
 static inline unsigned int valid_node_count(struct f2fs_sb_info *sbi)
@@ -2021,7 +2154,8 @@
 			return page;
 
 		if (time_to_inject(F2FS_M_SB(mapping), FAULT_PAGE_ALLOC)) {
-			f2fs_show_injection_info(FAULT_PAGE_ALLOC);
+			f2fs_show_injection_info(F2FS_M_SB(mapping),
+							FAULT_PAGE_ALLOC);
 			return NULL;
 		}
 	}
@@ -2036,7 +2170,7 @@
 				int fgp_flags, gfp_t gfp_mask)
 {
 	if (time_to_inject(F2FS_M_SB(mapping), FAULT_PAGE_GET)) {
-		f2fs_show_injection_info(FAULT_PAGE_GET);
+		f2fs_show_injection_info(F2FS_M_SB(mapping), FAULT_PAGE_GET);
 		return NULL;
 	}
 
@@ -2105,13 +2239,36 @@
 		return bio;
 	}
 	if (time_to_inject(sbi, FAULT_ALLOC_BIO)) {
-		f2fs_show_injection_info(FAULT_ALLOC_BIO);
+		f2fs_show_injection_info(sbi, FAULT_ALLOC_BIO);
 		return NULL;
 	}
 
 	return bio_alloc(GFP_KERNEL, npages);
 }
 
+static inline bool is_idle(struct f2fs_sb_info *sbi, int type)
+{
+	if (sbi->gc_mode == GC_URGENT)
+		return true;
+
+	if (get_pages(sbi, F2FS_RD_DATA) || get_pages(sbi, F2FS_RD_NODE) ||
+		get_pages(sbi, F2FS_RD_META) || get_pages(sbi, F2FS_WB_DATA) ||
+		get_pages(sbi, F2FS_WB_CP_DATA) ||
+		get_pages(sbi, F2FS_DIO_READ) ||
+		get_pages(sbi, F2FS_DIO_WRITE))
+		return false;
+
+	if (type != DISCARD_TIME && SM_I(sbi) && SM_I(sbi)->dcc_info &&
+			atomic_read(&SM_I(sbi)->dcc_info->queued_discard))
+		return false;
+
+	if (SM_I(sbi) && SM_I(sbi)->fcc_info &&
+			atomic_read(&SM_I(sbi)->fcc_info->queued_flush))
+		return false;
+
+	return f2fs_time_over(sbi, type);
+}
+
 static inline void f2fs_radix_tree_insert(struct radix_tree_root *root,
 				unsigned long index, void *item)
 {
@@ -2223,56 +2380,26 @@
 }
 
 /*
- * Inode flags
+ * On-disk inode flags (f2fs_inode::i_flags)
  */
-#define F2FS_SECRM_FL			0x00000001 /* Secure deletion */
-#define F2FS_UNRM_FL			0x00000002 /* Undelete */
-#define F2FS_COMPR_FL			0x00000004 /* Compress file */
 #define F2FS_SYNC_FL			0x00000008 /* Synchronous updates */
 #define F2FS_IMMUTABLE_FL		0x00000010 /* Immutable file */
 #define F2FS_APPEND_FL			0x00000020 /* writes to file may only append */
 #define F2FS_NODUMP_FL			0x00000040 /* do not dump file */
 #define F2FS_NOATIME_FL			0x00000080 /* do not update atime */
-/* Reserved for compression usage... */
-#define F2FS_DIRTY_FL			0x00000100
-#define F2FS_COMPRBLK_FL		0x00000200 /* One or more compressed clusters */
-#define F2FS_NOCOMPR_FL			0x00000400 /* Don't compress */
-#define F2FS_ENCRYPT_FL			0x00000800 /* encrypted file */
-/* End compression flags --- maybe not all used */
 #define F2FS_INDEX_FL			0x00001000 /* hash-indexed directory */
-#define F2FS_IMAGIC_FL			0x00002000 /* AFS directory */
-#define F2FS_JOURNAL_DATA_FL		0x00004000 /* file data should be journaled */
-#define F2FS_NOTAIL_FL			0x00008000 /* file tail should not be merged */
 #define F2FS_DIRSYNC_FL			0x00010000 /* dirsync behaviour (directories only) */
-#define F2FS_TOPDIR_FL			0x00020000 /* Top of directory hierarchies*/
-#define F2FS_HUGE_FILE_FL               0x00040000 /* Set to each huge file */
-#define F2FS_EXTENTS_FL			0x00080000 /* Inode uses extents */
-#define F2FS_EA_INODE_FL	        0x00200000 /* Inode used for large EA */
-#define F2FS_EOFBLOCKS_FL		0x00400000 /* Blocks allocated beyond EOF */
-#define F2FS_INLINE_DATA_FL		0x10000000 /* Inode has inline data. */
 #define F2FS_PROJINHERIT_FL		0x20000000 /* Create with parents projid */
-#define F2FS_RESERVED_FL		0x80000000 /* reserved for ext4 lib */
-
-#define F2FS_FL_USER_VISIBLE		0x304BDFFF /* User visible flags */
-#define F2FS_FL_USER_MODIFIABLE		0x204BC0FF /* User modifiable flags */
-
-/* Flags we can manipulate with through F2FS_IOC_FSSETXATTR */
-#define F2FS_FL_XFLAG_VISIBLE		(F2FS_SYNC_FL | \
-					 F2FS_IMMUTABLE_FL | \
-					 F2FS_APPEND_FL | \
-					 F2FS_NODUMP_FL | \
-					 F2FS_NOATIME_FL | \
-					 F2FS_PROJINHERIT_FL)
+#define F2FS_CASEFOLD_FL		0x40000000 /* Casefolded file */
 
 /* Flags that should be inherited by new inodes from their parent. */
-#define F2FS_FL_INHERITED (F2FS_SECRM_FL | F2FS_UNRM_FL | F2FS_COMPR_FL |\
-			   F2FS_SYNC_FL | F2FS_NODUMP_FL | F2FS_NOATIME_FL |\
-			   F2FS_NOCOMPR_FL | F2FS_JOURNAL_DATA_FL |\
-			   F2FS_NOTAIL_FL | F2FS_DIRSYNC_FL |\
-			   F2FS_PROJINHERIT_FL)
+#define F2FS_FL_INHERITED (F2FS_SYNC_FL | F2FS_NODUMP_FL | F2FS_NOATIME_FL | \
+			   F2FS_DIRSYNC_FL | F2FS_PROJINHERIT_FL | \
+			   F2FS_CASEFOLD_FL)
 
 /* Flags that are appropriate for regular files (all but dir-specific ones). */
-#define F2FS_REG_FLMASK		(~(F2FS_DIRSYNC_FL | F2FS_TOPDIR_FL))
+#define F2FS_REG_FLMASK		(~(F2FS_DIRSYNC_FL | F2FS_PROJINHERIT_FL | \
+				F2FS_CASEFOLD_FL))
 
 /* Flags that are appropriate for non-directories/regular files. */
 #define F2FS_OTHER_FLMASK	(F2FS_NODUMP_FL | F2FS_NOATIME_FL)
@@ -2319,6 +2446,7 @@
 	FI_PROJ_INHERIT,	/* indicate file inherits projectid */
 	FI_PIN_FILE,		/* indicate file should not be gced */
 	FI_ATOMIC_REVOKE_REQUEST, /* request to drop atomic data */
+	FI_VERITY_IN_PROGRESS,	/* building fs-verity Merkle tree */
 };
 
 static inline void __mark_inode_dirty_flag(struct inode *inode,
@@ -2331,6 +2459,7 @@
 	case FI_NEW_INODE:
 		if (set)
 			return;
+		/* fall through */
 	case FI_DATA_EXIST:
 	case FI_INLINE_DOTS:
 	case FI_PIN_FILE:
@@ -2357,6 +2486,12 @@
 	__mark_inode_dirty_flag(inode, flag, false);
 }
 
+static inline bool f2fs_verity_in_progress(struct inode *inode)
+{
+	return IS_ENABLED(CONFIG_FS_VERITY) &&
+	       is_inode_flag_set(inode, FI_VERITY_IN_PROGRESS);
+}
+
 static inline void set_acl_inode(struct inode *inode, umode_t mode)
 {
 	F2FS_I(inode)->i_acl_mode = mode;
@@ -2485,7 +2620,14 @@
 
 static inline unsigned int addrs_per_inode(struct inode *inode)
 {
-	return CUR_ADDRS_PER_INODE(inode) - get_inline_xattr_addrs(inode);
+	unsigned int addrs = CUR_ADDRS_PER_INODE(inode) -
+				get_inline_xattr_addrs(inode);
+	return ALIGN_DOWN(addrs, 1);
+}
+
+static inline unsigned int addrs_per_block(struct inode *inode)
+{
+	return ALIGN_DOWN(DEF_ADDRS_PER_BLOCK, 1);
 }
 
 static inline void *inline_xattr_addr(struct inode *inode, struct page *page)
@@ -2578,6 +2720,20 @@
 	f2fs_mark_inode_dirty_sync(inode, true);
 }
 
+static inline bool f2fs_is_time_consistent(struct inode *inode)
+{
+	if (!timespec64_equal(F2FS_I(inode)->i_disk_time, &inode->i_atime))
+		return false;
+	if (!timespec64_equal(F2FS_I(inode)->i_disk_time + 1, &inode->i_ctime))
+		return false;
+	if (!timespec64_equal(F2FS_I(inode)->i_disk_time + 2, &inode->i_mtime))
+		return false;
+	if (!timespec64_equal(F2FS_I(inode)->i_disk_time + 3,
+						&F2FS_I(inode)->i_crtime))
+		return false;
+	return true;
+}
+
 static inline bool f2fs_skip_inode_update(struct inode *inode, int dsync)
 {
 	bool ret;
@@ -2595,14 +2751,7 @@
 			i_size_read(inode) & ~PAGE_MASK)
 		return false;
 
-	if (!timespec64_equal(F2FS_I(inode)->i_disk_time, &inode->i_atime))
-		return false;
-	if (!timespec64_equal(F2FS_I(inode)->i_disk_time + 1, &inode->i_ctime))
-		return false;
-	if (!timespec64_equal(F2FS_I(inode)->i_disk_time + 2, &inode->i_mtime))
-		return false;
-	if (!timespec64_equal(F2FS_I(inode)->i_disk_time + 3,
-						&F2FS_I(inode)->i_crtime))
+	if (!f2fs_is_time_consistent(inode))
 		return false;
 
 	down_read(&F2FS_I(inode)->i_sem);
@@ -2654,12 +2803,18 @@
 static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi,
 					size_t size, gfp_t flags)
 {
+	void *ret;
+
 	if (time_to_inject(sbi, FAULT_KMALLOC)) {
-		f2fs_show_injection_info(FAULT_KMALLOC);
+		f2fs_show_injection_info(sbi, FAULT_KMALLOC);
 		return NULL;
 	}
 
-	return kmalloc(size, flags);
+	ret = kmalloc(size, flags);
+	if (ret)
+		return ret;
+
+	return kvmalloc(size, flags);
 }
 
 static inline void *f2fs_kzalloc(struct f2fs_sb_info *sbi,
@@ -2672,7 +2827,7 @@
 					size_t size, gfp_t flags)
 {
 	if (time_to_inject(sbi, FAULT_KVMALLOC)) {
-		f2fs_show_injection_info(FAULT_KVMALLOC);
+		f2fs_show_injection_info(sbi, FAULT_KVMALLOC);
 		return NULL;
 	}
 
@@ -2705,9 +2860,9 @@
 
 #define F2FS_OLD_ATTRIBUTE_SIZE	(offsetof(struct f2fs_inode, i_addr))
 #define F2FS_FITS_IN_INODE(f2fs_inode, extra_isize, field)		\
-		((offsetof(typeof(*f2fs_inode), field) +	\
+		((offsetof(typeof(*(f2fs_inode)), field) +	\
 		sizeof((f2fs_inode)->field))			\
-		<= (F2FS_OLD_ATTRIBUTE_SIZE + extra_isize))	\
+		<= (F2FS_OLD_ATTRIBUTE_SIZE + (extra_isize)))	\
 
 static inline void f2fs_reset_iostat(struct f2fs_sb_info *sbi)
 {
@@ -2734,8 +2889,9 @@
 	spin_unlock(&sbi->iostat_lock);
 }
 
-#define __is_meta_io(fio) (PAGE_TYPE_OF_BIO(fio->type) == META &&	\
-				(!is_read_io(fio->op) || fio->is_meta))
+#define __is_large_section(sbi)		((sbi)->segs_per_sec > 1)
+
+#define __is_meta_io(fio) (PAGE_TYPE_OF_BIO((fio)->type) == META)
 
 bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi,
 					block_t blkaddr, int type);
@@ -2743,9 +2899,8 @@
 					block_t blkaddr, int type)
 {
 	if (!f2fs_is_valid_blkaddr(sbi, blkaddr, type)) {
-		f2fs_msg(sbi->sb, KERN_ERR,
-			"invalid blkaddr: %u, type: %d, run fsck to fix.",
-			blkaddr, type);
+		f2fs_err(sbi, "invalid blkaddr: %u, type: %d, run fsck to fix.",
+			 blkaddr, type);
 		f2fs_bug_on(sbi, 1);
 	}
 }
@@ -2757,13 +2912,25 @@
 	return true;
 }
 
-static inline bool is_valid_data_blkaddr(struct f2fs_sb_info *sbi,
-						block_t blkaddr)
+static inline void f2fs_set_page_private(struct page *page,
+						unsigned long data)
 {
-	if (!__is_valid_data_blkaddr(blkaddr))
-		return false;
-	verify_blkaddr(sbi, blkaddr, DATA_GENERIC);
-	return true;
+	if (PagePrivate(page))
+		return;
+
+	get_page(page);
+	SetPagePrivate(page);
+	set_page_private(page, data);
+}
+
+static inline void f2fs_clear_page_private(struct page *page)
+{
+	if (!PagePrivate(page))
+		return;
+
+	set_page_private(page, 0);
+	ClearPagePrivate(page);
+	f2fs_put_page(page, 0);
 }
 
 /*
@@ -2781,6 +2948,7 @@
 int f2fs_precache_extents(struct inode *inode);
 long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
 long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
+int f2fs_transfer_project_quota(struct inode *inode, kprojid_t kprojid);
 int f2fs_pin_file_control(struct inode *inode, bool inc);
 
 /*
@@ -2805,6 +2973,11 @@
 							bool hot, bool set);
 struct dentry *f2fs_get_parent(struct dentry *child);
 
+extern int f2fs_ci_compare(const struct inode *parent,
+			   const struct qstr *name,
+			   const struct qstr *entry,
+			   bool quick);
+
 /*
  * dir.c
  */
@@ -2859,18 +3032,17 @@
 int f2fs_inode_dirtied(struct inode *inode, bool sync);
 void f2fs_inode_synced(struct inode *inode);
 int f2fs_enable_quota_files(struct f2fs_sb_info *sbi, bool rdonly);
+int f2fs_quota_sync(struct super_block *sb, int type);
 void f2fs_quota_off_umount(struct super_block *sb);
 int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover);
 int f2fs_sync_fs(struct super_block *sb, int sync);
-extern __printf(3, 4)
-void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...);
 int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi);
 
 /*
  * hash.c
  */
-f2fs_hash_t f2fs_dentry_hash(const struct qstr *name_info,
-				struct fscrypt_name *fname);
+f2fs_hash_t f2fs_dentry_hash(const struct inode *dir,
+		const struct qstr *name_info, struct fscrypt_name *fname);
 
 /*
  * node.c
@@ -2901,7 +3073,7 @@
 void f2fs_ra_node_page(struct f2fs_sb_info *sbi, nid_t nid);
 struct page *f2fs_get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid);
 struct page *f2fs_get_node_page_ra(struct page *parent, int start);
-void f2fs_move_node_page(struct page *node_page, int gc_type);
+int f2fs_move_node_page(struct page *node_page, int gc_type);
 int f2fs_fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
 			struct writeback_control *wbc, bool atomic,
 			unsigned int *seq_id);
@@ -2918,7 +3090,7 @@
 int f2fs_recover_inode_page(struct f2fs_sb_info *sbi, struct page *page);
 int f2fs_restore_node_summary(struct f2fs_sb_info *sbi,
 			unsigned int segno, struct f2fs_summary_block *sum);
-void f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc);
+int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc);
 int f2fs_build_node_manager(struct f2fs_sb_info *sbi);
 void f2fs_destroy_node_manager(struct f2fs_sb_info *sbi);
 int __init f2fs_create_node_manager_caches(void);
@@ -2943,12 +3115,17 @@
 bool f2fs_is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr);
 void f2fs_drop_discard_cmd(struct f2fs_sb_info *sbi);
 void f2fs_stop_discard_thread(struct f2fs_sb_info *sbi);
-bool f2fs_wait_discard_bios(struct f2fs_sb_info *sbi);
+bool f2fs_issue_discard_timeout(struct f2fs_sb_info *sbi);
 void f2fs_clear_prefree_segments(struct f2fs_sb_info *sbi,
 					struct cp_control *cpc);
+void f2fs_dirty_to_prefree(struct f2fs_sb_info *sbi);
+block_t f2fs_get_unusable_blocks(struct f2fs_sb_info *sbi);
+int f2fs_disable_cp_again(struct f2fs_sb_info *sbi, block_t unusable);
 void f2fs_release_discard_addrs(struct f2fs_sb_info *sbi);
 int f2fs_npages_for_summary_flush(struct f2fs_sb_info *sbi, bool for_ra);
-void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi);
+void allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type,
+					unsigned int start, unsigned int end);
+void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi, int type);
 int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range);
 bool f2fs_exist_trim_candidates(struct f2fs_sb_info *sbi,
 					struct cp_control *cpc);
@@ -2973,8 +3150,10 @@
 			struct f2fs_summary *sum, int type,
 			struct f2fs_io_info *fio, bool add_list);
 void f2fs_wait_on_page_writeback(struct page *page,
-			enum page_type type, bool ordered);
+			enum page_type type, bool ordered, bool locked);
 void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr);
+void f2fs_wait_on_block_writeback_range(struct inode *inode, block_t blkaddr,
+								block_t len);
 void f2fs_write_data_summaries(struct f2fs_sb_info *sbi, block_t start_blk);
 void f2fs_write_node_summaries(struct f2fs_sb_info *sbi, block_t start_blk);
 int f2fs_lookup_journal_in_cursum(struct f2fs_journal *journal, int type,
@@ -3032,12 +3211,17 @@
  */
 int f2fs_init_post_read_processing(void);
 void f2fs_destroy_post_read_processing(void);
+int f2fs_init_bio_entry_cache(void);
+void f2fs_destroy_bio_entry_cache(void);
 void f2fs_submit_merged_write(struct f2fs_sb_info *sbi, enum page_type type);
 void f2fs_submit_merged_write_cond(struct f2fs_sb_info *sbi,
-				struct inode *inode, nid_t ino, pgoff_t idx,
-				enum page_type type);
+				struct inode *inode, struct page *page,
+				nid_t ino, enum page_type type);
+void f2fs_submit_merged_ipu_write(struct f2fs_sb_info *sbi,
+					struct bio **bio, struct page *page);
 void f2fs_flush_merged_writes(struct f2fs_sb_info *sbi);
 int f2fs_submit_page_bio(struct f2fs_io_info *fio);
+int f2fs_merge_page_bio(struct f2fs_io_info *fio);
 void f2fs_submit_page_write(struct f2fs_io_info *fio);
 struct block_device *f2fs_target_device(struct f2fs_sb_info *sbi,
 			block_t blk_addr, struct bio *bio);
@@ -3057,6 +3241,7 @@
 struct page *f2fs_get_new_data_page(struct inode *inode,
 			struct page *ipage, pgoff_t index, bool new_i_size);
 int f2fs_do_write_data_page(struct f2fs_io_info *fio);
+void __do_map_lock(struct f2fs_sb_info *sbi, int flag, bool lock);
 int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
 			int create, int flag);
 int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
@@ -3082,6 +3267,7 @@
 int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, bool background,
 			unsigned int segno);
 void f2fs_build_gc_manager(struct f2fs_sb_info *sbi);
+int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count);
 
 /*
  * recovery.c
@@ -3109,6 +3295,9 @@
 	int free_nids, avail_nids, alloc_nids;
 	int total_count, utilization;
 	int bg_gc, nr_wb_cp_data, nr_wb_data;
+	int nr_rd_data, nr_rd_node, nr_rd_meta;
+	int nr_dio_read, nr_dio_write;
+	unsigned int io_skip_bggc, other_skip_bggc;
 	int nr_flushing, nr_flushed, flush_list_empty;
 	int nr_discarding, nr_discarded;
 	int nr_discard_cmd;
@@ -3130,6 +3319,7 @@
 	int cursec[NR_CURSEG_TYPE];
 	int curzone[NR_CURSEG_TYPE];
 
+	unsigned int meta_count[META_MAX];
 	unsigned int segment_count[2];
 	unsigned int block_count[2];
 	unsigned int inplace_count;
@@ -3145,6 +3335,8 @@
 #define stat_inc_bg_cp_count(si)	((si)->bg_cp_count++)
 #define stat_inc_call_count(si)		((si)->call_count++)
 #define stat_inc_bggc_count(sbi)	((sbi)->bg_gc++)
+#define stat_io_skip_bggc_count(sbi)	((sbi)->io_skip_bggc++)
+#define stat_other_skip_bggc_count(sbi)	((sbi)->other_skip_bggc++)
 #define stat_inc_dirty_inode(sbi, type)	((sbi)->ndirty_inode[type]++)
 #define stat_dec_dirty_inode(sbi, type)	((sbi)->ndirty_inode[type]--)
 #define stat_inc_total_hit(sbi)		(atomic64_inc(&(sbi)->total_hit_ext))
@@ -3181,6 +3373,17 @@
 		if (f2fs_has_inline_dentry(inode))			\
 			(atomic_dec(&F2FS_I_SB(inode)->inline_dir));	\
 	} while (0)
+#define stat_inc_meta_count(sbi, blkaddr)				\
+	do {								\
+		if (blkaddr < SIT_I(sbi)->sit_base_addr)		\
+			atomic_inc(&(sbi)->meta_count[META_CP]);	\
+		else if (blkaddr < NM_I(sbi)->nat_blkaddr)		\
+			atomic_inc(&(sbi)->meta_count[META_SIT]);	\
+		else if (blkaddr < SM_I(sbi)->ssa_blkaddr)		\
+			atomic_inc(&(sbi)->meta_count[META_NAT]);	\
+		else if (blkaddr < SM_I(sbi)->main_blkaddr)		\
+			atomic_inc(&(sbi)->meta_count[META_SSA]);	\
+	} while (0)
 #define stat_inc_seg_type(sbi, curseg)					\
 		((sbi)->segment_count[(curseg)->alloc_type]++)
 #define stat_inc_block_count(sbi, curseg)				\
@@ -3243,13 +3446,15 @@
 
 int f2fs_build_stats(struct f2fs_sb_info *sbi);
 void f2fs_destroy_stats(struct f2fs_sb_info *sbi);
-int __init f2fs_create_root_stats(void);
+void __init f2fs_create_root_stats(void);
 void f2fs_destroy_root_stats(void);
 #else
 #define stat_inc_cp_count(si)				do { } while (0)
 #define stat_inc_bg_cp_count(si)			do { } while (0)
 #define stat_inc_call_count(si)				do { } while (0)
 #define stat_inc_bggc_count(si)				do { } while (0)
+#define stat_io_skip_bggc_count(sbi)			do { } while (0)
+#define stat_other_skip_bggc_count(sbi)			do { } while (0)
 #define stat_inc_dirty_inode(sbi, type)			do { } while (0)
 #define stat_dec_dirty_inode(sbi, type)			do { } while (0)
 #define stat_inc_total_hit(sb)				do { } while (0)
@@ -3268,6 +3473,7 @@
 #define stat_inc_volatile_write(inode)			do { } while (0)
 #define stat_dec_volatile_write(inode)			do { } while (0)
 #define stat_update_max_volatile_write(inode)		do { } while (0)
+#define stat_inc_meta_count(sbi, blkaddr)		do { } while (0)
 #define stat_inc_seg_type(sbi, curseg)			do { } while (0)
 #define stat_inc_block_count(sbi, curseg)		do { } while (0)
 #define stat_inc_inplace_blocks(sbi)			do { } while (0)
@@ -3278,11 +3484,14 @@
 
 static inline int f2fs_build_stats(struct f2fs_sb_info *sbi) { return 0; }
 static inline void f2fs_destroy_stats(struct f2fs_sb_info *sbi) { }
-static inline int __init f2fs_create_root_stats(void) { return 0; }
+static inline void __init f2fs_create_root_stats(void) { }
 static inline void f2fs_destroy_root_stats(void) { }
 #endif
 
 extern const struct file_operations f2fs_dir_operations;
+#ifdef CONFIG_UNICODE
+extern const struct dentry_operations f2fs_dentry_ops;
+#endif
 extern const struct file_operations f2fs_file_operations;
 extern const struct inode_operations f2fs_file_inode_operations;
 extern const struct address_space_operations f2fs_dblock_aops;
@@ -3337,18 +3546,19 @@
 /*
  * extent_cache.c
  */
-struct rb_entry *f2fs_lookup_rb_tree(struct rb_root *root,
+struct rb_entry *f2fs_lookup_rb_tree(struct rb_root_cached *root,
 				struct rb_entry *cached_re, unsigned int ofs);
 struct rb_node **f2fs_lookup_rb_tree_for_insert(struct f2fs_sb_info *sbi,
-				struct rb_root *root, struct rb_node **parent,
-				unsigned int ofs);
-struct rb_entry *f2fs_lookup_rb_tree_ret(struct rb_root *root,
+				struct rb_root_cached *root,
+				struct rb_node **parent,
+				unsigned int ofs, bool *leftmost);
+struct rb_entry *f2fs_lookup_rb_tree_ret(struct rb_root_cached *root,
 		struct rb_entry *cached_re, unsigned int ofs,
 		struct rb_entry **prev_entry, struct rb_entry **next_entry,
 		struct rb_node ***insert_p, struct rb_node **insert_parent,
-		bool force);
+		bool force, bool *leftmost);
 bool f2fs_check_rb_tree_consistence(struct f2fs_sb_info *sbi,
-						struct rb_root *root);
+						struct rb_root_cached *root);
 unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink);
 bool f2fs_init_extent_tree(struct inode *inode, struct f2fs_extent *i_ext);
 void f2fs_drop_extent_tree(struct inode *inode);
@@ -3371,22 +3581,20 @@
 int f2fs_register_sysfs(struct f2fs_sb_info *sbi);
 void f2fs_unregister_sysfs(struct f2fs_sb_info *sbi);
 
+/* verity.c */
+extern const struct fsverity_operations f2fs_verityops;
+
 /*
  * crypto support
  */
-static inline bool f2fs_encrypted_inode(struct inode *inode)
-{
-	return file_is_encrypt(inode);
-}
-
 static inline bool f2fs_encrypted_file(struct inode *inode)
 {
-	return f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode);
+	return IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode);
 }
 
 static inline void f2fs_set_encrypted_inode(struct inode *inode)
 {
-#ifdef CONFIG_F2FS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	file_set_encrypt(inode);
 	f2fs_set_inode_flags(inode);
 #endif
@@ -3398,13 +3606,13 @@
  */
 static inline bool f2fs_post_read_required(struct inode *inode)
 {
-	return f2fs_encrypted_file(inode);
+	return f2fs_encrypted_file(inode) || fsverity_active(inode);
 }
 
 #define F2FS_FEATURE_FUNCS(name, flagname) \
-static inline int f2fs_sb_has_##name(struct super_block *sb) \
+static inline int f2fs_sb_has_##name(struct f2fs_sb_info *sbi) \
 { \
-	return F2FS_HAS_FEATURE(sb, F2FS_FEATURE_##flagname); \
+	return F2FS_HAS_FEATURE(sbi, F2FS_FEATURE_##flagname); \
 }
 
 F2FS_FEATURE_FUNCS(encrypt, ENCRYPT);
@@ -3416,29 +3624,42 @@
 F2FS_FEATURE_FUNCS(quota_ino, QUOTA_INO);
 F2FS_FEATURE_FUNCS(inode_crtime, INODE_CRTIME);
 F2FS_FEATURE_FUNCS(lost_found, LOST_FOUND);
+F2FS_FEATURE_FUNCS(verity, VERITY);
+F2FS_FEATURE_FUNCS(sb_chksum, SB_CHKSUM);
+F2FS_FEATURE_FUNCS(casefold, CASEFOLD);
 
 #ifdef CONFIG_BLK_DEV_ZONED
-static inline int get_blkz_type(struct f2fs_sb_info *sbi,
-			struct block_device *bdev, block_t blkaddr)
+static inline bool f2fs_blkz_is_seq(struct f2fs_sb_info *sbi, int devi,
+				    block_t blkaddr)
 {
 	unsigned int zno = blkaddr >> sbi->log_blocks_per_blkz;
-	int i;
 
-	for (i = 0; i < sbi->s_ndevs; i++)
-		if (FDEV(i).bdev == bdev)
-			return FDEV(i).blkz_type[zno];
-	return -EINVAL;
+	return test_bit(zno, FDEV(devi).blkz_seq);
 }
 #endif
 
 static inline bool f2fs_hw_should_discard(struct f2fs_sb_info *sbi)
 {
-	return f2fs_sb_has_blkzoned(sbi->sb);
+	return f2fs_sb_has_blkzoned(sbi);
+}
+
+static inline bool f2fs_bdev_support_discard(struct block_device *bdev)
+{
+	return blk_queue_discard(bdev_get_queue(bdev)) ||
+	       bdev_is_zoned(bdev);
 }
 
 static inline bool f2fs_hw_support_discard(struct f2fs_sb_info *sbi)
 {
-	return blk_queue_discard(bdev_get_queue(sbi->sb->s_bdev));
+	int i;
+
+	if (!f2fs_is_multi_device(sbi))
+		return f2fs_bdev_support_discard(sbi->sb->s_bdev);
+
+	for (i = 0; i < sbi->s_ndevs; i++)
+		if (f2fs_bdev_support_discard(FDEV(i).bdev))
+			return true;
+	return false;
 }
 
 static inline bool f2fs_realtime_discard_enable(struct f2fs_sb_info *sbi)
@@ -3447,6 +3668,20 @@
 					f2fs_hw_should_discard(sbi);
 }
 
+static inline bool f2fs_hw_is_readonly(struct f2fs_sb_info *sbi)
+{
+	int i;
+
+	if (!f2fs_is_multi_device(sbi))
+		return bdev_read_only(sbi->sb->s_bdev);
+
+	for (i = 0; i < sbi->s_ndevs; i++)
+		if (bdev_read_only(FDEV(i).bdev))
+			return true;
+	return false;
+}
+
+
 static inline void set_opt_mode(struct f2fs_sb_info *sbi, unsigned int mt)
 {
 	clear_opt(sbi, ADAPTIVE);
@@ -3464,7 +3699,7 @@
 
 static inline bool f2fs_may_encrypt(struct inode *inode)
 {
-#ifdef CONFIG_F2FS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	umode_t mode = inode->i_mode;
 
 	return (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode));
@@ -3473,11 +3708,54 @@
 #endif
 }
 
-static inline bool f2fs_force_buffered_io(struct inode *inode, int rw)
+static inline int block_unaligned_IO(struct inode *inode,
+				struct kiocb *iocb, struct iov_iter *iter)
 {
-	return (f2fs_post_read_required(inode) ||
-			(rw == WRITE && test_opt(F2FS_I_SB(inode), LFS)) ||
-			f2fs_is_multi_device(F2FS_I_SB(inode)));
+	unsigned int i_blkbits = READ_ONCE(inode->i_blkbits);
+	unsigned int blocksize_mask = (1 << i_blkbits) - 1;
+	loff_t offset = iocb->ki_pos;
+	unsigned long align = offset | iov_iter_alignment(iter);
+
+	return align & blocksize_mask;
+}
+
+static inline int allow_outplace_dio(struct inode *inode,
+				struct kiocb *iocb, struct iov_iter *iter)
+{
+	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+	int rw = iov_iter_rw(iter);
+
+	return (test_opt(sbi, LFS) && (rw == WRITE) &&
+				!block_unaligned_IO(inode, iocb, iter));
+}
+
+static inline bool f2fs_force_buffered_io(struct inode *inode,
+				struct kiocb *iocb, struct iov_iter *iter)
+{
+	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+	int rw = iov_iter_rw(iter);
+
+	if (f2fs_post_read_required(inode))
+		return true;
+	if (f2fs_is_multi_device(sbi))
+		return true;
+	/*
+	 * for blkzoned device, fallback direct IO to buffered IO, so
+	 * all IOs can be serialized by log-structured write.
+	 */
+	if (f2fs_sb_has_blkzoned(sbi))
+		return true;
+	if (test_opt(sbi, LFS) && (rw == WRITE)) {
+		if (block_unaligned_IO(inode, iocb, iter))
+			return true;
+		if (F2FS_IO_ALIGNED(sbi))
+			return true;
+	}
+	if (is_sbi_flag_set(F2FS_I_SB(inode), SBI_CP_DISABLED) &&
+					!IS_SWAPFILE(inode))
+		return true;
+
+	return false;
 }
 
 #ifdef CONFIG_F2FS_FAULT_INJECTION
@@ -3487,8 +3765,20 @@
 #define f2fs_build_fault_attr(sbi, rate, type)		do { } while (0)
 #endif
 
+static inline bool is_journalled_quota(struct f2fs_sb_info *sbi)
+{
+#ifdef CONFIG_QUOTA
+	if (f2fs_sb_has_quota_ino(sbi))
+		return true;
+	if (F2FS_OPTION(sbi).s_qf_names[USRQUOTA] ||
+		F2FS_OPTION(sbi).s_qf_names[GRPQUOTA] ||
+		F2FS_OPTION(sbi).s_qf_names[PRJQUOTA])
+		return true;
 #endif
+	return false;
+}
 
 #define EFSBADCRC	EBADMSG		/* Bad CRC detected */
 #define EFSCORRUPTED	EUCLEAN		/* Filesystem is corrupted */
 
+#endif /* _LINUX_F2FS_H */
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 5eef2a8..b6fc15a 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/file.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
@@ -23,6 +20,7 @@
 #include <linux/uio.h>
 #include <linux/uuid.h>
 #include <linux/file.h>
+#include <linux/nls.h>
 
 #include "f2fs.h"
 #include "node.h"
@@ -32,6 +30,7 @@
 #include "gc.h"
 #include "trace.h"
 #include <trace/events/f2fs.h>
+#include <trace/events/android_fs.h>
 
 static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf)
 {
@@ -42,6 +41,8 @@
 	ret = filemap_fault(vmf);
 	up_read(&F2FS_I(inode)->i_mmap_sem);
 
+	trace_f2fs_filemap_fault(inode, vmf->pgoff, (unsigned long)ret);
+
 	return ret;
 }
 
@@ -50,7 +51,7 @@
 	struct page *page = vmf->page;
 	struct inode *inode = file_inode(vmf->vma->vm_file);
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
-	struct dnode_of_data dn;
+	struct dnode_of_data dn = { .node_changed = false };
 	int err;
 
 	if (unlikely(f2fs_cp_error(sbi))) {
@@ -58,23 +59,15 @@
 		goto err;
 	}
 
+	if (!f2fs_is_checkpoint_ready(sbi)) {
+		err = -ENOSPC;
+		goto err;
+	}
+
 	sb_start_pagefault(inode->i_sb);
 
 	f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
 
-	/* block allocation */
-	f2fs_lock_op(sbi);
-	set_new_dnode(&dn, inode, NULL, NULL, 0);
-	err = f2fs_reserve_block(&dn, page->index);
-	if (err) {
-		f2fs_unlock_op(sbi);
-		goto out;
-	}
-	f2fs_put_dnode(&dn);
-	f2fs_unlock_op(sbi);
-
-	f2fs_balance_fs(sbi, dn.node_changed);
-
 	file_update_time(vmf->vma->vm_file);
 	down_read(&F2FS_I(inode)->i_mmap_sem);
 	lock_page(page);
@@ -86,11 +79,28 @@
 		goto out_sem;
 	}
 
+	/* block allocation */
+	__do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, true);
+	set_new_dnode(&dn, inode, NULL, NULL, 0);
+	err = f2fs_get_block(&dn, page->index);
+	f2fs_put_dnode(&dn);
+	__do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, false);
+	if (err) {
+		unlock_page(page);
+		goto out_sem;
+	}
+
+	/* fill the page */
+	f2fs_wait_on_page_writeback(page, DATA, false, true);
+
+	/* wait for GCed page writeback via META_MAPPING */
+	f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
+
 	/*
 	 * check to see if the page is mapped already (no holes)
 	 */
 	if (PageMappedToDisk(page))
-		goto mapped;
+		goto out_sem;
 
 	/* page is wholly or partially inside EOF */
 	if (((loff_t)(page->index + 1) << PAGE_SHIFT) >
@@ -105,20 +115,15 @@
 		SetPageUptodate(page);
 
 	f2fs_update_iostat(sbi, APP_MAPPED_IO, F2FS_BLKSIZE);
+	f2fs_update_time(sbi, REQ_TIME);
 
 	trace_f2fs_vm_page_mkwrite(page, DATA);
-mapped:
-	/* fill the page */
-	f2fs_wait_on_page_writeback(page, DATA, false);
-
-	/* wait for GCed page writeback via META_MAPPING */
-	f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
-
 out_sem:
 	up_read(&F2FS_I(inode)->i_mmap_sem);
-out:
+
+	f2fs_balance_fs(sbi, dn.node_changed);
+
 	sb_end_pagefault(inode->i_sb);
-	f2fs_update_time(sbi, REQ_TIME);
 err:
 	return block_page_mkwrite_return(err);
 }
@@ -214,11 +219,21 @@
 	};
 	unsigned int seq_id = 0;
 
-	if (unlikely(f2fs_readonly(inode->i_sb)))
+	if (unlikely(f2fs_readonly(inode->i_sb) ||
+				is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
 		return 0;
 
 	trace_f2fs_sync_file_enter(inode);
 
+	if (trace_android_fs_fsync_start_enabled()) {
+		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+		path = android_fstrace_get_pathname(pathbuf,
+				MAX_TRACE_PATHBUF_LEN, inode);
+		trace_android_fs_fsync_start(inode,
+				current->pid, path, current->comm);
+	}
+
 	if (S_ISDIR(inode->i_mode))
 		goto go_write;
 
@@ -324,6 +339,8 @@
 out:
 	trace_f2fs_sync_file_exit(inode, cp_reason, datasync, ret);
 	f2fs_trace_ios(NULL, 1);
+	trace_android_fs_fsync_end(inode, start, end - start);
+
 	return ret;
 }
 
@@ -359,7 +376,7 @@
 	switch (whence) {
 	case SEEK_DATA:
 		if ((blkaddr == NEW_ADDR && dirty == pgofs) ||
-			is_valid_data_blkaddr(sbi, blkaddr))
+			__is_valid_data_blkaddr(blkaddr))
 			return true;
 		break;
 	case SEEK_HOLE:
@@ -425,7 +442,7 @@
 
 			if (__is_valid_data_blkaddr(blkaddr) &&
 				!f2fs_is_valid_blkaddr(F2FS_I_SB(inode),
-						blkaddr, DATA_GENERIC)) {
+					blkaddr, DATA_GENERIC_ENHANCE)) {
 				f2fs_put_dnode(&dn);
 				goto fail;
 			}
@@ -497,6 +514,10 @@
 	if (err)
 		return err;
 
+	err = fsverity_file_open(inode, filp);
+	if (err)
+		return err;
+
 	filp->f_mode |= FMODE_NOWAIT;
 
 	return dquot_file_open(inode, filp);
@@ -526,7 +547,8 @@
 		f2fs_set_data_blkaddr(dn);
 
 		if (__is_valid_data_blkaddr(blkaddr) &&
-			!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC))
+			!f2fs_is_valid_blkaddr(sbi, blkaddr,
+					DATA_GENERIC_ENHANCE))
 			continue;
 
 		f2fs_invalidate_blocks(sbi, blkaddr);
@@ -555,7 +577,7 @@
 
 void f2fs_truncate_data_blocks(struct dnode_of_data *dn)
 {
-	f2fs_truncate_data_blocks_range(dn, ADDRS_PER_BLOCK);
+	f2fs_truncate_data_blocks_range(dn, ADDRS_PER_BLOCK(dn->inode));
 }
 
 static int truncate_partial_data_page(struct inode *inode, u64 from,
@@ -581,11 +603,11 @@
 	if (IS_ERR(page))
 		return PTR_ERR(page) == -ENOENT ? 0 : PTR_ERR(page);
 truncate_out:
-	f2fs_wait_on_page_writeback(page, DATA, true);
+	f2fs_wait_on_page_writeback(page, DATA, true, true);
 	zero_user(page, offset, PAGE_SIZE - offset);
 
 	/* An encrypted inode should have a key and truncate the last page. */
-	f2fs_bug_on(F2FS_I_SB(inode), cache_only && f2fs_encrypted_inode(inode));
+	f2fs_bug_on(F2FS_I_SB(inode), cache_only && IS_ENCRYPTED(inode));
 	if (!cache_only)
 		set_page_dirty(page);
 	f2fs_put_page(page, 1);
@@ -671,7 +693,7 @@
 	trace_f2fs_truncate(inode);
 
 	if (time_to_inject(F2FS_I_SB(inode), FAULT_TRUNCATE)) {
-		f2fs_show_injection_info(FAULT_TRUNCATE);
+		f2fs_show_injection_info(F2FS_I_SB(inode), FAULT_TRUNCATE);
 		return -EIO;
 	}
 
@@ -700,19 +722,17 @@
 	unsigned int flags;
 
 	if (f2fs_has_extra_attr(inode) &&
-			f2fs_sb_has_inode_crtime(inode->i_sb) &&
+			f2fs_sb_has_inode_crtime(F2FS_I_SB(inode)) &&
 			F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_crtime)) {
 		stat->result_mask |= STATX_BTIME;
 		stat->btime.tv_sec = fi->i_crtime.tv_sec;
 		stat->btime.tv_nsec = fi->i_crtime.tv_nsec;
 	}
 
-	flags = fi->i_flags & F2FS_FL_USER_VISIBLE;
+	flags = fi->i_flags;
 	if (flags & F2FS_APPEND_FL)
 		stat->attributes |= STATX_ATTR_APPEND;
-	if (flags & F2FS_COMPR_FL)
-		stat->attributes |= STATX_ATTR_COMPRESSED;
-	if (f2fs_encrypted_inode(inode))
+	if (IS_ENCRYPTED(inode))
 		stat->attributes |= STATX_ATTR_ENCRYPTED;
 	if (flags & F2FS_IMMUTABLE_FL)
 		stat->attributes |= STATX_ATTR_IMMUTABLE;
@@ -720,7 +740,6 @@
 		stat->attributes |= STATX_ATTR_NODUMP;
 
 	stat->attributes_mask |= (STATX_ATTR_APPEND |
-				  STATX_ATTR_COMPRESSED |
 				  STATX_ATTR_ENCRYPTED |
 				  STATX_ATTR_IMMUTABLE |
 				  STATX_ATTR_NODUMP);
@@ -781,6 +800,10 @@
 	if (err)
 		return err;
 
+	err = fsverity_prepare_setattr(dentry, attr);
+	if (err)
+		return err;
+
 	if (is_quota_modification(inode, attr)) {
 		err = dquot_initialize(inode);
 		if (err)
@@ -790,20 +813,45 @@
 		!uid_eq(attr->ia_uid, inode->i_uid)) ||
 		(attr->ia_valid & ATTR_GID &&
 		!gid_eq(attr->ia_gid, inode->i_gid))) {
+		f2fs_lock_op(F2FS_I_SB(inode));
 		err = dquot_transfer(inode, attr);
-		if (err)
+		if (err) {
+			set_sbi_flag(F2FS_I_SB(inode),
+					SBI_QUOTA_NEED_REPAIR);
+			f2fs_unlock_op(F2FS_I_SB(inode));
 			return err;
+		}
+		/*
+		 * update uid/gid under lock_op(), so that dquot and inode can
+		 * be updated atomically.
+		 */
+		if (attr->ia_valid & ATTR_UID)
+			inode->i_uid = attr->ia_uid;
+		if (attr->ia_valid & ATTR_GID)
+			inode->i_gid = attr->ia_gid;
+		f2fs_mark_inode_dirty_sync(inode, true);
+		f2fs_unlock_op(F2FS_I_SB(inode));
 	}
 
 	if (attr->ia_valid & ATTR_SIZE) {
-		bool to_smaller = (attr->ia_size <= i_size_read(inode));
+		loff_t old_size = i_size_read(inode);
+
+		if (attr->ia_size > MAX_INLINE_DATA(inode)) {
+			/*
+			 * should convert inline inode before i_size_write to
+			 * keep smaller than inline_data size with inline flag.
+			 */
+			err = f2fs_convert_inline_inode(inode);
+			if (err)
+				return err;
+		}
 
 		down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
 		down_write(&F2FS_I(inode)->i_mmap_sem);
 
 		truncate_setsize(inode, attr->ia_size);
 
-		if (to_smaller)
+		if (attr->ia_size <= old_size)
 			err = f2fs_truncate(inode);
 		/*
 		 * do not trim all blocks after i_size if target size is
@@ -811,21 +859,11 @@
 		 */
 		up_write(&F2FS_I(inode)->i_mmap_sem);
 		up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
-
 		if (err)
 			return err;
 
-		if (!to_smaller) {
-			/* should convert inline inode here */
-			if (!f2fs_may_inline_data(inode)) {
-				err = f2fs_convert_inline_inode(inode);
-				if (err)
-					return err;
-			}
-			inode->i_mtime = inode->i_ctime = current_time(inode);
-		}
-
 		down_write(&F2FS_I(inode)->i_sem);
+		inode->i_mtime = inode->i_ctime = current_time(inode);
 		F2FS_I(inode)->last_disk_size = i_size_read(inode);
 		up_write(&F2FS_I(inode)->i_sem);
 	}
@@ -878,7 +916,7 @@
 	if (IS_ERR(page))
 		return PTR_ERR(page);
 
-	f2fs_wait_on_page_writeback(page, DATA, true);
+	f2fs_wait_on_page_writeback(page, DATA, true, true);
 	zero_user(page, start, len);
 	set_page_dirty(page);
 	f2fs_put_page(page, 1);
@@ -994,7 +1032,8 @@
 	} else if (ret == -ENOENT) {
 		if (dn.max_level == 0)
 			return -ENOENT;
-		done = min((pgoff_t)ADDRS_PER_BLOCK - dn.ofs_in_node, len);
+		done = min((pgoff_t)ADDRS_PER_BLOCK(inode) - dn.ofs_in_node,
+									len);
 		blkaddr += done;
 		do_replace += done;
 		goto next;
@@ -1005,11 +1044,19 @@
 	for (i = 0; i < done; i++, blkaddr++, do_replace++, dn.ofs_in_node++) {
 		*blkaddr = datablock_addr(dn.inode,
 					dn.node_page, dn.ofs_in_node);
+
+		if (__is_valid_data_blkaddr(*blkaddr) &&
+			!f2fs_is_valid_blkaddr(sbi, *blkaddr,
+					DATA_GENERIC_ENHANCE)) {
+			f2fs_put_dnode(&dn);
+			return -EFSCORRUPTED;
+		}
+
 		if (!f2fs_is_checkpointed_data(sbi, *blkaddr)) {
 
 			if (test_opt(sbi, LFS)) {
 				f2fs_put_dnode(&dn);
-				return -ENOTSUPP;
+				return -EOPNOTSUPP;
 			}
 
 			/* do not invalidate this block address */
@@ -1101,7 +1148,7 @@
 				}
 				dn.ofs_in_node++;
 				i++;
-				new_size = (dst + i) << PAGE_SHIFT;
+				new_size = (loff_t)(dst + i) << PAGE_SHIFT;
 				if (dst_inode->i_size < new_size)
 					f2fs_i_size_write(dst_inode, new_size);
 			} while (--ilen && (do_replace[i] || blkaddr[i] == NULL_ADDR));
@@ -1145,7 +1192,7 @@
 	int ret;
 
 	while (len) {
-		olen = min((pgoff_t)4 * ADDRS_PER_BLOCK, len);
+		olen = min((pgoff_t)4 * ADDRS_PER_BLOCK(src_inode), len);
 
 		src_blkaddr = f2fs_kvzalloc(F2FS_I_SB(src_inode),
 					array_size(olen, sizeof(block_t)),
@@ -1190,7 +1237,7 @@
 static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len)
 {
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
-	pgoff_t nrpages = (i_size_read(inode) + PAGE_SIZE - 1) / PAGE_SIZE;
+	pgoff_t nrpages = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
 	pgoff_t start = offset >> PAGE_SHIFT;
 	pgoff_t end = (offset + len) >> PAGE_SHIFT;
 	int ret;
@@ -1443,7 +1490,7 @@
 	pg_start = offset >> PAGE_SHIFT;
 	pg_end = (offset + len) >> PAGE_SHIFT;
 	delta = pg_end - pg_start;
-	idx = (i_size_read(inode) + PAGE_SIZE - 1) / PAGE_SIZE;
+	idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
 
 	/* avoid gc operation during block exchange */
 	down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
@@ -1482,7 +1529,8 @@
 {
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 	struct f2fs_map_blocks map = { .m_next_pgofs = NULL,
-			.m_next_extent = NULL, .m_seg_type = NO_CHECK_TYPE };
+			.m_next_extent = NULL, .m_seg_type = NO_CHECK_TYPE,
+			.m_may_create = true };
 	pgoff_t pg_end;
 	loff_t new_size = i_size_read(inode);
 	loff_t off_end;
@@ -1506,7 +1554,44 @@
 	if (off_end)
 		map.m_len++;
 
-	err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
+	if (!map.m_len)
+		return 0;
+
+	if (f2fs_is_pinned_file(inode)) {
+		block_t len = (map.m_len >> sbi->log_blocks_per_seg) <<
+					sbi->log_blocks_per_seg;
+		block_t done = 0;
+
+		if (map.m_len % sbi->blocks_per_seg)
+			len += sbi->blocks_per_seg;
+
+		map.m_len = sbi->blocks_per_seg;
+next_alloc:
+		if (has_not_enough_free_secs(sbi, 0,
+			GET_SEC_FROM_SEG(sbi, overprovision_segments(sbi)))) {
+			mutex_lock(&sbi->gc_mutex);
+			err = f2fs_gc(sbi, true, false, NULL_SEGNO);
+			if (err && err != -ENODATA && err != -EAGAIN)
+				goto out_err;
+		}
+
+		down_write(&sbi->pin_sem);
+		map.m_seg_type = CURSEG_COLD_DATA_PINNED;
+		f2fs_allocate_new_segments(sbi, CURSEG_COLD_DATA);
+		err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_DIO);
+		up_write(&sbi->pin_sem);
+
+		done += map.m_len;
+		len -= map.m_len;
+		map.m_lblk += map.m_len;
+		if (!err && len)
+			goto next_alloc;
+
+		map.m_len = done;
+	} else {
+		err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
+	}
+out_err:
 	if (err) {
 		pgoff_t last_off;
 
@@ -1540,12 +1625,14 @@
 
 	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
 		return -EIO;
+	if (!f2fs_is_checkpoint_ready(F2FS_I_SB(inode)))
+		return -ENOSPC;
 
 	/* f2fs only support ->fallocate for regular file */
 	if (!S_ISREG(inode->i_mode))
 		return -EINVAL;
 
-	if (f2fs_encrypted_inode(inode) &&
+	if (IS_ENCRYPTED(inode) &&
 		(mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE)))
 		return -EOPNOTSUPP;
 
@@ -1623,42 +1710,22 @@
 	return 0;
 }
 
-static int f2fs_ioc_getflags(struct file *filp, unsigned long arg)
-{
-	struct inode *inode = file_inode(filp);
-	struct f2fs_inode_info *fi = F2FS_I(inode);
-	unsigned int flags = fi->i_flags;
-
-	if (f2fs_encrypted_inode(inode))
-		flags |= F2FS_ENCRYPT_FL;
-	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode))
-		flags |= F2FS_INLINE_DATA_FL;
-
-	flags &= F2FS_FL_USER_VISIBLE;
-
-	return put_user(flags, (int __user *)arg);
-}
-
-static int __f2fs_ioc_setflags(struct inode *inode, unsigned int flags)
+static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask)
 {
 	struct f2fs_inode_info *fi = F2FS_I(inode);
-	unsigned int oldflags;
 
 	/* Is it quota file? Do not allow user to mess with it */
 	if (IS_NOQUOTA(inode))
 		return -EPERM;
 
-	flags = f2fs_mask_flags(inode->i_mode, flags);
+	if ((iflags ^ fi->i_flags) & F2FS_CASEFOLD_FL) {
+		if (!f2fs_sb_has_casefold(F2FS_I_SB(inode)))
+			return -EOPNOTSUPP;
+		if (!f2fs_empty_dir(inode))
+			return -ENOTEMPTY;
+	}
 
-	oldflags = fi->i_flags;
-
-	if ((flags ^ oldflags) & (F2FS_APPEND_FL | F2FS_IMMUTABLE_FL))
-		if (!capable(CAP_LINUX_IMMUTABLE))
-			return -EPERM;
-
-	flags = flags & F2FS_FL_USER_MODIFIABLE;
-	flags |= oldflags & ~F2FS_FL_USER_MODIFIABLE;
-	fi->i_flags = flags;
+	fi->i_flags = iflags | (fi->i_flags & ~mask);
 
 	if (fi->i_flags & F2FS_PROJINHERIT_FL)
 		set_inode_flag(inode, FI_PROJ_INHERIT);
@@ -1671,26 +1738,137 @@
 	return 0;
 }
 
+/* FS_IOC_GETFLAGS and FS_IOC_SETFLAGS support */
+
+/*
+ * To make a new on-disk f2fs i_flag gettable via FS_IOC_GETFLAGS, add an entry
+ * for it to f2fs_fsflags_map[], and add its FS_*_FL equivalent to
+ * F2FS_GETTABLE_FS_FL.  To also make it settable via FS_IOC_SETFLAGS, also add
+ * its FS_*_FL equivalent to F2FS_SETTABLE_FS_FL.
+ */
+
+static const struct {
+	u32 iflag;
+	u32 fsflag;
+} f2fs_fsflags_map[] = {
+	{ F2FS_SYNC_FL,		FS_SYNC_FL },
+	{ F2FS_IMMUTABLE_FL,	FS_IMMUTABLE_FL },
+	{ F2FS_APPEND_FL,	FS_APPEND_FL },
+	{ F2FS_NODUMP_FL,	FS_NODUMP_FL },
+	{ F2FS_NOATIME_FL,	FS_NOATIME_FL },
+	{ F2FS_INDEX_FL,	FS_INDEX_FL },
+	{ F2FS_DIRSYNC_FL,	FS_DIRSYNC_FL },
+	{ F2FS_PROJINHERIT_FL,	FS_PROJINHERIT_FL },
+	{ F2FS_CASEFOLD_FL,	FS_CASEFOLD_FL },
+};
+
+#define F2FS_GETTABLE_FS_FL (		\
+		FS_SYNC_FL |		\
+		FS_IMMUTABLE_FL |	\
+		FS_APPEND_FL |		\
+		FS_NODUMP_FL |		\
+		FS_NOATIME_FL |		\
+		FS_INDEX_FL |		\
+		FS_DIRSYNC_FL |		\
+		FS_PROJINHERIT_FL |	\
+		FS_ENCRYPT_FL |		\
+		FS_INLINE_DATA_FL |	\
+		FS_NOCOW_FL |		\
+		FS_VERITY_FL |		\
+		FS_CASEFOLD_FL)
+
+#define F2FS_SETTABLE_FS_FL (		\
+		FS_SYNC_FL |		\
+		FS_IMMUTABLE_FL |	\
+		FS_APPEND_FL |		\
+		FS_NODUMP_FL |		\
+		FS_NOATIME_FL |		\
+		FS_DIRSYNC_FL |		\
+		FS_PROJINHERIT_FL |	\
+		FS_CASEFOLD_FL)
+
+/* Convert f2fs on-disk i_flags to FS_IOC_{GET,SET}FLAGS flags */
+static inline u32 f2fs_iflags_to_fsflags(u32 iflags)
+{
+	u32 fsflags = 0;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(f2fs_fsflags_map); i++)
+		if (iflags & f2fs_fsflags_map[i].iflag)
+			fsflags |= f2fs_fsflags_map[i].fsflag;
+
+	return fsflags;
+}
+
+/* Convert FS_IOC_{GET,SET}FLAGS flags to f2fs on-disk i_flags */
+static inline u32 f2fs_fsflags_to_iflags(u32 fsflags)
+{
+	u32 iflags = 0;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(f2fs_fsflags_map); i++)
+		if (fsflags & f2fs_fsflags_map[i].fsflag)
+			iflags |= f2fs_fsflags_map[i].iflag;
+
+	return iflags;
+}
+
+static int f2fs_ioc_getflags(struct file *filp, unsigned long arg)
+{
+	struct inode *inode = file_inode(filp);
+	struct f2fs_inode_info *fi = F2FS_I(inode);
+	u32 fsflags = f2fs_iflags_to_fsflags(fi->i_flags);
+
+	if (IS_ENCRYPTED(inode))
+		fsflags |= FS_ENCRYPT_FL;
+	if (IS_VERITY(inode))
+		fsflags |= FS_VERITY_FL;
+	if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode))
+		fsflags |= FS_INLINE_DATA_FL;
+	if (is_inode_flag_set(inode, FI_PIN_FILE))
+		fsflags |= FS_NOCOW_FL;
+
+	fsflags &= F2FS_GETTABLE_FS_FL;
+
+	return put_user(fsflags, (int __user *)arg);
+}
+
 static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
 {
 	struct inode *inode = file_inode(filp);
-	unsigned int flags;
+	struct f2fs_inode_info *fi = F2FS_I(inode);
+	u32 fsflags, old_fsflags;
+	u32 iflags;
 	int ret;
 
 	if (!inode_owner_or_capable(inode))
 		return -EACCES;
 
-	if (get_user(flags, (int __user *)arg))
+	if (get_user(fsflags, (int __user *)arg))
 		return -EFAULT;
 
+	if (fsflags & ~F2FS_GETTABLE_FS_FL)
+		return -EOPNOTSUPP;
+	fsflags &= F2FS_SETTABLE_FS_FL;
+
+	iflags = f2fs_fsflags_to_iflags(fsflags);
+	if (f2fs_mask_flags(inode->i_mode, iflags) != iflags)
+		return -EOPNOTSUPP;
+
 	ret = mnt_want_write_file(filp);
 	if (ret)
 		return ret;
 
 	inode_lock(inode);
 
-	ret = __f2fs_ioc_setflags(inode, flags);
+	old_fsflags = f2fs_iflags_to_fsflags(fi->i_flags);
+	ret = vfs_ioc_setflags_prepare(inode, old_fsflags, fsflags);
+	if (ret)
+		goto out;
 
+	ret = f2fs_setflags_common(inode, iflags,
+			f2fs_fsflags_to_iflags(F2FS_SETTABLE_FS_FL));
+out:
 	inode_unlock(inode);
 	mnt_drop_write_file(filp);
 	return ret;
@@ -1706,6 +1884,8 @@
 static int f2fs_ioc_start_atomic_write(struct file *filp)
 {
 	struct inode *inode = file_inode(filp);
+	struct f2fs_inode_info *fi = F2FS_I(inode);
+	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 	int ret;
 
 	if (!inode_owner_or_capable(inode))
@@ -1714,6 +1894,9 @@
 	if (!S_ISREG(inode->i_mode))
 		return -EINVAL;
 
+	if (filp->f_flags & O_DIRECT)
+		return -EINVAL;
+
 	ret = mnt_want_write_file(filp);
 	if (ret)
 		return ret;
@@ -1737,15 +1920,21 @@
 	 * f2fs_is_atomic_file.
 	 */
 	if (get_dirty_pages(inode))
-		f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING,
-		"Unexpected flush for atomic writes: ino=%lu, npages=%u",
-					inode->i_ino, get_dirty_pages(inode));
+		f2fs_warn(F2FS_I_SB(inode), "Unexpected flush for atomic writes: ino=%lu, npages=%u",
+			  inode->i_ino, get_dirty_pages(inode));
 	ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
 	if (ret) {
 		up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
 		goto out;
 	}
 
+	spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
+	if (list_empty(&fi->inmem_ilist))
+		list_add_tail(&fi->inmem_ilist, &sbi->inode_list[ATOMIC_FILE]);
+	sbi->atomic_files++;
+	spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
+
+	/* add inode in inmem_list first and set atomic_file */
 	set_inode_flag(inode, FI_ATOMIC_FILE);
 	clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
 	up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
@@ -1787,11 +1976,8 @@
 			goto err_out;
 
 		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
-		if (!ret) {
-			clear_inode_flag(inode, FI_ATOMIC_FILE);
-			F2FS_I(inode)->i_gc_failures[GC_FAILURE_ATOMIC] = 0;
-			stat_dec_atomic_write(inode);
-		}
+		if (!ret)
+			f2fs_drop_inmem_pages(inode);
 	} else {
 		ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 1, false);
 	}
@@ -1950,6 +2136,13 @@
 		f2fs_stop_checkpoint(sbi, false);
 		set_sbi_flag(sbi, SBI_IS_SHUTDOWN);
 		break;
+	case F2FS_GOING_DOWN_NEED_FSCK:
+		set_sbi_flag(sbi, SBI_NEED_FSCK);
+		set_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
+		set_sbi_flag(sbi, SBI_IS_DIRTY);
+		/* do checkpoint only */
+		ret = f2fs_sync_fs(sb, 1);
+		goto out;
 	default:
 		ret = -EINVAL;
 		goto out;
@@ -1965,6 +2158,9 @@
 out:
 	if (in != F2FS_GOING_DOWN_FULLSYNC)
 		mnt_drop_write_file(filp);
+
+	trace_f2fs_shutdown(sbi, in, ret);
+
 	return ret;
 }
 
@@ -2018,7 +2214,7 @@
 {
 	struct inode *inode = file_inode(filp);
 
-	if (!f2fs_sb_has_encrypt(inode->i_sb))
+	if (!f2fs_sb_has_encrypt(F2FS_I_SB(inode)))
 		return -EOPNOTSUPP;
 
 	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
@@ -2028,7 +2224,7 @@
 
 static int f2fs_ioc_get_encryption_policy(struct file *filp, unsigned long arg)
 {
-	if (!f2fs_sb_has_encrypt(file_inode(filp)->i_sb))
+	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
 		return -EOPNOTSUPP;
 	return fscrypt_ioctl_get_policy(filp, (void __user *)arg);
 }
@@ -2039,7 +2235,7 @@
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 	int err;
 
-	if (!f2fs_sb_has_encrypt(inode->i_sb))
+	if (!f2fs_sb_has_encrypt(sbi))
 		return -EOPNOTSUPP;
 
 	err = mnt_want_write_file(filp);
@@ -2070,6 +2266,49 @@
 	return err;
 }
 
+static int f2fs_ioc_get_encryption_policy_ex(struct file *filp,
+					     unsigned long arg)
+{
+	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
+		return -EOPNOTSUPP;
+
+	return fscrypt_ioctl_get_policy_ex(filp, (void __user *)arg);
+}
+
+static int f2fs_ioc_add_encryption_key(struct file *filp, unsigned long arg)
+{
+	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
+		return -EOPNOTSUPP;
+
+	return fscrypt_ioctl_add_key(filp, (void __user *)arg);
+}
+
+static int f2fs_ioc_remove_encryption_key(struct file *filp, unsigned long arg)
+{
+	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
+		return -EOPNOTSUPP;
+
+	return fscrypt_ioctl_remove_key(filp, (void __user *)arg);
+}
+
+static int f2fs_ioc_remove_encryption_key_all_users(struct file *filp,
+						    unsigned long arg)
+{
+	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
+		return -EOPNOTSUPP;
+
+	return fscrypt_ioctl_remove_key_all_users(filp, (void __user *)arg);
+}
+
+static int f2fs_ioc_get_encryption_key_status(struct file *filp,
+					      unsigned long arg)
+{
+	if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))
+		return -EOPNOTSUPP;
+
+	return fscrypt_ioctl_get_key_status(filp, (void __user *)arg);
+}
+
 static int f2fs_ioc_gc(struct file *filp, unsigned long arg)
 {
 	struct inode *inode = file_inode(filp);
@@ -2124,9 +2363,9 @@
 		return -EROFS;
 
 	end = range.start + range.len;
-	if (range.start < MAIN_BLKADDR(sbi) || end >= MAX_BLKADDR(sbi)) {
+	if (end < range.start || range.start < MAIN_BLKADDR(sbi) ||
+					end >= MAX_BLKADDR(sbi))
 		return -EINVAL;
-	}
 
 	ret = mnt_want_write_file(filp);
 	if (ret)
@@ -2163,6 +2402,11 @@
 	if (f2fs_readonly(sbi->sb))
 		return -EROFS;
 
+	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
+		f2fs_info(sbi, "Skipping Checkpoint. Checkpoints currently disabled.");
+		return -EINVAL;
+	}
+
 	ret = mnt_want_write_file(filp);
 	if (ret)
 		return ret;
@@ -2179,7 +2423,8 @@
 {
 	struct inode *inode = file_inode(filp);
 	struct f2fs_map_blocks map = { .m_next_extent = NULL,
-					.m_seg_type = NO_CHECK_TYPE };
+					.m_seg_type = NO_CHECK_TYPE ,
+					.m_may_create = false };
 	struct extent_info ei = {0, 0, 0};
 	pgoff_t pg_start, pg_end, next_pgofs;
 	unsigned int blk_per_seg = sbi->blocks_per_seg;
@@ -2244,10 +2489,12 @@
 		map.m_lblk += map.m_len;
 	}
 
-	if (!fragmented)
+	if (!fragmented) {
+		total = 0;
 		goto out;
+	}
 
-	sec_num = (total + BLKS_PER_SEC(sbi) - 1) / BLKS_PER_SEC(sbi);
+	sec_num = DIV_ROUND_UP(total, BLKS_PER_SEC(sbi));
 
 	/*
 	 * make sure there are enough free section for LFS allocation, this can
@@ -2275,7 +2522,7 @@
 
 		if (!(map.m_flags & F2FS_MAP_FLAGS)) {
 			map.m_lblk = next_pgofs;
-			continue;
+			goto check;
 		}
 
 		set_inode_flag(inode, FI_DO_DEFRAG);
@@ -2299,8 +2546,8 @@
 		}
 
 		map.m_lblk = idx;
-
-		if (idx < pg_end && cnt < blk_per_seg)
+check:
+		if (map.m_lblk < pg_end && cnt < blk_per_seg)
 			goto do_map;
 
 		clear_inode_flag(inode, FI_DO_DEFRAG);
@@ -2384,7 +2631,7 @@
 	if (!S_ISREG(src->i_mode) || !S_ISREG(dst->i_mode))
 		return -EINVAL;
 
-	if (f2fs_encrypted_inode(src) || f2fs_encrypted_inode(dst))
+	if (IS_ENCRYPTED(src) || IS_ENCRYPTED(dst))
 		return -EOPNOTSUPP;
 
 	if (src == dst) {
@@ -2534,16 +2781,17 @@
 	if (f2fs_readonly(sbi->sb))
 		return -EROFS;
 
+	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
+		return -EINVAL;
+
 	if (copy_from_user(&range, (struct f2fs_flush_device __user *)arg,
 							sizeof(range)))
 		return -EFAULT;
 
 	if (!f2fs_is_multi_device(sbi) || sbi->s_ndevs - 1 <= range.dev_num ||
-			sbi->segs_per_sec != 1) {
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"Can't flush %u in %d for segs_per_sec %u != 1\n",
-				range.dev_num, sbi->s_ndevs,
-				sbi->segs_per_sec);
+			__is_large_section(sbi)) {
+		f2fs_warn(sbi, "Can't flush %u in %d for segs_per_sec %u != 1",
+			  range.dev_num, sbi->s_ndevs, sbi->segs_per_sec);
 		return -EINVAL;
 	}
 
@@ -2592,18 +2840,33 @@
 }
 
 #ifdef CONFIG_QUOTA
+int f2fs_transfer_project_quota(struct inode *inode, kprojid_t kprojid)
+{
+	struct dquot *transfer_to[MAXQUOTAS] = {};
+	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+	struct super_block *sb = sbi->sb;
+	int err = 0;
+
+	transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid));
+	if (!IS_ERR(transfer_to[PRJQUOTA])) {
+		err = __dquot_transfer(inode, transfer_to);
+		if (err)
+			set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
+		dqput(transfer_to[PRJQUOTA]);
+	}
+	return err;
+}
+
 static int f2fs_ioc_setproject(struct file *filp, __u32 projid)
 {
 	struct inode *inode = file_inode(filp);
 	struct f2fs_inode_info *fi = F2FS_I(inode);
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
-	struct super_block *sb = sbi->sb;
-	struct dquot *transfer_to[MAXQUOTAS] = {};
 	struct page *ipage;
 	kprojid_t kprojid;
 	int err;
 
-	if (!f2fs_sb_has_project_quota(sb)) {
+	if (!f2fs_sb_has_project_quota(sbi)) {
 		if (projid != F2FS_DEF_PROJID)
 			return -EOPNOTSUPP;
 		else
@@ -2639,21 +2902,24 @@
 	if (err)
 		return err;
 
-	transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid));
-	if (!IS_ERR(transfer_to[PRJQUOTA])) {
-		err = __dquot_transfer(inode, transfer_to);
-		dqput(transfer_to[PRJQUOTA]);
-		if (err)
-			goto out_dirty;
-	}
+	f2fs_lock_op(sbi);
+	err = f2fs_transfer_project_quota(inode, kprojid);
+	if (err)
+		goto out_unlock;
 
 	F2FS_I(inode)->i_projid = kprojid;
 	inode->i_ctime = current_time(inode);
-out_dirty:
 	f2fs_mark_inode_dirty_sync(inode, true);
+out_unlock:
+	f2fs_unlock_op(sbi);
 	return err;
 }
 #else
+int f2fs_transfer_project_quota(struct inode *inode, kprojid_t kprojid)
+{
+	return 0;
+}
+
 static int f2fs_ioc_setproject(struct file *filp, __u32 projid)
 {
 	if (projid != F2FS_DEF_PROJID)
@@ -2662,64 +2928,76 @@
 }
 #endif
 
-/* Transfer internal flags to xflags */
-static inline __u32 f2fs_iflags_to_xflags(unsigned long iflags)
-{
-	__u32 xflags = 0;
+/* FS_IOC_FSGETXATTR and FS_IOC_FSSETXATTR support */
 
-	if (iflags & F2FS_SYNC_FL)
-		xflags |= FS_XFLAG_SYNC;
-	if (iflags & F2FS_IMMUTABLE_FL)
-		xflags |= FS_XFLAG_IMMUTABLE;
-	if (iflags & F2FS_APPEND_FL)
-		xflags |= FS_XFLAG_APPEND;
-	if (iflags & F2FS_NODUMP_FL)
-		xflags |= FS_XFLAG_NODUMP;
-	if (iflags & F2FS_NOATIME_FL)
-		xflags |= FS_XFLAG_NOATIME;
-	if (iflags & F2FS_PROJINHERIT_FL)
-		xflags |= FS_XFLAG_PROJINHERIT;
+/*
+ * To make a new on-disk f2fs i_flag gettable via FS_IOC_FSGETXATTR and settable
+ * via FS_IOC_FSSETXATTR, add an entry for it to f2fs_xflags_map[], and add its
+ * FS_XFLAG_* equivalent to F2FS_SUPPORTED_XFLAGS.
+ */
+
+static const struct {
+	u32 iflag;
+	u32 xflag;
+} f2fs_xflags_map[] = {
+	{ F2FS_SYNC_FL,		FS_XFLAG_SYNC },
+	{ F2FS_IMMUTABLE_FL,	FS_XFLAG_IMMUTABLE },
+	{ F2FS_APPEND_FL,	FS_XFLAG_APPEND },
+	{ F2FS_NODUMP_FL,	FS_XFLAG_NODUMP },
+	{ F2FS_NOATIME_FL,	FS_XFLAG_NOATIME },
+	{ F2FS_PROJINHERIT_FL,	FS_XFLAG_PROJINHERIT },
+};
+
+#define F2FS_SUPPORTED_XFLAGS (		\
+		FS_XFLAG_SYNC |		\
+		FS_XFLAG_IMMUTABLE |	\
+		FS_XFLAG_APPEND |	\
+		FS_XFLAG_NODUMP |	\
+		FS_XFLAG_NOATIME |	\
+		FS_XFLAG_PROJINHERIT)
+
+/* Convert f2fs on-disk i_flags to FS_IOC_FS{GET,SET}XATTR flags */
+static inline u32 f2fs_iflags_to_xflags(u32 iflags)
+{
+	u32 xflags = 0;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(f2fs_xflags_map); i++)
+		if (iflags & f2fs_xflags_map[i].iflag)
+			xflags |= f2fs_xflags_map[i].xflag;
+
 	return xflags;
 }
 
-#define F2FS_SUPPORTED_FS_XFLAGS (FS_XFLAG_SYNC | FS_XFLAG_IMMUTABLE | \
-				  FS_XFLAG_APPEND | FS_XFLAG_NODUMP | \
-				  FS_XFLAG_NOATIME | FS_XFLAG_PROJINHERIT)
-
-/* Transfer xflags flags to internal */
-static inline unsigned long f2fs_xflags_to_iflags(__u32 xflags)
+/* Convert FS_IOC_FS{GET,SET}XATTR flags to f2fs on-disk i_flags */
+static inline u32 f2fs_xflags_to_iflags(u32 xflags)
 {
-	unsigned long iflags = 0;
+	u32 iflags = 0;
+	int i;
 
-	if (xflags & FS_XFLAG_SYNC)
-		iflags |= F2FS_SYNC_FL;
-	if (xflags & FS_XFLAG_IMMUTABLE)
-		iflags |= F2FS_IMMUTABLE_FL;
-	if (xflags & FS_XFLAG_APPEND)
-		iflags |= F2FS_APPEND_FL;
-	if (xflags & FS_XFLAG_NODUMP)
-		iflags |= F2FS_NODUMP_FL;
-	if (xflags & FS_XFLAG_NOATIME)
-		iflags |= F2FS_NOATIME_FL;
-	if (xflags & FS_XFLAG_PROJINHERIT)
-		iflags |= F2FS_PROJINHERIT_FL;
+	for (i = 0; i < ARRAY_SIZE(f2fs_xflags_map); i++)
+		if (xflags & f2fs_xflags_map[i].xflag)
+			iflags |= f2fs_xflags_map[i].iflag;
 
 	return iflags;
 }
 
+static void f2fs_fill_fsxattr(struct inode *inode, struct fsxattr *fa)
+{
+	struct f2fs_inode_info *fi = F2FS_I(inode);
+
+	simple_fill_fsxattr(fa, f2fs_iflags_to_xflags(fi->i_flags));
+
+	if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)))
+		fa->fsx_projid = from_kprojid(&init_user_ns, fi->i_projid);
+}
+
 static int f2fs_ioc_fsgetxattr(struct file *filp, unsigned long arg)
 {
 	struct inode *inode = file_inode(filp);
-	struct f2fs_inode_info *fi = F2FS_I(inode);
 	struct fsxattr fa;
 
-	memset(&fa, 0, sizeof(struct fsxattr));
-	fa.fsx_xflags = f2fs_iflags_to_xflags(fi->i_flags &
-				F2FS_FL_USER_VISIBLE);
-
-	if (f2fs_sb_has_project_quota(inode->i_sb))
-		fa.fsx_projid = (__u32)from_kprojid(&init_user_ns,
-							fi->i_projid);
+	f2fs_fill_fsxattr(inode, &fa);
 
 	if (copy_to_user((struct fsxattr __user *)arg, &fa, sizeof(fa)))
 		return -EFAULT;
@@ -2753,9 +3031,8 @@
 static int f2fs_ioc_fssetxattr(struct file *filp, unsigned long arg)
 {
 	struct inode *inode = file_inode(filp);
-	struct f2fs_inode_info *fi = F2FS_I(inode);
-	struct fsxattr fa;
-	unsigned int flags;
+	struct fsxattr fa, old_fa;
+	u32 iflags;
 	int err;
 
 	if (copy_from_user(&fa, (struct fsxattr __user *)arg, sizeof(fa)))
@@ -2765,11 +3042,11 @@
 	if (!inode_owner_or_capable(inode))
 		return -EACCES;
 
-	if (fa.fsx_xflags & ~F2FS_SUPPORTED_FS_XFLAGS)
+	if (fa.fsx_xflags & ~F2FS_SUPPORTED_XFLAGS)
 		return -EOPNOTSUPP;
 
-	flags = f2fs_xflags_to_iflags(fa.fsx_xflags);
-	if (f2fs_mask_flags(inode->i_mode, flags) != flags)
+	iflags = f2fs_xflags_to_iflags(fa.fsx_xflags);
+	if (f2fs_mask_flags(inode->i_mode, iflags) != iflags)
 		return -EOPNOTSUPP;
 
 	err = mnt_want_write_file(filp);
@@ -2777,12 +3054,14 @@
 		return err;
 
 	inode_lock(inode);
-	err = f2fs_ioctl_check_project(inode, &fa);
+
+	f2fs_fill_fsxattr(inode, &old_fa);
+	err = vfs_ioc_fssetxattr_check(inode, &old_fa, &fa);
 	if (err)
 		goto out;
-	flags = (fi->i_flags & ~F2FS_FL_XFLAG_VISIBLE) |
-				(flags & F2FS_FL_XFLAG_VISIBLE);
-	err = __f2fs_ioc_setflags(inode, flags);
+
+	err = f2fs_setflags_common(inode, iflags,
+			f2fs_xflags_to_iflags(F2FS_SUPPORTED_XFLAGS));
 	if (err)
 		goto out;
 
@@ -2804,10 +3083,9 @@
 				fi->i_gc_failures[GC_FAILURE_PIN] + 1);
 
 	if (fi->i_gc_failures[GC_FAILURE_PIN] > sbi->gc_pin_file_threshold) {
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"%s: Enable GC = ino %lx after %x GC trials\n",
-			__func__, inode->i_ino,
-			fi->i_gc_failures[GC_FAILURE_PIN]);
+		f2fs_warn(sbi, "%s: Enable GC = ino %lx after %x GC trials",
+			  __func__, inode->i_ino,
+			  fi->i_gc_failures[GC_FAILURE_PIN]);
 		clear_inode_flag(inode, FI_PIN_FILE);
 		return -EAGAIN;
 	}
@@ -2820,9 +3098,6 @@
 	__u32 pin;
 	int ret = 0;
 
-	if (!inode_owner_or_capable(inode))
-		return -EACCES;
-
 	if (get_user(pin, (__u32 __user *)arg))
 		return -EFAULT;
 
@@ -2892,6 +3167,7 @@
 	map.m_next_pgofs = NULL;
 	map.m_next_extent = &m_next_extent;
 	map.m_seg_type = NO_CHECK_TYPE;
+	map.m_may_create = false;
 	end = F2FS_I_SB(inode)->max_file_blocks;
 
 	while (map.m_lblk < end) {
@@ -2914,10 +3190,119 @@
 	return f2fs_precache_extents(file_inode(filp));
 }
 
+static int f2fs_ioc_resize_fs(struct file *filp, unsigned long arg)
+{
+	struct f2fs_sb_info *sbi = F2FS_I_SB(file_inode(filp));
+	__u64 block_count;
+	int ret;
+
+	if (!capable(CAP_SYS_ADMIN))
+		return -EPERM;
+
+	if (f2fs_readonly(sbi->sb))
+		return -EROFS;
+
+	if (copy_from_user(&block_count, (void __user *)arg,
+			   sizeof(block_count)))
+		return -EFAULT;
+
+	ret = f2fs_resize_fs(sbi, block_count);
+
+	return ret;
+}
+
+static int f2fs_ioc_enable_verity(struct file *filp, unsigned long arg)
+{
+	struct inode *inode = file_inode(filp);
+
+	f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
+
+	if (!f2fs_sb_has_verity(F2FS_I_SB(inode))) {
+		f2fs_warn(F2FS_I_SB(inode),
+			  "Can't enable fs-verity on inode %lu: the verity feature is not enabled on this filesystem.\n",
+			  inode->i_ino);
+		return -EOPNOTSUPP;
+	}
+
+	return fsverity_ioctl_enable(filp, (const void __user *)arg);
+}
+
+static int f2fs_ioc_measure_verity(struct file *filp, unsigned long arg)
+{
+	if (!f2fs_sb_has_verity(F2FS_I_SB(file_inode(filp))))
+		return -EOPNOTSUPP;
+
+	return fsverity_ioctl_measure(filp, (void __user *)arg);
+}
+
+static int f2fs_get_volume_name(struct file *filp, unsigned long arg)
+{
+	struct inode *inode = file_inode(filp);
+	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+	char *vbuf;
+	int count;
+	int err = 0;
+
+	vbuf = f2fs_kzalloc(sbi, MAX_VOLUME_NAME, GFP_KERNEL);
+	if (!vbuf)
+		return -ENOMEM;
+
+	down_read(&sbi->sb_lock);
+	count = utf16s_to_utf8s(sbi->raw_super->volume_name,
+			ARRAY_SIZE(sbi->raw_super->volume_name),
+			UTF16_LITTLE_ENDIAN, vbuf, MAX_VOLUME_NAME);
+	up_read(&sbi->sb_lock);
+
+	if (copy_to_user((char __user *)arg, vbuf,
+				min(FSLABEL_MAX, count)))
+		err = -EFAULT;
+
+	kvfree(vbuf);
+	return err;
+}
+
+static int f2fs_set_volume_name(struct file *filp, unsigned long arg)
+{
+	struct inode *inode = file_inode(filp);
+	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+	char *vbuf;
+	int err = 0;
+
+	if (!capable(CAP_SYS_ADMIN))
+		return -EPERM;
+
+	vbuf = strndup_user((const char __user *)arg, FSLABEL_MAX);
+	if (IS_ERR(vbuf))
+		return PTR_ERR(vbuf);
+
+	err = mnt_want_write_file(filp);
+	if (err)
+		goto out;
+
+	down_write(&sbi->sb_lock);
+
+	memset(sbi->raw_super->volume_name, 0,
+			sizeof(sbi->raw_super->volume_name));
+	utf8s_to_utf16s(vbuf, strlen(vbuf), UTF16_LITTLE_ENDIAN,
+			sbi->raw_super->volume_name,
+			ARRAY_SIZE(sbi->raw_super->volume_name));
+
+	err = f2fs_commit_super(sbi, false);
+
+	up_write(&sbi->sb_lock);
+
+	mnt_drop_write_file(filp);
+out:
+	kfree(vbuf);
+	return err;
+}
+
 long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
 	if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp)))))
 		return -EIO;
+	if (!f2fs_is_checkpoint_ready(F2FS_I_SB(file_inode(filp))))
+		return -ENOSPC;
 
 	switch (cmd) {
 	case F2FS_IOC_GETFLAGS:
@@ -2946,6 +3331,16 @@
 		return f2fs_ioc_get_encryption_policy(filp, arg);
 	case F2FS_IOC_GET_ENCRYPTION_PWSALT:
 		return f2fs_ioc_get_encryption_pwsalt(filp, arg);
+	case FS_IOC_GET_ENCRYPTION_POLICY_EX:
+		return f2fs_ioc_get_encryption_policy_ex(filp, arg);
+	case FS_IOC_ADD_ENCRYPTION_KEY:
+		return f2fs_ioc_add_encryption_key(filp, arg);
+	case FS_IOC_REMOVE_ENCRYPTION_KEY:
+		return f2fs_ioc_remove_encryption_key(filp, arg);
+	case FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS:
+		return f2fs_ioc_remove_encryption_key_all_users(filp, arg);
+	case FS_IOC_GET_ENCRYPTION_KEY_STATUS:
+		return f2fs_ioc_get_encryption_key_status(filp, arg);
 	case F2FS_IOC_GARBAGE_COLLECT:
 		return f2fs_ioc_gc(filp, arg);
 	case F2FS_IOC_GARBAGE_COLLECT_RANGE:
@@ -2970,6 +3365,16 @@
 		return f2fs_ioc_set_pin_file(filp, arg);
 	case F2FS_IOC_PRECACHE_EXTENTS:
 		return f2fs_ioc_precache_extents(filp, arg);
+	case F2FS_IOC_RESIZE_FS:
+		return f2fs_ioc_resize_fs(filp, arg);
+	case FS_IOC_ENABLE_VERITY:
+		return f2fs_ioc_enable_verity(filp, arg);
+	case FS_IOC_MEASURE_VERITY:
+		return f2fs_ioc_measure_verity(filp, arg);
+	case F2FS_IOC_GET_VOLUME_NAME:
+		return f2fs_get_volume_name(filp, arg);
+	case F2FS_IOC_SET_VOLUME_NAME:
+		return f2fs_set_volume_name(filp, arg);
 	default:
 		return -ENOTTY;
 	}
@@ -2981,15 +3386,17 @@
 	struct inode *inode = file_inode(file);
 	ssize_t ret;
 
-	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
-		return -EIO;
+	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) {
+		ret = -EIO;
+		goto out;
+	}
 
-	if ((iocb->ki_flags & IOCB_NOWAIT) && !(iocb->ki_flags & IOCB_DIRECT))
-		return -EINVAL;
-
-	if (!inode_trylock(inode)) {
-		if (iocb->ki_flags & IOCB_NOWAIT)
-			return -EAGAIN;
+	if (iocb->ki_flags & IOCB_NOWAIT) {
+		if (!inode_trylock(inode)) {
+			ret = -EAGAIN;
+			goto out;
+		}
+	} else {
 		inode_lock(inode);
 	}
 
@@ -3002,18 +3409,16 @@
 		if (iov_iter_fault_in_readable(from, iov_iter_count(from)))
 			set_inode_flag(inode, FI_NO_PREALLOC);
 
-		if ((iocb->ki_flags & IOCB_NOWAIT) &&
-			(iocb->ki_flags & IOCB_DIRECT)) {
-				if (!f2fs_overwrite_io(inode, iocb->ki_pos,
+		if ((iocb->ki_flags & IOCB_NOWAIT)) {
+			if (!f2fs_overwrite_io(inode, iocb->ki_pos,
 						iov_iter_count(from)) ||
-					f2fs_has_inline_data(inode) ||
-					f2fs_force_buffered_io(inode, WRITE)) {
-						clear_inode_flag(inode,
-								FI_NO_PREALLOC);
-						inode_unlock(inode);
-						return -EAGAIN;
-				}
-
+				f2fs_has_inline_data(inode) ||
+				f2fs_force_buffered_io(inode, iocb, from)) {
+				clear_inode_flag(inode, FI_NO_PREALLOC);
+				inode_unlock(inode);
+				ret = -EAGAIN;
+				goto out;
+			}
 		} else {
 			preallocated = true;
 			target_size = iocb->ki_pos + iov_iter_count(from);
@@ -3022,7 +3427,8 @@
 			if (err) {
 				clear_inode_flag(inode, FI_NO_PREALLOC);
 				inode_unlock(inode);
-				return err;
+				ret = err;
+				goto out;
 			}
 		}
 		ret = __generic_file_write_iter(iocb, from);
@@ -3036,7 +3442,9 @@
 			f2fs_update_iostat(F2FS_I_SB(inode), APP_WRITE_IO, ret);
 	}
 	inode_unlock(inode);
-
+out:
+	trace_f2fs_file_write_iter(inode, iocb->ki_pos,
+					iov_iter_count(from), ret);
 	if (ret > 0)
 		ret = generic_write_sync(iocb, ret);
 	return ret;
@@ -3064,6 +3472,11 @@
 	case F2FS_IOC_SET_ENCRYPTION_POLICY:
 	case F2FS_IOC_GET_ENCRYPTION_PWSALT:
 	case F2FS_IOC_GET_ENCRYPTION_POLICY:
+	case FS_IOC_GET_ENCRYPTION_POLICY_EX:
+	case FS_IOC_ADD_ENCRYPTION_KEY:
+	case FS_IOC_REMOVE_ENCRYPTION_KEY:
+	case FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS:
+	case FS_IOC_GET_ENCRYPTION_KEY_STATUS:
 	case F2FS_IOC_GARBAGE_COLLECT:
 	case F2FS_IOC_GARBAGE_COLLECT_RANGE:
 	case F2FS_IOC_WRITE_CHECKPOINT:
@@ -3076,6 +3489,11 @@
 	case F2FS_IOC_GET_PIN_FILE:
 	case F2FS_IOC_SET_PIN_FILE:
 	case F2FS_IOC_PRECACHE_EXTENTS:
+	case F2FS_IOC_RESIZE_FS:
+	case FS_IOC_ENABLE_VERITY:
+	case FS_IOC_MEASURE_VERITY:
+	case F2FS_IOC_GET_VOLUME_NAME:
+	case F2FS_IOC_SET_VOLUME_NAME:
 		break;
 	default:
 		return -ENOIOCTLCMD;
diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index 700c39e..b3d3996 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/gc.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/module.h>
@@ -43,23 +40,28 @@
 		if (gc_th->gc_wake)
 			gc_th->gc_wake = 0;
 
-		if (try_to_freeze())
+		if (try_to_freeze()) {
+			stat_other_skip_bggc_count(sbi);
 			continue;
+		}
 		if (kthread_should_stop())
 			break;
 
 		if (sbi->sb->s_writers.frozen >= SB_FREEZE_WRITE) {
 			increase_sleep_time(gc_th, &wait_ms);
+			stat_other_skip_bggc_count(sbi);
 			continue;
 		}
 
 		if (time_to_inject(sbi, FAULT_CHECKPOINT)) {
-			f2fs_show_injection_info(FAULT_CHECKPOINT);
+			f2fs_show_injection_info(sbi, FAULT_CHECKPOINT);
 			f2fs_stop_checkpoint(sbi, false);
 		}
 
-		if (!sb_start_write_trylock(sbi->sb))
+		if (!sb_start_write_trylock(sbi->sb)) {
+			stat_other_skip_bggc_count(sbi);
 			continue;
+		}
 
 		/*
 		 * [GC triggering condition]
@@ -80,12 +82,15 @@
 			goto do_gc;
 		}
 
-		if (!mutex_trylock(&sbi->gc_mutex))
+		if (!mutex_trylock(&sbi->gc_mutex)) {
+			stat_other_skip_bggc_count(sbi);
 			goto next;
+		}
 
-		if (!is_idle(sbi)) {
+		if (!is_idle(sbi, GC_TIME)) {
 			increase_sleep_time(gc_th, &wait_ms);
 			mutex_unlock(&sbi->gc_mutex);
+			stat_io_skip_bggc_count(sbi);
 			goto next;
 		}
 
@@ -137,7 +142,7 @@
 			"f2fs_gc-%u:%u", MAJOR(dev), MINOR(dev));
 	if (IS_ERR(gc_th->f2fs_gc_task)) {
 		err = PTR_ERR(gc_th->f2fs_gc_task);
-		kfree(gc_th);
+		kvfree(gc_th);
 		sbi->gc_thread = NULL;
 	}
 out:
@@ -150,7 +155,7 @@
 	if (!gc_th)
 		return;
 	kthread_stop(gc_th->f2fs_gc_task);
-	kfree(gc_th);
+	kvfree(gc_th);
 	sbi->gc_thread = NULL;
 }
 
@@ -306,10 +311,11 @@
 	struct sit_info *sm = SIT_I(sbi);
 	struct victim_sel_policy p;
 	unsigned int secno, last_victim;
-	unsigned int last_segment = MAIN_SEGS(sbi);
+	unsigned int last_segment;
 	unsigned int nsearched = 0;
 
 	mutex_lock(&dirty_i->seglist_lock);
+	last_segment = MAIN_SECS(sbi) * sbi->segs_per_sec;
 
 	p.alloc_mode = alloc_mode;
 	select_policy(sbi, gc_type, type, &p);
@@ -327,6 +333,22 @@
 	if (p.max_search == 0)
 		goto out;
 
+	if (__is_large_section(sbi) && p.alloc_mode == LFS) {
+		if (sbi->next_victim_seg[BG_GC] != NULL_SEGNO) {
+			p.min_segno = sbi->next_victim_seg[BG_GC];
+			*result = p.min_segno;
+			sbi->next_victim_seg[BG_GC] = NULL_SEGNO;
+			goto got_result;
+		}
+		if (gc_type == FG_GC &&
+				sbi->next_victim_seg[FG_GC] != NULL_SEGNO) {
+			p.min_segno = sbi->next_victim_seg[FG_GC];
+			*result = p.min_segno;
+			sbi->next_victim_seg[FG_GC] = NULL_SEGNO;
+			goto got_result;
+		}
+	}
+
 	last_victim = sm->last_victim[p.gc_mode];
 	if (p.alloc_mode == LFS && gc_type == FG_GC) {
 		p.min_segno = check_bg_victims(sbi);
@@ -360,10 +382,25 @@
 			nsearched++;
 		}
 
+#ifdef CONFIG_F2FS_CHECK_FS
+		/*
+		 * skip selecting the invalid segno (that is failed due to block
+		 * validity check failure during GC) to avoid endless GC loop in
+		 * such cases.
+		 */
+		if (test_bit(segno, sm->invalid_segmap))
+			goto next;
+#endif
+
 		secno = GET_SEC_FROM_SEG(sbi, segno);
 
 		if (sec_usage_check(sbi, secno))
 			goto next;
+		/* Don't touch checkpointed data */
+		if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
+					get_ckpt_valid_blocks(sbi, segno) &&
+					p.alloc_mode != SSR))
+			goto next;
 		if (gc_type == BG_GC && test_bit(secno, dirty_i->victim_secmap))
 			goto next;
 
@@ -379,12 +416,15 @@
 				sm->last_victim[p.gc_mode] = last_victim + 1;
 			else
 				sm->last_victim[p.gc_mode] = segno + 1;
-			sm->last_victim[p.gc_mode] %= MAIN_SEGS(sbi);
+			sm->last_victim[p.gc_mode] %=
+				(MAIN_SECS(sbi) * sbi->segs_per_sec);
 			break;
 		}
 	}
 	if (p.min_segno != NULL_SEGNO) {
 got_it:
+		*result = (p.min_segno / p.ofs_unit) * p.ofs_unit;
+got_result:
 		if (p.alloc_mode == LFS) {
 			secno = GET_SEC_FROM_SEG(sbi, p.min_segno);
 			if (gc_type == FG_GC)
@@ -392,13 +432,13 @@
 			else
 				set_bit(secno, dirty_i->victim_secmap);
 		}
-		*result = (p.min_segno / p.ofs_unit) * p.ofs_unit;
 
+	}
+out:
+	if (p.min_segno != NULL_SEGNO)
 		trace_f2fs_get_victim(sbi->sb, type, gc_type, &p,
 				sbi->cur_victim_sec,
 				prefree_segments(sbi), free_segments(sbi));
-	}
-out:
 	mutex_unlock(&dirty_i->seglist_lock);
 
 	return (p.min_segno == NULL_SEGNO) ? 0 : 1;
@@ -463,7 +503,7 @@
  * On validity, copy that node with cold status, otherwise (invalid node)
  * ignore that.
  */
-static void gc_node_segment(struct f2fs_sb_info *sbi,
+static int gc_node_segment(struct f2fs_sb_info *sbi,
 		struct f2fs_summary *sum, unsigned int segno, int gc_type)
 {
 	struct f2fs_summary *entry;
@@ -471,6 +511,7 @@
 	int off;
 	int phase = 0;
 	bool fggc = (gc_type == FG_GC);
+	int submitted = 0;
 
 	start_addr = START_BLOCK(sbi, segno);
 
@@ -484,10 +525,11 @@
 		nid_t nid = le32_to_cpu(entry->nid);
 		struct page *node_page;
 		struct node_info ni;
+		int err;
 
 		/* stop BG_GC if there is not enough free sections. */
 		if (gc_type == BG_GC && has_not_enough_free_secs(sbi, 0, 0))
-			return;
+			return submitted;
 
 		if (check_valid_map(sbi, segno, off) == 0)
 			continue;
@@ -524,7 +566,9 @@
 			continue;
 		}
 
-		f2fs_move_node_page(node_page, gc_type);
+		err = f2fs_move_node_page(node_page, gc_type);
+		if (!err && gc_type == FG_GC)
+			submitted++;
 		stat_inc_node_blk_count(sbi, 1, gc_type);
 	}
 
@@ -533,6 +577,7 @@
 
 	if (fggc)
 		atomic_dec(&sbi->wb_sync_req[NODE]);
+	return submitted;
 }
 
 /*
@@ -559,7 +604,7 @@
 		int dec = (node_ofs - indirect_blks - 3) / (NIDS_PER_BLOCK + 1);
 		bidx = node_ofs - 5 - dec;
 	}
-	return bidx * ADDRS_PER_BLOCK + ADDRS_PER_INODE(inode);
+	return bidx * ADDRS_PER_BLOCK(inode) + ADDRS_PER_INODE(inode);
 }
 
 static bool is_alive(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
@@ -583,9 +628,8 @@
 	}
 
 	if (sum->version != dni->version) {
-		f2fs_msg(sbi->sb, KERN_WARNING,
-				"%s: valid data with mismatched node version.",
-				__func__);
+		f2fs_warn(sbi, "%s: valid data with mismatched node version.",
+			  __func__);
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
 	}
 
@@ -593,8 +637,21 @@
 	source_blkaddr = datablock_addr(NULL, node_page, ofs_in_node);
 	f2fs_put_page(node_page, 1);
 
-	if (source_blkaddr != blkaddr)
+	if (source_blkaddr != blkaddr) {
+#ifdef CONFIG_F2FS_CHECK_FS
+		unsigned int segno = GET_SEGNO(sbi, blkaddr);
+		unsigned long offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr);
+
+		if (unlikely(check_valid_map(sbi, segno, offset))) {
+			if (!test_and_set_bit(segno, SIT_I(sbi)->invalid_segmap)) {
+				f2fs_err(sbi, "mismatched blkaddr %u (source_blkaddr %u) in seg %u\n",
+						blkaddr, source_blkaddr, segno);
+				f2fs_bug_on(sbi, 1);
+			}
+		}
+#endif
 		return false;
+	}
 	return true;
 }
 
@@ -624,6 +681,11 @@
 
 	if (f2fs_lookup_extent_cache(inode, index, &ei)) {
 		dn.data_blkaddr = ei.blk + index - ei.fofs;
+		if (unlikely(!f2fs_is_valid_blkaddr(sbi, dn.data_blkaddr,
+						DATA_GENERIC_ENHANCE_READ))) {
+			err = -EFSCORRUPTED;
+			goto put_page;
+		}
 		goto got_it;
 	}
 
@@ -633,8 +695,12 @@
 		goto put_page;
 	f2fs_put_dnode(&dn);
 
+	if (!__is_valid_data_blkaddr(dn.data_blkaddr)) {
+		err = -ENOENT;
+		goto put_page;
+	}
 	if (unlikely(!f2fs_is_valid_blkaddr(sbi, dn.data_blkaddr,
-						DATA_GENERIC))) {
+						DATA_GENERIC_ENHANCE))) {
 		err = -EFSCORRUPTED;
 		goto put_page;
 	}
@@ -643,6 +709,14 @@
 	fio.page = page;
 	fio.new_blkaddr = fio.old_blkaddr = dn.data_blkaddr;
 
+	/*
+	 * don't cache encrypted data into meta inode until previous dirty
+	 * data were writebacked to avoid racing between GC and flush.
+	 */
+	f2fs_wait_on_page_writeback(page, DATA, true, true);
+
+	f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
+
 	fio.encrypted_page = f2fs_pagecache_get_page(META_MAPPING(sbi),
 					dn.data_blkaddr,
 					FGP_LOCK | FGP_CREAT, GFP_NOFS);
@@ -668,7 +742,7 @@
  * Move data block via META_MAPPING while keeping locked data page.
  * This can be used to move blocks, aka LBAs, directly on disk.
  */
-static void move_data_block(struct inode *inode, block_t bidx,
+static int move_data_block(struct inode *inode, block_t bidx,
 				int gc_type, unsigned int segno, int off)
 {
 	struct f2fs_io_info fio = {
@@ -687,25 +761,29 @@
 	struct node_info ni;
 	struct page *page, *mpage;
 	block_t newaddr;
-	int err;
+	int err = 0;
 	bool lfs_mode = test_opt(fio.sbi, LFS);
 
 	/* do not read out */
 	page = f2fs_grab_cache_page(inode->i_mapping, bidx, false);
 	if (!page)
-		return;
+		return -ENOMEM;
 
-	if (!check_valid_map(F2FS_I_SB(inode), segno, off))
+	if (!check_valid_map(F2FS_I_SB(inode), segno, off)) {
+		err = -ENOENT;
 		goto out;
+	}
 
 	if (f2fs_is_atomic_file(inode)) {
 		F2FS_I(inode)->i_gc_failures[GC_FAILURE_ATOMIC]++;
 		F2FS_I_SB(inode)->skipped_atomic_files[gc_type]++;
+		err = -EAGAIN;
 		goto out;
 	}
 
 	if (f2fs_is_pinned_file(inode)) {
 		f2fs_pin_file_control(inode, true);
+		err = -EAGAIN;
 		goto out;
 	}
 
@@ -716,6 +794,7 @@
 
 	if (unlikely(dn.data_blkaddr == NULL_ADDR)) {
 		ClearPageUptodate(page);
+		err = -ENOENT;
 		goto put_out;
 	}
 
@@ -723,7 +802,9 @@
 	 * don't cache encrypted data into meta inode until previous dirty
 	 * data were writebacked to avoid racing between GC and flush.
 	 */
-	f2fs_wait_on_page_writeback(page, DATA, true);
+	f2fs_wait_on_page_writeback(page, DATA, true, true);
+
+	f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
 
 	err = f2fs_get_node_info(fio.sbi, dn.nid, &ni);
 	if (err)
@@ -738,6 +819,29 @@
 	if (lfs_mode)
 		down_write(&fio.sbi->io_order_lock);
 
+	mpage = f2fs_grab_cache_page(META_MAPPING(fio.sbi),
+					fio.old_blkaddr, false);
+	if (!mpage)
+		goto up_out;
+
+	fio.encrypted_page = mpage;
+
+	/* read source block in mpage */
+	if (!PageUptodate(mpage)) {
+		err = f2fs_submit_page_bio(&fio);
+		if (err) {
+			f2fs_put_page(mpage, 1);
+			goto up_out;
+		}
+		lock_page(mpage);
+		if (unlikely(mpage->mapping != META_MAPPING(fio.sbi) ||
+						!PageUptodate(mpage))) {
+			err = -EIO;
+			f2fs_put_page(mpage, 1);
+			goto up_out;
+		}
+	}
+
 	f2fs_allocate_data_block(fio.sbi, NULL, fio.old_blkaddr, &newaddr,
 					&sum, CURSEG_COLD_DATA, NULL, false);
 
@@ -745,45 +849,19 @@
 				newaddr, FGP_LOCK | FGP_CREAT, GFP_NOFS);
 	if (!fio.encrypted_page) {
 		err = -ENOMEM;
+		f2fs_put_page(mpage, 1);
 		goto recover_block;
 	}
 
-	mpage = f2fs_pagecache_get_page(META_MAPPING(fio.sbi),
-					fio.old_blkaddr, FGP_LOCK, GFP_NOFS);
-	if (mpage) {
-		bool updated = false;
+	/* write target block */
+	f2fs_wait_on_page_writeback(fio.encrypted_page, DATA, true, true);
+	memcpy(page_address(fio.encrypted_page),
+				page_address(mpage), PAGE_SIZE);
+	f2fs_put_page(mpage, 1);
+	invalidate_mapping_pages(META_MAPPING(fio.sbi),
+				fio.old_blkaddr, fio.old_blkaddr);
 
-		if (PageUptodate(mpage)) {
-			memcpy(page_address(fio.encrypted_page),
-					page_address(mpage), PAGE_SIZE);
-			updated = true;
-		}
-		f2fs_put_page(mpage, 1);
-		invalidate_mapping_pages(META_MAPPING(fio.sbi),
-					fio.old_blkaddr, fio.old_blkaddr);
-		if (updated)
-			goto write_page;
-	}
-
-	err = f2fs_submit_page_bio(&fio);
-	if (err)
-		goto put_page_out;
-
-	/* write page */
-	lock_page(fio.encrypted_page);
-
-	if (unlikely(fio.encrypted_page->mapping != META_MAPPING(fio.sbi))) {
-		err = -EIO;
-		goto put_page_out;
-	}
-	if (unlikely(!PageUptodate(fio.encrypted_page))) {
-		err = -EIO;
-		goto put_page_out;
-	}
-
-write_page:
 	set_page_dirty(fio.encrypted_page);
-	f2fs_wait_on_page_writeback(fio.encrypted_page, DATA, true);
 	if (clear_page_dirty_for_io(fio.encrypted_page))
 		dec_page_count(fio.sbi, F2FS_DIRTY_META);
 
@@ -791,13 +869,14 @@
 	ClearPageError(page);
 
 	/* allocate block address */
-	f2fs_wait_on_page_writeback(dn.node_page, NODE, true);
+	f2fs_wait_on_page_writeback(dn.node_page, NODE, true, true);
 
 	fio.op = REQ_OP_WRITE;
 	fio.op_flags = REQ_SYNC;
 	fio.new_blkaddr = newaddr;
 	f2fs_submit_page_write(&fio);
 	if (fio.retry) {
+		err = -EAGAIN;
 		if (PageWriteback(fio.encrypted_page))
 			end_page_writeback(fio.encrypted_page);
 		goto put_page_out;
@@ -812,43 +891,52 @@
 put_page_out:
 	f2fs_put_page(fio.encrypted_page, 1);
 recover_block:
-	if (lfs_mode)
-		up_write(&fio.sbi->io_order_lock);
 	if (err)
 		f2fs_do_replace_block(fio.sbi, &sum, newaddr, fio.old_blkaddr,
 								true, true);
+up_out:
+	if (lfs_mode)
+		up_write(&fio.sbi->io_order_lock);
 put_out:
 	f2fs_put_dnode(&dn);
 out:
 	f2fs_put_page(page, 1);
+	return err;
 }
 
-static void move_data_page(struct inode *inode, block_t bidx, int gc_type,
+static int move_data_page(struct inode *inode, block_t bidx, int gc_type,
 							unsigned int segno, int off)
 {
 	struct page *page;
+	int err = 0;
 
 	page = f2fs_get_lock_data_page(inode, bidx, true);
 	if (IS_ERR(page))
-		return;
+		return PTR_ERR(page);
 
-	if (!check_valid_map(F2FS_I_SB(inode), segno, off))
+	if (!check_valid_map(F2FS_I_SB(inode), segno, off)) {
+		err = -ENOENT;
 		goto out;
+	}
 
 	if (f2fs_is_atomic_file(inode)) {
 		F2FS_I(inode)->i_gc_failures[GC_FAILURE_ATOMIC]++;
 		F2FS_I_SB(inode)->skipped_atomic_files[gc_type]++;
+		err = -EAGAIN;
 		goto out;
 	}
 	if (f2fs_is_pinned_file(inode)) {
 		if (gc_type == FG_GC)
 			f2fs_pin_file_control(inode, true);
+		err = -EAGAIN;
 		goto out;
 	}
 
 	if (gc_type == BG_GC) {
-		if (PageWriteback(page))
+		if (PageWriteback(page)) {
+			err = -EAGAIN;
 			goto out;
+		}
 		set_page_dirty(page);
 		set_cold_data(page);
 	} else {
@@ -866,11 +954,11 @@
 			.io_type = FS_GC_DATA_IO,
 		};
 		bool is_dirty = PageDirty(page);
-		int err;
 
 retry:
+		f2fs_wait_on_page_writeback(page, DATA, true, true);
+
 		set_page_dirty(page);
-		f2fs_wait_on_page_writeback(page, DATA, true);
 		if (clear_page_dirty_for_io(page)) {
 			inode_dec_dirty_pages(inode);
 			f2fs_remove_dirty_inode(inode);
@@ -891,6 +979,7 @@
 	}
 out:
 	f2fs_put_page(page, 1);
+	return err;
 }
 
 /*
@@ -900,7 +989,7 @@
  * If the parent node is not valid or the data block address is different,
  * the victim data block is ignored.
  */
-static void gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
+static int gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
 		struct gc_inode_list *gc_list, unsigned int segno, int gc_type)
 {
 	struct super_block *sb = sbi->sb;
@@ -908,6 +997,7 @@
 	block_t start_addr;
 	int off;
 	int phase = 0;
+	int submitted = 0;
 
 	start_addr = START_BLOCK(sbi, segno);
 
@@ -922,9 +1012,15 @@
 		block_t start_bidx;
 		nid_t nid = le32_to_cpu(entry->nid);
 
-		/* stop BG_GC if there is not enough free sections. */
-		if (gc_type == BG_GC && has_not_enough_free_secs(sbi, 0, 0))
-			return;
+		/*
+		 * stop BG_GC if there is not enough free sections.
+		 * Or, stop GC if the segment becomes fully valid caused by
+		 * race condition along with SSR block allocation.
+		 */
+		if ((gc_type == BG_GC && has_not_enough_free_secs(sbi, 0, 0)) ||
+				get_valid_blocks(sbi, segno, false) ==
+							sbi->blocks_per_seg)
+			return submitted;
 
 		if (check_valid_map(sbi, segno, off) == 0)
 			continue;
@@ -996,6 +1092,7 @@
 		if (inode) {
 			struct f2fs_inode_info *fi = F2FS_I(inode);
 			bool locked = false;
+			int err;
 
 			if (S_ISREG(inode->i_mode)) {
 				if (!down_write_trylock(&fi->i_gc_rwsem[READ]))
@@ -1015,12 +1112,16 @@
 			start_bidx = f2fs_start_bidx_of_node(nofs, inode)
 								+ ofs_in_node;
 			if (f2fs_post_read_required(inode))
-				move_data_block(inode, start_bidx, gc_type,
-								segno, off);
+				err = move_data_block(inode, start_bidx,
+							gc_type, segno, off);
 			else
-				move_data_page(inode, start_bidx, gc_type,
+				err = move_data_page(inode, start_bidx, gc_type,
 								segno, off);
 
+			if (!err && (gc_type == FG_GC ||
+					f2fs_post_read_required(inode)))
+				submitted++;
+
 			if (locked) {
 				up_write(&fi->i_gc_rwsem[WRITE]);
 				up_write(&fi->i_gc_rwsem[READ]);
@@ -1032,6 +1133,8 @@
 
 	if (++phase < 5)
 		goto next_step;
+
+	return submitted;
 }
 
 static int __get_victim(struct f2fs_sb_info *sbi, unsigned int *victim,
@@ -1056,18 +1159,34 @@
 	struct blk_plug plug;
 	unsigned int segno = start_segno;
 	unsigned int end_segno = start_segno + sbi->segs_per_sec;
-	int seg_freed = 0;
+	int seg_freed = 0, migrated = 0;
 	unsigned char type = IS_DATASEG(get_seg_entry(sbi, segno)->type) ?
 						SUM_TYPE_DATA : SUM_TYPE_NODE;
+	int submitted = 0;
+
+	if (__is_large_section(sbi))
+		end_segno = rounddown(end_segno, sbi->segs_per_sec);
 
 	/* readahead multi ssa blocks those have contiguous address */
-	if (sbi->segs_per_sec > 1)
+	if (__is_large_section(sbi))
 		f2fs_ra_meta_pages(sbi, GET_SUM_BLOCK(sbi, segno),
-					sbi->segs_per_sec, META_SSA, true);
+					end_segno - segno, META_SSA, true);
 
 	/* reference all summary page */
 	while (segno < end_segno) {
 		sum_page = f2fs_get_sum_page(sbi, segno++);
+		if (IS_ERR(sum_page)) {
+			int err = PTR_ERR(sum_page);
+
+			end_segno = segno - 1;
+			for (segno = start_segno; segno < end_segno; segno++) {
+				sum_page = find_get_page(META_MAPPING(sbi),
+						GET_SUM_BLOCK(sbi, segno));
+				f2fs_put_page(sum_page, 0);
+				f2fs_put_page(sum_page, 0);
+			}
+			return err;
+		}
 		unlock_page(sum_page);
 	}
 
@@ -1082,16 +1201,19 @@
 
 		if (get_valid_blocks(sbi, segno, false) == 0)
 			goto freed;
+		if (__is_large_section(sbi) &&
+				migrated >= sbi->migration_granularity)
+			goto skip;
 		if (!PageUptodate(sum_page) || unlikely(f2fs_cp_error(sbi)))
-			goto next;
+			goto skip;
 
 		sum = page_address(sum_page);
 		if (type != GET_SUM_TYPE((&sum->footer))) {
-			f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent segment (%u) "
-				"type [%d, %d] in SSA and SIT",
-				segno, type, GET_SUM_TYPE((&sum->footer)));
+			f2fs_err(sbi, "Inconsistent segment (%u) type [%d, %d] in SSA and SIT",
+				 segno, type, GET_SUM_TYPE((&sum->footer)));
 			set_sbi_flag(sbi, SBI_NEED_FSCK);
-			goto next;
+			f2fs_stop_checkpoint(sbi, false);
+			goto skip;
 		}
 
 		/*
@@ -1102,10 +1224,11 @@
 		 *                                  - lock_page(sum_page)
 		 */
 		if (type == SUM_TYPE_NODE)
-			gc_node_segment(sbi, sum->entries, segno, gc_type);
-		else
-			gc_data_segment(sbi, sum->entries, gc_list, segno,
+			submitted += gc_node_segment(sbi, sum->entries, segno,
 								gc_type);
+		else
+			submitted += gc_data_segment(sbi, sum->entries, gc_list,
+							segno, gc_type);
 
 		stat_inc_seg_count(sbi, type, gc_type);
 
@@ -1113,11 +1236,15 @@
 		if (gc_type == FG_GC &&
 				get_valid_blocks(sbi, segno, false) == 0)
 			seg_freed++;
-next:
+		migrated++;
+
+		if (__is_large_section(sbi) && segno + 1 < end_segno)
+			sbi->next_victim_seg[gc_type] = segno + 1;
+skip:
 		f2fs_put_page(sum_page, 0);
 	}
 
-	if (gc_type == FG_GC)
+	if (submitted)
 		f2fs_submit_merged_write(sbi,
 				(type == SUM_TYPE_NODE) ? NODE : DATA);
 
@@ -1172,7 +1299,8 @@
 		 * threshold, we can make them free by checkpoint. Then, we
 		 * secure free segments which doesn't need fggc any more.
 		 */
-		if (prefree_segments(sbi)) {
+		if (prefree_segments(sbi) &&
+				!is_sbi_flag_set(sbi, SBI_CP_DISABLED)) {
 			ret = f2fs_write_checkpoint(sbi, &cpc);
 			if (ret)
 				goto stop;
@@ -1204,7 +1332,7 @@
 		round++;
 	}
 
-	if (gc_type == FG_GC)
+	if (gc_type == FG_GC && seg_freed)
 		sbi->cur_victim_sec = NULL_SEGNO;
 
 	if (sync)
@@ -1224,7 +1352,7 @@
 			segno = NULL_SEGNO;
 			goto gc_more;
 		}
-		if (gc_type == FG_GC)
+		if (gc_type == FG_GC && !is_sbi_flag_set(sbi, SBI_CP_DISABLED))
 			ret = f2fs_write_checkpoint(sbi, &cpc);
 	}
 stop:
@@ -1256,7 +1384,210 @@
 	sbi->gc_pin_file_threshold = DEF_GC_FAILED_PINNED_FILES;
 
 	/* give warm/cold data area from slower device */
-	if (f2fs_is_multi_device(sbi) && sbi->segs_per_sec == 1)
+	if (f2fs_is_multi_device(sbi) && !__is_large_section(sbi))
 		SIT_I(sbi)->last_victim[ALLOC_NEXT] =
 				GET_SEGNO(sbi, FDEV(0).end_blk) + 1;
 }
+
+static int free_segment_range(struct f2fs_sb_info *sbi, unsigned int start,
+							unsigned int end)
+{
+	int type;
+	unsigned int segno, next_inuse;
+	int err = 0;
+
+	/* Move out cursegs from the target range */
+	for (type = CURSEG_HOT_DATA; type < NR_CURSEG_TYPE; type++)
+		allocate_segment_for_resize(sbi, type, start, end);
+
+	/* do GC to move out valid blocks in the range */
+	for (segno = start; segno <= end; segno += sbi->segs_per_sec) {
+		struct gc_inode_list gc_list = {
+			.ilist = LIST_HEAD_INIT(gc_list.ilist),
+			.iroot = RADIX_TREE_INIT(gc_list.iroot, GFP_NOFS),
+		};
+
+		mutex_lock(&sbi->gc_mutex);
+		do_garbage_collect(sbi, segno, &gc_list, FG_GC);
+		mutex_unlock(&sbi->gc_mutex);
+		put_gc_inode(&gc_list);
+
+		if (get_valid_blocks(sbi, segno, true))
+			return -EAGAIN;
+	}
+
+	err = f2fs_sync_fs(sbi->sb, 1);
+	if (err)
+		return err;
+
+	next_inuse = find_next_inuse(FREE_I(sbi), end + 1, start);
+	if (next_inuse <= end) {
+		f2fs_err(sbi, "segno %u should be free but still inuse!",
+			 next_inuse);
+		f2fs_bug_on(sbi, 1);
+	}
+	return err;
+}
+
+static void update_sb_metadata(struct f2fs_sb_info *sbi, int secs)
+{
+	struct f2fs_super_block *raw_sb = F2FS_RAW_SUPER(sbi);
+	int section_count = le32_to_cpu(raw_sb->section_count);
+	int segment_count = le32_to_cpu(raw_sb->segment_count);
+	int segment_count_main = le32_to_cpu(raw_sb->segment_count_main);
+	long long block_count = le64_to_cpu(raw_sb->block_count);
+	int segs = secs * sbi->segs_per_sec;
+
+	raw_sb->section_count = cpu_to_le32(section_count + secs);
+	raw_sb->segment_count = cpu_to_le32(segment_count + segs);
+	raw_sb->segment_count_main = cpu_to_le32(segment_count_main + segs);
+	raw_sb->block_count = cpu_to_le64(block_count +
+					(long long)segs * sbi->blocks_per_seg);
+	if (f2fs_is_multi_device(sbi)) {
+		int last_dev = sbi->s_ndevs - 1;
+		int dev_segs =
+			le32_to_cpu(raw_sb->devs[last_dev].total_segments);
+
+		raw_sb->devs[last_dev].total_segments =
+						cpu_to_le32(dev_segs + segs);
+	}
+}
+
+static void update_fs_metadata(struct f2fs_sb_info *sbi, int secs)
+{
+	int segs = secs * sbi->segs_per_sec;
+	long long blks = (long long)segs * sbi->blocks_per_seg;
+	long long user_block_count =
+				le64_to_cpu(F2FS_CKPT(sbi)->user_block_count);
+
+	SM_I(sbi)->segment_count = (int)SM_I(sbi)->segment_count + segs;
+	MAIN_SEGS(sbi) = (int)MAIN_SEGS(sbi) + segs;
+	FREE_I(sbi)->free_sections = (int)FREE_I(sbi)->free_sections + secs;
+	FREE_I(sbi)->free_segments = (int)FREE_I(sbi)->free_segments + segs;
+	F2FS_CKPT(sbi)->user_block_count = cpu_to_le64(user_block_count + blks);
+
+	if (f2fs_is_multi_device(sbi)) {
+		int last_dev = sbi->s_ndevs - 1;
+
+		FDEV(last_dev).total_segments =
+				(int)FDEV(last_dev).total_segments + segs;
+		FDEV(last_dev).end_blk =
+				(long long)FDEV(last_dev).end_blk + blks;
+#ifdef CONFIG_BLK_DEV_ZONED
+		FDEV(last_dev).nr_blkz = (int)FDEV(last_dev).nr_blkz +
+					(int)(blks >> sbi->log_blocks_per_blkz);
+#endif
+	}
+}
+
+int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)
+{
+	__u64 old_block_count, shrunk_blocks;
+	unsigned int secs;
+	int gc_mode, gc_type;
+	int err = 0;
+	__u32 rem;
+
+	old_block_count = le64_to_cpu(F2FS_RAW_SUPER(sbi)->block_count);
+	if (block_count > old_block_count)
+		return -EINVAL;
+
+	if (f2fs_is_multi_device(sbi)) {
+		int last_dev = sbi->s_ndevs - 1;
+		__u64 last_segs = FDEV(last_dev).total_segments;
+
+		if (block_count + last_segs * sbi->blocks_per_seg <=
+								old_block_count)
+			return -EINVAL;
+	}
+
+	/* new fs size should align to section size */
+	div_u64_rem(block_count, BLKS_PER_SEC(sbi), &rem);
+	if (rem)
+		return -EINVAL;
+
+	if (block_count == old_block_count)
+		return 0;
+
+	if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) {
+		f2fs_err(sbi, "Should run fsck to repair first.");
+		return -EFSCORRUPTED;
+	}
+
+	if (test_opt(sbi, DISABLE_CHECKPOINT)) {
+		f2fs_err(sbi, "Checkpoint should be enabled.");
+		return -EINVAL;
+	}
+
+	freeze_bdev(sbi->sb->s_bdev);
+
+	shrunk_blocks = old_block_count - block_count;
+	secs = div_u64(shrunk_blocks, BLKS_PER_SEC(sbi));
+	spin_lock(&sbi->stat_lock);
+	if (shrunk_blocks + valid_user_blocks(sbi) +
+		sbi->current_reserved_blocks + sbi->unusable_block_count +
+		F2FS_OPTION(sbi).root_reserved_blocks > sbi->user_block_count)
+		err = -ENOSPC;
+	else
+		sbi->user_block_count -= shrunk_blocks;
+	spin_unlock(&sbi->stat_lock);
+	if (err) {
+		thaw_bdev(sbi->sb->s_bdev, sbi->sb);
+		return err;
+	}
+
+	mutex_lock(&sbi->resize_mutex);
+	set_sbi_flag(sbi, SBI_IS_RESIZEFS);
+
+	mutex_lock(&DIRTY_I(sbi)->seglist_lock);
+
+	MAIN_SECS(sbi) -= secs;
+
+	for (gc_mode = 0; gc_mode < MAX_GC_POLICY; gc_mode++)
+		if (SIT_I(sbi)->last_victim[gc_mode] >=
+					MAIN_SECS(sbi) * sbi->segs_per_sec)
+			SIT_I(sbi)->last_victim[gc_mode] = 0;
+
+	for (gc_type = BG_GC; gc_type <= FG_GC; gc_type++)
+		if (sbi->next_victim_seg[gc_type] >=
+					MAIN_SECS(sbi) * sbi->segs_per_sec)
+			sbi->next_victim_seg[gc_type] = NULL_SEGNO;
+
+	mutex_unlock(&DIRTY_I(sbi)->seglist_lock);
+
+	err = free_segment_range(sbi, MAIN_SECS(sbi) * sbi->segs_per_sec,
+			MAIN_SEGS(sbi) - 1);
+	if (err)
+		goto out;
+
+	update_sb_metadata(sbi, -secs);
+
+	err = f2fs_commit_super(sbi, false);
+	if (err) {
+		update_sb_metadata(sbi, secs);
+		goto out;
+	}
+
+	update_fs_metadata(sbi, -secs);
+	clear_sbi_flag(sbi, SBI_IS_RESIZEFS);
+	err = f2fs_sync_fs(sbi->sb, 1);
+	if (err) {
+		update_fs_metadata(sbi, secs);
+		update_sb_metadata(sbi, secs);
+		f2fs_commit_super(sbi, false);
+	}
+out:
+	if (err) {
+		set_sbi_flag(sbi, SBI_NEED_FSCK);
+		f2fs_err(sbi, "resize_fs failed, should run fsck to repair!");
+
+		MAIN_SECS(sbi) += secs;
+		spin_lock(&sbi->stat_lock);
+		sbi->user_block_count += shrunk_blocks;
+		spin_unlock(&sbi->stat_lock);
+	}
+	clear_sbi_flag(sbi, SBI_IS_RESIZEFS);
+	mutex_unlock(&sbi->resize_mutex);
+	thaw_bdev(sbi->sb->s_bdev, sbi->sb);
+	return err;
+}
diff --git a/fs/f2fs/gc.h b/fs/f2fs/gc.h
index c8619e4..bbac9d3 100644
--- a/fs/f2fs/gc.h
+++ b/fs/f2fs/gc.h
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/gc.h
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #define GC_THREAD_MIN_WB_PAGES		1	/*
 						 * a threshold to determine
diff --git a/fs/f2fs/hash.c b/fs/f2fs/hash.c
index eb2e031..5bc4dcd 100644
--- a/fs/f2fs/hash.c
+++ b/fs/f2fs/hash.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/hash.c
  *
@@ -7,16 +8,13 @@
  * Portions of this code from linux/fs/ext3/hash.c
  *
  * Copyright (C) 2002 by Theodore Ts'o
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/types.h>
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
 #include <linux/cryptohash.h>
 #include <linux/pagemap.h>
+#include <linux/unicode.h>
 
 #include "f2fs.h"
 
@@ -70,7 +68,7 @@
 		*buf++ = pad;
 }
 
-f2fs_hash_t f2fs_dentry_hash(const struct qstr *name_info,
+static f2fs_hash_t __f2fs_dentry_hash(const struct qstr *name_info,
 				struct fscrypt_name *fname)
 {
 	__u32 hash;
@@ -106,3 +104,37 @@
 	f2fs_hash = cpu_to_le32(hash & ~F2FS_HASH_COL_BIT);
 	return f2fs_hash;
 }
+
+f2fs_hash_t f2fs_dentry_hash(const struct inode *dir,
+		const struct qstr *name_info, struct fscrypt_name *fname)
+{
+#ifdef CONFIG_UNICODE
+	struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
+	const struct unicode_map *um = sbi->s_encoding;
+	int r, dlen;
+	unsigned char *buff;
+	struct qstr folded;
+
+	if (!name_info->len || !IS_CASEFOLDED(dir))
+		goto opaque_seq;
+
+	buff = f2fs_kzalloc(sbi, sizeof(char) * PATH_MAX, GFP_KERNEL);
+	if (!buff)
+		return -ENOMEM;
+
+	dlen = utf8_casefold(um, name_info, buff, PATH_MAX);
+	if (dlen < 0) {
+		kvfree(buff);
+		goto opaque_seq;
+	}
+	folded.name = buff;
+	folded.len = dlen;
+	r = __f2fs_dentry_hash(&folded, fname);
+
+	kvfree(buff);
+	return r;
+
+opaque_seq:
+#endif
+	return __f2fs_dentry_hash(name_info, fname);
+}
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
index 6bbb5f6..e98d53d 100644
--- a/fs/f2fs/inline.c
+++ b/fs/f2fs/inline.c
@@ -1,11 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/inline.c
  * Copyright (c) 2013, Intel Corporation
  * Authors: Huajun Li <huajun.li@intel.com>
  *          Haicheng Li <haicheng.li@intel.com>
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 
 #include <linux/fs.h>
@@ -13,6 +11,7 @@
 
 #include "f2fs.h"
 #include "node.h"
+#include <trace/events/android_fs.h>
 
 bool f2fs_may_inline_data(struct inode *inode)
 {
@@ -74,7 +73,7 @@
 
 	addr = inline_data_addr(inode, ipage);
 
-	f2fs_wait_on_page_writeback(ipage, NODE, true);
+	f2fs_wait_on_page_writeback(ipage, NODE, true, true);
 	memset(addr + from, 0, MAX_INLINE_DATA(inode) - from);
 	set_page_dirty(ipage);
 
@@ -86,14 +85,29 @@
 {
 	struct page *ipage;
 
+	if (trace_android_fs_dataread_start_enabled()) {
+		char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+		path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    inode);
+		trace_android_fs_dataread_start(inode, page_offset(page),
+						PAGE_SIZE, current->pid,
+						path, current->comm);
+	}
+
 	ipage = f2fs_get_node_page(F2FS_I_SB(inode), inode->i_ino);
 	if (IS_ERR(ipage)) {
+		trace_android_fs_dataread_end(inode, page_offset(page),
+					      PAGE_SIZE);
 		unlock_page(page);
 		return PTR_ERR(ipage);
 	}
 
 	if (!f2fs_has_inline_data(inode)) {
 		f2fs_put_page(ipage, 1);
+		trace_android_fs_dataread_end(inode, page_offset(page),
+					      PAGE_SIZE);
 		return -EAGAIN;
 	}
 
@@ -105,6 +119,8 @@
 	if (!PageUptodate(page))
 		SetPageUptodate(page);
 	f2fs_put_page(ipage, 1);
+	trace_android_fs_dataread_end(inode, page_offset(page),
+				      PAGE_SIZE);
 	unlock_page(page);
 	return 0;
 }
@@ -133,6 +149,7 @@
 
 	err = f2fs_get_node_info(fio.sbi, dn->nid, &ni);
 	if (err) {
+		f2fs_truncate_data_blocks_range(dn, 1);
 		f2fs_put_dnode(dn);
 		return err;
 	}
@@ -142,10 +159,8 @@
 	if (unlikely(dn->data_blkaddr != NEW_ADDR)) {
 		f2fs_put_dnode(dn);
 		set_sbi_flag(fio.sbi, SBI_NEED_FSCK);
-		f2fs_msg(fio.sbi->sb, KERN_WARNING,
-			"%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, "
-			"run fsck to fix.",
-			__func__, dn->inode->i_ino, dn->data_blkaddr);
+		f2fs_warn(fio.sbi, "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, run fsck to fix.",
+			  __func__, dn->inode->i_ino, dn->data_blkaddr);
 		return -EFSCORRUPTED;
 	}
 
@@ -163,7 +178,7 @@
 	fio.old_blkaddr = dn->data_blkaddr;
 	set_inode_flag(dn->inode, FI_HOT_DATA);
 	f2fs_outplace_write_data(dn, &fio);
-	f2fs_wait_on_page_writeback(page, DATA, true);
+	f2fs_wait_on_page_writeback(page, DATA, true, true);
 	if (dirty) {
 		inode_dec_dirty_pages(dn->inode);
 		f2fs_remove_dirty_inode(dn->inode);
@@ -238,7 +253,7 @@
 
 	f2fs_bug_on(F2FS_I_SB(inode), page->index);
 
-	f2fs_wait_on_page_writeback(dn.inode_page, NODE, true);
+	f2fs_wait_on_page_writeback(dn.inode_page, NODE, true, true);
 	src_addr = kmap_atomic(page);
 	dst_addr = inline_data_addr(inode, dn.inode_page);
 	memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
@@ -279,7 +294,7 @@
 		ipage = f2fs_get_node_page(sbi, inode->i_ino);
 		f2fs_bug_on(sbi, IS_ERR(ipage));
 
-		f2fs_wait_on_page_writeback(ipage, NODE, true);
+		f2fs_wait_on_page_writeback(ipage, NODE, true, true);
 
 		src_addr = inline_data_addr(inode, npage);
 		dst_addr = inline_data_addr(inode, ipage);
@@ -324,7 +339,7 @@
 		return NULL;
 	}
 
-	namehash = f2fs_dentry_hash(&name, fname);
+	namehash = f2fs_dentry_hash(dir, &name, fname);
 
 	inline_dentry = inline_data_addr(dir, ipage);
 
@@ -385,15 +400,13 @@
 	if (unlikely(dn.data_blkaddr != NEW_ADDR)) {
 		f2fs_put_dnode(&dn);
 		set_sbi_flag(F2FS_P_SB(page), SBI_NEED_FSCK);
-		f2fs_msg(F2FS_P_SB(page)->sb, KERN_WARNING,
-			"%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, "
-			"run fsck to fix.",
-			__func__, dir->i_ino, dn.data_blkaddr);
+		f2fs_warn(F2FS_P_SB(page), "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, run fsck to fix.",
+			  __func__, dir->i_ino, dn.data_blkaddr);
 		err = -EFSCORRUPTED;
 		goto out;
 	}
 
-	f2fs_wait_on_page_writeback(page, DATA, true);
+	f2fs_wait_on_page_writeback(page, DATA, true, true);
 
 	dentry_blk = page_address(page);
 
@@ -422,6 +435,14 @@
 	stat_dec_inline_dir(dir);
 	clear_inode_flag(dir, FI_INLINE_DENTRY);
 
+	/*
+	 * should retrieve reserved space which was used to keep
+	 * inline_dentry's structure for backward compatibility.
+	 */
+	if (!f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(dir)) &&
+			!f2fs_has_inline_xattr(dir))
+		F2FS_I(dir)->i_inline_xattr_size = 0;
+
 	f2fs_i_depth_write(dir, 1);
 	if (i_size_read(dir) < PAGE_SIZE)
 		f2fs_i_size_write(dir, PAGE_SIZE);
@@ -503,18 +524,27 @@
 
 	stat_dec_inline_dir(dir);
 	clear_inode_flag(dir, FI_INLINE_DENTRY);
-	kfree(backup_dentry);
+
+	/*
+	 * should retrieve reserved space which was used to keep
+	 * inline_dentry's structure for backward compatibility.
+	 */
+	if (!f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(dir)) &&
+			!f2fs_has_inline_xattr(dir))
+		F2FS_I(dir)->i_inline_xattr_size = 0;
+
+	kvfree(backup_dentry);
 	return 0;
 recover:
 	lock_page(ipage);
-	f2fs_wait_on_page_writeback(ipage, NODE, true);
+	f2fs_wait_on_page_writeback(ipage, NODE, true, true);
 	memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA(dir));
 	f2fs_i_depth_write(dir, 0);
 	f2fs_i_size_write(dir, MAX_INLINE_DATA(dir));
 	set_page_dirty(ipage);
 	f2fs_put_page(ipage, 1);
 
-	kfree(backup_dentry);
+	kvfree(backup_dentry);
 	return err;
 }
 
@@ -567,9 +597,9 @@
 		}
 	}
 
-	f2fs_wait_on_page_writeback(ipage, NODE, true);
+	f2fs_wait_on_page_writeback(ipage, NODE, true, true);
 
-	name_hash = f2fs_dentry_hash(new_name, NULL);
+	name_hash = f2fs_dentry_hash(dir, new_name, NULL);
 	f2fs_update_dentry(ino, mode, &d, new_name, name_hash, bit_pos);
 
 	set_page_dirty(ipage);
@@ -577,6 +607,11 @@
 	/* we don't need to mark_inode_dirty now */
 	if (inode) {
 		f2fs_i_pino_write(inode, dir->i_ino);
+
+		/* synchronize inode page's data from inode cache */
+		if (is_inode_flag_set(inode, FI_NEW_INODE))
+			f2fs_update_inode(inode, page);
+
 		f2fs_put_page(page, 1);
 	}
 
@@ -599,7 +634,7 @@
 	int i;
 
 	lock_page(page);
-	f2fs_wait_on_page_writeback(page, NODE, true);
+	f2fs_wait_on_page_writeback(page, NODE, true, true);
 
 	inline_dentry = inline_data_addr(dir, page);
 	make_dentry_ptr_inline(dir, &d, inline_dentry);
@@ -693,7 +728,13 @@
 	if (IS_ERR(ipage))
 		return PTR_ERR(ipage);
 
-	if (!f2fs_has_inline_data(inode)) {
+	if ((S_ISREG(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
+				!f2fs_has_inline_data(inode)) {
+		err = -EAGAIN;
+		goto out;
+	}
+
+	if (S_ISDIR(inode->i_mode) && !f2fs_has_inline_dentry(inode)) {
 		err = -EAGAIN;
 		goto out;
 	}
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index 540d457..502bd49 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/inode.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
@@ -17,6 +14,7 @@
 #include "f2fs.h"
 #include "node.h"
 #include "segment.h"
+#include "xattr.h"
 
 #include <trace/events/f2fs.h>
 
@@ -46,11 +44,15 @@
 		new_fl |= S_NOATIME;
 	if (flags & F2FS_DIRSYNC_FL)
 		new_fl |= S_DIRSYNC;
-	if (f2fs_encrypted_inode(inode))
+	if (file_is_encrypt(inode))
 		new_fl |= S_ENCRYPTED;
+	if (file_is_verity(inode))
+		new_fl |= S_VERITY;
+	if (flags & F2FS_CASEFOLD_FL)
+		new_fl |= S_CASEFOLD;
 	inode_set_flags(inode, new_fl,
 			S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC|
-			S_ENCRYPTED);
+			S_ENCRYPTED|S_VERITY|S_CASEFOLD);
 }
 
 static void __get_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
@@ -75,7 +77,7 @@
 
 	if (!__is_valid_data_blkaddr(addr))
 		return 1;
-	if (!f2fs_is_valid_blkaddr(sbi, addr, DATA_GENERIC))
+	if (!f2fs_is_valid_blkaddr(sbi, addr, DATA_GENERIC_ENHANCE))
 		return -EFSCORRUPTED;
 	return 0;
 }
@@ -106,7 +108,7 @@
 
 	while (start < end) {
 		if (*start++) {
-			f2fs_wait_on_page_writeback(ipage, NODE, true);
+			f2fs_wait_on_page_writeback(ipage, NODE, true, true);
 
 			set_inode_flag(inode, FI_DATA_EXIST);
 			set_raw_inline(inode, F2FS_INODE(ipage));
@@ -121,7 +123,7 @@
 {
 	struct f2fs_inode *ri = &F2FS_NODE(page)->i;
 
-	if (!f2fs_sb_has_inode_chksum(sbi->sb))
+	if (!f2fs_sb_has_inode_chksum(sbi))
 		return false;
 
 	if (!IS_INODE(page) || !(ri->i_inline & F2FS_EXTRA_ATTR))
@@ -178,9 +180,8 @@
 	calculated = f2fs_inode_chksum(sbi, page);
 
 	if (provided != calculated)
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"checksum invalid, nid = %lu, ino_of_node = %x, %x vs. %x",
-			page->index, ino_of_node(page), provided, calculated);
+		f2fs_warn(sbi, "checksum invalid, nid = %lu, ino_of_node = %x, %x vs. %x",
+			  page->index, ino_of_node(page), provided, calculated);
 
 	return provided == calculated;
 }
@@ -204,50 +205,53 @@
 	iblocks = le64_to_cpu(F2FS_INODE(node_page)->i_blocks);
 	if (!iblocks) {
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"%s: corrupted inode i_blocks i_ino=%lx iblocks=%llu, "
-			"run fsck to fix.",
-			__func__, inode->i_ino, iblocks);
+		f2fs_warn(sbi, "%s: corrupted inode i_blocks i_ino=%lx iblocks=%llu, run fsck to fix.",
+			  __func__, inode->i_ino, iblocks);
 		return false;
 	}
 
 	if (ino_of_node(node_page) != nid_of_node(node_page)) {
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"%s: corrupted inode footer i_ino=%lx, ino,nid: "
-			"[%u, %u] run fsck to fix.",
-			__func__, inode->i_ino,
-			ino_of_node(node_page), nid_of_node(node_page));
+		f2fs_warn(sbi, "%s: corrupted inode footer i_ino=%lx, ino,nid: [%u, %u] run fsck to fix.",
+			  __func__, inode->i_ino,
+			  ino_of_node(node_page), nid_of_node(node_page));
 		return false;
 	}
 
-	if (f2fs_sb_has_flexible_inline_xattr(sbi->sb)
+	if (f2fs_sb_has_flexible_inline_xattr(sbi)
 			&& !f2fs_has_extra_attr(inode)) {
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"%s: corrupted inode ino=%lx, run fsck to fix.",
-			__func__, inode->i_ino);
+		f2fs_warn(sbi, "%s: corrupted inode ino=%lx, run fsck to fix.",
+			  __func__, inode->i_ino);
 		return false;
 	}
 
 	if (f2fs_has_extra_attr(inode) &&
-			!f2fs_sb_has_extra_attr(sbi->sb)) {
+			!f2fs_sb_has_extra_attr(sbi)) {
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"%s: inode (ino=%lx) is with extra_attr, "
-			"but extra_attr feature is off",
-			__func__, inode->i_ino);
+		f2fs_warn(sbi, "%s: inode (ino=%lx) is with extra_attr, but extra_attr feature is off",
+			  __func__, inode->i_ino);
 		return false;
 	}
 
 	if (fi->i_extra_isize > F2FS_TOTAL_EXTRA_ATTR_SIZE ||
 			fi->i_extra_isize % sizeof(__le32)) {
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"%s: inode (ino=%lx) has corrupted i_extra_isize: %d, "
-			"max: %zu",
-			__func__, inode->i_ino, fi->i_extra_isize,
-			F2FS_TOTAL_EXTRA_ATTR_SIZE);
+		f2fs_warn(sbi, "%s: inode (ino=%lx) has corrupted i_extra_isize: %d, max: %zu",
+			  __func__, inode->i_ino, fi->i_extra_isize,
+			  F2FS_TOTAL_EXTRA_ATTR_SIZE);
+		return false;
+	}
+
+	if (f2fs_has_extra_attr(inode) &&
+		f2fs_sb_has_flexible_inline_xattr(sbi) &&
+		f2fs_has_inline_xattr(inode) &&
+		(!fi->i_inline_xattr_size ||
+		fi->i_inline_xattr_size > MAX_INLINE_XATTR_SIZE)) {
+		set_sbi_flag(sbi, SBI_NEED_FSCK);
+		f2fs_warn(sbi, "%s: inode (ino=%lx) has corrupted i_inline_xattr_size: %d, max: %zu",
+			  __func__, inode->i_ino, fi->i_inline_xattr_size,
+			  MAX_INLINE_XATTR_SIZE);
 		return false;
 	}
 
@@ -255,15 +259,14 @@
 		struct extent_info *ei = &F2FS_I(inode)->extent_tree->largest;
 
 		if (ei->len &&
-			(!f2fs_is_valid_blkaddr(sbi, ei->blk, DATA_GENERIC) ||
+			(!f2fs_is_valid_blkaddr(sbi, ei->blk,
+						DATA_GENERIC_ENHANCE) ||
 			!f2fs_is_valid_blkaddr(sbi, ei->blk + ei->len - 1,
-							DATA_GENERIC))) {
+						DATA_GENERIC_ENHANCE))) {
 			set_sbi_flag(sbi, SBI_NEED_FSCK);
-			f2fs_msg(sbi->sb, KERN_WARNING,
-				"%s: inode (ino=%lx) extent info [%u, %u, %u] "
-				"is incorrect, run fsck to fix",
-				__func__, inode->i_ino,
-				ei->blk, ei->fofs, ei->len);
+			f2fs_warn(sbi, "%s: inode (ino=%lx) extent info [%u, %u, %u] is incorrect, run fsck to fix",
+				  __func__, inode->i_ino,
+				  ei->blk, ei->fofs, ei->len);
 			return false;
 		}
 	}
@@ -271,19 +274,15 @@
 	if (f2fs_has_inline_data(inode) &&
 			(!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode))) {
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"%s: inode (ino=%lx, mode=%u) should not have "
-			"inline_data, run fsck to fix",
-			__func__, inode->i_ino, inode->i_mode);
+		f2fs_warn(sbi, "%s: inode (ino=%lx, mode=%u) should not have inline_data, run fsck to fix",
+			  __func__, inode->i_ino, inode->i_mode);
 		return false;
 	}
 
 	if (f2fs_has_inline_dentry(inode) && !S_ISDIR(inode->i_mode)) {
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"%s: inode (ino=%lx, mode=%u) should not have "
-			"inline_dentry, run fsck to fix",
-			__func__, inode->i_ino, inode->i_mode);
+		f2fs_warn(sbi, "%s: inode (ino=%lx, mode=%u) should not have inline_dentry, run fsck to fix",
+			  __func__, inode->i_ino, inode->i_mode);
 		return false;
 	}
 
@@ -330,6 +329,8 @@
 					le16_to_cpu(ri->i_gc_failures);
 	fi->i_xattr_nid = le32_to_cpu(ri->i_xattr_nid);
 	fi->i_flags = le32_to_cpu(ri->i_flags);
+	if (S_ISREG(inode->i_mode))
+		fi->i_flags &= ~F2FS_PROJINHERIT_FL;
 	fi->flags = 0;
 	fi->i_advise = ri->i_advise;
 	fi->i_pino = le32_to_cpu(ri->i_pino);
@@ -343,7 +344,7 @@
 	fi->i_extra_isize = f2fs_has_extra_attr(inode) ?
 					le16_to_cpu(ri->i_extra_isize) : 0;
 
-	if (f2fs_sb_has_flexible_inline_xattr(sbi->sb)) {
+	if (f2fs_sb_has_flexible_inline_xattr(sbi)) {
 		fi->i_inline_xattr_size = le16_to_cpu(ri->i_inline_xattr_size);
 	} else if (f2fs_has_inline_xattr(inode) ||
 				f2fs_has_inline_dentry(inode)) {
@@ -393,14 +394,14 @@
 	if (fi->i_flags & F2FS_PROJINHERIT_FL)
 		set_inode_flag(inode, FI_PROJ_INHERIT);
 
-	if (f2fs_has_extra_attr(inode) && f2fs_sb_has_project_quota(sbi->sb) &&
+	if (f2fs_has_extra_attr(inode) && f2fs_sb_has_project_quota(sbi) &&
 			F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_projid))
 		i_projid = (projid_t)le32_to_cpu(ri->i_projid);
 	else
 		i_projid = F2FS_DEF_PROJID;
 	fi->i_projid = make_kprojid(&init_user_ns, i_projid);
 
-	if (f2fs_has_extra_attr(inode) && f2fs_sb_has_inode_crtime(sbi->sb) &&
+	if (f2fs_has_extra_attr(inode) && f2fs_sb_has_inode_crtime(sbi) &&
 			F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_crtime)) {
 		fi->i_crtime.tv_sec = le64_to_cpu(ri->i_crtime);
 		fi->i_crtime.tv_nsec = le32_to_cpu(ri->i_crtime_nsec);
@@ -456,7 +457,7 @@
 		inode->i_mapping->a_ops = &f2fs_dblock_aops;
 		inode_nohighmem(inode);
 	} else if (S_ISLNK(inode->i_mode)) {
-		if (f2fs_encrypted_inode(inode))
+		if (file_is_encrypt(inode))
 			inode->i_op = &f2fs_encrypted_symlink_inode_operations;
 		else
 			inode->i_op = &f2fs_symlink_inode_operations;
@@ -501,7 +502,7 @@
 	struct f2fs_inode *ri;
 	struct extent_tree *et = F2FS_I(inode)->extent_tree;
 
-	f2fs_wait_on_page_writeback(node_page, NODE, true);
+	f2fs_wait_on_page_writeback(node_page, NODE, true, true);
 	set_page_dirty(node_page);
 
 	f2fs_inode_synced(inode);
@@ -546,11 +547,11 @@
 	if (f2fs_has_extra_attr(inode)) {
 		ri->i_extra_isize = cpu_to_le16(F2FS_I(inode)->i_extra_isize);
 
-		if (f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(inode)->sb))
+		if (f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(inode)))
 			ri->i_inline_xattr_size =
 				cpu_to_le16(F2FS_I(inode)->i_inline_xattr_size);
 
-		if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)->sb) &&
+		if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)) &&
 			F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
 								i_projid)) {
 			projid_t i_projid;
@@ -560,7 +561,7 @@
 			ri->i_projid = cpu_to_le32(i_projid);
 		}
 
-		if (f2fs_sb_has_inode_crtime(F2FS_I_SB(inode)->sb) &&
+		if (f2fs_sb_has_inode_crtime(F2FS_I_SB(inode)) &&
 			F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
 								i_crtime)) {
 			ri->i_crtime =
@@ -614,9 +615,16 @@
 			inode->i_ino == F2FS_META_INO(sbi))
 		return 0;
 
-	if (!is_inode_flag_set(inode, FI_DIRTY_INODE))
+	/*
+	 * atime could be updated without dirtying f2fs inode in lazytime mode
+	 */
+	if (f2fs_is_time_consistent(inode) &&
+		!is_inode_flag_set(inode, FI_DIRTY_INODE))
 		return 0;
 
+	if (!f2fs_is_checkpoint_ready(sbi))
+		return -ENOSPC;
+
 	/*
 	 * We need to balance fs here to prevent from producing dirty node pages
 	 * during the urgent cleaning time when runing out of free sections.
@@ -655,7 +663,11 @@
 	if (inode->i_nlink || is_bad_inode(inode))
 		goto no_delete;
 
-	dquot_initialize(inode);
+	err = dquot_initialize(inode);
+	if (err) {
+		err = 0;
+		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
+	}
 
 	f2fs_remove_ino_entry(sbi, inode->i_ino, APPEND_INO);
 	f2fs_remove_ino_entry(sbi, inode->i_ino, UPDATE_INO);
@@ -669,7 +681,7 @@
 		err = f2fs_truncate(inode);
 
 	if (time_to_inject(sbi, FAULT_EVICT_INODE)) {
-		f2fs_show_injection_info(FAULT_EVICT_INODE);
+		f2fs_show_injection_info(sbi, FAULT_EVICT_INODE);
 		err = -EIO;
 	}
 
@@ -687,9 +699,11 @@
 		goto retry;
 	}
 
-	if (err)
+	if (err) {
 		f2fs_update_inode_page(inode);
-	dquot_free_inode(inode);
+		if (dquot_initialize_needed(inode))
+			set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
+	}
 	sb_end_intwrite(inode->i_sb);
 no_delete:
 	dquot_drop(inode);
@@ -698,7 +712,8 @@
 	stat_dec_inline_dir(inode);
 	stat_dec_inline_inode(inode);
 
-	if (likely(!is_set_ckpt_flags(sbi, CP_ERROR_FLAG)))
+	if (likely(!f2fs_cp_error(sbi) &&
+				!is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
 		f2fs_bug_on(sbi, is_inode_flag_set(inode, FI_DIRTY_INODE));
 	else
 		f2fs_inode_synced(inode);
@@ -727,6 +742,7 @@
 	}
 out_clear:
 	fscrypt_put_encryption_info(inode);
+	fsverity_cleanup_inode(inode);
 	clear_inode(inode);
 }
 
@@ -761,8 +777,7 @@
 	err = f2fs_get_node_info(sbi, inode->i_ino, &ni);
 	if (err) {
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"May loss orphan inode, run fsck to fix.");
+		f2fs_warn(sbi, "May loss orphan inode, run fsck to fix.");
 		goto out;
 	}
 
@@ -770,8 +785,7 @@
 		err = f2fs_acquire_orphan_inode(sbi);
 		if (err) {
 			set_sbi_flag(sbi, SBI_NEED_FSCK);
-			f2fs_msg(sbi->sb, KERN_WARNING,
-				"Too many orphan inodes, run fsck to fix.");
+			f2fs_warn(sbi, "Too many orphan inodes, run fsck to fix.");
 		} else {
 			f2fs_add_orphan_inode(inode);
 		}
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index 6b23dcb..a1c507b 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -1,24 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/namei.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
 #include <linux/pagemap.h>
 #include <linux/sched.h>
 #include <linux/ctype.h>
+#include <linux/random.h>
 #include <linux/dcache.h>
 #include <linux/namei.h>
 #include <linux/quotaops.h>
 
 #include "f2fs.h"
 #include "node.h"
+#include "segment.h"
 #include "xattr.h"
 #include "acl.h"
 #include <trace/events/f2fs.h>
@@ -52,7 +51,7 @@
 	inode->i_blocks = 0;
 	inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
 	F2FS_I(inode)->i_crtime = inode->i_mtime;
-	inode->i_generation = sbi->s_next_generation++;
+	inode->i_generation = prandom_u32();
 
 	if (S_ISDIR(inode->i_mode))
 		F2FS_I(inode)->i_current_depth = 1;
@@ -63,7 +62,7 @@
 		goto fail;
 	}
 
-	if (f2fs_sb_has_project_quota(sbi->sb) &&
+	if (f2fs_sb_has_project_quota(sbi) &&
 		(F2FS_I(dir)->i_flags & F2FS_PROJINHERIT_FL))
 		F2FS_I(inode)->i_projid = F2FS_I(dir)->i_projid;
 	else
@@ -74,18 +73,14 @@
 	if (err)
 		goto fail_drop;
 
-	err = dquot_alloc_inode(inode);
-	if (err)
-		goto fail_drop;
-
 	set_inode_flag(inode, FI_NEW_INODE);
 
 	/* If the directory encrypted, then we should encrypt the inode. */
-	if ((f2fs_encrypted_inode(dir) || DUMMY_ENCRYPTION_ENABLED(sbi)) &&
+	if ((IS_ENCRYPTED(dir) || DUMMY_ENCRYPTION_ENABLED(sbi)) &&
 				f2fs_may_encrypt(inode))
 		f2fs_set_encrypted_inode(inode);
 
-	if (f2fs_sb_has_extra_attr(sbi->sb)) {
+	if (f2fs_sb_has_extra_attr(sbi)) {
 		set_inode_flag(inode, FI_EXTRA_ATTR);
 		F2FS_I(inode)->i_extra_isize = F2FS_TOTAL_EXTRA_ATTR_SIZE;
 	}
@@ -98,7 +93,7 @@
 	if (f2fs_may_inline_dentry(inode))
 		set_inode_flag(inode, FI_INLINE_DENTRY);
 
-	if (f2fs_sb_has_flexible_inline_xattr(sbi->sb)) {
+	if (f2fs_sb_has_flexible_inline_xattr(sbi)) {
 		f2fs_bug_on(sbi, !f2fs_has_extra_attr(inode));
 		if (f2fs_has_inline_xattr(inode))
 			xattr_size = F2FS_OPTION(sbi).inline_xattr_size;
@@ -148,7 +143,7 @@
 	return ERR_PTR(err);
 }
 
-static int is_extension_exist(const unsigned char *s, const char *sub)
+static inline int is_extension_exist(const unsigned char *s, const char *sub)
 {
 	size_t slen = strlen(s);
 	size_t sublen = strlen(sub);
@@ -186,16 +181,19 @@
 	hot_count = sbi->raw_super->hot_ext_count;
 
 	for (i = 0; i < cold_count + hot_count; i++) {
-		if (!is_extension_exist(name, extlist[i]))
-			continue;
-		if (i < cold_count)
-			file_set_cold(inode);
-		else
-			file_set_hot(inode);
-		break;
+		if (is_extension_exist(name, extlist[i]))
+			break;
 	}
 
 	up_read(&sbi->sb_lock);
+
+	if (i == cold_count + hot_count)
+		return;
+
+	if (i < cold_count)
+		file_set_cold(inode);
+	else
+		file_set_hot(inode);
 }
 
 int f2fs_update_extension_list(struct f2fs_sb_info *sbi, const char *name,
@@ -274,6 +272,8 @@
 
 	if (unlikely(f2fs_cp_error(sbi)))
 		return -EIO;
+	if (!f2fs_is_checkpoint_ready(sbi))
+		return -ENOSPC;
 
 	err = dquot_initialize(dir);
 	if (err)
@@ -320,6 +320,8 @@
 
 	if (unlikely(f2fs_cp_error(sbi)))
 		return -EIO;
+	if (!f2fs_is_checkpoint_ready(sbi))
+		return -ENOSPC;
 
 	err = fscrypt_prepare_link(old_dentry, dir, dentry);
 	if (err)
@@ -381,9 +383,8 @@
 	int err = 0;
 
 	if (f2fs_readonly(sbi->sb)) {
-		f2fs_msg(sbi->sb, KERN_INFO,
-			"skip recovering inline_dots inode (ino:%lu, pino:%u) "
-			"in readonly mountpoint", dir->i_ino, pino);
+		f2fs_info(sbi, "skip recovering inline_dots inode (ino:%lu, pino:%u) in readonly mountpoint",
+			  dir->i_ino, pino);
 		return 0;
 	}
 
@@ -432,19 +433,23 @@
 	nid_t ino = -1;
 	int err = 0;
 	unsigned int root_ino = F2FS_ROOT_INO(F2FS_I_SB(dir));
+	struct fscrypt_name fname;
 
 	trace_f2fs_lookup_start(dir, dentry, flags);
 
-	err = fscrypt_prepare_lookup(dir, dentry, flags);
-	if (err)
-		goto out;
-
 	if (dentry->d_name.len > F2FS_NAME_LEN) {
 		err = -ENAMETOOLONG;
 		goto out;
 	}
 
-	de = f2fs_find_entry(dir, &dentry->d_name, &page);
+	err = fscrypt_prepare_lookup(dir, dentry, &fname);
+	if (err == -ENOENT)
+		goto out_splice;
+	if (err)
+		goto out;
+	de = __f2fs_find_entry(dir, &fname, &page);
+	fscrypt_free_filename(&fname);
+
 	if (!de) {
 		if (IS_ERR(page)) {
 			err = PTR_ERR(page);
@@ -473,19 +478,28 @@
 		if (err)
 			goto out_iput;
 	}
-	if (f2fs_encrypted_inode(dir) &&
+	if (IS_ENCRYPTED(dir) &&
 	    (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
 	    !fscrypt_has_permitted_context(dir, inode)) {
-		f2fs_msg(inode->i_sb, KERN_WARNING,
-			 "Inconsistent encryption contexts: %lu/%lu",
-			 dir->i_ino, inode->i_ino);
+		f2fs_warn(F2FS_I_SB(inode), "Inconsistent encryption contexts: %lu/%lu",
+			  dir->i_ino, inode->i_ino);
 		err = -EPERM;
 		goto out_iput;
 	}
 out_splice:
+#ifdef CONFIG_UNICODE
+	if (!inode && IS_CASEFOLDED(dir)) {
+		/* Eventually we want to call d_add_ci(dentry, NULL)
+		 * for negative dentries in the encoding case as
+		 * well.  For now, prevent the negative dentry
+		 * from being cached.
+		 */
+		trace_f2fs_lookup_end(dir, dentry, ino, err);
+		return NULL;
+	}
+#endif
 	new = d_splice_alias(inode, dentry);
-	if (IS_ERR(new))
-		err = PTR_ERR(new);
+	err = PTR_ERR_OR_ZERO(new);
 	trace_f2fs_lookup_end(dir, dentry, ino, err);
 	return new;
 out_iput:
@@ -532,6 +546,16 @@
 		goto fail;
 	}
 	f2fs_delete_entry(de, page, dir, inode);
+#ifdef CONFIG_UNICODE
+	/* VFS negative dentries are incompatible with Encoding and
+	 * Case-insensitiveness. Eventually we'll want avoid
+	 * invalidating the dentries here, alongside with returning the
+	 * negative dentries at f2fs_lookup(), when it is  better
+	 * supported by the VFS for the CI case.
+	 */
+	if (IS_CASEFOLDED(dir))
+		d_invalidate(dentry);
+#endif
 	f2fs_unlock_op(sbi);
 
 	if (IS_DIRSYNC(dir))
@@ -566,6 +590,8 @@
 
 	if (unlikely(f2fs_cp_error(sbi)))
 		return -EIO;
+	if (!f2fs_is_checkpoint_ready(sbi))
+		return -ENOSPC;
 
 	err = fscrypt_prepare_symlink(dir, symname, len, dir->i_sb->s_blocksize,
 				      &disk_link);
@@ -629,7 +655,7 @@
 	f2fs_handle_failed_inode(inode);
 out_free_encrypted_link:
 	if (disk_link.name != (unsigned char *)symname)
-		kfree(disk_link.name);
+		kvfree(disk_link.name);
 	return err;
 }
 
@@ -695,6 +721,8 @@
 
 	if (unlikely(f2fs_cp_error(sbi)))
 		return -EIO;
+	if (!f2fs_is_checkpoint_ready(sbi))
+		return -ENOSPC;
 
 	err = dquot_initialize(dir);
 	if (err)
@@ -793,8 +821,10 @@
 
 	if (unlikely(f2fs_cp_error(sbi)))
 		return -EIO;
+	if (!f2fs_is_checkpoint_ready(sbi))
+		return -ENOSPC;
 
-	if (f2fs_encrypted_inode(dir) || DUMMY_ENCRYPTION_ENABLED(sbi)) {
+	if (IS_ENCRYPTED(dir) || DUMMY_ENCRYPTION_ENABLED(sbi)) {
 		int err = fscrypt_get_encryption_info(dir);
 		if (err)
 			return err;
@@ -825,10 +855,12 @@
 	struct f2fs_dir_entry *old_entry;
 	struct f2fs_dir_entry *new_entry;
 	bool is_old_inline = f2fs_has_inline_dentry(old_dir);
-	int err = -ENOENT;
+	int err;
 
 	if (unlikely(f2fs_cp_error(sbi)))
 		return -EIO;
+	if (!f2fs_is_checkpoint_ready(sbi))
+		return -ENOSPC;
 
 	if (is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
 			(!projid_eq(F2FS_I(new_dir)->i_projid,
@@ -849,6 +881,7 @@
 			goto out;
 	}
 
+	err = -ENOENT;
 	old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page);
 	if (!old_entry) {
 		if (IS_ERR(old_page))
@@ -948,7 +981,8 @@
 	if (!old_dir_entry || whiteout)
 		file_lost_pino(old_inode);
 	else
-		F2FS_I(old_inode)->i_pino = new_dir->i_ino;
+		/* adjust dir's i_pino to pass fsck check */
+		f2fs_i_pino_write(old_inode, new_dir->i_ino);
 	up_write(&F2FS_I(old_inode)->i_sem);
 
 	old_inode->i_ctime = current_time(old_inode);
@@ -985,6 +1019,8 @@
 
 	if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir))
 		f2fs_sync_fs(sbi->sb, 1);
+
+	f2fs_update_time(sbi, REQ_TIME);
 	return 0;
 
 put_out_dir:
@@ -1014,10 +1050,12 @@
 	struct f2fs_dir_entry *old_dir_entry = NULL, *new_dir_entry = NULL;
 	struct f2fs_dir_entry *old_entry, *new_entry;
 	int old_nlink = 0, new_nlink = 0;
-	int err = -ENOENT;
+	int err;
 
 	if (unlikely(f2fs_cp_error(sbi)))
 		return -EIO;
+	if (!f2fs_is_checkpoint_ready(sbi))
+		return -ENOSPC;
 
 	if ((is_inode_flag_set(new_dir, FI_PROJ_INHERIT) &&
 			!projid_eq(F2FS_I(new_dir)->i_projid,
@@ -1035,6 +1073,7 @@
 	if (err)
 		goto out;
 
+	err = -ENOENT;
 	old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page);
 	if (!old_entry) {
 		if (IS_ERR(old_page))
@@ -1103,7 +1142,11 @@
 	f2fs_set_link(old_dir, old_entry, old_page, new_inode);
 
 	down_write(&F2FS_I(old_inode)->i_sem);
-	file_lost_pino(old_inode);
+	if (!old_dir_entry)
+		file_lost_pino(old_inode);
+	else
+		/* adjust dir's i_pino to pass fsck check */
+		f2fs_i_pino_write(old_inode, new_dir->i_ino);
 	up_write(&F2FS_I(old_inode)->i_sem);
 
 	old_dir->i_ctime = current_time(old_dir);
@@ -1118,7 +1161,11 @@
 	f2fs_set_link(new_dir, new_entry, new_page, old_inode);
 
 	down_write(&F2FS_I(new_inode)->i_sem);
-	file_lost_pino(new_inode);
+	if (!new_dir_entry)
+		file_lost_pino(new_inode);
+	else
+		/* adjust dir's i_pino to pass fsck check */
+		f2fs_i_pino_write(new_inode, old_dir->i_ino);
 	up_write(&F2FS_I(new_inode)->i_sem);
 
 	new_dir->i_ctime = current_time(new_dir);
@@ -1138,6 +1185,8 @@
 
 	if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir))
 		f2fs_sync_fs(sbi->sb, 1);
+
+	f2fs_update_time(sbi, REQ_TIME);
 	return 0;
 out_new_dir:
 	if (new_dir_entry) {
@@ -1227,6 +1276,7 @@
 #ifdef CONFIG_F2FS_FS_XATTR
 	.listxattr	= f2fs_listxattr,
 #endif
+	.fiemap		= f2fs_fiemap,
 };
 
 const struct inode_operations f2fs_symlink_inode_operations = {
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index e5d4746..9b4d197 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/node.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
@@ -37,9 +34,8 @@
 {
 	if (unlikely(nid < F2FS_ROOT_INO(sbi) || nid >= NM_I(sbi)->max_nid)) {
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
-		f2fs_msg(sbi->sb, KERN_WARNING,
-				"%s: out-of-range nid=%x, run fsck to fix.",
-				__func__, nid);
+		f2fs_warn(sbi, "%s: out-of-range nid=%x, run fsck to fix.",
+			  __func__, nid);
 		return -EFSCORRUPTED;
 	}
 	return 0;
@@ -129,6 +125,8 @@
 
 	/* get current nat block page with lock */
 	src_page = get_current_nat_page(sbi, nid);
+	if (IS_ERR(src_page))
+		return src_page;
 	dst_page = f2fs_grab_meta_page(sbi, dst_off);
 	f2fs_bug_on(sbi, PageDirty(src_page));
 
@@ -455,7 +453,7 @@
 			new_blkaddr == NULL_ADDR);
 	f2fs_bug_on(sbi, nat_get_blkaddr(e) == NEW_ADDR &&
 			new_blkaddr == NEW_ADDR);
-	f2fs_bug_on(sbi, is_valid_data_blkaddr(sbi, nat_get_blkaddr(e)) &&
+	f2fs_bug_on(sbi, __is_valid_data_blkaddr(nat_get_blkaddr(e)) &&
 			new_blkaddr == NEW_ADDR);
 
 	/* increment version no as node is removed */
@@ -466,7 +464,7 @@
 
 	/* change address */
 	nat_set_blkaddr(e, new_blkaddr);
-	if (!is_valid_data_blkaddr(sbi, new_blkaddr))
+	if (!__is_valid_data_blkaddr(new_blkaddr))
 		set_nat_flag(e, IS_CHECKPOINTED, false);
 	__set_nat_cache_dirty(nm_i, e);
 
@@ -527,6 +525,7 @@
 	struct f2fs_nat_entry ne;
 	struct nat_entry *e;
 	pgoff_t index;
+	block_t blkaddr;
 	int i;
 
 	ni->nid = nid;
@@ -570,6 +569,11 @@
 	node_info_from_raw_nat(ni, &ne);
 	f2fs_put_page(page, 1);
 cache:
+	blkaddr = le32_to_cpu(ne.block_addr);
+	if (__is_valid_data_blkaddr(blkaddr) &&
+		!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE))
+		return -EFAULT;
+
 	/* cache nat entry */
 	cache_nat_entry(sbi, nid, &ne);
 	return 0;
@@ -601,9 +605,9 @@
 pgoff_t f2fs_get_next_page_offset(struct dnode_of_data *dn, pgoff_t pgofs)
 {
 	const long direct_index = ADDRS_PER_INODE(dn->inode);
-	const long direct_blks = ADDRS_PER_BLOCK;
-	const long indirect_blks = ADDRS_PER_BLOCK * NIDS_PER_BLOCK;
-	unsigned int skipped_unit = ADDRS_PER_BLOCK;
+	const long direct_blks = ADDRS_PER_BLOCK(dn->inode);
+	const long indirect_blks = ADDRS_PER_BLOCK(dn->inode) * NIDS_PER_BLOCK;
+	unsigned int skipped_unit = ADDRS_PER_BLOCK(dn->inode);
 	int cur_level = dn->cur_level;
 	int max_level = dn->max_level;
 	pgoff_t base = 0;
@@ -637,9 +641,9 @@
 				int offset[4], unsigned int noffset[4])
 {
 	const long direct_index = ADDRS_PER_INODE(inode);
-	const long direct_blks = ADDRS_PER_BLOCK;
+	const long direct_blks = ADDRS_PER_BLOCK(inode);
 	const long dptrs_per_blk = NIDS_PER_BLOCK;
-	const long indirect_blks = ADDRS_PER_BLOCK * NIDS_PER_BLOCK;
+	const long indirect_blks = ADDRS_PER_BLOCK(inode) * NIDS_PER_BLOCK;
 	const long dindirect_blks = indirect_blks * NIDS_PER_BLOCK;
 	int n = 0;
 	int level = 0;
@@ -1107,7 +1111,7 @@
 				ri->i_nid[offset[0] - NODE_DIR1_BLOCK]) {
 			lock_page(page);
 			BUG_ON(page->mapping != NODE_MAPPING(sbi));
-			f2fs_wait_on_page_writeback(page, NODE, true);
+			f2fs_wait_on_page_writeback(page, NODE, true, true);
 			ri->i_nid[offset[0] - NODE_DIR1_BLOCK] = 0;
 			set_page_dirty(page);
 			unlock_page(page);
@@ -1182,10 +1186,8 @@
 	}
 
 	if (unlikely(inode->i_blocks != 0 && inode->i_blocks != 8)) {
-		f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING,
-			"Inconsistent i_blocks, ino:%lu, iblocks:%llu",
-			inode->i_ino,
-			(unsigned long long)inode->i_blocks);
+		f2fs_warn(F2FS_I_SB(inode), "Inconsistent i_blocks, ino:%lu, iblocks:%llu",
+			  inode->i_ino, (unsigned long long)inode->i_blocks);
 		set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK);
 	}
 
@@ -1241,7 +1243,7 @@
 	new_ni.version = 0;
 	set_node_addr(sbi, &new_ni, NEW_ADDR, false);
 
-	f2fs_wait_on_page_writeback(page, NODE, true);
+	f2fs_wait_on_page_writeback(page, NODE, true, true);
 	fill_node_footer(page, dn->nid, dn->inode->i_ino, ofs, true);
 	set_cold_node(page, S_ISDIR(dn->inode->i_mode));
 	if (!PageUptodate(page))
@@ -1375,11 +1377,10 @@
 	}
 page_hit:
 	if(unlikely(nid != nid_of_node(page))) {
-		f2fs_msg(sbi->sb, KERN_WARNING, "inconsistent node block, "
-			"nid:%lu, node_footer[nid:%u,ino:%u,ofs:%u,cpver:%llu,blkaddr:%u]",
-			nid, nid_of_node(page), ino_of_node(page),
-			ofs_of_node(page), cpver_of_node(page),
-			next_blkaddr_of_node(page));
+		f2fs_warn(sbi, "inconsistent node block, nid:%lu, node_footer[nid:%u,ino:%u,ofs:%u,cpver:%llu,blkaddr:%u]",
+			  nid, nid_of_node(page), ino_of_node(page),
+			  ofs_of_node(page), cpver_of_node(page),
+			  next_blkaddr_of_node(page));
 		err = -EINVAL;
 out_err:
 		ClearPageUptodate(page);
@@ -1523,7 +1524,8 @@
 	if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
 		goto redirty_out;
 
-	if (wbc->sync_mode == WB_SYNC_NONE &&
+	if (!is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
+			wbc->sync_mode == WB_SYNC_NONE &&
 			IS_DNODE(page) && is_cold_node(page))
 		goto redirty_out;
 
@@ -1551,7 +1553,8 @@
 	}
 
 	if (__is_valid_data_blkaddr(ni.blk_addr) &&
-		!f2fs_is_valid_blkaddr(sbi, ni.blk_addr, DATA_GENERIC)) {
+		!f2fs_is_valid_blkaddr(sbi, ni.blk_addr,
+					DATA_GENERIC_ENHANCE)) {
 		up_read(&sbi->node_write);
 		goto redirty_out;
 	}
@@ -1575,8 +1578,7 @@
 	up_read(&sbi->node_write);
 
 	if (wbc->for_reclaim) {
-		f2fs_submit_merged_write_cond(sbi, page->mapping->host, 0,
-						page->index, NODE);
+		f2fs_submit_merged_write_cond(sbi, NULL, page, 0, NODE);
 		submitted = NULL;
 	}
 
@@ -1598,8 +1600,10 @@
 	return AOP_WRITEPAGE_ACTIVATE;
 }
 
-void f2fs_move_node_page(struct page *node_page, int gc_type)
+int f2fs_move_node_page(struct page *node_page, int gc_type)
 {
+	int err = 0;
+
 	if (gc_type == FG_GC) {
 		struct writeback_control wbc = {
 			.sync_mode = WB_SYNC_ALL,
@@ -1607,16 +1611,20 @@
 			.for_reclaim = 0,
 		};
 
-		set_page_dirty(node_page);
-		f2fs_wait_on_page_writeback(node_page, NODE, true);
+		f2fs_wait_on_page_writeback(node_page, NODE, true, true);
 
-		f2fs_bug_on(F2FS_P_SB(node_page), PageWriteback(node_page));
-		if (!clear_page_dirty_for_io(node_page))
+		set_page_dirty(node_page);
+
+		if (!clear_page_dirty_for_io(node_page)) {
+			err = -EAGAIN;
 			goto out_page;
+		}
 
 		if (__write_node_page(node_page, false, NULL,
-					&wbc, false, FS_GC_NODE_IO, NULL))
+					&wbc, false, FS_GC_NODE_IO, NULL)) {
+			err = -EAGAIN;
 			unlock_page(node_page);
+		}
 		goto release_page;
 	} else {
 		/* set page dirty and write it */
@@ -1627,6 +1635,7 @@
 	unlock_page(node_page);
 release_page:
 	f2fs_put_page(node_page, 0);
+	return err;
 }
 
 static int f2fs_write_node_page(struct page *page,
@@ -1641,13 +1650,13 @@
 			unsigned int *seq_id)
 {
 	pgoff_t index;
-	pgoff_t last_idx = ULONG_MAX;
 	struct pagevec pvec;
 	int ret = 0;
 	struct page *last_page = NULL;
 	bool marked = false;
 	nid_t ino = inode->i_ino;
 	int nr_pages;
+	int nwritten = 0;
 
 	if (atomic) {
 		last_page = last_fsync_dnode(sbi, ino);
@@ -1693,8 +1702,7 @@
 				goto continue_unlock;
 			}
 
-			f2fs_wait_on_page_writeback(page, NODE, true);
-			BUG_ON(PageWriteback(page));
+			f2fs_wait_on_page_writeback(page, NODE, true, true);
 
 			set_fsync_mark(page, 0);
 			set_dentry_mark(page, 0);
@@ -1725,7 +1733,7 @@
 				f2fs_put_page(last_page, 0);
 				break;
 			} else if (submitted) {
-				last_idx = page->index;
+				nwritten++;
 			}
 
 			if (page == last_page) {
@@ -1741,21 +1749,61 @@
 			break;
 	}
 	if (!ret && atomic && !marked) {
-		f2fs_msg(sbi->sb, KERN_DEBUG,
-			"Retry to write fsync mark: ino=%u, idx=%lx",
-					ino, last_page->index);
+		f2fs_debug(sbi, "Retry to write fsync mark: ino=%u, idx=%lx",
+			   ino, last_page->index);
 		lock_page(last_page);
-		f2fs_wait_on_page_writeback(last_page, NODE, true);
+		f2fs_wait_on_page_writeback(last_page, NODE, true, true);
 		set_page_dirty(last_page);
 		unlock_page(last_page);
 		goto retry;
 	}
 out:
-	if (last_idx != ULONG_MAX)
-		f2fs_submit_merged_write_cond(sbi, NULL, ino, last_idx, NODE);
+	if (nwritten)
+		f2fs_submit_merged_write_cond(sbi, NULL, NULL, ino, NODE);
 	return ret ? -EIO: 0;
 }
 
+static int f2fs_match_ino(struct inode *inode, unsigned long ino, void *data)
+{
+	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+	bool clean;
+
+	if (inode->i_ino != ino)
+		return 0;
+
+	if (!is_inode_flag_set(inode, FI_DIRTY_INODE))
+		return 0;
+
+	spin_lock(&sbi->inode_lock[DIRTY_META]);
+	clean = list_empty(&F2FS_I(inode)->gdirty_list);
+	spin_unlock(&sbi->inode_lock[DIRTY_META]);
+
+	if (clean)
+		return 0;
+
+	inode = igrab(inode);
+	if (!inode)
+		return 0;
+	return 1;
+}
+
+static bool flush_dirty_inode(struct page *page)
+{
+	struct f2fs_sb_info *sbi = F2FS_P_SB(page);
+	struct inode *inode;
+	nid_t ino = ino_of_node(page);
+
+	inode = find_inode_nowait(sbi->sb, ino, f2fs_match_ino, NULL);
+	if (!inode)
+		return false;
+
+	f2fs_update_inode(inode, page);
+	unlock_page(page);
+
+	iput(inode);
+	return true;
+}
+
 int f2fs_sync_node_pages(struct f2fs_sb_info *sbi,
 				struct writeback_control *wbc,
 				bool do_balance, enum iostat_type io_type)
@@ -1779,6 +1827,7 @@
 		for (i = 0; i < nr_pages; i++) {
 			struct page *page = pvec.pages[i];
 			bool submitted = false;
+			bool may_dirty = true;
 
 			/* give a priority to WB_SYNC threads */
 			if (atomic_read(&sbi->wb_sync_req[NODE]) &&
@@ -1826,9 +1875,15 @@
 				goto lock_node;
 			}
 
-			f2fs_wait_on_page_writeback(page, NODE, true);
+			/* flush dirty inode */
+			if (IS_INODE(page) && may_dirty) {
+				may_dirty = false;
+				if (flush_dirty_inode(page))
+					goto lock_node;
+			}
 
-			BUG_ON(PageWriteback(page));
+			f2fs_wait_on_page_writeback(page, NODE, true, true);
+
 			if (!clear_page_dirty_for_io(page))
 				goto continue_unlock;
 
@@ -1855,7 +1910,8 @@
 	}
 
 	if (step < 2) {
-		if (wbc->sync_mode == WB_SYNC_NONE && step == 1)
+		if (!is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
+				wbc->sync_mode == WB_SYNC_NONE && step == 1)
 			goto out;
 		step++;
 		goto next_step;
@@ -1895,7 +1951,7 @@
 		get_page(page);
 		spin_unlock_irqrestore(&sbi->fsync_node_lock, flags);
 
-		f2fs_wait_on_page_writeback(page, NODE, true);
+		f2fs_wait_on_page_writeback(page, NODE, true, false);
 		if (TestClearPageError(page))
 			ret = -EIO;
 
@@ -1926,7 +1982,9 @@
 	f2fs_balance_fs_bg(sbi);
 
 	/* collect a number of dirty node pages and write together */
-	if (get_pages(sbi, F2FS_DIRTY_NODES) < nr_pages_to_skip(sbi, NODE))
+	if (wbc->sync_mode != WB_SYNC_ALL &&
+			get_pages(sbi, F2FS_DIRTY_NODES) <
+					nr_pages_to_skip(sbi, NODE))
 		goto skip_write;
 
 	if (wbc->sync_mode == WB_SYNC_ALL)
@@ -1965,7 +2023,7 @@
 	if (!PageDirty(page)) {
 		__set_page_dirty_nobuffers(page);
 		inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_NODES);
-		SetPagePrivate(page);
+		f2fs_set_page_private(page, 0);
 		f2fs_trace_pid(page);
 		return 1;
 	}
@@ -2282,15 +2340,17 @@
 						nm_i->nat_block_bitmap)) {
 			struct page *page = get_current_nat_page(sbi, nid);
 
-			ret = scan_nat_page(sbi, page, nid);
-			f2fs_put_page(page, 1);
+			if (IS_ERR(page)) {
+				ret = PTR_ERR(page);
+			} else {
+				ret = scan_nat_page(sbi, page, nid);
+				f2fs_put_page(page, 1);
+			}
 
 			if (ret) {
 				up_read(&nm_i->nat_tree_lock);
-				f2fs_bug_on(sbi, !mount);
-				f2fs_msg(sbi->sb, KERN_ERR,
-					"NAT is corrupt, run fsck to fix it");
-				return -EINVAL;
+				f2fs_err(sbi, "NAT is corrupt, run fsck to fix it");
+				return ret;
 			}
 		}
 
@@ -2338,7 +2398,7 @@
 	struct free_nid *i = NULL;
 retry:
 	if (time_to_inject(sbi, FAULT_ALLOC_NID)) {
-		f2fs_show_injection_info(FAULT_ALLOC_NID);
+		f2fs_show_injection_info(sbi, FAULT_ALLOC_NID);
 		return false;
 	}
 
@@ -2472,7 +2532,7 @@
 	src_addr = inline_xattr_addr(inode, page);
 	inline_size = inline_xattr_size(inode);
 
-	f2fs_wait_on_page_writeback(ipage, NODE, true);
+	f2fs_wait_on_page_writeback(ipage, NODE, true, true);
 	memcpy(dst_addr, src_addr, inline_size);
 update_inode:
 	f2fs_update_inode(inode, ipage);
@@ -2566,17 +2626,17 @@
 	if (dst->i_inline & F2FS_EXTRA_ATTR) {
 		dst->i_extra_isize = src->i_extra_isize;
 
-		if (f2fs_sb_has_flexible_inline_xattr(sbi->sb) &&
+		if (f2fs_sb_has_flexible_inline_xattr(sbi) &&
 			F2FS_FITS_IN_INODE(src, le16_to_cpu(src->i_extra_isize),
 							i_inline_xattr_size))
 			dst->i_inline_xattr_size = src->i_inline_xattr_size;
 
-		if (f2fs_sb_has_project_quota(sbi->sb) &&
+		if (f2fs_sb_has_project_quota(sbi) &&
 			F2FS_FITS_IN_INODE(src, le16_to_cpu(src->i_extra_isize),
 								i_projid))
 			dst->i_projid = src->i_projid;
 
-		if (f2fs_sb_has_inode_crtime(sbi->sb) &&
+		if (f2fs_sb_has_inode_crtime(sbi) &&
 			F2FS_FITS_IN_INODE(src, le16_to_cpu(src->i_extra_isize),
 							i_crtime_nsec)) {
 			dst->i_crtime = src->i_crtime;
@@ -2709,7 +2769,7 @@
 		i = 1;
 	}
 	for (; i < NAT_ENTRY_PER_BLOCK; i++) {
-		if (nat_blk->entries[i].block_addr != NULL_ADDR)
+		if (le32_to_cpu(nat_blk->entries[i].block_addr) != NULL_ADDR)
 			valid++;
 	}
 	if (valid == 0) {
@@ -2725,7 +2785,7 @@
 		__clear_bit_le(nat_index, nm_i->full_nat_bits);
 }
 
-static void __flush_nat_entry_set(struct f2fs_sb_info *sbi,
+static int __flush_nat_entry_set(struct f2fs_sb_info *sbi,
 		struct nat_entry_set *set, struct cp_control *cpc)
 {
 	struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
@@ -2749,6 +2809,9 @@
 		down_write(&curseg->journal_rwsem);
 	} else {
 		page = get_next_nat_page(sbi, start_nid);
+		if (IS_ERR(page))
+			return PTR_ERR(page);
+
 		nat_blk = page_address(page);
 		f2fs_bug_on(sbi, !nat_blk);
 	}
@@ -2794,12 +2857,13 @@
 		radix_tree_delete(&NM_I(sbi)->nat_set_root, set->set);
 		kmem_cache_free(nat_entry_set_slab, set);
 	}
+	return 0;
 }
 
 /*
  * This function is called during the checkpointing process.
  */
-void f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
+int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
 {
 	struct f2fs_nm_info *nm_i = NM_I(sbi);
 	struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
@@ -2809,6 +2873,7 @@
 	unsigned int found;
 	nid_t set_idx = 0;
 	LIST_HEAD(sets);
+	int err = 0;
 
 	/* during unmount, let's flush nat_bits before checking dirty_nat_cnt */
 	if (enabled_nat_bits(sbi, cpc)) {
@@ -2818,7 +2883,7 @@
 	}
 
 	if (!nm_i->dirty_nat_cnt)
-		return;
+		return 0;
 
 	down_write(&nm_i->nat_tree_lock);
 
@@ -2841,11 +2906,16 @@
 	}
 
 	/* flush dirty nats in nat entry set */
-	list_for_each_entry_safe(set, tmp, &sets, set_list)
-		__flush_nat_entry_set(sbi, set, cpc);
+	list_for_each_entry_safe(set, tmp, &sets, set_list) {
+		err = __flush_nat_entry_set(sbi, set, cpc);
+		if (err)
+			break;
+	}
 
 	up_write(&nm_i->nat_tree_lock);
 	/* Allow dirty nats by node block allocation in write_begin */
+
+	return err;
 }
 
 static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
@@ -2872,10 +2942,8 @@
 		struct page *page;
 
 		page = f2fs_get_meta_page(sbi, nat_bits_addr++);
-		if (IS_ERR(page)) {
-			disable_nat_bits(sbi, true);
+		if (IS_ERR(page))
 			return PTR_ERR(page);
-		}
 
 		memcpy(nm_i->nat_bits + (i << F2FS_BLKSIZE_BITS),
 					page_address(page), F2FS_BLKSIZE);
@@ -2891,7 +2959,7 @@
 	nm_i->full_nat_bits = nm_i->nat_bits + 8;
 	nm_i->empty_nat_bits = nm_i->full_nat_bits + nat_bits_bytes;
 
-	f2fs_msg(sbi->sb, KERN_NOTICE, "Found nat_bits in checkpoint");
+	f2fs_notice(sbi, "Found nat_bits in checkpoint");
 	return 0;
 }
 
@@ -2946,7 +3014,7 @@
 
 	/* not used nids: 0, node, meta, (and root counted as valid node) */
 	nm_i->available_nids = nm_i->max_nid - sbi->total_valid_node_count -
-				sbi->nquota_files - F2FS_RESERVED_NODE_NUM;
+						F2FS_RESERVED_NODE_NUM;
 	nm_i->nid_cnt[FREE_NID] = 0;
 	nm_i->nid_cnt[PREALLOC_NID] = 0;
 	nm_i->nat_cnt = 0;
@@ -3110,17 +3178,17 @@
 
 		for (i = 0; i < nm_i->nat_blocks; i++)
 			kvfree(nm_i->free_nid_bitmap[i]);
-		kfree(nm_i->free_nid_bitmap);
+		kvfree(nm_i->free_nid_bitmap);
 	}
 	kvfree(nm_i->free_nid_count);
 
-	kfree(nm_i->nat_bitmap);
-	kfree(nm_i->nat_bits);
+	kvfree(nm_i->nat_bitmap);
+	kvfree(nm_i->nat_bits);
 #ifdef CONFIG_F2FS_CHECK_FS
-	kfree(nm_i->nat_bitmap_mir);
+	kvfree(nm_i->nat_bitmap_mir);
 #endif
 	sbi->nm_info = NULL;
-	kfree(nm_i);
+	kvfree(nm_i);
 }
 
 int __init f2fs_create_node_manager_caches(void)
diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h
index 0f4db7a..e05af5d 100644
--- a/fs/f2fs/node.h
+++ b/fs/f2fs/node.h
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/node.h
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 /* start node id of a node block dedicated to the given node id */
 #define	START_NID(nid) (((nid) / NAT_ENTRY_PER_BLOCK) * NAT_ENTRY_PER_BLOCK)
@@ -364,7 +361,7 @@
 {
 	struct f2fs_node *rn = F2FS_NODE(p);
 
-	f2fs_wait_on_page_writeback(p, NODE, true);
+	f2fs_wait_on_page_writeback(p, NODE, true, true);
 
 	if (i)
 		rn->i.i_nid[off - NODE_DIR1_BLOCK] = cpu_to_le32(nid);
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
index 733f005..76477f7 100644
--- a/fs/f2fs/recovery.c
+++ b/fs/f2fs/recovery.c
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/recovery.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
@@ -191,10 +188,36 @@
 		name = "<encrypted>";
 	else
 		name = raw_inode->i_name;
-	f2fs_msg(inode->i_sb, KERN_NOTICE,
-			"%s: ino = %x, name = %s, dir = %lx, err = %d",
-			__func__, ino_of_node(ipage), name,
-			IS_ERR(dir) ? 0 : dir->i_ino, err);
+	f2fs_notice(F2FS_I_SB(inode), "%s: ino = %x, name = %s, dir = %lx, err = %d",
+		    __func__, ino_of_node(ipage), name,
+		    IS_ERR(dir) ? 0 : dir->i_ino, err);
+	return err;
+}
+
+static int recover_quota_data(struct inode *inode, struct page *page)
+{
+	struct f2fs_inode *raw = F2FS_INODE(page);
+	struct iattr attr;
+	uid_t i_uid = le32_to_cpu(raw->i_uid);
+	gid_t i_gid = le32_to_cpu(raw->i_gid);
+	int err;
+
+	memset(&attr, 0, sizeof(attr));
+
+	attr.ia_uid = make_kuid(inode->i_sb->s_user_ns, i_uid);
+	attr.ia_gid = make_kgid(inode->i_sb->s_user_ns, i_gid);
+
+	if (!uid_eq(attr.ia_uid, inode->i_uid))
+		attr.ia_valid |= ATTR_UID;
+	if (!gid_eq(attr.ia_gid, inode->i_gid))
+		attr.ia_valid |= ATTR_GID;
+
+	if (!attr.ia_valid)
+		return 0;
+
+	err = dquot_transfer(inode, &attr);
+	if (err)
+		set_sbi_flag(F2FS_I_SB(inode), SBI_QUOTA_NEED_REPAIR);
 	return err;
 }
 
@@ -210,24 +233,38 @@
 		clear_inode_flag(inode, FI_DATA_EXIST);
 }
 
-static void recover_inode(struct inode *inode, struct page *page)
+static int recover_inode(struct inode *inode, struct page *page)
 {
 	struct f2fs_inode *raw = F2FS_INODE(page);
 	char *name;
+	int err;
 
 	inode->i_mode = le16_to_cpu(raw->i_mode);
+
+	err = recover_quota_data(inode, page);
+	if (err)
+		return err;
+
 	i_uid_write(inode, le32_to_cpu(raw->i_uid));
 	i_gid_write(inode, le32_to_cpu(raw->i_gid));
 
 	if (raw->i_inline & F2FS_EXTRA_ATTR) {
-		if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)->sb) &&
+		if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)) &&
 			F2FS_FITS_IN_INODE(raw, le16_to_cpu(raw->i_extra_isize),
 								i_projid)) {
 			projid_t i_projid;
+			kprojid_t kprojid;
 
 			i_projid = (projid_t)le32_to_cpu(raw->i_projid);
-			F2FS_I(inode)->i_projid =
-				make_kprojid(&init_user_ns, i_projid);
+			kprojid = make_kprojid(&init_user_ns, i_projid);
+
+			if (!projid_eq(kprojid, F2FS_I(inode)->i_projid)) {
+				err = f2fs_transfer_project_quota(inode,
+								kprojid);
+				if (err)
+					return err;
+				F2FS_I(inode)->i_projid = kprojid;
+			}
 		}
 	}
 
@@ -254,9 +291,9 @@
 	else
 		name = F2FS_INODE(page)->i_name;
 
-	f2fs_msg(inode->i_sb, KERN_NOTICE,
-		"recover_inode: ino = %x, name = %s, inline = %x",
-			ino_of_node(page), name, raw->i_inline);
+	f2fs_notice(F2FS_I_SB(inode), "recover_inode: ino = %x, name = %s, inline = %x",
+		    ino_of_node(page), name, raw->i_inline);
+	return 0;
 }
 
 static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head,
@@ -286,8 +323,10 @@
 			break;
 		}
 
-		if (!is_recoverable_dnode(page))
+		if (!is_recoverable_dnode(page)) {
+			f2fs_put_page(page, 1);
 			break;
+		}
 
 		if (!is_fsync_dnode(page))
 			goto next;
@@ -299,8 +338,10 @@
 			if (!check_only &&
 					IS_INODE(page) && is_dent_dnode(page)) {
 				err = f2fs_recover_inode_page(sbi, page);
-				if (err)
+				if (err) {
+					f2fs_put_page(page, 1);
 					break;
+				}
 				quota_inode = true;
 			}
 
@@ -316,6 +357,7 @@
 					err = 0;
 					goto next;
 				}
+				f2fs_put_page(page, 1);
 				break;
 			}
 		}
@@ -327,10 +369,10 @@
 		/* sanity check in order to detect looped node chain */
 		if (++loop_cnt >= free_blocks ||
 			blkaddr == next_blkaddr_of_node(page)) {
-			f2fs_msg(sbi->sb, KERN_NOTICE,
-				"%s: detect looped node chain, "
-				"blkaddr:%u, next:%u",
-				__func__, blkaddr, next_blkaddr_of_node(page));
+			f2fs_notice(sbi, "%s: detect looped node chain, blkaddr:%u, next:%u",
+				    __func__, blkaddr,
+				    next_blkaddr_of_node(page));
+			f2fs_put_page(page, 1);
 			err = -EINVAL;
 			break;
 		}
@@ -341,7 +383,6 @@
 
 		f2fs_ra_meta_pages_cond(sbi, blkaddr);
 	}
-	f2fs_put_page(page, 1);
 	return err;
 }
 
@@ -383,6 +424,8 @@
 	}
 
 	sum_page = f2fs_get_sum_page(sbi, segno);
+	if (IS_ERR(sum_page))
+		return PTR_ERR(sum_page);
 	sum_node = (struct f2fs_summary_block *)page_address(sum_page);
 	sum = sum_node->entries[blkoff];
 	f2fs_put_page(sum_page, 1);
@@ -498,7 +541,7 @@
 		goto out;
 	}
 
-	f2fs_wait_on_page_writeback(dn.node_page, NODE, true);
+	f2fs_wait_on_page_writeback(dn.node_page, NODE, true, true);
 
 	err = f2fs_get_node_info(sbi, dn.nid, &ni);
 	if (err)
@@ -507,10 +550,9 @@
 	f2fs_bug_on(sbi, ni.ino != ino_of_node(page));
 
 	if (ofs_of_node(dn.node_page) != ofs_of_node(page)) {
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"Inconsistent ofs_of_node, ino:%lu, ofs:%u, %u",
-			inode->i_ino, ofs_of_node(dn.node_page),
-			ofs_of_node(page));
+		f2fs_warn(sbi, "Inconsistent ofs_of_node, ino:%lu, ofs:%u, %u",
+			  inode->i_ino, ofs_of_node(dn.node_page),
+			  ofs_of_node(page));
 		err = -EFSCORRUPTED;
 		goto err;
 	}
@@ -521,6 +563,18 @@
 		src = datablock_addr(dn.inode, dn.node_page, dn.ofs_in_node);
 		dest = datablock_addr(dn.inode, page, dn.ofs_in_node);
 
+		if (__is_valid_data_blkaddr(src) &&
+			!f2fs_is_valid_blkaddr(sbi, src, META_POR)) {
+			err = -EFSCORRUPTED;
+			goto err;
+		}
+
+		if (__is_valid_data_blkaddr(dest) &&
+			!f2fs_is_valid_blkaddr(sbi, dest, META_POR)) {
+			err = -EFSCORRUPTED;
+			goto err;
+		}
+
 		/* skip recovering if dest is the same as src */
 		if (src == dest)
 			continue;
@@ -584,11 +638,9 @@
 err:
 	f2fs_put_dnode(&dn);
 out:
-	f2fs_msg(sbi->sb, KERN_NOTICE,
-		"recover_data: ino = %lx (i_size: %s) recovered = %d, err = %d",
-		inode->i_ino,
-		file_keep_isize(inode) ? "keep" : "recover",
-		recovered, err);
+	f2fs_notice(sbi, "recover_data: ino = %lx (i_size: %s) recovered = %d, err = %d",
+		    inode->i_ino, file_keep_isize(inode) ? "keep" : "recover",
+		    recovered, err);
 	return err;
 }
 
@@ -631,8 +683,13 @@
 		 * In this case, we can lose the latest inode(x).
 		 * So, call recover_inode for the inode update.
 		 */
-		if (IS_INODE(page))
-			recover_inode(entry->inode, page);
+		if (IS_INODE(page)) {
+			err = recover_inode(entry->inode, page);
+			if (err) {
+				f2fs_put_page(page, 1);
+				break;
+			}
+		}
 		if (entry->last_dentry == blkaddr) {
 			err = recover_dentry(entry->inode, page, dir_list);
 			if (err) {
@@ -654,7 +711,7 @@
 		f2fs_put_page(page, 1);
 	}
 	if (!err)
-		f2fs_allocate_new_segments(sbi);
+		f2fs_allocate_new_segments(sbi, NO_CHECK_TYPE);
 	return err;
 }
 
@@ -671,8 +728,7 @@
 #endif
 
 	if (s_flags & SB_RDONLY) {
-		f2fs_msg(sbi->sb, KERN_INFO,
-				"recover fsync data on readonly fs");
+		f2fs_info(sbi, "recover fsync data on readonly fs");
 		sbi->sb->s_flags &= ~SB_RDONLY;
 	}
 
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 0e3e590..fa32ce92 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/segment.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
@@ -179,6 +176,8 @@
 		return false;
 	if (sbi->gc_mode == GC_URGENT)
 		return true;
+	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
+		return true;
 
 	return free_sections(sbi) <= (node_secs + 2 * dent_secs + imeta_secs +
 			SM_I(sbi)->min_ssr_sections + reserved_sections(sbi));
@@ -186,14 +185,11 @@
 
 void f2fs_register_inmem_page(struct inode *inode, struct page *page)
 {
-	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
-	struct f2fs_inode_info *fi = F2FS_I(inode);
 	struct inmem_pages *new;
 
 	f2fs_trace_pid(page);
 
-	set_page_private(page, (unsigned long)ATOMIC_WRITTEN_PAGE);
-	SetPagePrivate(page);
+	f2fs_set_page_private(page, (unsigned long)ATOMIC_WRITTEN_PAGE);
 
 	new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
 
@@ -202,15 +198,11 @@
 	INIT_LIST_HEAD(&new->list);
 
 	/* increase reference count with clean state */
-	mutex_lock(&fi->inmem_lock);
 	get_page(page);
-	list_add_tail(&new->list, &fi->inmem_pages);
-	spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
-	if (list_empty(&fi->inmem_ilist))
-		list_add_tail(&fi->inmem_ilist, &sbi->inode_list[ATOMIC_FILE]);
-	spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
+	mutex_lock(&F2FS_I(inode)->inmem_lock);
+	list_add_tail(&new->list, &F2FS_I(inode)->inmem_pages);
 	inc_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES);
-	mutex_unlock(&fi->inmem_lock);
+	mutex_unlock(&F2FS_I(inode)->inmem_lock);
 
 	trace_f2fs_register_inmem_page(page, INMEM);
 }
@@ -240,7 +232,7 @@
 			lock_page(page);
 		}
 
-		f2fs_wait_on_page_writeback(page, DATA, true);
+		f2fs_wait_on_page_writeback(page, DATA, true, true);
 
 		if (recover) {
 			struct dnode_of_data dn;
@@ -281,8 +273,7 @@
 			ClearPageUptodate(page);
 			clear_cold_data(page);
 		}
-		set_page_private(page, 0);
-		ClearPagePrivate(page);
+		f2fs_clear_page_private(page);
 		f2fs_put_page(page, 1);
 
 		list_del(&cur->list);
@@ -297,6 +288,8 @@
 	struct list_head *head = &sbi->inode_list[ATOMIC_FILE];
 	struct inode *inode;
 	struct f2fs_inode_info *fi;
+	unsigned int count = sbi->atomic_files;
+	unsigned int looped = 0;
 next:
 	spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
 	if (list_empty(head)) {
@@ -305,22 +298,26 @@
 	}
 	fi = list_first_entry(head, struct f2fs_inode_info, inmem_ilist);
 	inode = igrab(&fi->vfs_inode);
+	if (inode)
+		list_move_tail(&fi->inmem_ilist, head);
 	spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
 
 	if (inode) {
 		if (gc_failure) {
-			if (fi->i_gc_failures[GC_FAILURE_ATOMIC])
-				goto drop;
-			goto skip;
+			if (!fi->i_gc_failures[GC_FAILURE_ATOMIC])
+				goto skip;
 		}
-drop:
 		set_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
 		f2fs_drop_inmem_pages(inode);
+skip:
 		iput(inode);
 	}
-skip:
 	congestion_wait(BLK_RW_ASYNC, HZ/50);
 	cond_resched();
+	if (gc_failure) {
+		if (++looped >= count)
+			return;
+	}
 	goto next;
 }
 
@@ -333,19 +330,20 @@
 		mutex_lock(&fi->inmem_lock);
 		__revoke_inmem_pages(inode, &fi->inmem_pages,
 						true, false, true);
-
-		if (list_empty(&fi->inmem_pages)) {
-			spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
-			if (!list_empty(&fi->inmem_ilist))
-				list_del_init(&fi->inmem_ilist);
-			spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
-		}
 		mutex_unlock(&fi->inmem_lock);
 	}
 
-	clear_inode_flag(inode, FI_ATOMIC_FILE);
 	fi->i_gc_failures[GC_FAILURE_ATOMIC] = 0;
 	stat_dec_atomic_write(inode);
+
+	spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
+	if (!list_empty(&fi->inmem_ilist))
+		list_del_init(&fi->inmem_ilist);
+	if (f2fs_is_atomic_file(inode)) {
+		clear_inode_flag(inode, FI_ATOMIC_FILE);
+		sbi->atomic_files--;
+	}
+	spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
 }
 
 void f2fs_drop_inmem_page(struct inode *inode, struct page *page)
@@ -371,8 +369,7 @@
 	kmem_cache_free(inmem_entry_slab, cur);
 
 	ClearPageUptodate(page);
-	set_page_private(page, 0);
-	ClearPagePrivate(page);
+	f2fs_clear_page_private(page);
 	f2fs_put_page(page, 0);
 
 	trace_f2fs_commit_inmem_page(page, INMEM_INVALIDATE);
@@ -392,7 +389,7 @@
 		.io_type = FS_DATA_IO,
 	};
 	struct list_head revoke_list;
-	pgoff_t last_idx = ULONG_MAX;
+	bool submit_bio = false;
 	int err = 0;
 
 	INIT_LIST_HEAD(&revoke_list);
@@ -404,8 +401,9 @@
 		if (page->mapping == inode->i_mapping) {
 			trace_f2fs_commit_inmem_page(page, INMEM);
 
+			f2fs_wait_on_page_writeback(page, DATA, true, true);
+
 			set_page_dirty(page);
-			f2fs_wait_on_page_writeback(page, DATA, true);
 			if (clear_page_dirty_for_io(page)) {
 				inode_dec_dirty_pages(inode);
 				f2fs_remove_dirty_inode(inode);
@@ -427,14 +425,14 @@
 			}
 			/* record old blkaddr for revoking */
 			cur->old_addr = fio.old_blkaddr;
-			last_idx = page->index;
+			submit_bio = true;
 		}
 		unlock_page(page);
 		list_move_tail(&cur->list, &revoke_list);
 	}
 
-	if (last_idx != ULONG_MAX)
-		f2fs_submit_merged_write_cond(sbi, inode, 0, last_idx, DATA);
+	if (submit_bio)
+		f2fs_submit_merged_write_cond(sbi, inode, NULL, 0, DATA);
 
 	if (err) {
 		/*
@@ -474,11 +472,6 @@
 
 	mutex_lock(&fi->inmem_lock);
 	err = __f2fs_commit_inmem_pages(inode);
-
-	spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
-	if (!list_empty(&fi->inmem_ilist))
-		list_del_init(&fi->inmem_ilist);
-	spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
 	mutex_unlock(&fi->inmem_lock);
 
 	clear_inode_flag(inode, FI_ATOMIC_COMMIT);
@@ -496,7 +489,7 @@
 void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need)
 {
 	if (time_to_inject(sbi, FAULT_CHECKPOINT)) {
-		f2fs_show_injection_info(FAULT_CHECKPOINT);
+		f2fs_show_injection_info(sbi, FAULT_CHECKPOINT);
 		f2fs_stop_checkpoint(sbi, false);
 	}
 
@@ -504,6 +497,9 @@
 	if (need && excess_cached_nats(sbi))
 		f2fs_balance_fs_bg(sbi);
 
+	if (!f2fs_is_checkpoint_ready(sbi))
+		return;
+
 	/*
 	 * We should do GC or end up with checkpoint, if there are so many dirty
 	 * dir/node pages without enough free segments.
@@ -532,7 +528,7 @@
 	else
 		f2fs_build_free_nids(sbi, false, false);
 
-	if (!is_idle(sbi) &&
+	if (!is_idle(sbi, REQ_TIME) &&
 		(!excess_dirty_nats(sbi) && !excess_dirty_nodes(sbi)))
 		return;
 
@@ -546,9 +542,13 @@
 		if (test_opt(sbi, DATA_FLUSH)) {
 			struct blk_plug plug;
 
+			mutex_lock(&sbi->flush_lock);
+
 			blk_start_plug(&plug);
 			f2fs_sync_dirty_inodes(sbi, FILE_INODE);
 			blk_finish_plug(&plug);
+
+			mutex_unlock(&sbi->flush_lock);
 		}
 		f2fs_sync_fs(sbi->sb, true);
 		stat_inc_bg_cp_count(sbi->stat_info);
@@ -558,9 +558,13 @@
 static int __submit_flush_wait(struct f2fs_sb_info *sbi,
 				struct block_device *bdev)
 {
-	struct bio *bio = f2fs_bio_alloc(sbi, 0, true);
+	struct bio *bio;
 	int ret;
 
+	bio = f2fs_bio_alloc(sbi, 0, false);
+	if (!bio)
+		return -ENOMEM;
+
 	bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH;
 	bio_set_dev(bio, bdev);
 	ret = submit_bio_wait(bio);
@@ -637,17 +641,17 @@
 		return 0;
 
 	if (!test_opt(sbi, FLUSH_MERGE)) {
-		atomic_inc(&fcc->issing_flush);
+		atomic_inc(&fcc->queued_flush);
 		ret = submit_flush_wait(sbi, ino);
-		atomic_dec(&fcc->issing_flush);
+		atomic_dec(&fcc->queued_flush);
 		atomic_inc(&fcc->issued_flush);
 		return ret;
 	}
 
-	if (atomic_inc_return(&fcc->issing_flush) == 1 ||
+	if (atomic_inc_return(&fcc->queued_flush) == 1 ||
 	    f2fs_is_multi_device(sbi)) {
 		ret = submit_flush_wait(sbi, ino);
-		atomic_dec(&fcc->issing_flush);
+		atomic_dec(&fcc->queued_flush);
 
 		atomic_inc(&fcc->issued_flush);
 		return ret;
@@ -666,14 +670,14 @@
 
 	if (fcc->f2fs_issue_flush) {
 		wait_for_completion(&cmd.wait);
-		atomic_dec(&fcc->issing_flush);
+		atomic_dec(&fcc->queued_flush);
 	} else {
 		struct llist_node *list;
 
 		list = llist_del_all(&fcc->issue_list);
 		if (!list) {
 			wait_for_completion(&cmd.wait);
-			atomic_dec(&fcc->issing_flush);
+			atomic_dec(&fcc->queued_flush);
 		} else {
 			struct flush_cmd *tmp, *next;
 
@@ -682,7 +686,7 @@
 			llist_for_each_entry_safe(tmp, next, list, llnode) {
 				if (tmp == &cmd) {
 					cmd.ret = ret;
-					atomic_dec(&fcc->issing_flush);
+					atomic_dec(&fcc->queued_flush);
 					continue;
 				}
 				tmp->ret = ret;
@@ -711,7 +715,7 @@
 	if (!fcc)
 		return -ENOMEM;
 	atomic_set(&fcc->issued_flush, 0);
-	atomic_set(&fcc->issing_flush, 0);
+	atomic_set(&fcc->queued_flush, 0);
 	init_waitqueue_head(&fcc->flush_wait_queue);
 	init_llist_head(&fcc->issue_list);
 	SM_I(sbi)->fcc_info = fcc;
@@ -723,7 +727,7 @@
 				"f2fs_flush-%u:%u", MAJOR(dev), MINOR(dev));
 	if (IS_ERR(fcc->f2fs_issue_flush)) {
 		err = PTR_ERR(fcc->f2fs_issue_flush);
-		kfree(fcc);
+		kvfree(fcc);
 		SM_I(sbi)->fcc_info = NULL;
 		return err;
 	}
@@ -742,7 +746,7 @@
 		kthread_stop(flush_thread);
 	}
 	if (free) {
-		kfree(fcc);
+		kvfree(fcc);
 		SM_I(sbi)->fcc_info = NULL;
 	}
 }
@@ -809,9 +813,13 @@
 		if (test_and_clear_bit(segno, dirty_i->dirty_segmap[t]))
 			dirty_i->nr_dirty[t]--;
 
-		if (get_valid_blocks(sbi, segno, true) == 0)
+		if (get_valid_blocks(sbi, segno, true) == 0) {
 			clear_bit(GET_SEC_FROM_SEG(sbi, segno),
 						dirty_i->victim_secmap);
+#ifdef CONFIG_F2FS_CHECK_FS
+			clear_bit(segno, SIT_I(sbi)->invalid_segmap);
+#endif
+		}
 	}
 }
 
@@ -823,7 +831,7 @@
 static void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno)
 {
 	struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
-	unsigned short valid_blocks;
+	unsigned short valid_blocks, ckpt_valid_blocks;
 
 	if (segno == NULL_SEGNO || IS_CURSEG(sbi, segno))
 		return;
@@ -831,8 +839,10 @@
 	mutex_lock(&dirty_i->seglist_lock);
 
 	valid_blocks = get_valid_blocks(sbi, segno, false);
+	ckpt_valid_blocks = get_ckpt_valid_blocks(sbi, segno);
 
-	if (valid_blocks == 0) {
+	if (valid_blocks == 0 && (!is_sbi_flag_set(sbi, SBI_CP_DISABLED) ||
+				ckpt_valid_blocks == sbi->blocks_per_seg)) {
 		__locate_dirty_segment(sbi, segno, PRE);
 		__remove_dirty_segment(sbi, segno, DIRTY);
 	} else if (valid_blocks < sbi->blocks_per_seg) {
@@ -845,6 +855,82 @@
 	mutex_unlock(&dirty_i->seglist_lock);
 }
 
+/* This moves currently empty dirty blocks to prefree. Must hold seglist_lock */
+void f2fs_dirty_to_prefree(struct f2fs_sb_info *sbi)
+{
+	struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
+	unsigned int segno;
+
+	mutex_lock(&dirty_i->seglist_lock);
+	for_each_set_bit(segno, dirty_i->dirty_segmap[DIRTY], MAIN_SEGS(sbi)) {
+		if (get_valid_blocks(sbi, segno, false))
+			continue;
+		if (IS_CURSEG(sbi, segno))
+			continue;
+		__locate_dirty_segment(sbi, segno, PRE);
+		__remove_dirty_segment(sbi, segno, DIRTY);
+	}
+	mutex_unlock(&dirty_i->seglist_lock);
+}
+
+block_t f2fs_get_unusable_blocks(struct f2fs_sb_info *sbi)
+{
+	int ovp_hole_segs =
+		(overprovision_segments(sbi) - reserved_segments(sbi));
+	block_t ovp_holes = ovp_hole_segs << sbi->log_blocks_per_seg;
+	struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
+	block_t holes[2] = {0, 0};	/* DATA and NODE */
+	block_t unusable;
+	struct seg_entry *se;
+	unsigned int segno;
+
+	mutex_lock(&dirty_i->seglist_lock);
+	for_each_set_bit(segno, dirty_i->dirty_segmap[DIRTY], MAIN_SEGS(sbi)) {
+		se = get_seg_entry(sbi, segno);
+		if (IS_NODESEG(se->type))
+			holes[NODE] += sbi->blocks_per_seg - se->valid_blocks;
+		else
+			holes[DATA] += sbi->blocks_per_seg - se->valid_blocks;
+	}
+	mutex_unlock(&dirty_i->seglist_lock);
+
+	unusable = holes[DATA] > holes[NODE] ? holes[DATA] : holes[NODE];
+	if (unusable > ovp_holes)
+		return unusable - ovp_holes;
+	return 0;
+}
+
+int f2fs_disable_cp_again(struct f2fs_sb_info *sbi, block_t unusable)
+{
+	int ovp_hole_segs =
+		(overprovision_segments(sbi) - reserved_segments(sbi));
+	if (unusable > F2FS_OPTION(sbi).unusable_cap)
+		return -EAGAIN;
+	if (is_sbi_flag_set(sbi, SBI_CP_DISABLED_QUICK) &&
+		dirty_segments(sbi) > ovp_hole_segs)
+		return -EAGAIN;
+	return 0;
+}
+
+/* This is only used by SBI_CP_DISABLED */
+static unsigned int get_free_segment(struct f2fs_sb_info *sbi)
+{
+	struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
+	unsigned int segno = 0;
+
+	mutex_lock(&dirty_i->seglist_lock);
+	for_each_set_bit(segno, dirty_i->dirty_segmap[DIRTY], MAIN_SEGS(sbi)) {
+		if (get_valid_blocks(sbi, segno, false))
+			continue;
+		if (get_ckpt_valid_blocks(sbi, segno))
+			continue;
+		mutex_unlock(&dirty_i->seglist_lock);
+		return segno;
+	}
+	mutex_unlock(&dirty_i->seglist_lock);
+	return NULL_SEGNO;
+}
+
 static struct discard_cmd *__create_discard_cmd(struct f2fs_sb_info *sbi,
 		struct block_device *bdev, block_t lstart,
 		block_t start, block_t len)
@@ -865,7 +951,7 @@
 	dc->len = len;
 	dc->ref = 0;
 	dc->state = D_PREP;
-	dc->issuing = 0;
+	dc->queued = 0;
 	dc->error = 0;
 	init_completion(&dc->wait);
 	list_add_tail(&dc->list, pend_list);
@@ -880,7 +966,8 @@
 static struct discard_cmd *__attach_discard_cmd(struct f2fs_sb_info *sbi,
 				struct block_device *bdev, block_t lstart,
 				block_t start, block_t len,
-				struct rb_node *parent, struct rb_node **p)
+				struct rb_node *parent, struct rb_node **p,
+				bool leftmost)
 {
 	struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
 	struct discard_cmd *dc;
@@ -888,7 +975,7 @@
 	dc = __create_discard_cmd(sbi, bdev, lstart, start, len);
 
 	rb_link_node(&dc->rb_node, parent, p);
-	rb_insert_color(&dc->rb_node, &dcc->root);
+	rb_insert_color_cached(&dc->rb_node, &dcc->root, leftmost);
 
 	return dc;
 }
@@ -897,10 +984,10 @@
 							struct discard_cmd *dc)
 {
 	if (dc->state == D_DONE)
-		atomic_sub(dc->issuing, &dcc->issing_discard);
+		atomic_sub(dc->queued, &dcc->queued_discard);
 
 	list_del(&dc->list);
-	rb_erase(&dc->rb_node, &dcc->root);
+	rb_erase_cached(&dc->rb_node, &dcc->root);
 	dcc->undiscard_blks -= dc->len;
 
 	kmem_cache_free(discard_cmd_slab, dc);
@@ -929,8 +1016,9 @@
 		dc->error = 0;
 
 	if (dc->error)
-		f2fs_msg(sbi->sb, KERN_INFO,
-			"Issue discard(%u, %u, %u) failed, ret: %d",
+		printk_ratelimited(
+			"%sF2FS-fs (%s): Issue discard(%u, %u, %u) failed, ret: %d",
+			KERN_INFO, sbi->sb->s_id,
 			dc->lstart, dc->start, dc->len, dc->error);
 	__detach_discard_cmd(dcc, dc);
 }
@@ -991,6 +1079,7 @@
 
 	dpolicy->max_requests = DEF_MAX_DISCARD_REQUEST;
 	dpolicy->io_aware_gran = MAX_PLIST_NUM;
+	dpolicy->timeout = 0;
 
 	if (discard_type == DPOLICY_BG) {
 		dpolicy->min_interval = DEF_MIN_DISCARD_ISSUE_TIME;
@@ -1013,6 +1102,8 @@
 	} else if (discard_type == DPOLICY_UMOUNT) {
 		dpolicy->max_requests = UINT_MAX;
 		dpolicy->io_aware = false;
+		/* we need to issue all to keep CP_TRIMMED_FLAG */
+		dpolicy->granularity = 1;
 	}
 }
 
@@ -1068,7 +1159,7 @@
 		dc->len += len;
 
 		if (time_to_inject(sbi, FAULT_DISCARD)) {
-			f2fs_show_injection_info(FAULT_DISCARD);
+			f2fs_show_injection_info(sbi, FAULT_DISCARD);
 			err = -EIO;
 			goto submit;
 		}
@@ -1100,8 +1191,8 @@
 		dc->bio_ref++;
 		spin_unlock_irqrestore(&dc->lock, flags);
 
-		atomic_inc(&dcc->issing_discard);
-		dc->issuing++;
+		atomic_inc(&dcc->queued_discard);
+		dc->queued++;
 		list_move_tail(&dc->list, wait_list);
 
 		/* sanity check on discard range */
@@ -1137,6 +1228,7 @@
 	struct rb_node **p;
 	struct rb_node *parent = NULL;
 	struct discard_cmd *dc = NULL;
+	bool leftmost = true;
 
 	if (insert_p && insert_parent) {
 		parent = insert_parent;
@@ -1144,9 +1236,11 @@
 		goto do_insert;
 	}
 
-	p = f2fs_lookup_rb_tree_for_insert(sbi, &dcc->root, &parent, lstart);
+	p = f2fs_lookup_rb_tree_for_insert(sbi, &dcc->root, &parent,
+							lstart, &leftmost);
 do_insert:
-	dc = __attach_discard_cmd(sbi, bdev, lstart, start, len, parent, p);
+	dc = __attach_discard_cmd(sbi, bdev, lstart, start, len, parent,
+								p, leftmost);
 	if (!dc)
 		return NULL;
 
@@ -1214,7 +1308,7 @@
 					NULL, lstart,
 					(struct rb_entry **)&prev_dc,
 					(struct rb_entry **)&next_dc,
-					&insert_p, &insert_parent, true);
+					&insert_p, &insert_parent, true, NULL);
 	if (dc)
 		prev_dc = dc;
 
@@ -1292,6 +1386,9 @@
 {
 	block_t lblkstart = blkstart;
 
+	if (!f2fs_bdev_support_discard(bdev))
+		return 0;
+
 	trace_f2fs_queue_discard(bdev, blkstart, blklen);
 
 	if (f2fs_is_multi_device(sbi)) {
@@ -1322,7 +1419,7 @@
 					NULL, pos,
 					(struct rb_entry **)&prev_dc,
 					(struct rb_entry **)&next_dc,
-					&insert_p, &insert_parent, true);
+					&insert_p, &insert_parent, true, NULL);
 	if (!dc)
 		dc = next_dc;
 
@@ -1335,7 +1432,7 @@
 		if (dc->state != D_PREP)
 			goto next;
 
-		if (dpolicy->io_aware && !is_idle(sbi)) {
+		if (dpolicy->io_aware && !is_idle(sbi, DISCARD_TIME)) {
 			io_interrupted = true;
 			break;
 		}
@@ -1375,7 +1472,14 @@
 	int i, issued = 0;
 	bool io_interrupted = false;
 
+	if (dpolicy->timeout != 0)
+		f2fs_update_time(sbi, dpolicy->timeout);
+
 	for (i = MAX_PLIST_NUM - 1; i >= 0; i--) {
+		if (dpolicy->timeout != 0 &&
+				f2fs_time_over(sbi, dpolicy->timeout))
+			break;
+
 		if (i + 1 < dpolicy->granularity)
 			break;
 
@@ -1394,8 +1498,12 @@
 		list_for_each_entry_safe(dc, tmp, pend_list, list) {
 			f2fs_bug_on(sbi, dc->state != D_PREP);
 
+			if (dpolicy->timeout != 0 &&
+				f2fs_time_over(sbi, dpolicy->timeout))
+				break;
+
 			if (dpolicy->io_aware && i < dpolicy->io_aware_gran &&
-								!is_idle(sbi)) {
+						!is_idle(sbi, DISCARD_TIME)) {
 				io_interrupted = true;
 				break;
 			}
@@ -1562,7 +1670,7 @@
 }
 
 /* This comes from f2fs_put_super */
-bool f2fs_wait_discard_bios(struct f2fs_sb_info *sbi)
+bool f2fs_issue_discard_timeout(struct f2fs_sb_info *sbi)
 {
 	struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
 	struct discard_policy dpolicy;
@@ -1570,6 +1678,7 @@
 
 	__init_discard_policy(sbi, &dpolicy, DPOLICY_UMOUNT,
 					dcc->discard_granularity);
+	dpolicy.timeout = UMOUNT_DISCARD_TIMEOUT;
 	__issue_discard_cmd(sbi, &dpolicy);
 	dropped = __drop_discard_cmd(sbi);
 
@@ -1603,6 +1712,10 @@
 		if (dcc->discard_wake)
 			dcc->discard_wake = 0;
 
+		/* clean up pending candidates before going to sleep */
+		if (atomic_read(&dcc->queued_discard))
+			__wait_all_discard_cmd(sbi, NULL);
+
 		if (try_to_freeze())
 			continue;
 		if (f2fs_readonly(sbi->sb))
@@ -1624,7 +1737,9 @@
 			__wait_all_discard_cmd(sbi, &dpolicy);
 			wait_ms = dpolicy.min_interval;
 		} else if (issued == -1){
-			wait_ms = dpolicy.mid_interval;
+			wait_ms = f2fs_time_to_wait(sbi, DISCARD_TIME);
+			if (!wait_ms)
+				wait_ms = dpolicy.mid_interval;
 		} else {
 			wait_ms = dpolicy.max_interval;
 		}
@@ -1645,40 +1760,32 @@
 
 	if (f2fs_is_multi_device(sbi)) {
 		devi = f2fs_target_device_index(sbi, blkstart);
+		if (blkstart < FDEV(devi).start_blk ||
+		    blkstart > FDEV(devi).end_blk) {
+			f2fs_err(sbi, "Invalid block %x", blkstart);
+			return -EIO;
+		}
 		blkstart -= FDEV(devi).start_blk;
 	}
 
-	/*
-	 * We need to know the type of the zone: for conventional zones,
-	 * use regular discard if the drive supports it. For sequential
-	 * zones, reset the zone write pointer.
-	 */
-	switch (get_blkz_type(sbi, bdev, blkstart)) {
-
-	case BLK_ZONE_TYPE_CONVENTIONAL:
-		if (!blk_queue_discard(bdev_get_queue(bdev)))
-			return 0;
-		return __queue_discard_cmd(sbi, bdev, lblkstart, blklen);
-	case BLK_ZONE_TYPE_SEQWRITE_REQ:
-	case BLK_ZONE_TYPE_SEQWRITE_PREF:
+	/* For sequential zones, reset the zone write pointer */
+	if (f2fs_blkz_is_seq(sbi, devi, blkstart)) {
 		sector = SECTOR_FROM_BLOCK(blkstart);
 		nr_sects = SECTOR_FROM_BLOCK(blklen);
 
 		if (sector & (bdev_zone_sectors(bdev) - 1) ||
 				nr_sects != bdev_zone_sectors(bdev)) {
-			f2fs_msg(sbi->sb, KERN_INFO,
-				"(%d) %s: Unaligned discard attempted (block %x + %x)",
-				devi, sbi->s_ndevs ? FDEV(devi).path: "",
-				blkstart, blklen);
+			f2fs_err(sbi, "(%d) %s: Unaligned zone reset attempted (block %x + %x)",
+				 devi, sbi->s_ndevs ? FDEV(devi).path : "",
+				 blkstart, blklen);
 			return -EIO;
 		}
 		trace_f2fs_issue_reset_zone(bdev, blkstart);
-		return blkdev_reset_zones(bdev, sector,
-					  nr_sects, GFP_NOFS);
-	default:
-		/* Unknown zone type: broken device ? */
-		return -EIO;
+		return blkdev_reset_zones(bdev, sector, nr_sects, GFP_NOFS);
 	}
+
+	/* For conventional zones, use regular discard if supported */
+	return __queue_discard_cmd(sbi, bdev, lblkstart, blklen);
 }
 #endif
 
@@ -1686,8 +1793,7 @@
 		struct block_device *bdev, block_t blkstart, block_t blklen)
 {
 #ifdef CONFIG_BLK_DEV_ZONED
-	if (f2fs_sb_has_blkzoned(sbi->sb) &&
-				bdev_zoned_model(bdev) != BLK_ZONED_NONE)
+	if (f2fs_sb_has_blkzoned(sbi) && bdev_is_zoned(bdev))
 		return __f2fs_issue_discard_zone(sbi, bdev, blkstart, blklen);
 #endif
 	return __queue_discard_cmd(sbi, bdev, blkstart, blklen);
@@ -1834,7 +1940,7 @@
 	unsigned int start = 0, end = -1;
 	unsigned int secno, start_segno;
 	bool force = (cpc->reason & CP_DISCARD);
-	bool need_align = test_opt(sbi, LFS) && sbi->segs_per_sec > 1;
+	bool need_align = test_opt(sbi, LFS) && __is_large_section(sbi);
 
 	mutex_lock(&dirty_i->seglist_lock);
 
@@ -1866,7 +1972,7 @@
 					(end - 1) <= cpc->trim_end)
 				continue;
 
-		if (!test_opt(sbi, LFS) || sbi->segs_per_sec == 1) {
+		if (!test_opt(sbi, LFS) || !__is_large_section(sbi)) {
 			f2fs_issue_discard(sbi, START_BLOCK(sbi, start),
 				(end - start) << sbi->log_blocks_per_seg);
 			continue;
@@ -1898,7 +2004,7 @@
 					sbi->blocks_per_seg, cur_pos);
 			len = next_pos - cur_pos;
 
-			if (f2fs_sb_has_blkzoned(sbi->sb) ||
+			if (f2fs_sb_has_blkzoned(sbi) ||
 			    (force && len < cpc->trim_minlen))
 				goto skip;
 
@@ -1946,13 +2052,13 @@
 	INIT_LIST_HEAD(&dcc->fstrim_list);
 	mutex_init(&dcc->cmd_lock);
 	atomic_set(&dcc->issued_discard, 0);
-	atomic_set(&dcc->issing_discard, 0);
+	atomic_set(&dcc->queued_discard, 0);
 	atomic_set(&dcc->discard_cmd_cnt, 0);
 	dcc->nr_discards = 0;
 	dcc->max_discards = MAIN_SEGS(sbi) << sbi->log_blocks_per_seg;
 	dcc->undiscard_blks = 0;
 	dcc->next_pos = 0;
-	dcc->root = RB_ROOT;
+	dcc->root = RB_ROOT_CACHED;
 	dcc->rbtree_check = false;
 
 	init_waitqueue_head(&dcc->discard_wait_queue);
@@ -1962,7 +2068,7 @@
 				"f2fs_discard-%u:%u", MAJOR(dev), MINOR(dev));
 	if (IS_ERR(dcc->f2fs_issue_discard)) {
 		err = PTR_ERR(dcc->f2fs_issue_discard);
-		kfree(dcc);
+		kvfree(dcc);
 		SM_I(sbi)->dcc_info = NULL;
 		return err;
 	}
@@ -1979,7 +2085,14 @@
 
 	f2fs_stop_discard_thread(sbi);
 
-	kfree(dcc);
+	/*
+	 * Recovery can cache discard commands, so in error path of
+	 * fill_super(), it needs to give a chance to handle them.
+	 */
+	if (unlikely(atomic_read(&dcc->discard_cmd_cnt)))
+		f2fs_issue_discard_timeout(sbi);
+
+	kvfree(dcc);
 	SM_I(sbi)->dcc_info = NULL;
 }
 
@@ -2035,15 +2148,14 @@
 		mir_exist = f2fs_test_and_set_bit(offset,
 						se->cur_valid_map_mir);
 		if (unlikely(exist != mir_exist)) {
-			f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error "
-				"when setting bitmap, blk:%u, old bit:%d",
-				blkaddr, exist);
+			f2fs_err(sbi, "Inconsistent error when setting bitmap, blk:%u, old bit:%d",
+				 blkaddr, exist);
 			f2fs_bug_on(sbi, 1);
 		}
 #endif
 		if (unlikely(exist)) {
-			f2fs_msg(sbi->sb, KERN_ERR,
-				"Bitmap was wrongly set, blk:%u", blkaddr);
+			f2fs_err(sbi, "Bitmap was wrongly set, blk:%u",
+				 blkaddr);
 			f2fs_bug_on(sbi, 1);
 			se->valid_blocks--;
 			del = 0;
@@ -2052,8 +2164,11 @@
 		if (!f2fs_test_and_set_bit(offset, se->discard_map))
 			sbi->discard_blks--;
 
-		/* don't overwrite by SSR to keep node chain */
-		if (IS_NODESEG(se->type)) {
+		/*
+		 * SSR should never reuse block which is checkpointed
+		 * or newly invalidated.
+		 */
+		if (!is_sbi_flag_set(sbi, SBI_CP_DISABLED)) {
 			if (!f2fs_test_and_set_bit(offset, se->ckpt_valid_map))
 				se->ckpt_valid_blocks++;
 		}
@@ -2063,18 +2178,29 @@
 		mir_exist = f2fs_test_and_clear_bit(offset,
 						se->cur_valid_map_mir);
 		if (unlikely(exist != mir_exist)) {
-			f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error "
-				"when clearing bitmap, blk:%u, old bit:%d",
-				blkaddr, exist);
+			f2fs_err(sbi, "Inconsistent error when clearing bitmap, blk:%u, old bit:%d",
+				 blkaddr, exist);
 			f2fs_bug_on(sbi, 1);
 		}
 #endif
 		if (unlikely(!exist)) {
-			f2fs_msg(sbi->sb, KERN_ERR,
-				"Bitmap was wrongly cleared, blk:%u", blkaddr);
+			f2fs_err(sbi, "Bitmap was wrongly cleared, blk:%u",
+				 blkaddr);
 			f2fs_bug_on(sbi, 1);
 			se->valid_blocks++;
 			del = 0;
+		} else if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
+			/*
+			 * If checkpoints are off, we must not reuse data that
+			 * was used in the previous checkpoint. If it was used
+			 * before, we must track that to know how much space we
+			 * really have.
+			 */
+			if (f2fs_test_bit(offset, se->ckpt_valid_map)) {
+				spin_lock(&sbi->stat_lock);
+				sbi->unusable_block_count++;
+				spin_unlock(&sbi->stat_lock);
+			}
 		}
 
 		if (f2fs_test_and_clear_bit(offset, se->discard_map))
@@ -2088,7 +2214,7 @@
 	/* update total number of valid blocks to be written in ckpt area */
 	SIT_I(sbi)->written_valid_blocks += del;
 
-	if (sbi->segs_per_sec > 1)
+	if (__is_large_section(sbi))
 		get_sec_entry(sbi, segno)->valid_blocks += del;
 }
 
@@ -2121,7 +2247,7 @@
 	struct seg_entry *se;
 	bool is_cp = false;
 
-	if (!is_valid_data_blkaddr(sbi, blkaddr))
+	if (!__is_valid_data_blkaddr(blkaddr))
 		return true;
 
 	down_read(&sit_i->sentry_lock);
@@ -2354,9 +2480,12 @@
 static unsigned int __get_next_segno(struct f2fs_sb_info *sbi, int type)
 {
 	/* if segs_per_sec is large than 1, we need to keep original policy. */
-	if (sbi->segs_per_sec != 1)
+	if (__is_large_section(sbi))
 		return CURSEG_I(sbi, type)->segno;
 
+	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
+		return 0;
+
 	if (test_opt(sbi, NOHEAP) &&
 		(type == CURSEG_HOT_DATA || IS_NODESEG(type)))
 		return 0;
@@ -2454,6 +2583,7 @@
 	__next_free_blkoff(sbi, curseg, 0);
 
 	sum_page = f2fs_get_sum_page(sbi, new_segno);
+	f2fs_bug_on(sbi, IS_ERR(sum_page));
 	sum_node = (struct f2fs_summary_block *)page_address(sum_page);
 	memcpy(curseg->sum_blk, sum_node, SUM_ENTRY_SIZE);
 	f2fs_put_page(sum_page, 1);
@@ -2500,6 +2630,15 @@
 			return 1;
 		}
 	}
+
+	/* find valid_blocks=0 in dirty list */
+	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
+		segno = get_free_segment(sbi);
+		if (segno != NULL_SEGNO) {
+			curseg->next_segno = segno;
+			return 1;
+		}
+	}
 	return 0;
 }
 
@@ -2517,7 +2656,8 @@
 	else if (!is_set_ckpt_flags(sbi, CP_CRC_RECOVERY_FLAG) &&
 					type == CURSEG_WARM_NODE)
 		new_curseg(sbi, type, false);
-	else if (curseg->alloc_type == LFS && is_next_segment_free(sbi, type))
+	else if (curseg->alloc_type == LFS && is_next_segment_free(sbi, type) &&
+			likely(!is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
 		new_curseg(sbi, type, false);
 	else if (f2fs_need_SSR(sbi) && get_ssr_segment(sbi, type))
 		change_curseg(sbi, type);
@@ -2527,7 +2667,40 @@
 	stat_inc_seg_type(sbi, curseg);
 }
 
-void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi)
+void allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type,
+					unsigned int start, unsigned int end)
+{
+	struct curseg_info *curseg = CURSEG_I(sbi, type);
+	unsigned int segno;
+
+	down_read(&SM_I(sbi)->curseg_lock);
+	mutex_lock(&curseg->curseg_mutex);
+	down_write(&SIT_I(sbi)->sentry_lock);
+
+	segno = CURSEG_I(sbi, type)->segno;
+	if (segno < start || segno > end)
+		goto unlock;
+
+	if (f2fs_need_SSR(sbi) && get_ssr_segment(sbi, type))
+		change_curseg(sbi, type);
+	else
+		new_curseg(sbi, type, true);
+
+	stat_inc_seg_type(sbi, curseg);
+
+	locate_dirty_segment(sbi, segno);
+unlock:
+	up_write(&SIT_I(sbi)->sentry_lock);
+
+	if (segno != curseg->segno)
+		f2fs_notice(sbi, "For resize: curseg of type %d: %u ==> %u",
+			    type, segno, curseg->segno);
+
+	mutex_unlock(&curseg->curseg_mutex);
+	up_read(&SM_I(sbi)->curseg_lock);
+}
+
+void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi, int type)
 {
 	struct curseg_info *curseg;
 	unsigned int old_segno;
@@ -2536,10 +2709,17 @@
 	down_write(&SIT_I(sbi)->sentry_lock);
 
 	for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
+		if (type != NO_CHECK_TYPE && i != type)
+			continue;
+
 		curseg = CURSEG_I(sbi, i);
-		old_segno = curseg->segno;
-		SIT_I(sbi)->s_ops->allocate_segment(sbi, i, true);
-		locate_dirty_segment(sbi, old_segno);
+		if (type == NO_CHECK_TYPE || curseg->next_blkoff ||
+				get_valid_blocks(sbi, curseg->segno, false) ||
+				get_ckpt_valid_blocks(sbi, curseg->segno)) {
+			old_segno = curseg->segno;
+			SIT_I(sbi)->s_ops->allocate_segment(sbi, i, true);
+			locate_dirty_segment(sbi, old_segno);
+		}
 	}
 
 	up_write(&SIT_I(sbi)->sentry_lock);
@@ -2592,7 +2772,7 @@
 					NULL, start,
 					(struct rb_entry **)&prev_dc,
 					(struct rb_entry **)&next_dc,
-					&insert_p, &insert_parent, true);
+					&insert_p, &insert_parent, true, NULL);
 	if (!dc)
 		dc = next_dc;
 
@@ -2650,7 +2830,7 @@
 	struct discard_policy dpolicy;
 	unsigned long long trimmed = 0;
 	int err = 0;
-	bool need_align = test_opt(sbi, LFS) && sbi->segs_per_sec > 1;
+	bool need_align = test_opt(sbi, LFS) && __is_large_section(sbi);
 
 	if (start >= MAX_BLKADDR(sbi) || range->len < sbi->blocksize)
 		return -EINVAL;
@@ -2659,8 +2839,7 @@
 		goto out;
 
 	if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) {
-		f2fs_msg(sbi->sb, KERN_WARNING,
-			"Found FS corruption, run fsck to fix.");
+		f2fs_warn(sbi, "Found FS corruption, run fsck to fix.");
 		return -EFSCORRUPTED;
 	}
 
@@ -2906,6 +3085,19 @@
 {
 	struct sit_info *sit_i = SIT_I(sbi);
 	struct curseg_info *curseg = CURSEG_I(sbi, type);
+	bool put_pin_sem = false;
+
+	if (type == CURSEG_COLD_DATA) {
+		/* GC during CURSEG_COLD_DATA_PINNED allocation */
+		if (down_read_trylock(&sbi->pin_sem)) {
+			put_pin_sem = true;
+		} else {
+			type = CURSEG_WARM_DATA;
+			curseg = CURSEG_I(sbi, type);
+		}
+	} else if (type == CURSEG_COLD_DATA_PINNED) {
+		type = CURSEG_COLD_DATA;
+	}
 
 	down_read(&SM_I(sbi)->curseg_lock);
 
@@ -2954,12 +3146,14 @@
 		f2fs_inode_chksum_set(sbi, page);
 	}
 
+	if (F2FS_IO_ALIGNED(sbi))
+		fio->retry = false;
+
 	if (add_list) {
 		struct f2fs_bio_info *io;
 
 		INIT_LIST_HEAD(&fio->list);
 		fio->in_list = true;
-		fio->retry = false;
 		io = sbi->write_io[fio->type] + fio->temp;
 		spin_lock(&io->io_lock);
 		list_add_tail(&fio->list, &io->io_list);
@@ -2969,6 +3163,9 @@
 	mutex_unlock(&curseg->curseg_mutex);
 
 	up_read(&SM_I(sbi)->curseg_lock);
+
+	if (put_pin_sem)
+		up_read(&sbi->pin_sem);
 }
 
 static void update_device_state(struct f2fs_io_info *fio)
@@ -3042,6 +3239,7 @@
 	ClearPageError(page);
 	f2fs_submit_page_write(&fio);
 
+	stat_inc_meta_count(sbi, page->index);
 	f2fs_update_iostat(sbi, io_type, F2FS_BLKSIZE);
 }
 
@@ -3083,16 +3281,21 @@
 
 	if (!IS_DATASEG(get_seg_entry(sbi, segno)->type)) {
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
+		f2fs_warn(sbi, "%s: incorrect segment(%u) type, run fsck to fix.",
+			  __func__, segno);
 		return -EFSCORRUPTED;
 	}
 
 	stat_inc_inplace_blocks(fio->sbi);
 
-	err = f2fs_submit_page_bio(fio);
-	if (!err)
+	if (fio->bio)
+		err = f2fs_merge_page_bio(fio);
+	else
+		err = f2fs_submit_page_bio(fio);
+	if (!err) {
 		update_device_state(fio);
-
-	f2fs_update_iostat(fio->sbi, fio->io_type, F2FS_BLKSIZE);
+		f2fs_update_iostat(fio->sbi, fio->io_type, F2FS_BLKSIZE);
+	}
 
 	return err;
 }
@@ -3204,17 +3407,21 @@
 }
 
 void f2fs_wait_on_page_writeback(struct page *page,
-				enum page_type type, bool ordered)
+				enum page_type type, bool ordered, bool locked)
 {
 	if (PageWriteback(page)) {
 		struct f2fs_sb_info *sbi = F2FS_P_SB(page);
 
-		f2fs_submit_merged_write_cond(sbi, page->mapping->host,
-						0, page->index, type);
-		if (ordered)
+		/* submit cached LFS IO */
+		f2fs_submit_merged_write_cond(sbi, NULL, page, 0, type);
+		/* sbumit cached IPU IO */
+		f2fs_submit_merged_ipu_write(sbi, NULL, page);
+		if (ordered) {
 			wait_on_page_writeback(page);
-		else
+			f2fs_bug_on(sbi, locked && PageWriteback(page));
+		} else {
 			wait_for_stable_page(page);
+		}
 	}
 }
 
@@ -3226,16 +3433,25 @@
 	if (!f2fs_post_read_required(inode))
 		return;
 
-	if (!is_valid_data_blkaddr(sbi, blkaddr))
+	if (!__is_valid_data_blkaddr(blkaddr))
 		return;
 
 	cpage = find_lock_page(META_MAPPING(sbi), blkaddr);
 	if (cpage) {
-		f2fs_wait_on_page_writeback(cpage, DATA, true);
+		f2fs_wait_on_page_writeback(cpage, DATA, true, true);
 		f2fs_put_page(cpage, 1);
 	}
 }
 
+void f2fs_wait_on_block_writeback_range(struct inode *inode, block_t blkaddr,
+								block_t len)
+{
+	block_t i;
+
+	for (i = 0; i < len; i++)
+		f2fs_wait_on_block_writeback(inode, blkaddr + i);
+}
+
 static int read_compacted_summaries(struct f2fs_sb_info *sbi)
 {
 	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
@@ -3406,8 +3622,11 @@
 
 	/* sanity check for summary blocks */
 	if (nats_in_cursum(nat_j) > NAT_JOURNAL_ENTRIES ||
-			sits_in_cursum(sit_j) > SIT_JOURNAL_ENTRIES)
+			sits_in_cursum(sit_j) > SIT_JOURNAL_ENTRIES) {
+		f2fs_err(sbi, "invalid journal entries nats %u sits %u\n",
+			 nats_in_cursum(nat_j), sits_in_cursum(sit_j));
 		return -EINVAL;
+	}
 
 	return 0;
 }
@@ -3638,7 +3857,7 @@
 	struct f2fs_journal *journal = curseg->journal;
 	struct sit_entry_set *ses, *tmp;
 	struct list_head *head = &SM_I(sbi)->sit_entry_set;
-	bool to_journal = true;
+	bool to_journal = !is_sbi_flag_set(sbi, SBI_IS_RESIZEFS);
 	struct seg_entry *se;
 
 	down_write(&sit_i->sentry_lock);
@@ -3657,7 +3876,8 @@
 	 * entries, remove all entries from journal and add and account
 	 * them in sit entry set.
 	 */
-	if (!__has_cursum_space(journal, sit_i->dirty_sentries, SIT_JOURNAL))
+	if (!__has_cursum_space(journal, sit_i->dirty_sentries, SIT_JOURNAL) ||
+								!to_journal)
 		remove_sits_in_journal(sbi);
 
 	/*
@@ -3754,8 +3974,8 @@
 	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
 	struct sit_info *sit_i;
 	unsigned int sit_segs, start;
-	char *src_bitmap;
-	unsigned int bitmap_size;
+	char *src_bitmap, *bitmap;
+	unsigned int bitmap_size, main_bitmap_size, sit_bitmap_size;
 
 	/* allocate memory for SIT information */
 	sit_i = f2fs_kzalloc(sbi, sizeof(struct sit_info), GFP_KERNEL);
@@ -3771,40 +3991,44 @@
 	if (!sit_i->sentries)
 		return -ENOMEM;
 
-	bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi));
-	sit_i->dirty_sentries_bitmap = f2fs_kvzalloc(sbi, bitmap_size,
+	main_bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi));
+	sit_i->dirty_sentries_bitmap = f2fs_kvzalloc(sbi, main_bitmap_size,
 								GFP_KERNEL);
 	if (!sit_i->dirty_sentries_bitmap)
 		return -ENOMEM;
 
+#ifdef CONFIG_F2FS_CHECK_FS
+	bitmap_size = MAIN_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE * 4;
+#else
+	bitmap_size = MAIN_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE * 3;
+#endif
+	sit_i->bitmap = f2fs_kvzalloc(sbi, bitmap_size, GFP_KERNEL);
+	if (!sit_i->bitmap)
+		return -ENOMEM;
+
+	bitmap = sit_i->bitmap;
+
 	for (start = 0; start < MAIN_SEGS(sbi); start++) {
-		sit_i->sentries[start].cur_valid_map
-			= f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
-		sit_i->sentries[start].ckpt_valid_map
-			= f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
-		if (!sit_i->sentries[start].cur_valid_map ||
-				!sit_i->sentries[start].ckpt_valid_map)
-			return -ENOMEM;
+		sit_i->sentries[start].cur_valid_map = bitmap;
+		bitmap += SIT_VBLOCK_MAP_SIZE;
+
+		sit_i->sentries[start].ckpt_valid_map = bitmap;
+		bitmap += SIT_VBLOCK_MAP_SIZE;
 
 #ifdef CONFIG_F2FS_CHECK_FS
-		sit_i->sentries[start].cur_valid_map_mir
-			= f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
-		if (!sit_i->sentries[start].cur_valid_map_mir)
-			return -ENOMEM;
+		sit_i->sentries[start].cur_valid_map_mir = bitmap;
+		bitmap += SIT_VBLOCK_MAP_SIZE;
 #endif
 
-		sit_i->sentries[start].discard_map
-			= f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE,
-							GFP_KERNEL);
-		if (!sit_i->sentries[start].discard_map)
-			return -ENOMEM;
+		sit_i->sentries[start].discard_map = bitmap;
+		bitmap += SIT_VBLOCK_MAP_SIZE;
 	}
 
 	sit_i->tmp_map = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
 	if (!sit_i->tmp_map)
 		return -ENOMEM;
 
-	if (sbi->segs_per_sec > 1) {
+	if (__is_large_section(sbi)) {
 		sit_i->sec_entries =
 			f2fs_kvzalloc(sbi, array_size(sizeof(struct sec_entry),
 						      MAIN_SECS(sbi)),
@@ -3817,17 +4041,23 @@
 	sit_segs = le32_to_cpu(raw_super->segment_count_sit) >> 1;
 
 	/* setup SIT bitmap from ckeckpoint pack */
-	bitmap_size = __bitmap_size(sbi, SIT_BITMAP);
+	sit_bitmap_size = __bitmap_size(sbi, SIT_BITMAP);
 	src_bitmap = __bitmap_ptr(sbi, SIT_BITMAP);
 
-	sit_i->sit_bitmap = kmemdup(src_bitmap, bitmap_size, GFP_KERNEL);
+	sit_i->sit_bitmap = kmemdup(src_bitmap, sit_bitmap_size, GFP_KERNEL);
 	if (!sit_i->sit_bitmap)
 		return -ENOMEM;
 
 #ifdef CONFIG_F2FS_CHECK_FS
-	sit_i->sit_bitmap_mir = kmemdup(src_bitmap, bitmap_size, GFP_KERNEL);
+	sit_i->sit_bitmap_mir = kmemdup(src_bitmap,
+					sit_bitmap_size, GFP_KERNEL);
 	if (!sit_i->sit_bitmap_mir)
 		return -ENOMEM;
+
+	sit_i->invalid_segmap = f2fs_kvzalloc(sbi,
+					main_bitmap_size, GFP_KERNEL);
+	if (!sit_i->invalid_segmap)
+		return -ENOMEM;
 #endif
 
 	/* init SIT information */
@@ -3836,7 +4066,7 @@
 	sit_i->sit_base_addr = le32_to_cpu(raw_super->sit_blkaddr);
 	sit_i->sit_blocks = sit_segs << sbi->log_blocks_per_seg;
 	sit_i->written_valid_blocks = 0;
-	sit_i->bitmap_size = bitmap_size;
+	sit_i->bitmap_size = sit_bitmap_size;
 	sit_i->dirty_sentries = 0;
 	sit_i->sents_per_block = SIT_ENTRY_PER_BLOCK;
 	sit_i->elapsed_time = le64_to_cpu(sbi->ckpt->elapsed_time);
@@ -3933,6 +4163,8 @@
 
 			se = &sit_i->sentries[start];
 			page = get_current_sit_page(sbi, start);
+			if (IS_ERR(page))
+				return PTR_ERR(page);
 			sit_blk = (struct f2fs_sit_block *)page_address(page);
 			sit = sit_blk->entries[SIT_ENTRY_OFFSET(sit_i, start)];
 			f2fs_put_page(page, 1);
@@ -3957,7 +4189,7 @@
 					se->valid_blocks;
 			}
 
-			if (sbi->segs_per_sec > 1)
+			if (__is_large_section(sbi))
 				get_sec_entry(sbi, start)->valid_blocks +=
 							se->valid_blocks;
 		}
@@ -3970,10 +4202,8 @@
 
 		start = le32_to_cpu(segno_in_journal(journal, i));
 		if (start >= MAIN_SEGS(sbi)) {
-			f2fs_msg(sbi->sb, KERN_ERR,
-					"Wrong journal entry on segno %u",
-					start);
-			set_sbi_flag(sbi, SBI_NEED_FSCK);
+			f2fs_err(sbi, "Wrong journal entry on segno %u",
+				 start);
 			err = -EFSCORRUPTED;
 			break;
 		}
@@ -4001,7 +4231,7 @@
 			sbi->discard_blks -= se->valid_blocks;
 		}
 
-		if (sbi->segs_per_sec > 1) {
+		if (__is_large_section(sbi)) {
 			get_sec_entry(sbi, start)->valid_blocks +=
 							se->valid_blocks;
 			get_sec_entry(sbi, start)->valid_blocks -=
@@ -4011,10 +4241,8 @@
 	up_read(&curseg->journal_rwsem);
 
 	if (!err && total_node_blocks != valid_node_count(sbi)) {
-		f2fs_msg(sbi->sb, KERN_ERR,
-			"SIT is corrupted node# %u vs %u",
-			total_node_blocks, valid_node_count(sbi));
-		set_sbi_flag(sbi, SBI_NEED_FSCK);
+		f2fs_err(sbi, "SIT is corrupted node# %u vs %u",
+			 total_node_blocks, valid_node_count(sbi));
 		err = -EFSCORRUPTED;
 	}
 
@@ -4129,12 +4357,10 @@
 			if (!f2fs_test_bit(blkofs, se->cur_valid_map))
 				continue;
 out:
-			f2fs_msg(sbi->sb, KERN_ERR,
-				"Current segment's next free block offset is "
-				"inconsistent with bitmap, logtype:%u, "
-				"segno:%u, type:%u, next_blkoff:%u, blkofs:%u",
-				i, curseg->segno, curseg->alloc_type,
-				curseg->next_blkoff, blkofs);
+			f2fs_err(sbi,
+				 "Current segment's next free block offset is inconsistent with bitmap, logtype:%u, segno:%u, type:%u, next_blkoff:%u, blkofs:%u",
+				 i, curseg->segno, curseg->alloc_type,
+				 curseg->next_blkoff, blkofs);
 			return -EFSCORRUPTED;
 		}
 	}
@@ -4275,7 +4501,7 @@
 
 	destroy_victim_secmap(sbi);
 	SM_I(sbi)->dirty_info = NULL;
-	kfree(dirty_i);
+	kvfree(dirty_i);
 }
 
 static void destroy_curseg(struct f2fs_sb_info *sbi)
@@ -4287,10 +4513,10 @@
 		return;
 	SM_I(sbi)->curseg_array = NULL;
 	for (i = 0; i < NR_CURSEG_TYPE; i++) {
-		kfree(array[i].sum_blk);
-		kfree(array[i].journal);
+		kvfree(array[i].sum_blk);
+		kvfree(array[i].journal);
 	}
-	kfree(array);
+	kvfree(array);
 }
 
 static void destroy_free_segmap(struct f2fs_sb_info *sbi)
@@ -4301,39 +4527,31 @@
 	SM_I(sbi)->free_info = NULL;
 	kvfree(free_i->free_segmap);
 	kvfree(free_i->free_secmap);
-	kfree(free_i);
+	kvfree(free_i);
 }
 
 static void destroy_sit_info(struct f2fs_sb_info *sbi)
 {
 	struct sit_info *sit_i = SIT_I(sbi);
-	unsigned int start;
 
 	if (!sit_i)
 		return;
 
-	if (sit_i->sentries) {
-		for (start = 0; start < MAIN_SEGS(sbi); start++) {
-			kfree(sit_i->sentries[start].cur_valid_map);
-#ifdef CONFIG_F2FS_CHECK_FS
-			kfree(sit_i->sentries[start].cur_valid_map_mir);
-#endif
-			kfree(sit_i->sentries[start].ckpt_valid_map);
-			kfree(sit_i->sentries[start].discard_map);
-		}
-	}
-	kfree(sit_i->tmp_map);
+	if (sit_i->sentries)
+		kvfree(sit_i->bitmap);
+	kvfree(sit_i->tmp_map);
 
 	kvfree(sit_i->sentries);
 	kvfree(sit_i->sec_entries);
 	kvfree(sit_i->dirty_sentries_bitmap);
 
 	SM_I(sbi)->sit_info = NULL;
-	kfree(sit_i->sit_bitmap);
+	kvfree(sit_i->sit_bitmap);
 #ifdef CONFIG_F2FS_CHECK_FS
-	kfree(sit_i->sit_bitmap_mir);
+	kvfree(sit_i->sit_bitmap_mir);
+	kvfree(sit_i->invalid_segmap);
 #endif
-	kfree(sit_i);
+	kvfree(sit_i);
 }
 
 void f2fs_destroy_segment_manager(struct f2fs_sb_info *sbi)
@@ -4349,7 +4567,7 @@
 	destroy_free_segmap(sbi);
 	destroy_sit_info(sbi);
 	sbi->sm_info = NULL;
-	kfree(sm_info);
+	kvfree(sm_info);
 }
 
 int __init f2fs_create_segment_manager_caches(void)
diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h
index 9c2a55a..a95467b 100644
--- a/fs/f2fs/segment.h
+++ b/fs/f2fs/segment.h
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/segment.h
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/blkdev.h>
 #include <linux/backing-dev.h>
@@ -85,7 +82,7 @@
 	(GET_SEGOFF_FROM_SEG0(sbi, blk_addr) & ((sbi)->blocks_per_seg - 1))
 
 #define GET_SEGNO(sbi, blk_addr)					\
-	((!is_valid_data_blkaddr(sbi, blk_addr)) ?			\
+	((!__is_valid_data_blkaddr(blk_addr)) ?			\
 	NULL_SEGNO : GET_L2R_SEGNO(FREE_I(sbi),			\
 		GET_SEGNO_FROM_SEG0(sbi, blk_addr)))
 #define BLKS_PER_SEC(sbi)					\
@@ -112,7 +109,7 @@
 #define	START_SEGNO(segno)		\
 	(SIT_BLOCK_OFFSET(segno) * SIT_ENTRY_PER_BLOCK)
 #define SIT_BLK_CNT(sbi)			\
-	((MAIN_SEGS(sbi) + SIT_ENTRY_PER_BLOCK - 1) / SIT_ENTRY_PER_BLOCK)
+	DIV_ROUND_UP(MAIN_SEGS(sbi), SIT_ENTRY_PER_BLOCK)
 #define f2fs_bitmap_size(nr)			\
 	(BITS_TO_LONGS(nr) * sizeof(unsigned long))
 
@@ -229,9 +226,13 @@
 	block_t sit_base_addr;		/* start block address of SIT area */
 	block_t sit_blocks;		/* # of blocks used by SIT area */
 	block_t written_valid_blocks;	/* # of valid blocks in main area */
+	char *bitmap;			/* all bitmaps pointer */
 	char *sit_bitmap;		/* SIT bitmap pointer */
 #ifdef CONFIG_F2FS_CHECK_FS
 	char *sit_bitmap_mir;		/* SIT bitmap mirror */
+
+	/* bitmap of segments to be ignored by GC in case of errors */
+	unsigned long *invalid_segmap;
 #endif
 	unsigned int bitmap_size;	/* SIT bitmap size */
 
@@ -312,6 +313,8 @@
  */
 static inline struct curseg_info *CURSEG_I(struct f2fs_sb_info *sbi, int type)
 {
+	if (type == CURSEG_COLD_DATA_PINNED)
+		type = CURSEG_COLD_DATA;
 	return (struct curseg_info *)(SM_I(sbi)->curseg_array + type);
 }
 
@@ -336,12 +339,18 @@
 	 * In order to get # of valid blocks in a section instantly from many
 	 * segments, f2fs manages two counting structures separately.
 	 */
-	if (use_section && sbi->segs_per_sec > 1)
+	if (use_section && __is_large_section(sbi))
 		return get_sec_entry(sbi, segno)->valid_blocks;
 	else
 		return get_seg_entry(sbi, segno)->valid_blocks;
 }
 
+static inline unsigned int get_ckpt_valid_blocks(struct f2fs_sb_info *sbi,
+				unsigned int segno)
+{
+	return get_seg_entry(sbi, segno)->ckpt_valid_blocks;
+}
+
 static inline void seg_info_from_raw_sit(struct seg_entry *se,
 					struct f2fs_sit_entry *rs)
 {
@@ -579,6 +588,15 @@
 		reserved_sections(sbi) + needed);
 }
 
+static inline bool f2fs_is_checkpoint_ready(struct f2fs_sb_info *sbi)
+{
+	if (likely(!is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
+		return true;
+	if (likely(!has_not_enough_free_secs(sbi, 0, 0)))
+		return true;
+	return false;
+}
+
 static inline bool excess_prefree_segs(struct f2fs_sb_info *sbi)
 {
 	return prefree_segments(sbi) > SM_I(sbi)->rec_prefree_segments;
@@ -644,14 +662,15 @@
 	f2fs_bug_on(sbi, segno > TOTAL_SEGS(sbi) - 1);
 }
 
-static inline void verify_block_addr(struct f2fs_io_info *fio, block_t blk_addr)
+static inline void verify_fio_blkaddr(struct f2fs_io_info *fio)
 {
 	struct f2fs_sb_info *sbi = fio->sbi;
 
-	if (__is_meta_io(fio))
-		verify_blkaddr(sbi, blk_addr, META_GENERIC);
-	else
-		verify_blkaddr(sbi, blk_addr, DATA_GENERIC);
+	if (__is_valid_data_blkaddr(fio->old_blkaddr))
+		verify_blkaddr(sbi, fio->old_blkaddr, __is_meta_io(fio) ?
+					META_GENERIC : DATA_GENERIC);
+	verify_blkaddr(sbi, fio->new_blkaddr, __is_meta_io(fio) ?
+					META_GENERIC : DATA_GENERIC_ENHANCE);
 }
 
 /*
@@ -680,9 +699,8 @@
 	} while (cur_pos < sbi->blocks_per_seg);
 
 	if (unlikely(GET_SIT_VBLOCKS(raw_sit) != valid_blocks)) {
-		f2fs_msg(sbi->sb, KERN_ERR,
-				"Mismatch valid blocks %d vs. %d",
-					GET_SIT_VBLOCKS(raw_sit), valid_blocks);
+		f2fs_err(sbi, "Mismatch valid blocks %d vs. %d",
+			 GET_SIT_VBLOCKS(raw_sit), valid_blocks);
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
 		return -EFSCORRUPTED;
 	}
@@ -690,9 +708,8 @@
 	/* check segment usage, and check boundary of a given segment number */
 	if (unlikely(GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg
 					|| segno > TOTAL_SEGS(sbi) - 1)) {
-		f2fs_msg(sbi->sb, KERN_ERR,
-				"Wrong valid blocks %d or segno %u",
-					GET_SIT_VBLOCKS(raw_sit), segno);
+		f2fs_err(sbi, "Wrong valid blocks %d or segno %u",
+			 GET_SIT_VBLOCKS(raw_sit), segno);
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
 		return -EFSCORRUPTED;
 	}
@@ -852,7 +869,7 @@
 		}
 	}
 	mutex_unlock(&dcc->cmd_lock);
-	if (!wakeup)
+	if (!wakeup || !is_idle(sbi, DISCARD_TIME))
 		return;
 wake_up:
 	dcc->discard_wake = 1;
diff --git a/fs/f2fs/shrinker.c b/fs/f2fs/shrinker.c
index 29042e6..a467aca 100644
--- a/fs/f2fs/shrinker.c
+++ b/fs/f2fs/shrinker.c
@@ -1,13 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * f2fs shrinker support
  *   the basic infra was copied from fs/ubifs/shrinker.c
  *
  * Copyright (c) 2015 Motorola Mobility
  * Copyright (c) 2015 Jaegeuk Kim <jaegeuk@kernel.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 7a9cc64f..28f63ee 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/super.c
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/module.h>
 #include <linux/init.h>
@@ -26,6 +23,7 @@
 #include <linux/f2fs_fs.h>
 #include <linux/sysfs.h>
 #include <linux/quota.h>
+#include <linux/unicode.h>
 
 #include "f2fs.h"
 #include "node.h"
@@ -41,7 +39,7 @@
 
 #ifdef CONFIG_F2FS_FAULT_INJECTION
 
-char *f2fs_fault_name[FAULT_MAX] = {
+const char *f2fs_fault_name[FAULT_MAX] = {
 	[FAULT_KMALLOC]		= "kmalloc",
 	[FAULT_KVMALLOC]	= "kvmalloc",
 	[FAULT_PAGE_ALLOC]	= "page alloc",
@@ -53,9 +51,10 @@
 	[FAULT_DIR_DEPTH]	= "too big dir depth",
 	[FAULT_EVICT_INODE]	= "evict_inode fail",
 	[FAULT_TRUNCATE]	= "truncate fail",
-	[FAULT_IO]		= "IO error",
+	[FAULT_READ_IO]		= "read IO error",
 	[FAULT_CHECKPOINT]	= "checkpoint error",
 	[FAULT_DISCARD]		= "discard error",
+	[FAULT_WRITE_IO]	= "write IO error",
 };
 
 void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate,
@@ -138,6 +137,11 @@
 	Opt_alloc,
 	Opt_fsync,
 	Opt_test_dummy_encryption,
+	Opt_inlinecrypt,
+	Opt_checkpoint_disable,
+	Opt_checkpoint_disable_cap,
+	Opt_checkpoint_disable_cap_perc,
+	Opt_checkpoint_enable,
 	Opt_err,
 };
 
@@ -196,44 +200,83 @@
 	{Opt_alloc, "alloc_mode=%s"},
 	{Opt_fsync, "fsync_mode=%s"},
 	{Opt_test_dummy_encryption, "test_dummy_encryption"},
+	{Opt_inlinecrypt, "inlinecrypt"},
+	{Opt_checkpoint_disable, "checkpoint=disable"},
+	{Opt_checkpoint_disable_cap, "checkpoint=disable:%u"},
+	{Opt_checkpoint_disable_cap_perc, "checkpoint=disable:%u%%"},
+	{Opt_checkpoint_enable, "checkpoint=enable"},
 	{Opt_err, NULL},
 };
 
-void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...)
+void f2fs_printk(struct f2fs_sb_info *sbi, const char *fmt, ...)
 {
 	struct va_format vaf;
 	va_list args;
+	int level;
 
 	va_start(args, fmt);
-	vaf.fmt = fmt;
+
+	level = printk_get_level(fmt);
+	vaf.fmt = printk_skip_level(fmt);
 	vaf.va = &args;
-	printk_ratelimited("%sF2FS-fs (%s): %pV\n", level, sb->s_id, &vaf);
+	printk("%c%cF2FS-fs (%s): %pV\n",
+	       KERN_SOH_ASCII, level, sbi->sb->s_id, &vaf);
+
 	va_end(args);
 }
 
+#ifdef CONFIG_UNICODE
+static const struct f2fs_sb_encodings {
+	__u16 magic;
+	char *name;
+	char *version;
+} f2fs_sb_encoding_map[] = {
+	{F2FS_ENC_UTF8_12_1, "utf8", "12.1.0"},
+};
+
+static int f2fs_sb_read_encoding(const struct f2fs_super_block *sb,
+				 const struct f2fs_sb_encodings **encoding,
+				 __u16 *flags)
+{
+	__u16 magic = le16_to_cpu(sb->s_encoding);
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(f2fs_sb_encoding_map); i++)
+		if (magic == f2fs_sb_encoding_map[i].magic)
+			break;
+
+	if (i >= ARRAY_SIZE(f2fs_sb_encoding_map))
+		return -EINVAL;
+
+	*encoding = &f2fs_sb_encoding_map[i];
+	*flags = le16_to_cpu(sb->s_encoding_flags);
+
+	return 0;
+}
+#endif
+
 static inline void limit_reserve_root(struct f2fs_sb_info *sbi)
 {
-	block_t limit = (sbi->user_block_count << 1) / 1000;
+	block_t limit = min((sbi->user_block_count << 1) / 1000,
+			sbi->user_block_count - sbi->reserved_blocks);
 
 	/* limit is 0.2% */
 	if (test_opt(sbi, RESERVE_ROOT) &&
 			F2FS_OPTION(sbi).root_reserved_blocks > limit) {
 		F2FS_OPTION(sbi).root_reserved_blocks = limit;
-		f2fs_msg(sbi->sb, KERN_INFO,
-			"Reduce reserved blocks for root = %u",
-			F2FS_OPTION(sbi).root_reserved_blocks);
+		f2fs_info(sbi, "Reduce reserved blocks for root = %u",
+			  F2FS_OPTION(sbi).root_reserved_blocks);
 	}
 	if (!test_opt(sbi, RESERVE_ROOT) &&
 		(!uid_eq(F2FS_OPTION(sbi).s_resuid,
 				make_kuid(&init_user_ns, F2FS_DEF_RESUID)) ||
 		!gid_eq(F2FS_OPTION(sbi).s_resgid,
 				make_kgid(&init_user_ns, F2FS_DEF_RESGID))))
-		f2fs_msg(sbi->sb, KERN_INFO,
-			"Ignore s_resuid=%u, s_resgid=%u w/o reserve_root",
-				from_kuid_munged(&init_user_ns,
-					F2FS_OPTION(sbi).s_resuid),
-				from_kgid_munged(&init_user_ns,
-					F2FS_OPTION(sbi).s_resgid));
+		f2fs_info(sbi, "Ignore s_resuid=%u, s_resgid=%u w/o reserve_root",
+			  from_kuid_munged(&init_user_ns,
+					   F2FS_OPTION(sbi).s_resuid),
+			  from_kgid_munged(&init_user_ns,
+					   F2FS_OPTION(sbi).s_resgid));
 }
 
 static void init_once(void *foo)
@@ -254,42 +297,36 @@
 	int ret = -EINVAL;
 
 	if (sb_any_quota_loaded(sb) && !F2FS_OPTION(sbi).s_qf_names[qtype]) {
-		f2fs_msg(sb, KERN_ERR,
-			"Cannot change journaled "
-			"quota options when quota turned on");
+		f2fs_err(sbi, "Cannot change journaled quota options when quota turned on");
 		return -EINVAL;
 	}
-	if (f2fs_sb_has_quota_ino(sb)) {
-		f2fs_msg(sb, KERN_INFO,
-			"QUOTA feature is enabled, so ignore qf_name");
+	if (f2fs_sb_has_quota_ino(sbi)) {
+		f2fs_info(sbi, "QUOTA feature is enabled, so ignore qf_name");
 		return 0;
 	}
 
 	qname = match_strdup(args);
 	if (!qname) {
-		f2fs_msg(sb, KERN_ERR,
-			"Not enough memory for storing quotafile name");
-		return -EINVAL;
+		f2fs_err(sbi, "Not enough memory for storing quotafile name");
+		return -ENOMEM;
 	}
 	if (F2FS_OPTION(sbi).s_qf_names[qtype]) {
 		if (strcmp(F2FS_OPTION(sbi).s_qf_names[qtype], qname) == 0)
 			ret = 0;
 		else
-			f2fs_msg(sb, KERN_ERR,
-				 "%s quota file already specified",
+			f2fs_err(sbi, "%s quota file already specified",
 				 QTYPE2NAME(qtype));
 		goto errout;
 	}
 	if (strchr(qname, '/')) {
-		f2fs_msg(sb, KERN_ERR,
-			"quotafile must be on filesystem root");
+		f2fs_err(sbi, "quotafile must be on filesystem root");
 		goto errout;
 	}
 	F2FS_OPTION(sbi).s_qf_names[qtype] = qname;
 	set_opt(sbi, QUOTA);
 	return 0;
 errout:
-	kfree(qname);
+	kvfree(qname);
 	return ret;
 }
 
@@ -298,11 +335,10 @@
 	struct f2fs_sb_info *sbi = F2FS_SB(sb);
 
 	if (sb_any_quota_loaded(sb) && F2FS_OPTION(sbi).s_qf_names[qtype]) {
-		f2fs_msg(sb, KERN_ERR, "Cannot change journaled quota options"
-			" when quota turned on");
+		f2fs_err(sbi, "Cannot change journaled quota options when quota turned on");
 		return -EINVAL;
 	}
-	kfree(F2FS_OPTION(sbi).s_qf_names[qtype]);
+	kvfree(F2FS_OPTION(sbi).s_qf_names[qtype]);
 	F2FS_OPTION(sbi).s_qf_names[qtype] = NULL;
 	return 0;
 }
@@ -314,9 +350,8 @@
 	 * 'grpquota' mount options are allowed even without quota feature
 	 * to support legacy quotas in quota files.
 	 */
-	if (test_opt(sbi, PRJQUOTA) && !f2fs_sb_has_project_quota(sbi->sb)) {
-		f2fs_msg(sbi->sb, KERN_ERR, "Project quota feature not enabled. "
-			 "Cannot enable project quota enforcement.");
+	if (test_opt(sbi, PRJQUOTA) && !f2fs_sb_has_project_quota(sbi)) {
+		f2fs_err(sbi, "Project quota feature not enabled. Cannot enable project quota enforcement.");
 		return -1;
 	}
 	if (F2FS_OPTION(sbi).s_qf_names[USRQUOTA] ||
@@ -336,21 +371,18 @@
 
 		if (test_opt(sbi, GRPQUOTA) || test_opt(sbi, USRQUOTA) ||
 				test_opt(sbi, PRJQUOTA)) {
-			f2fs_msg(sbi->sb, KERN_ERR, "old and new quota "
-					"format mixing");
+			f2fs_err(sbi, "old and new quota format mixing");
 			return -1;
 		}
 
 		if (!F2FS_OPTION(sbi).s_jquota_fmt) {
-			f2fs_msg(sbi->sb, KERN_ERR, "journaled quota format "
-					"not specified");
+			f2fs_err(sbi, "journaled quota format not specified");
 			return -1;
 		}
 	}
 
-	if (f2fs_sb_has_quota_ino(sbi->sb) && F2FS_OPTION(sbi).s_jquota_fmt) {
-		f2fs_msg(sbi->sb, KERN_INFO,
-			"QUOTA feature is enabled, so ignore jquota_fmt");
+	if (f2fs_sb_has_quota_ino(sbi) && F2FS_OPTION(sbi).s_jquota_fmt) {
+		f2fs_info(sbi, "QUOTA feature is enabled, so ignore jquota_fmt");
 		F2FS_OPTION(sbi).s_jquota_fmt = 0;
 	}
 	return 0;
@@ -399,10 +431,10 @@
 				set_opt(sbi, BG_GC);
 				set_opt(sbi, FORCE_FG_GC);
 			} else {
-				kfree(name);
+				kvfree(name);
 				return -EINVAL;
 			}
-			kfree(name);
+			kvfree(name);
 			break;
 		case Opt_disable_roll_forward:
 			set_opt(sbi, DISABLE_ROLL_FORWARD);
@@ -417,9 +449,8 @@
 			set_opt(sbi, DISCARD);
 			break;
 		case Opt_nodiscard:
-			if (f2fs_sb_has_blkzoned(sb)) {
-				f2fs_msg(sb, KERN_WARNING,
-					"discard is required for zoned block devices");
+			if (f2fs_sb_has_blkzoned(sbi)) {
+				f2fs_warn(sbi, "discard is required for zoned block devices");
 				return -EINVAL;
 			}
 			clear_opt(sbi, DISCARD);
@@ -451,20 +482,16 @@
 			break;
 #else
 		case Opt_user_xattr:
-			f2fs_msg(sb, KERN_INFO,
-				"user_xattr options not supported");
+			f2fs_info(sbi, "user_xattr options not supported");
 			break;
 		case Opt_nouser_xattr:
-			f2fs_msg(sb, KERN_INFO,
-				"nouser_xattr options not supported");
+			f2fs_info(sbi, "nouser_xattr options not supported");
 			break;
 		case Opt_inline_xattr:
-			f2fs_msg(sb, KERN_INFO,
-				"inline_xattr options not supported");
+			f2fs_info(sbi, "inline_xattr options not supported");
 			break;
 		case Opt_noinline_xattr:
-			f2fs_msg(sb, KERN_INFO,
-				"noinline_xattr options not supported");
+			f2fs_info(sbi, "noinline_xattr options not supported");
 			break;
 #endif
 #ifdef CONFIG_F2FS_FS_POSIX_ACL
@@ -476,10 +503,10 @@
 			break;
 #else
 		case Opt_acl:
-			f2fs_msg(sb, KERN_INFO, "acl options not supported");
+			f2fs_info(sbi, "acl options not supported");
 			break;
 		case Opt_noacl:
-			f2fs_msg(sb, KERN_INFO, "noacl options not supported");
+			f2fs_info(sbi, "noacl options not supported");
 			break;
 #endif
 		case Opt_active_logs:
@@ -529,9 +556,8 @@
 			if (args->from && match_int(args, &arg))
 				return -EINVAL;
 			if (test_opt(sbi, RESERVE_ROOT)) {
-				f2fs_msg(sb, KERN_INFO,
-					"Preserve previous reserve_root=%u",
-					F2FS_OPTION(sbi).root_reserved_blocks);
+				f2fs_info(sbi, "Preserve previous reserve_root=%u",
+					  F2FS_OPTION(sbi).root_reserved_blocks);
 			} else {
 				F2FS_OPTION(sbi).root_reserved_blocks = arg;
 				set_opt(sbi, RESERVE_ROOT);
@@ -542,8 +568,7 @@
 				return -EINVAL;
 			uid = make_kuid(current_user_ns(), arg);
 			if (!uid_valid(uid)) {
-				f2fs_msg(sb, KERN_ERR,
-					"Invalid uid value %d", arg);
+				f2fs_err(sbi, "Invalid uid value %d", arg);
 				return -EINVAL;
 			}
 			F2FS_OPTION(sbi).s_resuid = uid;
@@ -553,8 +578,7 @@
 				return -EINVAL;
 			gid = make_kgid(current_user_ns(), arg);
 			if (!gid_valid(gid)) {
-				f2fs_msg(sb, KERN_ERR,
-					"Invalid gid value %d", arg);
+				f2fs_err(sbi, "Invalid gid value %d", arg);
 				return -EINVAL;
 			}
 			F2FS_OPTION(sbi).s_resgid = gid;
@@ -566,11 +590,9 @@
 				return -ENOMEM;
 			if (strlen(name) == 8 &&
 					!strncmp(name, "adaptive", 8)) {
-				if (f2fs_sb_has_blkzoned(sb)) {
-					f2fs_msg(sb, KERN_WARNING,
-						 "adaptive mode is not allowed with "
-						 "zoned block device feature");
-					kfree(name);
+				if (f2fs_sb_has_blkzoned(sbi)) {
+					f2fs_warn(sbi, "adaptive mode is not allowed with zoned block device feature");
+					kvfree(name);
 					return -EINVAL;
 				}
 				set_opt_mode(sbi, F2FS_MOUNT_ADAPTIVE);
@@ -578,44 +600,44 @@
 					!strncmp(name, "lfs", 3)) {
 				set_opt_mode(sbi, F2FS_MOUNT_LFS);
 			} else {
-				kfree(name);
+				kvfree(name);
 				return -EINVAL;
 			}
-			kfree(name);
+			kvfree(name);
 			break;
 		case Opt_io_size_bits:
 			if (args->from && match_int(args, &arg))
 				return -EINVAL;
-			if (arg > __ilog2_u32(BIO_MAX_PAGES)) {
-				f2fs_msg(sb, KERN_WARNING,
-					"Not support %d, larger than %d",
-					1 << arg, BIO_MAX_PAGES);
+			if (arg <= 0 || arg > __ilog2_u32(BIO_MAX_PAGES)) {
+				f2fs_warn(sbi, "Not support %d, larger than %d",
+					  1 << arg, BIO_MAX_PAGES);
 				return -EINVAL;
 			}
 			F2FS_OPTION(sbi).write_io_size_bits = arg;
 			break;
+#ifdef CONFIG_F2FS_FAULT_INJECTION
 		case Opt_fault_injection:
 			if (args->from && match_int(args, &arg))
 				return -EINVAL;
-#ifdef CONFIG_F2FS_FAULT_INJECTION
 			f2fs_build_fault_attr(sbi, arg, F2FS_ALL_FAULT_TYPE);
 			set_opt(sbi, FAULT_INJECTION);
-#else
-			f2fs_msg(sb, KERN_INFO,
-				"FAULT_INJECTION was not selected");
-#endif
 			break;
+
 		case Opt_fault_type:
 			if (args->from && match_int(args, &arg))
 				return -EINVAL;
-#ifdef CONFIG_F2FS_FAULT_INJECTION
 			f2fs_build_fault_attr(sbi, 0, arg);
 			set_opt(sbi, FAULT_INJECTION);
-#else
-			f2fs_msg(sb, KERN_INFO,
-				"FAULT_INJECTION was not selected");
-#endif
 			break;
+#else
+		case Opt_fault_injection:
+			f2fs_info(sbi, "fault_injection options not supported");
+			break;
+
+		case Opt_fault_type:
+			f2fs_info(sbi, "fault_type options not supported");
+			break;
+#endif
 		case Opt_lazytime:
 			sb->s_flags |= SB_LAZYTIME;
 			break;
@@ -693,8 +715,7 @@
 		case Opt_jqfmt_vfsv0:
 		case Opt_jqfmt_vfsv1:
 		case Opt_noquota:
-			f2fs_msg(sb, KERN_INFO,
-					"quota operations not supported");
+			f2fs_info(sbi, "quota operations not supported");
 			break;
 #endif
 		case Opt_whint:
@@ -711,10 +732,10 @@
 					!strncmp(name, "fs-based", 8)) {
 				F2FS_OPTION(sbi).whint_mode = WHINT_MODE_FS;
 			} else {
-				kfree(name);
+				kvfree(name);
 				return -EINVAL;
 			}
-			kfree(name);
+			kvfree(name);
 			break;
 		case Opt_alloc:
 			name = match_strdup(&args[0]);
@@ -728,10 +749,10 @@
 					!strncmp(name, "reuse", 5)) {
 				F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_REUSE;
 			} else {
-				kfree(name);
+				kvfree(name);
 				return -EINVAL;
 			}
-			kfree(name);
+			kvfree(name);
 			break;
 		case Opt_fsync:
 			name = match_strdup(&args[0]);
@@ -748,30 +769,59 @@
 				F2FS_OPTION(sbi).fsync_mode =
 							FSYNC_MODE_NOBARRIER;
 			} else {
-				kfree(name);
+				kvfree(name);
 				return -EINVAL;
 			}
-			kfree(name);
+			kvfree(name);
 			break;
 		case Opt_test_dummy_encryption:
-#ifdef CONFIG_F2FS_FS_ENCRYPTION
-			if (!f2fs_sb_has_encrypt(sb)) {
-				f2fs_msg(sb, KERN_ERR, "Encrypt feature is off");
+#ifdef CONFIG_FS_ENCRYPTION
+			if (!f2fs_sb_has_encrypt(sbi)) {
+				f2fs_err(sbi, "Encrypt feature is off");
 				return -EINVAL;
 			}
 
 			F2FS_OPTION(sbi).test_dummy_encryption = true;
-			f2fs_msg(sb, KERN_INFO,
-					"Test dummy encryption mode enabled");
+			f2fs_info(sbi, "Test dummy encryption mode enabled");
 #else
-			f2fs_msg(sb, KERN_INFO,
-					"Test dummy encryption mount option ignored");
+			f2fs_info(sbi, "Test dummy encryption mount option ignored");
 #endif
 			break;
+		case Opt_inlinecrypt:
+#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
+			F2FS_OPTION(sbi).inlinecrypt = true;
+#else
+			f2fs_info(sbi, "inline encryption not supported");
+#endif
+			break;
+		case Opt_checkpoint_disable_cap_perc:
+			if (args->from && match_int(args, &arg))
+				return -EINVAL;
+			if (arg < 0 || arg > 100)
+				return -EINVAL;
+			if (arg == 100)
+				F2FS_OPTION(sbi).unusable_cap =
+					sbi->user_block_count;
+			else
+				F2FS_OPTION(sbi).unusable_cap =
+					(sbi->user_block_count / 100) *	arg;
+			set_opt(sbi, DISABLE_CHECKPOINT);
+			break;
+		case Opt_checkpoint_disable_cap:
+			if (args->from && match_int(args, &arg))
+				return -EINVAL;
+			F2FS_OPTION(sbi).unusable_cap = arg;
+			set_opt(sbi, DISABLE_CHECKPOINT);
+			break;
+		case Opt_checkpoint_disable:
+			set_opt(sbi, DISABLE_CHECKPOINT);
+			break;
+		case Opt_checkpoint_enable:
+			clear_opt(sbi, DISABLE_CHECKPOINT);
+			break;
 		default:
-			f2fs_msg(sb, KERN_ERR,
-				"Unrecognized mount option \"%s\" or missing value",
-				p);
+			f2fs_err(sbi, "Unrecognized mount option \"%s\" or missing value",
+				 p);
 			return -EINVAL;
 		}
 	}
@@ -779,54 +829,58 @@
 	if (f2fs_check_quota_options(sbi))
 		return -EINVAL;
 #else
-	if (f2fs_sb_has_quota_ino(sbi->sb) && !f2fs_readonly(sbi->sb)) {
-		f2fs_msg(sbi->sb, KERN_INFO,
-			 "Filesystem with quota feature cannot be mounted RDWR "
-			 "without CONFIG_QUOTA");
+	if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sbi->sb)) {
+		f2fs_info(sbi, "Filesystem with quota feature cannot be mounted RDWR without CONFIG_QUOTA");
 		return -EINVAL;
 	}
-	if (f2fs_sb_has_project_quota(sbi->sb) && !f2fs_readonly(sbi->sb)) {
-		f2fs_msg(sb, KERN_ERR,
-			"Filesystem with project quota feature cannot be "
-			"mounted RDWR without CONFIG_QUOTA");
+	if (f2fs_sb_has_project_quota(sbi) && !f2fs_readonly(sbi->sb)) {
+		f2fs_err(sbi, "Filesystem with project quota feature cannot be mounted RDWR without CONFIG_QUOTA");
+		return -EINVAL;
+	}
+#endif
+#ifndef CONFIG_UNICODE
+	if (f2fs_sb_has_casefold(sbi)) {
+		f2fs_err(sbi,
+			"Filesystem with casefold feature cannot be mounted without CONFIG_UNICODE");
 		return -EINVAL;
 	}
 #endif
 
 	if (F2FS_IO_SIZE_BITS(sbi) && !test_opt(sbi, LFS)) {
-		f2fs_msg(sb, KERN_ERR,
-				"Should set mode=lfs with %uKB-sized IO",
-				F2FS_IO_SIZE_KB(sbi));
+		f2fs_err(sbi, "Should set mode=lfs with %uKB-sized IO",
+			 F2FS_IO_SIZE_KB(sbi));
 		return -EINVAL;
 	}
 
 	if (test_opt(sbi, INLINE_XATTR_SIZE)) {
-		if (!f2fs_sb_has_extra_attr(sb) ||
-			!f2fs_sb_has_flexible_inline_xattr(sb)) {
-			f2fs_msg(sb, KERN_ERR,
-					"extra_attr or flexible_inline_xattr "
-					"feature is off");
+		int min_size, max_size;
+
+		if (!f2fs_sb_has_extra_attr(sbi) ||
+			!f2fs_sb_has_flexible_inline_xattr(sbi)) {
+			f2fs_err(sbi, "extra_attr or flexible_inline_xattr feature is off");
 			return -EINVAL;
 		}
 		if (!test_opt(sbi, INLINE_XATTR)) {
-			f2fs_msg(sb, KERN_ERR,
-					"inline_xattr_size option should be "
-					"set with inline_xattr option");
+			f2fs_err(sbi, "inline_xattr_size option should be set with inline_xattr option");
 			return -EINVAL;
 		}
-		if (F2FS_OPTION(sbi).inline_xattr_size <
-			sizeof(struct f2fs_xattr_header) / sizeof(__le32) ||
-			F2FS_OPTION(sbi).inline_xattr_size >
-			DEF_ADDRS_PER_INODE -
-			F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) -
-			DEF_INLINE_RESERVED_SIZE -
-			MIN_INLINE_DENTRY_SIZE / sizeof(__le32)) {
-			f2fs_msg(sb, KERN_ERR,
-					"inline xattr size is out of range");
+
+		min_size = sizeof(struct f2fs_xattr_header) / sizeof(__le32);
+		max_size = MAX_INLINE_XATTR_SIZE;
+
+		if (F2FS_OPTION(sbi).inline_xattr_size < min_size ||
+				F2FS_OPTION(sbi).inline_xattr_size > max_size) {
+			f2fs_err(sbi, "inline xattr size is out of range: %d ~ %d",
+				 min_size, max_size);
 			return -EINVAL;
 		}
 	}
 
+	if (test_opt(sbi, DISABLE_CHECKPOINT) && test_opt(sbi, LFS)) {
+		f2fs_err(sbi, "LFS not compatible with checkpoint=disable\n");
+		return -EINVAL;
+	}
+
 	/* Not pass down write hints if the number of active logs is lesser
 	 * than NR_CURSEG_TYPE.
 	 */
@@ -866,7 +920,21 @@
 
 static int f2fs_drop_inode(struct inode *inode)
 {
+	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 	int ret;
+
+	/*
+	 * during filesystem shutdown, if checkpoint is disabled,
+	 * drop useless meta/node dirty pages.
+	 */
+	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
+		if (inode->i_ino == F2FS_NODE_INO(sbi) ||
+			inode->i_ino == F2FS_META_INO(sbi)) {
+			trace_f2fs_drop_inode(inode, 1);
+			return 1;
+		}
+	}
+
 	/*
 	 * This is to avoid a deadlock condition like below.
 	 * writeback_single_inode(inode)
@@ -890,6 +958,10 @@
 			sb_start_intwrite(inode->i_sb);
 			f2fs_i_size_write(inode, 0);
 
+			f2fs_submit_merged_write_cond(F2FS_I_SB(inode),
+					inode, NULL, 0, DATA);
+			truncate_inode_pages_final(inode->i_mapping);
+
 			if (F2FS_HAS_BLOCKS(inode))
 				f2fs_truncate(inode);
 
@@ -902,6 +974,8 @@
 		return 0;
 	}
 	ret = generic_drop_inode(inode);
+	if (!ret)
+		ret = fscrypt_drop_inode(inode);
 	trace_f2fs_drop_inode(inode, ret);
 	return ret;
 }
@@ -971,6 +1045,9 @@
 static void f2fs_i_callback(struct rcu_head *head)
 {
 	struct inode *inode = container_of(head, struct inode, i_rcu);
+
+	fscrypt_free_inode(inode);
+
 	kmem_cache_free(f2fs_inode_cachep, F2FS_I(inode));
 }
 
@@ -992,10 +1069,10 @@
 	for (i = 0; i < sbi->s_ndevs; i++) {
 		blkdev_put(FDEV(i).bdev, FMODE_EXCL);
 #ifdef CONFIG_BLK_DEV_ZONED
-		kfree(FDEV(i).blkz_type);
+		kvfree(FDEV(i).blkz_seq);
 #endif
 	}
-	kfree(sbi->devs);
+	kvfree(sbi->devs);
 }
 
 static void f2fs_put_super(struct super_block *sb)
@@ -1014,8 +1091,8 @@
 	 * But, the previous checkpoint was not done by umount, it needs to do
 	 * clean checkpoint again.
 	 */
-	if (is_sbi_flag_set(sbi, SBI_IS_DIRTY) ||
-			!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG)) {
+	if ((is_sbi_flag_set(sbi, SBI_IS_DIRTY) ||
+			!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG))) {
 		struct cp_control cpc = {
 			.reason = CP_UMOUNT,
 		};
@@ -1023,7 +1100,7 @@
 	}
 
 	/* be sure to wait for any on-going discard commands */
-	dropped = f2fs_wait_discard_bios(sbi);
+	dropped = f2fs_issue_discard_timeout(sbi);
 
 	if ((f2fs_hw_support_discard(sbi) || f2fs_hw_should_discard(sbi)) &&
 					!sbi->discard_blks && !dropped) {
@@ -1065,25 +1142,28 @@
 	f2fs_destroy_node_manager(sbi);
 	f2fs_destroy_segment_manager(sbi);
 
-	kfree(sbi->ckpt);
+	kvfree(sbi->ckpt);
 
 	f2fs_unregister_sysfs(sbi);
 
 	sb->s_fs_info = NULL;
 	if (sbi->s_chksum_driver)
 		crypto_free_shash(sbi->s_chksum_driver);
-	kfree(sbi->raw_super);
+	kvfree(sbi->raw_super);
 
 	destroy_device_list(sbi);
 	mempool_destroy(sbi->write_io_dummy);
 #ifdef CONFIG_QUOTA
 	for (i = 0; i < MAXQUOTAS; i++)
-		kfree(F2FS_OPTION(sbi).s_qf_names[i]);
+		kvfree(F2FS_OPTION(sbi).s_qf_names[i]);
 #endif
 	destroy_percpu_info(sbi);
 	for (i = 0; i < NR_PAGE_TYPE; i++)
-		kfree(sbi->write_io[i]);
-	kfree(sbi);
+		kvfree(sbi->write_io[i]);
+#ifdef CONFIG_UNICODE
+	utf8_unload(sbi->s_encoding);
+#endif
+	kvfree(sbi);
 }
 
 int f2fs_sync_fs(struct super_block *sb, int sync)
@@ -1093,6 +1173,8 @@
 
 	if (unlikely(f2fs_cp_error(sbi)))
 		return 0;
+	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
+		return 0;
 
 	trace_f2fs_sync_fs(sb, sync);
 
@@ -1148,9 +1230,13 @@
 		return PTR_ERR(dquot);
 	spin_lock(&dquot->dq_dqb_lock);
 
-	limit = (dquot->dq_dqb.dqb_bsoftlimit ?
-		 dquot->dq_dqb.dqb_bsoftlimit :
-		 dquot->dq_dqb.dqb_bhardlimit) >> sb->s_blocksize_bits;
+	limit = 0;
+	if (dquot->dq_dqb.dqb_bsoftlimit)
+		limit = dquot->dq_dqb.dqb_bsoftlimit;
+	if (dquot->dq_dqb.dqb_bhardlimit &&
+			(!limit || dquot->dq_dqb.dqb_bhardlimit < limit))
+		limit = dquot->dq_dqb.dqb_bhardlimit;
+
 	if (limit && buf->f_blocks > limit) {
 		curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits;
 		buf->f_blocks = limit;
@@ -1159,9 +1245,13 @@
 			 (buf->f_blocks - curblock) : 0;
 	}
 
-	limit = dquot->dq_dqb.dqb_isoftlimit ?
-		dquot->dq_dqb.dqb_isoftlimit :
-		dquot->dq_dqb.dqb_ihardlimit;
+	limit = 0;
+	if (dquot->dq_dqb.dqb_isoftlimit)
+		limit = dquot->dq_dqb.dqb_isoftlimit;
+	if (dquot->dq_dqb.dqb_ihardlimit &&
+			(!limit || dquot->dq_dqb.dqb_ihardlimit < limit))
+		limit = dquot->dq_dqb.dqb_ihardlimit;
+
 	if (limit && buf->f_files > limit) {
 		buf->f_files = limit;
 		buf->f_ffree =
@@ -1192,14 +1282,21 @@
 	buf->f_blocks = total_count - start_count;
 	buf->f_bfree = user_block_count - valid_user_blocks(sbi) -
 						sbi->current_reserved_blocks;
+
+	spin_lock(&sbi->stat_lock);
+	if (unlikely(buf->f_bfree <= sbi->unusable_block_count))
+		buf->f_bfree = 0;
+	else
+		buf->f_bfree -= sbi->unusable_block_count;
+	spin_unlock(&sbi->stat_lock);
+
 	if (buf->f_bfree > F2FS_OPTION(sbi).root_reserved_blocks)
 		buf->f_bavail = buf->f_bfree -
 				F2FS_OPTION(sbi).root_reserved_blocks;
 	else
 		buf->f_bavail = 0;
 
-	avail_node_count = sbi->total_node_count - sbi->nquota_files -
-						F2FS_RESERVED_NODE_NUM;
+	avail_node_count = sbi->total_node_count - F2FS_RESERVED_NODE_NUM;
 
 	if (avail_node_count > user_block_count) {
 		buf->f_files = user_block_count;
@@ -1276,6 +1373,8 @@
 		seq_puts(seq, ",disable_roll_forward");
 	if (test_opt(sbi, DISCARD))
 		seq_puts(seq, ",discard");
+	else
+		seq_puts(seq, ",nodiscard");
 	if (test_opt(sbi, NOHEAP))
 		seq_puts(seq, ",no_heap");
 	else
@@ -1361,9 +1460,11 @@
 		seq_printf(seq, ",whint_mode=%s", "user-based");
 	else if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_FS)
 		seq_printf(seq, ",whint_mode=%s", "fs-based");
-#ifdef CONFIG_F2FS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	if (F2FS_OPTION(sbi).test_dummy_encryption)
 		seq_puts(seq, ",test_dummy_encryption");
+	if (F2FS_OPTION(sbi).inlinecrypt)
+		seq_puts(seq, ",inlinecrypt");
 #endif
 
 	if (F2FS_OPTION(sbi).alloc_mode == ALLOC_MODE_DEFAULT)
@@ -1371,6 +1472,9 @@
 	else if (F2FS_OPTION(sbi).alloc_mode == ALLOC_MODE_REUSE)
 		seq_printf(seq, ",alloc_mode=%s", "reuse");
 
+	if (test_opt(sbi, DISABLE_CHECKPOINT))
+		seq_printf(seq, ",checkpoint=disable:%u",
+				F2FS_OPTION(sbi).unusable_cap);
 	if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_POSIX)
 		seq_printf(seq, ",fsync_mode=%s", "posix");
 	else if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT)
@@ -1389,6 +1493,9 @@
 	F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_DEFAULT;
 	F2FS_OPTION(sbi).fsync_mode = FSYNC_MODE_POSIX;
 	F2FS_OPTION(sbi).test_dummy_encryption = false;
+#ifdef CONFIG_FS_ENCRYPTION
+	F2FS_OPTION(sbi).inlinecrypt = false;
+#endif
 	F2FS_OPTION(sbi).s_resuid = make_kuid(&init_user_ns, F2FS_DEF_RESUID);
 	F2FS_OPTION(sbi).s_resgid = make_kgid(&init_user_ns, F2FS_DEF_RESGID);
 
@@ -1398,10 +1505,12 @@
 	set_opt(sbi, INLINE_DENTRY);
 	set_opt(sbi, EXTENT_CACHE);
 	set_opt(sbi, NOHEAP);
+	clear_opt(sbi, DISABLE_CHECKPOINT);
+	F2FS_OPTION(sbi).unusable_cap = 0;
 	sbi->sb->s_flags |= SB_LAZYTIME;
 	set_opt(sbi, FLUSH_MERGE);
 	set_opt(sbi, DISCARD);
-	if (f2fs_sb_has_blkzoned(sbi->sb))
+	if (f2fs_sb_has_blkzoned(sbi))
 		set_opt_mode(sbi, F2FS_MOUNT_LFS);
 	else
 		set_opt_mode(sbi, F2FS_MOUNT_ADAPTIVE);
@@ -1419,6 +1528,76 @@
 #ifdef CONFIG_QUOTA
 static int f2fs_enable_quotas(struct super_block *sb);
 #endif
+
+static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
+{
+	unsigned int s_flags = sbi->sb->s_flags;
+	struct cp_control cpc;
+	int err = 0;
+	int ret;
+	block_t unusable;
+
+	if (s_flags & SB_RDONLY) {
+		f2fs_err(sbi, "checkpoint=disable on readonly fs");
+		return -EINVAL;
+	}
+	sbi->sb->s_flags |= SB_ACTIVE;
+
+	f2fs_update_time(sbi, DISABLE_TIME);
+
+	while (!f2fs_time_over(sbi, DISABLE_TIME)) {
+		mutex_lock(&sbi->gc_mutex);
+		err = f2fs_gc(sbi, true, false, NULL_SEGNO);
+		if (err == -ENODATA) {
+			err = 0;
+			break;
+		}
+		if (err && err != -EAGAIN)
+			break;
+	}
+
+	ret = sync_filesystem(sbi->sb);
+	if (ret || err) {
+		err = ret ? ret: err;
+		goto restore_flag;
+	}
+
+	unusable = f2fs_get_unusable_blocks(sbi);
+	if (f2fs_disable_cp_again(sbi, unusable)) {
+		err = -EAGAIN;
+		goto restore_flag;
+	}
+
+	mutex_lock(&sbi->gc_mutex);
+	cpc.reason = CP_PAUSE;
+	set_sbi_flag(sbi, SBI_CP_DISABLED);
+	err = f2fs_write_checkpoint(sbi, &cpc);
+	if (err)
+		goto out_unlock;
+
+	spin_lock(&sbi->stat_lock);
+	sbi->unusable_block_count = unusable;
+	spin_unlock(&sbi->stat_lock);
+
+out_unlock:
+	mutex_unlock(&sbi->gc_mutex);
+restore_flag:
+	sbi->sb->s_flags = s_flags;	/* Restore MS_RDONLY status */
+	return err;
+}
+
+static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi)
+{
+	mutex_lock(&sbi->gc_mutex);
+	f2fs_dirty_to_prefree(sbi);
+
+	clear_sbi_flag(sbi, SBI_CP_DISABLED);
+	set_sbi_flag(sbi, SBI_IS_DIRTY);
+	mutex_unlock(&sbi->gc_mutex);
+
+	f2fs_sync_fs(sbi->sb, 1);
+}
+
 static int f2fs_remount(struct super_block *sb, int *flags, char *data)
 {
 	struct f2fs_sb_info *sbi = F2FS_SB(sb);
@@ -1428,6 +1607,9 @@
 	bool need_restart_gc = false;
 	bool need_stop_gc = false;
 	bool no_extent_cache = !test_opt(sbi, EXTENT_CACHE);
+	bool disable_checkpoint = test_opt(sbi, DISABLE_CHECKPOINT);
+	bool no_io_align = !F2FS_IO_ALIGNED(sbi);
+	bool checkpoint_changed;
 #ifdef CONFIG_QUOTA
 	int i, j;
 #endif
@@ -1448,7 +1630,7 @@
 				GFP_KERNEL);
 			if (!org_mount_opt.s_qf_names[i]) {
 				for (j = 0; j < i; j++)
-					kfree(org_mount_opt.s_qf_names[j]);
+					kvfree(org_mount_opt.s_qf_names[j]);
 				return -ENOMEM;
 			}
 		} else {
@@ -1460,8 +1642,8 @@
 	/* recover superblocks we couldn't write due to previous RO mount */
 	if (!(*flags & SB_RDONLY) && is_sbi_flag_set(sbi, SBI_NEED_SB_WRITE)) {
 		err = f2fs_commit_super(sbi, false);
-		f2fs_msg(sb, KERN_INFO,
-			"Try to recover all the superblocks, ret: %d", err);
+		f2fs_info(sbi, "Try to recover all the superblocks, ret: %d",
+			  err);
 		if (!err)
 			clear_sbi_flag(sbi, SBI_NEED_SB_WRITE);
 	}
@@ -1472,6 +1654,8 @@
 	err = parse_options(sb, data);
 	if (err)
 		goto restore_opts;
+	checkpoint_changed =
+			disable_checkpoint != test_opt(sbi, DISABLE_CHECKPOINT);
 
 	/*
 	 * Previous and new state of filesystem is RO,
@@ -1485,12 +1669,12 @@
 		err = dquot_suspend(sb, -1);
 		if (err < 0)
 			goto restore_opts;
-	} else if (f2fs_readonly(sb) && !(*flags & MS_RDONLY)) {
+	} else if (f2fs_readonly(sb) && !(*flags & SB_RDONLY)) {
 		/* dquot_resume needs RW */
 		sb->s_flags &= ~SB_RDONLY;
 		if (sb_any_quota_suspended(sb)) {
 			dquot_resume(sb, -1);
-		} else if (f2fs_sb_has_quota_ino(sb)) {
+		} else if (f2fs_sb_has_quota_ino(sbi)) {
 			err = f2fs_enable_quotas(sb);
 			if (err)
 				goto restore_opts;
@@ -1500,8 +1684,19 @@
 	/* disallow enable/disable extent_cache dynamically */
 	if (no_extent_cache == !!test_opt(sbi, EXTENT_CACHE)) {
 		err = -EINVAL;
-		f2fs_msg(sbi->sb, KERN_WARNING,
-				"switch extent_cache option is not allowed");
+		f2fs_warn(sbi, "switch extent_cache option is not allowed");
+		goto restore_opts;
+	}
+
+	if (no_io_align == !!F2FS_IO_ALIGNED(sbi)) {
+		err = -EINVAL;
+		f2fs_warn(sbi, "switch io_bits option is not allowed");
+		goto restore_opts;
+	}
+
+	if ((*flags & SB_RDONLY) && test_opt(sbi, DISABLE_CHECKPOINT)) {
+		err = -EINVAL;
+		f2fs_warn(sbi, "disabling checkpoint not compatible with read-only");
 		goto restore_opts;
 	}
 
@@ -1533,6 +1728,16 @@
 		clear_sbi_flag(sbi, SBI_IS_CLOSE);
 	}
 
+	if (checkpoint_changed) {
+		if (test_opt(sbi, DISABLE_CHECKPOINT)) {
+			err = f2fs_disable_checkpoint(sbi);
+			if (err)
+				goto restore_gc;
+		} else {
+			f2fs_enable_checkpoint(sbi);
+		}
+	}
+
 	/*
 	 * We stop issue flush thread if FS is mounted as RO
 	 * or if flush_merge is not passed in mount option.
@@ -1549,7 +1754,7 @@
 #ifdef CONFIG_QUOTA
 	/* Release old quota file names */
 	for (i = 0; i < MAXQUOTAS; i++)
-		kfree(org_mount_opt.s_qf_names[i]);
+		kvfree(org_mount_opt.s_qf_names[i]);
 #endif
 	/* Update the POSIXACL Flag */
 	sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
@@ -1561,8 +1766,7 @@
 restore_gc:
 	if (need_restart_gc) {
 		if (f2fs_start_gc_thread(sbi))
-			f2fs_msg(sbi->sb, KERN_WARNING,
-				"background gc thread has stopped");
+			f2fs_warn(sbi, "background gc thread has stopped");
 	} else if (need_stop_gc) {
 		f2fs_stop_gc_thread(sbi);
 	}
@@ -1570,7 +1774,7 @@
 #ifdef CONFIG_QUOTA
 	F2FS_OPTION(sbi).s_jquota_fmt = org_mount_opt.s_jquota_fmt;
 	for (i = 0; i < MAXQUOTAS; i++) {
-		kfree(F2FS_OPTION(sbi).s_qf_names[i]);
+		kvfree(F2FS_OPTION(sbi).s_qf_names[i]);
 		F2FS_OPTION(sbi).s_qf_names[i] = org_mount_opt.s_qf_names[i];
 	}
 #endif
@@ -1609,6 +1813,7 @@
 				congestion_wait(BLK_RW_ASYNC, HZ/50);
 				goto repeat;
 			}
+			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
 			return PTR_ERR(page);
 		}
 
@@ -1620,6 +1825,7 @@
 		}
 		if (unlikely(!PageUptodate(page))) {
 			f2fs_put_page(page, 1);
+			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
 			return -EIO;
 		}
 
@@ -1661,6 +1867,7 @@
 				congestion_wait(BLK_RW_ASYNC, HZ/50);
 				goto retry;
 			}
+			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
 			break;
 		}
 
@@ -1697,6 +1904,11 @@
 
 static int f2fs_quota_on_mount(struct f2fs_sb_info *sbi, int type)
 {
+	if (is_set_ckpt_flags(sbi, CP_QUOTA_NEED_FSCK_FLAG)) {
+		f2fs_err(sbi, "quota sysfile may be corrupted, skip loading it");
+		return 0;
+	}
+
 	return dquot_quota_on_mount(sbi->sb, F2FS_OPTION(sbi).s_qf_names[type],
 					F2FS_OPTION(sbi).s_jquota_fmt, type);
 }
@@ -1706,11 +1918,10 @@
 	int enabled = 0;
 	int i, err;
 
-	if (f2fs_sb_has_quota_ino(sbi->sb) && rdonly) {
+	if (f2fs_sb_has_quota_ino(sbi) && rdonly) {
 		err = f2fs_enable_quotas(sbi->sb);
 		if (err) {
-			f2fs_msg(sbi->sb, KERN_ERR,
-					"Cannot turn on quota_ino: %d", err);
+			f2fs_err(sbi, "Cannot turn on quota_ino: %d", err);
 			return 0;
 		}
 		return 1;
@@ -1723,8 +1934,8 @@
 				enabled = 1;
 				continue;
 			}
-			f2fs_msg(sbi->sb, KERN_ERR,
-				"Cannot turn on quotas: %d on %d", err, i);
+			f2fs_err(sbi, "Cannot turn on quotas: %d on %d",
+				 err, i);
 		}
 	}
 	return enabled;
@@ -1737,7 +1948,7 @@
 	unsigned long qf_inum;
 	int err;
 
-	BUG_ON(!f2fs_sb_has_quota_ino(sb));
+	BUG_ON(!f2fs_sb_has_quota_ino(F2FS_SB(sb)));
 
 	qf_inum = f2fs_qf_ino(sb, type);
 	if (!qf_inum)
@@ -1745,8 +1956,7 @@
 
 	qf_inode = f2fs_iget(sb, qf_inum);
 	if (IS_ERR(qf_inode)) {
-		f2fs_msg(sb, KERN_ERR,
-			"Bad quota inode %u:%lu", type, qf_inum);
+		f2fs_err(F2FS_SB(sb), "Bad quota inode %u:%lu", type, qf_inum);
 		return PTR_ERR(qf_inode);
 	}
 
@@ -1759,15 +1969,22 @@
 
 static int f2fs_enable_quotas(struct super_block *sb)
 {
+	struct f2fs_sb_info *sbi = F2FS_SB(sb);
 	int type, err = 0;
 	unsigned long qf_inum;
 	bool quota_mopt[MAXQUOTAS] = {
-		test_opt(F2FS_SB(sb), USRQUOTA),
-		test_opt(F2FS_SB(sb), GRPQUOTA),
-		test_opt(F2FS_SB(sb), PRJQUOTA),
+		test_opt(sbi, USRQUOTA),
+		test_opt(sbi, GRPQUOTA),
+		test_opt(sbi, PRJQUOTA),
 	};
 
-	sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE | DQUOT_NOLIST_DIRTY;
+	if (is_set_ckpt_flags(F2FS_SB(sb), CP_QUOTA_NEED_FSCK_FLAG)) {
+		f2fs_err(sbi, "quota file may be corrupted, skip loading it");
+		return 0;
+	}
+
+	sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;
+
 	for (type = 0; type < MAXQUOTAS; type++) {
 		qf_inum = f2fs_qf_ino(sb, type);
 		if (qf_inum) {
@@ -1775,12 +1992,12 @@
 				DQUOT_USAGE_ENABLED |
 				(quota_mopt[type] ? DQUOT_LIMITS_ENABLED : 0));
 			if (err) {
-				f2fs_msg(sb, KERN_ERR,
-					"Failed to enable quota tracking "
-					"(type=%d, err=%d). Please run "
-					"fsck to fix.", type, err);
+				f2fs_err(sbi, "Failed to enable quota tracking (type=%d, err=%d). Please run fsck to fix.",
+					 type, err);
 				for (type--; type >= 0; type--)
 					dquot_quota_off(sb, type);
+				set_sbi_flag(F2FS_SB(sb),
+						SBI_QUOTA_NEED_REPAIR);
 				return err;
 			}
 		}
@@ -1788,35 +2005,65 @@
 	return 0;
 }
 
-static int f2fs_quota_sync(struct super_block *sb, int type)
+int f2fs_quota_sync(struct super_block *sb, int type)
 {
+	struct f2fs_sb_info *sbi = F2FS_SB(sb);
 	struct quota_info *dqopt = sb_dqopt(sb);
 	int cnt;
 	int ret;
 
+	/*
+	 * do_quotactl
+	 *  f2fs_quota_sync
+	 *  down_read(quota_sem)
+	 *  dquot_writeback_dquots()
+	 *  f2fs_dquot_commit
+	 *                            block_operation
+	 *                            down_read(quota_sem)
+	 */
+	f2fs_lock_op(sbi);
+
+	down_read(&sbi->quota_sem);
 	ret = dquot_writeback_dquots(sb, type);
 	if (ret)
-		return ret;
+		goto out;
 
 	/*
 	 * Now when everything is written we can discard the pagecache so
 	 * that userspace sees the changes.
 	 */
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
+		struct address_space *mapping;
+
 		if (type != -1 && cnt != type)
 			continue;
 		if (!sb_has_quota_active(sb, cnt))
 			continue;
 
-		ret = filemap_write_and_wait(dqopt->files[cnt]->i_mapping);
+		mapping = dqopt->files[cnt]->i_mapping;
+
+		ret = filemap_fdatawrite(mapping);
 		if (ret)
-			return ret;
+			goto out;
+
+		/* if we are using journalled quota */
+		if (is_journalled_quota(sbi))
+			continue;
+
+		ret = filemap_fdatawait(mapping);
+		if (ret)
+			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
 
 		inode_lock(dqopt->files[cnt]);
 		truncate_inode_pages(&dqopt->files[cnt]->i_data, 0);
 		inode_unlock(dqopt->files[cnt]);
 	}
-	return 0;
+out:
+	if (ret)
+		set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
+	up_read(&sbi->quota_sem);
+	f2fs_unlock_op(sbi);
+	return ret;
 }
 
 static int f2fs_quota_on(struct super_block *sb, int type, int format_id,
@@ -1825,6 +2072,12 @@
 	struct inode *inode;
 	int err;
 
+	/* if quota sysfile exists, deny enabling quota with specific file */
+	if (f2fs_sb_has_quota_ino(F2FS_SB(sb))) {
+		f2fs_err(F2FS_SB(sb), "quota sysfile already exists");
+		return -EBUSY;
+	}
+
 	err = f2fs_quota_sync(sb, type);
 	if (err)
 		return err;
@@ -1844,7 +2097,7 @@
 	return 0;
 }
 
-static int f2fs_quota_off(struct super_block *sb, int type)
+static int __f2fs_quota_off(struct super_block *sb, int type)
 {
 	struct inode *inode = sb_dqopt(sb)->files[type];
 	int err;
@@ -1857,7 +2110,7 @@
 		goto out_put;
 
 	err = dquot_quota_off(sb, type);
-	if (err || f2fs_sb_has_quota_ino(sb))
+	if (err || f2fs_sb_has_quota_ino(F2FS_SB(sb)))
 		goto out_put;
 
 	inode_lock(inode);
@@ -1870,21 +2123,36 @@
 	return err;
 }
 
+static int f2fs_quota_off(struct super_block *sb, int type)
+{
+	struct f2fs_sb_info *sbi = F2FS_SB(sb);
+	int err;
+
+	err = __f2fs_quota_off(sb, type);
+
+	/*
+	 * quotactl can shutdown journalled quota, result in inconsistence
+	 * between quota record and fs data by following updates, tag the
+	 * flag to let fsck be aware of it.
+	 */
+	if (is_journalled_quota(sbi))
+		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
+	return err;
+}
+
 void f2fs_quota_off_umount(struct super_block *sb)
 {
 	int type;
 	int err;
 
 	for (type = 0; type < MAXQUOTAS; type++) {
-		err = f2fs_quota_off(sb, type);
+		err = __f2fs_quota_off(sb, type);
 		if (err) {
 			int ret = dquot_quota_off(sb, type);
 
-			f2fs_msg(sb, KERN_ERR,
-				"Fail to turn off disk quota "
-				"(type: %d, err: %d, ret:%d), Please "
-				"run fsck to fix it.", type, err, ret);
-			set_sbi_flag(F2FS_SB(sb), SBI_NEED_FSCK);
+			f2fs_err(F2FS_SB(sb), "Fail to turn off disk quota (type: %d, err: %d, ret:%d), Please run fsck to fix it.",
+				 type, err, ret);
+			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
 		}
 	}
 	/*
@@ -1907,6 +2175,74 @@
 	}
 }
 
+static int f2fs_dquot_commit(struct dquot *dquot)
+{
+	struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
+	int ret;
+
+	down_read(&sbi->quota_sem);
+	ret = dquot_commit(dquot);
+	if (ret < 0)
+		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
+	up_read(&sbi->quota_sem);
+	return ret;
+}
+
+static int f2fs_dquot_acquire(struct dquot *dquot)
+{
+	struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
+	int ret;
+
+	down_read(&sbi->quota_sem);
+	ret = dquot_acquire(dquot);
+	if (ret < 0)
+		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
+	up_read(&sbi->quota_sem);
+	return ret;
+}
+
+static int f2fs_dquot_release(struct dquot *dquot)
+{
+	struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
+	int ret;
+
+	down_read(&sbi->quota_sem);
+	ret = dquot_release(dquot);
+	if (ret < 0)
+		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
+	up_read(&sbi->quota_sem);
+	return ret;
+}
+
+static int f2fs_dquot_mark_dquot_dirty(struct dquot *dquot)
+{
+	struct super_block *sb = dquot->dq_sb;
+	struct f2fs_sb_info *sbi = F2FS_SB(sb);
+	int ret;
+
+	down_read(&sbi->quota_sem);
+	ret = dquot_mark_dquot_dirty(dquot);
+
+	/* if we are using journalled quota */
+	if (is_journalled_quota(sbi))
+		set_sbi_flag(sbi, SBI_QUOTA_NEED_FLUSH);
+
+	up_read(&sbi->quota_sem);
+	return ret;
+}
+
+static int f2fs_dquot_commit_info(struct super_block *sb, int type)
+{
+	struct f2fs_sb_info *sbi = F2FS_SB(sb);
+	int ret;
+
+	down_read(&sbi->quota_sem);
+	ret = dquot_commit_info(sb, type);
+	if (ret < 0)
+		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
+	up_read(&sbi->quota_sem);
+	return ret;
+}
 
 static int f2fs_get_projid(struct inode *inode, kprojid_t *projid)
 {
@@ -1916,11 +2252,11 @@
 
 static const struct dquot_operations f2fs_quota_operations = {
 	.get_reserved_space = f2fs_get_reserved_space,
-	.write_dquot	= dquot_commit,
-	.acquire_dquot	= dquot_acquire,
-	.release_dquot	= dquot_release,
-	.mark_dirty	= dquot_mark_dquot_dirty,
-	.write_info	= dquot_commit_info,
+	.write_dquot	= f2fs_dquot_commit,
+	.acquire_dquot	= f2fs_dquot_acquire,
+	.release_dquot	= f2fs_dquot_release,
+	.mark_dirty	= f2fs_dquot_mark_dquot_dirty,
+	.write_info	= f2fs_dquot_commit_info,
 	.alloc_dquot	= dquot_alloc,
 	.destroy_dquot	= dquot_destroy,
 	.get_projid	= f2fs_get_projid,
@@ -1938,6 +2274,11 @@
 	.get_nextdqblk	= dquot_get_next_dqblk,
 };
 #else
+int f2fs_quota_sync(struct super_block *sb, int type)
+{
+	return 0;
+}
+
 void f2fs_quota_off_umount(struct super_block *sb)
 {
 }
@@ -1964,7 +2305,7 @@
 	.remount_fs	= f2fs_remount,
 };
 
-#ifdef CONFIG_F2FS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 static int f2fs_get_context(struct inode *inode, void *ctx, size_t len)
 {
 	return f2fs_getxattr(inode, F2FS_XATTR_INDEX_ENCRYPTION,
@@ -1983,7 +2324,7 @@
 	 * if LOST_FOUND feature is enabled.
 	 *
 	 */
-	if (f2fs_sb_has_lost_found(sbi->sb) &&
+	if (f2fs_sb_has_lost_found(sbi) &&
 			inode->i_ino == F2FS_ROOT_INO(sbi))
 		return -EPERM;
 
@@ -1997,13 +2338,33 @@
 	return DUMMY_ENCRYPTION_ENABLED(F2FS_I_SB(inode));
 }
 
+static bool f2fs_has_stable_inodes(struct super_block *sb)
+{
+	return true;
+}
+
+static void f2fs_get_ino_and_lblk_bits(struct super_block *sb,
+				       int *ino_bits_ret, int *lblk_bits_ret)
+{
+	*ino_bits_ret = 8 * sizeof(nid_t);
+	*lblk_bits_ret = 8 * sizeof(block_t);
+}
+
+static bool f2fs_inline_crypt_enabled(struct super_block *sb)
+{
+	return F2FS_OPTION(F2FS_SB(sb)).inlinecrypt;
+}
+
 static const struct fscrypt_operations f2fs_cryptops = {
-	.key_prefix	= "f2fs:",
-	.get_context	= f2fs_get_context,
-	.set_context	= f2fs_set_context,
-	.dummy_context	= f2fs_dummy_context,
-	.empty_dir	= f2fs_empty_dir,
-	.max_namelen	= F2FS_NAME_LEN,
+	.key_prefix		= "f2fs:",
+	.get_context		= f2fs_get_context,
+	.set_context		= f2fs_set_context,
+	.dummy_context		= f2fs_dummy_context,
+	.empty_dir		= f2fs_empty_dir,
+	.max_namelen		= F2FS_NAME_LEN,
+	.has_stable_inodes	= f2fs_has_stable_inodes,
+	.get_ino_and_lblk_bits	= f2fs_get_ino_and_lblk_bits,
+	.inline_crypt_enabled	= f2fs_inline_crypt_enabled,
 };
 #endif
 
@@ -2055,7 +2416,7 @@
 static loff_t max_file_blocks(void)
 {
 	loff_t result = 0;
-	loff_t leaf_count = ADDRS_PER_BLOCK;
+	loff_t leaf_count = DEF_ADDRS_PER_BLOCK;
 
 	/*
 	 * note: previously, result is equal to (DEF_ADDRS_PER_INODE -
@@ -2116,55 +2477,49 @@
 				(segment_count << log_blocks_per_seg);
 
 	if (segment0_blkaddr != cp_blkaddr) {
-		f2fs_msg(sb, KERN_INFO,
-			"Mismatch start address, segment0(%u) cp_blkaddr(%u)",
-			segment0_blkaddr, cp_blkaddr);
+		f2fs_info(sbi, "Mismatch start address, segment0(%u) cp_blkaddr(%u)",
+			  segment0_blkaddr, cp_blkaddr);
 		return true;
 	}
 
 	if (cp_blkaddr + (segment_count_ckpt << log_blocks_per_seg) !=
 							sit_blkaddr) {
-		f2fs_msg(sb, KERN_INFO,
-			"Wrong CP boundary, start(%u) end(%u) blocks(%u)",
-			cp_blkaddr, sit_blkaddr,
-			segment_count_ckpt << log_blocks_per_seg);
+		f2fs_info(sbi, "Wrong CP boundary, start(%u) end(%u) blocks(%u)",
+			  cp_blkaddr, sit_blkaddr,
+			  segment_count_ckpt << log_blocks_per_seg);
 		return true;
 	}
 
 	if (sit_blkaddr + (segment_count_sit << log_blocks_per_seg) !=
 							nat_blkaddr) {
-		f2fs_msg(sb, KERN_INFO,
-			"Wrong SIT boundary, start(%u) end(%u) blocks(%u)",
-			sit_blkaddr, nat_blkaddr,
-			segment_count_sit << log_blocks_per_seg);
+		f2fs_info(sbi, "Wrong SIT boundary, start(%u) end(%u) blocks(%u)",
+			  sit_blkaddr, nat_blkaddr,
+			  segment_count_sit << log_blocks_per_seg);
 		return true;
 	}
 
 	if (nat_blkaddr + (segment_count_nat << log_blocks_per_seg) !=
 							ssa_blkaddr) {
-		f2fs_msg(sb, KERN_INFO,
-			"Wrong NAT boundary, start(%u) end(%u) blocks(%u)",
-			nat_blkaddr, ssa_blkaddr,
-			segment_count_nat << log_blocks_per_seg);
+		f2fs_info(sbi, "Wrong NAT boundary, start(%u) end(%u) blocks(%u)",
+			  nat_blkaddr, ssa_blkaddr,
+			  segment_count_nat << log_blocks_per_seg);
 		return true;
 	}
 
 	if (ssa_blkaddr + (segment_count_ssa << log_blocks_per_seg) !=
 							main_blkaddr) {
-		f2fs_msg(sb, KERN_INFO,
-			"Wrong SSA boundary, start(%u) end(%u) blocks(%u)",
-			ssa_blkaddr, main_blkaddr,
-			segment_count_ssa << log_blocks_per_seg);
+		f2fs_info(sbi, "Wrong SSA boundary, start(%u) end(%u) blocks(%u)",
+			  ssa_blkaddr, main_blkaddr,
+			  segment_count_ssa << log_blocks_per_seg);
 		return true;
 	}
 
 	if (main_end_blkaddr > seg_end_blkaddr) {
-		f2fs_msg(sb, KERN_INFO,
-			"Wrong MAIN_AREA boundary, start(%u) end(%u) block(%u)",
-			main_blkaddr,
-			segment0_blkaddr +
-				(segment_count << log_blocks_per_seg),
-			segment_count_main << log_blocks_per_seg);
+		f2fs_info(sbi, "Wrong MAIN_AREA boundary, start(%u) end(%u) block(%u)",
+			  main_blkaddr,
+			  segment0_blkaddr +
+			  (segment_count << log_blocks_per_seg),
+			  segment_count_main << log_blocks_per_seg);
 		return true;
 	} else if (main_end_blkaddr < seg_end_blkaddr) {
 		int err = 0;
@@ -2181,12 +2536,11 @@
 			err = __f2fs_commit_super(bh, NULL);
 			res = err ? "failed" : "done";
 		}
-		f2fs_msg(sb, KERN_INFO,
-			"Fix alignment : %s, start(%u) end(%u) block(%u)",
-			res, main_blkaddr,
-			segment0_blkaddr +
-				(segment_count << log_blocks_per_seg),
-			segment_count_main << log_blocks_per_seg);
+		f2fs_info(sbi, "Fix alignment : %s, start(%u) end(%u) block(%u)",
+			  res, main_blkaddr,
+			  segment0_blkaddr +
+			  (segment_count << log_blocks_per_seg),
+			  segment_count_main << log_blocks_per_seg);
 		if (err)
 			return true;
 	}
@@ -2200,38 +2554,51 @@
 	block_t total_sections, blocks_per_seg;
 	struct f2fs_super_block *raw_super = (struct f2fs_super_block *)
 					(bh->b_data + F2FS_SUPER_OFFSET);
-	struct super_block *sb = sbi->sb;
 	unsigned int blocksize;
+	size_t crc_offset = 0;
+	__u32 crc = 0;
 
 	if (le32_to_cpu(raw_super->magic) != F2FS_SUPER_MAGIC) {
-		f2fs_msg(sb, KERN_INFO,
-			"Magic Mismatch, valid(0x%x) - read(0x%x)",
-			F2FS_SUPER_MAGIC, le32_to_cpu(raw_super->magic));
+		f2fs_info(sbi, "Magic Mismatch, valid(0x%x) - read(0x%x)",
+			  F2FS_SUPER_MAGIC, le32_to_cpu(raw_super->magic));
 		return -EINVAL;
 	}
 
+	/* Check checksum_offset and crc in superblock */
+	if (__F2FS_HAS_FEATURE(raw_super, F2FS_FEATURE_SB_CHKSUM)) {
+		crc_offset = le32_to_cpu(raw_super->checksum_offset);
+		if (crc_offset !=
+			offsetof(struct f2fs_super_block, crc)) {
+			f2fs_info(sbi, "Invalid SB checksum offset: %zu",
+				  crc_offset);
+			return -EFSCORRUPTED;
+		}
+		crc = le32_to_cpu(raw_super->crc);
+		if (!f2fs_crc_valid(sbi, crc, raw_super, crc_offset)) {
+			f2fs_info(sbi, "Invalid SB checksum value: %u", crc);
+			return -EFSCORRUPTED;
+		}
+	}
+
 	/* Currently, support only 4KB page cache size */
 	if (F2FS_BLKSIZE != PAGE_SIZE) {
-		f2fs_msg(sb, KERN_INFO,
-			"Invalid page_cache_size (%lu), supports only 4KB\n",
-			PAGE_SIZE);
+		f2fs_info(sbi, "Invalid page_cache_size (%lu), supports only 4KB",
+			  PAGE_SIZE);
 		return -EFSCORRUPTED;
 	}
 
 	/* Currently, support only 4KB block size */
 	blocksize = 1 << le32_to_cpu(raw_super->log_blocksize);
 	if (blocksize != F2FS_BLKSIZE) {
-		f2fs_msg(sb, KERN_INFO,
-			"Invalid blocksize (%u), supports only 4KB\n",
-			blocksize);
+		f2fs_info(sbi, "Invalid blocksize (%u), supports only 4KB",
+			  blocksize);
 		return -EFSCORRUPTED;
 	}
 
 	/* check log blocks per segment */
 	if (le32_to_cpu(raw_super->log_blocks_per_seg) != 9) {
-		f2fs_msg(sb, KERN_INFO,
-			"Invalid log blocks per segment (%u)\n",
-			le32_to_cpu(raw_super->log_blocks_per_seg));
+		f2fs_info(sbi, "Invalid log blocks per segment (%u)",
+			  le32_to_cpu(raw_super->log_blocks_per_seg));
 		return -EFSCORRUPTED;
 	}
 
@@ -2240,17 +2607,16 @@
 				F2FS_MAX_LOG_SECTOR_SIZE ||
 		le32_to_cpu(raw_super->log_sectorsize) <
 				F2FS_MIN_LOG_SECTOR_SIZE) {
-		f2fs_msg(sb, KERN_INFO, "Invalid log sectorsize (%u)",
-			le32_to_cpu(raw_super->log_sectorsize));
+		f2fs_info(sbi, "Invalid log sectorsize (%u)",
+			  le32_to_cpu(raw_super->log_sectorsize));
 		return -EFSCORRUPTED;
 	}
 	if (le32_to_cpu(raw_super->log_sectors_per_block) +
 		le32_to_cpu(raw_super->log_sectorsize) !=
 			F2FS_MAX_LOG_SECTOR_SIZE) {
-		f2fs_msg(sb, KERN_INFO,
-			"Invalid log sectors per block(%u) log sectorsize(%u)",
-			le32_to_cpu(raw_super->log_sectors_per_block),
-			le32_to_cpu(raw_super->log_sectorsize));
+		f2fs_info(sbi, "Invalid log sectors per block(%u) log sectorsize(%u)",
+			  le32_to_cpu(raw_super->log_sectors_per_block),
+			  le32_to_cpu(raw_super->log_sectorsize));
 		return -EFSCORRUPTED;
 	}
 
@@ -2264,59 +2630,66 @@
 
 	if (segment_count > F2FS_MAX_SEGMENT ||
 				segment_count < F2FS_MIN_SEGMENTS) {
-		f2fs_msg(sb, KERN_INFO,
-			"Invalid segment count (%u)",
-			segment_count);
+		f2fs_info(sbi, "Invalid segment count (%u)", segment_count);
 		return -EFSCORRUPTED;
 	}
 
 	if (total_sections > segment_count ||
 			total_sections < F2FS_MIN_SEGMENTS ||
 			segs_per_sec > segment_count || !segs_per_sec) {
-		f2fs_msg(sb, KERN_INFO,
-			"Invalid segment/section count (%u, %u x %u)",
-			segment_count, total_sections, segs_per_sec);
+		f2fs_info(sbi, "Invalid segment/section count (%u, %u x %u)",
+			  segment_count, total_sections, segs_per_sec);
 		return -EFSCORRUPTED;
 	}
 
 	if ((segment_count / segs_per_sec) < total_sections) {
-		f2fs_msg(sb, KERN_INFO,
-			"Small segment_count (%u < %u * %u)",
-			segment_count, segs_per_sec, total_sections);
+		f2fs_info(sbi, "Small segment_count (%u < %u * %u)",
+			  segment_count, segs_per_sec, total_sections);
 		return -EFSCORRUPTED;
 	}
 
 	if (segment_count > (le64_to_cpu(raw_super->block_count) >> 9)) {
-		f2fs_msg(sb, KERN_INFO,
-			"Wrong segment_count / block_count (%u > %llu)",
-			segment_count, le64_to_cpu(raw_super->block_count));
+		f2fs_info(sbi, "Wrong segment_count / block_count (%u > %llu)",
+			  segment_count, le64_to_cpu(raw_super->block_count));
 		return -EFSCORRUPTED;
 	}
 
+	if (RDEV(0).path[0]) {
+		block_t dev_seg_count = le32_to_cpu(RDEV(0).total_segments);
+		int i = 1;
+
+		while (i < MAX_DEVICES && RDEV(i).path[0]) {
+			dev_seg_count += le32_to_cpu(RDEV(i).total_segments);
+			i++;
+		}
+		if (segment_count != dev_seg_count) {
+			f2fs_info(sbi, "Segment count (%u) mismatch with total segments from devices (%u)",
+					segment_count, dev_seg_count);
+			return -EFSCORRUPTED;
+		}
+	}
+
 	if (secs_per_zone > total_sections || !secs_per_zone) {
-		f2fs_msg(sb, KERN_INFO,
-			"Wrong secs_per_zone / total_sections (%u, %u)",
-			secs_per_zone, total_sections);
+		f2fs_info(sbi, "Wrong secs_per_zone / total_sections (%u, %u)",
+			  secs_per_zone, total_sections);
 		return -EFSCORRUPTED;
 	}
 	if (le32_to_cpu(raw_super->extension_count) > F2FS_MAX_EXTENSION ||
 			raw_super->hot_ext_count > F2FS_MAX_EXTENSION ||
 			(le32_to_cpu(raw_super->extension_count) +
 			raw_super->hot_ext_count) > F2FS_MAX_EXTENSION) {
-		f2fs_msg(sb, KERN_INFO,
-			"Corrupted extension count (%u + %u > %u)",
-			le32_to_cpu(raw_super->extension_count),
-			raw_super->hot_ext_count,
-			F2FS_MAX_EXTENSION);
+		f2fs_info(sbi, "Corrupted extension count (%u + %u > %u)",
+			  le32_to_cpu(raw_super->extension_count),
+			  raw_super->hot_ext_count,
+			  F2FS_MAX_EXTENSION);
 		return -EFSCORRUPTED;
 	}
 
 	if (le32_to_cpu(raw_super->cp_payload) >
 				(blocks_per_seg - F2FS_CP_PACKS)) {
-		f2fs_msg(sb, KERN_INFO,
-			"Insane cp_payload (%u > %u)",
-			le32_to_cpu(raw_super->cp_payload),
-			blocks_per_seg - F2FS_CP_PACKS);
+		f2fs_info(sbi, "Insane cp_payload (%u > %u)",
+			  le32_to_cpu(raw_super->cp_payload),
+			  blocks_per_seg - F2FS_CP_PACKS);
 		return -EFSCORRUPTED;
 	}
 
@@ -2324,11 +2697,10 @@
 	if (le32_to_cpu(raw_super->node_ino) != 1 ||
 		le32_to_cpu(raw_super->meta_ino) != 2 ||
 		le32_to_cpu(raw_super->root_ino) != 3) {
-		f2fs_msg(sb, KERN_INFO,
-			"Invalid Fs Meta Ino: node(%u) meta(%u) root(%u)",
-			le32_to_cpu(raw_super->node_ino),
-			le32_to_cpu(raw_super->meta_ino),
-			le32_to_cpu(raw_super->root_ino));
+		f2fs_info(sbi, "Invalid Fs Meta Ino: node(%u) meta(%u) root(%u)",
+			  le32_to_cpu(raw_super->node_ino),
+			  le32_to_cpu(raw_super->meta_ino),
+			  le32_to_cpu(raw_super->root_ino));
 		return -EFSCORRUPTED;
 	}
 
@@ -2351,7 +2723,8 @@
 	unsigned int log_blocks_per_seg;
 	unsigned int segment_count_main;
 	unsigned int cp_pack_start_sum, cp_payload;
-	block_t user_block_count;
+	block_t user_block_count, valid_user_blocks;
+	block_t avail_node_count, valid_node_count;
 	int i, j;
 
 	total = le32_to_cpu(raw_super->segment_count);
@@ -2371,8 +2744,7 @@
 
 	if (unlikely(fsmeta < F2FS_MIN_SEGMENTS ||
 			ovp_segments == 0 || reserved_segments == 0)) {
-		f2fs_msg(sbi->sb, KERN_ERR,
-			"Wrong layout: check mkfs.f2fs version");
+		f2fs_err(sbi, "Wrong layout: check mkfs.f2fs version");
 		return 1;
 	}
 
@@ -2381,8 +2753,23 @@
 	log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
 	if (!user_block_count || user_block_count >=
 			segment_count_main << log_blocks_per_seg) {
-		f2fs_msg(sbi->sb, KERN_ERR,
-			"Wrong user_block_count: %u", user_block_count);
+		f2fs_err(sbi, "Wrong user_block_count: %u",
+			 user_block_count);
+		return 1;
+	}
+
+	valid_user_blocks = le64_to_cpu(ckpt->valid_block_count);
+	if (valid_user_blocks > user_block_count) {
+		f2fs_err(sbi, "Wrong valid_user_blocks: %u, user_block_count: %u",
+			 valid_user_blocks, user_block_count);
+		return 1;
+	}
+
+	valid_node_count = le32_to_cpu(ckpt->valid_node_count);
+	avail_node_count = sbi->total_node_count - F2FS_RESERVED_NODE_NUM;
+	if (valid_node_count > avail_node_count) {
+		f2fs_err(sbi, "Wrong valid_node_count: %u, avail_node_count: %u",
+			 valid_node_count, avail_node_count);
 		return 1;
 	}
 
@@ -2396,10 +2783,9 @@
 		for (j = i + 1; j < NR_CURSEG_NODE_TYPE; j++) {
 			if (le32_to_cpu(ckpt->cur_node_segno[i]) ==
 				le32_to_cpu(ckpt->cur_node_segno[j])) {
-				f2fs_msg(sbi->sb, KERN_ERR,
-					"Node segment (%u, %u) has the same "
-					"segno: %u", i, j,
-					le32_to_cpu(ckpt->cur_node_segno[i]));
+				f2fs_err(sbi, "Node segment (%u, %u) has the same segno: %u",
+					 i, j,
+					 le32_to_cpu(ckpt->cur_node_segno[i]));
 				return 1;
 			}
 		}
@@ -2411,10 +2797,9 @@
 		for (j = i + 1; j < NR_CURSEG_DATA_TYPE; j++) {
 			if (le32_to_cpu(ckpt->cur_data_segno[i]) ==
 				le32_to_cpu(ckpt->cur_data_segno[j])) {
-				f2fs_msg(sbi->sb, KERN_ERR,
-					"Data segment (%u, %u) has the same "
-					"segno: %u", i, j,
-					le32_to_cpu(ckpt->cur_data_segno[i]));
+				f2fs_err(sbi, "Data segment (%u, %u) has the same segno: %u",
+					 i, j,
+					 le32_to_cpu(ckpt->cur_data_segno[i]));
 				return 1;
 			}
 		}
@@ -2423,10 +2808,9 @@
 		for (j = 0; j < NR_CURSEG_DATA_TYPE; j++) {
 			if (le32_to_cpu(ckpt->cur_node_segno[i]) ==
 				le32_to_cpu(ckpt->cur_data_segno[j])) {
-				f2fs_msg(sbi->sb, KERN_ERR,
-					"Node segment (%u) and Data segment (%u)"
-					" has the same segno: %u", i, j,
-					le32_to_cpu(ckpt->cur_node_segno[i]));
+				f2fs_err(sbi, "Node segment (%u) and Data segment (%u) has the same segno: %u",
+					 i, j,
+					 le32_to_cpu(ckpt->cur_node_segno[i]));
 				return 1;
 			}
 		}
@@ -2437,9 +2821,8 @@
 
 	if (sit_bitmap_size != ((sit_segs / 2) << log_blocks_per_seg) / 8 ||
 		nat_bitmap_size != ((nat_segs / 2) << log_blocks_per_seg) / 8) {
-		f2fs_msg(sbi->sb, KERN_ERR,
-			"Wrong bitmap size: sit: %u, nat:%u",
-			sit_bitmap_size, nat_bitmap_size);
+		f2fs_err(sbi, "Wrong bitmap size: sit: %u, nat:%u",
+			 sit_bitmap_size, nat_bitmap_size);
 		return 1;
 	}
 
@@ -2448,14 +2831,22 @@
 	if (cp_pack_start_sum < cp_payload + 1 ||
 		cp_pack_start_sum > blocks_per_seg - 1 -
 			NR_CURSEG_TYPE) {
-		f2fs_msg(sbi->sb, KERN_ERR,
-			"Wrong cp_pack_start_sum: %u",
-			cp_pack_start_sum);
+		f2fs_err(sbi, "Wrong cp_pack_start_sum: %u",
+			 cp_pack_start_sum);
+		return 1;
+	}
+
+	if (__is_set_ckpt_flags(ckpt, CP_LARGE_NAT_BITMAP_FLAG) &&
+		le32_to_cpu(ckpt->checksum_offset) != CP_MIN_CHKSUM_OFFSET) {
+		f2fs_warn(sbi, "using deprecated layout of large_nat_bitmap, "
+			  "please run fsck v1.13.0 or higher to repair, chksum_offset: %u, "
+			  "fixed with patch: \"f2fs-tools: relocate chksum_offset for large_nat_bitmap feature\"",
+			  le32_to_cpu(ckpt->checksum_offset));
 		return 1;
 	}
 
 	if (unlikely(f2fs_cp_error(sbi))) {
-		f2fs_msg(sbi->sb, KERN_ERR, "A bug case: need to run fsck");
+		f2fs_err(sbi, "A bug case: need to run fsck");
 		return 1;
 	}
 	return 0;
@@ -2464,7 +2855,7 @@
 static void init_sb_info(struct f2fs_sb_info *sbi)
 {
 	struct f2fs_super_block *raw_super = sbi->raw_super;
-	int i, j;
+	int i;
 
 	sbi->log_sectors_per_block =
 		le32_to_cpu(raw_super->log_sectors_per_block);
@@ -2482,11 +2873,19 @@
 	sbi->node_ino_num = le32_to_cpu(raw_super->node_ino);
 	sbi->meta_ino_num = le32_to_cpu(raw_super->meta_ino);
 	sbi->cur_victim_sec = NULL_SECNO;
+	sbi->next_victim_seg[BG_GC] = NULL_SEGNO;
+	sbi->next_victim_seg[FG_GC] = NULL_SEGNO;
 	sbi->max_victim_search = DEF_MAX_VICTIM_SEARCH;
+	sbi->migration_granularity = sbi->segs_per_sec;
 
 	sbi->dir_level = DEF_DIR_LEVEL;
 	sbi->interval_time[CP_TIME] = DEF_CP_INTERVAL;
 	sbi->interval_time[REQ_TIME] = DEF_IDLE_INTERVAL;
+	sbi->interval_time[DISCARD_TIME] = DEF_IDLE_INTERVAL;
+	sbi->interval_time[GC_TIME] = DEF_IDLE_INTERVAL;
+	sbi->interval_time[DISABLE_TIME] = DEF_DISABLE_INTERVAL;
+	sbi->interval_time[UMOUNT_DISCARD_TIMEOUT] =
+				DEF_UMOUNT_DISCARD_TIMEOUT;
 	clear_sbi_flag(sbi, SBI_NEED_FSCK);
 
 	for (i = 0; i < NR_COUNT_TYPE; i++)
@@ -2497,9 +2896,6 @@
 
 	INIT_LIST_HEAD(&sbi->s_list);
 	mutex_init(&sbi->umount_mutex);
-	for (i = 0; i < NR_PAGE_TYPE - 1; i++)
-		for (j = HOT; j < NR_TEMP_TYPE; j++)
-			mutex_init(&sbi->wio_mutex[i][j]);
 	init_rwsem(&sbi->io_order_lock);
 	spin_lock_init(&sbi->cp_lock);
 
@@ -2507,6 +2903,7 @@
 	spin_lock_init(&sbi->dev_lock);
 
 	init_rwsem(&sbi->sb_lock);
+	init_rwsem(&sbi->pin_sem);
 }
 
 static int init_percpu_info(struct f2fs_sb_info *sbi)
@@ -2536,7 +2933,7 @@
 	unsigned int n = 0;
 	int err = -EIO;
 
-	if (!f2fs_sb_has_blkzoned(sbi->sb))
+	if (!f2fs_sb_has_blkzoned(sbi))
 		return 0;
 
 	if (sbi->blocks_per_blkz && sbi->blocks_per_blkz !=
@@ -2552,9 +2949,11 @@
 	if (nr_sectors & (bdev_zone_sectors(bdev) - 1))
 		FDEV(devi).nr_blkz++;
 
-	FDEV(devi).blkz_type = f2fs_kmalloc(sbi, FDEV(devi).nr_blkz,
-								GFP_KERNEL);
-	if (!FDEV(devi).blkz_type)
+	FDEV(devi).blkz_seq = f2fs_kzalloc(sbi,
+					BITS_TO_LONGS(FDEV(devi).nr_blkz)
+					* sizeof(unsigned long),
+					GFP_KERNEL);
+	if (!FDEV(devi).blkz_seq)
 		return -ENOMEM;
 
 #define F2FS_REPORT_NR_ZONES   4096
@@ -2581,13 +2980,14 @@
 		}
 
 		for (i = 0; i < nr_zones; i++) {
-			FDEV(devi).blkz_type[n] = zones[i].type;
+			if (zones[i].type != BLK_ZONE_TYPE_CONVENTIONAL)
+				set_bit(n, FDEV(devi).blkz_seq);
 			sector += zones[i].len;
 			n++;
 		}
 	}
 
-	kfree(zones);
+	kvfree(zones);
 
 	return err;
 }
@@ -2616,19 +3016,20 @@
 	for (block = 0; block < 2; block++) {
 		bh = sb_bread(sb, block);
 		if (!bh) {
-			f2fs_msg(sb, KERN_ERR, "Unable to read %dth superblock",
-				block + 1);
+			f2fs_err(sbi, "Unable to read %dth superblock",
+				 block + 1);
 			err = -EIO;
+			*recovery = 1;
 			continue;
 		}
 
 		/* sanity checking of raw super */
 		err = sanity_check_raw_super(sbi, bh);
 		if (err) {
-			f2fs_msg(sb, KERN_ERR,
-				"Can't find valid F2FS filesystem in %dth superblock",
-				block + 1);
+			f2fs_err(sbi, "Can't find valid F2FS filesystem in %dth superblock",
+				 block + 1);
 			brelse(bh);
+			*recovery = 1;
 			continue;
 		}
 
@@ -2641,13 +3042,9 @@
 		brelse(bh);
 	}
 
-	/* Fail to read any one of the superblocks*/
-	if (err < 0)
-		*recovery = 1;
-
 	/* No valid superblock */
 	if (!*raw_super)
-		kfree(super);
+		kvfree(super);
 	else
 		err = 0;
 
@@ -2657,6 +3054,7 @@
 int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
 {
 	struct buffer_head *bh;
+	__u32 crc = 0;
 	int err;
 
 	if ((recover && f2fs_readonly(sbi->sb)) ||
@@ -2665,6 +3063,13 @@
 		return -EROFS;
 	}
 
+	/* we should update superblock crc here */
+	if (!recover && f2fs_sb_has_sb_chksum(sbi)) {
+		crc = f2fs_crc32(sbi, F2FS_RAW_SUPER(sbi),
+				offsetof(struct f2fs_super_block, crc));
+		F2FS_RAW_SUPER(sbi)->crc = cpu_to_le32(crc);
+	}
+
 	/* write back-up superblock first */
 	bh = sb_bread(sbi->sb, sbi->valid_super_block ? 0 : 1);
 	if (!bh)
@@ -2747,37 +3152,80 @@
 
 #ifdef CONFIG_BLK_DEV_ZONED
 		if (bdev_zoned_model(FDEV(i).bdev) == BLK_ZONED_HM &&
-				!f2fs_sb_has_blkzoned(sbi->sb)) {
-			f2fs_msg(sbi->sb, KERN_ERR,
-				"Zoned block device feature not enabled\n");
+				!f2fs_sb_has_blkzoned(sbi)) {
+			f2fs_err(sbi, "Zoned block device feature not enabled\n");
 			return -EINVAL;
 		}
 		if (bdev_zoned_model(FDEV(i).bdev) != BLK_ZONED_NONE) {
 			if (init_blkz_info(sbi, i)) {
-				f2fs_msg(sbi->sb, KERN_ERR,
-					"Failed to initialize F2FS blkzone information");
+				f2fs_err(sbi, "Failed to initialize F2FS blkzone information");
 				return -EINVAL;
 			}
 			if (max_devices == 1)
 				break;
-			f2fs_msg(sbi->sb, KERN_INFO,
-				"Mount Device [%2d]: %20s, %8u, %8x - %8x (zone: %s)",
-				i, FDEV(i).path,
-				FDEV(i).total_segments,
-				FDEV(i).start_blk, FDEV(i).end_blk,
-				bdev_zoned_model(FDEV(i).bdev) == BLK_ZONED_HA ?
-				"Host-aware" : "Host-managed");
+			f2fs_info(sbi, "Mount Device [%2d]: %20s, %8u, %8x - %8x (zone: %s)",
+				  i, FDEV(i).path,
+				  FDEV(i).total_segments,
+				  FDEV(i).start_blk, FDEV(i).end_blk,
+				  bdev_zoned_model(FDEV(i).bdev) == BLK_ZONED_HA ?
+				  "Host-aware" : "Host-managed");
 			continue;
 		}
 #endif
-		f2fs_msg(sbi->sb, KERN_INFO,
-			"Mount Device [%2d]: %20s, %8u, %8x - %8x",
-				i, FDEV(i).path,
-				FDEV(i).total_segments,
-				FDEV(i).start_blk, FDEV(i).end_blk);
+		f2fs_info(sbi, "Mount Device [%2d]: %20s, %8u, %8x - %8x",
+			  i, FDEV(i).path,
+			  FDEV(i).total_segments,
+			  FDEV(i).start_blk, FDEV(i).end_blk);
 	}
-	f2fs_msg(sbi->sb, KERN_INFO,
-			"IO Block Size: %8d KB", F2FS_IO_SIZE_KB(sbi));
+	f2fs_info(sbi,
+		  "IO Block Size: %8d KB", F2FS_IO_SIZE_KB(sbi));
+	return 0;
+}
+
+static int f2fs_setup_casefold(struct f2fs_sb_info *sbi)
+{
+#ifdef CONFIG_UNICODE
+	if (f2fs_sb_has_casefold(sbi) && !sbi->s_encoding) {
+		const struct f2fs_sb_encodings *encoding_info;
+		struct unicode_map *encoding;
+		__u16 encoding_flags;
+
+		if (f2fs_sb_has_encrypt(sbi)) {
+			f2fs_err(sbi,
+				"Can't mount with encoding and encryption");
+			return -EINVAL;
+		}
+
+		if (f2fs_sb_read_encoding(sbi->raw_super, &encoding_info,
+					  &encoding_flags)) {
+			f2fs_err(sbi,
+				 "Encoding requested by superblock is unknown");
+			return -EINVAL;
+		}
+
+		encoding = utf8_load(encoding_info->version);
+		if (IS_ERR(encoding)) {
+			f2fs_err(sbi,
+				 "can't mount with superblock charset: %s-%s "
+				 "not supported by the kernel. flags: 0x%x.",
+				 encoding_info->name, encoding_info->version,
+				 encoding_flags);
+			return PTR_ERR(encoding);
+		}
+		f2fs_info(sbi, "Using encoding defined by superblock: "
+			 "%s-%s with flags 0x%hx", encoding_info->name,
+			 encoding_info->version?:"\b", encoding_flags);
+
+		sbi->s_encoding = encoding;
+		sbi->s_encoding_flags = encoding_flags;
+		sbi->sb->s_d_op = &f2fs_dentry_ops;
+	}
+#else
+	if (f2fs_sb_has_casefold(sbi)) {
+		f2fs_err(sbi, "Filesystem with casefold feature cannot be mounted without CONFIG_UNICODE");
+		return -EINVAL;
+	}
+#endif
 	return 0;
 }
 
@@ -2801,10 +3249,11 @@
 	struct f2fs_super_block *raw_super;
 	struct inode *root;
 	int err;
-	bool retry = true, need_fsck = false;
+	bool skip_recovery = false, need_fsck = false;
 	char *options = NULL;
 	int recovery, i, valid_super_block;
 	struct curseg_info *seg_i;
+	int retry_cnt = 1;
 
 try_onemore:
 	err = -EINVAL;
@@ -2822,7 +3271,7 @@
 	/* Load the checksum driver */
 	sbi->s_chksum_driver = crypto_alloc_shash("crc32", 0, 0);
 	if (IS_ERR(sbi->s_chksum_driver)) {
-		f2fs_msg(sb, KERN_ERR, "Cannot load crc32 driver.");
+		f2fs_err(sbi, "Cannot load crc32 driver.");
 		err = PTR_ERR(sbi->s_chksum_driver);
 		sbi->s_chksum_driver = NULL;
 		goto free_sbi;
@@ -2830,7 +3279,7 @@
 
 	/* set a block size */
 	if (unlikely(!sb_set_blocksize(sb, F2FS_BLKSIZE))) {
-		f2fs_msg(sb, KERN_ERR, "unable to set blocksize");
+		f2fs_err(sbi, "unable to set blocksize");
 		goto free_sbi;
 	}
 
@@ -2843,7 +3292,7 @@
 	sbi->raw_super = raw_super;
 
 	/* precompute checksum seed for metadata */
-	if (f2fs_sb_has_inode_chksum(sb))
+	if (f2fs_sb_has_inode_chksum(sbi))
 		sbi->s_chksum_seed = f2fs_chksum(sbi, ~0, raw_super->uuid,
 						sizeof(raw_super->uuid));
 
@@ -2853,9 +3302,8 @@
 	 * devices, but mandatory for host-managed zoned block devices.
 	 */
 #ifndef CONFIG_BLK_DEV_ZONED
-	if (f2fs_sb_has_blkzoned(sb)) {
-		f2fs_msg(sb, KERN_ERR,
-			 "Zoned block device support is not enabled\n");
+	if (f2fs_sb_has_blkzoned(sbi)) {
+		f2fs_err(sbi, "Zoned block device support is not enabled");
 		err = -EOPNOTSUPP;
 		goto free_sb_buf;
 	}
@@ -2876,17 +3324,17 @@
 	sb->s_maxbytes = sbi->max_file_blocks <<
 				le32_to_cpu(raw_super->log_blocksize);
 	sb->s_max_links = F2FS_LINK_MAX;
-	get_random_bytes(&sbi->s_next_generation, sizeof(u32));
+
+	err = f2fs_setup_casefold(sbi);
+	if (err)
+		goto free_options;
 
 #ifdef CONFIG_QUOTA
 	sb->dq_op = &f2fs_quota_operations;
-	if (f2fs_sb_has_quota_ino(sb))
-		sb->s_qcop = &dquot_quotactl_sysfile_ops;
-	else
-		sb->s_qcop = &f2fs_quotactl_ops;
+	sb->s_qcop = &f2fs_quotactl_ops;
 	sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
 
-	if (f2fs_sb_has_quota_ino(sbi->sb)) {
+	if (f2fs_sb_has_quota_ino(sbi)) {
 		for (i = 0; i < MAXQUOTAS; i++) {
 			if (f2fs_qf_ino(sbi->sb, i))
 				sbi->nquota_files++;
@@ -2895,9 +3343,12 @@
 #endif
 
 	sb->s_op = &f2fs_sops;
-#ifdef CONFIG_F2FS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	sb->s_cop = &f2fs_cryptops;
 #endif
+#ifdef CONFIG_FS_VERITY
+	sb->s_vop = &f2fs_verityops;
+#endif
 	sb->s_xattr = f2fs_xattr_handlers;
 	sb->s_export_op = &f2fs_export_ops;
 	sb->s_magic = F2FS_SUPER_MAGIC;
@@ -2912,6 +3363,7 @@
 	mutex_init(&sbi->gc_mutex);
 	mutex_init(&sbi->writepages);
 	mutex_init(&sbi->cp_mutex);
+	mutex_init(&sbi->resize_mutex);
 	init_rwsem(&sbi->node_write);
 	init_rwsem(&sbi->node_change);
 
@@ -2943,10 +3395,13 @@
 			sbi->write_io[i][j].bio = NULL;
 			spin_lock_init(&sbi->write_io[i][j].io_lock);
 			INIT_LIST_HEAD(&sbi->write_io[i][j].io_list);
+			INIT_LIST_HEAD(&sbi->write_io[i][j].bio_list);
+			init_rwsem(&sbi->write_io[i][j].bio_list_lock);
 		}
 	}
 
 	init_rwsem(&sbi->cp_rwsem);
+	init_rwsem(&sbi->quota_sem);
 	init_waitqueue_head(&sbi->cp_wait);
 	init_sb_info(sbi);
 
@@ -2954,7 +3409,7 @@
 	if (err)
 		goto free_bio_info;
 
-	if (F2FS_IO_SIZE(sbi) > 1) {
+	if (F2FS_IO_ALIGNED(sbi)) {
 		sbi->write_io_dummy =
 			mempool_create_page_pool(2 * (F2FS_IO_SIZE(sbi) - 1), 0);
 		if (!sbi->write_io_dummy) {
@@ -2966,21 +3421,31 @@
 	/* get an inode for meta space */
 	sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi));
 	if (IS_ERR(sbi->meta_inode)) {
-		f2fs_msg(sb, KERN_ERR, "Failed to read F2FS meta data inode");
+		f2fs_err(sbi, "Failed to read F2FS meta data inode");
 		err = PTR_ERR(sbi->meta_inode);
 		goto free_io_dummy;
 	}
 
 	err = f2fs_get_valid_checkpoint(sbi);
 	if (err) {
-		f2fs_msg(sb, KERN_ERR, "Failed to get valid F2FS checkpoint");
+		f2fs_err(sbi, "Failed to get valid F2FS checkpoint");
 		goto free_meta_inode;
 	}
 
+	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_QUOTA_NEED_FSCK_FLAG))
+		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
+	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_DISABLED_QUICK_FLAG)) {
+		set_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
+		sbi->interval_time[DISABLE_TIME] = DEF_DISABLE_QUICK_INTERVAL;
+	}
+
+	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_FSCK_FLAG))
+		set_sbi_flag(sbi, SBI_NEED_FSCK);
+
 	/* Initialize device list */
 	err = f2fs_scan_devices(sbi);
 	if (err) {
-		f2fs_msg(sb, KERN_ERR, "Failed to find devices");
+		f2fs_err(sbi, "Failed to find devices");
 		goto free_devices;
 	}
 
@@ -3000,6 +3465,7 @@
 		INIT_LIST_HEAD(&sbi->inode_list[i]);
 		spin_lock_init(&sbi->inode_lock[i]);
 	}
+	mutex_init(&sbi->flush_lock);
 
 	f2fs_init_extent_cache_info(sbi);
 
@@ -3010,14 +3476,14 @@
 	/* setup f2fs internal modules */
 	err = f2fs_build_segment_manager(sbi);
 	if (err) {
-		f2fs_msg(sb, KERN_ERR,
-			"Failed to initialize F2FS segment manager");
+		f2fs_err(sbi, "Failed to initialize F2FS segment manager (%d)",
+			 err);
 		goto free_sm;
 	}
 	err = f2fs_build_node_manager(sbi);
 	if (err) {
-		f2fs_msg(sb, KERN_ERR,
-			"Failed to initialize F2FS node manager");
+		f2fs_err(sbi, "Failed to initialize F2FS node manager (%d)",
+			 err);
 		goto free_nm;
 	}
 
@@ -3042,7 +3508,7 @@
 	/* get an inode for node space */
 	sbi->node_inode = f2fs_iget(sb, F2FS_NODE_INO(sbi));
 	if (IS_ERR(sbi->node_inode)) {
-		f2fs_msg(sb, KERN_ERR, "Failed to read node inode");
+		f2fs_err(sbi, "Failed to read node inode");
 		err = PTR_ERR(sbi->node_inode);
 		goto free_stats;
 	}
@@ -3050,7 +3516,7 @@
 	/* read root inode and dentry */
 	root = f2fs_iget(sb, F2FS_ROOT_INO(sbi));
 	if (IS_ERR(root)) {
-		f2fs_msg(sb, KERN_ERR, "Failed to read root inode");
+		f2fs_err(sbi, "Failed to read root inode");
 		err = PTR_ERR(root);
 		goto free_node_inode;
 	}
@@ -3064,7 +3530,7 @@
 	sb->s_root = d_make_root(root); /* allocate root dentry */
 	if (!sb->s_root) {
 		err = -ENOMEM;
-		goto free_root_inode;
+		goto free_node_inode;
 	}
 
 	err = f2fs_register_sysfs(sbi);
@@ -3073,13 +3539,10 @@
 
 #ifdef CONFIG_QUOTA
 	/* Enable quota usage during mount */
-	if (f2fs_sb_has_quota_ino(sb) && !f2fs_readonly(sb)) {
+	if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sb)) {
 		err = f2fs_enable_quotas(sb);
-		if (err) {
-			f2fs_msg(sb, KERN_ERR,
-				"Cannot turn on quotas: error %d", err);
-			goto free_sysfs;
-		}
+		if (err)
+			f2fs_err(sbi, "Cannot turn on quotas: error %d", err);
 	}
 #endif
 	/* if there are nt orphan nodes free them */
@@ -3087,29 +3550,38 @@
 	if (err)
 		goto free_meta;
 
+	if (unlikely(is_set_ckpt_flags(sbi, CP_DISABLED_FLAG)))
+		goto reset_checkpoint;
+
 	/* recover fsynced data */
 	if (!test_opt(sbi, DISABLE_ROLL_FORWARD)) {
 		/*
 		 * mount should be failed, when device has readonly mode, and
 		 * previous checkpoint was not done by clean system shutdown.
 		 */
-		if (bdev_read_only(sb->s_bdev) &&
-				!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG)) {
-			err = -EROFS;
-			goto free_meta;
+		if (f2fs_hw_is_readonly(sbi)) {
+			if (!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG)) {
+				err = -EROFS;
+				f2fs_err(sbi, "Need to recover fsync data, but write access unavailable");
+				goto free_meta;
+			}
+			f2fs_info(sbi, "write access unavailable, skipping recovery");
+			goto reset_checkpoint;
 		}
 
 		if (need_fsck)
 			set_sbi_flag(sbi, SBI_NEED_FSCK);
 
-		if (!retry)
-			goto skip_recovery;
+		if (skip_recovery)
+			goto reset_checkpoint;
 
 		err = f2fs_recover_fsync_data(sbi, false);
 		if (err < 0) {
+			if (err != -ENOMEM)
+				skip_recovery = true;
 			need_fsck = true;
-			f2fs_msg(sb, KERN_ERR,
-				"Cannot recover all fsync data errno=%d", err);
+			f2fs_err(sbi, "Cannot recover all fsync data errno=%d",
+				 err);
 			goto free_meta;
 		}
 	} else {
@@ -3117,15 +3589,22 @@
 
 		if (!f2fs_readonly(sb) && err > 0) {
 			err = -EINVAL;
-			f2fs_msg(sb, KERN_ERR,
-				"Need to recover fsync data");
+			f2fs_err(sbi, "Need to recover fsync data");
 			goto free_meta;
 		}
 	}
-skip_recovery:
+reset_checkpoint:
 	/* f2fs_recover_fsync_data() cleared this already */
 	clear_sbi_flag(sbi, SBI_POR_DOING);
 
+	if (test_opt(sbi, DISABLE_CHECKPOINT)) {
+		err = f2fs_disable_checkpoint(sbi);
+		if (err)
+			goto sync_free_meta;
+	} else if (is_set_ckpt_flags(sbi, CP_DISABLED_FLAG)) {
+		f2fs_enable_checkpoint(sbi);
+	}
+
 	/*
 	 * If filesystem is not mounted as read-only then
 	 * do start the gc_thread.
@@ -3134,32 +3613,37 @@
 		/* After POR, we can run background GC thread.*/
 		err = f2fs_start_gc_thread(sbi);
 		if (err)
-			goto free_meta;
+			goto sync_free_meta;
 	}
-	kfree(options);
+	kvfree(options);
 
 	/* recover broken superblock */
 	if (recovery) {
 		err = f2fs_commit_super(sbi, true);
-		f2fs_msg(sb, KERN_INFO,
-			"Try to recover %dth superblock, ret: %d",
-			sbi->valid_super_block ? 1 : 2, err);
+		f2fs_info(sbi, "Try to recover %dth superblock, ret: %d",
+			  sbi->valid_super_block ? 1 : 2, err);
 	}
 
 	f2fs_join_shrinker(sbi);
 
 	f2fs_tuning_parameters(sbi);
 
-	f2fs_msg(sbi->sb, KERN_NOTICE, "Mounted with checkpoint version = %llx",
-				cur_cp_version(F2FS_CKPT(sbi)));
+	f2fs_notice(sbi, "Mounted with checkpoint version = %llx",
+		    cur_cp_version(F2FS_CKPT(sbi)));
 	f2fs_update_time(sbi, CP_TIME);
 	f2fs_update_time(sbi, REQ_TIME);
+	clear_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
 	return 0;
 
+sync_free_meta:
+	/* safe to flush all the data */
+	sync_filesystem(sbi->sb);
+	retry_cnt = 0;
+
 free_meta:
 #ifdef CONFIG_QUOTA
 	f2fs_truncate_quota_inode_pages(sb);
-	if (f2fs_sb_has_quota_ino(sb) && !f2fs_readonly(sb))
+	if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sb))
 		f2fs_quota_off_umount(sbi->sb);
 #endif
 	/*
@@ -3169,9 +3653,8 @@
 	 * falls into an infinite loop in f2fs_sync_meta_pages().
 	 */
 	truncate_inode_pages_final(META_MAPPING(sbi));
-#ifdef CONFIG_QUOTA
-free_sysfs:
-#endif
+	/* evict some inodes being cached by GC */
+	evict_inodes(sb);
 	f2fs_unregister_sysfs(sbi);
 free_root_inode:
 	dput(sb->s_root);
@@ -3189,7 +3672,7 @@
 	f2fs_destroy_segment_manager(sbi);
 free_devices:
 	destroy_device_list(sbi);
-	kfree(sbi->ckpt);
+	kvfree(sbi->ckpt);
 free_meta_inode:
 	make_bad_inode(sbi->meta_inode);
 	iput(sbi->meta_inode);
@@ -3200,23 +3683,27 @@
 	destroy_percpu_info(sbi);
 free_bio_info:
 	for (i = 0; i < NR_PAGE_TYPE; i++)
-		kfree(sbi->write_io[i]);
+		kvfree(sbi->write_io[i]);
+
+#ifdef CONFIG_UNICODE
+	utf8_unload(sbi->s_encoding);
+#endif
 free_options:
 #ifdef CONFIG_QUOTA
 	for (i = 0; i < MAXQUOTAS; i++)
-		kfree(F2FS_OPTION(sbi).s_qf_names[i]);
+		kvfree(F2FS_OPTION(sbi).s_qf_names[i]);
 #endif
-	kfree(options);
+	kvfree(options);
 free_sb_buf:
-	kfree(raw_super);
+	kvfree(raw_super);
 free_sbi:
 	if (sbi->s_chksum_driver)
 		crypto_free_shash(sbi->s_chksum_driver);
-	kfree(sbi);
+	kvfree(sbi);
 
 	/* give only one another chance */
-	if (retry) {
-		retry = false;
+	if (retry_cnt > 0 && skip_recovery) {
+		retry_cnt--;
 		shrink_dcache_sb(sb);
 		goto try_onemore;
 	}
@@ -3317,17 +3804,19 @@
 	err = register_filesystem(&f2fs_fs_type);
 	if (err)
 		goto free_shrinker;
-	err = f2fs_create_root_stats();
-	if (err)
-		goto free_filesystem;
+	f2fs_create_root_stats();
 	err = f2fs_init_post_read_processing();
 	if (err)
 		goto free_root_stats;
+	err = f2fs_init_bio_entry_cache();
+	if (err)
+		goto free_post_read;
 	return 0;
 
+free_post_read:
+	f2fs_destroy_post_read_processing();
 free_root_stats:
 	f2fs_destroy_root_stats();
-free_filesystem:
 	unregister_filesystem(&f2fs_fs_type);
 free_shrinker:
 	unregister_shrinker(&f2fs_shrinker_info);
@@ -3349,6 +3838,7 @@
 
 static void __exit exit_f2fs_fs(void)
 {
+	f2fs_destroy_bio_entry_cache();
 	f2fs_destroy_post_read_processing();
 	f2fs_destroy_root_stats();
 	unregister_filesystem(&f2fs_fs_type);
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index 9888718..62fab5f 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -1,18 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * f2fs sysfs interface
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
  * Copyright (c) 2017 Chao Yu <chao@kernel.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/compiler.h>
 #include <linux/proc_fs.h>
 #include <linux/f2fs_fs.h>
 #include <linux/seq_file.h>
+#include <linux/unicode.h>
 
 #include "f2fs.h"
 #include "segment.h"
@@ -71,6 +69,33 @@
 		(unsigned long long)(dirty_segments(sbi)));
 }
 
+static ssize_t unusable_show(struct f2fs_attr *a,
+		struct f2fs_sb_info *sbi, char *buf)
+{
+	block_t unusable;
+
+	if (test_opt(sbi, DISABLE_CHECKPOINT))
+		unusable = sbi->unusable_block_count;
+	else
+		unusable = f2fs_get_unusable_blocks(sbi);
+	return snprintf(buf, PAGE_SIZE, "%llu\n",
+		(unsigned long long)unusable);
+}
+
+static ssize_t encoding_show(struct f2fs_attr *a,
+		struct f2fs_sb_info *sbi, char *buf)
+{
+#ifdef CONFIG_UNICODE
+	if (f2fs_sb_has_casefold(sbi))
+		return snprintf(buf, PAGE_SIZE, "%s (%d.%d.%d)\n",
+			sbi->s_encoding->charset,
+			(sbi->s_encoding->version >> 16) & 0xff,
+			(sbi->s_encoding->version >> 8) & 0xff,
+			sbi->s_encoding->version & 0xff);
+#endif
+	return snprintf(buf, PAGE_SIZE, "(none)");
+}
+
 static ssize_t lifetime_write_kbytes_show(struct f2fs_attr *a,
 		struct f2fs_sb_info *sbi, char *buf)
 {
@@ -93,33 +118,44 @@
 	if (!sb->s_bdev->bd_part)
 		return snprintf(buf, PAGE_SIZE, "0\n");
 
-	if (f2fs_sb_has_encrypt(sb))
+	if (f2fs_sb_has_encrypt(sbi))
 		len += snprintf(buf, PAGE_SIZE - len, "%s",
 						"encryption");
-	if (f2fs_sb_has_blkzoned(sb))
+	if (f2fs_sb_has_blkzoned(sbi))
 		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
 				len ? ", " : "", "blkzoned");
-	if (f2fs_sb_has_extra_attr(sb))
+	if (f2fs_sb_has_extra_attr(sbi))
 		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
 				len ? ", " : "", "extra_attr");
-	if (f2fs_sb_has_project_quota(sb))
+	if (f2fs_sb_has_project_quota(sbi))
 		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
 				len ? ", " : "", "projquota");
-	if (f2fs_sb_has_inode_chksum(sb))
+	if (f2fs_sb_has_inode_chksum(sbi))
 		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
 				len ? ", " : "", "inode_checksum");
-	if (f2fs_sb_has_flexible_inline_xattr(sb))
+	if (f2fs_sb_has_flexible_inline_xattr(sbi))
 		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
 				len ? ", " : "", "flexible_inline_xattr");
-	if (f2fs_sb_has_quota_ino(sb))
+	if (f2fs_sb_has_quota_ino(sbi))
 		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
 				len ? ", " : "", "quota_ino");
-	if (f2fs_sb_has_inode_crtime(sb))
+	if (f2fs_sb_has_inode_crtime(sbi))
 		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
 				len ? ", " : "", "inode_crtime");
-	if (f2fs_sb_has_lost_found(sb))
+	if (f2fs_sb_has_lost_found(sbi))
 		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
 				len ? ", " : "", "lost_found");
+	if (f2fs_sb_has_verity(sbi))
+		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
+				len ? ", " : "", "verity");
+	if (f2fs_sb_has_sb_chksum(sbi))
+		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
+				len ? ", " : "", "sb_checksum");
+	if (f2fs_sb_has_casefold(sbi))
+		len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
+				len ? ", " : "", "casefold");
+	len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
+				len ? ", " : "", "pin_file");
 	len += snprintf(buf + len, PAGE_SIZE - len, "\n");
 	return len;
 }
@@ -222,6 +258,8 @@
 #ifdef CONFIG_F2FS_FAULT_INJECTION
 	if (a->struct_type == FAULT_INFO_TYPE && t >= (1 << FAULT_MAX))
 		return -EINVAL;
+	if (a->struct_type == FAULT_INFO_RATE && t >= UINT_MAX)
+		return -EINVAL;
 #endif
 	if (a->struct_type == RESERVED_BLOCKS) {
 		spin_lock(&sbi->stat_lock);
@@ -246,6 +284,11 @@
 		return count;
 	}
 
+	if (!strcmp(a->attr.name, "migration_granularity")) {
+		if (t == 0 || t > sbi->segs_per_sec)
+			return -EINVAL;
+	}
+
 	if (!strcmp(a->attr.name, "trim_sections"))
 		return -EINVAL;
 
@@ -343,6 +386,9 @@
 	FEAT_QUOTA_INO,
 	FEAT_INODE_CRTIME,
 	FEAT_LOST_FOUND,
+	FEAT_VERITY,
+	FEAT_SB_CHECKSUM,
+	FEAT_CASEFOLD,
 };
 
 static ssize_t f2fs_feature_show(struct f2fs_attr *a,
@@ -359,6 +405,9 @@
 	case FEAT_QUOTA_INO:
 	case FEAT_INODE_CRTIME:
 	case FEAT_LOST_FOUND:
+	case FEAT_VERITY:
+	case FEAT_SB_CHECKSUM:
+	case FEAT_CASEFOLD:
 		return snprintf(buf, PAGE_SIZE, "supported\n");
 	}
 	return 0;
@@ -396,6 +445,7 @@
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, gc_idle, gc_mode);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, gc_urgent, gc_mode);
 F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, reclaim_segments, rec_prefree_segments);
+F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, main_blkaddr, main_blkaddr);
 F2FS_RW_ATTR(DCC_INFO, discard_cmd_control, max_small_discards, max_discards);
 F2FS_RW_ATTR(DCC_INFO, discard_cmd_control, discard_granularity, discard_granularity);
 F2FS_RW_ATTR(RESERVED_BLOCKS, f2fs_sb_info, reserved_blocks, reserved_blocks);
@@ -410,9 +460,15 @@
 F2FS_RW_ATTR(NM_INFO, f2fs_nm_info, ra_nid_pages, ra_nid_pages);
 F2FS_RW_ATTR(NM_INFO, f2fs_nm_info, dirty_nats_ratio, dirty_nats_ratio);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, max_victim_search, max_victim_search);
+F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, migration_granularity, migration_granularity);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, cp_interval, interval_time[CP_TIME]);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, idle_interval, interval_time[REQ_TIME]);
+F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, discard_idle_interval,
+					interval_time[DISCARD_TIME]);
+F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, gc_idle_interval, interval_time[GC_TIME]);
+F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info,
+		umount_discard_timeout, interval_time[UMOUNT_DISCARD_TIMEOUT]);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, iostat_enable, iostat_enable);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, readdir_ra, readdir_ra);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, gc_pin_file_thresh, gc_pin_file_threshold);
@@ -425,8 +481,10 @@
 F2FS_GENERAL_RO_ATTR(lifetime_write_kbytes);
 F2FS_GENERAL_RO_ATTR(features);
 F2FS_GENERAL_RO_ATTR(current_reserved_blocks);
+F2FS_GENERAL_RO_ATTR(unusable);
+F2FS_GENERAL_RO_ATTR(encoding);
 
-#ifdef CONFIG_F2FS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 F2FS_FEATURE_RO_ATTR(encryption, FEAT_CRYPTO);
 #endif
 #ifdef CONFIG_BLK_DEV_ZONED
@@ -440,6 +498,11 @@
 F2FS_FEATURE_RO_ATTR(quota_ino, FEAT_QUOTA_INO);
 F2FS_FEATURE_RO_ATTR(inode_crtime, FEAT_INODE_CRTIME);
 F2FS_FEATURE_RO_ATTR(lost_found, FEAT_LOST_FOUND);
+#ifdef CONFIG_FS_VERITY
+F2FS_FEATURE_RO_ATTR(verity, FEAT_VERITY);
+#endif
+F2FS_FEATURE_RO_ATTR(sb_checksum, FEAT_SB_CHECKSUM);
+F2FS_FEATURE_RO_ATTR(casefold, FEAT_CASEFOLD);
 
 #define ATTR_LIST(name) (&f2fs_attr_##name.attr)
 static struct attribute *f2fs_attrs[] = {
@@ -450,6 +513,7 @@
 	ATTR_LIST(gc_idle),
 	ATTR_LIST(gc_urgent),
 	ATTR_LIST(reclaim_segments),
+	ATTR_LIST(main_blkaddr),
 	ATTR_LIST(max_small_discards),
 	ATTR_LIST(discard_granularity),
 	ATTR_LIST(batched_trim_sections),
@@ -460,12 +524,16 @@
 	ATTR_LIST(min_hot_blocks),
 	ATTR_LIST(min_ssr_sections),
 	ATTR_LIST(max_victim_search),
+	ATTR_LIST(migration_granularity),
 	ATTR_LIST(dir_level),
 	ATTR_LIST(ram_thresh),
 	ATTR_LIST(ra_nid_pages),
 	ATTR_LIST(dirty_nats_ratio),
 	ATTR_LIST(cp_interval),
 	ATTR_LIST(idle_interval),
+	ATTR_LIST(discard_idle_interval),
+	ATTR_LIST(gc_idle_interval),
+	ATTR_LIST(umount_discard_timeout),
 	ATTR_LIST(iostat_enable),
 	ATTR_LIST(readdir_ra),
 	ATTR_LIST(gc_pin_file_thresh),
@@ -475,15 +543,17 @@
 	ATTR_LIST(inject_type),
 #endif
 	ATTR_LIST(dirty_segments),
+	ATTR_LIST(unusable),
 	ATTR_LIST(lifetime_write_kbytes),
 	ATTR_LIST(features),
 	ATTR_LIST(reserved_blocks),
 	ATTR_LIST(current_reserved_blocks),
+	ATTR_LIST(encoding),
 	NULL,
 };
 
 static struct attribute *f2fs_feat_attrs[] = {
-#ifdef CONFIG_F2FS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	ATTR_LIST(encryption),
 #endif
 #ifdef CONFIG_BLK_DEV_ZONED
@@ -497,6 +567,11 @@
 	ATTR_LIST(quota_ino),
 	ATTR_LIST(inode_crtime),
 	ATTR_LIST(lost_found),
+#ifdef CONFIG_FS_VERITY
+	ATTR_LIST(verity),
+#endif
+	ATTR_LIST(sb_checksum),
+	ATTR_LIST(casefold),
 	NULL,
 };
 
@@ -545,8 +620,7 @@
 
 		if ((i % 10) == 0)
 			seq_printf(seq, "%-10d", i);
-		seq_printf(seq, "%d|%-3u", se->type,
-					get_valid_blocks(sbi, i, false));
+		seq_printf(seq, "%d|%-3u", se->type, se->valid_blocks);
 		if ((i % 10) == 9 || i == (total_segs - 1))
 			seq_putc(seq, '\n');
 		else
@@ -572,8 +646,7 @@
 		struct seg_entry *se = get_seg_entry(sbi, i);
 
 		seq_printf(seq, "%-10d", i);
-		seq_printf(seq, "%d|%-3u|", se->type,
-					get_valid_blocks(sbi, i, false));
+		seq_printf(seq, "%d|%-3u|", se->type, se->valid_blocks);
 		for (j = 0; j < SIT_VBLOCK_MAP_SIZE; j++)
 			seq_printf(seq, " %.2x", se->cur_valid_map[j]);
 		seq_putc(seq, '\n');
diff --git a/fs/f2fs/trace.c b/fs/f2fs/trace.c
index 8ac1851..d0ab533 100644
--- a/fs/f2fs/trace.c
+++ b/fs/f2fs/trace.c
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * f2fs IO tracer
  *
  * Copyright (c) 2014 Motorola Mobility
  * Copyright (c) 2014 Jaegeuk Kim <jaegeuk@kernel.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/fs.h>
 #include <linux/f2fs_fs.h>
diff --git a/fs/f2fs/trace.h b/fs/f2fs/trace.h
index 67db24a..e8075fc 100644
--- a/fs/f2fs/trace.h
+++ b/fs/f2fs/trace.h
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * f2fs IO tracer
  *
  * Copyright (c) 2014 Motorola Mobility
  * Copyright (c) 2014 Jaegeuk Kim <jaegeuk@kernel.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #ifndef __F2FS_TRACE_H__
 #define __F2FS_TRACE_H__
diff --git a/fs/f2fs/verity.c b/fs/f2fs/verity.c
new file mode 100644
index 0000000..a401ef7
--- /dev/null
+++ b/fs/f2fs/verity.c
@@ -0,0 +1,247 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * fs/f2fs/verity.c: fs-verity support for f2fs
+ *
+ * Copyright 2019 Google LLC
+ */
+
+/*
+ * Implementation of fsverity_operations for f2fs.
+ *
+ * Like ext4, f2fs stores the verity metadata (Merkle tree and
+ * fsverity_descriptor) past the end of the file, starting at the first 64K
+ * boundary beyond i_size.  This approach works because (a) verity files are
+ * readonly, and (b) pages fully beyond i_size aren't visible to userspace but
+ * can be read/written internally by f2fs with only some relatively small
+ * changes to f2fs.  Extended attributes cannot be used because (a) f2fs limits
+ * the total size of an inode's xattr entries to 4096 bytes, which wouldn't be
+ * enough for even a single Merkle tree block, and (b) f2fs encryption doesn't
+ * encrypt xattrs, yet the verity metadata *must* be encrypted when the file is
+ * because it contains hashes of the plaintext data.
+ *
+ * Using a 64K boundary rather than a 4K one keeps things ready for
+ * architectures with 64K pages, and it doesn't necessarily waste space on-disk
+ * since there can be a hole between i_size and the start of the Merkle tree.
+ */
+
+#include <linux/f2fs_fs.h>
+
+#include "f2fs.h"
+#include "xattr.h"
+
+static inline loff_t f2fs_verity_metadata_pos(const struct inode *inode)
+{
+	return round_up(inode->i_size, 65536);
+}
+
+/*
+ * Read some verity metadata from the inode.  __vfs_read() can't be used because
+ * we need to read beyond i_size.
+ */
+static int pagecache_read(struct inode *inode, void *buf, size_t count,
+			  loff_t pos)
+{
+	while (count) {
+		size_t n = min_t(size_t, count,
+				 PAGE_SIZE - offset_in_page(pos));
+		struct page *page;
+		void *addr;
+
+		page = read_mapping_page(inode->i_mapping, pos >> PAGE_SHIFT,
+					 NULL);
+		if (IS_ERR(page))
+			return PTR_ERR(page);
+
+		addr = kmap_atomic(page);
+		memcpy(buf, addr + offset_in_page(pos), n);
+		kunmap_atomic(addr);
+
+		put_page(page);
+
+		buf += n;
+		pos += n;
+		count -= n;
+	}
+	return 0;
+}
+
+/*
+ * Write some verity metadata to the inode for FS_IOC_ENABLE_VERITY.
+ * kernel_write() can't be used because the file descriptor is readonly.
+ */
+static int pagecache_write(struct inode *inode, const void *buf, size_t count,
+			   loff_t pos)
+{
+	if (pos + count > inode->i_sb->s_maxbytes)
+		return -EFBIG;
+
+	while (count) {
+		size_t n = min_t(size_t, count,
+				 PAGE_SIZE - offset_in_page(pos));
+		struct page *page;
+		void *fsdata;
+		void *addr;
+		int res;
+
+		res = pagecache_write_begin(NULL, inode->i_mapping, pos, n, 0,
+					    &page, &fsdata);
+		if (res)
+			return res;
+
+		addr = kmap_atomic(page);
+		memcpy(addr + offset_in_page(pos), buf, n);
+		kunmap_atomic(addr);
+
+		res = pagecache_write_end(NULL, inode->i_mapping, pos, n, n,
+					  page, fsdata);
+		if (res < 0)
+			return res;
+		if (res != n)
+			return -EIO;
+
+		buf += n;
+		pos += n;
+		count -= n;
+	}
+	return 0;
+}
+
+/*
+ * Format of f2fs verity xattr.  This points to the location of the verity
+ * descriptor within the file data rather than containing it directly because
+ * the verity descriptor *must* be encrypted when f2fs encryption is used.  But,
+ * f2fs encryption does not encrypt xattrs.
+ */
+struct fsverity_descriptor_location {
+	__le32 version;
+	__le32 size;
+	__le64 pos;
+};
+
+static int f2fs_begin_enable_verity(struct file *filp)
+{
+	struct inode *inode = file_inode(filp);
+	int err;
+
+	if (f2fs_verity_in_progress(inode))
+		return -EBUSY;
+
+	if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode))
+		return -EOPNOTSUPP;
+
+	/*
+	 * Since the file was opened readonly, we have to initialize the quotas
+	 * here and not rely on ->open() doing it.  This must be done before
+	 * evicting the inline data.
+	 */
+	err = dquot_initialize(inode);
+	if (err)
+		return err;
+
+	err = f2fs_convert_inline_inode(inode);
+	if (err)
+		return err;
+
+	set_inode_flag(inode, FI_VERITY_IN_PROGRESS);
+	return 0;
+}
+
+static int f2fs_end_enable_verity(struct file *filp, const void *desc,
+				  size_t desc_size, u64 merkle_tree_size)
+{
+	struct inode *inode = file_inode(filp);
+	u64 desc_pos = f2fs_verity_metadata_pos(inode) + merkle_tree_size;
+	struct fsverity_descriptor_location dloc = {
+		.version = cpu_to_le32(1),
+		.size = cpu_to_le32(desc_size),
+		.pos = cpu_to_le64(desc_pos),
+	};
+	int err = 0;
+
+	if (desc != NULL) {
+		/* Succeeded; write the verity descriptor. */
+		err = pagecache_write(inode, desc, desc_size, desc_pos);
+
+		/* Write all pages before clearing FI_VERITY_IN_PROGRESS. */
+		if (!err)
+			err = filemap_write_and_wait(inode->i_mapping);
+	}
+
+	/* If we failed, truncate anything we wrote past i_size. */
+	if (desc == NULL || err)
+		f2fs_truncate(inode);
+
+	clear_inode_flag(inode, FI_VERITY_IN_PROGRESS);
+
+	if (desc != NULL && !err) {
+		err = f2fs_setxattr(inode, F2FS_XATTR_INDEX_VERITY,
+				    F2FS_XATTR_NAME_VERITY, &dloc, sizeof(dloc),
+				    NULL, XATTR_CREATE);
+		if (!err) {
+			file_set_verity(inode);
+			f2fs_set_inode_flags(inode);
+			f2fs_mark_inode_dirty_sync(inode, true);
+		}
+	}
+	return err;
+}
+
+static int f2fs_get_verity_descriptor(struct inode *inode, void *buf,
+				      size_t buf_size)
+{
+	struct fsverity_descriptor_location dloc;
+	int res;
+	u32 size;
+	u64 pos;
+
+	/* Get the descriptor location */
+	res = f2fs_getxattr(inode, F2FS_XATTR_INDEX_VERITY,
+			    F2FS_XATTR_NAME_VERITY, &dloc, sizeof(dloc), NULL);
+	if (res < 0 && res != -ERANGE)
+		return res;
+	if (res != sizeof(dloc) || dloc.version != cpu_to_le32(1)) {
+		f2fs_warn(F2FS_I_SB(inode), "unknown verity xattr format");
+		return -EINVAL;
+	}
+	size = le32_to_cpu(dloc.size);
+	pos = le64_to_cpu(dloc.pos);
+
+	/* Get the descriptor */
+	if (pos + size < pos || pos + size > inode->i_sb->s_maxbytes ||
+	    pos < f2fs_verity_metadata_pos(inode) || size > INT_MAX) {
+		f2fs_warn(F2FS_I_SB(inode), "invalid verity xattr");
+		return -EFSCORRUPTED;
+	}
+	if (buf_size) {
+		if (size > buf_size)
+			return -ERANGE;
+		res = pagecache_read(inode, buf, size, pos);
+		if (res)
+			return res;
+	}
+	return size;
+}
+
+static struct page *f2fs_read_merkle_tree_page(struct inode *inode,
+					       pgoff_t index)
+{
+	index += f2fs_verity_metadata_pos(inode) >> PAGE_SHIFT;
+
+	return read_mapping_page(inode->i_mapping, index, NULL);
+}
+
+static int f2fs_write_merkle_tree_block(struct inode *inode, const void *buf,
+					u64 index, int log_blocksize)
+{
+	loff_t pos = f2fs_verity_metadata_pos(inode) + (index << log_blocksize);
+
+	return pagecache_write(inode, buf, 1 << log_blocksize, pos);
+}
+
+const struct fsverity_operations f2fs_verityops = {
+	.begin_enable_verity	= f2fs_begin_enable_verity,
+	.end_enable_verity	= f2fs_end_enable_verity,
+	.get_verity_descriptor	= f2fs_get_verity_descriptor,
+	.read_merkle_tree_page	= f2fs_read_merkle_tree_page,
+	.write_merkle_tree_block = f2fs_write_merkle_tree_block,
+};
diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c
index 1dae74f..296b318 100644
--- a/fs/f2fs/xattr.c
+++ b/fs/f2fs/xattr.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/xattr.c
  *
@@ -13,10 +14,6 @@
  *  suggestion of Luka Renko <luka.renko@hermes.si>.
  * xattr consolidation Copyright (c) 2004 James Morris <jmorris@redhat.com>,
  *  Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #include <linux/rwsem.h>
 #include <linux/f2fs_fs.h>
@@ -24,6 +21,7 @@
 #include <linux/posix_acl_xattr.h>
 #include "f2fs.h"
 #include "xattr.h"
+#include "segment.h"
 
 static int f2fs_xattr_generic_get(const struct xattr_handler *handler,
 		struct dentry *unused, struct inode *inode,
@@ -349,6 +347,9 @@
 
 	*xe = __find_xattr(cur_addr, last_txattr_addr, index, len, name);
 	if (!*xe) {
+		f2fs_err(F2FS_I_SB(inode), "inode (%lu) has corrupted xattr",
+								inode->i_ino);
+		set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK);
 		err = -EFSCORRUPTED;
 		goto out;
 	}
@@ -361,7 +362,7 @@
 	*base_addr = txattr_addr;
 	return 0;
 out:
-	kzfree(txattr_addr);
+	kvfree(txattr_addr);
 	return err;
 }
 
@@ -404,7 +405,7 @@
 	*base_addr = txattr_addr;
 	return 0;
 fail:
-	kzfree(txattr_addr);
+	kvfree(txattr_addr);
 	return err;
 }
 
@@ -438,7 +439,7 @@
 		}
 
 		f2fs_wait_on_page_writeback(ipage ? ipage : in_page,
-							NODE, true);
+							NODE, true, true);
 		/* no need to use xattr node block */
 		if (hsize <= inline_size) {
 			err = f2fs_truncate_xattr_node(inode);
@@ -462,7 +463,7 @@
 			goto in_page_out;
 		}
 		f2fs_bug_on(sbi, new_nid);
-		f2fs_wait_on_page_writeback(xpage, NODE, true);
+		f2fs_wait_on_page_writeback(xpage, NODE, true, true);
 	} else {
 		struct dnode_of_data dn;
 		set_new_dnode(&dn, inode, NULL, NULL, new_nid);
@@ -531,15 +532,16 @@
 	}
 	error = size;
 out:
-	kzfree(base_addr);
+	kvfree(base_addr);
 	return error;
 }
 
 ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
 {
 	struct inode *inode = d_inode(dentry);
+	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
 	struct f2fs_xattr_entry *entry;
-	void *base_addr;
+	void *base_addr, *last_base_addr;
 	int error = 0;
 	size_t rest = buffer_size;
 
@@ -549,6 +551,8 @@
 	if (error)
 		return error;
 
+	last_base_addr = (void *)base_addr + XATTR_SIZE(xnid, inode);
+
 	list_for_each_xattr(entry, base_addr) {
 		const struct xattr_handler *handler =
 			f2fs_xattr_handler(entry->e_name_index);
@@ -556,10 +560,19 @@
 		size_t prefix_len;
 		size_t size;
 
+		if ((void *)(entry) + sizeof(__u32) > last_base_addr ||
+			(void *)XATTR_NEXT_ENTRY(entry) > last_base_addr) {
+			f2fs_err(F2FS_I_SB(inode), "inode (%lu) has corrupted xattr",
+						inode->i_ino);
+			set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK);
+			error = -EFSCORRUPTED;
+			goto cleanup;
+		}
+
 		if (!handler || (handler->list && !handler->list(dentry)))
 			continue;
 
-		prefix = handler->prefix ?: handler->name;
+		prefix = xattr_prefix(handler);
 		prefix_len = strlen(prefix);
 		size = prefix_len + entry->e_name_len + 1;
 		if (buffer) {
@@ -577,7 +590,7 @@
 	}
 	error = buffer_size - rest;
 cleanup:
-	kzfree(base_addr);
+	kvfree(base_addr);
 	return error;
 }
 
@@ -625,6 +638,9 @@
 	/* find entry with wanted name. */
 	here = __find_xattr(base_addr, last_base_addr, index, len, name);
 	if (!here) {
+		f2fs_err(F2FS_I_SB(inode), "inode (%lu) has corrupted xattr",
+								inode->i_ino);
+		set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK);
 		error = -EFSCORRUPTED;
 		goto exit;
 	}
@@ -715,7 +731,7 @@
 	if (!error && S_ISDIR(inode->i_mode))
 		set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_CP);
 exit:
-	kzfree(base_addr);
+	kvfree(base_addr);
 	return error;
 }
 
@@ -726,6 +742,11 @@
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 	int err;
 
+	if (unlikely(f2fs_cp_error(sbi)))
+		return -EIO;
+	if (!f2fs_is_checkpoint_ready(sbi))
+		return -ENOSPC;
+
 	err = dquot_initialize(inode);
 	if (err)
 		return err;
diff --git a/fs/f2fs/xattr.h b/fs/f2fs/xattr.h
index 2a4ecaf..de0c600 100644
--- a/fs/f2fs/xattr.h
+++ b/fs/f2fs/xattr.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * fs/f2fs/xattr.h
  *
@@ -9,10 +10,6 @@
  * On-disk format of extended attributes for the ext2 filesystem.
  *
  * (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #ifndef __F2FS_XATTR_H__
 #define __F2FS_XATTR_H__
@@ -37,8 +34,10 @@
 #define F2FS_XATTR_INDEX_ADVISE			7
 /* Should be same as EXT4_XATTR_INDEX_ENCRYPTION */
 #define F2FS_XATTR_INDEX_ENCRYPTION		9
+#define F2FS_XATTR_INDEX_VERITY			11
 
 #define F2FS_XATTR_NAME_ENCRYPTION_CONTEXT	"c"
+#define F2FS_XATTR_NAME_VERITY			"v"
 
 struct f2fs_xattr_header {
 	__le32  h_magic;        /* magic number for identification */
@@ -83,6 +82,12 @@
 				sizeof(struct f2fs_xattr_header) -	\
 				sizeof(struct f2fs_xattr_entry))
 
+#define MAX_INLINE_XATTR_SIZE						\
+			(DEF_ADDRS_PER_INODE -				\
+			F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) -	\
+			DEF_INLINE_RESERVED_SIZE -			\
+			MIN_INLINE_DENTRY_SIZE / sizeof(__le32))
+
 /*
  * On-disk structure of f2fs_xattr
  * We use inline xattrs space + 1 block for xattr.
diff --git a/fs/fs_struct.c b/fs/fs_struct.c
index be02507..97c2c52 100644
--- a/fs/fs_struct.c
+++ b/fs/fs_struct.c
@@ -45,6 +45,7 @@
 	if (old_pwd.dentry)
 		path_put(&old_pwd);
 }
+EXPORT_SYMBOL_GPL(set_fs_pwd);
 
 static inline int replace_path(struct path *p, const struct path *old, const struct path *new)
 {
@@ -90,6 +91,7 @@
 	path_put(&fs->pwd);
 	kmem_cache_free(fs_cachep, fs);
 }
+EXPORT_SYMBOL_GPL(free_fs_struct);
 
 void exit_fs(struct task_struct *tsk)
 {
@@ -128,6 +130,7 @@
 	}
 	return fs;
 }
+EXPORT_SYMBOL_GPL(copy_fs_struct);
 
 int unshare_fs_struct(void)
 {
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 7a24f91..5c12fed 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -528,7 +528,7 @@
 		inode_lock(inode);
 
 		/* protected by i_mutex */
-		if (info->seals & F_SEAL_WRITE) {
+		if (info->seals & (F_SEAL_WRITE | F_SEAL_FUTURE_WRITE)) {
 			inode_unlock(inode);
 			return -EPERM;
 		}
diff --git a/fs/inode.c b/fs/inode.c
index 5c63693..553b761 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -1794,7 +1794,7 @@
 	return mask;
 }
 
-static int __remove_privs(struct dentry *dentry, int kill)
+static int __remove_privs(struct vfsmount *mnt, struct dentry *dentry, int kill)
 {
 	struct iattr newattrs;
 
@@ -1803,7 +1803,7 @@
 	 * Note we call this on write, so notify_change will not
 	 * encounter any conflicting delegations:
 	 */
-	return notify_change(dentry, &newattrs, NULL);
+	return notify_change2(mnt, dentry, &newattrs, NULL);
 }
 
 /*
@@ -1830,7 +1830,7 @@
 	if (kill < 0)
 		return kill;
 	if (kill)
-		error = __remove_privs(dentry, kill);
+		error = __remove_privs(file->f_path.mnt, dentry, kill);
 	if (!error)
 		inode_has_no_xattr(inode);
 
@@ -2161,3 +2161,89 @@
 	return timespec64_trunc(now, inode->i_sb->s_time_gran);
 }
 EXPORT_SYMBOL(current_time);
+
+/*
+ * Generic function to check FS_IOC_SETFLAGS values and reject any invalid
+ * configurations.
+ *
+ * Note: the caller should be holding i_mutex, or else be sure that they have
+ * exclusive access to the inode structure.
+ */
+int vfs_ioc_setflags_prepare(struct inode *inode, unsigned int oldflags,
+			     unsigned int flags)
+{
+	/*
+	 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
+	 * the relevant capability.
+	 *
+	 * This test looks nicer. Thanks to Pauline Middelink
+	 */
+	if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL) &&
+	    !capable(CAP_LINUX_IMMUTABLE))
+		return -EPERM;
+
+	return 0;
+}
+EXPORT_SYMBOL(vfs_ioc_setflags_prepare);
+
+/*
+ * Generic function to check FS_IOC_FSSETXATTR values and reject any invalid
+ * configurations.
+ *
+ * Note: the caller should be holding i_mutex, or else be sure that they have
+ * exclusive access to the inode structure.
+ */
+int vfs_ioc_fssetxattr_check(struct inode *inode, const struct fsxattr *old_fa,
+			     struct fsxattr *fa)
+{
+	/*
+	 * Can't modify an immutable/append-only file unless we have
+	 * appropriate permission.
+	 */
+	if ((old_fa->fsx_xflags ^ fa->fsx_xflags) &
+			(FS_XFLAG_IMMUTABLE | FS_XFLAG_APPEND) &&
+	    !capable(CAP_LINUX_IMMUTABLE))
+		return -EPERM;
+
+	/*
+	 * Project Quota ID state is only allowed to change from within the init
+	 * namespace. Enforce that restriction only if we are trying to change
+	 * the quota ID state. Everything else is allowed in user namespaces.
+	 */
+	if (current_user_ns() != &init_user_ns) {
+		if (old_fa->fsx_projid != fa->fsx_projid)
+			return -EINVAL;
+		if ((old_fa->fsx_xflags ^ fa->fsx_xflags) &
+				FS_XFLAG_PROJINHERIT)
+			return -EINVAL;
+	}
+
+	/* Check extent size hints. */
+	if ((fa->fsx_xflags & FS_XFLAG_EXTSIZE) && !S_ISREG(inode->i_mode))
+		return -EINVAL;
+
+	if ((fa->fsx_xflags & FS_XFLAG_EXTSZINHERIT) &&
+			!S_ISDIR(inode->i_mode))
+		return -EINVAL;
+
+	if ((fa->fsx_xflags & FS_XFLAG_COWEXTSIZE) &&
+	    !S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode))
+		return -EINVAL;
+
+	/*
+	 * It is only valid to set the DAX flag on regular files and
+	 * directories on filesystems.
+	 */
+	if ((fa->fsx_xflags & FS_XFLAG_DAX) &&
+	    !(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
+		return -EINVAL;
+
+	/* Extent size hints of zero turn off the flags. */
+	if (fa->fsx_extsize == 0)
+		fa->fsx_xflags &= ~(FS_XFLAG_EXTSIZE | FS_XFLAG_EXTSZINHERIT);
+	if (fa->fsx_cowextsize == 0)
+		fa->fsx_xflags &= ~FS_XFLAG_COWEXTSIZE;
+
+	return 0;
+}
+EXPORT_SYMBOL(vfs_ioc_fssetxattr_check);
diff --git a/fs/internal.h b/fs/internal.h
index d109665..8d0ca52 100644
--- a/fs/internal.h
+++ b/fs/internal.h
@@ -55,8 +55,6 @@
  * namei.c
  */
 extern int user_path_mountpoint_at(int, const char __user *, unsigned int, struct path *);
-extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
-			   const char *, unsigned int, struct path *);
 long do_mknodat(int dfd, const char __user *filename, umode_t mode,
 		unsigned int dev);
 long do_mkdirat(int dfd, const char __user *pathname, umode_t mode);
@@ -98,9 +96,11 @@
  * super.c
  */
 extern int do_remount_sb(struct super_block *, int, void *, int);
+extern int do_remount_sb2(struct vfsmount *, struct super_block *, int,
+								void *, int);
 extern bool trylock_super(struct super_block *sb);
 extern struct dentry *mount_fs(struct file_system_type *,
-			       int, const char *, void *);
+			       int, const char *, struct vfsmount *, void *);
 extern struct super_block *user_get_super(dev_t);
 
 /*
diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c
index 7d8654a..f8fb89b 100644
--- a/fs/jffs2/file.c
+++ b/fs/jffs2/file.c
@@ -109,9 +109,9 @@
 	return ret;
 }
 
-int jffs2_do_readpage_unlock(struct inode *inode, struct page *pg)
+int jffs2_do_readpage_unlock(void *data, struct page *pg)
 {
-	int ret = jffs2_do_readpage_nolock(inode, pg);
+	int ret = jffs2_do_readpage_nolock(data, pg);
 	unlock_page(pg);
 	return ret;
 }
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c
index eab04ec..7fbe8a7 100644
--- a/fs/jffs2/fs.c
+++ b/fs/jffs2/fs.c
@@ -686,7 +686,7 @@
 	struct page *pg;
 
 	pg = read_cache_page(inode->i_mapping, offset >> PAGE_SHIFT,
-			     (void *)jffs2_do_readpage_unlock, inode);
+			     jffs2_do_readpage_unlock, inode);
 	if (IS_ERR(pg))
 		return (void *)pg;
 
diff --git a/fs/jffs2/os-linux.h b/fs/jffs2/os-linux.h
index a2dbbb3..bd3d5f0d 100644
--- a/fs/jffs2/os-linux.h
+++ b/fs/jffs2/os-linux.h
@@ -155,7 +155,7 @@
 extern const struct inode_operations jffs2_file_inode_operations;
 extern const struct address_space_operations jffs2_file_address_operations;
 int jffs2_fsync(struct file *, loff_t, loff_t, int);
-int jffs2_do_readpage_unlock (struct inode *inode, struct page *pg);
+int jffs2_do_readpage_unlock(void *data, struct page *pg);
 
 /* ioctl.c */
 long jffs2_ioctl(struct file *, unsigned int, unsigned long);
diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c
index dbf5bc2..2d8b91f 100644
--- a/fs/kernfs/file.c
+++ b/fs/kernfs/file.c
@@ -832,26 +832,35 @@
  * to see if it supports poll (Neither 'poll' nor 'select' return
  * an appropriate error code).  When in doubt, set a suitable timeout value.
  */
+__poll_t kernfs_generic_poll(struct kernfs_open_file *of, poll_table *wait)
+{
+	struct kernfs_node *kn = kernfs_dentry_node(of->file->f_path.dentry);
+	struct kernfs_open_node *on = kn->attr.open;
+
+	poll_wait(of->file, &on->poll, wait);
+
+	if (of->event != atomic_read(&on->event))
+		return DEFAULT_POLLMASK|EPOLLERR|EPOLLPRI;
+
+	return DEFAULT_POLLMASK;
+}
+
 static __poll_t kernfs_fop_poll(struct file *filp, poll_table *wait)
 {
 	struct kernfs_open_file *of = kernfs_of(filp);
 	struct kernfs_node *kn = kernfs_dentry_node(filp->f_path.dentry);
-	struct kernfs_open_node *on = kn->attr.open;
+	__poll_t ret;
 
 	if (!kernfs_get_active(kn))
-		goto trigger;
+		return DEFAULT_POLLMASK|EPOLLERR|EPOLLPRI;
 
-	poll_wait(filp, &on->poll, wait);
+	if (kn->attr.ops->poll)
+		ret = kn->attr.ops->poll(of, wait);
+	else
+		ret = kernfs_generic_poll(of, wait);
 
 	kernfs_put_active(kn);
-
-	if (of->event != atomic_read(&on->event))
-		goto trigger;
-
-	return DEFAULT_POLLMASK;
-
- trigger:
-	return DEFAULT_POLLMASK|EPOLLERR|EPOLLPRI;
+	return ret;
 }
 
 static void kernfs_notify_workfn(struct work_struct *work)
diff --git a/fs/mpage.c b/fs/mpage.c
index c820dc9..ddf7bb8 100644
--- a/fs/mpage.c
+++ b/fs/mpage.c
@@ -32,6 +32,16 @@
 #include <linux/cleancache.h>
 #include "internal.h"
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/android_fs.h>
+
+EXPORT_TRACEPOINT_SYMBOL(android_fs_datawrite_start);
+EXPORT_TRACEPOINT_SYMBOL(android_fs_datawrite_end);
+EXPORT_TRACEPOINT_SYMBOL(android_fs_dataread_start);
+EXPORT_TRACEPOINT_SYMBOL(android_fs_dataread_end);
+EXPORT_TRACEPOINT_SYMBOL(android_fs_fsync_start);
+EXPORT_TRACEPOINT_SYMBOL(android_fs_fsync_end);
+
 /*
  * I/O completion handler for multipage BIOs.
  *
@@ -49,6 +59,16 @@
 	struct bio_vec *bv;
 	int i;
 
+	if (trace_android_fs_dataread_end_enabled() &&
+	    (bio_data_dir(bio) == READ)) {
+		struct page *first_page = bio->bi_io_vec[0].bv_page;
+
+		if (first_page != NULL)
+			trace_android_fs_dataread_end(first_page->mapping->host,
+						      page_offset(first_page),
+						      bio->bi_iter.bi_size);
+	}
+
 	bio_for_each_segment_all(bv, bio, i) {
 		struct page *page = bv->bv_page;
 		page_endio(page, bio_op(bio),
@@ -60,6 +80,24 @@
 
 static struct bio *mpage_bio_submit(int op, int op_flags, struct bio *bio)
 {
+	if (trace_android_fs_dataread_start_enabled() && (op == REQ_OP_READ)) {
+		struct page *first_page = bio->bi_io_vec[0].bv_page;
+
+		if (first_page != NULL) {
+			char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
+
+			path = android_fstrace_get_pathname(pathbuf,
+						    MAX_TRACE_PATHBUF_LEN,
+						    first_page->mapping->host);
+			trace_android_fs_dataread_start(
+				first_page->mapping->host,
+				page_offset(first_page),
+				bio->bi_iter.bi_size,
+				current->pid,
+				path,
+				current->comm);
+		}
+	}
 	bio->bi_end_io = mpage_end_io;
 	bio_set_op_attrs(bio, op, op_flags);
 	guard_bio_eod(op, bio);
diff --git a/fs/namei.c b/fs/namei.c
index 914178c..c99cb21 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -44,6 +44,9 @@
 #include "internal.h"
 #include "mount.h"
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/namei.h>
+
 /* [Feb-1997 T. Schoebel-Theuer]
  * Fundamental changes in the pathname lookup mechanisms (namei)
  * were necessary because of omirr.  The reason is that omirr needs
@@ -379,9 +382,11 @@
  * flag in inode->i_opflags, that says "this has not special
  * permission function, use the fast case".
  */
-static inline int do_inode_permission(struct inode *inode, int mask)
+static inline int do_inode_permission(struct vfsmount *mnt, struct inode *inode, int mask)
 {
 	if (unlikely(!(inode->i_opflags & IOP_FASTPERM))) {
+		if (likely(mnt && inode->i_op->permission2))
+			return inode->i_op->permission2(mnt, inode, mask);
 		if (likely(inode->i_op->permission))
 			return inode->i_op->permission(inode, mask);
 
@@ -414,7 +419,8 @@
 }
 
 /**
- * inode_permission - Check for access rights to a given inode
+ * inode_permission2 - Check for access rights to a given inode
+ * @mnt:
  * @inode: Inode to check permission on
  * @mask: Right to check for (%MAY_READ, %MAY_WRITE, %MAY_EXEC)
  *
@@ -424,7 +430,7 @@
  *
  * When checking for MAY_APPEND, MAY_WRITE must also be set in @mask.
  */
-int inode_permission(struct inode *inode, int mask)
+int inode_permission2(struct vfsmount *mnt, struct inode *inode, int mask)
 {
 	int retval;
 
@@ -448,7 +454,7 @@
 			return -EACCES;
 	}
 
-	retval = do_inode_permission(inode, mask);
+	retval = do_inode_permission(mnt, inode, mask);
 	if (retval)
 		return retval;
 
@@ -456,7 +462,14 @@
 	if (retval)
 		return retval;
 
-	return security_inode_permission(inode, mask);
+	retval = security_inode_permission(inode, mask);
+	return retval;
+}
+EXPORT_SYMBOL(inode_permission2);
+
+int inode_permission(struct inode *inode, int mask)
+{
+	return inode_permission2(NULL, inode, mask);
 }
 EXPORT_SYMBOL(inode_permission);
 
@@ -769,6 +782,81 @@
 		return 1;
 }
 
+#define INIT_PATH_SIZE 64
+
+static void success_walk_trace(struct nameidata *nd)
+{
+	struct path *pt = &nd->path;
+	struct inode *i = nd->inode;
+	char buf[INIT_PATH_SIZE], *try_buf;
+	int cur_path_size;
+	char *p;
+
+	/* When eBPF/ tracepoint is disabled, keep overhead low. */
+	if (!trace_inodepath_enabled())
+		return;
+
+	/* First try stack allocated buffer. */
+	try_buf = buf;
+	cur_path_size = INIT_PATH_SIZE;
+
+	while (cur_path_size <= PATH_MAX) {
+		/* Free previous heap allocation if we are now trying
+		 * a second or later heap allocation.
+		 */
+		if (try_buf != buf)
+			kfree(try_buf);
+
+		/* All but the first alloc are on the heap. */
+		if (cur_path_size != INIT_PATH_SIZE) {
+			try_buf = kmalloc(cur_path_size, GFP_KERNEL);
+			if (!try_buf) {
+				try_buf = buf;
+				sprintf(try_buf, "error:buf_alloc_failed");
+				break;
+			}
+		}
+
+		p = d_path(pt, try_buf, cur_path_size);
+
+		if (!IS_ERR(p)) {
+			char *end = mangle_path(try_buf, p, "\n");
+
+			if (end) {
+				try_buf[end - try_buf] = 0;
+				break;
+			} else {
+				/* On mangle errors, double path size
+				 * till PATH_MAX.
+				 */
+				cur_path_size = cur_path_size << 1;
+				continue;
+			}
+		}
+
+		if (PTR_ERR(p) == -ENAMETOOLONG) {
+			/* If d_path complains that name is too long,
+			 * then double path size till PATH_MAX.
+			 */
+			cur_path_size = cur_path_size << 1;
+			continue;
+		}
+
+		sprintf(try_buf, "error:d_path_failed_%lu",
+			-1 * PTR_ERR(p));
+		break;
+	}
+
+	if (cur_path_size > PATH_MAX)
+		sprintf(try_buf, "error:d_path_name_too_long");
+
+	trace_inodepath(i, try_buf);
+
+	if (try_buf != buf)
+		kfree(try_buf);
+	return;
+}
+
 /**
  * complete_walk - successful completion of path walk
  * @nd:  pointer nameidata
@@ -791,15 +879,21 @@
 			return -ECHILD;
 	}
 
-	if (likely(!(nd->flags & LOOKUP_JUMPED)))
+	if (likely(!(nd->flags & LOOKUP_JUMPED))) {
+		success_walk_trace(nd);
 		return 0;
+	}
 
-	if (likely(!(dentry->d_flags & DCACHE_OP_WEAK_REVALIDATE)))
+	if (likely(!(dentry->d_flags & DCACHE_OP_WEAK_REVALIDATE))) {
+		success_walk_trace(nd);
 		return 0;
+	}
 
 	status = dentry->d_op->d_weak_revalidate(dentry, nd->flags);
-	if (status > 0)
+	if (status > 0) {
+		success_walk_trace(nd);
 		return 0;
+	}
 
 	if (!status)
 		status = -ESTALE;
@@ -1068,7 +1162,7 @@
 		return ERR_PTR(error);
 
 	nd->last_type = LAST_BIND;
-	res = inode->i_link;
+	res = READ_ONCE(inode->i_link);
 	if (!res) {
 		const char * (*get)(struct dentry *, struct inode *,
 				struct delayed_call *);
@@ -1693,13 +1787,13 @@
 static inline int may_lookup(struct nameidata *nd)
 {
 	if (nd->flags & LOOKUP_RCU) {
-		int err = inode_permission(nd->inode, MAY_EXEC|MAY_NOT_BLOCK);
+		int err = inode_permission2(nd->path.mnt, nd->inode, MAY_EXEC|MAY_NOT_BLOCK);
 		if (err != -ECHILD)
 			return err;
 		if (unlazy_walk(nd))
 			return -ECHILD;
 	}
-	return inode_permission(nd->inode, MAY_EXEC);
+	return inode_permission2(nd->path.mnt, nd->inode, MAY_EXEC);
 }
 
 static inline int handle_dots(struct nameidata *nd, int type)
@@ -2455,8 +2549,8 @@
 }
 EXPORT_SYMBOL(vfs_path_lookup);
 
-static int lookup_one_len_common(const char *name, struct dentry *base,
-				 int len, struct qstr *this)
+static int lookup_one_len_common(const char *name, struct vfsmount *mnt,
+				 struct dentry *base, int len, struct qstr *this)
 {
 	this->name = name;
 	this->len = len;
@@ -2484,7 +2578,7 @@
 			return err;
 	}
 
-	return inode_permission(base->d_inode, MAY_EXEC);
+	return inode_permission2(mnt, base->d_inode, MAY_EXEC);
 }
 
 /**
@@ -2508,7 +2602,7 @@
 
 	WARN_ON_ONCE(!inode_is_locked(base->d_inode));
 
-	err = lookup_one_len_common(name, base, len, &this);
+	err = lookup_one_len_common(name, NULL, base, len, &this);
 	if (err)
 		return ERR_PTR(err);
 
@@ -2527,7 +2621,7 @@
  *
  * The caller must hold base->i_mutex.
  */
-struct dentry *lookup_one_len(const char *name, struct dentry *base, int len)
+struct dentry *lookup_one_len2(const char *name, struct vfsmount *mnt, struct dentry *base, int len)
 {
 	struct dentry *dentry;
 	struct qstr this;
@@ -2535,13 +2629,19 @@
 
 	WARN_ON_ONCE(!inode_is_locked(base->d_inode));
 
-	err = lookup_one_len_common(name, base, len, &this);
+	err = lookup_one_len_common(name, mnt, base, len, &this);
 	if (err)
 		return ERR_PTR(err);
 
 	dentry = lookup_dcache(&this, base, 0);
 	return dentry ? dentry : __lookup_slow(&this, base, 0);
 }
+EXPORT_SYMBOL(lookup_one_len2);
+
+struct dentry *lookup_one_len(const char *name, struct dentry *base, int len)
+{
+	return lookup_one_len2(name, NULL, base, len);
+}
 EXPORT_SYMBOL(lookup_one_len);
 
 /**
@@ -2563,7 +2663,7 @@
 	int err;
 	struct dentry *ret;
 
-	err = lookup_one_len_common(name, base, len, &this);
+	err = lookup_one_len_common(name, NULL, base, len, &this);
 	if (err)
 		return ERR_PTR(err);
 
@@ -2787,7 +2887,7 @@
  * 11. We don't allow removal of NFS sillyrenamed files; it's handled by
  *     nfs_async_unlink().
  */
-static int may_delete(struct inode *dir, struct dentry *victim, bool isdir)
+static int may_delete(struct vfsmount *mnt, struct inode *dir, struct dentry *victim, bool isdir)
 {
 	struct inode *inode = d_backing_inode(victim);
 	int error;
@@ -2804,7 +2904,7 @@
 
 	audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE);
 
-	error = inode_permission(dir, MAY_WRITE | MAY_EXEC);
+	error = inode_permission2(mnt, dir, MAY_WRITE | MAY_EXEC);
 	if (error)
 		return error;
 	if (IS_APPEND(dir))
@@ -2836,7 +2936,7 @@
  *  4. We should have write and exec permissions on dir
  *  5. We can't do it if dir is immutable (done in permission())
  */
-static inline int may_create(struct inode *dir, struct dentry *child)
+static inline int may_create(struct vfsmount *mnt, struct inode *dir, struct dentry *child)
 {
 	struct user_namespace *s_user_ns;
 	audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE);
@@ -2848,7 +2948,7 @@
 	if (!kuid_has_mapping(s_user_ns, current_fsuid()) ||
 	    !kgid_has_mapping(s_user_ns, current_fsgid()))
 		return -EOVERFLOW;
-	return inode_permission(dir, MAY_WRITE | MAY_EXEC);
+	return inode_permission2(mnt, dir, MAY_WRITE | MAY_EXEC);
 }
 
 /*
@@ -2895,10 +2995,10 @@
 }
 EXPORT_SYMBOL(unlock_rename);
 
-int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
-		bool want_excl)
+int vfs_create2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry,
+		umode_t mode, bool want_excl)
 {
-	int error = may_create(dir, dentry);
+	int error = may_create(mnt, dir, dentry);
 	if (error)
 		return error;
 
@@ -2914,14 +3014,21 @@
 		fsnotify_create(dir, dentry);
 	return error;
 }
+EXPORT_SYMBOL(vfs_create2);
+
+int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
+		bool want_excl)
+{
+	return vfs_create2(NULL, dir, dentry, mode, want_excl);
+}
 EXPORT_SYMBOL(vfs_create);
 
-int vfs_mkobj(struct dentry *dentry, umode_t mode,
+int vfs_mkobj2(struct vfsmount *mnt, struct dentry *dentry, umode_t mode,
 		int (*f)(struct dentry *, umode_t, void *),
 		void *arg)
 {
 	struct inode *dir = dentry->d_parent->d_inode;
-	int error = may_create(dir, dentry);
+	int error = may_create(mnt, dir, dentry);
 	if (error)
 		return error;
 
@@ -2935,6 +3042,15 @@
 		fsnotify_create(dir, dentry);
 	return error;
 }
+EXPORT_SYMBOL(vfs_mkobj2);
+
+
+int vfs_mkobj(struct dentry *dentry, umode_t mode,
+		int (*f)(struct dentry *, umode_t, void *),
+		void *arg)
+{
+	return vfs_mkobj2(NULL, dentry, mode, f, arg);
+}
 EXPORT_SYMBOL(vfs_mkobj);
 
 bool may_open_dev(const struct path *path)
@@ -2946,6 +3062,7 @@
 static int may_open(const struct path *path, int acc_mode, int flag)
 {
 	struct dentry *dentry = path->dentry;
+	struct vfsmount *mnt = path->mnt;
 	struct inode *inode = dentry->d_inode;
 	int error;
 
@@ -2970,7 +3087,7 @@
 		break;
 	}
 
-	error = inode_permission(inode, MAY_OPEN | acc_mode);
+	error = inode_permission2(mnt, inode, MAY_OPEN | acc_mode);
 	if (error)
 		return error;
 
@@ -3005,7 +3122,7 @@
 	if (!error)
 		error = security_path_truncate(path);
 	if (!error) {
-		error = do_truncate(path->dentry, 0,
+		error = do_truncate2(path->mnt, path->dentry, 0,
 				    ATTR_MTIME|ATTR_CTIME|ATTR_OPEN,
 				    filp);
 	}
@@ -3032,7 +3149,7 @@
 	    !kgid_has_mapping(s_user_ns, current_fsgid()))
 		return -EOVERFLOW;
 
-	error = inode_permission(dir->dentry->d_inode, MAY_WRITE | MAY_EXEC);
+	error = inode_permission2(dir->mnt, dir->dentry->d_inode, MAY_WRITE | MAY_EXEC);
 	if (error)
 		return error;
 
@@ -3440,7 +3557,8 @@
 	int error;
 
 	/* we want directory to be writable */
-	error = inode_permission(dir, MAY_WRITE | MAY_EXEC);
+	error = inode_permission2(ERR_PTR(-EOPNOTSUPP), dir,
+					MAY_WRITE | MAY_EXEC);
 	if (error)
 		goto out_err;
 	error = -EOPNOTSUPP;
@@ -3694,9 +3812,9 @@
 }
 EXPORT_SYMBOL(user_path_create);
 
-int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
+int vfs_mknod2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
 {
-	int error = may_create(dir, dentry);
+	int error = may_create(mnt, dir, dentry);
 
 	if (error)
 		return error;
@@ -3720,6 +3838,12 @@
 		fsnotify_create(dir, dentry);
 	return error;
 }
+EXPORT_SYMBOL(vfs_mknod2);
+
+int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
+{
+	return vfs_mknod2(NULL, dir, dentry, mode, dev);
+}
 EXPORT_SYMBOL(vfs_mknod);
 
 static int may_mknod(umode_t mode)
@@ -3762,12 +3886,12 @@
 		goto out;
 	switch (mode & S_IFMT) {
 		case 0: case S_IFREG:
-			error = vfs_create(path.dentry->d_inode,dentry,mode,true);
+			error = vfs_create2(path.mnt, path.dentry->d_inode,dentry,mode,true);
 			if (!error)
 				ima_post_path_mknod(dentry);
 			break;
 		case S_IFCHR: case S_IFBLK:
-			error = vfs_mknod(path.dentry->d_inode,dentry,mode,
+			error = vfs_mknod2(path.mnt, path.dentry->d_inode,dentry,mode,
 					new_decode_dev(dev));
 			break;
 		case S_IFIFO: case S_IFSOCK:
@@ -3794,9 +3918,9 @@
 	return do_mknodat(AT_FDCWD, filename, mode, dev);
 }
 
-int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
+int vfs_mkdir2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, umode_t mode)
 {
-	int error = may_create(dir, dentry);
+	int error = may_create(mnt, dir, dentry);
 	unsigned max_links = dir->i_sb->s_max_links;
 
 	if (error)
@@ -3818,6 +3942,12 @@
 		fsnotify_mkdir(dir, dentry);
 	return error;
 }
+EXPORT_SYMBOL(vfs_mkdir2);
+
+int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
+{
+	return vfs_mkdir2(NULL, dir, dentry, mode);
+}
 EXPORT_SYMBOL(vfs_mkdir);
 
 long do_mkdirat(int dfd, const char __user *pathname, umode_t mode)
@@ -3836,7 +3966,7 @@
 		mode &= ~current_umask();
 	error = security_path_mkdir(&path, dentry, mode);
 	if (!error)
-		error = vfs_mkdir(path.dentry->d_inode, dentry, mode);
+		error = vfs_mkdir2(path.mnt, path.dentry->d_inode, dentry, mode);
 	done_path_create(&path, dentry);
 	if (retry_estale(error, lookup_flags)) {
 		lookup_flags |= LOOKUP_REVAL;
@@ -3855,9 +3985,9 @@
 	return do_mkdirat(AT_FDCWD, pathname, mode);
 }
 
-int vfs_rmdir(struct inode *dir, struct dentry *dentry)
+int vfs_rmdir2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry)
 {
-	int error = may_delete(dir, dentry, 1);
+	int error = may_delete(mnt, dir, dentry, 1);
 
 	if (error)
 		return error;
@@ -3892,6 +4022,12 @@
 		d_delete(dentry);
 	return error;
 }
+EXPORT_SYMBOL(vfs_rmdir2);
+
+int vfs_rmdir(struct inode *dir, struct dentry *dentry)
+{
+	return vfs_rmdir2(NULL, dir, dentry);
+}
 EXPORT_SYMBOL(vfs_rmdir);
 
 long do_rmdir(int dfd, const char __user *pathname)
@@ -3937,7 +4073,7 @@
 	error = security_path_rmdir(&path, dentry);
 	if (error)
 		goto exit3;
-	error = vfs_rmdir(path.dentry->d_inode, dentry);
+	error = vfs_rmdir2(path.mnt, path.dentry->d_inode, dentry);
 exit3:
 	dput(dentry);
 exit2:
@@ -3976,10 +4112,10 @@
  * be appropriate for callers that expect the underlying filesystem not
  * to be NFS exported.
  */
-int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode)
+int vfs_unlink2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, struct inode **delegated_inode)
 {
 	struct inode *target = dentry->d_inode;
-	int error = may_delete(dir, dentry, 0);
+	int error = may_delete(mnt, dir, dentry, 0);
 
 	if (error)
 		return error;
@@ -4014,6 +4150,12 @@
 
 	return error;
 }
+EXPORT_SYMBOL(vfs_unlink2);
+
+int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode)
+{
+	return vfs_unlink2(NULL, dir, dentry, delegated_inode);
+}
 EXPORT_SYMBOL(vfs_unlink);
 
 /*
@@ -4059,7 +4201,7 @@
 		error = security_path_unlink(&path, dentry);
 		if (error)
 			goto exit2;
-		error = vfs_unlink(path.dentry->d_inode, dentry, &delegated_inode);
+		error = vfs_unlink2(path.mnt, path.dentry->d_inode, dentry, &delegated_inode);
 exit2:
 		dput(dentry);
 	}
@@ -4109,9 +4251,9 @@
 	return do_unlinkat(AT_FDCWD, getname(pathname));
 }
 
-int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
+int vfs_symlink2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, const char *oldname)
 {
-	int error = may_create(dir, dentry);
+	int error = may_create(mnt, dir, dentry);
 
 	if (error)
 		return error;
@@ -4128,6 +4270,12 @@
 		fsnotify_create(dir, dentry);
 	return error;
 }
+EXPORT_SYMBOL(vfs_symlink2);
+
+int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
+{
+	return vfs_symlink2(NULL, dir, dentry, oldname);
+}
 EXPORT_SYMBOL(vfs_symlink);
 
 long do_symlinkat(const char __user *oldname, int newdfd,
@@ -4150,7 +4298,7 @@
 
 	error = security_path_symlink(&path, dentry, from->name);
 	if (!error)
-		error = vfs_symlink(path.dentry->d_inode, dentry, from->name);
+		error = vfs_symlink2(path.mnt, path.dentry->d_inode, dentry, from->name);
 	done_path_create(&path, dentry);
 	if (retry_estale(error, lookup_flags)) {
 		lookup_flags |= LOOKUP_REVAL;
@@ -4191,7 +4339,7 @@
  * be appropriate for callers that expect the underlying filesystem not
  * to be NFS exported.
  */
-int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry, struct inode **delegated_inode)
+int vfs_link2(struct vfsmount *mnt, struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry, struct inode **delegated_inode)
 {
 	struct inode *inode = old_dentry->d_inode;
 	unsigned max_links = dir->i_sb->s_max_links;
@@ -4200,7 +4348,7 @@
 	if (!inode)
 		return -ENOENT;
 
-	error = may_create(dir, new_dentry);
+	error = may_create(mnt, dir, new_dentry);
 	if (error)
 		return error;
 
@@ -4250,6 +4398,12 @@
 		fsnotify_link(dir, inode, new_dentry);
 	return error;
 }
+EXPORT_SYMBOL(vfs_link2);
+
+int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry, struct inode **delegated_inode)
+{
+	return vfs_link2(NULL, old_dentry, dir, new_dentry, delegated_inode);
+}
 EXPORT_SYMBOL(vfs_link);
 
 /*
@@ -4305,7 +4459,7 @@
 	error = security_path_link(old_path.dentry, &new_path, new_dentry);
 	if (error)
 		goto out_dput;
-	error = vfs_link(old_path.dentry, new_path.dentry->d_inode, new_dentry, &delegated_inode);
+	error = vfs_link2(old_path.mnt, old_path.dentry, new_path.dentry->d_inode, new_dentry, &delegated_inode);
 out_dput:
 	done_path_create(&new_path, new_dentry);
 	if (delegated_inode) {
@@ -4387,7 +4541,8 @@
  *	   ->i_mutex on parents, which works but leads to some truly excessive
  *	   locking].
  */
-int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
+int vfs_rename2(struct vfsmount *mnt,
+	       struct inode *old_dir, struct dentry *old_dentry,
 	       struct inode *new_dir, struct dentry *new_dentry,
 	       struct inode **delegated_inode, unsigned int flags)
 {
@@ -4402,19 +4557,19 @@
 	if (source == target)
 		return 0;
 
-	error = may_delete(old_dir, old_dentry, is_dir);
+	error = may_delete(mnt, old_dir, old_dentry, is_dir);
 	if (error)
 		return error;
 
 	if (!target) {
-		error = may_create(new_dir, new_dentry);
+		error = may_create(mnt, new_dir, new_dentry);
 	} else {
 		new_is_dir = d_is_dir(new_dentry);
 
 		if (!(flags & RENAME_EXCHANGE))
-			error = may_delete(new_dir, new_dentry, is_dir);
+			error = may_delete(mnt, new_dir, new_dentry, is_dir);
 		else
-			error = may_delete(new_dir, new_dentry, new_is_dir);
+			error = may_delete(mnt, new_dir, new_dentry, new_is_dir);
 	}
 	if (error)
 		return error;
@@ -4428,12 +4583,12 @@
 	 */
 	if (new_dir != old_dir) {
 		if (is_dir) {
-			error = inode_permission(source, MAY_WRITE);
+			error = inode_permission2(mnt, source, MAY_WRITE);
 			if (error)
 				return error;
 		}
 		if ((flags & RENAME_EXCHANGE) && new_is_dir) {
-			error = inode_permission(target, MAY_WRITE);
+			error = inode_permission2(mnt, target, MAY_WRITE);
 			if (error)
 				return error;
 		}
@@ -4510,6 +4665,14 @@
 
 	return error;
 }
+EXPORT_SYMBOL(vfs_rename2);
+
+int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
+	       struct inode *new_dir, struct dentry *new_dentry,
+	       struct inode **delegated_inode, unsigned int flags)
+{
+	return vfs_rename2(NULL, old_dir, old_dentry, new_dir, new_dentry, delegated_inode, flags);
+}
 EXPORT_SYMBOL(vfs_rename);
 
 static int do_renameat2(int olddfd, const char __user *oldname, int newdfd,
@@ -4623,7 +4786,7 @@
 				     &new_path, new_dentry, flags);
 	if (error)
 		goto exit5;
-	error = vfs_rename(old_path.dentry->d_inode, old_dentry,
+	error = vfs_rename2(old_path.mnt, old_path.dentry->d_inode, old_dentry,
 			   new_path.dentry->d_inode, new_dentry,
 			   &delegated_inode, flags);
 exit5:
@@ -4674,7 +4837,7 @@
 
 int vfs_whiteout(struct inode *dir, struct dentry *dentry)
 {
-	int error = may_create(dir, dentry);
+	int error = may_create(NULL, dir, dentry);
 	if (error)
 		return error;
 
@@ -4730,7 +4893,7 @@
 		spin_unlock(&inode->i_lock);
 	}
 
-	link = inode->i_link;
+	link = READ_ONCE(inode->i_link);
 	if (!link) {
 		link = inode->i_op->get_link(dentry, inode, &done);
 		if (IS_ERR(link))
diff --git a/fs/namespace.c b/fs/namespace.c
index 1fce41b..3347c1d 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -200,6 +200,7 @@
 		mnt->mnt_count = 1;
 		mnt->mnt_writers = 0;
 #endif
+		mnt->mnt.data = NULL;
 
 		INIT_HLIST_NODE(&mnt->mnt_hash);
 		INIT_LIST_HEAD(&mnt->mnt_child);
@@ -552,6 +553,7 @@
 
 static void free_vfsmnt(struct mount *mnt)
 {
+	kfree(mnt->mnt.data);
 	kfree_const(mnt->mnt_devname);
 #ifdef CONFIG_SMP
 	free_percpu(mnt->mnt_pcp);
@@ -955,10 +957,18 @@
 	if (!mnt)
 		return ERR_PTR(-ENOMEM);
 
+	if (type->alloc_mnt_data) {
+		mnt->mnt.data = type->alloc_mnt_data();
+		if (!mnt->mnt.data) {
+			mnt_free_id(mnt);
+			free_vfsmnt(mnt);
+			return ERR_PTR(-ENOMEM);
+		}
+	}
 	if (flags & SB_KERNMOUNT)
 		mnt->mnt.mnt_flags = MNT_INTERNAL;
 
-	root = mount_fs(type, flags, name, data);
+	root = mount_fs(type, flags, name, &mnt->mnt, data);
 	if (IS_ERR(root)) {
 		mnt_free_id(mnt);
 		free_vfsmnt(mnt);
@@ -1002,6 +1012,14 @@
 	if (!mnt)
 		return ERR_PTR(-ENOMEM);
 
+	if (sb->s_op->clone_mnt_data) {
+		mnt->mnt.data = sb->s_op->clone_mnt_data(old->mnt.data);
+		if (!mnt->mnt.data) {
+			err = -ENOMEM;
+			goto out_free;
+		}
+	}
+
 	if (flag & (CL_SLAVE | CL_PRIVATE | CL_SHARED_TO_SLAVE))
 		mnt->mnt_group_id = 0; /* not a peer of original */
 	else
@@ -2286,8 +2304,14 @@
 		err = change_mount_flags(path->mnt, ms_flags);
 	else if (!ns_capable(sb->s_user_ns, CAP_SYS_ADMIN))
 		err = -EPERM;
-	else
-		err = do_remount_sb(sb, sb_flags, data, 0);
+	else {
+		err = do_remount_sb2(path->mnt, sb, sb_flags, data, 0);
+		namespace_lock();
+		lock_mount_hash();
+		propagate_remount(mnt);
+		unlock_mount_hash();
+		namespace_unlock();
+	}
 	if (!err) {
 		lock_mount_hash();
 		mnt_flags |= mnt->mnt.mnt_flags & ~MNT_USER_SETTABLE_MASK;
@@ -2684,7 +2708,7 @@
 	 * the remainder of the page.
 	 */
 	/* copy_from_user cannot cross TASK_SIZE ! */
-	size = TASK_SIZE - (unsigned long)data;
+	size = TASK_SIZE - (unsigned long)untagged_addr(data);
 	if (size > PAGE_SIZE)
 		size = PAGE_SIZE;
 
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index b8d6860..afdf55a 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -664,8 +664,9 @@
  * We only need to convert from xdr once so future lookups are much simpler
  */
 static
-int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page* page)
+int nfs_readdir_filler(void *data, struct page* page)
 {
+	nfs_readdir_descriptor_t *desc = data;
 	struct inode	*inode = file_inode(desc->file);
 	int ret;
 
@@ -697,8 +698,8 @@
 static
 struct page *get_cache_page(nfs_readdir_descriptor_t *desc)
 {
-	return read_cache_page(desc->file->f_mapping,
-			desc->page_index, (filler_t *)nfs_readdir_filler, desc);
+	return read_cache_page(desc->file->f_mapping, desc->page_index,
+			nfs_readdir_filler, desc);
 }
 
 /*
diff --git a/fs/nfs/symlink.c b/fs/nfs/symlink.c
index 06eb44b..25ba299 100644
--- a/fs/nfs/symlink.c
+++ b/fs/nfs/symlink.c
@@ -26,8 +26,9 @@
  * and straight-forward than readdir caching.
  */
 
-static int nfs_symlink_filler(struct inode *inode, struct page *page)
+static int nfs_symlink_filler(void *data, struct page *page)
 {
+	struct inode *inode = data;
 	int error;
 
 	error = NFS_PROTO(inode)->readlink(inode, page, 0, PAGE_SIZE);
@@ -65,8 +66,8 @@
 		err = ERR_PTR(nfs_revalidate_mapping(inode, inode->i_mapping));
 		if (err)
 			return err;
-		page = read_cache_page(&inode->i_data, 0,
-					(filler_t *)nfs_symlink_filler, inode);
+		page = read_cache_page(&inode->i_data, 0, nfs_symlink_filler,
+				inode);
 		if (IS_ERR(page))
 			return ERR_CAST(page);
 	}
diff --git a/fs/notify/fanotify/Kconfig b/fs/notify/fanotify/Kconfig
index 41355ce..f5b0b3a 100644
--- a/fs/notify/fanotify/Kconfig
+++ b/fs/notify/fanotify/Kconfig
@@ -1,7 +1,6 @@
 config FANOTIFY
 	bool "Filesystem wide access notification"
 	select FSNOTIFY
-	select ANON_INODES
 	default n
 	---help---
 	   Say Y here to enable fanotify support.  fanotify is a file access
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
index 6905488..06c5729 100644
--- a/fs/notify/fanotify/fanotify_user.c
+++ b/fs/notify/fanotify/fanotify_user.c
@@ -490,7 +490,7 @@
 	}
 
 	/* you can only watch an inode if you have read permissions on it */
-	ret = inode_permission(path->dentry->d_inode, MAY_READ);
+	ret = inode_permission2(path->mnt, path->dentry->d_inode, MAY_READ);
 	if (ret)
 		path_put(path);
 out:
diff --git a/fs/notify/inotify/Kconfig b/fs/notify/inotify/Kconfig
index b981fc0..0161c74 100644
--- a/fs/notify/inotify/Kconfig
+++ b/fs/notify/inotify/Kconfig
@@ -1,6 +1,5 @@
 config INOTIFY_USER
 	bool "Inotify support for userspace"
-	select ANON_INODES
 	select FSNOTIFY
 	default y
 	---help---
diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c
index 97a5169..a415ffa 100644
--- a/fs/notify/inotify/inotify_user.c
+++ b/fs/notify/inotify/inotify_user.c
@@ -350,7 +350,7 @@
 	if (error)
 		return error;
 	/* you can only watch an inode if you have read permissions on it */
-	error = inode_permission(path->dentry->d_inode, MAY_READ);
+	error = inode_permission2(path->mnt, path->dentry->d_inode, MAY_READ);
 	if (error)
 		path_put(path);
 	return error;
@@ -702,6 +702,8 @@
 	struct fsnotify_group *group;
 	struct inode *inode;
 	struct path path;
+	struct path alteredpath;
+	struct path *canonical_path = &path;
 	struct fd f;
 	int ret;
 	unsigned flags = 0;
@@ -747,13 +749,22 @@
 	if (ret)
 		goto fput_and_out;
 
+	/* support stacked filesystems */
+	if(path.dentry && path.dentry->d_op) {
+		if (path.dentry->d_op->d_canonical_path) {
+			path.dentry->d_op->d_canonical_path(&path, &alteredpath);
+			canonical_path = &alteredpath;
+			path_put(&path);
+		}
+	}
+
 	/* inode held in place by reference to path; group by fget on fd */
-	inode = path.dentry->d_inode;
+	inode = canonical_path->dentry->d_inode;
 	group = f.file->private_data;
 
 	/* create/update an inode mark */
 	ret = inotify_update_watch(group, inode, mask);
-	path_put(&path);
+	path_put(canonical_path);
 fput_and_out:
 	fdput(f);
 	return ret;
diff --git a/fs/open.c b/fs/open.c
index 8784787..886da56 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -34,8 +34,8 @@
 
 #include "internal.h"
 
-int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
-	struct file *filp)
+int do_truncate2(struct vfsmount *mnt, struct dentry *dentry, loff_t length,
+		unsigned int time_attrs, struct file *filp)
 {
 	int ret;
 	struct iattr newattrs;
@@ -60,17 +60,24 @@
 
 	inode_lock(dentry->d_inode);
 	/* Note any delegations or leases have already been broken: */
-	ret = notify_change(dentry, &newattrs, NULL);
+	ret = notify_change2(mnt, dentry, &newattrs, NULL);
 	inode_unlock(dentry->d_inode);
 	return ret;
 }
+int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
+	struct file *filp)
+{
+	return do_truncate2(NULL, dentry, length, time_attrs, filp);
+}
 
 long vfs_truncate(const struct path *path, loff_t length)
 {
 	struct inode *inode;
+	struct vfsmount *mnt;
 	long error;
 
 	inode = path->dentry->d_inode;
+	mnt = path->mnt;
 
 	/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
 	if (S_ISDIR(inode->i_mode))
@@ -82,7 +89,7 @@
 	if (error)
 		goto out;
 
-	error = inode_permission(inode, MAY_WRITE);
+	error = inode_permission2(mnt, inode, MAY_WRITE);
 	if (error)
 		goto mnt_drop_write_and_out;
 
@@ -106,7 +113,7 @@
 	if (!error)
 		error = security_path_truncate(path);
 	if (!error)
-		error = do_truncate(path->dentry, length, 0, NULL);
+		error = do_truncate2(mnt, path->dentry, length, 0, NULL);
 
 put_write_and_out:
 	put_write_access(inode);
@@ -155,6 +162,7 @@
 {
 	struct inode *inode;
 	struct dentry *dentry;
+	struct vfsmount *mnt;
 	struct fd f;
 	int error;
 
@@ -171,6 +179,7 @@
 		small = 0;
 
 	dentry = f.file->f_path.dentry;
+	mnt = f.file->f_path.mnt;
 	inode = dentry->d_inode;
 	error = -EINVAL;
 	if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE))
@@ -191,7 +200,7 @@
 	if (!error)
 		error = security_path_truncate(&f.file->f_path);
 	if (!error)
-		error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, f.file);
+		error = do_truncate2(mnt, dentry, length, ATTR_MTIME|ATTR_CTIME, f.file);
 	sb_end_write(inode->i_sb);
 out_putf:
 	fdput(f);
@@ -350,6 +359,7 @@
 	struct cred *override_cred;
 	struct path path;
 	struct inode *inode;
+	struct vfsmount *mnt;
 	int res;
 	unsigned int lookup_flags = LOOKUP_FOLLOW;
 
@@ -399,6 +409,7 @@
 		goto out;
 
 	inode = d_backing_inode(path.dentry);
+	mnt = path.mnt;
 
 	if ((mode & MAY_EXEC) && S_ISREG(inode->i_mode)) {
 		/*
@@ -410,7 +421,7 @@
 			goto out_path_release;
 	}
 
-	res = inode_permission(inode, mode | MAY_ACCESS);
+	res = inode_permission2(mnt, inode, mode | MAY_ACCESS);
 	/* SuS v2 requires we report a read only fs too */
 	if (res || !(mode & S_IWOTH) || special_file(inode->i_mode))
 		goto out_path_release;
@@ -459,7 +470,7 @@
 	if (error)
 		goto out;
 
-	error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
+	error = inode_permission2(path.mnt, path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
 	if (error)
 		goto dput_and_out;
 
@@ -493,7 +504,8 @@
 	if (!d_can_lookup(f.file->f_path.dentry))
 		goto out_putf;
 
-	error = inode_permission(file_inode(f.file), MAY_EXEC | MAY_CHDIR);
+	error = inode_permission2(f.file->f_path.mnt, file_inode(f.file),
+				MAY_EXEC | MAY_CHDIR);
 	if (!error)
 		set_fs_pwd(current->fs, &f.file->f_path);
 out_putf:
@@ -512,7 +524,7 @@
 	if (error)
 		goto out;
 
-	error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
+	error = inode_permission2(path.mnt, path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
 	if (error)
 		goto dput_and_out;
 
@@ -557,7 +569,7 @@
 		goto out_unlock;
 	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-	error = notify_change(path->dentry, &newattrs, &delegated_inode);
+	error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode);
 out_unlock:
 	inode_unlock(inode);
 	if (delegated_inode) {
@@ -648,7 +660,7 @@
 	inode_lock(inode);
 	error = security_path_chown(path, uid, gid);
 	if (!error)
-		error = notify_change(path->dentry, &newattrs, &delegated_inode);
+		error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode);
 	inode_unlock(inode);
 	if (delegated_inode) {
 		error = break_deleg_wait(&delegated_inode);
diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
index ffc7360..076fd2d 100644
--- a/fs/overlayfs/copy_up.c
+++ b/fs/overlayfs/copy_up.c
@@ -858,7 +858,7 @@
 		dput(parent);
 		dput(next);
 	}
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	return err;
 }
diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
index 800bcad..7b5357a 100644
--- a/fs/overlayfs/dir.c
+++ b/fs/overlayfs/dir.c
@@ -540,7 +540,7 @@
 			      struct ovl_cattr *attr, bool origin)
 {
 	int err;
-	const struct cred *old_cred;
+	const struct cred *old_cred, *hold_cred = NULL;
 	struct cred *override_cred;
 	struct dentry *parent = dentry->d_parent;
 
@@ -567,14 +567,15 @@
 		override_cred->fsgid = inode->i_gid;
 		if (!attr->hardlink) {
 			err = security_dentry_create_files_as(dentry,
-					attr->mode, &dentry->d_name, old_cred,
+					attr->mode, &dentry->d_name,
+					old_cred ? old_cred : current_cred(),
 					override_cred);
 			if (err) {
 				put_cred(override_cred);
 				goto out_revert_creds;
 			}
 		}
-		put_cred(override_creds(override_cred));
+		hold_cred = override_creds(override_cred);
 		put_cred(override_cred);
 
 		if (!ovl_dentry_is_whiteout(dentry))
@@ -583,7 +584,9 @@
 			err = ovl_create_over_whiteout(dentry, inode, attr);
 	}
 out_revert_creds:
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred ?: hold_cred);
+	if (old_cred && hold_cred)
+		put_cred(hold_cred);
 	return err;
 }
 
@@ -659,7 +662,7 @@
 
 	old_cred = ovl_override_creds(dentry->d_sb);
 	err = ovl_set_redirect(dentry, false);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	return err;
 }
@@ -857,7 +860,7 @@
 		err = ovl_remove_upper(dentry, is_dir, &list);
 	else
 		err = ovl_remove_and_whiteout(dentry, &list);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 	if (!err) {
 		if (is_dir)
 			clear_nlink(dentry->d_inode);
@@ -1225,7 +1228,7 @@
 out_unlock:
 	unlock_rename(new_upperdir, old_upperdir);
 out_revert_creds:
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 	ovl_nlink_end(new, locked);
 out_drop_write:
 	ovl_drop_write(old);
diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c
index 0bd276e..8cc2413 100644
--- a/fs/overlayfs/file.c
+++ b/fs/overlayfs/file.c
@@ -35,7 +35,7 @@
 	old_cred = ovl_override_creds(inode->i_sb);
 	realfile = open_with_fake_path(&file->f_path, flags, realinode,
 				       current_cred());
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	pr_debug("open(%p[%pD2/%c], 0%o) -> (%p, 0%o)\n",
 		 file, file, ovl_whatisit(inode, realinode), file->f_flags,
@@ -179,7 +179,7 @@
 
 	old_cred = ovl_override_creds(inode->i_sb);
 	ret = vfs_llseek(real.file, offset, whence);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	file->f_pos = real.file->f_pos;
 	inode_unlock(inode);
@@ -245,7 +245,7 @@
 	old_cred = ovl_override_creds(file_inode(file)->i_sb);
 	ret = vfs_iter_read(real.file, iter, &iocb->ki_pos,
 			    ovl_iocb_to_rwf(iocb));
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	ovl_file_accessed(file);
 
@@ -281,7 +281,7 @@
 	ret = vfs_iter_write(real.file, iter, &iocb->ki_pos,
 			     ovl_iocb_to_rwf(iocb));
 	file_end_write(real.file);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	/* Update size */
 	ovl_copyattr(ovl_inode_real(inode), inode);
@@ -308,7 +308,7 @@
 	if (file_inode(real.file) == ovl_inode_upper(file_inode(file))) {
 		old_cred = ovl_override_creds(file_inode(file)->i_sb);
 		ret = vfs_fsync_range(real.file, start, end, datasync);
-		revert_creds(old_cred);
+		ovl_revert_creds(old_cred);
 	}
 
 	fdput(real);
@@ -332,7 +332,7 @@
 
 	old_cred = ovl_override_creds(file_inode(file)->i_sb);
 	ret = call_mmap(vma->vm_file, vma);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	if (ret) {
 		/* Drop reference count from new vm_file value */
@@ -360,7 +360,7 @@
 
 	old_cred = ovl_override_creds(file_inode(file)->i_sb);
 	ret = vfs_fallocate(real.file, mode, offset, len);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	/* Update size */
 	ovl_copyattr(ovl_inode_real(inode), inode);
@@ -382,7 +382,7 @@
 
 	old_cred = ovl_override_creds(file_inode(file)->i_sb);
 	ret = vfs_fadvise(real.file, offset, len, advice);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	fdput(real);
 
@@ -402,7 +402,7 @@
 
 	old_cred = ovl_override_creds(file_inode(file)->i_sb);
 	ret = vfs_ioctl(real.file, cmd, arg);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	fdput(real);
 
@@ -591,7 +591,7 @@
 						real_out.file, pos_out, len);
 		break;
 	}
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	/* Update size */
 	ovl_copyattr(ovl_inode_real(inode_out), inode_out);
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index a138bb3..595ea0d 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -64,7 +64,7 @@
 		inode_lock(upperdentry->d_inode);
 		old_cred = ovl_override_creds(dentry->d_sb);
 		err = notify_change(upperdentry, attr, NULL);
-		revert_creds(old_cred);
+		ovl_revert_creds(old_cred);
 		if (!err)
 			ovl_copyattr(upperdentry->d_inode, dentry->d_inode);
 		inode_unlock(upperdentry->d_inode);
@@ -266,7 +266,7 @@
 		stat->nlink = dentry->d_inode->i_nlink;
 
 out:
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	return err;
 }
@@ -300,7 +300,7 @@
 		mask |= MAY_READ;
 	}
 	err = inode_permission(realinode, mask);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	return err;
 }
@@ -317,7 +317,7 @@
 
 	old_cred = ovl_override_creds(dentry->d_sb);
 	p = vfs_get_link(ovl_dentry_real(dentry), done);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 	return p;
 }
 
@@ -360,7 +360,7 @@
 		WARN_ON(flags != XATTR_REPLACE);
 		err = vfs_removexattr(realdentry, name);
 	}
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	/* copy c/mtime */
 	ovl_copyattr(d_inode(realdentry), inode);
@@ -371,6 +371,21 @@
 	return err;
 }
 
+int __ovl_xattr_get(struct dentry *dentry, struct inode *inode,
+		    const char *name, void *value, size_t size)
+{
+	ssize_t res;
+	const struct cred *old_cred;
+	struct dentry *realdentry =
+		ovl_i_dentry_upper(inode) ?: ovl_dentry_lower(dentry);
+
+	old_cred = ovl_override_creds(dentry->d_sb);
+	res = __vfs_getxattr(realdentry, d_inode(realdentry), name, value,
+			     size);
+	ovl_revert_creds(old_cred);
+	return res;
+}
+
 int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name,
 		  void *value, size_t size)
 {
@@ -381,7 +396,7 @@
 
 	old_cred = ovl_override_creds(dentry->d_sb);
 	res = vfs_getxattr(realdentry, name, value, size);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 	return res;
 }
 
@@ -406,7 +421,7 @@
 
 	old_cred = ovl_override_creds(dentry->d_sb);
 	res = vfs_listxattr(realdentry, list, size);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 	if (res <= 0 || size == 0)
 		return res;
 
@@ -441,7 +456,7 @@
 
 	old_cred = ovl_override_creds(inode->i_sb);
 	acl = get_acl(realinode, type);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	return acl;
 }
@@ -479,7 +494,7 @@
 		filemap_write_and_wait(realinode->i_mapping);
 
 	err = realinode->i_op->fiemap(realinode, fieinfo, start, len);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	return err;
 }
diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
index badf039..499cd1f 100644
--- a/fs/overlayfs/namei.c
+++ b/fs/overlayfs/namei.c
@@ -109,10 +109,11 @@
 
 static struct ovl_fh *ovl_get_fh(struct dentry *dentry, const char *name)
 {
-	int res, err;
+	ssize_t res;
+	int err;
 	struct ovl_fh *fh = NULL;
 
-	res = vfs_getxattr(dentry, name, NULL, 0);
+	res = ovl_vfs_getxattr(dentry, name, NULL, 0);
 	if (res < 0) {
 		if (res == -ENODATA || res == -EOPNOTSUPP)
 			return NULL;
@@ -126,7 +127,7 @@
 	if (!fh)
 		return ERR_PTR(-ENOMEM);
 
-	res = vfs_getxattr(dentry, name, fh, res);
+	res = ovl_vfs_getxattr(dentry, name, fh, res);
 	if (res < 0)
 		goto fail;
 
@@ -144,10 +145,11 @@
 	return NULL;
 
 fail:
-	pr_warn_ratelimited("overlayfs: failed to get origin (%i)\n", res);
+	pr_warn_ratelimited("overlayfs: failed to get origin (%zi)\n", res);
 	goto out;
 invalid:
-	pr_warn_ratelimited("overlayfs: invalid origin (%*phN)\n", res, fh);
+	pr_warn_ratelimited("overlayfs: invalid origin (%*phN)\n",
+			    (int)res, fh);
 	goto out;
 }
 
@@ -1077,7 +1079,7 @@
 			goto out_free_oe;
 	}
 
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 	if (origin_path) {
 		dput(origin_path->dentry);
 		kfree(origin_path);
@@ -1104,7 +1106,7 @@
 	kfree(upperredirect);
 out:
 	kfree(d.redirect);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 	return ERR_PTR(err);
 }
 
@@ -1158,7 +1160,7 @@
 			dput(this);
 		}
 	}
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	return positive;
 }
diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
index 265bf9c..3227f21 100644
--- a/fs/overlayfs/overlayfs.h
+++ b/fs/overlayfs/overlayfs.h
@@ -208,6 +208,9 @@
 void ovl_drop_write(struct dentry *dentry);
 struct dentry *ovl_workdir(struct dentry *dentry);
 const struct cred *ovl_override_creds(struct super_block *sb);
+void ovl_revert_creds(const struct cred *oldcred);
+ssize_t ovl_vfs_getxattr(struct dentry *dentry, const char *name, void *buf,
+			 size_t size);
 struct super_block *ovl_same_sb(struct super_block *sb);
 int ovl_can_decode_fh(struct super_block *sb);
 struct dentry *ovl_indexdir(struct super_block *sb);
@@ -350,6 +353,8 @@
 		  const void *value, size_t size, int flags);
 int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name,
 		  void *value, size_t size);
+int __ovl_xattr_get(struct dentry *dentry, struct inode *inode,
+		    const char *name, void *value, size_t size);
 ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
 struct posix_acl *ovl_get_acl(struct inode *inode, int type);
 int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags);
diff --git a/fs/overlayfs/ovl_entry.h b/fs/overlayfs/ovl_entry.h
index 1a1adc6..dc06228 100644
--- a/fs/overlayfs/ovl_entry.h
+++ b/fs/overlayfs/ovl_entry.h
@@ -20,6 +20,7 @@
 	bool nfs_export;
 	int xino;
 	bool metacopy;
+	bool override_creds;
 };
 
 struct ovl_sb {
diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c
index cc8303a..ec591b4 100644
--- a/fs/overlayfs/readdir.c
+++ b/fs/overlayfs/readdir.c
@@ -289,7 +289,7 @@
 		}
 		inode_unlock(dir->d_inode);
 	}
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 	return err;
 }
@@ -921,7 +921,7 @@
 
 	old_cred = ovl_override_creds(dentry->d_sb);
 	err = ovl_dir_read_merged(dentry, list, &root);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 	if (err)
 		return err;
 
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 127df4a..e4f7298 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -56,6 +56,11 @@
 MODULE_PARM_DESC(ovl_xino_auto_def,
 		 "Auto enable xino feature");
 
+static bool __read_mostly ovl_override_creds_def = true;
+module_param_named(override_creds, ovl_override_creds_def, bool, 0644);
+MODULE_PARM_DESC(ovl_override_creds_def,
+		 "Use mounter's credentials for accesses");
+
 static void ovl_entry_stack_free(struct ovl_entry *oe)
 {
 	unsigned int i;
@@ -368,6 +373,9 @@
 	if (ofs->config.metacopy != ovl_metacopy_def)
 		seq_printf(m, ",metacopy=%s",
 			   ofs->config.metacopy ? "on" : "off");
+	if (ofs->config.override_creds != ovl_override_creds_def)
+		seq_show_option(m, "override_creds",
+				ofs->config.override_creds ? "on" : "off");
 	return 0;
 }
 
@@ -407,6 +415,8 @@
 	OPT_XINO_AUTO,
 	OPT_METACOPY_ON,
 	OPT_METACOPY_OFF,
+	OPT_OVERRIDE_CREDS_ON,
+	OPT_OVERRIDE_CREDS_OFF,
 	OPT_ERR,
 };
 
@@ -425,6 +435,8 @@
 	{OPT_XINO_AUTO,			"xino=auto"},
 	{OPT_METACOPY_ON,		"metacopy=on"},
 	{OPT_METACOPY_OFF,		"metacopy=off"},
+	{OPT_OVERRIDE_CREDS_ON,		"override_creds=on"},
+	{OPT_OVERRIDE_CREDS_OFF,	"override_creds=off"},
 	{OPT_ERR,			NULL}
 };
 
@@ -483,6 +495,7 @@
 	config->redirect_mode = kstrdup(ovl_redirect_mode_def(), GFP_KERNEL);
 	if (!config->redirect_mode)
 		return -ENOMEM;
+	config->override_creds = ovl_override_creds_def;
 
 	while ((p = ovl_next_opt(&opt)) != NULL) {
 		int token;
@@ -563,6 +576,14 @@
 			config->metacopy = false;
 			break;
 
+		case OPT_OVERRIDE_CREDS_ON:
+			config->override_creds = true;
+			break;
+
+		case OPT_OVERRIDE_CREDS_OFF:
+			config->override_creds = false;
+			break;
+
 		default:
 			pr_err("overlayfs: unrecognized mount option \"%s\" or missing value\n", p);
 			return -EINVAL;
@@ -865,6 +886,14 @@
 }
 
 static int __maybe_unused
+__ovl_posix_acl_xattr_get(const struct xattr_handler *handler,
+			  struct dentry *dentry, struct inode *inode,
+			  const char *name, void *buffer, size_t size)
+{
+	return __ovl_xattr_get(dentry, inode, handler->name, buffer, size);
+}
+
+static int __maybe_unused
 ovl_posix_acl_xattr_set(const struct xattr_handler *handler,
 			struct dentry *dentry, struct inode *inode,
 			const char *name, const void *value,
@@ -944,6 +973,13 @@
 	return ovl_xattr_get(dentry, inode, name, buffer, size);
 }
 
+static int __ovl_other_xattr_get(const struct xattr_handler *handler,
+				 struct dentry *dentry, struct inode *inode,
+				 const char *name, void *buffer, size_t size)
+{
+	return __ovl_xattr_get(dentry, inode, name, buffer, size);
+}
+
 static int ovl_other_xattr_set(const struct xattr_handler *handler,
 			       struct dentry *dentry, struct inode *inode,
 			       const char *name, const void *value,
@@ -957,6 +993,7 @@
 	.name = XATTR_NAME_POSIX_ACL_ACCESS,
 	.flags = ACL_TYPE_ACCESS,
 	.get = ovl_posix_acl_xattr_get,
+	.__get = __ovl_posix_acl_xattr_get,
 	.set = ovl_posix_acl_xattr_set,
 };
 
@@ -965,6 +1002,7 @@
 	.name = XATTR_NAME_POSIX_ACL_DEFAULT,
 	.flags = ACL_TYPE_DEFAULT,
 	.get = ovl_posix_acl_xattr_get,
+	.__get = __ovl_posix_acl_xattr_get,
 	.set = ovl_posix_acl_xattr_set,
 };
 
@@ -977,6 +1015,7 @@
 static const struct xattr_handler ovl_other_xattr_handler = {
 	.prefix	= "", /* catch all */
 	.get = ovl_other_xattr_get,
+	.__get = __ovl_other_xattr_get,
 	.set = ovl_other_xattr_set,
 };
 
@@ -1669,7 +1708,6 @@
 		       ovl_dentry_lower(root_dentry), NULL);
 
 	sb->s_root = root_dentry;
-
 	return 0;
 
 out_free_oe:
diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c
index db8bdb2..0937b07 100644
--- a/fs/overlayfs/util.c
+++ b/fs/overlayfs/util.c
@@ -40,9 +40,23 @@
 {
 	struct ovl_fs *ofs = sb->s_fs_info;
 
+	if (!ofs->config.override_creds)
+		return NULL;
 	return override_creds(ofs->creator_cred);
 }
 
+void ovl_revert_creds(const struct cred *old_cred)
+{
+	if (old_cred)
+		revert_creds(old_cred);
+}
+
+ssize_t ovl_vfs_getxattr(struct dentry *dentry, const char *name, void *buf,
+			 size_t size)
+{
+	return __vfs_getxattr(dentry, d_inode(dentry), name, buf, size);
+}
+
 struct super_block *ovl_same_sb(struct super_block *sb)
 {
 	struct ovl_fs *ofs = sb->s_fs_info;
@@ -541,9 +555,9 @@
 
 bool ovl_check_origin_xattr(struct dentry *dentry)
 {
-	int res;
+	ssize_t res;
 
-	res = vfs_getxattr(dentry, OVL_XATTR_ORIGIN, NULL, 0);
+	res = ovl_vfs_getxattr(dentry, OVL_XATTR_ORIGIN, NULL, 0);
 
 	/* Zero size value means "copied up but origin unknown" */
 	if (res >= 0)
@@ -554,13 +568,13 @@
 
 bool ovl_check_dir_xattr(struct dentry *dentry, const char *name)
 {
-	int res;
+	ssize_t res;
 	char val;
 
 	if (!d_is_dir(dentry))
 		return false;
 
-	res = vfs_getxattr(dentry, name, &val, 1);
+	res = ovl_vfs_getxattr(dentry, name, &val, 1);
 	if (res == 1 && val == 'y')
 		return true;
 
@@ -795,7 +809,7 @@
 	 * value relative to the upper inode nlink in an upper inode xattr.
 	 */
 	err = ovl_set_nlink_upper(dentry);
-	revert_creds(old_cred);
+	ovl_revert_creds(old_cred);
 
 out:
 	if (err)
@@ -815,7 +829,7 @@
 
 			old_cred = ovl_override_creds(dentry->d_sb);
 			ovl_cleanup_index(dentry);
-			revert_creds(old_cred);
+			ovl_revert_creds(old_cred);
 		}
 
 		mutex_unlock(&OVL_I(d_inode(dentry))->lock);
@@ -844,13 +858,13 @@
 /* err < 0, 0 if no metacopy xattr, 1 if metacopy xattr found */
 int ovl_check_metacopy_xattr(struct dentry *dentry)
 {
-	int res;
+	ssize_t res;
 
 	/* Only regular files can have metacopy xattr */
 	if (!S_ISREG(d_inode(dentry)->i_mode))
 		return 0;
 
-	res = vfs_getxattr(dentry, OVL_XATTR_METACOPY, NULL, 0);
+	res = ovl_vfs_getxattr(dentry, OVL_XATTR_METACOPY, NULL, 0);
 	if (res < 0) {
 		if (res == -ENODATA || res == -EOPNOTSUPP)
 			return 0;
@@ -859,7 +873,7 @@
 
 	return 1;
 out:
-	pr_warn_ratelimited("overlayfs: failed to get metacopy (%i)\n", res);
+	pr_warn_ratelimited("overlayfs: failed to get metacopy (%zi)\n", res);
 	return res;
 }
 
@@ -885,7 +899,7 @@
 	ssize_t res;
 	char *buf = NULL;
 
-	res = vfs_getxattr(dentry, name, NULL, 0);
+	res = ovl_vfs_getxattr(dentry, name, NULL, 0);
 	if (res < 0) {
 		if (res == -ENODATA || res == -EOPNOTSUPP)
 			return -ENODATA;
@@ -897,7 +911,7 @@
 		if (!buf)
 			return -ENOMEM;
 
-		res = vfs_getxattr(dentry, name, buf, res);
+		res = ovl_vfs_getxattr(dentry, name, buf, res);
 		if (res < 0)
 			goto fail;
 	}
diff --git a/fs/pnode.c b/fs/pnode.c
index 53d411a..681916d 100644
--- a/fs/pnode.c
+++ b/fs/pnode.c
@@ -607,3 +607,19 @@
 
 	return 0;
 }
+
+void propagate_remount(struct mount *mnt)
+{
+	struct mount *parent = mnt->mnt_parent;
+	struct mount *p = mnt, *m;
+	struct super_block *sb = mnt->mnt.mnt_sb;
+
+	if (!sb->s_op->copy_mnt_data)
+		return;
+	for (p = propagation_next(parent, parent); p;
+				p = propagation_next(p, parent)) {
+		m = __lookup_mnt(&p->mnt, mnt->mnt_mountpoint);
+		if (m)
+			sb->s_op->copy_mnt_data(m->mnt.data, mnt->mnt.data);
+	}
+}
diff --git a/fs/pnode.h b/fs/pnode.h
index dc87e65..a9a6576 100644
--- a/fs/pnode.h
+++ b/fs/pnode.h
@@ -44,6 +44,7 @@
 int propagate_umount(struct list_head *);
 int propagate_mount_busy(struct mount *, int);
 void propagate_mount_unlock(struct mount *);
+void propagate_remount(struct mount *);
 void mnt_release_group_id(struct mount *);
 int get_dominating_id(struct mount *mnt, const struct path *root);
 unsigned int mnt_get_count(struct mount *mnt);
diff --git a/fs/proc/Kconfig b/fs/proc/Kconfig
index 817c02b..cad2c60 100644
--- a/fs/proc/Kconfig
+++ b/fs/proc/Kconfig
@@ -97,3 +97,9 @@
 
 	  Say Y if you are running any user-space software which takes benefit from
 	  this interface. For example, rkt is such a piece of software.
+
+config PROC_UID
+	bool "Include /proc/uid/ files"
+	depends on PROC_FS && RT_MUTEXES
+	help
+	Provides aggregated per-uid information under /proc/uid.
diff --git a/fs/proc/Makefile b/fs/proc/Makefile
index ead487e..3f849ca 100644
--- a/fs/proc/Makefile
+++ b/fs/proc/Makefile
@@ -27,6 +27,7 @@
 proc-y	+= namespaces.o
 proc-y	+= self.o
 proc-y	+= thread_self.o
+proc-$(CONFIG_PROC_UID)  += uid.o
 proc-$(CONFIG_PROC_SYSCTL)	+= proc_sysctl.o
 proc-$(CONFIG_NET)		+= proc_net.o
 proc-$(CONFIG_PROC_KCORE)	+= kcore.o
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 3b9b726..ebaad54 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -94,6 +94,7 @@
 #include <linux/sched/stat.h>
 #include <linux/flex_array.h>
 #include <linux/posix-timers.h>
+#include <linux/cpufreq_times.h>
 #include <trace/events/oom.h>
 #include "internal.h"
 #include "fd.h"
@@ -3041,6 +3042,9 @@
 #ifdef CONFIG_LIVEPATCH
 	ONE("patch_state",  S_IRUSR, proc_pid_patch_state),
 #endif
+#ifdef CONFIG_CPU_FREQ_TIMES
+	ONE("time_in_state", 0444, proc_time_in_state_show),
+#endif
 };
 
 static int proc_tgid_base_readdir(struct file *file, struct dir_context *ctx)
@@ -3055,6 +3059,15 @@
 	.llseek		= generic_file_llseek,
 };
 
+struct pid *tgid_pidfd_to_pid(const struct file *file)
+{
+	if (!d_is_dir(file->f_path.dentry) ||
+	    (file->f_op != &proc_tgid_base_operations))
+		return ERR_PTR(-EBADF);
+
+	return proc_pid(file_inode(file));
+}
+
 static struct dentry *proc_tgid_base_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
 {
 	return proc_pident_lookup(dir, dentry,
@@ -3419,6 +3432,9 @@
 #ifdef CONFIG_LIVEPATCH
 	ONE("patch_state",  S_IRUSR, proc_pid_patch_state),
 #endif
+#ifdef CONFIG_CPU_FREQ_TIMES
+	ONE("time_in_state", 0444, proc_time_in_state_show),
+#endif
 };
 
 static int proc_tid_base_readdir(struct file *file, struct dir_context *ctx)
diff --git a/fs/proc/inode.c b/fs/proc/inode.c
index fc5306a..1b4f336 100644
--- a/fs/proc/inode.c
+++ b/fs/proc/inode.c
@@ -491,17 +491,13 @@
 	return inode;
 }
 
-int proc_fill_super(struct super_block *s, void *data, int silent)
+int proc_fill_super(struct super_block *s)
 {
-	struct pid_namespace *ns = get_pid_ns(s->s_fs_info);
 	struct inode *root_inode;
 	int ret;
 
-	if (!proc_parse_options(data, ns))
-		return -EINVAL;
-
 	/* User space would break if executables or devices appear on proc */
-	s->s_iflags |= SB_I_USERNS_VISIBLE | SB_I_NOEXEC | SB_I_NODEV;
+	s->s_iflags |= SB_I_USERNS_VISIBLE | SB_I_NODEV;
 	s->s_flags |= SB_NODIRATIME | SB_NOSUID | SB_NOEXEC;
 	s->s_blocksize = 1024;
 	s->s_blocksize_bits = 10;
diff --git a/fs/proc/internal.h b/fs/proc/internal.h
index 95b1419..bacad3e 100644
--- a/fs/proc/internal.h
+++ b/fs/proc/internal.h
@@ -212,7 +212,7 @@
 void proc_init_kmemcache(void);
 void set_proc_pid_nlink(void);
 extern struct inode *proc_get_inode(struct super_block *, struct proc_dir_entry *);
-extern int proc_fill_super(struct super_block *, void *data, int flags);
+extern int proc_fill_super(struct super_block *);
 extern void proc_entry_rundown(struct proc_dir_entry *);
 
 /*
@@ -258,6 +258,15 @@
 #endif
 
 /*
+ * uid.c
+ */
+#ifdef CONFIG_PROC_UID
+extern int proc_uid_init(void);
+#else
+static inline void proc_uid_init(void) { }
+#endif
+
+/*
  * proc_tty.c
  */
 #ifdef CONFIG_TTY
@@ -270,7 +279,6 @@
  * root.c
  */
 extern struct proc_dir_entry proc_root;
-extern int proc_parse_options(char *options, struct pid_namespace *pid);
 
 extern void proc_self_init(void);
 extern int proc_remount(struct super_block *, int *, char *);
diff --git a/fs/proc/loadavg.c b/fs/proc/loadavg.c
index d066947..8468bae 100644
--- a/fs/proc/loadavg.c
+++ b/fs/proc/loadavg.c
@@ -10,9 +10,6 @@
 #include <linux/seqlock.h>
 #include <linux/time.h>
 
-#define LOAD_INT(x) ((x) >> FSHIFT)
-#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
-
 static int loadavg_proc_show(struct seq_file *m, void *v)
 {
 	unsigned long avnrun[3];
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
index edda898..f2dab6c 100644
--- a/fs/proc/meminfo.c
+++ b/fs/proc/meminfo.c
@@ -38,6 +38,7 @@
 	long cached;
 	long available;
 	unsigned long pages[NR_LRU_LISTS];
+	unsigned long sreclaimable, sunreclaim;
 	int lru;
 
 	si_meminfo(&i);
@@ -53,6 +54,8 @@
 		pages[lru] = global_node_page_state(NR_LRU_BASE + lru);
 
 	available = si_mem_available();
+	sreclaimable = global_node_page_state(NR_SLAB_RECLAIMABLE);
+	sunreclaim = global_node_page_state(NR_SLAB_UNRECLAIMABLE);
 
 	show_val_kb(m, "MemTotal:       ", i.totalram);
 	show_val_kb(m, "MemFree:        ", i.freeram);
@@ -94,16 +97,17 @@
 	show_val_kb(m, "Mapped:         ",
 		    global_node_page_state(NR_FILE_MAPPED));
 	show_val_kb(m, "Shmem:          ", i.sharedram);
-	show_val_kb(m, "Slab:           ",
-		    global_node_page_state(NR_SLAB_RECLAIMABLE) +
-		    global_node_page_state(NR_SLAB_UNRECLAIMABLE));
-
-	show_val_kb(m, "SReclaimable:   ",
-		    global_node_page_state(NR_SLAB_RECLAIMABLE));
-	show_val_kb(m, "SUnreclaim:     ",
-		    global_node_page_state(NR_SLAB_UNRECLAIMABLE));
+	show_val_kb(m, "KReclaimable:   ", sreclaimable +
+		    global_node_page_state(NR_KERNEL_MISC_RECLAIMABLE));
+	show_val_kb(m, "Slab:           ", sreclaimable + sunreclaim);
+	show_val_kb(m, "SReclaimable:   ", sreclaimable);
+	show_val_kb(m, "SUnreclaim:     ", sunreclaim);
 	seq_printf(m, "KernelStack:    %8lu kB\n",
 		   global_zone_page_state(NR_KERNEL_STACK_KB));
+#ifdef CONFIG_SHADOW_CALL_STACK
+	seq_printf(m, "ShadowCallStack:%8lu kB\n",
+		   global_zone_page_state(NR_KERNEL_SCS_BYTES) / 1024);
+#endif
 	show_val_kb(m, "PageTables:     ",
 		    global_zone_page_state(NR_PAGETABLE));
 #ifdef CONFIG_QUICKLIST
@@ -120,7 +124,7 @@
 	show_val_kb(m, "Committed_AS:   ", committed);
 	seq_printf(m, "VmallocTotal:   %8lu kB\n",
 		   (unsigned long)VMALLOC_TOTAL >> 10);
-	show_val_kb(m, "VmallocUsed:    ", 0ul);
+	show_val_kb(m, "VmallocUsed:    ", vmalloc_nr_pages());
 	show_val_kb(m, "VmallocChunk:   ", 0ul);
 	show_val_kb(m, "Percpu:         ", pcpu_nr_pages());
 
diff --git a/fs/proc/root.c b/fs/proc/root.c
index f4b1a9d..f672dbac 100644
--- a/fs/proc/root.c
+++ b/fs/proc/root.c
@@ -26,6 +26,21 @@
 
 #include "internal.h"
 
+static int proc_test_super(struct super_block *sb, void *data)
+{
+	return sb->s_fs_info == data;
+}
+
+static int proc_set_super(struct super_block *sb, void *data)
+{
+	int err = set_anon_super(sb, NULL);
+	if (!err) {
+		struct pid_namespace *ns = (struct pid_namespace *)data;
+		sb->s_fs_info = get_pid_ns(ns);
+	}
+	return err;
+}
+
 enum {
 	Opt_gid, Opt_hidepid, Opt_err,
 };
@@ -36,7 +51,7 @@
 	{Opt_err, NULL},
 };
 
-int proc_parse_options(char *options, struct pid_namespace *pid)
+static int proc_parse_options(char *options, struct pid_namespace *pid)
 {
 	char *p;
 	substring_t args[MAX_OPT_ARGS];
@@ -89,16 +104,45 @@
 static struct dentry *proc_mount(struct file_system_type *fs_type,
 	int flags, const char *dev_name, void *data)
 {
+	int err;
+	struct super_block *sb;
 	struct pid_namespace *ns;
+	char *options;
 
 	if (flags & SB_KERNMOUNT) {
-		ns = data;
-		data = NULL;
+		ns = (struct pid_namespace *)data;
+		options = NULL;
 	} else {
 		ns = task_active_pid_ns(current);
+		options = data;
+
+		/* Does the mounter have privilege over the pid namespace? */
+		if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN))
+			return ERR_PTR(-EPERM);
 	}
 
-	return mount_ns(fs_type, flags, data, ns, ns->user_ns, proc_fill_super);
+	sb = sget(fs_type, proc_test_super, proc_set_super, flags, ns);
+	if (IS_ERR(sb))
+		return ERR_CAST(sb);
+
+	if (!proc_parse_options(options, ns)) {
+		deactivate_locked_super(sb);
+		return ERR_PTR(-EINVAL);
+	}
+
+	if (!sb->s_root) {
+		err = proc_fill_super(sb);
+		if (err) {
+			deactivate_locked_super(sb);
+			return ERR_PTR(err);
+		}
+
+		sb->s_flags |= MS_ACTIVE;
+		/* User space would break if executables appear on proc */
+		sb->s_iflags |= SB_I_NOEXEC;
+	}
+
+	return dget(sb->s_root);
 }
 
 static void proc_kill_sb(struct super_block *sb)
@@ -130,6 +174,7 @@
 	proc_symlink("mounts", NULL, "self/mounts");
 
 	proc_net_init();
+	proc_uid_init();
 	proc_mkdir("fs", NULL);
 	proc_mkdir("driver", NULL);
 	proc_create_mount_point("fs/nfsd"); /* somewhere for the nfsd filesystem to be mounted */
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index efa6273..0c31906 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -123,6 +123,56 @@
 }
 #endif
 
+static void seq_print_vma_name(struct seq_file *m, struct vm_area_struct *vma)
+{
+	const char __user *name = vma_get_anon_name(vma);
+	struct mm_struct *mm = vma->vm_mm;
+
+	unsigned long page_start_vaddr;
+	unsigned long page_offset;
+	unsigned long num_pages;
+	unsigned long max_len = NAME_MAX;
+	int i;
+
+	page_start_vaddr = (unsigned long)name & PAGE_MASK;
+	page_offset = (unsigned long)name - page_start_vaddr;
+	num_pages = DIV_ROUND_UP(page_offset + max_len, PAGE_SIZE);
+
+	seq_puts(m, "[anon:");
+
+	for (i = 0; i < num_pages; i++) {
+		int len;
+		int write_len;
+		const char *kaddr;
+		long pages_pinned;
+		struct page *page;
+
+		pages_pinned = get_user_pages_remote(current, mm,
+				page_start_vaddr, 1, 0, &page, NULL, NULL);
+		if (pages_pinned < 1) {
+			seq_puts(m, "<fault>]");
+			return;
+		}
+
+		kaddr = (const char *)kmap(page);
+		len = min(max_len, PAGE_SIZE - page_offset);
+		write_len = strnlen(kaddr + page_offset, len);
+		seq_write(m, kaddr + page_offset, write_len);
+		kunmap(page);
+		put_page(page);
+
+		/* if strnlen hit a null terminator then we're done */
+		if (write_len != len)
+			break;
+
+		max_len -= len;
+		page_offset = 0;
+		page_start_vaddr += PAGE_SIZE;
+	}
+
+	seq_putc(m, ']');
+}
+
 static void vma_stop(struct proc_maps_private *priv)
 {
 	struct mm_struct *mm = priv->mm;
@@ -348,8 +398,15 @@
 			goto done;
 		}
 
-		if (is_stack(vma))
+		if (is_stack(vma)) {
 			name = "[stack]";
+			goto done;
+		}
+
+		if (vma_get_anon_name(vma)) {
+			seq_pad(m, ' ');
+			seq_print_vma_name(m, vma);
+		}
 	}
 
 done:
@@ -792,6 +849,11 @@
 	smap_gather_stats(vma, &mss);
 
 	show_map_vma(m, vma);
+	if (vma_get_anon_name(vma)) {
+		seq_puts(m, "Name:           ");
+		seq_print_vma_name(m, vma);
+		seq_putc(m, '\n');
+	}
 
 	SEQ_PUT_DEC("Size:           ", vma->vm_end - vma->vm_start);
 	SEQ_PUT_DEC(" kB\nKernelPageSize: ", vma_kernel_pagesize(vma));
diff --git a/fs/proc/uid.c b/fs/proc/uid.c
new file mode 100644
index 0000000..311717e
--- /dev/null
+++ b/fs/proc/uid.c
@@ -0,0 +1,304 @@
+/*
+ * /proc/uid support
+ */
+
+#include <linux/cpufreq_times.h>
+#include <linux/fs.h>
+#include <linux/hashtable.h>
+#include <linux/init.h>
+#include <linux/proc_fs.h>
+#include <linux/rtmutex.h>
+#include <linux/sched.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include "internal.h"
+
+static struct proc_dir_entry *proc_uid;
+
+#define UID_HASH_BITS 10
+
+static DECLARE_HASHTABLE(proc_uid_hash_table, UID_HASH_BITS);
+
+/*
+ * use rt_mutex here to avoid priority inversion between high-priority readers
+ * of these files and tasks calling proc_register_uid().
+ */
+static DEFINE_RT_MUTEX(proc_uid_lock); /* proc_uid_hash_table */
+
+struct uid_hash_entry {
+	uid_t uid;
+	struct hlist_node hash;
+};
+
+/* Caller must hold proc_uid_lock */
+static bool uid_hash_entry_exists_locked(uid_t uid)
+{
+	struct uid_hash_entry *entry;
+
+	hash_for_each_possible(proc_uid_hash_table, entry, hash, uid) {
+		if (entry->uid == uid)
+			return true;
+	}
+	return false;
+}
+
+void proc_register_uid(kuid_t kuid)
+{
+	struct uid_hash_entry *entry;
+	bool exists;
+	uid_t uid = from_kuid_munged(current_user_ns(), kuid);
+
+	rt_mutex_lock(&proc_uid_lock);
+	exists = uid_hash_entry_exists_locked(uid);
+	rt_mutex_unlock(&proc_uid_lock);
+	if (exists)
+		return;
+
+	entry = kzalloc(sizeof(struct uid_hash_entry), GFP_KERNEL);
+	if (!entry)
+		return;
+	entry->uid = uid;
+
+	rt_mutex_lock(&proc_uid_lock);
+	if (uid_hash_entry_exists_locked(uid))
+		kfree(entry);
+	else
+		hash_add(proc_uid_hash_table, &entry->hash, uid);
+	rt_mutex_unlock(&proc_uid_lock);
+}
+
+struct uid_entry {
+	const char *name;
+	int len;
+	umode_t mode;
+	const struct inode_operations *iop;
+	const struct file_operations *fop;
+};
+
+#define NOD(NAME, MODE, IOP, FOP) {			\
+	.name	= (NAME),				\
+	.len	= sizeof(NAME) - 1,			\
+	.mode	= MODE,					\
+	.iop	= IOP,					\
+	.fop	= FOP,					\
+}
+
+#ifdef CONFIG_CPU_FREQ_TIMES
+static const struct file_operations proc_uid_time_in_state_operations = {
+	.open		= single_uid_time_in_state_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= single_release,
+};
+#endif
+
+static const struct uid_entry uid_base_stuff[] = {
+#ifdef CONFIG_CPU_FREQ_TIMES
+	NOD("time_in_state", 0444, NULL, &proc_uid_time_in_state_operations),
+#endif
+};
+
+static const struct inode_operations proc_uid_def_inode_operations = {
+	.setattr	= proc_setattr,
+};
+
+static struct inode *proc_uid_make_inode(struct super_block *sb, kuid_t kuid)
+{
+	struct inode *inode;
+
+	inode = new_inode(sb);
+	if (!inode)
+		return NULL;
+
+	inode->i_ino = get_next_ino();
+	inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
+	inode->i_op = &proc_uid_def_inode_operations;
+	inode->i_uid = kuid;
+
+	return inode;
+}
+
+static struct dentry *proc_uident_instantiate(struct dentry *dentry,
+				   struct task_struct *unused, const void *ptr)
+{
+	const struct uid_entry *u = ptr;
+	struct inode *inode;
+
+	uid_t uid = name_to_int(&dentry->d_name);
+	kuid_t kuid;
+	bool uid_exists;
+	rt_mutex_lock(&proc_uid_lock);
+	uid_exists = uid_hash_entry_exists_locked(uid);
+	rt_mutex_unlock(&proc_uid_lock);
+	if (uid_exists) {
+		kuid = make_kuid(current_user_ns(), uid);
+		inode = proc_uid_make_inode(dentry->d_sb, kuid);
+		if (!inode)
+			return ERR_PTR(-ENOENT);
+	} else {
+		return ERR_PTR(-ENOENT);
+	}
+
+	inode->i_mode = u->mode;
+	if (S_ISDIR(inode->i_mode))
+		set_nlink(inode, 2);
+	if (u->iop)
+		inode->i_op = u->iop;
+	if (u->fop)
+		inode->i_fop = u->fop;
+
+	return d_splice_alias(inode, dentry);
+}
+
+static struct dentry *proc_uid_base_lookup(struct inode *dir,
+					   struct dentry *dentry,
+					   unsigned int flags)
+{
+	const struct uid_entry *u, *last;
+	unsigned int nents = ARRAY_SIZE(uid_base_stuff);
+
+	if (nents == 0)
+		return ERR_PTR(-ENOENT);
+
+	last = &uid_base_stuff[nents - 1];
+	for (u = uid_base_stuff; u <= last; u++) {
+		if (u->len != dentry->d_name.len)
+			continue;
+		if (!memcmp(dentry->d_name.name, u->name, u->len))
+			break;
+	}
+	if (u > last)
+		return ERR_PTR(-ENOENT);
+
+	return proc_uident_instantiate(dentry, NULL, u);
+}
+
+static int proc_uid_base_readdir(struct file *file, struct dir_context *ctx)
+{
+	unsigned int nents = ARRAY_SIZE(uid_base_stuff);
+	const struct uid_entry *u;
+
+	if (!dir_emit_dots(file, ctx))
+		return 0;
+
+	if (ctx->pos >= nents + 2)
+		return 0;
+
+	for (u = uid_base_stuff + (ctx->pos - 2);
+	     u < uid_base_stuff + nents; u++) {
+		if (!proc_fill_cache(file, ctx, u->name, u->len,
+				     proc_uident_instantiate, NULL, u))
+			break;
+		ctx->pos++;
+	}
+
+	return 0;
+}
+
+static const struct inode_operations proc_uid_base_inode_operations = {
+	.lookup		= proc_uid_base_lookup,
+	.setattr	= proc_setattr,
+};
+
+static const struct file_operations proc_uid_base_operations = {
+	.read		= generic_read_dir,
+	.iterate	= proc_uid_base_readdir,
+	.llseek		= default_llseek,
+};
+
+static struct dentry *proc_uid_instantiate(struct dentry *dentry,
+				struct task_struct *unused, const void *ptr)
+{
+	unsigned int i, len;
+	nlink_t nlinks;
+	kuid_t *kuid = (kuid_t *)ptr;
+	struct inode *inode = proc_uid_make_inode(dentry->d_sb, *kuid);
+
+	if (!inode)
+		return ERR_PTR(-ENOENT);
+
+	inode->i_mode = S_IFDIR | 0555;
+	inode->i_op = &proc_uid_base_inode_operations;
+	inode->i_fop = &proc_uid_base_operations;
+	inode->i_flags |= S_IMMUTABLE;
+
+	nlinks = 2;
+	len = ARRAY_SIZE(uid_base_stuff);
+	for (i = 0; i < len; ++i) {
+		if (S_ISDIR(uid_base_stuff[i].mode))
+			++nlinks;
+	}
+	set_nlink(inode, nlinks);
+
+	return d_splice_alias(inode, dentry);
+}
+
+static int proc_uid_readdir(struct file *file, struct dir_context *ctx)
+{
+	int last_shown, i;
+	unsigned long bkt;
+	struct uid_hash_entry *entry;
+
+	if (!dir_emit_dots(file, ctx))
+		return 0;
+
+	i = 0;
+	last_shown = ctx->pos - 2;
+	rt_mutex_lock(&proc_uid_lock);
+	hash_for_each(proc_uid_hash_table, bkt, entry, hash) {
+		int len;
+		char buf[PROC_NUMBUF];
+
+		if (i < last_shown)
+			continue;
+		len = snprintf(buf, sizeof(buf), "%u", entry->uid);
+		if (!proc_fill_cache(file, ctx, buf, len,
+				     proc_uid_instantiate, NULL, &entry->uid))
+			break;
+		i++;
+		ctx->pos++;
+	}
+	rt_mutex_unlock(&proc_uid_lock);
+	return 0;
+}
+
+static struct dentry *proc_uid_lookup(struct inode *dir, struct dentry *dentry,
+				      unsigned int flags)
+{
+	int result = -ENOENT;
+
+	uid_t uid = name_to_int(&dentry->d_name);
+	bool uid_exists;
+
+	rt_mutex_lock(&proc_uid_lock);
+	uid_exists = uid_hash_entry_exists_locked(uid);
+	rt_mutex_unlock(&proc_uid_lock);
+	if (uid_exists) {
+		kuid_t kuid = make_kuid(current_user_ns(), uid);
+
+		return proc_uid_instantiate(dentry, NULL, &kuid);
+	}
+	return ERR_PTR(result);
+}
+
+static const struct file_operations proc_uid_operations = {
+	.read		= generic_read_dir,
+	.iterate	= proc_uid_readdir,
+	.llseek		= default_llseek,
+};
+
+static const struct inode_operations proc_uid_inode_operations = {
+	.lookup		= proc_uid_lookup,
+	.setattr	= proc_setattr,
+};
+
+int __init proc_uid_init(void)
+{
+	proc_uid = proc_mkdir("uid", NULL);
+	if (!proc_uid)
+		return -ENOMEM;
+	proc_uid->proc_iops = &proc_uid_inode_operations;
+	proc_uid->proc_fops = &proc_uid_operations;
+
+	return 0;
+}
diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c
index e16fb8f..bd07f0f 100644
--- a/fs/proc_namespace.c
+++ b/fs/proc_namespace.c
@@ -121,7 +121,9 @@
 	if (err)
 		goto out;
 	show_mnt_opts(m, mnt);
-	if (sb->s_op->show_options)
+	if (sb->s_op->show_options2)
+			err = sb->s_op->show_options2(mnt, m, mnt_path.dentry);
+	else if (sb->s_op->show_options)
 		err = sb->s_op->show_options(m, mnt_path.dentry);
 	seq_puts(m, " 0 0\n");
 out:
@@ -183,7 +185,9 @@
 	err = show_sb_opts(m, sb);
 	if (err)
 		goto out;
-	if (sb->s_op->show_options)
+	if (sb->s_op->show_options2) {
+		err = sb->s_op->show_options2(mnt, m, mnt->mnt_root);
+	} else if (sb->s_op->show_options)
 		err = sb->s_op->show_options(m, mnt->mnt_root);
 	seq_putc(m, '\n');
 out:
diff --git a/fs/read_write.c b/fs/read_write.c
index 2195380..4954fae 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -460,6 +460,8 @@
 	return ret;
 }
 
+EXPORT_SYMBOL_GPL(vfs_read);
+
 static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
 {
 	struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
@@ -558,6 +560,8 @@
 	return ret;
 }
 
+EXPORT_SYMBOL_GPL(vfs_write);
+
 static inline loff_t file_pos_read(struct file *file)
 {
 	return file->f_mode & FMODE_STREAM ? 0 : file->f_pos;
diff --git a/fs/sdcardfs/Kconfig b/fs/sdcardfs/Kconfig
new file mode 100644
index 0000000..a1c1033
--- /dev/null
+++ b/fs/sdcardfs/Kconfig
@@ -0,0 +1,13 @@
+config SDCARD_FS
+	tristate "sdcard file system"
+	depends on CONFIGFS_FS
+	default n
+	help
+	  Sdcardfs is based on Wrapfs file system.
+
+config SDCARD_FS_FADV_NOACTIVE
+	bool "sdcardfs fadvise noactive support"
+	depends on FADV_NOACTIVE
+	default y
+	help
+	  Sdcardfs supports fadvise noactive mode.
diff --git a/fs/sdcardfs/Makefile b/fs/sdcardfs/Makefile
new file mode 100644
index 0000000..b84fbb2
--- /dev/null
+++ b/fs/sdcardfs/Makefile
@@ -0,0 +1,7 @@
+SDCARDFS_VERSION="0.1"
+
+EXTRA_CFLAGS += -DSDCARDFS_VERSION=\"$(SDCARDFS_VERSION)\"
+
+obj-$(CONFIG_SDCARD_FS) += sdcardfs.o
+
+sdcardfs-y := dentry.o file.o inode.o main.o super.o lookup.o mmap.o packagelist.o derived_perm.o
diff --git a/fs/sdcardfs/dentry.c b/fs/sdcardfs/dentry.c
new file mode 100644
index 0000000..cb573f1
--- /dev/null
+++ b/fs/sdcardfs/dentry.c
@@ -0,0 +1,196 @@
+/*
+ * fs/sdcardfs/dentry.c
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#include "sdcardfs.h"
+#include "linux/ctype.h"
+
+/*
+ * returns: -ERRNO if error (returned to user)
+ *          0: tell VFS to invalidate dentry
+ *          1: dentry is valid
+ */
+static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags)
+{
+	int err = 1;
+	struct path parent_lower_path, lower_path;
+	struct dentry *parent_dentry = NULL;
+	struct dentry *parent_lower_dentry = NULL;
+	struct dentry *lower_cur_parent_dentry = NULL;
+	struct dentry *lower_dentry = NULL;
+	struct inode *inode;
+	struct sdcardfs_inode_data *data;
+
+	if (flags & LOOKUP_RCU)
+		return -ECHILD;
+
+	spin_lock(&dentry->d_lock);
+	if (IS_ROOT(dentry)) {
+		spin_unlock(&dentry->d_lock);
+		return 1;
+	}
+	spin_unlock(&dentry->d_lock);
+
+	/* check uninitialized obb_dentry and
+	 * whether the base obbpath has been changed or not
+	 */
+	if (is_obbpath_invalid(dentry)) {
+		return 0;
+	}
+
+	parent_dentry = dget_parent(dentry);
+	sdcardfs_get_lower_path(parent_dentry, &parent_lower_path);
+	sdcardfs_get_real_lower(dentry, &lower_path);
+	parent_lower_dentry = parent_lower_path.dentry;
+	lower_dentry = lower_path.dentry;
+	lower_cur_parent_dentry = dget_parent(lower_dentry);
+
+	if ((lower_dentry->d_flags & DCACHE_OP_REVALIDATE)) {
+		err = lower_dentry->d_op->d_revalidate(lower_dentry, flags);
+		if (err == 0) {
+			goto out;
+		}
+	}
+
+	spin_lock(&lower_dentry->d_lock);
+	if (d_unhashed(lower_dentry)) {
+		spin_unlock(&lower_dentry->d_lock);
+		err = 0;
+		goto out;
+	}
+	spin_unlock(&lower_dentry->d_lock);
+
+	if (parent_lower_dentry != lower_cur_parent_dentry) {
+		err = 0;
+		goto out;
+	}
+
+	if (dentry < lower_dentry) {
+		spin_lock(&dentry->d_lock);
+		spin_lock_nested(&lower_dentry->d_lock, DENTRY_D_LOCK_NESTED);
+	} else {
+		spin_lock(&lower_dentry->d_lock);
+		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
+	}
+
+	if (!qstr_case_eq(&dentry->d_name, &lower_dentry->d_name)) {
+		err = 0;
+	}
+
+	if (dentry < lower_dentry) {
+		spin_unlock(&lower_dentry->d_lock);
+		spin_unlock(&dentry->d_lock);
+	} else {
+		spin_unlock(&dentry->d_lock);
+		spin_unlock(&lower_dentry->d_lock);
+	}
+	if (!err)
+		goto out;
+
+	/* If our top's inode is gone, we may be out of date */
+	inode = igrab(d_inode(dentry));
+	if (inode) {
+		data = top_data_get(SDCARDFS_I(inode));
+		if (!data || data->abandoned) {
+			err = 0;
+		}
+		if (data)
+			data_put(data);
+		iput(inode);
+	}
+
+out:
+	dput(parent_dentry);
+	dput(lower_cur_parent_dentry);
+	sdcardfs_put_lower_path(parent_dentry, &parent_lower_path);
+	sdcardfs_put_real_lower(dentry, &lower_path);
+	return err;
+}
+
+/* 1 = delete, 0 = cache */
+static int sdcardfs_d_delete(const struct dentry *d)
+{
+	return SDCARDFS_SB(d->d_sb)->options.nocache ? 1 : 0;
+}
+
+static void sdcardfs_d_release(struct dentry *dentry)
+{
+	if (!dentry || !dentry->d_fsdata)
+		return;
+	/* release and reset the lower paths */
+	if (has_graft_path(dentry))
+		sdcardfs_put_reset_orig_path(dentry);
+	sdcardfs_put_reset_lower_path(dentry);
+	free_dentry_private_data(dentry);
+}
+
+static int sdcardfs_hash_ci(const struct dentry *dentry,
+				struct qstr *qstr)
+{
+	/*
+	 * This function is copy of vfat_hashi.
+	 * FIXME Should we support national language?
+	 *       Refer to vfat_hashi()
+	 * struct nls_table *t = MSDOS_SB(dentry->d_sb)->nls_io;
+	 */
+	const unsigned char *name;
+	unsigned int len;
+	unsigned long hash;
+
+	name = qstr->name;
+	len = qstr->len;
+
+	hash = init_name_hash(dentry);
+	while (len--)
+		hash = partial_name_hash(tolower(*name++), hash);
+	qstr->hash = end_name_hash(hash);
+
+	return 0;
+}
+
+/*
+ * Case insensitive compare of two vfat names.
+ */
+static int sdcardfs_cmp_ci(const struct dentry *dentry,
+		unsigned int len, const char *str, const struct qstr *name)
+{
+	/* FIXME Should we support national language? */
+
+	if (name->len == len) {
+		if (str_n_case_eq(name->name, str, len))
+			return 0;
+	}
+	return 1;
+}
+
+static void sdcardfs_canonical_path(const struct path *path,
+				struct path *actual_path)
+{
+	sdcardfs_get_real_lower(path->dentry, actual_path);
+}
+
+const struct dentry_operations sdcardfs_ci_dops = {
+	.d_revalidate	= sdcardfs_d_revalidate,
+	.d_delete	= sdcardfs_d_delete,
+	.d_release	= sdcardfs_d_release,
+	.d_hash	= sdcardfs_hash_ci,
+	.d_compare	= sdcardfs_cmp_ci,
+	.d_canonical_path = sdcardfs_canonical_path,
+};
+
diff --git a/fs/sdcardfs/derived_perm.c b/fs/sdcardfs/derived_perm.c
new file mode 100644
index 0000000..78a669c
--- /dev/null
+++ b/fs/sdcardfs/derived_perm.c
@@ -0,0 +1,477 @@
+/*
+ * fs/sdcardfs/derived_perm.c
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#include "sdcardfs.h"
+
+/* copy derived state from parent inode */
+static void inherit_derived_state(struct inode *parent, struct inode *child)
+{
+	struct sdcardfs_inode_info *pi = SDCARDFS_I(parent);
+	struct sdcardfs_inode_info *ci = SDCARDFS_I(child);
+
+	ci->data->perm = PERM_INHERIT;
+	ci->data->userid = pi->data->userid;
+	ci->data->d_uid = pi->data->d_uid;
+	ci->data->under_android = pi->data->under_android;
+	ci->data->under_cache = pi->data->under_cache;
+	ci->data->under_obb = pi->data->under_obb;
+}
+
+/* helper function for derived state */
+void setup_derived_state(struct inode *inode, perm_t perm, userid_t userid,
+					uid_t uid)
+{
+	struct sdcardfs_inode_info *info = SDCARDFS_I(inode);
+
+	info->data->perm = perm;
+	info->data->userid = userid;
+	info->data->d_uid = uid;
+	info->data->under_android = false;
+	info->data->under_cache = false;
+	info->data->under_obb = false;
+}
+
+/* While renaming, there is a point where we want the path from dentry,
+ * but the name from newdentry
+ */
+void get_derived_permission_new(struct dentry *parent, struct dentry *dentry,
+				const struct qstr *name)
+{
+	struct sdcardfs_inode_info *info = SDCARDFS_I(d_inode(dentry));
+	struct sdcardfs_inode_info *parent_info = SDCARDFS_I(d_inode(parent));
+	struct sdcardfs_inode_data *parent_data = parent_info->data;
+	appid_t appid;
+	unsigned long user_num;
+	int err;
+	struct qstr q_Android = QSTR_LITERAL("Android");
+	struct qstr q_data = QSTR_LITERAL("data");
+	struct qstr q_sandbox = QSTR_LITERAL("sandbox");
+	struct qstr q_obb = QSTR_LITERAL("obb");
+	struct qstr q_media = QSTR_LITERAL("media");
+	struct qstr q_cache = QSTR_LITERAL("cache");
+
+	/* By default, each inode inherits from its parent.
+	 * the properties are maintained on its private fields
+	 * because the inode attributes will be modified with that of
+	 * its lower inode.
+	 * These values are used by our custom permission call instead
+	 * of using the inode permissions.
+	 */
+
+	inherit_derived_state(d_inode(parent), d_inode(dentry));
+
+	/* Files don't get special labels */
+	if (!S_ISDIR(d_inode(dentry)->i_mode)) {
+		set_top(info, parent_info);
+		return;
+	}
+	/* Derive custom permissions based on parent and current node */
+	switch (parent_data->perm) {
+	case PERM_INHERIT:
+	case PERM_ANDROID_PACKAGE_CACHE:
+		set_top(info, parent_info);
+		break;
+	case PERM_PRE_ROOT:
+		/* Legacy internal layout places users at top level */
+		info->data->perm = PERM_ROOT;
+		err = kstrtoul(name->name, 10, &user_num);
+		if (err)
+			info->data->userid = 0;
+		else
+			info->data->userid = user_num;
+		break;
+	case PERM_ROOT:
+		/* Assume masked off by default. */
+		if (qstr_case_eq(name, &q_Android)) {
+			/* App-specific directories inside; let anyone traverse */
+			info->data->perm = PERM_ANDROID;
+			info->data->under_android = true;
+		} else {
+			set_top(info, parent_info);
+		}
+		break;
+	case PERM_ANDROID:
+		if (qstr_case_eq(name, &q_data)) {
+			/* App-specific directories inside; let anyone traverse */
+			info->data->perm = PERM_ANDROID_DATA;
+		} else if (qstr_case_eq(name, &q_sandbox)) {
+			/* App-specific directories inside; let anyone traverse */
+			info->data->perm = PERM_ANDROID_DATA;
+		} else if (qstr_case_eq(name, &q_obb)) {
+			/* App-specific directories inside; let anyone traverse */
+			info->data->perm = PERM_ANDROID_OBB;
+			info->data->under_obb = true;
+			/* Single OBB directory is always shared */
+		} else if (qstr_case_eq(name, &q_media)) {
+			/* App-specific directories inside; let anyone traverse */
+			info->data->perm = PERM_ANDROID_MEDIA;
+		} else {
+			set_top(info, parent_info);
+		}
+		break;
+	case PERM_ANDROID_OBB:
+	case PERM_ANDROID_DATA:
+	case PERM_ANDROID_MEDIA:
+		info->data->perm = PERM_ANDROID_PACKAGE;
+		appid = get_appid(name->name);
+		if (appid != 0 && !is_excluded(name->name, parent_data->userid))
+			info->data->d_uid =
+				multiuser_get_uid(parent_data->userid, appid);
+		break;
+	case PERM_ANDROID_PACKAGE:
+		if (qstr_case_eq(name, &q_cache)) {
+			info->data->perm = PERM_ANDROID_PACKAGE_CACHE;
+			info->data->under_cache = true;
+		}
+		set_top(info, parent_info);
+		break;
+	}
+}
+
+void get_derived_permission(struct dentry *parent, struct dentry *dentry)
+{
+	get_derived_permission_new(parent, dentry, &dentry->d_name);
+}
+
+static appid_t get_type(const char *name)
+{
+	const char *ext = strrchr(name, '.');
+	appid_t id;
+
+	if (ext && ext[0]) {
+		ext = &ext[1];
+		id = get_ext_gid(ext);
+		return id?:AID_MEDIA_RW;
+	}
+	return AID_MEDIA_RW;
+}
+
+void fixup_lower_ownership(struct dentry *dentry, const char *name)
+{
+	struct path path;
+	struct inode *inode;
+	struct inode *delegated_inode = NULL;
+	int error;
+	struct sdcardfs_inode_info *info;
+	struct sdcardfs_inode_data *info_d;
+	struct sdcardfs_inode_data *info_top;
+	perm_t perm;
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
+	uid_t uid = sbi->options.fs_low_uid;
+	gid_t gid = sbi->options.fs_low_gid;
+	struct iattr newattrs;
+
+	if (!sbi->options.gid_derivation)
+		return;
+
+	info = SDCARDFS_I(d_inode(dentry));
+	info_d = info->data;
+	perm = info_d->perm;
+	if (info_d->under_obb) {
+		perm = PERM_ANDROID_OBB;
+	} else if (info_d->under_cache) {
+		perm = PERM_ANDROID_PACKAGE_CACHE;
+	} else if (perm == PERM_INHERIT) {
+		info_top = top_data_get(info);
+		perm = info_top->perm;
+		data_put(info_top);
+	}
+
+	switch (perm) {
+	case PERM_ROOT:
+	case PERM_ANDROID:
+	case PERM_ANDROID_DATA:
+	case PERM_ANDROID_MEDIA:
+	case PERM_ANDROID_PACKAGE:
+	case PERM_ANDROID_PACKAGE_CACHE:
+		uid = multiuser_get_uid(info_d->userid, uid);
+		break;
+	case PERM_ANDROID_OBB:
+		uid = AID_MEDIA_OBB;
+		break;
+	case PERM_PRE_ROOT:
+	default:
+		break;
+	}
+	switch (perm) {
+	case PERM_ROOT:
+	case PERM_ANDROID:
+	case PERM_ANDROID_DATA:
+	case PERM_ANDROID_MEDIA:
+		if (S_ISDIR(d_inode(dentry)->i_mode))
+			gid = multiuser_get_uid(info_d->userid, AID_MEDIA_RW);
+		else
+			gid = multiuser_get_uid(info_d->userid, get_type(name));
+		break;
+	case PERM_ANDROID_OBB:
+		gid = AID_MEDIA_OBB;
+		break;
+	case PERM_ANDROID_PACKAGE:
+		if (uid_is_app(info_d->d_uid))
+			gid = multiuser_get_ext_gid(info_d->d_uid);
+		else
+			gid = multiuser_get_uid(info_d->userid, AID_MEDIA_RW);
+		break;
+	case PERM_ANDROID_PACKAGE_CACHE:
+		if (uid_is_app(info_d->d_uid))
+			gid = multiuser_get_ext_cache_gid(info_d->d_uid);
+		else
+			gid = multiuser_get_uid(info_d->userid, AID_MEDIA_RW);
+		break;
+	case PERM_PRE_ROOT:
+	default:
+		break;
+	}
+
+	sdcardfs_get_lower_path(dentry, &path);
+	inode = d_inode(path.dentry);
+	if (d_inode(path.dentry)->i_gid.val != gid || d_inode(path.dentry)->i_uid.val != uid) {
+retry_deleg:
+		newattrs.ia_valid = ATTR_GID | ATTR_UID | ATTR_FORCE;
+		newattrs.ia_uid = make_kuid(current_user_ns(), uid);
+		newattrs.ia_gid = make_kgid(current_user_ns(), gid);
+		if (!S_ISDIR(inode->i_mode))
+			newattrs.ia_valid |=
+				ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
+		inode_lock(inode);
+		error = security_path_chown(&path, newattrs.ia_uid, newattrs.ia_gid);
+		if (!error)
+			error = notify_change2(path.mnt, path.dentry, &newattrs, &delegated_inode);
+		inode_unlock(inode);
+		if (delegated_inode) {
+			error = break_deleg_wait(&delegated_inode);
+			if (!error)
+				goto retry_deleg;
+		}
+		if (error)
+			pr_debug("sdcardfs: Failed to touch up lower fs gid/uid for %s\n", name);
+	}
+	sdcardfs_put_lower_path(dentry, &path);
+}
+
+static int descendant_may_need_fixup(struct sdcardfs_inode_data *data,
+		struct limit_search *limit)
+{
+	if (data->perm == PERM_ROOT)
+		return (limit->flags & BY_USERID) ?
+				data->userid == limit->userid : 1;
+	if (data->perm == PERM_PRE_ROOT || data->perm == PERM_ANDROID)
+		return 1;
+	return 0;
+}
+
+static int needs_fixup(perm_t perm)
+{
+	if (perm == PERM_ANDROID_DATA || perm == PERM_ANDROID_OBB
+			|| perm == PERM_ANDROID_MEDIA)
+		return 1;
+	return 0;
+}
+
+static void __fixup_perms_recursive(struct dentry *dentry, struct limit_search *limit, int depth)
+{
+	struct dentry *child;
+	struct sdcardfs_inode_info *info;
+
+	/*
+	 * All paths will terminate their recursion on hitting PERM_ANDROID_OBB,
+	 * PERM_ANDROID_MEDIA, or PERM_ANDROID_DATA. This happens at a depth of
+	 * at most 3.
+	 */
+	WARN(depth > 3, "%s: Max expected depth exceeded!\n", __func__);
+	spin_lock_nested(&dentry->d_lock, depth);
+	if (!d_inode(dentry)) {
+		spin_unlock(&dentry->d_lock);
+		return;
+	}
+	info = SDCARDFS_I(d_inode(dentry));
+
+	if (needs_fixup(info->data->perm)) {
+		list_for_each_entry(child, &dentry->d_subdirs, d_child) {
+			spin_lock_nested(&child->d_lock, depth + 1);
+			if (!(limit->flags & BY_NAME) || qstr_case_eq(&child->d_name, &limit->name)) {
+				if (d_inode(child)) {
+					get_derived_permission(dentry, child);
+					fixup_tmp_permissions(d_inode(child));
+					spin_unlock(&child->d_lock);
+					break;
+				}
+			}
+			spin_unlock(&child->d_lock);
+		}
+	} else if (descendant_may_need_fixup(info->data, limit)) {
+		list_for_each_entry(child, &dentry->d_subdirs, d_child) {
+			__fixup_perms_recursive(child, limit, depth + 1);
+		}
+	}
+	spin_unlock(&dentry->d_lock);
+}
+
+void fixup_perms_recursive(struct dentry *dentry, struct limit_search *limit)
+{
+	__fixup_perms_recursive(dentry, limit, 0);
+}
+
+/* main function for updating derived permission */
+inline void update_derived_permission_lock(struct dentry *dentry)
+{
+	struct dentry *parent;
+
+	if (!dentry || !d_inode(dentry)) {
+		pr_err("sdcardfs: %s: invalid dentry\n", __func__);
+		return;
+	}
+	/* FIXME:
+	 * 1. need to check whether the dentry is updated or not
+	 * 2. remove the root dentry update
+	 */
+	if (!IS_ROOT(dentry)) {
+		parent = dget_parent(dentry);
+		if (parent) {
+			get_derived_permission(parent, dentry);
+			dput(parent);
+		}
+	}
+	fixup_tmp_permissions(d_inode(dentry));
+}
+
+int need_graft_path(struct dentry *dentry)
+{
+	int ret = 0;
+	struct dentry *parent = dget_parent(dentry);
+	struct sdcardfs_inode_info *parent_info = SDCARDFS_I(d_inode(parent));
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
+	struct qstr obb = QSTR_LITERAL("obb");
+
+	if (!sbi->options.unshared_obb &&
+			parent_info->data->perm == PERM_ANDROID &&
+			qstr_case_eq(&dentry->d_name, &obb)) {
+
+		/* /Android/obb is the base obbpath of DERIVED_UNIFIED */
+		if (!(sbi->options.multiuser == false
+				&& parent_info->data->userid == 0)) {
+			ret = 1;
+		}
+	}
+	dput(parent);
+	return ret;
+}
+
+int is_obbpath_invalid(struct dentry *dent)
+{
+	int ret = 0;
+	struct sdcardfs_dentry_info *di = SDCARDFS_D(dent);
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dent->d_sb);
+	char *path_buf, *obbpath_s;
+	int need_put = 0;
+	struct path lower_path;
+
+	/* check the base obbpath has been changed.
+	 * this routine can check an uninitialized obb dentry as well.
+	 * regarding the uninitialized obb, refer to the sdcardfs_mkdir()
+	 */
+	spin_lock(&di->lock);
+	if (di->orig_path.dentry) {
+		if (!di->lower_path.dentry) {
+			ret = 1;
+		} else {
+			path_get(&di->lower_path);
+
+			path_buf = kmalloc(PATH_MAX, GFP_ATOMIC);
+			if (!path_buf) {
+				ret = 1;
+				pr_err("sdcardfs: fail to allocate path_buf in %s.\n", __func__);
+			} else {
+				obbpath_s = d_path(&di->lower_path, path_buf, PATH_MAX);
+				if (d_unhashed(di->lower_path.dentry) ||
+					!str_case_eq(sbi->obbpath_s, obbpath_s)) {
+					ret = 1;
+				}
+				kfree(path_buf);
+			}
+
+			pathcpy(&lower_path, &di->lower_path);
+			need_put = 1;
+		}
+	}
+	spin_unlock(&di->lock);
+	if (need_put)
+		path_put(&lower_path);
+	return ret;
+}
+
+int is_base_obbpath(struct dentry *dentry)
+{
+	int ret = 0;
+	struct dentry *parent = dget_parent(dentry);
+	struct sdcardfs_inode_info *parent_info = SDCARDFS_I(d_inode(parent));
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
+	struct qstr q_obb = QSTR_LITERAL("obb");
+
+	spin_lock(&SDCARDFS_D(dentry)->lock);
+	if (sbi->options.multiuser) {
+		if (parent_info->data->perm == PERM_PRE_ROOT &&
+				qstr_case_eq(&dentry->d_name, &q_obb)) {
+			ret = 1;
+		}
+	} else  if (parent_info->data->perm == PERM_ANDROID &&
+			qstr_case_eq(&dentry->d_name, &q_obb)) {
+		ret = 1;
+	}
+	spin_unlock(&SDCARDFS_D(dentry)->lock);
+	return ret;
+}
+
+/* The lower_path will be stored to the dentry's orig_path
+ * and the base obbpath will be copyed to the lower_path variable.
+ * if an error returned, there's no change in the lower_path
+ * returns: -ERRNO if error (0: no error)
+ */
+int setup_obb_dentry(struct dentry *dentry, struct path *lower_path)
+{
+	int err = 0;
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
+	struct path obbpath;
+
+	/* A local obb dentry must have its own orig_path to support rmdir
+	 * and mkdir of itself. Usually, we expect that the sbi->obbpath
+	 * is avaiable on this stage.
+	 */
+	sdcardfs_set_orig_path(dentry, lower_path);
+
+	err = kern_path(sbi->obbpath_s,
+			LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &obbpath);
+
+	if (!err) {
+		/* the obbpath base has been found */
+		pathcpy(lower_path, &obbpath);
+	} else {
+		/* if the sbi->obbpath is not available, we can optionally
+		 * setup the lower_path with its orig_path.
+		 * but, the current implementation just returns an error
+		 * because the sdcard daemon also regards this case as
+		 * a lookup fail.
+		 */
+		pr_info("sdcardfs: the sbi->obbpath is not available\n");
+	}
+	return err;
+}
+
+
diff --git a/fs/sdcardfs/file.c b/fs/sdcardfs/file.c
new file mode 100644
index 0000000..271c4c4
--- /dev/null
+++ b/fs/sdcardfs/file.c
@@ -0,0 +1,467 @@
+/*
+ * fs/sdcardfs/file.c
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#include "sdcardfs.h"
+#ifdef CONFIG_SDCARD_FS_FADV_NOACTIVE
+#include <linux/backing-dev.h>
+#endif
+
+static ssize_t sdcardfs_read(struct file *file, char __user *buf,
+			   size_t count, loff_t *ppos)
+{
+	int err;
+	struct file *lower_file;
+	struct dentry *dentry = file->f_path.dentry;
+#ifdef CONFIG_SDCARD_FS_FADV_NOACTIVE
+	struct backing_dev_info *bdi;
+#endif
+
+	lower_file = sdcardfs_lower_file(file);
+
+#ifdef CONFIG_SDCARD_FS_FADV_NOACTIVE
+	if (file->f_mode & FMODE_NOACTIVE) {
+		if (!(lower_file->f_mode & FMODE_NOACTIVE)) {
+			bdi = lower_file->f_mapping->backing_dev_info;
+			lower_file->f_ra.ra_pages = bdi->ra_pages * 2;
+			spin_lock(&lower_file->f_lock);
+			lower_file->f_mode |= FMODE_NOACTIVE;
+			spin_unlock(&lower_file->f_lock);
+		}
+	}
+#endif
+
+	err = vfs_read(lower_file, buf, count, ppos);
+	/* update our inode atime upon a successful lower read */
+	if (err >= 0)
+		fsstack_copy_attr_atime(d_inode(dentry),
+					file_inode(lower_file));
+
+	return err;
+}
+
+static ssize_t sdcardfs_write(struct file *file, const char __user *buf,
+			    size_t count, loff_t *ppos)
+{
+	int err;
+	struct file *lower_file;
+	struct dentry *dentry = file->f_path.dentry;
+	struct inode *inode = d_inode(dentry);
+
+	/* check disk space */
+	if (!check_min_free_space(dentry, count, 0)) {
+		pr_err("No minimum free space.\n");
+		return -ENOSPC;
+	}
+
+	lower_file = sdcardfs_lower_file(file);
+	err = vfs_write(lower_file, buf, count, ppos);
+	/* update our inode times+sizes upon a successful lower write */
+	if (err >= 0) {
+		if (sizeof(loff_t) > sizeof(long))
+			inode_lock(inode);
+		fsstack_copy_inode_size(inode, file_inode(lower_file));
+		fsstack_copy_attr_times(inode, file_inode(lower_file));
+		if (sizeof(loff_t) > sizeof(long))
+			inode_unlock(inode);
+	}
+
+	return err;
+}
+
+static int sdcardfs_readdir(struct file *file, struct dir_context *ctx)
+{
+	int err;
+	struct file *lower_file = NULL;
+	struct dentry *dentry = file->f_path.dentry;
+
+	lower_file = sdcardfs_lower_file(file);
+
+	lower_file->f_pos = file->f_pos;
+	err = iterate_dir(lower_file, ctx);
+	file->f_pos = lower_file->f_pos;
+	if (err >= 0)		/* copy the atime */
+		fsstack_copy_attr_atime(d_inode(dentry),
+					file_inode(lower_file));
+	return err;
+}
+
+static long sdcardfs_unlocked_ioctl(struct file *file, unsigned int cmd,
+				  unsigned long arg)
+{
+	long err = -ENOTTY;
+	struct file *lower_file;
+	const struct cred *saved_cred = NULL;
+	struct dentry *dentry = file->f_path.dentry;
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
+
+	lower_file = sdcardfs_lower_file(file);
+
+	/* XXX: use vfs_ioctl if/when VFS exports it */
+	if (!lower_file || !lower_file->f_op)
+		goto out;
+
+	/* save current_cred and override it */
+	saved_cred = override_fsids(sbi, SDCARDFS_I(file_inode(file))->data);
+	if (!saved_cred) {
+		err = -ENOMEM;
+		goto out;
+	}
+
+	if (lower_file->f_op->unlocked_ioctl)
+		err = lower_file->f_op->unlocked_ioctl(lower_file, cmd, arg);
+
+	/* some ioctls can change inode attributes (EXT2_IOC_SETFLAGS) */
+	if (!err)
+		sdcardfs_copy_and_fix_attrs(file_inode(file),
+				      file_inode(lower_file));
+	revert_fsids(saved_cred);
+out:
+	return err;
+}
+
+#ifdef CONFIG_COMPAT
+static long sdcardfs_compat_ioctl(struct file *file, unsigned int cmd,
+				unsigned long arg)
+{
+	long err = -ENOTTY;
+	struct file *lower_file;
+	const struct cred *saved_cred = NULL;
+	struct dentry *dentry = file->f_path.dentry;
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
+
+	lower_file = sdcardfs_lower_file(file);
+
+	/* XXX: use vfs_ioctl if/when VFS exports it */
+	if (!lower_file || !lower_file->f_op)
+		goto out;
+
+	/* save current_cred and override it */
+	saved_cred = override_fsids(sbi, SDCARDFS_I(file_inode(file))->data);
+	if (!saved_cred) {
+		err = -ENOMEM;
+		goto out;
+	}
+
+	if (lower_file->f_op->compat_ioctl)
+		err = lower_file->f_op->compat_ioctl(lower_file, cmd, arg);
+
+	revert_fsids(saved_cred);
+out:
+	return err;
+}
+#endif
+
+static int sdcardfs_mmap(struct file *file, struct vm_area_struct *vma)
+{
+	int err = 0;
+	bool willwrite;
+	struct file *lower_file;
+	const struct vm_operations_struct *saved_vm_ops = NULL;
+
+	/* this might be deferred to mmap's writepage */
+	willwrite = ((vma->vm_flags | VM_SHARED | VM_WRITE) == vma->vm_flags);
+
+	/*
+	 * File systems which do not implement ->writepage may use
+	 * generic_file_readonly_mmap as their ->mmap op.  If you call
+	 * generic_file_readonly_mmap with VM_WRITE, you'd get an -EINVAL.
+	 * But we cannot call the lower ->mmap op, so we can't tell that
+	 * writeable mappings won't work.  Therefore, our only choice is to
+	 * check if the lower file system supports the ->writepage, and if
+	 * not, return EINVAL (the same error that
+	 * generic_file_readonly_mmap returns in that case).
+	 */
+	lower_file = sdcardfs_lower_file(file);
+	if (willwrite && !lower_file->f_mapping->a_ops->writepage) {
+		err = -EINVAL;
+		pr_err("sdcardfs: lower file system does not support writeable mmap\n");
+		goto out;
+	}
+
+	/*
+	 * find and save lower vm_ops.
+	 *
+	 * XXX: the VFS should have a cleaner way of finding the lower vm_ops
+	 */
+	if (!SDCARDFS_F(file)->lower_vm_ops) {
+		err = lower_file->f_op->mmap(lower_file, vma);
+		if (err) {
+			pr_err("sdcardfs: lower mmap failed %d\n", err);
+			goto out;
+		}
+		saved_vm_ops = vma->vm_ops; /* save: came from lower ->mmap */
+	}
+
+	/*
+	 * Next 3 lines are all I need from generic_file_mmap.  I definitely
+	 * don't want its test for ->readpage which returns -ENOEXEC.
+	 */
+	file_accessed(file);
+	vma->vm_ops = &sdcardfs_vm_ops;
+
+	file->f_mapping->a_ops = &sdcardfs_aops; /* set our aops */
+	if (!SDCARDFS_F(file)->lower_vm_ops) /* save for our ->fault */
+		SDCARDFS_F(file)->lower_vm_ops = saved_vm_ops;
+	vma->vm_private_data = file;
+	get_file(lower_file);
+	vma->vm_file = lower_file;
+
+out:
+	return err;
+}
+
+static int sdcardfs_open(struct inode *inode, struct file *file)
+{
+	int err = 0;
+	struct file *lower_file = NULL;
+	struct path lower_path;
+	struct dentry *dentry = file->f_path.dentry;
+	struct dentry *parent = dget_parent(dentry);
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
+	const struct cred *saved_cred = NULL;
+
+	/* don't open unhashed/deleted files */
+	if (d_unhashed(dentry)) {
+		err = -ENOENT;
+		goto out_err;
+	}
+
+	if (!check_caller_access_to_name(d_inode(parent), &dentry->d_name)) {
+		err = -EACCES;
+		goto out_err;
+	}
+
+	/* save current_cred and override it */
+	saved_cred = override_fsids(sbi, SDCARDFS_I(inode)->data);
+	if (!saved_cred) {
+		err = -ENOMEM;
+		goto out_err;
+	}
+
+	file->private_data =
+		kzalloc(sizeof(struct sdcardfs_file_info), GFP_KERNEL);
+	if (!SDCARDFS_F(file)) {
+		err = -ENOMEM;
+		goto out_revert_cred;
+	}
+
+	/* open lower object and link sdcardfs's file struct to lower's */
+	sdcardfs_get_lower_path(file->f_path.dentry, &lower_path);
+	lower_file = dentry_open(&lower_path, file->f_flags, current_cred());
+	path_put(&lower_path);
+	if (IS_ERR(lower_file)) {
+		err = PTR_ERR(lower_file);
+		lower_file = sdcardfs_lower_file(file);
+		if (lower_file) {
+			sdcardfs_set_lower_file(file, NULL);
+			fput(lower_file); /* fput calls dput for lower_dentry */
+		}
+	} else {
+		sdcardfs_set_lower_file(file, lower_file);
+	}
+
+	if (err)
+		kfree(SDCARDFS_F(file));
+	else
+		sdcardfs_copy_and_fix_attrs(inode, sdcardfs_lower_inode(inode));
+
+out_revert_cred:
+	revert_fsids(saved_cred);
+out_err:
+	dput(parent);
+	return err;
+}
+
+static int sdcardfs_flush(struct file *file, fl_owner_t id)
+{
+	int err = 0;
+	struct file *lower_file = NULL;
+
+	lower_file = sdcardfs_lower_file(file);
+	if (lower_file && lower_file->f_op && lower_file->f_op->flush) {
+		filemap_write_and_wait(file->f_mapping);
+		err = lower_file->f_op->flush(lower_file, id);
+	}
+
+	return err;
+}
+
+/* release all lower object references & free the file info structure */
+static int sdcardfs_file_release(struct inode *inode, struct file *file)
+{
+	struct file *lower_file;
+
+	lower_file = sdcardfs_lower_file(file);
+	if (lower_file) {
+		sdcardfs_set_lower_file(file, NULL);
+		fput(lower_file);
+	}
+
+	kfree(SDCARDFS_F(file));
+	return 0;
+}
+
+static int sdcardfs_fsync(struct file *file, loff_t start, loff_t end,
+			int datasync)
+{
+	int err;
+	struct file *lower_file;
+	struct path lower_path;
+	struct dentry *dentry = file->f_path.dentry;
+
+	err = __generic_file_fsync(file, start, end, datasync);
+	if (err)
+		goto out;
+
+	lower_file = sdcardfs_lower_file(file);
+	sdcardfs_get_lower_path(dentry, &lower_path);
+	err = vfs_fsync_range(lower_file, start, end, datasync);
+	sdcardfs_put_lower_path(dentry, &lower_path);
+out:
+	return err;
+}
+
+static int sdcardfs_fasync(int fd, struct file *file, int flag)
+{
+	int err = 0;
+	struct file *lower_file = NULL;
+
+	lower_file = sdcardfs_lower_file(file);
+	if (lower_file->f_op && lower_file->f_op->fasync)
+		err = lower_file->f_op->fasync(fd, lower_file, flag);
+
+	return err;
+}
+
+/*
+ * Sdcardfs cannot use generic_file_llseek as ->llseek, because it would
+ * only set the offset of the upper file.  So we have to implement our
+ * own method to set both the upper and lower file offsets
+ * consistently.
+ */
+static loff_t sdcardfs_file_llseek(struct file *file, loff_t offset, int whence)
+{
+	int err;
+	struct file *lower_file;
+
+	err = generic_file_llseek(file, offset, whence);
+	if (err < 0)
+		goto out;
+
+	lower_file = sdcardfs_lower_file(file);
+	err = generic_file_llseek(lower_file, offset, whence);
+
+out:
+	return err;
+}
+
+/*
+ * Sdcardfs read_iter, redirect modified iocb to lower read_iter
+ */
+ssize_t sdcardfs_read_iter(struct kiocb *iocb, struct iov_iter *iter)
+{
+	int err;
+	struct file *file = iocb->ki_filp, *lower_file;
+
+	lower_file = sdcardfs_lower_file(file);
+	if (!lower_file->f_op->read_iter) {
+		err = -EINVAL;
+		goto out;
+	}
+
+	get_file(lower_file); /* prevent lower_file from being released */
+	iocb->ki_filp = lower_file;
+	err = lower_file->f_op->read_iter(iocb, iter);
+	iocb->ki_filp = file;
+	fput(lower_file);
+	/* update upper inode atime as needed */
+	if (err >= 0 || err == -EIOCBQUEUED)
+		fsstack_copy_attr_atime(file->f_path.dentry->d_inode,
+					file_inode(lower_file));
+out:
+	return err;
+}
+
+/*
+ * Sdcardfs write_iter, redirect modified iocb to lower write_iter
+ */
+ssize_t sdcardfs_write_iter(struct kiocb *iocb, struct iov_iter *iter)
+{
+	int err;
+	struct file *file = iocb->ki_filp, *lower_file;
+	struct inode *inode = file->f_path.dentry->d_inode;
+
+	lower_file = sdcardfs_lower_file(file);
+	if (!lower_file->f_op->write_iter) {
+		err = -EINVAL;
+		goto out;
+	}
+
+	get_file(lower_file); /* prevent lower_file from being released */
+	iocb->ki_filp = lower_file;
+	err = lower_file->f_op->write_iter(iocb, iter);
+	iocb->ki_filp = file;
+	fput(lower_file);
+	/* update upper inode times/sizes as needed */
+	if (err >= 0 || err == -EIOCBQUEUED) {
+		if (sizeof(loff_t) > sizeof(long))
+			inode_lock(inode);
+		fsstack_copy_inode_size(inode, file_inode(lower_file));
+		fsstack_copy_attr_times(inode, file_inode(lower_file));
+		if (sizeof(loff_t) > sizeof(long))
+			inode_unlock(inode);
+	}
+out:
+	return err;
+}
+
+const struct file_operations sdcardfs_main_fops = {
+	.llseek		= generic_file_llseek,
+	.read		= sdcardfs_read,
+	.write		= sdcardfs_write,
+	.unlocked_ioctl	= sdcardfs_unlocked_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl	= sdcardfs_compat_ioctl,
+#endif
+	.mmap		= sdcardfs_mmap,
+	.open		= sdcardfs_open,
+	.flush		= sdcardfs_flush,
+	.release	= sdcardfs_file_release,
+	.fsync		= sdcardfs_fsync,
+	.fasync		= sdcardfs_fasync,
+	.read_iter	= sdcardfs_read_iter,
+	.write_iter	= sdcardfs_write_iter,
+};
+
+/* trimmed directory options */
+const struct file_operations sdcardfs_dir_fops = {
+	.llseek		= sdcardfs_file_llseek,
+	.read		= generic_read_dir,
+	.iterate	= sdcardfs_readdir,
+	.unlocked_ioctl	= sdcardfs_unlocked_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl	= sdcardfs_compat_ioctl,
+#endif
+	.open		= sdcardfs_open,
+	.release	= sdcardfs_file_release,
+	.flush		= sdcardfs_flush,
+	.fsync		= sdcardfs_fsync,
+	.fasync		= sdcardfs_fasync,
+};
diff --git a/fs/sdcardfs/inode.c b/fs/sdcardfs/inode.c
new file mode 100644
index 0000000..4dd681e
--- /dev/null
+++ b/fs/sdcardfs/inode.c
@@ -0,0 +1,821 @@
+/*
+ * fs/sdcardfs/inode.c
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#include "sdcardfs.h"
+#include <linux/fs_struct.h>
+#include <linux/ratelimit.h>
+#include <linux/sched/task.h>
+
+const struct cred *override_fsids(struct sdcardfs_sb_info *sbi,
+		struct sdcardfs_inode_data *data)
+{
+	struct cred *cred;
+	const struct cred *old_cred;
+	uid_t uid;
+
+	cred = prepare_creds();
+	if (!cred)
+		return NULL;
+
+	if (sbi->options.gid_derivation) {
+		if (data->under_obb)
+			uid = AID_MEDIA_OBB;
+		else
+			uid = multiuser_get_uid(data->userid, sbi->options.fs_low_uid);
+	} else {
+		uid = sbi->options.fs_low_uid;
+	}
+	cred->fsuid = make_kuid(&init_user_ns, uid);
+	cred->fsgid = make_kgid(&init_user_ns, sbi->options.fs_low_gid);
+
+	old_cred = override_creds(cred);
+
+	return old_cred;
+}
+
+void revert_fsids(const struct cred *old_cred)
+{
+	const struct cred *cur_cred;
+
+	cur_cred = current->cred;
+	revert_creds(old_cred);
+	put_cred(cur_cred);
+}
+
+static int sdcardfs_create(struct inode *dir, struct dentry *dentry,
+			 umode_t mode, bool want_excl)
+{
+	int err;
+	struct dentry *lower_dentry;
+	struct vfsmount *lower_dentry_mnt;
+	struct dentry *lower_parent_dentry = NULL;
+	struct path lower_path;
+	const struct cred *saved_cred = NULL;
+	struct fs_struct *saved_fs;
+	struct fs_struct *copied_fs;
+
+	if (!check_caller_access_to_name(dir, &dentry->d_name)) {
+		err = -EACCES;
+		goto out_eacces;
+	}
+
+	/* save current_cred and override it */
+	saved_cred = override_fsids(SDCARDFS_SB(dir->i_sb),
+					SDCARDFS_I(dir)->data);
+	if (!saved_cred)
+		return -ENOMEM;
+
+	sdcardfs_get_lower_path(dentry, &lower_path);
+	lower_dentry = lower_path.dentry;
+	lower_dentry_mnt = lower_path.mnt;
+	lower_parent_dentry = lock_parent(lower_dentry);
+
+	/* set last 16bytes of mode field to 0664 */
+	mode = (mode & S_IFMT) | 00664;
+
+	/* temporarily change umask for lower fs write */
+	saved_fs = current->fs;
+	copied_fs = copy_fs_struct(current->fs);
+	if (!copied_fs) {
+		err = -ENOMEM;
+		goto out_unlock;
+	}
+	copied_fs->umask = 0;
+	task_lock(current);
+	current->fs = copied_fs;
+	task_unlock(current);
+
+	err = vfs_create2(lower_dentry_mnt, d_inode(lower_parent_dentry), lower_dentry, mode, want_excl);
+	if (err)
+		goto out;
+
+	err = sdcardfs_interpose(dentry, dir->i_sb, &lower_path,
+			SDCARDFS_I(dir)->data->userid);
+	if (err)
+		goto out;
+	fsstack_copy_attr_times(dir, sdcardfs_lower_inode(dir));
+	fsstack_copy_inode_size(dir, d_inode(lower_parent_dentry));
+	fixup_lower_ownership(dentry, dentry->d_name.name);
+
+out:
+	task_lock(current);
+	current->fs = saved_fs;
+	task_unlock(current);
+	free_fs_struct(copied_fs);
+out_unlock:
+	unlock_dir(lower_parent_dentry);
+	sdcardfs_put_lower_path(dentry, &lower_path);
+	revert_fsids(saved_cred);
+out_eacces:
+	return err;
+}
+
+static int sdcardfs_unlink(struct inode *dir, struct dentry *dentry)
+{
+	int err;
+	struct dentry *lower_dentry;
+	struct vfsmount *lower_mnt;
+	struct inode *lower_dir_inode = sdcardfs_lower_inode(dir);
+	struct dentry *lower_dir_dentry;
+	struct path lower_path;
+	const struct cred *saved_cred = NULL;
+
+	if (!check_caller_access_to_name(dir, &dentry->d_name)) {
+		err = -EACCES;
+		goto out_eacces;
+	}
+
+	/* save current_cred and override it */
+	saved_cred = override_fsids(SDCARDFS_SB(dir->i_sb),
+						SDCARDFS_I(dir)->data);
+	if (!saved_cred)
+		return -ENOMEM;
+
+	sdcardfs_get_lower_path(dentry, &lower_path);
+	lower_dentry = lower_path.dentry;
+	lower_mnt = lower_path.mnt;
+	dget(lower_dentry);
+	lower_dir_dentry = lock_parent(lower_dentry);
+
+	err = vfs_unlink2(lower_mnt, lower_dir_inode, lower_dentry, NULL);
+
+	/*
+	 * Note: unlinking on top of NFS can cause silly-renamed files.
+	 * Trying to delete such files results in EBUSY from NFS
+	 * below.  Silly-renamed files will get deleted by NFS later on, so
+	 * we just need to detect them here and treat such EBUSY errors as
+	 * if the upper file was successfully deleted.
+	 */
+	if (err == -EBUSY && lower_dentry->d_flags & DCACHE_NFSFS_RENAMED)
+		err = 0;
+	if (err)
+		goto out;
+	fsstack_copy_attr_times(dir, lower_dir_inode);
+	fsstack_copy_inode_size(dir, lower_dir_inode);
+	set_nlink(d_inode(dentry),
+		  sdcardfs_lower_inode(d_inode(dentry))->i_nlink);
+	d_inode(dentry)->i_ctime = dir->i_ctime;
+	d_drop(dentry); /* this is needed, else LTP fails (VFS won't do it) */
+out:
+	unlock_dir(lower_dir_dentry);
+	dput(lower_dentry);
+	sdcardfs_put_lower_path(dentry, &lower_path);
+	revert_fsids(saved_cred);
+out_eacces:
+	return err;
+}
+
+static int touch(char *abs_path, mode_t mode)
+{
+	struct file *filp = filp_open(abs_path, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, mode);
+
+	if (IS_ERR(filp)) {
+		if (PTR_ERR(filp) == -EEXIST) {
+			return 0;
+		} else {
+			pr_err("sdcardfs: failed to open(%s): %ld\n",
+						abs_path, PTR_ERR(filp));
+			return PTR_ERR(filp);
+		}
+	}
+	filp_close(filp, current->files);
+	return 0;
+}
+
+static int sdcardfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
+{
+	int err;
+	int make_nomedia_in_obb = 0;
+	struct dentry *lower_dentry;
+	struct vfsmount *lower_mnt;
+	struct dentry *lower_parent_dentry = NULL;
+	struct dentry *parent_dentry = NULL;
+	struct path lower_path;
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
+	const struct cred *saved_cred = NULL;
+	struct sdcardfs_inode_data *pd = SDCARDFS_I(dir)->data;
+	int touch_err = 0;
+	struct fs_struct *saved_fs;
+	struct fs_struct *copied_fs;
+	struct qstr q_obb = QSTR_LITERAL("obb");
+	struct qstr q_data = QSTR_LITERAL("data");
+
+	if (!check_caller_access_to_name(dir, &dentry->d_name)) {
+		err = -EACCES;
+		goto out_eacces;
+	}
+
+	/* save current_cred and override it */
+	saved_cred = override_fsids(SDCARDFS_SB(dir->i_sb),
+						SDCARDFS_I(dir)->data);
+	if (!saved_cred)
+		return -ENOMEM;
+
+	/* check disk space */
+	parent_dentry = dget_parent(dentry);
+	if (!check_min_free_space(parent_dentry, 0, 1)) {
+		pr_err("sdcardfs: No minimum free space.\n");
+		err = -ENOSPC;
+		dput(parent_dentry);
+		goto out_revert;
+	}
+	dput(parent_dentry);
+
+	/* the lower_dentry is negative here */
+	sdcardfs_get_lower_path(dentry, &lower_path);
+	lower_dentry = lower_path.dentry;
+	lower_mnt = lower_path.mnt;
+	lower_parent_dentry = lock_parent(lower_dentry);
+
+	/* set last 16bytes of mode field to 0775 */
+	mode = (mode & S_IFMT) | 00775;
+
+	/* temporarily change umask for lower fs write */
+	saved_fs = current->fs;
+	copied_fs = copy_fs_struct(current->fs);
+	if (!copied_fs) {
+		err = -ENOMEM;
+		unlock_dir(lower_parent_dentry);
+		goto out_unlock;
+	}
+	copied_fs->umask = 0;
+	task_lock(current);
+	current->fs = copied_fs;
+	task_unlock(current);
+
+	err = vfs_mkdir2(lower_mnt, d_inode(lower_parent_dentry), lower_dentry, mode);
+
+	if (err) {
+		unlock_dir(lower_parent_dentry);
+		goto out;
+	}
+
+	/* if it is a local obb dentry, setup it with the base obbpath */
+	if (need_graft_path(dentry)) {
+
+		err = setup_obb_dentry(dentry, &lower_path);
+		if (err) {
+			/* if the sbi->obbpath is not available, the lower_path won't be
+			 * changed by setup_obb_dentry() but the lower path is saved to
+			 * its orig_path. this dentry will be revalidated later.
+			 * but now, the lower_path should be NULL
+			 */
+			sdcardfs_put_reset_lower_path(dentry);
+
+			/* the newly created lower path which saved to its orig_path or
+			 * the lower_path is the base obbpath.
+			 * therefore, an additional path_get is required
+			 */
+			path_get(&lower_path);
+		} else
+			make_nomedia_in_obb = 1;
+	}
+
+	err = sdcardfs_interpose(dentry, dir->i_sb, &lower_path, pd->userid);
+	if (err) {
+		unlock_dir(lower_parent_dentry);
+		goto out;
+	}
+
+	fsstack_copy_attr_times(dir, sdcardfs_lower_inode(dir));
+	fsstack_copy_inode_size(dir, d_inode(lower_parent_dentry));
+	/* update number of links on parent directory */
+	set_nlink(dir, sdcardfs_lower_inode(dir)->i_nlink);
+	fixup_lower_ownership(dentry, dentry->d_name.name);
+	unlock_dir(lower_parent_dentry);
+	if ((!sbi->options.multiuser) && (qstr_case_eq(&dentry->d_name, &q_obb))
+		&& (pd->perm == PERM_ANDROID) && (pd->userid == 0))
+		make_nomedia_in_obb = 1;
+
+	/* When creating /Android/data and /Android/obb, mark them as .nomedia */
+	if (make_nomedia_in_obb ||
+		((pd->perm == PERM_ANDROID)
+				&& (qstr_case_eq(&dentry->d_name, &q_data)))) {
+		revert_fsids(saved_cred);
+		saved_cred = override_fsids(sbi,
+					SDCARDFS_I(d_inode(dentry))->data);
+		if (!saved_cred) {
+			pr_err("sdcardfs: failed to set up .nomedia in %s: %d\n",
+						lower_path.dentry->d_name.name,
+						-ENOMEM);
+			goto out;
+		}
+		set_fs_pwd(current->fs, &lower_path);
+		touch_err = touch(".nomedia", 0664);
+		if (touch_err) {
+			pr_err("sdcardfs: failed to create .nomedia in %s: %d\n",
+						lower_path.dentry->d_name.name,
+						touch_err);
+			goto out;
+		}
+	}
+out:
+	task_lock(current);
+	current->fs = saved_fs;
+	task_unlock(current);
+
+	free_fs_struct(copied_fs);
+out_unlock:
+	sdcardfs_put_lower_path(dentry, &lower_path);
+out_revert:
+	revert_fsids(saved_cred);
+out_eacces:
+	return err;
+}
+
+static int sdcardfs_rmdir(struct inode *dir, struct dentry *dentry)
+{
+	struct dentry *lower_dentry;
+	struct dentry *lower_dir_dentry;
+	struct vfsmount *lower_mnt;
+	int err;
+	struct path lower_path;
+	const struct cred *saved_cred = NULL;
+
+	if (!check_caller_access_to_name(dir, &dentry->d_name)) {
+		err = -EACCES;
+		goto out_eacces;
+	}
+
+	/* save current_cred and override it */
+	saved_cred = override_fsids(SDCARDFS_SB(dir->i_sb),
+						SDCARDFS_I(dir)->data);
+	if (!saved_cred)
+		return -ENOMEM;
+
+	/* sdcardfs_get_real_lower(): in case of remove an user's obb dentry
+	 * the dentry on the original path should be deleted.
+	 */
+	sdcardfs_get_real_lower(dentry, &lower_path);
+
+	lower_dentry = lower_path.dentry;
+	lower_mnt = lower_path.mnt;
+	lower_dir_dentry = lock_parent(lower_dentry);
+
+	err = vfs_rmdir2(lower_mnt, d_inode(lower_dir_dentry), lower_dentry);
+	if (err)
+		goto out;
+
+	d_drop(dentry);	/* drop our dentry on success (why not VFS's job?) */
+	if (d_inode(dentry))
+		clear_nlink(d_inode(dentry));
+	fsstack_copy_attr_times(dir, d_inode(lower_dir_dentry));
+	fsstack_copy_inode_size(dir, d_inode(lower_dir_dentry));
+	set_nlink(dir, d_inode(lower_dir_dentry)->i_nlink);
+
+out:
+	unlock_dir(lower_dir_dentry);
+	sdcardfs_put_real_lower(dentry, &lower_path);
+	revert_fsids(saved_cred);
+out_eacces:
+	return err;
+}
+
+/*
+ * The locking rules in sdcardfs_rename are complex.  We could use a simpler
+ * superblock-level name-space lock for renames and copy-ups.
+ */
+static int sdcardfs_rename(struct inode *old_dir, struct dentry *old_dentry,
+			 struct inode *new_dir, struct dentry *new_dentry,
+			 unsigned int flags)
+{
+	int err = 0;
+	struct dentry *lower_old_dentry = NULL;
+	struct dentry *lower_new_dentry = NULL;
+	struct dentry *lower_old_dir_dentry = NULL;
+	struct dentry *lower_new_dir_dentry = NULL;
+	struct vfsmount *lower_mnt = NULL;
+	struct dentry *trap = NULL;
+	struct path lower_old_path, lower_new_path;
+	const struct cred *saved_cred = NULL;
+
+	if (flags)
+		return -EINVAL;
+
+	if (!check_caller_access_to_name(old_dir, &old_dentry->d_name) ||
+		!check_caller_access_to_name(new_dir, &new_dentry->d_name)) {
+		err = -EACCES;
+		goto out_eacces;
+	}
+
+	/* save current_cred and override it */
+	saved_cred = override_fsids(SDCARDFS_SB(old_dir->i_sb),
+						SDCARDFS_I(new_dir)->data);
+	if (!saved_cred)
+		return -ENOMEM;
+
+	sdcardfs_get_real_lower(old_dentry, &lower_old_path);
+	sdcardfs_get_lower_path(new_dentry, &lower_new_path);
+	lower_old_dentry = lower_old_path.dentry;
+	lower_new_dentry = lower_new_path.dentry;
+	lower_mnt = lower_old_path.mnt;
+	lower_old_dir_dentry = dget_parent(lower_old_dentry);
+	lower_new_dir_dentry = dget_parent(lower_new_dentry);
+
+	trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
+	/* source should not be ancestor of target */
+	if (trap == lower_old_dentry) {
+		err = -EINVAL;
+		goto out;
+	}
+	/* target should not be ancestor of source */
+	if (trap == lower_new_dentry) {
+		err = -ENOTEMPTY;
+		goto out;
+	}
+
+	err = vfs_rename2(lower_mnt,
+			 d_inode(lower_old_dir_dentry), lower_old_dentry,
+			 d_inode(lower_new_dir_dentry), lower_new_dentry,
+			 NULL, 0);
+	if (err)
+		goto out;
+
+	/* Copy attrs from lower dir, but i_uid/i_gid */
+	sdcardfs_copy_and_fix_attrs(new_dir, d_inode(lower_new_dir_dentry));
+	fsstack_copy_inode_size(new_dir, d_inode(lower_new_dir_dentry));
+
+	if (new_dir != old_dir) {
+		sdcardfs_copy_and_fix_attrs(old_dir, d_inode(lower_old_dir_dentry));
+		fsstack_copy_inode_size(old_dir, d_inode(lower_old_dir_dentry));
+	}
+	get_derived_permission_new(new_dentry->d_parent, old_dentry, &new_dentry->d_name);
+	fixup_tmp_permissions(d_inode(old_dentry));
+	fixup_lower_ownership(old_dentry, new_dentry->d_name.name);
+	d_invalidate(old_dentry); /* Can't fixup ownership recursively :( */
+out:
+	unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
+	dput(lower_old_dir_dentry);
+	dput(lower_new_dir_dentry);
+	sdcardfs_put_real_lower(old_dentry, &lower_old_path);
+	sdcardfs_put_lower_path(new_dentry, &lower_new_path);
+	revert_fsids(saved_cred);
+out_eacces:
+	return err;
+}
+
+#if 0
+static int sdcardfs_readlink(struct dentry *dentry, char __user *buf, int bufsiz)
+{
+	int err;
+	struct dentry *lower_dentry;
+	struct path lower_path;
+	/* XXX readlink does not requires overriding credential */
+
+	sdcardfs_get_lower_path(dentry, &lower_path);
+	lower_dentry = lower_path.dentry;
+	if (!d_inode(lower_dentry)->i_op ||
+	    !d_inode(lower_dentry)->i_op->readlink) {
+		err = -EINVAL;
+		goto out;
+	}
+
+	err = d_inode(lower_dentry)->i_op->readlink(lower_dentry,
+						    buf, bufsiz);
+	if (err < 0)
+		goto out;
+	fsstack_copy_attr_atime(d_inode(dentry), d_inode(lower_dentry));
+
+out:
+	sdcardfs_put_lower_path(dentry, &lower_path);
+	return err;
+}
+#endif
+
+#if 0
+static const char *sdcardfs_follow_link(struct dentry *dentry, void **cookie)
+{
+	char *buf;
+	int len = PAGE_SIZE, err;
+	mm_segment_t old_fs;
+
+	/* This is freed by the put_link method assuming a successful call. */
+	buf = kmalloc(len, GFP_KERNEL);
+	if (!buf) {
+		buf = ERR_PTR(-ENOMEM);
+		return buf;
+	}
+
+	/* read the symlink, and then we will follow it */
+	old_fs = get_fs();
+	set_fs(KERNEL_DS);
+	err = sdcardfs_readlink(dentry, buf, len);
+	set_fs(old_fs);
+	if (err < 0) {
+		kfree(buf);
+		buf = ERR_PTR(err);
+	} else {
+		buf[err] = '\0';
+	}
+	return *cookie = buf;
+}
+#endif
+
+static int sdcardfs_permission_wrn(struct inode *inode, int mask)
+{
+	WARN_RATELIMIT(1, "sdcardfs does not support permission. Use permission2.\n");
+	return -EINVAL;
+}
+
+void copy_attrs(struct inode *dest, const struct inode *src)
+{
+	dest->i_mode = src->i_mode;
+	dest->i_uid = src->i_uid;
+	dest->i_gid = src->i_gid;
+	dest->i_rdev = src->i_rdev;
+	dest->i_atime = src->i_atime;
+	dest->i_mtime = src->i_mtime;
+	dest->i_ctime = src->i_ctime;
+	dest->i_blkbits = src->i_blkbits;
+	dest->i_flags = src->i_flags;
+#ifdef CONFIG_FS_POSIX_ACL
+	dest->i_acl = src->i_acl;
+#endif
+#ifdef CONFIG_SECURITY
+	dest->i_security = src->i_security;
+#endif
+}
+
+static int sdcardfs_permission(struct vfsmount *mnt, struct inode *inode, int mask)
+{
+	int err;
+	struct inode tmp;
+	struct sdcardfs_inode_data *top = top_data_get(SDCARDFS_I(inode));
+
+	if (IS_ERR(mnt))
+		return PTR_ERR(mnt);
+
+	if (!top)
+		return -EINVAL;
+
+	/*
+	 * Permission check on sdcardfs inode.
+	 * Calling process should have AID_SDCARD_RW permission
+	 * Since generic_permission only needs i_mode, i_uid,
+	 * i_gid, and i_sb, we can create a fake inode to pass
+	 * this information down in.
+	 *
+	 * The underlying code may attempt to take locks in some
+	 * cases for features we're not using, but if that changes,
+	 * locks must be dealt with to avoid undefined behavior.
+	 */
+	copy_attrs(&tmp, inode);
+	tmp.i_uid = make_kuid(&init_user_ns, top->d_uid);
+	tmp.i_gid = make_kgid(&init_user_ns, get_gid(mnt, inode->i_sb, top));
+	tmp.i_mode = (inode->i_mode & S_IFMT)
+			| get_mode(mnt, SDCARDFS_I(inode), top);
+	data_put(top);
+	tmp.i_sb = inode->i_sb;
+	if (IS_POSIXACL(inode))
+		pr_warn("%s: This may be undefined behavior...\n", __func__);
+	err = generic_permission(&tmp, mask);
+	return err;
+}
+
+static int sdcardfs_setattr_wrn(struct dentry *dentry, struct iattr *ia)
+{
+	WARN_RATELIMIT(1, "sdcardfs does not support setattr. User setattr2.\n");
+	return -EINVAL;
+}
+
+static int sdcardfs_setattr(struct vfsmount *mnt, struct dentry *dentry, struct iattr *ia)
+{
+	int err;
+	struct dentry *lower_dentry;
+	struct vfsmount *lower_mnt;
+	struct inode *inode;
+	struct inode *lower_inode;
+	struct path lower_path;
+	struct iattr lower_ia;
+	struct dentry *parent;
+	struct inode tmp;
+	struct dentry tmp_d;
+	struct sdcardfs_inode_data *top;
+
+	const struct cred *saved_cred = NULL;
+
+	inode = d_inode(dentry);
+	top = top_data_get(SDCARDFS_I(inode));
+
+	if (!top)
+		return -EINVAL;
+
+	/*
+	 * Permission check on sdcardfs inode.
+	 * Calling process should have AID_SDCARD_RW permission
+	 * Since generic_permission only needs i_mode, i_uid,
+	 * i_gid, and i_sb, we can create a fake inode to pass
+	 * this information down in.
+	 *
+	 * The underlying code may attempt to take locks in some
+	 * cases for features we're not using, but if that changes,
+	 * locks must be dealt with to avoid undefined behavior.
+	 *
+	 */
+	copy_attrs(&tmp, inode);
+	tmp.i_uid = make_kuid(&init_user_ns, top->d_uid);
+	tmp.i_gid = make_kgid(&init_user_ns, get_gid(mnt, dentry->d_sb, top));
+	tmp.i_mode = (inode->i_mode & S_IFMT)
+			| get_mode(mnt, SDCARDFS_I(inode), top);
+	tmp.i_size = i_size_read(inode);
+	data_put(top);
+	tmp.i_sb = inode->i_sb;
+	tmp_d.d_inode = &tmp;
+
+	/*
+	 * Check if user has permission to change dentry.  We don't check if
+	 * this user can change the lower inode: that should happen when
+	 * calling notify_change on the lower inode.
+	 */
+	/* prepare our own lower struct iattr (with the lower file) */
+	memcpy(&lower_ia, ia, sizeof(lower_ia));
+	/* Allow touch updating timestamps. A previous permission check ensures
+	 * we have write access. Changes to mode, owner, and group are ignored
+	 */
+	ia->ia_valid |= ATTR_FORCE;
+	err = setattr_prepare(&tmp_d, ia);
+
+	if (!err) {
+		/* check the Android group ID */
+		parent = dget_parent(dentry);
+		if (!check_caller_access_to_name(d_inode(parent), &dentry->d_name))
+			err = -EACCES;
+		dput(parent);
+	}
+
+	if (err)
+		goto out_err;
+
+	/* save current_cred and override it */
+	saved_cred = override_fsids(SDCARDFS_SB(dentry->d_sb),
+						SDCARDFS_I(inode)->data);
+	if (!saved_cred)
+		return -ENOMEM;
+
+	sdcardfs_get_lower_path(dentry, &lower_path);
+	lower_dentry = lower_path.dentry;
+	lower_mnt = lower_path.mnt;
+	lower_inode = sdcardfs_lower_inode(inode);
+
+	if (ia->ia_valid & ATTR_FILE)
+		lower_ia.ia_file = sdcardfs_lower_file(ia->ia_file);
+
+	lower_ia.ia_valid &= ~(ATTR_UID | ATTR_GID | ATTR_MODE);
+
+	/*
+	 * If shrinking, first truncate upper level to cancel writing dirty
+	 * pages beyond the new eof; and also if its' maxbytes is more
+	 * limiting (fail with -EFBIG before making any change to the lower
+	 * level).  There is no need to vmtruncate the upper level
+	 * afterwards in the other cases: we fsstack_copy_inode_size from
+	 * the lower level.
+	 */
+	if (ia->ia_valid & ATTR_SIZE) {
+		err = inode_newsize_ok(&tmp, ia->ia_size);
+		if (err) {
+			goto out;
+		}
+		truncate_setsize(inode, ia->ia_size);
+	}
+
+	/*
+	 * mode change is for clearing setuid/setgid bits. Allow lower fs
+	 * to interpret this in its own way.
+	 */
+	if (lower_ia.ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID))
+		lower_ia.ia_valid &= ~ATTR_MODE;
+
+	/* notify the (possibly copied-up) lower inode */
+	/*
+	 * Note: we use d_inode(lower_dentry), because lower_inode may be
+	 * unlinked (no inode->i_sb and i_ino==0.  This happens if someone
+	 * tries to open(), unlink(), then ftruncate() a file.
+	 */
+	inode_lock(d_inode(lower_dentry));
+	err = notify_change2(lower_mnt, lower_dentry, &lower_ia, /* note: lower_ia */
+			NULL);
+	inode_unlock(d_inode(lower_dentry));
+	if (err)
+		goto out;
+
+	/* get attributes from the lower inode and update derived permissions */
+	sdcardfs_copy_and_fix_attrs(inode, lower_inode);
+
+	/*
+	 * Not running fsstack_copy_inode_size(inode, lower_inode), because
+	 * VFS should update our inode size, and notify_change on
+	 * lower_inode should update its size.
+	 */
+
+out:
+	sdcardfs_put_lower_path(dentry, &lower_path);
+	revert_fsids(saved_cred);
+out_err:
+	return err;
+}
+
+static int sdcardfs_fillattr(struct vfsmount *mnt, struct inode *inode,
+				struct kstat *lower_stat, struct kstat *stat)
+{
+	struct sdcardfs_inode_info *info = SDCARDFS_I(inode);
+	struct sdcardfs_inode_data *top = top_data_get(info);
+	struct super_block *sb = inode->i_sb;
+
+	if (!top)
+		return -EINVAL;
+
+	stat->dev = inode->i_sb->s_dev;
+	stat->ino = inode->i_ino;
+	stat->mode = (inode->i_mode  & S_IFMT) | get_mode(mnt, info, top);
+	stat->nlink = inode->i_nlink;
+	stat->uid = make_kuid(&init_user_ns, top->d_uid);
+	stat->gid = make_kgid(&init_user_ns, get_gid(mnt, sb, top));
+	stat->rdev = inode->i_rdev;
+	stat->size = lower_stat->size;
+	stat->atime = lower_stat->atime;
+	stat->mtime = lower_stat->mtime;
+	stat->ctime = lower_stat->ctime;
+	stat->blksize = lower_stat->blksize;
+	stat->blocks = lower_stat->blocks;
+	data_put(top);
+	return 0;
+}
+static int sdcardfs_getattr(const struct path *path, struct kstat *stat,
+				u32 request_mask, unsigned int flags)
+{
+	struct vfsmount *mnt = path->mnt;
+	struct dentry *dentry = path->dentry;
+	struct kstat lower_stat;
+	struct path lower_path;
+	struct dentry *parent;
+	int err;
+
+	parent = dget_parent(dentry);
+	if (!check_caller_access_to_name(d_inode(parent), &dentry->d_name)) {
+		dput(parent);
+		return -EACCES;
+	}
+	dput(parent);
+
+	sdcardfs_get_lower_path(dentry, &lower_path);
+	err = vfs_getattr(&lower_path, &lower_stat, request_mask, flags);
+	if (err)
+		goto out;
+	sdcardfs_copy_and_fix_attrs(d_inode(dentry),
+			      d_inode(lower_path.dentry));
+	err = sdcardfs_fillattr(mnt, d_inode(dentry), &lower_stat, stat);
+out:
+	sdcardfs_put_lower_path(dentry, &lower_path);
+	return err;
+}
+
+const struct inode_operations sdcardfs_symlink_iops = {
+	.permission2	= sdcardfs_permission,
+	.setattr2	= sdcardfs_setattr,
+	/* XXX Following operations are implemented,
+	 *     but FUSE(sdcard) or FAT does not support them
+	 *     These methods are *NOT* perfectly tested.
+	.readlink	= sdcardfs_readlink,
+	.follow_link	= sdcardfs_follow_link,
+	.put_link	= kfree_put_link,
+	 */
+};
+
+const struct inode_operations sdcardfs_dir_iops = {
+	.create		= sdcardfs_create,
+	.lookup		= sdcardfs_lookup,
+	.permission	= sdcardfs_permission_wrn,
+	.permission2	= sdcardfs_permission,
+	.unlink		= sdcardfs_unlink,
+	.mkdir		= sdcardfs_mkdir,
+	.rmdir		= sdcardfs_rmdir,
+	.rename		= sdcardfs_rename,
+	.setattr	= sdcardfs_setattr_wrn,
+	.setattr2	= sdcardfs_setattr,
+	.getattr	= sdcardfs_getattr,
+};
+
+const struct inode_operations sdcardfs_main_iops = {
+	.permission	= sdcardfs_permission_wrn,
+	.permission2	= sdcardfs_permission,
+	.setattr	= sdcardfs_setattr_wrn,
+	.setattr2	= sdcardfs_setattr,
+	.getattr	= sdcardfs_getattr,
+};
diff --git a/fs/sdcardfs/lookup.c b/fs/sdcardfs/lookup.c
new file mode 100644
index 0000000..a5c9686
--- /dev/null
+++ b/fs/sdcardfs/lookup.c
@@ -0,0 +1,470 @@
+/*
+ * fs/sdcardfs/lookup.c
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#include "sdcardfs.h"
+#include "linux/delay.h"
+
+/* The dentry cache is just so we have properly sized dentries */
+static struct kmem_cache *sdcardfs_dentry_cachep;
+
+int sdcardfs_init_dentry_cache(void)
+{
+	sdcardfs_dentry_cachep =
+		kmem_cache_create("sdcardfs_dentry",
+				  sizeof(struct sdcardfs_dentry_info),
+				  0, SLAB_RECLAIM_ACCOUNT, NULL);
+
+	return sdcardfs_dentry_cachep ? 0 : -ENOMEM;
+}
+
+void sdcardfs_destroy_dentry_cache(void)
+{
+	kmem_cache_destroy(sdcardfs_dentry_cachep);
+}
+
+void free_dentry_private_data(struct dentry *dentry)
+{
+	kmem_cache_free(sdcardfs_dentry_cachep, dentry->d_fsdata);
+	dentry->d_fsdata = NULL;
+}
+
+/* allocate new dentry private data */
+int new_dentry_private_data(struct dentry *dentry)
+{
+	struct sdcardfs_dentry_info *info = SDCARDFS_D(dentry);
+
+	/* use zalloc to init dentry_info.lower_path */
+	info = kmem_cache_zalloc(sdcardfs_dentry_cachep, GFP_ATOMIC);
+	if (!info)
+		return -ENOMEM;
+
+	spin_lock_init(&info->lock);
+	dentry->d_fsdata = info;
+
+	return 0;
+}
+
+struct inode_data {
+	struct inode *lower_inode;
+	userid_t id;
+};
+
+static int sdcardfs_inode_test(struct inode *inode, void *candidate_data/*void *candidate_lower_inode*/)
+{
+	struct inode *current_lower_inode = sdcardfs_lower_inode(inode);
+	userid_t current_userid = SDCARDFS_I(inode)->data->userid;
+
+	if (current_lower_inode == ((struct inode_data *)candidate_data)->lower_inode &&
+			current_userid == ((struct inode_data *)candidate_data)->id)
+		return 1; /* found a match */
+	else
+		return 0; /* no match */
+}
+
+static int sdcardfs_inode_set(struct inode *inode, void *lower_inode)
+{
+	/* we do actual inode initialization in sdcardfs_iget */
+	return 0;
+}
+
+struct inode *sdcardfs_iget(struct super_block *sb, struct inode *lower_inode, userid_t id)
+{
+	struct sdcardfs_inode_info *info;
+	struct inode_data data;
+	struct inode *inode; /* the new inode to return */
+
+	if (!igrab(lower_inode))
+		return ERR_PTR(-ESTALE);
+
+	data.id = id;
+	data.lower_inode = lower_inode;
+	inode = iget5_locked(sb, /* our superblock */
+			     /*
+			      * hashval: we use inode number, but we can
+			      * also use "(unsigned long)lower_inode"
+			      * instead.
+			      */
+			     lower_inode->i_ino, /* hashval */
+			     sdcardfs_inode_test, /* inode comparison function */
+			     sdcardfs_inode_set, /* inode init function */
+			     &data); /* data passed to test+set fxns */
+	if (!inode) {
+		iput(lower_inode);
+		return ERR_PTR(-ENOMEM);
+	}
+	/* if found a cached inode, then just return it (after iput) */
+	if (!(inode->i_state & I_NEW)) {
+		iput(lower_inode);
+		return inode;
+	}
+
+	/* initialize new inode */
+	info = SDCARDFS_I(inode);
+
+	inode->i_ino = lower_inode->i_ino;
+	sdcardfs_set_lower_inode(inode, lower_inode);
+
+	inode_inc_iversion_raw(inode);
+
+	/* use different set of inode ops for symlinks & directories */
+	if (S_ISDIR(lower_inode->i_mode))
+		inode->i_op = &sdcardfs_dir_iops;
+	else if (S_ISLNK(lower_inode->i_mode))
+		inode->i_op = &sdcardfs_symlink_iops;
+	else
+		inode->i_op = &sdcardfs_main_iops;
+
+	/* use different set of file ops for directories */
+	if (S_ISDIR(lower_inode->i_mode))
+		inode->i_fop = &sdcardfs_dir_fops;
+	else
+		inode->i_fop = &sdcardfs_main_fops;
+
+	inode->i_mapping->a_ops = &sdcardfs_aops;
+
+	inode->i_atime.tv_sec = 0;
+	inode->i_atime.tv_nsec = 0;
+	inode->i_mtime.tv_sec = 0;
+	inode->i_mtime.tv_nsec = 0;
+	inode->i_ctime.tv_sec = 0;
+	inode->i_ctime.tv_nsec = 0;
+
+	/* properly initialize special inodes */
+	if (S_ISBLK(lower_inode->i_mode) || S_ISCHR(lower_inode->i_mode) ||
+	    S_ISFIFO(lower_inode->i_mode) || S_ISSOCK(lower_inode->i_mode))
+		init_special_inode(inode, lower_inode->i_mode,
+				   lower_inode->i_rdev);
+
+	/* all well, copy inode attributes */
+	sdcardfs_copy_and_fix_attrs(inode, lower_inode);
+	fsstack_copy_inode_size(inode, lower_inode);
+
+	unlock_new_inode(inode);
+	return inode;
+}
+
+/*
+ * Helper interpose routine, called directly by ->lookup to handle
+ * spliced dentries.
+ */
+static struct dentry *__sdcardfs_interpose(struct dentry *dentry,
+					 struct super_block *sb,
+					 struct path *lower_path,
+					 userid_t id)
+{
+	struct inode *inode;
+	struct inode *lower_inode;
+	struct super_block *lower_sb;
+	struct dentry *ret_dentry;
+
+	lower_inode = d_inode(lower_path->dentry);
+	lower_sb = sdcardfs_lower_super(sb);
+
+	/* check that the lower file system didn't cross a mount point */
+	if (lower_inode->i_sb != lower_sb) {
+		ret_dentry = ERR_PTR(-EXDEV);
+		goto out;
+	}
+
+	/*
+	 * We allocate our new inode below by calling sdcardfs_iget,
+	 * which will initialize some of the new inode's fields
+	 */
+
+	/* inherit lower inode number for sdcardfs's inode */
+	inode = sdcardfs_iget(sb, lower_inode, id);
+	if (IS_ERR(inode)) {
+		ret_dentry = ERR_CAST(inode);
+		goto out;
+	}
+
+	ret_dentry = d_splice_alias(inode, dentry);
+	dentry = ret_dentry ?: dentry;
+	if (!IS_ERR(dentry))
+		update_derived_permission_lock(dentry);
+out:
+	return ret_dentry;
+}
+
+/*
+ * Connect an sdcardfs inode dentry/inode with several lower ones.  This is
+ * the classic stackable file system "vnode interposition" action.
+ *
+ * @dentry: sdcardfs's dentry which interposes on lower one
+ * @sb: sdcardfs's super_block
+ * @lower_path: the lower path (caller does path_get/put)
+ */
+int sdcardfs_interpose(struct dentry *dentry, struct super_block *sb,
+		     struct path *lower_path, userid_t id)
+{
+	struct dentry *ret_dentry;
+
+	ret_dentry = __sdcardfs_interpose(dentry, sb, lower_path, id);
+	return PTR_ERR(ret_dentry);
+}
+
+struct sdcardfs_name_data {
+	struct dir_context ctx;
+	const struct qstr *to_find;
+	char *name;
+	bool found;
+};
+
+static int sdcardfs_name_match(struct dir_context *ctx, const char *name,
+		int namelen, loff_t offset, u64 ino, unsigned int d_type)
+{
+	struct sdcardfs_name_data *buf = container_of(ctx, struct sdcardfs_name_data, ctx);
+	struct qstr candidate = QSTR_INIT(name, namelen);
+
+	if (qstr_case_eq(buf->to_find, &candidate)) {
+		memcpy(buf->name, name, namelen);
+		buf->name[namelen] = 0;
+		buf->found = true;
+		return 1;
+	}
+	return 0;
+}
+
+/*
+ * Main driver function for sdcardfs's lookup.
+ *
+ * Returns: NULL (ok), ERR_PTR if an error occurred.
+ * Fills in lower_parent_path with <dentry,mnt> on success.
+ */
+static struct dentry *__sdcardfs_lookup(struct dentry *dentry,
+		unsigned int flags, struct path *lower_parent_path, userid_t id)
+{
+	int err = 0;
+	struct vfsmount *lower_dir_mnt;
+	struct dentry *lower_dir_dentry = NULL;
+	struct dentry *lower_dentry;
+	const struct qstr *name;
+	struct path lower_path;
+	struct qstr dname;
+	struct dentry *ret_dentry = NULL;
+	struct sdcardfs_sb_info *sbi;
+
+	sbi = SDCARDFS_SB(dentry->d_sb);
+	/* must initialize dentry operations */
+	d_set_d_op(dentry, &sdcardfs_ci_dops);
+
+	if (IS_ROOT(dentry))
+		goto out;
+
+	name = &dentry->d_name;
+
+	/* now start the actual lookup procedure */
+	lower_dir_dentry = lower_parent_path->dentry;
+	lower_dir_mnt = lower_parent_path->mnt;
+
+	/* Use vfs_path_lookup to check if the dentry exists or not */
+	err = vfs_path_lookup(lower_dir_dentry, lower_dir_mnt, name->name, 0,
+				&lower_path);
+	/* check for other cases */
+	if (err == -ENOENT) {
+		struct file *file;
+		const struct cred *cred = current_cred();
+
+		struct sdcardfs_name_data buffer = {
+			.ctx.actor = sdcardfs_name_match,
+			.to_find = name,
+			.name = __getname(),
+			.found = false,
+		};
+
+		if (!buffer.name) {
+			err = -ENOMEM;
+			goto out;
+		}
+		file = dentry_open(lower_parent_path, O_RDONLY, cred);
+		if (IS_ERR(file)) {
+			err = PTR_ERR(file);
+			goto put_name;
+		}
+		err = iterate_dir(file, &buffer.ctx);
+		fput(file);
+		if (err)
+			goto put_name;
+
+		if (buffer.found)
+			err = vfs_path_lookup(lower_dir_dentry,
+						lower_dir_mnt,
+						buffer.name, 0,
+						&lower_path);
+		else
+			err = -ENOENT;
+put_name:
+		__putname(buffer.name);
+	}
+
+	/* no error: handle positive dentries */
+	if (!err) {
+		/* check if the dentry is an obb dentry
+		 * if true, the lower_inode must be replaced with
+		 * the inode of the graft path
+		 */
+
+		if (need_graft_path(dentry)) {
+
+			/* setup_obb_dentry()
+			 * The lower_path will be stored to the dentry's orig_path
+			 * and the base obbpath will be copyed to the lower_path variable.
+			 * if an error returned, there's no change in the lower_path
+			 * returns: -ERRNO if error (0: no error)
+			 */
+			err = setup_obb_dentry(dentry, &lower_path);
+
+			if (err) {
+				/* if the sbi->obbpath is not available, we can optionally
+				 * setup the lower_path with its orig_path.
+				 * but, the current implementation just returns an error
+				 * because the sdcard daemon also regards this case as
+				 * a lookup fail.
+				 */
+				pr_info("sdcardfs: base obbpath is not available\n");
+				sdcardfs_put_reset_orig_path(dentry);
+				goto out;
+			}
+		}
+
+		sdcardfs_set_lower_path(dentry, &lower_path);
+		ret_dentry =
+			__sdcardfs_interpose(dentry, dentry->d_sb, &lower_path, id);
+		if (IS_ERR(ret_dentry)) {
+			err = PTR_ERR(ret_dentry);
+			 /* path_put underlying path on error */
+			sdcardfs_put_reset_lower_path(dentry);
+		}
+		goto out;
+	}
+
+	/*
+	 * We don't consider ENOENT an error, and we want to return a
+	 * negative dentry.
+	 */
+	if (err && err != -ENOENT)
+		goto out;
+
+	/* instatiate a new negative dentry */
+	dname.name = name->name;
+	dname.len = name->len;
+
+	/* See if the low-level filesystem might want
+	 * to use its own hash
+	 */
+	lower_dentry = d_hash_and_lookup(lower_dir_dentry, &dname);
+	if (IS_ERR(lower_dentry))
+		return lower_dentry;
+
+	if (!lower_dentry) {
+		/* We called vfs_path_lookup earlier, and did not get a negative
+		 * dentry then. Don't confuse the lower filesystem by forcing
+		 * one on it now...
+		 */
+		err = -ENOENT;
+		goto out;
+	}
+
+	lower_path.dentry = lower_dentry;
+	lower_path.mnt = mntget(lower_dir_mnt);
+	sdcardfs_set_lower_path(dentry, &lower_path);
+
+	/*
+	 * If the intent is to create a file, then don't return an error, so
+	 * the VFS will continue the process of making this negative dentry
+	 * into a positive one.
+	 */
+	if (flags & (LOOKUP_CREATE|LOOKUP_RENAME_TARGET))
+		err = 0;
+
+out:
+	if (err)
+		return ERR_PTR(err);
+	return ret_dentry;
+}
+
+/*
+ * On success:
+ * fills dentry object appropriate values and returns NULL.
+ * On fail (== error)
+ * returns error ptr
+ *
+ * @dir : Parent inode.
+ * @dentry : Target dentry to lookup. we should set each of fields.
+ *	     (dentry->d_name is initialized already)
+ * @nd : nameidata of parent inode
+ */
+struct dentry *sdcardfs_lookup(struct inode *dir, struct dentry *dentry,
+			     unsigned int flags)
+{
+	struct dentry *ret = NULL, *parent;
+	struct path lower_parent_path;
+	int err = 0;
+	const struct cred *saved_cred = NULL;
+
+	parent = dget_parent(dentry);
+
+	if (!check_caller_access_to_name(d_inode(parent), &dentry->d_name)) {
+		ret = ERR_PTR(-EACCES);
+		goto out_err;
+	}
+
+	/* save current_cred and override it */
+	saved_cred = override_fsids(SDCARDFS_SB(dir->i_sb),
+						SDCARDFS_I(dir)->data);
+	if (!saved_cred) {
+		ret = ERR_PTR(-ENOMEM);
+		goto out_err;
+	}
+
+	sdcardfs_get_lower_path(parent, &lower_parent_path);
+
+	/* allocate dentry private data.  We free it in ->d_release */
+	err = new_dentry_private_data(dentry);
+	if (err) {
+		ret = ERR_PTR(err);
+		goto out;
+	}
+
+	ret = __sdcardfs_lookup(dentry, flags, &lower_parent_path,
+				SDCARDFS_I(dir)->data->userid);
+	if (IS_ERR(ret))
+		goto out;
+	if (ret)
+		dentry = ret;
+	if (d_inode(dentry)) {
+		fsstack_copy_attr_times(d_inode(dentry),
+					sdcardfs_lower_inode(d_inode(dentry)));
+		/* get derived permission */
+		get_derived_permission(parent, dentry);
+		fixup_tmp_permissions(d_inode(dentry));
+		fixup_lower_ownership(dentry, dentry->d_name.name);
+	}
+	/* update parent directory's atime */
+	fsstack_copy_attr_atime(d_inode(parent),
+				sdcardfs_lower_inode(d_inode(parent)));
+
+out:
+	sdcardfs_put_lower_path(parent, &lower_parent_path);
+	revert_fsids(saved_cred);
+out_err:
+	dput(parent);
+	return ret;
+}
diff --git a/fs/sdcardfs/main.c b/fs/sdcardfs/main.c
new file mode 100644
index 0000000..19312ee
--- /dev/null
+++ b/fs/sdcardfs/main.c
@@ -0,0 +1,518 @@
+/*
+ * fs/sdcardfs/main.c
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#include "sdcardfs.h"
+#include <linux/fscrypt.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/parser.h>
+
+enum {
+	Opt_fsuid,
+	Opt_fsgid,
+	Opt_gid,
+	Opt_debug,
+	Opt_mask,
+	Opt_multiuser,
+	Opt_userid,
+	Opt_reserved_mb,
+	Opt_gid_derivation,
+	Opt_default_normal,
+	Opt_nocache,
+	Opt_unshared_obb,
+	Opt_err,
+};
+
+static const match_table_t sdcardfs_tokens = {
+	{Opt_fsuid, "fsuid=%u"},
+	{Opt_fsgid, "fsgid=%u"},
+	{Opt_gid, "gid=%u"},
+	{Opt_debug, "debug"},
+	{Opt_mask, "mask=%u"},
+	{Opt_userid, "userid=%d"},
+	{Opt_multiuser, "multiuser"},
+	{Opt_gid_derivation, "derive_gid"},
+	{Opt_default_normal, "default_normal"},
+	{Opt_unshared_obb, "unshared_obb"},
+	{Opt_reserved_mb, "reserved_mb=%u"},
+	{Opt_nocache, "nocache"},
+	{Opt_err, NULL}
+};
+
+static int parse_options(struct super_block *sb, char *options, int silent,
+				int *debug, struct sdcardfs_vfsmount_options *vfsopts,
+				struct sdcardfs_mount_options *opts)
+{
+	char *p;
+	substring_t args[MAX_OPT_ARGS];
+	int option;
+
+	/* by default, we use AID_MEDIA_RW as uid, gid */
+	opts->fs_low_uid = AID_MEDIA_RW;
+	opts->fs_low_gid = AID_MEDIA_RW;
+	vfsopts->mask = 0;
+	opts->multiuser = false;
+	opts->fs_user_id = 0;
+	vfsopts->gid = 0;
+	/* by default, 0MB is reserved */
+	opts->reserved_mb = 0;
+	/* by default, gid derivation is off */
+	opts->gid_derivation = false;
+	opts->default_normal = false;
+	opts->nocache = false;
+
+	*debug = 0;
+
+	if (!options)
+		return 0;
+
+	while ((p = strsep(&options, ",")) != NULL) {
+		int token;
+
+		if (!*p)
+			continue;
+
+		token = match_token(p, sdcardfs_tokens, args);
+
+		switch (token) {
+		case Opt_debug:
+			*debug = 1;
+			break;
+		case Opt_fsuid:
+			if (match_int(&args[0], &option))
+				return 0;
+			opts->fs_low_uid = option;
+			break;
+		case Opt_fsgid:
+			if (match_int(&args[0], &option))
+				return 0;
+			opts->fs_low_gid = option;
+			break;
+		case Opt_gid:
+			if (match_int(&args[0], &option))
+				return 0;
+			vfsopts->gid = option;
+			break;
+		case Opt_userid:
+			if (match_int(&args[0], &option))
+				return 0;
+			opts->fs_user_id = option;
+			break;
+		case Opt_mask:
+			if (match_int(&args[0], &option))
+				return 0;
+			vfsopts->mask = option;
+			break;
+		case Opt_multiuser:
+			opts->multiuser = true;
+			break;
+		case Opt_reserved_mb:
+			if (match_int(&args[0], &option))
+				return 0;
+			opts->reserved_mb = option;
+			break;
+		case Opt_gid_derivation:
+			opts->gid_derivation = true;
+			break;
+		case Opt_default_normal:
+			opts->default_normal = true;
+			break;
+		case Opt_nocache:
+			opts->nocache = true;
+			break;
+		case Opt_unshared_obb:
+			opts->unshared_obb = true;
+			break;
+		/* unknown option */
+		default:
+			if (!silent)
+				pr_err("Unrecognized mount option \"%s\" or missing value", p);
+			return -EINVAL;
+		}
+	}
+
+	if (*debug) {
+		pr_info("sdcardfs : options - debug:%d\n", *debug);
+		pr_info("sdcardfs : options - uid:%d\n",
+							opts->fs_low_uid);
+		pr_info("sdcardfs : options - gid:%d\n",
+							opts->fs_low_gid);
+	}
+
+	return 0;
+}
+
+int parse_options_remount(struct super_block *sb, char *options, int silent,
+				struct sdcardfs_vfsmount_options *vfsopts)
+{
+	char *p;
+	substring_t args[MAX_OPT_ARGS];
+	int option;
+	int debug;
+
+	if (!options)
+		return 0;
+
+	while ((p = strsep(&options, ",")) != NULL) {
+		int token;
+
+		if (!*p)
+			continue;
+
+		token = match_token(p, sdcardfs_tokens, args);
+
+		switch (token) {
+		case Opt_debug:
+			debug = 1;
+			break;
+		case Opt_gid:
+			if (match_int(&args[0], &option))
+				return 0;
+			vfsopts->gid = option;
+
+			break;
+		case Opt_mask:
+			if (match_int(&args[0], &option))
+				return 0;
+			vfsopts->mask = option;
+			break;
+		case Opt_unshared_obb:
+		case Opt_default_normal:
+		case Opt_multiuser:
+		case Opt_userid:
+		case Opt_fsuid:
+		case Opt_fsgid:
+		case Opt_reserved_mb:
+		case Opt_gid_derivation:
+			if (!silent)
+				pr_warn("Option \"%s\" can't be changed during remount\n", p);
+			break;
+		/* unknown option */
+		default:
+			if (!silent)
+				pr_err("Unrecognized mount option \"%s\" or missing value", p);
+			return -EINVAL;
+		}
+	}
+
+	if (debug) {
+		pr_info("sdcardfs : options - debug:%d\n", debug);
+		pr_info("sdcardfs : options - gid:%d\n", vfsopts->gid);
+		pr_info("sdcardfs : options - mask:%d\n", vfsopts->mask);
+	}
+
+	return 0;
+}
+
+#if 0
+/*
+ * our custom d_alloc_root work-alike
+ *
+ * we can't use d_alloc_root if we want to use our own interpose function
+ * unchanged, so we simply call our own "fake" d_alloc_root
+ */
+static struct dentry *sdcardfs_d_alloc_root(struct super_block *sb)
+{
+	struct dentry *ret = NULL;
+
+	if (sb) {
+		static const struct qstr name = {
+			.name = "/",
+			.len = 1
+		};
+
+		ret = d_alloc(NULL, &name);
+		if (ret) {
+			d_set_d_op(ret, &sdcardfs_ci_dops);
+			ret->d_sb = sb;
+			ret->d_parent = ret;
+		}
+	}
+	return ret;
+}
+#endif
+
+DEFINE_MUTEX(sdcardfs_super_list_lock);
+EXPORT_SYMBOL_GPL(sdcardfs_super_list_lock);
+LIST_HEAD(sdcardfs_super_list);
+EXPORT_SYMBOL_GPL(sdcardfs_super_list);
+
+/*
+ * There is no need to lock the sdcardfs_super_info's rwsem as there is no
+ * way anyone can have a reference to the superblock at this point in time.
+ */
+static int sdcardfs_read_super(struct vfsmount *mnt, struct super_block *sb,
+		const char *dev_name, void *raw_data, int silent)
+{
+	int err = 0;
+	int debug;
+	struct super_block *lower_sb;
+	struct path lower_path;
+	struct sdcardfs_sb_info *sb_info;
+	struct sdcardfs_vfsmount_options *mnt_opt = mnt->data;
+	struct inode *inode;
+
+	pr_info("sdcardfs version 2.0\n");
+
+	if (!dev_name) {
+		pr_err("sdcardfs: read_super: missing dev_name argument\n");
+		err = -EINVAL;
+		goto out;
+	}
+
+	pr_info("sdcardfs: dev_name -> %s\n", dev_name);
+	pr_info("sdcardfs: options -> %s\n", (char *)raw_data);
+	pr_info("sdcardfs: mnt -> %p\n", mnt);
+
+	/* parse lower path */
+	err = kern_path(dev_name, LOOKUP_FOLLOW | LOOKUP_DIRECTORY,
+			&lower_path);
+	if (err) {
+		pr_err("sdcardfs: error accessing lower directory '%s'\n", dev_name);
+		goto out;
+	}
+
+	/* allocate superblock private data */
+	sb->s_fs_info = kzalloc(sizeof(struct sdcardfs_sb_info), GFP_KERNEL);
+	if (!SDCARDFS_SB(sb)) {
+		pr_crit("sdcardfs: read_super: out of memory\n");
+		err = -ENOMEM;
+		goto out_free;
+	}
+
+	sb_info = sb->s_fs_info;
+	/* parse options */
+	err = parse_options(sb, raw_data, silent, &debug, mnt_opt, &sb_info->options);
+	if (err) {
+		pr_err("sdcardfs: invalid options\n");
+		goto out_freesbi;
+	}
+
+	/* set the lower superblock field of upper superblock */
+	lower_sb = lower_path.dentry->d_sb;
+	atomic_inc(&lower_sb->s_active);
+	sdcardfs_set_lower_super(sb, lower_sb);
+
+	sb->s_stack_depth = lower_sb->s_stack_depth + 1;
+	if (sb->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) {
+		pr_err("sdcardfs: maximum fs stacking depth exceeded\n");
+		err = -EINVAL;
+		goto out_sput;
+	}
+
+	/* inherit maxbytes from lower file system */
+	sb->s_maxbytes = lower_sb->s_maxbytes;
+
+	/*
+	 * Our c/m/atime granularity is 1 ns because we may stack on file
+	 * systems whose granularity is as good.
+	 */
+	sb->s_time_gran = 1;
+
+	sb->s_magic = SDCARDFS_SUPER_MAGIC;
+	sb->s_op = &sdcardfs_sops;
+
+	/* get a new inode and allocate our root dentry */
+	inode = sdcardfs_iget(sb, d_inode(lower_path.dentry), 0);
+	if (IS_ERR(inode)) {
+		err = PTR_ERR(inode);
+		goto out_sput;
+	}
+	sb->s_root = d_make_root(inode);
+	if (!sb->s_root) {
+		err = -ENOMEM;
+		goto out_sput;
+	}
+	d_set_d_op(sb->s_root, &sdcardfs_ci_dops);
+
+	/* link the upper and lower dentries */
+	sb->s_root->d_fsdata = NULL;
+	err = new_dentry_private_data(sb->s_root);
+	if (err)
+		goto out_freeroot;
+
+	/* set the lower dentries for s_root */
+	sdcardfs_set_lower_path(sb->s_root, &lower_path);
+
+	/*
+	 * No need to call interpose because we already have a positive
+	 * dentry, which was instantiated by d_make_root.  Just need to
+	 * d_rehash it.
+	 */
+	d_rehash(sb->s_root);
+
+	/* setup permission policy */
+	sb_info->obbpath_s = kzalloc(PATH_MAX, GFP_KERNEL);
+	mutex_lock(&sdcardfs_super_list_lock);
+	if (sb_info->options.multiuser) {
+		setup_derived_state(d_inode(sb->s_root), PERM_PRE_ROOT,
+				sb_info->options.fs_user_id, AID_ROOT);
+		snprintf(sb_info->obbpath_s, PATH_MAX, "%s/obb", dev_name);
+	} else {
+		setup_derived_state(d_inode(sb->s_root), PERM_ROOT,
+				sb_info->options.fs_user_id, AID_ROOT);
+		snprintf(sb_info->obbpath_s, PATH_MAX, "%s/Android/obb", dev_name);
+	}
+	fixup_tmp_permissions(d_inode(sb->s_root));
+	sb_info->sb = sb;
+	list_add(&sb_info->list, &sdcardfs_super_list);
+	mutex_unlock(&sdcardfs_super_list_lock);
+
+	sb_info->fscrypt_nb.notifier_call = sdcardfs_on_fscrypt_key_removed;
+	fscrypt_register_key_removal_notifier(&sb_info->fscrypt_nb);
+
+	if (!silent)
+		pr_info("sdcardfs: mounted on top of %s type %s\n",
+				dev_name, lower_sb->s_type->name);
+	goto out; /* all is well */
+
+	/* no longer needed: free_dentry_private_data(sb->s_root); */
+out_freeroot:
+	dput(sb->s_root);
+	sb->s_root = NULL;
+out_sput:
+	/* drop refs we took earlier */
+	atomic_dec(&lower_sb->s_active);
+out_freesbi:
+	kfree(SDCARDFS_SB(sb));
+	sb->s_fs_info = NULL;
+out_free:
+	path_put(&lower_path);
+
+out:
+	return err;
+}
+
+struct sdcardfs_mount_private {
+	struct vfsmount *mnt;
+	const char *dev_name;
+	void *raw_data;
+};
+
+static int __sdcardfs_fill_super(
+	struct super_block *sb,
+	void *_priv, int silent)
+{
+	struct sdcardfs_mount_private *priv = _priv;
+
+	return sdcardfs_read_super(priv->mnt,
+		sb, priv->dev_name, priv->raw_data, silent);
+}
+
+static struct dentry *sdcardfs_mount(struct vfsmount *mnt,
+		struct file_system_type *fs_type, int flags,
+			    const char *dev_name, void *raw_data)
+{
+	struct sdcardfs_mount_private priv = {
+		.mnt = mnt,
+		.dev_name = dev_name,
+		.raw_data = raw_data
+	};
+
+	return mount_nodev(fs_type, flags,
+		&priv, __sdcardfs_fill_super);
+}
+
+static struct dentry *sdcardfs_mount_wrn(struct file_system_type *fs_type,
+		    int flags, const char *dev_name, void *raw_data)
+{
+	WARN(1, "sdcardfs does not support mount. Use mount2.\n");
+	return ERR_PTR(-EINVAL);
+}
+
+void *sdcardfs_alloc_mnt_data(void)
+{
+	return kmalloc(sizeof(struct sdcardfs_vfsmount_options), GFP_KERNEL);
+}
+
+void sdcardfs_kill_sb(struct super_block *sb)
+{
+	struct sdcardfs_sb_info *sbi;
+
+	if (sb->s_magic == SDCARDFS_SUPER_MAGIC && sb->s_fs_info) {
+		sbi = SDCARDFS_SB(sb);
+
+		fscrypt_unregister_key_removal_notifier(&sbi->fscrypt_nb);
+
+		mutex_lock(&sdcardfs_super_list_lock);
+		list_del(&sbi->list);
+		mutex_unlock(&sdcardfs_super_list_lock);
+	}
+	kill_anon_super(sb);
+}
+
+static struct file_system_type sdcardfs_fs_type = {
+	.owner		= THIS_MODULE,
+	.name		= SDCARDFS_NAME,
+	.mount		= sdcardfs_mount_wrn,
+	.mount2		= sdcardfs_mount,
+	.alloc_mnt_data = sdcardfs_alloc_mnt_data,
+	.kill_sb	= sdcardfs_kill_sb,
+	.fs_flags	= 0,
+};
+MODULE_ALIAS_FS(SDCARDFS_NAME);
+
+static int __init init_sdcardfs_fs(void)
+{
+	int err;
+
+	pr_info("Registering sdcardfs " SDCARDFS_VERSION "\n");
+
+	err = sdcardfs_init_inode_cache();
+	if (err)
+		goto out;
+	err = sdcardfs_init_dentry_cache();
+	if (err)
+		goto out;
+	err = packagelist_init();
+	if (err)
+		goto out;
+	err = register_filesystem(&sdcardfs_fs_type);
+out:
+	if (err) {
+		sdcardfs_destroy_inode_cache();
+		sdcardfs_destroy_dentry_cache();
+		packagelist_exit();
+	}
+	return err;
+}
+
+static void __exit exit_sdcardfs_fs(void)
+{
+	sdcardfs_destroy_inode_cache();
+	sdcardfs_destroy_dentry_cache();
+	packagelist_exit();
+	unregister_filesystem(&sdcardfs_fs_type);
+	pr_info("Completed sdcardfs module unload\n");
+}
+
+/* Original wrapfs authors */
+MODULE_AUTHOR("Erez Zadok, Filesystems and Storage Lab, Stony Brook University (http://www.fsl.cs.sunysb.edu/)");
+
+/* Original sdcardfs authors */
+MODULE_AUTHOR("Woojoong Lee, Daeho Jeong, Kitae Lee, Yeongjin Gil System Memory Lab., Samsung Electronics");
+
+/* Current maintainer */
+MODULE_AUTHOR("Daniel Rosenberg, Google");
+MODULE_DESCRIPTION("Sdcardfs " SDCARDFS_VERSION);
+MODULE_LICENSE("GPL");
+
+module_init(init_sdcardfs_fs);
+module_exit(exit_sdcardfs_fs);
diff --git a/fs/sdcardfs/mmap.c b/fs/sdcardfs/mmap.c
new file mode 100644
index 0000000..2847c0e
--- /dev/null
+++ b/fs/sdcardfs/mmap.c
@@ -0,0 +1,87 @@
+/*
+ * fs/sdcardfs/mmap.c
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#include "sdcardfs.h"
+
+static int sdcardfs_fault(struct vm_fault *vmf)
+{
+	int err;
+	struct file *file;
+	const struct vm_operations_struct *lower_vm_ops;
+
+	file = (struct file *)vmf->vma->vm_private_data;
+	lower_vm_ops = SDCARDFS_F(file)->lower_vm_ops;
+	BUG_ON(!lower_vm_ops);
+
+	err = lower_vm_ops->fault(vmf);
+	return err;
+}
+
+static void sdcardfs_vm_open(struct vm_area_struct *vma)
+{
+	struct file *file = (struct file *)vma->vm_private_data;
+
+	get_file(file);
+}
+
+static void sdcardfs_vm_close(struct vm_area_struct *vma)
+{
+	struct file *file = (struct file *)vma->vm_private_data;
+
+	fput(file);
+}
+
+static int sdcardfs_page_mkwrite(struct vm_fault *vmf)
+{
+	int err = 0;
+	struct file *file;
+	const struct vm_operations_struct *lower_vm_ops;
+
+	file = (struct file *)vmf->vma->vm_private_data;
+	lower_vm_ops = SDCARDFS_F(file)->lower_vm_ops;
+	BUG_ON(!lower_vm_ops);
+	if (!lower_vm_ops->page_mkwrite)
+		goto out;
+
+	err = lower_vm_ops->page_mkwrite(vmf);
+out:
+	return err;
+}
+
+static ssize_t sdcardfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
+{
+	/*
+	 * This function should never be called directly.  We need it
+	 * to exist, to get past a check in open_check_o_direct(),
+	 * which is called from do_last().
+	 */
+	return -EINVAL;
+}
+
+const struct address_space_operations sdcardfs_aops = {
+	.direct_IO	= sdcardfs_direct_IO,
+};
+
+const struct vm_operations_struct sdcardfs_vm_ops = {
+	.fault		= sdcardfs_fault,
+	.page_mkwrite	= sdcardfs_page_mkwrite,
+	.open		= sdcardfs_vm_open,
+	.close		= sdcardfs_vm_close,
+};
diff --git a/fs/sdcardfs/multiuser.h b/fs/sdcardfs/multiuser.h
new file mode 100644
index 0000000..85341e7
--- /dev/null
+++ b/fs/sdcardfs/multiuser.h
@@ -0,0 +1,53 @@
+/*
+ * fs/sdcardfs/multiuser.h
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#define AID_USER_OFFSET     100000 /* offset for uid ranges for each user */
+#define AID_APP_START        10000 /* first app user */
+#define AID_APP_END          19999 /* last app user */
+#define AID_CACHE_GID_START  20000 /* start of gids for apps to mark cached data */
+#define AID_EXT_GID_START    30000 /* start of gids for apps to mark external data */
+#define AID_EXT_CACHE_GID_START 40000 /* start of gids for apps to mark external cached data */
+#define AID_EXT_CACHE_GID_END 49999   /* end of gids for apps to mark external cached data */
+#define AID_SHARED_GID_START 50000 /* start of gids for apps in each user to share */
+
+typedef uid_t userid_t;
+typedef uid_t appid_t;
+
+static inline uid_t multiuser_get_uid(userid_t user_id, appid_t app_id)
+{
+	return (user_id * AID_USER_OFFSET) + (app_id % AID_USER_OFFSET);
+}
+
+static inline bool uid_is_app(uid_t uid)
+{
+	appid_t appid = uid % AID_USER_OFFSET;
+
+	return appid >= AID_APP_START && appid <= AID_APP_END;
+}
+
+static inline gid_t multiuser_get_ext_cache_gid(uid_t uid)
+{
+	return uid - AID_APP_START + AID_EXT_CACHE_GID_START;
+}
+
+static inline gid_t multiuser_get_ext_gid(uid_t uid)
+{
+	return uid - AID_APP_START + AID_EXT_GID_START;
+}
diff --git a/fs/sdcardfs/packagelist.c b/fs/sdcardfs/packagelist.c
new file mode 100644
index 0000000..4b9a563
--- /dev/null
+++ b/fs/sdcardfs/packagelist.c
@@ -0,0 +1,882 @@
+/*
+ * fs/sdcardfs/packagelist.c
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#include "sdcardfs.h"
+#include <linux/hashtable.h>
+#include <linux/ctype.h>
+#include <linux/delay.h>
+#include <linux/radix-tree.h>
+#include <linux/dcache.h>
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+
+#include <linux/configfs.h>
+
+struct hashtable_entry {
+	struct hlist_node hlist;
+	struct hlist_node dlist; /* for deletion cleanup */
+	struct qstr key;
+	atomic_t value;
+};
+
+static DEFINE_HASHTABLE(package_to_appid, 8);
+static DEFINE_HASHTABLE(package_to_userid, 8);
+static DEFINE_HASHTABLE(ext_to_groupid, 8);
+
+
+static struct kmem_cache *hashtable_entry_cachep;
+
+static unsigned int full_name_case_hash(const void *salt, const unsigned char *name, unsigned int len)
+{
+	unsigned long hash = init_name_hash(salt);
+
+	while (len--)
+		hash = partial_name_hash(tolower(*name++), hash);
+	return end_name_hash(hash);
+}
+
+static inline void qstr_init(struct qstr *q, const char *name)
+{
+	q->name = name;
+	q->len = strlen(q->name);
+	q->hash = full_name_case_hash(0, q->name, q->len);
+}
+
+static inline int qstr_copy(const struct qstr *src, struct qstr *dest)
+{
+	dest->name = kstrdup(src->name, GFP_KERNEL);
+	dest->hash_len = src->hash_len;
+	return !!dest->name;
+}
+
+
+static appid_t __get_appid(const struct qstr *key)
+{
+	struct hashtable_entry *hash_cur;
+	unsigned int hash = key->hash;
+	appid_t ret_id;
+
+	rcu_read_lock();
+	hash_for_each_possible_rcu(package_to_appid, hash_cur, hlist, hash) {
+		if (qstr_case_eq(key, &hash_cur->key)) {
+			ret_id = atomic_read(&hash_cur->value);
+			rcu_read_unlock();
+			return ret_id;
+		}
+	}
+	rcu_read_unlock();
+	return 0;
+}
+
+appid_t get_appid(const char *key)
+{
+	struct qstr q;
+
+	qstr_init(&q, key);
+	return __get_appid(&q);
+}
+
+static appid_t __get_ext_gid(const struct qstr *key)
+{
+	struct hashtable_entry *hash_cur;
+	unsigned int hash = key->hash;
+	appid_t ret_id;
+
+	rcu_read_lock();
+	hash_for_each_possible_rcu(ext_to_groupid, hash_cur, hlist, hash) {
+		if (qstr_case_eq(key, &hash_cur->key)) {
+			ret_id = atomic_read(&hash_cur->value);
+			rcu_read_unlock();
+			return ret_id;
+		}
+	}
+	rcu_read_unlock();
+	return 0;
+}
+
+appid_t get_ext_gid(const char *key)
+{
+	struct qstr q;
+
+	qstr_init(&q, key);
+	return __get_ext_gid(&q);
+}
+
+static appid_t __is_excluded(const struct qstr *app_name, userid_t user)
+{
+	struct hashtable_entry *hash_cur;
+	unsigned int hash = app_name->hash;
+
+	rcu_read_lock();
+	hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) {
+		if (atomic_read(&hash_cur->value) == user &&
+				qstr_case_eq(app_name, &hash_cur->key)) {
+			rcu_read_unlock();
+			return 1;
+		}
+	}
+	rcu_read_unlock();
+	return 0;
+}
+
+appid_t is_excluded(const char *key, userid_t user)
+{
+	struct qstr q;
+	qstr_init(&q, key);
+	return __is_excluded(&q, user);
+}
+
+/* Kernel has already enforced everything we returned through
+ * derive_permissions_locked(), so this is used to lock down access
+ * even further, such as enforcing that apps hold sdcard_rw.
+ */
+int check_caller_access_to_name(struct inode *parent_node, const struct qstr *name)
+{
+	struct qstr q_autorun = QSTR_LITERAL("autorun.inf");
+	struct qstr q__android_secure = QSTR_LITERAL(".android_secure");
+	struct qstr q_android_secure = QSTR_LITERAL("android_secure");
+
+	/* Always block security-sensitive files at root */
+	if (parent_node && SDCARDFS_I(parent_node)->data->perm == PERM_ROOT) {
+		if (qstr_case_eq(name, &q_autorun)
+			|| qstr_case_eq(name, &q__android_secure)
+			|| qstr_case_eq(name, &q_android_secure)) {
+			return 0;
+		}
+	}
+
+	/* Root always has access; access for any other UIDs should always
+	 * be controlled through packages.list.
+	 */
+	if (from_kuid(&init_user_ns, current_fsuid()) == 0)
+		return 1;
+
+	/* No extra permissions to enforce */
+	return 1;
+}
+
+static struct hashtable_entry *alloc_hashtable_entry(const struct qstr *key,
+		appid_t value)
+{
+	struct hashtable_entry *ret = kmem_cache_alloc(hashtable_entry_cachep,
+			GFP_KERNEL);
+	if (!ret)
+		return NULL;
+	INIT_HLIST_NODE(&ret->dlist);
+	INIT_HLIST_NODE(&ret->hlist);
+
+	if (!qstr_copy(key, &ret->key)) {
+		kmem_cache_free(hashtable_entry_cachep, ret);
+		return NULL;
+	}
+
+	atomic_set(&ret->value, value);
+	return ret;
+}
+
+static int insert_packagelist_appid_entry_locked(const struct qstr *key, appid_t value)
+{
+	struct hashtable_entry *hash_cur;
+	struct hashtable_entry *new_entry;
+	unsigned int hash = key->hash;
+
+	hash_for_each_possible_rcu(package_to_appid, hash_cur, hlist, hash) {
+		if (qstr_case_eq(key, &hash_cur->key)) {
+			atomic_set(&hash_cur->value, value);
+			return 0;
+		}
+	}
+	new_entry = alloc_hashtable_entry(key, value);
+	if (!new_entry)
+		return -ENOMEM;
+	hash_add_rcu(package_to_appid, &new_entry->hlist, hash);
+	return 0;
+}
+
+static int insert_ext_gid_entry_locked(const struct qstr *key, appid_t value)
+{
+	struct hashtable_entry *hash_cur;
+	struct hashtable_entry *new_entry;
+	unsigned int hash = key->hash;
+
+	/* An extension can only belong to one gid */
+	hash_for_each_possible_rcu(ext_to_groupid, hash_cur, hlist, hash) {
+		if (qstr_case_eq(key, &hash_cur->key))
+			return -EINVAL;
+	}
+	new_entry = alloc_hashtable_entry(key, value);
+	if (!new_entry)
+		return -ENOMEM;
+	hash_add_rcu(ext_to_groupid, &new_entry->hlist, hash);
+	return 0;
+}
+
+static int insert_userid_exclude_entry_locked(const struct qstr *key, userid_t value)
+{
+	struct hashtable_entry *hash_cur;
+	struct hashtable_entry *new_entry;
+	unsigned int hash = key->hash;
+
+	/* Only insert if not already present */
+	hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) {
+		if (atomic_read(&hash_cur->value) == value &&
+				qstr_case_eq(key, &hash_cur->key))
+			return 0;
+	}
+	new_entry = alloc_hashtable_entry(key, value);
+	if (!new_entry)
+		return -ENOMEM;
+	hash_add_rcu(package_to_userid, &new_entry->hlist, hash);
+	return 0;
+}
+
+static void fixup_all_perms_name(const struct qstr *key)
+{
+	struct sdcardfs_sb_info *sbinfo;
+	struct limit_search limit = {
+		.flags = BY_NAME,
+		.name = QSTR_INIT(key->name, key->len),
+	};
+	list_for_each_entry(sbinfo, &sdcardfs_super_list, list) {
+		if (sbinfo_has_sdcard_magic(sbinfo))
+			fixup_perms_recursive(sbinfo->sb->s_root, &limit);
+	}
+}
+
+static void fixup_all_perms_name_userid(const struct qstr *key, userid_t userid)
+{
+	struct sdcardfs_sb_info *sbinfo;
+	struct limit_search limit = {
+		.flags = BY_NAME | BY_USERID,
+		.name = QSTR_INIT(key->name, key->len),
+		.userid = userid,
+	};
+	list_for_each_entry(sbinfo, &sdcardfs_super_list, list) {
+		if (sbinfo_has_sdcard_magic(sbinfo))
+			fixup_perms_recursive(sbinfo->sb->s_root, &limit);
+	}
+}
+
+static void fixup_all_perms_userid(userid_t userid)
+{
+	struct sdcardfs_sb_info *sbinfo;
+	struct limit_search limit = {
+		.flags = BY_USERID,
+		.userid = userid,
+	};
+	list_for_each_entry(sbinfo, &sdcardfs_super_list, list) {
+		if (sbinfo_has_sdcard_magic(sbinfo))
+			fixup_perms_recursive(sbinfo->sb->s_root, &limit);
+	}
+}
+
+static int insert_packagelist_entry(const struct qstr *key, appid_t value)
+{
+	int err;
+
+	mutex_lock(&sdcardfs_super_list_lock);
+	err = insert_packagelist_appid_entry_locked(key, value);
+	if (!err)
+		fixup_all_perms_name(key);
+	mutex_unlock(&sdcardfs_super_list_lock);
+
+	return err;
+}
+
+static int insert_ext_gid_entry(const struct qstr *key, appid_t value)
+{
+	int err;
+
+	mutex_lock(&sdcardfs_super_list_lock);
+	err = insert_ext_gid_entry_locked(key, value);
+	mutex_unlock(&sdcardfs_super_list_lock);
+
+	return err;
+}
+
+static int insert_userid_exclude_entry(const struct qstr *key, userid_t value)
+{
+	int err;
+
+	mutex_lock(&sdcardfs_super_list_lock);
+	err = insert_userid_exclude_entry_locked(key, value);
+	if (!err)
+		fixup_all_perms_name_userid(key, value);
+	mutex_unlock(&sdcardfs_super_list_lock);
+
+	return err;
+}
+
+static void free_hashtable_entry(struct hashtable_entry *entry)
+{
+	kfree(entry->key.name);
+	kmem_cache_free(hashtable_entry_cachep, entry);
+}
+
+static void remove_packagelist_entry_locked(const struct qstr *key)
+{
+	struct hashtable_entry *hash_cur;
+	unsigned int hash = key->hash;
+	struct hlist_node *h_t;
+	HLIST_HEAD(free_list);
+
+	hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) {
+		if (qstr_case_eq(key, &hash_cur->key)) {
+			hash_del_rcu(&hash_cur->hlist);
+			hlist_add_head(&hash_cur->dlist, &free_list);
+		}
+	}
+	hash_for_each_possible_rcu(package_to_appid, hash_cur, hlist, hash) {
+		if (qstr_case_eq(key, &hash_cur->key)) {
+			hash_del_rcu(&hash_cur->hlist);
+			hlist_add_head(&hash_cur->dlist, &free_list);
+			break;
+		}
+	}
+	synchronize_rcu();
+	hlist_for_each_entry_safe(hash_cur, h_t, &free_list, dlist)
+		free_hashtable_entry(hash_cur);
+}
+
+static void remove_packagelist_entry(const struct qstr *key)
+{
+	mutex_lock(&sdcardfs_super_list_lock);
+	remove_packagelist_entry_locked(key);
+	fixup_all_perms_name(key);
+	mutex_unlock(&sdcardfs_super_list_lock);
+}
+
+static void remove_ext_gid_entry_locked(const struct qstr *key, gid_t group)
+{
+	struct hashtable_entry *hash_cur;
+	unsigned int hash = key->hash;
+
+	hash_for_each_possible_rcu(ext_to_groupid, hash_cur, hlist, hash) {
+		if (qstr_case_eq(key, &hash_cur->key) && atomic_read(&hash_cur->value) == group) {
+			hash_del_rcu(&hash_cur->hlist);
+			synchronize_rcu();
+			free_hashtable_entry(hash_cur);
+			break;
+		}
+	}
+}
+
+static void remove_ext_gid_entry(const struct qstr *key, gid_t group)
+{
+	mutex_lock(&sdcardfs_super_list_lock);
+	remove_ext_gid_entry_locked(key, group);
+	mutex_unlock(&sdcardfs_super_list_lock);
+}
+
+static void remove_userid_all_entry_locked(userid_t userid)
+{
+	struct hashtable_entry *hash_cur;
+	struct hlist_node *h_t;
+	HLIST_HEAD(free_list);
+	int i;
+
+	hash_for_each_rcu(package_to_userid, i, hash_cur, hlist) {
+		if (atomic_read(&hash_cur->value) == userid) {
+			hash_del_rcu(&hash_cur->hlist);
+			hlist_add_head(&hash_cur->dlist, &free_list);
+		}
+	}
+	synchronize_rcu();
+	hlist_for_each_entry_safe(hash_cur, h_t, &free_list, dlist) {
+		free_hashtable_entry(hash_cur);
+	}
+}
+
+static void remove_userid_all_entry(userid_t userid)
+{
+	mutex_lock(&sdcardfs_super_list_lock);
+	remove_userid_all_entry_locked(userid);
+	fixup_all_perms_userid(userid);
+	mutex_unlock(&sdcardfs_super_list_lock);
+}
+
+static void remove_userid_exclude_entry_locked(const struct qstr *key, userid_t userid)
+{
+	struct hashtable_entry *hash_cur;
+	unsigned int hash = key->hash;
+
+	hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) {
+		if (qstr_case_eq(key, &hash_cur->key) &&
+				atomic_read(&hash_cur->value) == userid) {
+			hash_del_rcu(&hash_cur->hlist);
+			synchronize_rcu();
+			free_hashtable_entry(hash_cur);
+			break;
+		}
+	}
+}
+
+static void remove_userid_exclude_entry(const struct qstr *key, userid_t userid)
+{
+	mutex_lock(&sdcardfs_super_list_lock);
+	remove_userid_exclude_entry_locked(key, userid);
+	fixup_all_perms_name_userid(key, userid);
+	mutex_unlock(&sdcardfs_super_list_lock);
+}
+
+static void packagelist_destroy(void)
+{
+	struct hashtable_entry *hash_cur;
+	struct hlist_node *h_t;
+	HLIST_HEAD(free_list);
+	int i;
+
+	mutex_lock(&sdcardfs_super_list_lock);
+	hash_for_each_rcu(package_to_appid, i, hash_cur, hlist) {
+		hash_del_rcu(&hash_cur->hlist);
+		hlist_add_head(&hash_cur->dlist, &free_list);
+	}
+	hash_for_each_rcu(package_to_userid, i, hash_cur, hlist) {
+		hash_del_rcu(&hash_cur->hlist);
+		hlist_add_head(&hash_cur->dlist, &free_list);
+	}
+	synchronize_rcu();
+	hlist_for_each_entry_safe(hash_cur, h_t, &free_list, dlist)
+		free_hashtable_entry(hash_cur);
+	mutex_unlock(&sdcardfs_super_list_lock);
+	pr_info("sdcardfs: destroyed packagelist pkgld\n");
+}
+
+#define SDCARDFS_CONFIGFS_ATTR(_pfx, _name)			\
+static struct configfs_attribute _pfx##attr_##_name = {	\
+	.ca_name	= __stringify(_name),		\
+	.ca_mode	= S_IRUGO | S_IWUGO,		\
+	.ca_owner	= THIS_MODULE,			\
+	.show		= _pfx##_name##_show,		\
+	.store		= _pfx##_name##_store,		\
+}
+
+#define SDCARDFS_CONFIGFS_ATTR_RO(_pfx, _name)			\
+static struct configfs_attribute _pfx##attr_##_name = {	\
+	.ca_name	= __stringify(_name),		\
+	.ca_mode	= S_IRUGO,			\
+	.ca_owner	= THIS_MODULE,			\
+	.show		= _pfx##_name##_show,		\
+}
+
+#define SDCARDFS_CONFIGFS_ATTR_WO(_pfx, _name)			\
+static struct configfs_attribute _pfx##attr_##_name = {	\
+	.ca_name	= __stringify(_name),		\
+	.ca_mode	= S_IWUGO,			\
+	.ca_owner	= THIS_MODULE,			\
+	.store		= _pfx##_name##_store,		\
+}
+
+struct package_details {
+	struct config_item item;
+	struct qstr name;
+};
+
+static inline struct package_details *to_package_details(struct config_item *item)
+{
+	return item ? container_of(item, struct package_details, item) : NULL;
+}
+
+static ssize_t package_details_appid_show(struct config_item *item, char *page)
+{
+	return scnprintf(page, PAGE_SIZE, "%u\n", __get_appid(&to_package_details(item)->name));
+}
+
+static ssize_t package_details_appid_store(struct config_item *item,
+				       const char *page, size_t count)
+{
+	unsigned int tmp;
+	int ret;
+
+	ret = kstrtouint(page, 10, &tmp);
+	if (ret)
+		return ret;
+
+	ret = insert_packagelist_entry(&to_package_details(item)->name, tmp);
+
+	if (ret)
+		return ret;
+
+	return count;
+}
+
+static ssize_t package_details_excluded_userids_show(struct config_item *item,
+				      char *page)
+{
+	struct package_details *package_details = to_package_details(item);
+	struct hashtable_entry *hash_cur;
+	unsigned int hash = package_details->name.hash;
+	int count = 0;
+
+	rcu_read_lock();
+	hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) {
+		if (qstr_case_eq(&package_details->name, &hash_cur->key))
+			count += scnprintf(page + count, PAGE_SIZE - count,
+					"%d ", atomic_read(&hash_cur->value));
+	}
+	rcu_read_unlock();
+	if (count)
+		count--;
+	count += scnprintf(page + count, PAGE_SIZE - count, "\n");
+	return count;
+}
+
+static ssize_t package_details_excluded_userids_store(struct config_item *item,
+				       const char *page, size_t count)
+{
+	unsigned int tmp;
+	int ret;
+
+	ret = kstrtouint(page, 10, &tmp);
+	if (ret)
+		return ret;
+
+	ret = insert_userid_exclude_entry(&to_package_details(item)->name, tmp);
+
+	if (ret)
+		return ret;
+
+	return count;
+}
+
+static ssize_t package_details_clear_userid_store(struct config_item *item,
+				       const char *page, size_t count)
+{
+	unsigned int tmp;
+	int ret;
+
+	ret = kstrtouint(page, 10, &tmp);
+	if (ret)
+		return ret;
+	remove_userid_exclude_entry(&to_package_details(item)->name, tmp);
+	return count;
+}
+
+static void package_details_release(struct config_item *item)
+{
+	struct package_details *package_details = to_package_details(item);
+
+	pr_info("sdcardfs: removing %s\n", package_details->name.name);
+	remove_packagelist_entry(&package_details->name);
+	kfree(package_details->name.name);
+	kfree(package_details);
+}
+
+SDCARDFS_CONFIGFS_ATTR(package_details_, appid);
+SDCARDFS_CONFIGFS_ATTR(package_details_, excluded_userids);
+SDCARDFS_CONFIGFS_ATTR_WO(package_details_, clear_userid);
+
+static struct configfs_attribute *package_details_attrs[] = {
+	&package_details_attr_appid,
+	&package_details_attr_excluded_userids,
+	&package_details_attr_clear_userid,
+	NULL,
+};
+
+static struct configfs_item_operations package_details_item_ops = {
+	.release = package_details_release,
+};
+
+static struct config_item_type package_appid_type = {
+	.ct_item_ops	= &package_details_item_ops,
+	.ct_attrs	= package_details_attrs,
+	.ct_owner	= THIS_MODULE,
+};
+
+struct extensions_value {
+	struct config_group group;
+	unsigned int num;
+};
+
+struct extension_details {
+	struct config_item item;
+	struct qstr name;
+	unsigned int num;
+};
+
+static inline struct extensions_value *to_extensions_value(struct config_item *item)
+{
+	return item ? container_of(to_config_group(item), struct extensions_value, group) : NULL;
+}
+
+static inline struct extension_details *to_extension_details(struct config_item *item)
+{
+	return item ? container_of(item, struct extension_details, item) : NULL;
+}
+
+static void extension_details_release(struct config_item *item)
+{
+	struct extension_details *extension_details = to_extension_details(item);
+
+	pr_info("sdcardfs: No longer mapping %s files to gid %d\n",
+			extension_details->name.name, extension_details->num);
+	remove_ext_gid_entry(&extension_details->name, extension_details->num);
+	kfree(extension_details->name.name);
+	kfree(extension_details);
+}
+
+static struct configfs_item_operations extension_details_item_ops = {
+	.release = extension_details_release,
+};
+
+static struct config_item_type extension_details_type = {
+	.ct_item_ops = &extension_details_item_ops,
+	.ct_owner = THIS_MODULE,
+};
+
+static struct config_item *extension_details_make_item(struct config_group *group, const char *name)
+{
+	struct extensions_value *extensions_value = to_extensions_value(&group->cg_item);
+	struct extension_details *extension_details = kzalloc(sizeof(struct extension_details), GFP_KERNEL);
+	const char *tmp;
+	int ret;
+
+	if (!extension_details)
+		return ERR_PTR(-ENOMEM);
+
+	tmp = kstrdup(name, GFP_KERNEL);
+	if (!tmp) {
+		kfree(extension_details);
+		return ERR_PTR(-ENOMEM);
+	}
+	qstr_init(&extension_details->name, tmp);
+	extension_details->num = extensions_value->num;
+	ret = insert_ext_gid_entry(&extension_details->name, extensions_value->num);
+
+	if (ret) {
+		kfree(extension_details->name.name);
+		kfree(extension_details);
+		return ERR_PTR(ret);
+	}
+	config_item_init_type_name(&extension_details->item, name, &extension_details_type);
+
+	return &extension_details->item;
+}
+
+static struct configfs_group_operations extensions_value_group_ops = {
+	.make_item = extension_details_make_item,
+};
+
+static struct config_item_type extensions_name_type = {
+	.ct_group_ops	= &extensions_value_group_ops,
+	.ct_owner	= THIS_MODULE,
+};
+
+static struct config_group *extensions_make_group(struct config_group *group, const char *name)
+{
+	struct extensions_value *extensions_value;
+	unsigned int tmp;
+	int ret;
+
+	extensions_value = kzalloc(sizeof(struct extensions_value), GFP_KERNEL);
+	if (!extensions_value)
+		return ERR_PTR(-ENOMEM);
+	ret = kstrtouint(name, 10, &tmp);
+	if (ret) {
+		kfree(extensions_value);
+		return ERR_PTR(ret);
+	}
+
+	extensions_value->num = tmp;
+	config_group_init_type_name(&extensions_value->group, name,
+						&extensions_name_type);
+	return &extensions_value->group;
+}
+
+static void extensions_drop_group(struct config_group *group, struct config_item *item)
+{
+	struct extensions_value *value = to_extensions_value(item);
+
+	pr_info("sdcardfs: No longer mapping any files to gid %d\n", value->num);
+	kfree(value);
+}
+
+static struct configfs_group_operations extensions_group_ops = {
+	.make_group	= extensions_make_group,
+	.drop_item	= extensions_drop_group,
+};
+
+static struct config_item_type extensions_type = {
+	.ct_group_ops	= &extensions_group_ops,
+	.ct_owner	= THIS_MODULE,
+};
+
+struct config_group extension_group = {
+	.cg_item = {
+		.ci_namebuf = "extensions",
+		.ci_type = &extensions_type,
+	},
+};
+
+static struct config_item *packages_make_item(struct config_group *group, const char *name)
+{
+	struct package_details *package_details;
+	const char *tmp;
+
+	package_details = kzalloc(sizeof(struct package_details), GFP_KERNEL);
+	if (!package_details)
+		return ERR_PTR(-ENOMEM);
+	tmp = kstrdup(name, GFP_KERNEL);
+	if (!tmp) {
+		kfree(package_details);
+		return ERR_PTR(-ENOMEM);
+	}
+	qstr_init(&package_details->name, tmp);
+	config_item_init_type_name(&package_details->item, name,
+						&package_appid_type);
+
+	return &package_details->item;
+}
+
+static ssize_t packages_list_show(struct config_item *item, char *page)
+{
+	struct hashtable_entry *hash_cur_app;
+	struct hashtable_entry *hash_cur_user;
+	int i;
+	int count = 0, written = 0;
+	const char errormsg[] = "<truncated>\n";
+	unsigned int hash;
+
+	rcu_read_lock();
+	hash_for_each_rcu(package_to_appid, i, hash_cur_app, hlist) {
+		written = scnprintf(page + count, PAGE_SIZE - sizeof(errormsg) - count, "%s %d\n",
+					hash_cur_app->key.name, atomic_read(&hash_cur_app->value));
+		hash = hash_cur_app->key.hash;
+		hash_for_each_possible_rcu(package_to_userid, hash_cur_user, hlist, hash) {
+			if (qstr_case_eq(&hash_cur_app->key, &hash_cur_user->key)) {
+				written += scnprintf(page + count + written - 1,
+					PAGE_SIZE - sizeof(errormsg) - count - written + 1,
+					" %d\n", atomic_read(&hash_cur_user->value)) - 1;
+			}
+		}
+		if (count + written == PAGE_SIZE - sizeof(errormsg) - 1) {
+			count += scnprintf(page + count, PAGE_SIZE - count, errormsg);
+			break;
+		}
+		count += written;
+	}
+	rcu_read_unlock();
+
+	return count;
+}
+
+static ssize_t packages_remove_userid_store(struct config_item *item,
+				       const char *page, size_t count)
+{
+	unsigned int tmp;
+	int ret;
+
+	ret = kstrtouint(page, 10, &tmp);
+	if (ret)
+		return ret;
+	remove_userid_all_entry(tmp);
+	return count;
+}
+
+static struct configfs_attribute packages_attr_packages_gid_list = {
+	.ca_name	= "packages_gid.list",
+	.ca_mode	= S_IRUGO,
+	.ca_owner	= THIS_MODULE,
+	.show		= packages_list_show,
+};
+
+SDCARDFS_CONFIGFS_ATTR_WO(packages_, remove_userid);
+
+static struct configfs_attribute *packages_attrs[] = {
+	&packages_attr_packages_gid_list,
+	&packages_attr_remove_userid,
+	NULL,
+};
+
+/*
+ * Note that, since no extra work is required on ->drop_item(),
+ * no ->drop_item() is provided.
+ */
+static struct configfs_group_operations packages_group_ops = {
+	.make_item	= packages_make_item,
+};
+
+static struct config_item_type packages_type = {
+	.ct_group_ops	= &packages_group_ops,
+	.ct_attrs	= packages_attrs,
+	.ct_owner	= THIS_MODULE,
+};
+
+struct config_group *sd_default_groups[] = {
+	&extension_group,
+	NULL,
+};
+
+static struct configfs_subsystem sdcardfs_packages = {
+	.su_group = {
+		.cg_item = {
+			.ci_namebuf = "sdcardfs",
+			.ci_type = &packages_type,
+		},
+	},
+};
+
+static int configfs_sdcardfs_init(void)
+{
+	int ret, i;
+	struct configfs_subsystem *subsys = &sdcardfs_packages;
+
+	config_group_init(&subsys->su_group);
+	for (i = 0; sd_default_groups[i]; i++) {
+		config_group_init(sd_default_groups[i]);
+		configfs_add_default_group(sd_default_groups[i], &subsys->su_group);
+	}
+	mutex_init(&subsys->su_mutex);
+	ret = configfs_register_subsystem(subsys);
+	if (ret) {
+		pr_err("Error %d while registering subsystem %s\n",
+		       ret,
+		       subsys->su_group.cg_item.ci_namebuf);
+	}
+	return ret;
+}
+
+static void configfs_sdcardfs_exit(void)
+{
+	configfs_unregister_subsystem(&sdcardfs_packages);
+}
+
+int packagelist_init(void)
+{
+	hashtable_entry_cachep =
+		kmem_cache_create("packagelist_hashtable_entry",
+					sizeof(struct hashtable_entry), 0, 0, NULL);
+	if (!hashtable_entry_cachep) {
+		pr_err("sdcardfs: failed creating pkgl_hashtable entry slab cache\n");
+		return -ENOMEM;
+	}
+
+	configfs_sdcardfs_init();
+	return 0;
+}
+
+void packagelist_exit(void)
+{
+	configfs_sdcardfs_exit();
+	packagelist_destroy();
+	kmem_cache_destroy(hashtable_entry_cachep);
+}
diff --git a/fs/sdcardfs/sdcardfs.h b/fs/sdcardfs/sdcardfs.h
new file mode 100644
index 0000000..401445e
--- /dev/null
+++ b/fs/sdcardfs/sdcardfs.h
@@ -0,0 +1,658 @@
+/*
+ * fs/sdcardfs/sdcardfs.h
+ *
+ * The sdcardfs v2.0
+ *   This file system replaces the sdcard daemon on Android
+ *   On version 2.0, some of the daemon functions have been ported
+ *   to support the multi-user concepts of Android 4.4
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#ifndef _SDCARDFS_H_
+#define _SDCARDFS_H_
+
+#include <linux/dcache.h>
+#include <linux/file.h>
+#include <linux/fs.h>
+#include <linux/aio.h>
+#include <linux/kref.h>
+#include <linux/mm.h>
+#include <linux/mount.h>
+#include <linux/namei.h>
+#include <linux/seq_file.h>
+#include <linux/statfs.h>
+#include <linux/fs_stack.h>
+#include <linux/magic.h>
+#include <linux/uaccess.h>
+#include <linux/slab.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/security.h>
+#include <linux/string.h>
+#include <linux/list.h>
+#include <linux/iversion.h>
+#include "multiuser.h"
+
+/* the file system name */
+#define SDCARDFS_NAME "sdcardfs"
+
+/* sdcardfs root inode number */
+#define SDCARDFS_ROOT_INO     1
+
+/* useful for tracking code reachability */
+#define UDBG pr_default("DBG:%s:%s:%d\n", __FILE__, __func__, __LINE__)
+
+#define SDCARDFS_DIRENT_SIZE 256
+
+/* temporary static uid settings for development */
+#define AID_ROOT             0	/* uid for accessing /mnt/sdcard & extSdcard */
+#define AID_MEDIA_RW      1023	/* internal media storage write access */
+
+#define AID_SDCARD_RW     1015	/* external storage write access */
+#define AID_SDCARD_R      1028	/* external storage read access */
+#define AID_SDCARD_PICS   1033	/* external storage photos access */
+#define AID_SDCARD_AV     1034	/* external storage audio/video access */
+#define AID_SDCARD_ALL    1035	/* access all users external storage */
+#define AID_MEDIA_OBB     1059  /* obb files */
+
+#define AID_SDCARD_IMAGE  1057
+
+#define AID_PACKAGE_INFO  1027
+
+
+/*
+ * Permissions are handled by our permission function.
+ * We don't want anyone who happens to look at our inode value to prematurely
+ * block access, so store more permissive values. These are probably never
+ * used.
+ */
+#define fixup_tmp_permissions(x)	\
+	do {						\
+		(x)->i_uid = make_kuid(&init_user_ns,	\
+				SDCARDFS_I(x)->data->d_uid);	\
+		(x)->i_gid = make_kgid(&init_user_ns, AID_SDCARD_RW);	\
+		(x)->i_mode = ((x)->i_mode & S_IFMT) | 0775;\
+	} while (0)
+
+/* Android 5.0 support */
+
+/* Permission mode for a specific node. Controls how file permissions
+ * are derived for children nodes.
+ */
+typedef enum {
+	/* Nothing special; this node should just inherit from its parent. */
+	PERM_INHERIT,
+	/* This node is one level above a normal root; used for legacy layouts
+	 * which use the first level to represent user_id.
+	 */
+	PERM_PRE_ROOT,
+	/* This node is "/" */
+	PERM_ROOT,
+	/* This node is "/Android" */
+	PERM_ANDROID,
+	/* This node is "/Android/data" */
+	PERM_ANDROID_DATA,
+	/* This node is "/Android/obb" */
+	PERM_ANDROID_OBB,
+	/* This node is "/Android/media" */
+	PERM_ANDROID_MEDIA,
+	/* This node is "/Android/[data|media|obb]/[package]" */
+	PERM_ANDROID_PACKAGE,
+	/* This node is "/Android/[data|media|obb]/[package]/cache" */
+	PERM_ANDROID_PACKAGE_CACHE,
+} perm_t;
+
+struct sdcardfs_sb_info;
+struct sdcardfs_mount_options;
+struct sdcardfs_inode_info;
+struct sdcardfs_inode_data;
+
+/* Do not directly use this function. Use OVERRIDE_CRED() instead. */
+const struct cred *override_fsids(struct sdcardfs_sb_info *sbi,
+			struct sdcardfs_inode_data *data);
+/* Do not directly use this function, use REVERT_CRED() instead. */
+void revert_fsids(const struct cred *old_cred);
+
+/* operations vectors defined in specific files */
+extern const struct file_operations sdcardfs_main_fops;
+extern const struct file_operations sdcardfs_dir_fops;
+extern const struct inode_operations sdcardfs_main_iops;
+extern const struct inode_operations sdcardfs_dir_iops;
+extern const struct inode_operations sdcardfs_symlink_iops;
+extern const struct super_operations sdcardfs_sops;
+extern const struct dentry_operations sdcardfs_ci_dops;
+extern const struct address_space_operations sdcardfs_aops, sdcardfs_dummy_aops;
+extern const struct vm_operations_struct sdcardfs_vm_ops;
+
+extern int sdcardfs_init_inode_cache(void);
+extern void sdcardfs_destroy_inode_cache(void);
+extern int sdcardfs_init_dentry_cache(void);
+extern void sdcardfs_destroy_dentry_cache(void);
+extern int new_dentry_private_data(struct dentry *dentry);
+extern void free_dentry_private_data(struct dentry *dentry);
+extern struct dentry *sdcardfs_lookup(struct inode *dir, struct dentry *dentry,
+				unsigned int flags);
+extern struct inode *sdcardfs_iget(struct super_block *sb,
+				 struct inode *lower_inode, userid_t id);
+extern int sdcardfs_interpose(struct dentry *dentry, struct super_block *sb,
+			    struct path *lower_path, userid_t id);
+extern int sdcardfs_on_fscrypt_key_removed(struct notifier_block *nb,
+					   unsigned long action, void *data);
+
+/* file private data */
+struct sdcardfs_file_info {
+	struct file *lower_file;
+	const struct vm_operations_struct *lower_vm_ops;
+};
+
+struct sdcardfs_inode_data {
+	struct kref refcount;
+	bool abandoned;
+
+	perm_t perm;
+	userid_t userid;
+	uid_t d_uid;
+	bool under_android;
+	bool under_cache;
+	bool under_obb;
+};
+
+/* sdcardfs inode data in memory */
+struct sdcardfs_inode_info {
+	struct inode *lower_inode;
+	/* state derived based on current position in hierarchy */
+	struct sdcardfs_inode_data *data;
+
+	/* top folder for ownership */
+	spinlock_t top_lock;
+	struct sdcardfs_inode_data *top_data;
+
+	struct inode vfs_inode;
+};
+
+
+/* sdcardfs dentry data in memory */
+struct sdcardfs_dentry_info {
+	spinlock_t lock;	/* protects lower_path */
+	struct path lower_path;
+	struct path orig_path;
+};
+
+struct sdcardfs_mount_options {
+	uid_t fs_low_uid;
+	gid_t fs_low_gid;
+	userid_t fs_user_id;
+	bool multiuser;
+	bool gid_derivation;
+	bool default_normal;
+	bool unshared_obb;
+	unsigned int reserved_mb;
+	bool nocache;
+};
+
+struct sdcardfs_vfsmount_options {
+	gid_t gid;
+	mode_t mask;
+};
+
+extern int parse_options_remount(struct super_block *sb, char *options, int silent,
+		struct sdcardfs_vfsmount_options *vfsopts);
+
+/* sdcardfs super-block data in memory */
+struct sdcardfs_sb_info {
+	struct super_block *sb;
+	struct super_block *lower_sb;
+	/* derived perm policy : some of options have been added
+	 * to sdcardfs_mount_options (Android 4.4 support)
+	 */
+	struct sdcardfs_mount_options options;
+	spinlock_t lock;	/* protects obbpath */
+	char *obbpath_s;
+	struct path obbpath;
+	void *pkgl_id;
+	struct list_head list;
+	struct notifier_block fscrypt_nb;
+};
+
+/*
+ * inode to private data
+ *
+ * Since we use containers and the struct inode is _inside_ the
+ * sdcardfs_inode_info structure, SDCARDFS_I will always (given a non-NULL
+ * inode pointer), return a valid non-NULL pointer.
+ */
+static inline struct sdcardfs_inode_info *SDCARDFS_I(const struct inode *inode)
+{
+	return container_of(inode, struct sdcardfs_inode_info, vfs_inode);
+}
+
+/* dentry to private data */
+#define SDCARDFS_D(dent) ((struct sdcardfs_dentry_info *)(dent)->d_fsdata)
+
+/* superblock to private data */
+#define SDCARDFS_SB(super) ((struct sdcardfs_sb_info *)(super)->s_fs_info)
+
+/* file to private Data */
+#define SDCARDFS_F(file) ((struct sdcardfs_file_info *)((file)->private_data))
+
+/* file to lower file */
+static inline struct file *sdcardfs_lower_file(const struct file *f)
+{
+	return SDCARDFS_F(f)->lower_file;
+}
+
+static inline void sdcardfs_set_lower_file(struct file *f, struct file *val)
+{
+	SDCARDFS_F(f)->lower_file = val;
+}
+
+/* inode to lower inode. */
+static inline struct inode *sdcardfs_lower_inode(const struct inode *i)
+{
+	return SDCARDFS_I(i)->lower_inode;
+}
+
+static inline void sdcardfs_set_lower_inode(struct inode *i, struct inode *val)
+{
+	SDCARDFS_I(i)->lower_inode = val;
+}
+
+/* superblock to lower superblock */
+static inline struct super_block *sdcardfs_lower_super(
+	const struct super_block *sb)
+{
+	return SDCARDFS_SB(sb)->lower_sb;
+}
+
+static inline void sdcardfs_set_lower_super(struct super_block *sb,
+					  struct super_block *val)
+{
+	SDCARDFS_SB(sb)->lower_sb = val;
+}
+
+/* path based (dentry/mnt) macros */
+static inline void pathcpy(struct path *dst, const struct path *src)
+{
+	dst->dentry = src->dentry;
+	dst->mnt = src->mnt;
+}
+
+/* sdcardfs_get_pname functions calls path_get()
+ * therefore, the caller must call "proper" path_put functions
+ */
+#define SDCARDFS_DENT_FUNC(pname) \
+static inline void sdcardfs_get_##pname(const struct dentry *dent, \
+					struct path *pname) \
+{ \
+	spin_lock(&SDCARDFS_D(dent)->lock); \
+	pathcpy(pname, &SDCARDFS_D(dent)->pname); \
+	path_get(pname); \
+	spin_unlock(&SDCARDFS_D(dent)->lock); \
+	return; \
+} \
+static inline void sdcardfs_put_##pname(const struct dentry *dent, \
+					struct path *pname) \
+{ \
+	path_put(pname); \
+	return; \
+} \
+static inline void sdcardfs_set_##pname(const struct dentry *dent, \
+					struct path *pname) \
+{ \
+	spin_lock(&SDCARDFS_D(dent)->lock); \
+	pathcpy(&SDCARDFS_D(dent)->pname, pname); \
+	spin_unlock(&SDCARDFS_D(dent)->lock); \
+	return; \
+} \
+static inline void sdcardfs_reset_##pname(const struct dentry *dent) \
+{ \
+	spin_lock(&SDCARDFS_D(dent)->lock); \
+	SDCARDFS_D(dent)->pname.dentry = NULL; \
+	SDCARDFS_D(dent)->pname.mnt = NULL; \
+	spin_unlock(&SDCARDFS_D(dent)->lock); \
+	return; \
+} \
+static inline void sdcardfs_put_reset_##pname(const struct dentry *dent) \
+{ \
+	struct path pname; \
+	spin_lock(&SDCARDFS_D(dent)->lock); \
+	if (SDCARDFS_D(dent)->pname.dentry) { \
+		pathcpy(&pname, &SDCARDFS_D(dent)->pname); \
+		SDCARDFS_D(dent)->pname.dentry = NULL; \
+		SDCARDFS_D(dent)->pname.mnt = NULL; \
+		spin_unlock(&SDCARDFS_D(dent)->lock); \
+		path_put(&pname); \
+	} else \
+		spin_unlock(&SDCARDFS_D(dent)->lock); \
+	return; \
+}
+
+SDCARDFS_DENT_FUNC(lower_path)
+SDCARDFS_DENT_FUNC(orig_path)
+
+static inline bool sbinfo_has_sdcard_magic(struct sdcardfs_sb_info *sbinfo)
+{
+	return sbinfo && sbinfo->sb
+			&& sbinfo->sb->s_magic == SDCARDFS_SUPER_MAGIC;
+}
+
+static inline struct sdcardfs_inode_data *data_get(
+		struct sdcardfs_inode_data *data)
+{
+	if (data)
+		kref_get(&data->refcount);
+	return data;
+}
+
+static inline struct sdcardfs_inode_data *top_data_get(
+		struct sdcardfs_inode_info *info)
+{
+	struct sdcardfs_inode_data *top_data;
+
+	spin_lock(&info->top_lock);
+	top_data = data_get(info->top_data);
+	spin_unlock(&info->top_lock);
+	return top_data;
+}
+
+extern void data_release(struct kref *ref);
+
+static inline void data_put(struct sdcardfs_inode_data *data)
+{
+	kref_put(&data->refcount, data_release);
+}
+
+static inline void release_own_data(struct sdcardfs_inode_info *info)
+{
+	/*
+	 * This happens exactly once per inode. At this point, the inode that
+	 * originally held this data is about to be freed, and all references
+	 * to it are held as a top value, and will likely be released soon.
+	 */
+	info->data->abandoned = true;
+	data_put(info->data);
+}
+
+static inline void set_top(struct sdcardfs_inode_info *info,
+			struct sdcardfs_inode_info *top_owner)
+{
+	struct sdcardfs_inode_data *old_top;
+	struct sdcardfs_inode_data *new_top = NULL;
+
+	if (top_owner)
+		new_top = top_data_get(top_owner);
+
+	spin_lock(&info->top_lock);
+	old_top = info->top_data;
+	info->top_data = new_top;
+	if (old_top)
+		data_put(old_top);
+	spin_unlock(&info->top_lock);
+}
+
+static inline int get_gid(struct vfsmount *mnt,
+		struct super_block *sb,
+		struct sdcardfs_inode_data *data)
+{
+	struct sdcardfs_vfsmount_options *vfsopts = mnt->data;
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(sb);
+
+	if (vfsopts->gid == AID_SDCARD_RW && !sbi->options.default_normal)
+		/* As an optimization, certain trusted system components only run
+		 * as owner but operate across all users. Since we're now handing
+		 * out the sdcard_rw GID only to trusted apps, we're okay relaxing
+		 * the user boundary enforcement for the default view. The UIDs
+		 * assigned to app directories are still multiuser aware.
+		 */
+		return AID_SDCARD_RW;
+	else
+		return multiuser_get_uid(data->userid, vfsopts->gid);
+}
+
+static inline int get_mode(struct vfsmount *mnt,
+		struct sdcardfs_inode_info *info,
+		struct sdcardfs_inode_data *data)
+{
+	int owner_mode;
+	int filtered_mode;
+	struct sdcardfs_vfsmount_options *opts = mnt->data;
+	int visible_mode = 0775 & ~opts->mask;
+
+
+	if (data->perm == PERM_PRE_ROOT) {
+		/* Top of multi-user view should always be visible to ensure
+		* secondary users can traverse inside.
+		*/
+		visible_mode = 0711;
+	} else if (data->under_android) {
+		/* Block "other" access to Android directories, since only apps
+		* belonging to a specific user should be in there; we still
+		* leave +x open for the default view.
+		*/
+		if (opts->gid == AID_SDCARD_RW)
+			visible_mode = visible_mode & ~0006;
+		else
+			visible_mode = visible_mode & ~0007;
+	}
+	owner_mode = info->lower_inode->i_mode & 0700;
+	filtered_mode = visible_mode & (owner_mode | (owner_mode >> 3) | (owner_mode >> 6));
+	return filtered_mode;
+}
+
+static inline int has_graft_path(const struct dentry *dent)
+{
+	int ret = 0;
+
+	spin_lock(&SDCARDFS_D(dent)->lock);
+	if (SDCARDFS_D(dent)->orig_path.dentry != NULL)
+		ret = 1;
+	spin_unlock(&SDCARDFS_D(dent)->lock);
+
+	return ret;
+}
+
+static inline void sdcardfs_get_real_lower(const struct dentry *dent,
+						struct path *real_lower)
+{
+	/* in case of a local obb dentry
+	 * the orig_path should be returned
+	 */
+	if (has_graft_path(dent))
+		sdcardfs_get_orig_path(dent, real_lower);
+	else
+		sdcardfs_get_lower_path(dent, real_lower);
+}
+
+static inline void sdcardfs_put_real_lower(const struct dentry *dent,
+						struct path *real_lower)
+{
+	if (has_graft_path(dent))
+		sdcardfs_put_orig_path(dent, real_lower);
+	else
+		sdcardfs_put_lower_path(dent, real_lower);
+}
+
+extern struct mutex sdcardfs_super_list_lock;
+extern struct list_head sdcardfs_super_list;
+
+/* for packagelist.c */
+extern appid_t get_appid(const char *app_name);
+extern appid_t get_ext_gid(const char *app_name);
+extern appid_t is_excluded(const char *app_name, userid_t userid);
+extern int check_caller_access_to_name(struct inode *parent_node, const struct qstr *name);
+extern int packagelist_init(void);
+extern void packagelist_exit(void);
+
+/* for derived_perm.c */
+#define BY_NAME		(1 << 0)
+#define BY_USERID	(1 << 1)
+struct limit_search {
+	unsigned int flags;
+	struct qstr name;
+	userid_t userid;
+};
+
+extern void setup_derived_state(struct inode *inode, perm_t perm,
+			userid_t userid, uid_t uid);
+extern void get_derived_permission(struct dentry *parent, struct dentry *dentry);
+extern void get_derived_permission_new(struct dentry *parent, struct dentry *dentry, const struct qstr *name);
+extern void fixup_perms_recursive(struct dentry *dentry, struct limit_search *limit);
+
+extern void update_derived_permission_lock(struct dentry *dentry);
+void fixup_lower_ownership(struct dentry *dentry, const char *name);
+extern int need_graft_path(struct dentry *dentry);
+extern int is_base_obbpath(struct dentry *dentry);
+extern int is_obbpath_invalid(struct dentry *dentry);
+extern int setup_obb_dentry(struct dentry *dentry, struct path *lower_path);
+
+/* locking helpers */
+static inline struct dentry *lock_parent(struct dentry *dentry)
+{
+	struct dentry *dir = dget_parent(dentry);
+
+	inode_lock_nested(d_inode(dir), I_MUTEX_PARENT);
+	return dir;
+}
+
+static inline void unlock_dir(struct dentry *dir)
+{
+	inode_unlock(d_inode(dir));
+	dput(dir);
+}
+
+static inline int prepare_dir(const char *path_s, uid_t uid, gid_t gid, mode_t mode)
+{
+	int err;
+	struct dentry *dent;
+	struct iattr attrs;
+	struct path parent;
+
+	dent = kern_path_locked(path_s, &parent);
+	if (IS_ERR(dent)) {
+		err = PTR_ERR(dent);
+		if (err == -EEXIST)
+			err = 0;
+		goto out_unlock;
+	}
+
+	err = vfs_mkdir2(parent.mnt, d_inode(parent.dentry), dent, mode);
+	if (err) {
+		if (err == -EEXIST)
+			err = 0;
+		goto out_dput;
+	}
+
+	attrs.ia_uid = make_kuid(&init_user_ns, uid);
+	attrs.ia_gid = make_kgid(&init_user_ns, gid);
+	attrs.ia_valid = ATTR_UID | ATTR_GID;
+	inode_lock(d_inode(dent));
+	notify_change2(parent.mnt, dent, &attrs, NULL);
+	inode_unlock(d_inode(dent));
+
+out_dput:
+	dput(dent);
+
+out_unlock:
+	/* parent dentry locked by lookup_create */
+	inode_unlock(d_inode(parent.dentry));
+	path_put(&parent);
+	return err;
+}
+
+/*
+ * Return 1, if a disk has enough free space, otherwise 0.
+ * We assume that any files can not be overwritten.
+ */
+static inline int check_min_free_space(struct dentry *dentry, size_t size, int dir)
+{
+	int err;
+	struct path lower_path;
+	struct kstatfs statfs;
+	u64 avail;
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
+
+	if (sbi->options.reserved_mb) {
+		/* Get fs stat of lower filesystem. */
+		sdcardfs_get_lower_path(dentry, &lower_path);
+		err = vfs_statfs(&lower_path, &statfs);
+		sdcardfs_put_lower_path(dentry, &lower_path);
+
+		if (unlikely(err))
+			return 0;
+
+		/* Invalid statfs informations. */
+		if (unlikely(statfs.f_bsize == 0))
+			return 0;
+
+		/* if you are checking directory, set size to f_bsize. */
+		if (unlikely(dir))
+			size = statfs.f_bsize;
+
+		/* available size */
+		avail = statfs.f_bavail * statfs.f_bsize;
+
+		/* not enough space */
+		if ((u64)size > avail)
+			return 0;
+
+		/* enough space */
+		if ((avail - size) > (sbi->options.reserved_mb * 1024 * 1024))
+			return 1;
+
+		return 0;
+	} else
+		return 1;
+}
+
+/*
+ * Copies attrs and maintains sdcardfs managed attrs
+ * Since our permission check handles all special permissions, set those to be open
+ */
+static inline void sdcardfs_copy_and_fix_attrs(struct inode *dest, const struct inode *src)
+{
+	dest->i_mode = (src->i_mode  & S_IFMT) | S_IRWXU | S_IRWXG |
+			S_IROTH | S_IXOTH; /* 0775 */
+	dest->i_uid = make_kuid(&init_user_ns, SDCARDFS_I(dest)->data->d_uid);
+	dest->i_gid = make_kgid(&init_user_ns, AID_SDCARD_RW);
+	dest->i_rdev = src->i_rdev;
+	dest->i_atime = src->i_atime;
+	dest->i_mtime = src->i_mtime;
+	dest->i_ctime = src->i_ctime;
+	dest->i_blkbits = src->i_blkbits;
+	dest->i_flags = src->i_flags;
+	set_nlink(dest, src->i_nlink);
+}
+
+static inline bool str_case_eq(const char *s1, const char *s2)
+{
+	return !strcasecmp(s1, s2);
+}
+
+static inline bool str_n_case_eq(const char *s1, const char *s2, size_t len)
+{
+	return !strncasecmp(s1, s2, len);
+}
+
+static inline bool qstr_case_eq(const struct qstr *q1, const struct qstr *q2)
+{
+	return q1->len == q2->len && str_n_case_eq(q1->name, q2->name, q2->len);
+}
+
+#define QSTR_LITERAL(string) QSTR_INIT(string, sizeof(string)-1)
+
+#endif	/* not _SDCARDFS_H_ */
diff --git a/fs/sdcardfs/super.c b/fs/sdcardfs/super.c
new file mode 100644
index 0000000..b2ba09a
--- /dev/null
+++ b/fs/sdcardfs/super.c
@@ -0,0 +1,352 @@
+/*
+ * fs/sdcardfs/super.c
+ *
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd
+ *   Authors: Daeho Jeong, Woojoong Lee, Seunghwan Hyun,
+ *               Sunghwan Yun, Sungjong Seo
+ *
+ * This program has been developed as a stackable file system based on
+ * the WrapFS which written by
+ *
+ * Copyright (c) 1998-2011 Erez Zadok
+ * Copyright (c) 2009     Shrikar Archak
+ * Copyright (c) 2003-2011 Stony Brook University
+ * Copyright (c) 2003-2011 The Research Foundation of SUNY
+ *
+ * This file is dual licensed.  It may be redistributed and/or modified
+ * under the terms of the Apache 2.0 License OR version 2 of the GNU
+ * General Public License.
+ */
+
+#include "sdcardfs.h"
+
+/*
+ * The inode cache is used with alloc_inode for both our inode info and the
+ * vfs inode.
+ */
+static struct kmem_cache *sdcardfs_inode_cachep;
+
+/*
+ * To support the top references, we must track some data separately.
+ * An sdcardfs_inode_info always has a reference to its data, and once set up,
+ * also has a reference to its top. The top may be itself, in which case it
+ * holds two references to its data. When top is changed, it takes a ref to the
+ * new data and then drops the ref to the old data.
+ */
+static struct kmem_cache *sdcardfs_inode_data_cachep;
+
+void data_release(struct kref *ref)
+{
+	struct sdcardfs_inode_data *data =
+		container_of(ref, struct sdcardfs_inode_data, refcount);
+
+	kmem_cache_free(sdcardfs_inode_data_cachep, data);
+}
+
+/* final actions when unmounting a file system */
+static void sdcardfs_put_super(struct super_block *sb)
+{
+	struct sdcardfs_sb_info *spd;
+	struct super_block *s;
+
+	spd = SDCARDFS_SB(sb);
+	if (!spd)
+		return;
+
+	if (spd->obbpath_s) {
+		kfree(spd->obbpath_s);
+		path_put(&spd->obbpath);
+	}
+
+	/* decrement lower super references */
+	s = sdcardfs_lower_super(sb);
+	sdcardfs_set_lower_super(sb, NULL);
+	atomic_dec(&s->s_active);
+
+	kfree(spd);
+	sb->s_fs_info = NULL;
+}
+
+static int sdcardfs_statfs(struct dentry *dentry, struct kstatfs *buf)
+{
+	int err;
+	struct path lower_path;
+	u32 min_blocks;
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
+
+	sdcardfs_get_lower_path(dentry, &lower_path);
+	err = vfs_statfs(&lower_path, buf);
+	sdcardfs_put_lower_path(dentry, &lower_path);
+
+	if (sbi->options.reserved_mb) {
+		/* Invalid statfs informations. */
+		if (buf->f_bsize == 0) {
+			pr_err("Returned block size is zero.\n");
+			return -EINVAL;
+		}
+
+		min_blocks = ((sbi->options.reserved_mb * 1024 * 1024)/buf->f_bsize);
+		buf->f_blocks -= min_blocks;
+
+		if (buf->f_bavail > min_blocks)
+			buf->f_bavail -= min_blocks;
+		else
+			buf->f_bavail = 0;
+
+		/* Make reserved blocks invisiable to media storage */
+		buf->f_bfree = buf->f_bavail;
+	}
+
+	/* set return buf to our f/s to avoid confusing user-level utils */
+	buf->f_type = SDCARDFS_SUPER_MAGIC;
+
+	return err;
+}
+
+/*
+ * @flags: numeric mount options
+ * @options: mount options string
+ */
+static int sdcardfs_remount_fs(struct super_block *sb, int *flags, char *options)
+{
+	int err = 0;
+
+	/*
+	 * The VFS will take care of "ro" and "rw" flags among others.  We
+	 * can safely accept a few flags (RDONLY, MANDLOCK), and honor
+	 * SILENT, but anything else left over is an error.
+	 */
+	if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT)) != 0) {
+		pr_err("sdcardfs: remount flags 0x%x unsupported\n", *flags);
+		err = -EINVAL;
+	}
+
+	return err;
+}
+
+/*
+ * @mnt: mount point we are remounting
+ * @sb: superblock we are remounting
+ * @flags: numeric mount options
+ * @options: mount options string
+ */
+static int sdcardfs_remount_fs2(struct vfsmount *mnt, struct super_block *sb,
+						int *flags, char *options)
+{
+	int err = 0;
+
+	/*
+	 * The VFS will take care of "ro" and "rw" flags among others.  We
+	 * can safely accept a few flags (RDONLY, MANDLOCK), and honor
+	 * SILENT, but anything else left over is an error.
+	 */
+	if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT | MS_REMOUNT)) != 0) {
+		pr_err("sdcardfs: remount flags 0x%x unsupported\n", *flags);
+		err = -EINVAL;
+	}
+	pr_info("Remount options were %s for vfsmnt %p.\n", options, mnt);
+	err = parse_options_remount(sb, options, *flags & ~MS_SILENT, mnt->data);
+
+
+	return err;
+}
+
+static void *sdcardfs_clone_mnt_data(void *data)
+{
+	struct sdcardfs_vfsmount_options *opt = kmalloc(sizeof(struct sdcardfs_vfsmount_options), GFP_KERNEL);
+	struct sdcardfs_vfsmount_options *old = data;
+
+	if (!opt)
+		return NULL;
+	opt->gid = old->gid;
+	opt->mask = old->mask;
+	return opt;
+}
+
+static void sdcardfs_copy_mnt_data(void *data, void *newdata)
+{
+	struct sdcardfs_vfsmount_options *old = data;
+	struct sdcardfs_vfsmount_options *new = newdata;
+
+	old->gid = new->gid;
+	old->mask = new->mask;
+}
+
+/*
+ * Called by iput() when the inode reference count reached zero
+ * and the inode is not hashed anywhere.  Used to clear anything
+ * that needs to be, before the inode is completely destroyed and put
+ * on the inode free list.
+ */
+static void sdcardfs_evict_inode(struct inode *inode)
+{
+	struct inode *lower_inode;
+
+	truncate_inode_pages(&inode->i_data, 0);
+	set_top(SDCARDFS_I(inode), NULL);
+	clear_inode(inode);
+	/*
+	 * Decrement a reference to a lower_inode, which was incremented
+	 * by our read_inode when it was created initially.
+	 */
+	lower_inode = sdcardfs_lower_inode(inode);
+	sdcardfs_set_lower_inode(inode, NULL);
+	iput(lower_inode);
+}
+
+static struct inode *sdcardfs_alloc_inode(struct super_block *sb)
+{
+	struct sdcardfs_inode_info *i;
+	struct sdcardfs_inode_data *d;
+
+	i = kmem_cache_alloc(sdcardfs_inode_cachep, GFP_KERNEL);
+	if (!i)
+		return NULL;
+
+	/* memset everything up to the inode to 0 */
+	memset(i, 0, offsetof(struct sdcardfs_inode_info, vfs_inode));
+
+	d = kmem_cache_alloc(sdcardfs_inode_data_cachep,
+					GFP_KERNEL | __GFP_ZERO);
+	if (!d) {
+		kmem_cache_free(sdcardfs_inode_cachep, i);
+		return NULL;
+	}
+
+	i->data = d;
+	kref_init(&d->refcount);
+	i->top_data = d;
+	spin_lock_init(&i->top_lock);
+	kref_get(&d->refcount);
+
+	inode_set_iversion(&i->vfs_inode, 1);
+	return &i->vfs_inode;
+}
+
+static void i_callback(struct rcu_head *head)
+{
+	struct inode *inode = container_of(head, struct inode, i_rcu);
+
+	release_own_data(SDCARDFS_I(inode));
+	kmem_cache_free(sdcardfs_inode_cachep, SDCARDFS_I(inode));
+}
+
+static void sdcardfs_destroy_inode(struct inode *inode)
+{
+	call_rcu(&inode->i_rcu, i_callback);
+}
+
+/* sdcardfs inode cache constructor */
+static void init_once(void *obj)
+{
+	struct sdcardfs_inode_info *i = obj;
+
+	inode_init_once(&i->vfs_inode);
+}
+
+int sdcardfs_init_inode_cache(void)
+{
+	sdcardfs_inode_cachep =
+		kmem_cache_create("sdcardfs_inode_cache",
+				  sizeof(struct sdcardfs_inode_info), 0,
+				  SLAB_RECLAIM_ACCOUNT, init_once);
+
+	if (!sdcardfs_inode_cachep)
+		return -ENOMEM;
+
+	sdcardfs_inode_data_cachep =
+		kmem_cache_create("sdcardfs_inode_data_cache",
+				  sizeof(struct sdcardfs_inode_data), 0,
+				  SLAB_RECLAIM_ACCOUNT, NULL);
+	if (!sdcardfs_inode_data_cachep) {
+		kmem_cache_destroy(sdcardfs_inode_cachep);
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
+/* sdcardfs inode cache destructor */
+void sdcardfs_destroy_inode_cache(void)
+{
+	kmem_cache_destroy(sdcardfs_inode_data_cachep);
+	kmem_cache_destroy(sdcardfs_inode_cachep);
+}
+
+/*
+ * Used only in nfs, to kill any pending RPC tasks, so that subsequent
+ * code can actually succeed and won't leave tasks that need handling.
+ */
+static void sdcardfs_umount_begin(struct super_block *sb)
+{
+	struct super_block *lower_sb;
+
+	lower_sb = sdcardfs_lower_super(sb);
+	if (lower_sb && lower_sb->s_op && lower_sb->s_op->umount_begin)
+		lower_sb->s_op->umount_begin(lower_sb);
+}
+
+static int sdcardfs_show_options(struct vfsmount *mnt, struct seq_file *m,
+			struct dentry *root)
+{
+	struct sdcardfs_sb_info *sbi = SDCARDFS_SB(root->d_sb);
+	struct sdcardfs_mount_options *opts = &sbi->options;
+	struct sdcardfs_vfsmount_options *vfsopts = mnt->data;
+
+	if (opts->fs_low_uid != 0)
+		seq_printf(m, ",fsuid=%u", opts->fs_low_uid);
+	if (opts->fs_low_gid != 0)
+		seq_printf(m, ",fsgid=%u", opts->fs_low_gid);
+	if (vfsopts->gid != 0)
+		seq_printf(m, ",gid=%u", vfsopts->gid);
+	if (opts->multiuser)
+		seq_puts(m, ",multiuser");
+	if (vfsopts->mask)
+		seq_printf(m, ",mask=%u", vfsopts->mask);
+	if (opts->fs_user_id)
+		seq_printf(m, ",userid=%u", opts->fs_user_id);
+	if (opts->gid_derivation)
+		seq_puts(m, ",derive_gid");
+	if (opts->default_normal)
+		seq_puts(m, ",default_normal");
+	if (opts->reserved_mb != 0)
+		seq_printf(m, ",reserved=%uMB", opts->reserved_mb);
+	if (opts->nocache)
+		seq_printf(m, ",nocache");
+	if (opts->unshared_obb)
+		seq_printf(m, ",unshared_obb");
+
+	return 0;
+};
+
+int sdcardfs_on_fscrypt_key_removed(struct notifier_block *nb,
+				    unsigned long action, void *data)
+{
+	struct sdcardfs_sb_info *sbi = container_of(nb, struct sdcardfs_sb_info,
+						    fscrypt_nb);
+
+	/*
+	 * Evict any unused sdcardfs dentries (and hence any unused sdcardfs
+	 * inodes, since sdcardfs doesn't cache unpinned inodes by themselves)
+	 * so that the lower filesystem's encrypted inodes can be evicted.
+	 * This is needed to make the FS_IOC_REMOVE_ENCRYPTION_KEY ioctl
+	 * properly "lock" the files underneath the sdcardfs mount.
+	 */
+	shrink_dcache_sb(sbi->sb);
+	return NOTIFY_OK;
+}
+
+const struct super_operations sdcardfs_sops = {
+	.put_super	= sdcardfs_put_super,
+	.statfs		= sdcardfs_statfs,
+	.remount_fs	= sdcardfs_remount_fs,
+	.remount_fs2	= sdcardfs_remount_fs2,
+	.clone_mnt_data	= sdcardfs_clone_mnt_data,
+	.copy_mnt_data	= sdcardfs_copy_mnt_data,
+	.evict_inode	= sdcardfs_evict_inode,
+	.umount_begin	= sdcardfs_umount_begin,
+	.show_options2	= sdcardfs_show_options,
+	.alloc_inode	= sdcardfs_alloc_inode,
+	.destroy_inode	= sdcardfs_destroy_inode,
+	.drop_inode	= generic_delete_inode,
+};
diff --git a/fs/super.c b/fs/super.c
index f3a8c00..bc62a37 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -32,6 +32,7 @@
 #include <linux/backing-dev.h>
 #include <linux/rculist_bl.h>
 #include <linux/cleancache.h>
+#include <linux/fscrypt.h>
 #include <linux/fsnotify.h>
 #include <linux/lockdep.h>
 #include <linux/user_namespace.h>
@@ -288,6 +289,7 @@
 		WARN_ON(s->s_inode_lru.node);
 		WARN_ON(!list_empty(&s->s_mounts));
 		security_sb_free(s);
+		fscrypt_sb_free(s);
 		put_user_ns(s->s_user_ns);
 		kfree(s->s_subtype);
 		call_rcu(&s->rcu, destroy_super_rcu);
@@ -834,7 +836,8 @@
 }
 
 /**
- *	do_remount_sb - asks filesystem to change mount options.
+ *	do_remount_sb2 - asks filesystem to change mount options.
+ *	@mnt:   mount we are looking at
  *	@sb:	superblock in question
  *	@sb_flags: revised superblock flags
  *	@data:	the rest of options
@@ -842,7 +845,7 @@
  *
  *	Alters the mount options of a mounted file system.
  */
-int do_remount_sb(struct super_block *sb, int sb_flags, void *data, int force)
+int do_remount_sb2(struct vfsmount *mnt, struct super_block *sb, int sb_flags, void *data, int force)
 {
 	int retval;
 	int remount_ro;
@@ -884,7 +887,16 @@
 		}
 	}
 
-	if (sb->s_op->remount_fs) {
+	if (mnt && sb->s_op->remount_fs2) {
+		retval = sb->s_op->remount_fs2(mnt, sb, &sb_flags, data);
+		if (retval) {
+			if (!force)
+				goto cancel_readonly;
+			/* If forced remount, go ahead despite any errors */
+			WARN(1, "forced remount of a %s fs returned %i\n",
+			     sb->s_type->name, retval);
+		}
+	} else if (sb->s_op->remount_fs) {
 		retval = sb->s_op->remount_fs(sb, &sb_flags, data);
 		if (retval) {
 			if (!force)
@@ -916,6 +928,11 @@
 	return retval;
 }
 
+int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
+{
+	return do_remount_sb2(NULL, sb, flags, data, force);
+}
+
 static void do_emergency_remount_callback(struct super_block *sb)
 {
 	down_write(&sb->s_umount);
@@ -1241,7 +1258,7 @@
 EXPORT_SYMBOL(mount_single);
 
 struct dentry *
-mount_fs(struct file_system_type *type, int flags, const char *name, void *data)
+mount_fs(struct file_system_type *type, int flags, const char *name, struct vfsmount *mnt, void *data)
 {
 	struct dentry *root;
 	struct super_block *sb;
@@ -1258,7 +1275,10 @@
 			goto out_free_secdata;
 	}
 
-	root = type->mount(type, flags, name, data);
+	if (type->mount2)
+		root = type->mount2(mnt, type, flags, name, data);
+	else
+		root = type->mount(type, flags, name, data);
 	if (IS_ERR(root)) {
 		error = PTR_ERR(root);
 		goto out_free_secdata;
diff --git a/fs/sync.c b/fs/sync.c
index b54e054..055daab 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -9,7 +9,7 @@
 #include <linux/slab.h>
 #include <linux/export.h>
 #include <linux/namei.h>
-#include <linux/sched.h>
+#include <linux/sched/xacct.h>
 #include <linux/writeback.h>
 #include <linux/syscalls.h>
 #include <linux/linkage.h>
@@ -220,6 +220,7 @@
 	if (f.file) {
 		ret = vfs_fsync(f.file, datasync);
 		fdput(f);
+		inc_syscfs(current);
 	}
 	return ret;
 }
diff --git a/fs/ubifs/Kconfig b/fs/ubifs/Kconfig
index bbc7854..b9bc6e4 100644
--- a/fs/ubifs/Kconfig
+++ b/fs/ubifs/Kconfig
@@ -7,6 +7,7 @@
 	select CRYPTO if UBIFS_FS_ZLIB
 	select CRYPTO_LZO if UBIFS_FS_LZO
 	select CRYPTO_DEFLATE if UBIFS_FS_ZLIB
+	select UBIFS_FS_XATTR if FS_ENCRYPTION
 	depends on MTD_UBI
 	help
 	  UBIFS is a file system for flash devices which works on top of UBI.
@@ -62,17 +63,6 @@
 
 	  If unsure, say Y.
 
-config UBIFS_FS_ENCRYPTION
-	bool "UBIFS Encryption"
-	depends on UBIFS_FS && UBIFS_FS_XATTR && BLOCK
-	select FS_ENCRYPTION
-	default n
-	help
-	  Enable encryption of UBIFS files and directories. This
-	  feature is similar to ecryptfs, but it is more memory
-	  efficient since it avoids caching the encrypted and
-	  decrypted pages in the page cache.
-
 config UBIFS_FS_SECURITY
 	bool "UBIFS Security Labels"
 	depends on UBIFS_FS && UBIFS_FS_XATTR
diff --git a/fs/ubifs/Makefile b/fs/ubifs/Makefile
index 6197d7e..079b13f 100644
--- a/fs/ubifs/Makefile
+++ b/fs/ubifs/Makefile
@@ -6,5 +6,5 @@
 ubifs-y += budget.o find.o tnc_commit.o compress.o lpt.o lprops.o
 ubifs-y += recovery.o ioctl.o lpt_commit.o tnc_misc.o debug.o
 ubifs-y += misc.o
-ubifs-$(CONFIG_UBIFS_FS_ENCRYPTION) += crypto.o
+ubifs-$(CONFIG_FS_ENCRYPTION) += crypto.o
 ubifs-$(CONFIG_UBIFS_FS_XATTR) += xattr.o
diff --git a/fs/ubifs/crypto.c b/fs/ubifs/crypto.c
index 4aaedf2..22be7ae 100644
--- a/fs/ubifs/crypto.c
+++ b/fs/ubifs/crypto.c
@@ -29,8 +29,8 @@
 {
 	struct ubifs_info *c = inode->i_sb->s_fs_info;
 	void *p = &dn->data;
-	struct page *ret;
 	unsigned int pad_len = round_up(in_len, UBIFS_CIPHER_BLOCK_SIZE);
+	int err;
 
 	ubifs_assert(c, pad_len <= *out_len);
 	dn->compr_size = cpu_to_le16(in_len);
@@ -39,11 +39,11 @@
 	if (pad_len != in_len)
 		memset(p + in_len, 0, pad_len - in_len);
 
-	ret = fscrypt_encrypt_page(inode, virt_to_page(&dn->data), pad_len,
-			offset_in_page(&dn->data), block, GFP_NOFS);
-	if (IS_ERR(ret)) {
-		ubifs_err(c, "fscrypt_encrypt_page failed: %ld", PTR_ERR(ret));
-		return PTR_ERR(ret);
+	err = fscrypt_encrypt_block_inplace(inode, virt_to_page(p), pad_len,
+					    offset_in_page(p), block, GFP_NOFS);
+	if (err) {
+		ubifs_err(c, "fscrypt_encrypt_block_inplace() failed: %d", err);
+		return err;
 	}
 	*out_len = pad_len;
 
@@ -64,10 +64,11 @@
 	}
 
 	ubifs_assert(c, dlen <= UBIFS_BLOCK_SIZE);
-	err = fscrypt_decrypt_page(inode, virt_to_page(&dn->data), dlen,
-			offset_in_page(&dn->data), block);
+	err = fscrypt_decrypt_block_inplace(inode, virt_to_page(&dn->data),
+					    dlen, offset_in_page(&dn->data),
+					    block);
 	if (err) {
-		ubifs_err(c, "fscrypt_decrypt_page failed: %i", err);
+		ubifs_err(c, "fscrypt_decrypt_block_inplace() failed: %d", err);
 		return err;
 	}
 	*out_len = clen;
diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
index 5767b37..b73de6d 100644
--- a/fs/ubifs/dir.c
+++ b/fs/ubifs/dir.c
@@ -220,11 +220,9 @@
 
 	dbg_gen("'%pd' in dir ino %lu", dentry, dir->i_ino);
 
-	err = fscrypt_prepare_lookup(dir, dentry, flags);
-	if (err)
-		return ERR_PTR(err);
-
-	err = fscrypt_setup_filename(dir, &dentry->d_name, 1, &nm);
+	err = fscrypt_prepare_lookup(dir, dentry, &nm);
+	if (err == -ENOENT)
+		return d_splice_alias(NULL, dentry);
 	if (err)
 		return ERR_PTR(err);
 
diff --git a/fs/ubifs/ioctl.c b/fs/ubifs/ioctl.c
index 0164bcc..71c3440 100644
--- a/fs/ubifs/ioctl.c
+++ b/fs/ubifs/ioctl.c
@@ -185,7 +185,7 @@
 		return err;
 	}
 	case FS_IOC_SET_ENCRYPTION_POLICY: {
-#ifdef CONFIG_UBIFS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 		struct ubifs_info *c = inode->i_sb->s_fs_info;
 
 		err = ubifs_enable_encryption(c);
@@ -198,13 +198,28 @@
 #endif
 	}
 	case FS_IOC_GET_ENCRYPTION_POLICY: {
-#ifdef CONFIG_UBIFS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 		return fscrypt_ioctl_get_policy(file, (void __user *)arg);
 #else
 		return -EOPNOTSUPP;
 #endif
 	}
 
+	case FS_IOC_GET_ENCRYPTION_POLICY_EX:
+		return fscrypt_ioctl_get_policy_ex(file, (void __user *)arg);
+
+	case FS_IOC_ADD_ENCRYPTION_KEY:
+		return fscrypt_ioctl_add_key(file, (void __user *)arg);
+
+	case FS_IOC_REMOVE_ENCRYPTION_KEY:
+		return fscrypt_ioctl_remove_key(file, (void __user *)arg);
+
+	case FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS:
+		return fscrypt_ioctl_remove_key_all_users(file,
+							  (void __user *)arg);
+	case FS_IOC_GET_ENCRYPTION_KEY_STATUS:
+		return fscrypt_ioctl_get_key_status(file, (void __user *)arg);
+
 	default:
 		return -ENOTTY;
 	}
@@ -222,6 +237,11 @@
 		break;
 	case FS_IOC_SET_ENCRYPTION_POLICY:
 	case FS_IOC_GET_ENCRYPTION_POLICY:
+	case FS_IOC_GET_ENCRYPTION_POLICY_EX:
+	case FS_IOC_ADD_ENCRYPTION_KEY:
+	case FS_IOC_REMOVE_ENCRYPTION_KEY:
+	case FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS:
+	case FS_IOC_GET_ENCRYPTION_KEY_STATUS:
 		break;
 	default:
 		return -ENOIOCTLCMD;
diff --git a/fs/ubifs/sb.c b/fs/ubifs/sb.c
index 11dc397..32b495e 100644
--- a/fs/ubifs/sb.c
+++ b/fs/ubifs/sb.c
@@ -658,7 +658,7 @@
 		goto out;
 	}
 
-#ifndef CONFIG_UBIFS_FS_ENCRYPTION
+#ifndef CONFIG_FS_ENCRYPTION
 	if (c->encrypted) {
 		ubifs_err(c, "file system contains encrypted files but UBIFS"
 			     " was built without crypto support.");
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
index fec62e9..e276b54 100644
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -276,6 +276,8 @@
 {
 	struct inode *inode = container_of(head, struct inode, i_rcu);
 	struct ubifs_inode *ui = ubifs_inode(inode);
+
+	fscrypt_free_inode(inode);
 	kmem_cache_free(ubifs_inode_slab, ui);
 }
 
@@ -334,6 +336,16 @@
 	return err;
 }
 
+static int ubifs_drop_inode(struct inode *inode)
+{
+	int drop = generic_drop_inode(inode);
+
+	if (!drop)
+		drop = fscrypt_drop_inode(inode);
+
+	return drop;
+}
+
 static void ubifs_evict_inode(struct inode *inode)
 {
 	int err;
@@ -1923,6 +1935,7 @@
 	.destroy_inode = ubifs_destroy_inode,
 	.put_super     = ubifs_put_super,
 	.write_inode   = ubifs_write_inode,
+	.drop_inode    = ubifs_drop_inode,
 	.evict_inode   = ubifs_evict_inode,
 	.statfs        = ubifs_statfs,
 	.dirty_inode   = ubifs_dirty_inode,
@@ -2087,7 +2100,7 @@
 #ifdef CONFIG_UBIFS_FS_XATTR
 	sb->s_xattr = ubifs_xattr_handlers;
 #endif
-#ifdef CONFIG_UBIFS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 	sb->s_cop = &ubifs_crypt_operations;
 #endif
 
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h
index 4368cde..4d46bb8 100644
--- a/fs/ubifs/ubifs.h
+++ b/fs/ubifs/ubifs.h
@@ -40,7 +40,6 @@
 #include <linux/xattr.h>
 #include <linux/random.h>
 
-#define __FS_HAS_ENCRYPTION IS_ENABLED(CONFIG_UBIFS_FS_ENCRYPTION)
 #include <linux/fscrypt.h>
 
 #include "ubifs-media.h"
@@ -139,7 +138,7 @@
  */
 #define WORST_COMPR_FACTOR 2
 
-#ifdef CONFIG_UBIFS_FS_ENCRYPTION
+#ifdef CONFIG_FS_ENCRYPTION
 #define UBIFS_CIPHER_BLOCK_SIZE FS_CRYPTO_BLOCK_SIZE
 #else
 #define UBIFS_CIPHER_BLOCK_SIZE 0
@@ -1829,7 +1828,7 @@
 #include "misc.h"
 #include "key.h"
 
-#ifndef CONFIG_UBIFS_FS_ENCRYPTION
+#ifndef CONFIG_FS_ENCRYPTION
 static inline int ubifs_encrypt(const struct inode *inode,
 				struct ubifs_data_node *dn,
 				unsigned int in_len, unsigned int *out_len,
diff --git a/fs/unicode/.gitignore b/fs/unicode/.gitignore
new file mode 100644
index 0000000..0381e22
--- /dev/null
+++ b/fs/unicode/.gitignore
@@ -0,0 +1,2 @@
+mkutf8data
+utf8data.h
diff --git a/fs/unicode/Kconfig b/fs/unicode/Kconfig
new file mode 100644
index 0000000..b560a87
--- /dev/null
+++ b/fs/unicode/Kconfig
@@ -0,0 +1,13 @@
+#
+# UTF-8 normalization
+#
+config UNICODE
+	bool "UTF-8 normalization and casefolding support"
+	help
+	  Say Y here to enable UTF-8 NFD normalization and NFD+CF casefolding
+	  support.
+
+config UNICODE_NORMALIZATION_SELFTEST
+	tristate "Test UTF-8 normalization support"
+	depends on UNICODE
+	default n
diff --git a/fs/unicode/Makefile b/fs/unicode/Makefile
new file mode 100644
index 0000000..d46e9ba
--- /dev/null
+++ b/fs/unicode/Makefile
@@ -0,0 +1,38 @@
+# SPDX-License-Identifier: GPL-2.0
+
+obj-$(CONFIG_UNICODE) += unicode.o
+obj-$(CONFIG_UNICODE_NORMALIZATION_SELFTEST) += utf8-selftest.o
+
+unicode-y := utf8-norm.o utf8-core.o
+
+$(obj)/utf8-norm.o: $(obj)/utf8data.h
+
+# In the normal build, the checked-in utf8data.h is just shipped.
+#
+# To generate utf8data.h from UCD, put *.txt files in this directory
+# and pass REGENERATE_UTF8DATA=1 from the command line.
+ifdef REGENERATE_UTF8DATA
+
+quiet_cmd_utf8data = GEN     $@
+      cmd_utf8data = $< \
+		-a $(srctree)/$(src)/DerivedAge.txt \
+		-c $(srctree)/$(src)/DerivedCombiningClass.txt \
+		-p $(srctree)/$(src)/DerivedCoreProperties.txt \
+		-d $(srctree)/$(src)/UnicodeData.txt \
+		-f $(srctree)/$(src)/CaseFolding.txt \
+		-n $(srctree)/$(src)/NormalizationCorrections.txt \
+		-t $(srctree)/$(src)/NormalizationTest.txt \
+		-o $@
+
+$(obj)/utf8data.h: $(obj)/mkutf8data $(filter %.txt, $(cmd_utf8data)) FORCE
+	$(call if_changed,utf8data)
+
+else
+
+$(obj)/utf8data.h: $(src)/utf8data.h_shipped FORCE
+	$(call if_changed,shipped)
+
+endif
+
+targets += utf8data.h
+hostprogs-y += mkutf8data
diff --git a/fs/unicode/README.utf8data b/fs/unicode/README.utf8data
new file mode 100644
index 0000000..c737868
--- /dev/null
+++ b/fs/unicode/README.utf8data
@@ -0,0 +1,57 @@
+The utf8data.h file in this directory is generated from the Unicode
+Character Database for version 12.1.0 of the Unicode standard.
+
+The full set of files can be found here:
+
+  http://www.unicode.org/Public/12.1.0/ucd/
+
+Individual source links:
+
+  https://www.unicode.org/Public/12.1.0/ucd/CaseFolding.txt
+  https://www.unicode.org/Public/12.1.0/ucd/DerivedAge.txt
+  https://www.unicode.org/Public/12.1.0/ucd/extracted/DerivedCombiningClass.txt
+  https://www.unicode.org/Public/12.1.0/ucd/DerivedCoreProperties.txt
+  https://www.unicode.org/Public/12.1.0/ucd/NormalizationCorrections.txt
+  https://www.unicode.org/Public/12.1.0/ucd/NormalizationTest.txt
+  https://www.unicode.org/Public/12.1.0/ucd/UnicodeData.txt
+
+md5sums (verify by running "md5sum -c README.utf8data"):
+
+  900e76da1d822a160fd6b8c0b1d70094  CaseFolding.txt
+  131256380bff4fea8ad4a851616f2f10  DerivedAge.txt
+  e731a4089b30002144e107e3d6f8d1fa  DerivedCombiningClass.txt
+  a47c9fbd7ff92a9b261ba9831e68778a  DerivedCoreProperties.txt
+  fcab6dad15e440879d92f315978f93d3  NormalizationCorrections.txt
+  f9ff1c55a60decf436100f791b44aa98  NormalizationTest.txt
+  755f6af699f8c8d2d958da411f78f6c6  UnicodeData.txt
+
+sha1sums (verify by running "sha1sum -c README.utf8data"):
+
+  dc9245f6803c4ac99555c361f5052e0b13eb779b  CaseFolding.txt
+  3281104f237184cdb5d869e86eb8573678ada7da  DerivedAge.txt
+  2f5f995ccb96e0fa84b15151b35d5e2681535175  DerivedCombiningClass.txt
+  5b8698a3fcd5018e1987f296b02e2c17e696415e  DerivedCoreProperties.txt
+  cd83935fbc012345d8792d2c704f69497e753835  NormalizationCorrections.txt
+  ea419aae505b337b0d99a83fa83fe58ddff7c19f  NormalizationTest.txt
+  dc973c0fc93d6f09d9ab9f70d1c9f89c447f0526  UnicodeData.txt
+
+
+To update to the newer version of the Unicode standard, the latest
+released version of the UCD can be found here:
+
+  http://www.unicode.org/Public/UCD/latest/
+
+Then, build under fs/unicode/ with REGENERATE_UTF8DATA=1:
+
+	make REGENERATE_UTF8DATA=1 fs/unicode/
+
+After sanity checking the newly generated utf8data.h file (the
+version generated from the 12.1.0 UCD should be 4,109 lines long, and
+have a total size of 324k) and/or comparing it with the older version
+of utf8data.h_shipped, rename it to utf8data.h_shipped.
+
+If you are a kernel developer updating to a newer version of the
+Unicode Character Database, please update this README.utf8data file
+with the version of the UCD that was used, the md5sum and sha1sums of
+the *.txt files, before checking in the new versions of the utf8data.h
+and README.utf8data files.
diff --git a/fs/unicode/mkutf8data.c b/fs/unicode/mkutf8data.c
new file mode 100644
index 0000000..ff2025ac
--- /dev/null
+++ b/fs/unicode/mkutf8data.c
@@ -0,0 +1,3419 @@
+/*
+ * Copyright (c) 2014 SGI.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would 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 the Free Software Foundation,
+ * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/* Generator for a compact trie for unicode normalization */
+
+#include <sys/types.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* Default names of the in- and output files. */
+
+#define AGE_NAME	"DerivedAge.txt"
+#define CCC_NAME	"DerivedCombiningClass.txt"
+#define PROP_NAME	"DerivedCoreProperties.txt"
+#define DATA_NAME	"UnicodeData.txt"
+#define FOLD_NAME	"CaseFolding.txt"
+#define NORM_NAME	"NormalizationCorrections.txt"
+#define TEST_NAME	"NormalizationTest.txt"
+#define UTF8_NAME	"utf8data.h"
+
+const char	*age_name  = AGE_NAME;
+const char	*ccc_name  = CCC_NAME;
+const char	*prop_name = PROP_NAME;
+const char	*data_name = DATA_NAME;
+const char	*fold_name = FOLD_NAME;
+const char	*norm_name = NORM_NAME;
+const char	*test_name = TEST_NAME;
+const char	*utf8_name = UTF8_NAME;
+
+int verbose = 0;
+
+/* An arbitrary line size limit on input lines. */
+
+#define LINESIZE	1024
+char line[LINESIZE];
+char buf0[LINESIZE];
+char buf1[LINESIZE];
+char buf2[LINESIZE];
+char buf3[LINESIZE];
+
+const char *argv0;
+
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
+/* ------------------------------------------------------------------ */
+
+/*
+ * Unicode version numbers consist of three parts: major, minor, and a
+ * revision.  These numbers are packed into an unsigned int to obtain
+ * a single version number.
+ *
+ * To save space in the generated trie, the unicode version is not
+ * stored directly, instead we calculate a generation number from the
+ * unicode versions seen in the DerivedAge file, and use that as an
+ * index into a table of unicode versions.
+ */
+#define UNICODE_MAJ_SHIFT		(16)
+#define UNICODE_MIN_SHIFT		(8)
+
+#define UNICODE_MAJ_MAX			((unsigned short)-1)
+#define UNICODE_MIN_MAX			((unsigned char)-1)
+#define UNICODE_REV_MAX			((unsigned char)-1)
+
+#define UNICODE_AGE(MAJ,MIN,REV)			\
+	(((unsigned int)(MAJ) << UNICODE_MAJ_SHIFT) |	\
+	 ((unsigned int)(MIN) << UNICODE_MIN_SHIFT) |	\
+	 ((unsigned int)(REV)))
+
+unsigned int *ages;
+int ages_count;
+
+unsigned int unicode_maxage;
+
+static int age_valid(unsigned int major, unsigned int minor,
+		     unsigned int revision)
+{
+	if (major > UNICODE_MAJ_MAX)
+		return 0;
+	if (minor > UNICODE_MIN_MAX)
+		return 0;
+	if (revision > UNICODE_REV_MAX)
+		return 0;
+	return 1;
+}
+
+/* ------------------------------------------------------------------ */
+
+/*
+ * utf8trie_t
+ *
+ * A compact binary tree, used to decode UTF-8 characters.
+ *
+ * Internal nodes are one byte for the node itself, and up to three
+ * bytes for an offset into the tree.  The first byte contains the
+ * following information:
+ *  NEXTBYTE  - flag        - advance to next byte if set
+ *  BITNUM    - 3 bit field - the bit number to tested
+ *  OFFLEN    - 2 bit field - number of bytes in the offset
+ * if offlen == 0 (non-branching node)
+ *  RIGHTPATH - 1 bit field - set if the following node is for the
+ *                            right-hand path (tested bit is set)
+ *  TRIENODE  - 1 bit field - set if the following node is an internal
+ *                            node, otherwise it is a leaf node
+ * if offlen != 0 (branching node)
+ *  LEFTNODE  - 1 bit field - set if the left-hand node is internal
+ *  RIGHTNODE - 1 bit field - set if the right-hand node is internal
+ *
+ * Due to the way utf8 works, there cannot be branching nodes with
+ * NEXTBYTE set, and moreover those nodes always have a righthand
+ * descendant.
+ */
+typedef unsigned char utf8trie_t;
+#define BITNUM		0x07
+#define NEXTBYTE	0x08
+#define OFFLEN		0x30
+#define OFFLEN_SHIFT	4
+#define RIGHTPATH	0x40
+#define TRIENODE	0x80
+#define RIGHTNODE	0x40
+#define LEFTNODE	0x80
+
+/*
+ * utf8leaf_t
+ *
+ * The leaves of the trie are embedded in the trie, and so the same
+ * underlying datatype, unsigned char.
+ *
+ * leaf[0]: The unicode version, stored as a generation number that is
+ *          an index into utf8agetab[].  With this we can filter code
+ *          points based on the unicode version in which they were
+ *          defined.  The CCC of a non-defined code point is 0.
+ * leaf[1]: Canonical Combining Class. During normalization, we need
+ *          to do a stable sort into ascending order of all characters
+ *          with a non-zero CCC that occur between two characters with
+ *          a CCC of 0, or at the begin or end of a string.
+ *          The unicode standard guarantees that all CCC values are
+ *          between 0 and 254 inclusive, which leaves 255 available as
+ *          a special value.
+ *          Code points with CCC 0 are known as stoppers.
+ * leaf[2]: Decomposition. If leaf[1] == 255, then leaf[2] is the
+ *          start of a NUL-terminated string that is the decomposition
+ *          of the character.
+ *          The CCC of a decomposable character is the same as the CCC
+ *          of the first character of its decomposition.
+ *          Some characters decompose as the empty string: these are
+ *          characters with the Default_Ignorable_Code_Point property.
+ *          These do affect normalization, as they all have CCC 0.
+ *
+ * The decompositions in the trie have been fully expanded.
+ *
+ * Casefolding, if applicable, is also done using decompositions.
+ */
+typedef unsigned char utf8leaf_t;
+
+#define LEAF_GEN(LEAF)	((LEAF)[0])
+#define LEAF_CCC(LEAF)	((LEAF)[1])
+#define LEAF_STR(LEAF)	((const char*)((LEAF) + 2))
+
+#define MAXGEN		(255)
+
+#define MINCCC		(0)
+#define MAXCCC		(254)
+#define STOPPER		(0)
+#define DECOMPOSE	(255)
+#define HANGUL		((char)(255))
+
+#define UTF8HANGULLEAF	(12)
+
+struct tree;
+static utf8leaf_t *utf8nlookup(struct tree *, unsigned char *,
+			       const char *, size_t);
+static utf8leaf_t *utf8lookup(struct tree *, unsigned char *, const char *);
+
+unsigned char *utf8data;
+size_t utf8data_size;
+
+utf8trie_t *nfdi;
+utf8trie_t *nfdicf;
+
+/* ------------------------------------------------------------------ */
+
+/*
+ * UTF8 valid ranges.
+ *
+ * The UTF-8 encoding spreads the bits of a 32bit word over several
+ * bytes. This table gives the ranges that can be held and how they'd
+ * be represented.
+ *
+ * 0x00000000 0x0000007F: 0xxxxxxx
+ * 0x00000000 0x000007FF: 110xxxxx 10xxxxxx
+ * 0x00000000 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
+ * 0x00000000 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 0x00000000 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 0x00000000 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ *
+ * There is an additional requirement on UTF-8, in that only the
+ * shortest representation of a 32bit value is to be used.  A decoder
+ * must not decode sequences that do not satisfy this requirement.
+ * Thus the allowed ranges have a lower bound.
+ *
+ * 0x00000000 0x0000007F: 0xxxxxxx
+ * 0x00000080 0x000007FF: 110xxxxx 10xxxxxx
+ * 0x00000800 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
+ * 0x00010000 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 0x00200000 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 0x04000000 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ *
+ * Actual unicode characters are limited to the range 0x0 - 0x10FFFF,
+ * 17 planes of 65536 values.  This limits the sequences actually seen
+ * even more, to just the following.
+ *
+ *          0 -     0x7f: 0                     0x7f
+ *       0x80 -    0x7ff: 0xc2 0x80             0xdf 0xbf
+ *      0x800 -   0xffff: 0xe0 0xa0 0x80        0xef 0xbf 0xbf
+ *    0x10000 - 0x10ffff: 0xf0 0x90 0x80 0x80   0xf4 0x8f 0xbf 0xbf
+ *
+ * Even within those ranges not all values are allowed: the surrogates
+ * 0xd800 - 0xdfff should never be seen.
+ *
+ * Note that the longest sequence seen with valid usage is 4 bytes,
+ * the same a single UTF-32 character.  This makes the UTF-8
+ * representation of Unicode strictly smaller than UTF-32.
+ *
+ * The shortest sequence requirement was introduced by:
+ *    Corrigendum #1: UTF-8 Shortest Form
+ * It can be found here:
+ *    http://www.unicode.org/versions/corrigendum1.html
+ *
+ */
+
+#define UTF8_2_BITS     0xC0
+#define UTF8_3_BITS     0xE0
+#define UTF8_4_BITS     0xF0
+#define UTF8_N_BITS     0x80
+#define UTF8_2_MASK     0xE0
+#define UTF8_3_MASK     0xF0
+#define UTF8_4_MASK     0xF8
+#define UTF8_N_MASK     0xC0
+#define UTF8_V_MASK     0x3F
+#define UTF8_V_SHIFT    6
+
+static int utf8encode(char *str, unsigned int val)
+{
+	int len;
+
+	if (val < 0x80) {
+		str[0] = val;
+		len = 1;
+	} else if (val < 0x800) {
+		str[1] = val & UTF8_V_MASK;
+		str[1] |= UTF8_N_BITS;
+		val >>= UTF8_V_SHIFT;
+		str[0] = val;
+		str[0] |= UTF8_2_BITS;
+		len = 2;
+	} else if (val < 0x10000) {
+		str[2] = val & UTF8_V_MASK;
+		str[2] |= UTF8_N_BITS;
+		val >>= UTF8_V_SHIFT;
+		str[1] = val & UTF8_V_MASK;
+		str[1] |= UTF8_N_BITS;
+		val >>= UTF8_V_SHIFT;
+		str[0] = val;
+		str[0] |= UTF8_3_BITS;
+		len = 3;
+	} else if (val < 0x110000) {
+		str[3] = val & UTF8_V_MASK;
+		str[3] |= UTF8_N_BITS;
+		val >>= UTF8_V_SHIFT;
+		str[2] = val & UTF8_V_MASK;
+		str[2] |= UTF8_N_BITS;
+		val >>= UTF8_V_SHIFT;
+		str[1] = val & UTF8_V_MASK;
+		str[1] |= UTF8_N_BITS;
+		val >>= UTF8_V_SHIFT;
+		str[0] = val;
+		str[0] |= UTF8_4_BITS;
+		len = 4;
+	} else {
+		printf("%#x: illegal val\n", val);
+		len = 0;
+	}
+	return len;
+}
+
+static unsigned int utf8decode(const char *str)
+{
+	const unsigned char *s = (const unsigned char*)str;
+	unsigned int unichar = 0;
+
+	if (*s < 0x80) {
+		unichar = *s;
+	} else if (*s < UTF8_3_BITS) {
+		unichar = *s++ & 0x1F;
+		unichar <<= UTF8_V_SHIFT;
+		unichar |= *s & 0x3F;
+	} else if (*s < UTF8_4_BITS) {
+		unichar = *s++ & 0x0F;
+		unichar <<= UTF8_V_SHIFT;
+		unichar |= *s++ & 0x3F;
+		unichar <<= UTF8_V_SHIFT;
+		unichar |= *s & 0x3F;
+	} else {
+		unichar = *s++ & 0x0F;
+		unichar <<= UTF8_V_SHIFT;
+		unichar |= *s++ & 0x3F;
+		unichar <<= UTF8_V_SHIFT;
+		unichar |= *s++ & 0x3F;
+		unichar <<= UTF8_V_SHIFT;
+		unichar |= *s & 0x3F;
+	}
+	return unichar;
+}
+
+static int utf32valid(unsigned int unichar)
+{
+	return unichar < 0x110000;
+}
+
+#define HANGUL_SYLLABLE(U)	((U) >= 0xAC00 && (U) <= 0xD7A3)
+
+#define NODE 1
+#define LEAF 0
+
+struct tree {
+	void *root;
+	int childnode;
+	const char *type;
+	unsigned int maxage;
+	struct tree *next;
+	int (*leaf_equal)(void *, void *);
+	void (*leaf_print)(void *, int);
+	int (*leaf_mark)(void *);
+	int (*leaf_size)(void *);
+	int *(*leaf_index)(struct tree *, void *);
+	unsigned char *(*leaf_emit)(void *, unsigned char *);
+	int leafindex[0x110000];
+	int index;
+};
+
+struct node {
+	int index;
+	int offset;
+	int mark;
+	int size;
+	struct node *parent;
+	void *left;
+	void *right;
+	unsigned char bitnum;
+	unsigned char nextbyte;
+	unsigned char leftnode;
+	unsigned char rightnode;
+	unsigned int keybits;
+	unsigned int keymask;
+};
+
+/*
+ * Example lookup function for a tree.
+ */
+static void *lookup(struct tree *tree, const char *key)
+{
+	struct node *node;
+	void *leaf = NULL;
+
+	node = tree->root;
+	while (!leaf && node) {
+		if (node->nextbyte)
+			key++;
+		if (*key & (1 << (node->bitnum & 7))) {
+			/* Right leg */
+			if (node->rightnode == NODE) {
+				node = node->right;
+			} else if (node->rightnode == LEAF) {
+				leaf = node->right;
+			} else {
+				node = NULL;
+			}
+		} else {
+			/* Left leg */
+			if (node->leftnode == NODE) {
+				node = node->left;
+			} else if (node->leftnode == LEAF) {
+				leaf = node->left;
+			} else {
+				node = NULL;
+			}
+		}
+	}
+
+	return leaf;
+}
+
+/*
+ * A simple non-recursive tree walker: keep track of visits to the
+ * left and right branches in the leftmask and rightmask.
+ */
+static void tree_walk(struct tree *tree)
+{
+	struct node *node;
+	unsigned int leftmask;
+	unsigned int rightmask;
+	unsigned int bitmask;
+	int indent = 1;
+	int nodes, singletons, leaves;
+
+	nodes = singletons = leaves = 0;
+
+	printf("%s_%x root %p\n", tree->type, tree->maxage, tree->root);
+	if (tree->childnode == LEAF) {
+		assert(tree->root);
+		tree->leaf_print(tree->root, indent);
+		leaves = 1;
+	} else {
+		assert(tree->childnode == NODE);
+		node = tree->root;
+		leftmask = rightmask = 0;
+		while (node) {
+			printf("%*snode @ %p bitnum %d nextbyte %d"
+			       " left %p right %p mask %x bits %x\n",
+				indent, "", node,
+				node->bitnum, node->nextbyte,
+				node->left, node->right,
+				node->keymask, node->keybits);
+			nodes += 1;
+			if (!(node->left && node->right))
+				singletons += 1;
+
+			while (node) {
+				bitmask = 1 << node->bitnum;
+				if ((leftmask & bitmask) == 0) {
+					leftmask |= bitmask;
+					if (node->leftnode == LEAF) {
+						assert(node->left);
+						tree->leaf_print(node->left,
+								 indent+1);
+						leaves += 1;
+					} else if (node->left) {
+						assert(node->leftnode == NODE);
+						indent += 1;
+						node = node->left;
+						break;
+					}
+				}
+				if ((rightmask & bitmask) == 0) {
+					rightmask |= bitmask;
+					if (node->rightnode == LEAF) {
+						assert(node->right);
+						tree->leaf_print(node->right,
+								 indent+1);
+						leaves += 1;
+					} else if (node->right) {
+						assert(node->rightnode == NODE);
+						indent += 1;
+						node = node->right;
+						break;
+					}
+				}
+				leftmask &= ~bitmask;
+				rightmask &= ~bitmask;
+				node = node->parent;
+				indent -= 1;
+			}
+		}
+	}
+	printf("nodes %d leaves %d singletons %d\n",
+	       nodes, leaves, singletons);
+}
+
+/*
+ * Allocate an initialize a new internal node.
+ */
+static struct node *alloc_node(struct node *parent)
+{
+	struct node *node;
+	int bitnum;
+
+	node = malloc(sizeof(*node));
+	node->left = node->right = NULL;
+	node->parent = parent;
+	node->leftnode = NODE;
+	node->rightnode = NODE;
+	node->keybits = 0;
+	node->keymask = 0;
+	node->mark = 0;
+	node->index = 0;
+	node->offset = -1;
+	node->size = 4;
+
+	if (node->parent) {
+		bitnum = parent->bitnum;
+		if ((bitnum & 7) == 0) {
+			node->bitnum = bitnum + 7 + 8;
+			node->nextbyte = 1;
+		} else {
+			node->bitnum = bitnum - 1;
+			node->nextbyte = 0;
+		}
+	} else {
+		node->bitnum = 7;
+		node->nextbyte = 0;
+	}
+
+	return node;
+}
+
+/*
+ * Insert a new leaf into the tree, and collapse any subtrees that are
+ * fully populated and end in identical leaves. A nextbyte tagged
+ * internal node will not be removed to preserve the tree's integrity.
+ * Note that due to the structure of utf8, no nextbyte tagged node
+ * will be a candidate for removal.
+ */
+static int insert(struct tree *tree, char *key, int keylen, void *leaf)
+{
+	struct node *node;
+	struct node *parent;
+	void **cursor;
+	int keybits;
+
+	assert(keylen >= 1 && keylen <= 4);
+
+	node = NULL;
+	cursor = &tree->root;
+	keybits = 8 * keylen;
+
+	/* Insert, creating path along the way. */
+	while (keybits) {
+		if (!*cursor)
+			*cursor = alloc_node(node);
+		node = *cursor;
+		if (node->nextbyte)
+			key++;
+		if (*key & (1 << (node->bitnum & 7)))
+			cursor = &node->right;
+		else
+			cursor = &node->left;
+		keybits--;
+	}
+	*cursor = leaf;
+
+	/* Merge subtrees if possible. */
+	while (node) {
+		if (*key & (1 << (node->bitnum & 7)))
+			node->rightnode = LEAF;
+		else
+			node->leftnode = LEAF;
+		if (node->nextbyte)
+			break;
+		if (node->leftnode == NODE || node->rightnode == NODE)
+			break;
+		assert(node->left);
+		assert(node->right);
+		/* Compare */
+		if (! tree->leaf_equal(node->left, node->right))
+			break;
+		/* Keep left, drop right leaf. */
+		leaf = node->left;
+		/* Check in parent */
+		parent = node->parent;
+		if (!parent) {
+			/* root of tree! */
+			tree->root = leaf;
+			tree->childnode = LEAF;
+		} else if (parent->left == node) {
+			parent->left = leaf;
+			parent->leftnode = LEAF;
+			if (parent->right) {
+				parent->keymask = 0;
+				parent->keybits = 0;
+			} else {
+				parent->keymask |= (1 << node->bitnum);
+			}
+		} else if (parent->right == node) {
+			parent->right = leaf;
+			parent->rightnode = LEAF;
+			if (parent->left) {
+				parent->keymask = 0;
+				parent->keybits = 0;
+			} else {
+				parent->keymask |= (1 << node->bitnum);
+				parent->keybits |= (1 << node->bitnum);
+			}
+		} else {
+			/* internal tree error */
+			assert(0);
+		}
+		free(node);
+		node = parent;
+	}
+
+	/* Propagate keymasks up along singleton chains. */
+	while (node) {
+		parent = node->parent;
+		if (!parent)
+			break;
+		/* Nix the mask for parents with two children. */
+		if (node->keymask == 0) {
+			parent->keymask = 0;
+			parent->keybits = 0;
+		} else if (parent->left && parent->right) {
+			parent->keymask = 0;
+			parent->keybits = 0;
+		} else {
+			assert((parent->keymask & node->keymask) == 0);
+			parent->keymask |= node->keymask;
+			parent->keymask |= (1 << parent->bitnum);
+			parent->keybits |= node->keybits;
+			if (parent->right)
+				parent->keybits |= (1 << parent->bitnum);
+		}
+		node = parent;
+	}
+
+	return 0;
+}
+
+/*
+ * Prune internal nodes.
+ *
+ * Fully populated subtrees that end at the same leaf have already
+ * been collapsed.  There are still internal nodes that have for both
+ * their left and right branches a sequence of singletons that make
+ * identical choices and end in identical leaves.  The keymask and
+ * keybits collected in the nodes describe the choices made in these
+ * singleton chains.  When they are identical for the left and right
+ * branch of a node, and the two leaves comare identical, the node in
+ * question can be removed.
+ *
+ * Note that nodes with the nextbyte tag set will not be removed by
+ * this to ensure tree integrity.  Note as well that the structure of
+ * utf8 ensures that these nodes would not have been candidates for
+ * removal in any case.
+ */
+static void prune(struct tree *tree)
+{
+	struct node *node;
+	struct node *left;
+	struct node *right;
+	struct node *parent;
+	void *leftleaf;
+	void *rightleaf;
+	unsigned int leftmask;
+	unsigned int rightmask;
+	unsigned int bitmask;
+	int count;
+
+	if (verbose > 0)
+		printf("Pruning %s_%x\n", tree->type, tree->maxage);
+
+	count = 0;
+	if (tree->childnode == LEAF)
+		return;
+	if (!tree->root)
+		return;
+
+	leftmask = rightmask = 0;
+	node = tree->root;
+	while (node) {
+		if (node->nextbyte)
+			goto advance;
+		if (node->leftnode == LEAF)
+			goto advance;
+		if (node->rightnode == LEAF)
+			goto advance;
+		if (!node->left)
+			goto advance;
+		if (!node->right)
+			goto advance;
+		left = node->left;
+		right = node->right;
+		if (left->keymask == 0)
+			goto advance;
+		if (right->keymask == 0)
+			goto advance;
+		if (left->keymask != right->keymask)
+			goto advance;
+		if (left->keybits != right->keybits)
+			goto advance;
+		leftleaf = NULL;
+		while (!leftleaf) {
+			assert(left->left || left->right);
+			if (left->leftnode == LEAF)
+				leftleaf = left->left;
+			else if (left->rightnode == LEAF)
+				leftleaf = left->right;
+			else if (left->left)
+				left = left->left;
+			else if (left->right)
+				left = left->right;
+			else
+				assert(0);
+		}
+		rightleaf = NULL;
+		while (!rightleaf) {
+			assert(right->left || right->right);
+			if (right->leftnode == LEAF)
+				rightleaf = right->left;
+			else if (right->rightnode == LEAF)
+				rightleaf = right->right;
+			else if (right->left)
+				right = right->left;
+			else if (right->right)
+				right = right->right;
+			else
+				assert(0);
+		}
+		if (! tree->leaf_equal(leftleaf, rightleaf))
+			goto advance;
+		/*
+		 * This node has identical singleton-only subtrees.
+		 * Remove it.
+		 */
+		parent = node->parent;
+		left = node->left;
+		right = node->right;
+		if (parent->left == node)
+			parent->left = left;
+		else if (parent->right == node)
+			parent->right = left;
+		else
+			assert(0);
+		left->parent = parent;
+		left->keymask |= (1 << node->bitnum);
+		node->left = NULL;
+		while (node) {
+			bitmask = 1 << node->bitnum;
+			leftmask &= ~bitmask;
+			rightmask &= ~bitmask;
+			if (node->leftnode == NODE && node->left) {
+				left = node->left;
+				free(node);
+				count++;
+				node = left;
+			} else if (node->rightnode == NODE && node->right) {
+				right = node->right;
+				free(node);
+				count++;
+				node = right;
+			} else {
+				node = NULL;
+			}
+		}
+		/* Propagate keymasks up along singleton chains. */
+		node = parent;
+		/* Force re-check */
+		bitmask = 1 << node->bitnum;
+		leftmask &= ~bitmask;
+		rightmask &= ~bitmask;
+		for (;;) {
+			if (node->left && node->right)
+				break;
+			if (node->left) {
+				left = node->left;
+				node->keymask |= left->keymask;
+				node->keybits |= left->keybits;
+			}
+			if (node->right) {
+				right = node->right;
+				node->keymask |= right->keymask;
+				node->keybits |= right->keybits;
+			}
+			node->keymask |= (1 << node->bitnum);
+			node = node->parent;
+			/* Force re-check */
+			bitmask = 1 << node->bitnum;
+			leftmask &= ~bitmask;
+			rightmask &= ~bitmask;
+		}
+	advance:
+		bitmask = 1 << node->bitnum;
+		if ((leftmask & bitmask) == 0 &&
+		    node->leftnode == NODE &&
+		    node->left) {
+			leftmask |= bitmask;
+			node = node->left;
+		} else if ((rightmask & bitmask) == 0 &&
+			   node->rightnode == NODE &&
+			   node->right) {
+			rightmask |= bitmask;
+			node = node->right;
+		} else {
+			leftmask &= ~bitmask;
+			rightmask &= ~bitmask;
+			node = node->parent;
+		}
+	}
+	if (verbose > 0)
+		printf("Pruned %d nodes\n", count);
+}
+
+/*
+ * Mark the nodes in the tree that lead to leaves that must be
+ * emitted.
+ */
+static void mark_nodes(struct tree *tree)
+{
+	struct node *node;
+	struct node *n;
+	unsigned int leftmask;
+	unsigned int rightmask;
+	unsigned int bitmask;
+	int marked;
+
+	marked = 0;
+	if (verbose > 0)
+		printf("Marking %s_%x\n", tree->type, tree->maxage);
+	if (tree->childnode == LEAF)
+		goto done;
+
+	assert(tree->childnode == NODE);
+	node = tree->root;
+	leftmask = rightmask = 0;
+	while (node) {
+		bitmask = 1 << node->bitnum;
+		if ((leftmask & bitmask) == 0) {
+			leftmask |= bitmask;
+			if (node->leftnode == LEAF) {
+				assert(node->left);
+				if (tree->leaf_mark(node->left)) {
+					n = node;
+					while (n && !n->mark) {
+						marked++;
+						n->mark = 1;
+						n = n->parent;
+					}
+				}
+			} else if (node->left) {
+				assert(node->leftnode == NODE);
+				node = node->left;
+				continue;
+			}
+		}
+		if ((rightmask & bitmask) == 0) {
+			rightmask |= bitmask;
+			if (node->rightnode == LEAF) {
+				assert(node->right);
+				if (tree->leaf_mark(node->right)) {
+					n = node;
+					while (n && !n->mark) {
+						marked++;
+						n->mark = 1;
+						n = n->parent;
+					}
+				}
+			} else if (node->right) {
+				assert(node->rightnode == NODE);
+				node = node->right;
+				continue;
+			}
+		}
+		leftmask &= ~bitmask;
+		rightmask &= ~bitmask;
+		node = node->parent;
+	}
+
+	/* second pass: left siblings and singletons */
+
+	assert(tree->childnode == NODE);
+	node = tree->root;
+	leftmask = rightmask = 0;
+	while (node) {
+		bitmask = 1 << node->bitnum;
+		if ((leftmask & bitmask) == 0) {
+			leftmask |= bitmask;
+			if (node->leftnode == LEAF) {
+				assert(node->left);
+				if (tree->leaf_mark(node->left)) {
+					n = node;
+					while (n && !n->mark) {
+						marked++;
+						n->mark = 1;
+						n = n->parent;
+					}
+				}
+			} else if (node->left) {
+				assert(node->leftnode == NODE);
+				node = node->left;
+				if (!node->mark && node->parent->mark) {
+					marked++;
+					node->mark = 1;
+				}
+				continue;
+			}
+		}
+		if ((rightmask & bitmask) == 0) {
+			rightmask |= bitmask;
+			if (node->rightnode == LEAF) {
+				assert(node->right);
+				if (tree->leaf_mark(node->right)) {
+					n = node;
+					while (n && !n->mark) {
+						marked++;
+						n->mark = 1;
+						n = n->parent;
+					}
+				}
+			} else if (node->right) {
+				assert(node->rightnode == NODE);
+				node = node->right;
+				if (!node->mark && node->parent->mark &&
+				    !node->parent->left) {
+					marked++;
+					node->mark = 1;
+				}
+				continue;
+			}
+		}
+		leftmask &= ~bitmask;
+		rightmask &= ~bitmask;
+		node = node->parent;
+	}
+done:
+	if (verbose > 0)
+		printf("Marked %d nodes\n", marked);
+}
+
+/*
+ * Compute the index of each node and leaf, which is the offset in the
+ * emitted trie.  These values must be pre-computed because relative
+ * offsets between nodes are used to navigate the tree.
+ */
+static int index_nodes(struct tree *tree, int index)
+{
+	struct node *node;
+	unsigned int leftmask;
+	unsigned int rightmask;
+	unsigned int bitmask;
+	int count;
+	int indent;
+
+	/* Align to a cache line (or half a cache line?). */
+	while (index % 64)
+		index++;
+	tree->index = index;
+	indent = 1;
+	count = 0;
+
+	if (verbose > 0)
+		printf("Indexing %s_%x: %d\n", tree->type, tree->maxage, index);
+	if (tree->childnode == LEAF) {
+		index += tree->leaf_size(tree->root);
+		goto done;
+	}
+
+	assert(tree->childnode == NODE);
+	node = tree->root;
+	leftmask = rightmask = 0;
+	while (node) {
+		if (!node->mark)
+			goto skip;
+		count++;
+		if (node->index != index)
+			node->index = index;
+		index += node->size;
+skip:
+		while (node) {
+			bitmask = 1 << node->bitnum;
+			if (node->mark && (leftmask & bitmask) == 0) {
+				leftmask |= bitmask;
+				if (node->leftnode == LEAF) {
+					assert(node->left);
+					*tree->leaf_index(tree, node->left) =
+									index;
+					index += tree->leaf_size(node->left);
+					count++;
+				} else if (node->left) {
+					assert(node->leftnode == NODE);
+					indent += 1;
+					node = node->left;
+					break;
+				}
+			}
+			if (node->mark && (rightmask & bitmask) == 0) {
+				rightmask |= bitmask;
+				if (node->rightnode == LEAF) {
+					assert(node->right);
+					*tree->leaf_index(tree, node->right) = index;
+					index += tree->leaf_size(node->right);
+					count++;
+				} else if (node->right) {
+					assert(node->rightnode == NODE);
+					indent += 1;
+					node = node->right;
+					break;
+				}
+			}
+			leftmask &= ~bitmask;
+			rightmask &= ~bitmask;
+			node = node->parent;
+			indent -= 1;
+		}
+	}
+done:
+	/* Round up to a multiple of 16 */
+	while (index % 16)
+		index++;
+	if (verbose > 0)
+		printf("Final index %d\n", index);
+	return index;
+}
+
+/*
+ * Mark the nodes in a subtree, helper for size_nodes().
+ */
+static int mark_subtree(struct node *node)
+{
+	int changed;
+
+	if (!node || node->mark)
+		return 0;
+	node->mark = 1;
+	node->index = node->parent->index;
+	changed = 1;
+	if (node->leftnode == NODE)
+		changed += mark_subtree(node->left);
+	if (node->rightnode == NODE)
+		changed += mark_subtree(node->right);
+	return changed;
+}
+
+/*
+ * Compute the size of nodes and leaves. We start by assuming that
+ * each node needs to store a three-byte offset. The indexes of the
+ * nodes are calculated based on that, and then this function is
+ * called to see if the sizes of some nodes can be reduced.  This is
+ * repeated until no more changes are seen.
+ */
+static int size_nodes(struct tree *tree)
+{
+	struct tree *next;
+	struct node *node;
+	struct node *right;
+	struct node *n;
+	unsigned int leftmask;
+	unsigned int rightmask;
+	unsigned int bitmask;
+	unsigned int pathbits;
+	unsigned int pathmask;
+	unsigned int nbit;
+	int changed;
+	int offset;
+	int size;
+	int indent;
+
+	indent = 1;
+	changed = 0;
+	size = 0;
+
+	if (verbose > 0)
+		printf("Sizing %s_%x\n", tree->type, tree->maxage);
+	if (tree->childnode == LEAF)
+		goto done;
+
+	assert(tree->childnode == NODE);
+	pathbits = 0;
+	pathmask = 0;
+	node = tree->root;
+	leftmask = rightmask = 0;
+	while (node) {
+		if (!node->mark)
+			goto skip;
+		offset = 0;
+		if (!node->left || !node->right) {
+			size = 1;
+		} else {
+			if (node->rightnode == NODE) {
+				/*
+				 * If the right node is not marked,
+				 * look for a corresponding node in
+				 * the next tree.  Such a node need
+				 * not exist.
+				 */
+				right = node->right;
+				next = tree->next;
+				while (!right->mark) {
+					assert(next);
+					n = next->root;
+					while (n->bitnum != node->bitnum) {
+						nbit = 1 << n->bitnum;
+						if (!(pathmask & nbit))
+							break;
+						if (pathbits & nbit) {
+							if (n->rightnode == LEAF)
+								break;
+							n = n->right;
+						} else {
+							if (n->leftnode == LEAF)
+								break;
+							n = n->left;
+						}
+					}
+					if (n->bitnum != node->bitnum)
+						break;
+					n = n->right;
+					right = n;
+					next = next->next;
+				}
+				/* Make sure the right node is marked. */
+				if (!right->mark)
+					changed += mark_subtree(right);
+				offset = right->index - node->index;
+			} else {
+				offset = *tree->leaf_index(tree, node->right);
+				offset -= node->index;
+			}
+			assert(offset >= 0);
+			assert(offset <= 0xffffff);
+			if (offset <= 0xff) {
+				size = 2;
+			} else if (offset <= 0xffff) {
+				size = 3;
+			} else { /* offset <= 0xffffff */
+				size = 4;
+			}
+		}
+		if (node->size != size || node->offset != offset) {
+			node->size = size;
+			node->offset = offset;
+			changed++;
+		}
+skip:
+		while (node) {
+			bitmask = 1 << node->bitnum;
+			pathmask |= bitmask;
+			if (node->mark && (leftmask & bitmask) == 0) {
+				leftmask |= bitmask;
+				if (node->leftnode == LEAF) {
+					assert(node->left);
+				} else if (node->left) {
+					assert(node->leftnode == NODE);
+					indent += 1;
+					node = node->left;
+					break;
+				}
+			}
+			if (node->mark && (rightmask & bitmask) == 0) {
+				rightmask |= bitmask;
+				pathbits |= bitmask;
+				if (node->rightnode == LEAF) {
+					assert(node->right);
+				} else if (node->right) {
+					assert(node->rightnode == NODE);
+					indent += 1;
+					node = node->right;
+					break;
+				}
+			}
+			leftmask &= ~bitmask;
+			rightmask &= ~bitmask;
+			pathmask &= ~bitmask;
+			pathbits &= ~bitmask;
+			node = node->parent;
+			indent -= 1;
+		}
+	}
+done:
+	if (verbose > 0)
+		printf("Found %d changes\n", changed);
+	return changed;
+}
+
+/*
+ * Emit a trie for the given tree into the data array.
+ */
+static void emit(struct tree *tree, unsigned char *data)
+{
+	struct node *node;
+	unsigned int leftmask;
+	unsigned int rightmask;
+	unsigned int bitmask;
+	int offlen;
+	int offset;
+	int index;
+	int indent;
+	int size;
+	int bytes;
+	int leaves;
+	int nodes[4];
+	unsigned char byte;
+
+	nodes[0] = nodes[1] = nodes[2] = nodes[3] = 0;
+	leaves = 0;
+	bytes = 0;
+	index = tree->index;
+	data += index;
+	indent = 1;
+	if (verbose > 0)
+		printf("Emitting %s_%x\n", tree->type, tree->maxage);
+	if (tree->childnode == LEAF) {
+		assert(tree->root);
+		tree->leaf_emit(tree->root, data);
+		size = tree->leaf_size(tree->root);
+		index += size;
+		leaves++;
+		goto done;
+	}
+
+	assert(tree->childnode == NODE);
+	node = tree->root;
+	leftmask = rightmask = 0;
+	while (node) {
+		if (!node->mark)
+			goto skip;
+		assert(node->offset != -1);
+		assert(node->index == index);
+
+		byte = 0;
+		if (node->nextbyte)
+			byte |= NEXTBYTE;
+		byte |= (node->bitnum & BITNUM);
+		if (node->left && node->right) {
+			if (node->leftnode == NODE)
+				byte |= LEFTNODE;
+			if (node->rightnode == NODE)
+				byte |= RIGHTNODE;
+			if (node->offset <= 0xff)
+				offlen = 1;
+			else if (node->offset <= 0xffff)
+				offlen = 2;
+			else
+				offlen = 3;
+			nodes[offlen]++;
+			offset = node->offset;
+			byte |= offlen << OFFLEN_SHIFT;
+			*data++ = byte;
+			index++;
+			while (offlen--) {
+				*data++ = offset & 0xff;
+				index++;
+				offset >>= 8;
+			}
+		} else if (node->left) {
+			if (node->leftnode == NODE)
+				byte |= TRIENODE;
+			nodes[0]++;
+			*data++ = byte;
+			index++;
+		} else if (node->right) {
+			byte |= RIGHTNODE;
+			if (node->rightnode == NODE)
+				byte |= TRIENODE;
+			nodes[0]++;
+			*data++ = byte;
+			index++;
+		} else {
+			assert(0);
+		}
+skip:
+		while (node) {
+			bitmask = 1 << node->bitnum;
+			if (node->mark && (leftmask & bitmask) == 0) {
+				leftmask |= bitmask;
+				if (node->leftnode == LEAF) {
+					assert(node->left);
+					data = tree->leaf_emit(node->left,
+							       data);
+					size = tree->leaf_size(node->left);
+					index += size;
+					bytes += size;
+					leaves++;
+				} else if (node->left) {
+					assert(node->leftnode == NODE);
+					indent += 1;
+					node = node->left;
+					break;
+				}
+			}
+			if (node->mark && (rightmask & bitmask) == 0) {
+				rightmask |= bitmask;
+				if (node->rightnode == LEAF) {
+					assert(node->right);
+					data = tree->leaf_emit(node->right,
+							       data);
+					size = tree->leaf_size(node->right);
+					index += size;
+					bytes += size;
+					leaves++;
+				} else if (node->right) {
+					assert(node->rightnode == NODE);
+					indent += 1;
+					node = node->right;
+					break;
+				}
+			}
+			leftmask &= ~bitmask;
+			rightmask &= ~bitmask;
+			node = node->parent;
+			indent -= 1;
+		}
+	}
+done:
+	if (verbose > 0) {
+		printf("Emitted %d (%d) leaves",
+			leaves, bytes);
+		printf(" %d (%d+%d+%d+%d) nodes",
+			nodes[0] + nodes[1] + nodes[2] + nodes[3],
+			nodes[0], nodes[1], nodes[2], nodes[3]);
+		printf(" %d total\n", index - tree->index);
+	}
+}
+
+/* ------------------------------------------------------------------ */
+
+/*
+ * Unicode data.
+ *
+ * We need to keep track of the Canonical Combining Class, the Age,
+ * and decompositions for a code point.
+ *
+ * For the Age, we store the index into the ages table.  Effectively
+ * this is a generation number that the table maps to a unicode
+ * version.
+ *
+ * The correction field is used to indicate that this entry is in the
+ * corrections array, which contains decompositions that were
+ * corrected in later revisions.  The value of the correction field is
+ * the Unicode version in which the mapping was corrected.
+ */
+struct unicode_data {
+	unsigned int code;
+	int ccc;
+	int gen;
+	int correction;
+	unsigned int *utf32nfdi;
+	unsigned int *utf32nfdicf;
+	char *utf8nfdi;
+	char *utf8nfdicf;
+};
+
+struct unicode_data unicode_data[0x110000];
+struct unicode_data *corrections;
+int    corrections_count;
+
+struct tree *nfdi_tree;
+struct tree *nfdicf_tree;
+
+struct tree *trees;
+int          trees_count;
+
+/*
+ * Check the corrections array to see if this entry was corrected at
+ * some point.
+ */
+static struct unicode_data *corrections_lookup(struct unicode_data *u)
+{
+	int i;
+
+	for (i = 0; i != corrections_count; i++)
+		if (u->code == corrections[i].code)
+			return &corrections[i];
+	return u;
+}
+
+static int nfdi_equal(void *l, void *r)
+{
+	struct unicode_data *left = l;
+	struct unicode_data *right = r;
+
+	if (left->gen != right->gen)
+		return 0;
+	if (left->ccc != right->ccc)
+		return 0;
+	if (left->utf8nfdi && right->utf8nfdi &&
+	    strcmp(left->utf8nfdi, right->utf8nfdi) == 0)
+		return 1;
+	if (left->utf8nfdi || right->utf8nfdi)
+		return 0;
+	return 1;
+}
+
+static int nfdicf_equal(void *l, void *r)
+{
+	struct unicode_data *left = l;
+	struct unicode_data *right = r;
+
+	if (left->gen != right->gen)
+		return 0;
+	if (left->ccc != right->ccc)
+		return 0;
+	if (left->utf8nfdicf && right->utf8nfdicf &&
+	    strcmp(left->utf8nfdicf, right->utf8nfdicf) == 0)
+		return 1;
+	if (left->utf8nfdicf && right->utf8nfdicf)
+		return 0;
+	if (left->utf8nfdicf || right->utf8nfdicf)
+		return 0;
+	if (left->utf8nfdi && right->utf8nfdi &&
+	    strcmp(left->utf8nfdi, right->utf8nfdi) == 0)
+		return 1;
+	if (left->utf8nfdi || right->utf8nfdi)
+		return 0;
+	return 1;
+}
+
+static void nfdi_print(void *l, int indent)
+{
+	struct unicode_data *leaf = l;
+
+	printf("%*sleaf @ %p code %X ccc %d gen %d", indent, "", leaf,
+		leaf->code, leaf->ccc, leaf->gen);
+
+	if (leaf->utf8nfdi && leaf->utf8nfdi[0] == HANGUL)
+		printf(" nfdi \"%s\"", "HANGUL SYLLABLE");
+	else if (leaf->utf8nfdi)
+		printf(" nfdi \"%s\"", (const char*)leaf->utf8nfdi);
+
+	printf("\n");
+}
+
+static void nfdicf_print(void *l, int indent)
+{
+	struct unicode_data *leaf = l;
+
+	printf("%*sleaf @ %p code %X ccc %d gen %d", indent, "", leaf,
+		leaf->code, leaf->ccc, leaf->gen);
+
+	if (leaf->utf8nfdicf)
+		printf(" nfdicf \"%s\"", (const char*)leaf->utf8nfdicf);
+	else if (leaf->utf8nfdi && leaf->utf8nfdi[0] == HANGUL)
+		printf(" nfdi \"%s\"", "HANGUL SYLLABLE");
+	else if (leaf->utf8nfdi)
+		printf(" nfdi \"%s\"", (const char*)leaf->utf8nfdi);
+	printf("\n");
+}
+
+static int nfdi_mark(void *l)
+{
+	return 1;
+}
+
+static int nfdicf_mark(void *l)
+{
+	struct unicode_data *leaf = l;
+
+	if (leaf->utf8nfdicf)
+		return 1;
+	return 0;
+}
+
+static int correction_mark(void *l)
+{
+	struct unicode_data *leaf = l;
+
+	return leaf->correction;
+}
+
+static int nfdi_size(void *l)
+{
+	struct unicode_data *leaf = l;
+	int size = 2;
+
+	if (HANGUL_SYLLABLE(leaf->code))
+		size += 1;
+	else if (leaf->utf8nfdi)
+		size += strlen(leaf->utf8nfdi) + 1;
+	return size;
+}
+
+static int nfdicf_size(void *l)
+{
+	struct unicode_data *leaf = l;
+	int size = 2;
+
+	if (HANGUL_SYLLABLE(leaf->code))
+		size += 1;
+	else if (leaf->utf8nfdicf)
+		size += strlen(leaf->utf8nfdicf) + 1;
+	else if (leaf->utf8nfdi)
+		size += strlen(leaf->utf8nfdi) + 1;
+	return size;
+}
+
+static int *nfdi_index(struct tree *tree, void *l)
+{
+	struct unicode_data *leaf = l;
+
+	return &tree->leafindex[leaf->code];
+}
+
+static int *nfdicf_index(struct tree *tree, void *l)
+{
+	struct unicode_data *leaf = l;
+
+	return &tree->leafindex[leaf->code];
+}
+
+static unsigned char *nfdi_emit(void *l, unsigned char *data)
+{
+	struct unicode_data *leaf = l;
+	unsigned char *s;
+
+	*data++ = leaf->gen;
+
+	if (HANGUL_SYLLABLE(leaf->code)) {
+		*data++ = DECOMPOSE;
+		*data++ = HANGUL;
+	} else if (leaf->utf8nfdi) {
+		*data++ = DECOMPOSE;
+		s = (unsigned char*)leaf->utf8nfdi;
+		while ((*data++ = *s++) != 0)
+			;
+	} else {
+		*data++ = leaf->ccc;
+	}
+	return data;
+}
+
+static unsigned char *nfdicf_emit(void *l, unsigned char *data)
+{
+	struct unicode_data *leaf = l;
+	unsigned char *s;
+
+	*data++ = leaf->gen;
+
+	if (HANGUL_SYLLABLE(leaf->code)) {
+		*data++ = DECOMPOSE;
+		*data++ = HANGUL;
+	} else if (leaf->utf8nfdicf) {
+		*data++ = DECOMPOSE;
+		s = (unsigned char*)leaf->utf8nfdicf;
+		while ((*data++ = *s++) != 0)
+			;
+	} else if (leaf->utf8nfdi) {
+		*data++ = DECOMPOSE;
+		s = (unsigned char*)leaf->utf8nfdi;
+		while ((*data++ = *s++) != 0)
+			;
+	} else {
+		*data++ = leaf->ccc;
+	}
+	return data;
+}
+
+static void utf8_create(struct unicode_data *data)
+{
+	char utf[18*4+1];
+	char *u;
+	unsigned int *um;
+	int i;
+
+	if (data->utf8nfdi) {
+		assert(data->utf8nfdi[0] == HANGUL);
+		return;
+	}
+
+	u = utf;
+	um = data->utf32nfdi;
+	if (um) {
+		for (i = 0; um[i]; i++)
+			u += utf8encode(u, um[i]);
+		*u = '\0';
+		data->utf8nfdi = strdup(utf);
+	}
+	u = utf;
+	um = data->utf32nfdicf;
+	if (um) {
+		for (i = 0; um[i]; i++)
+			u += utf8encode(u, um[i]);
+		*u = '\0';
+		if (!data->utf8nfdi || strcmp(data->utf8nfdi, utf))
+			data->utf8nfdicf = strdup(utf);
+	}
+}
+
+static void utf8_init(void)
+{
+	unsigned int unichar;
+	int i;
+
+	for (unichar = 0; unichar != 0x110000; unichar++)
+		utf8_create(&unicode_data[unichar]);
+
+	for (i = 0; i != corrections_count; i++)
+		utf8_create(&corrections[i]);
+}
+
+static void trees_init(void)
+{
+	struct unicode_data *data;
+	unsigned int maxage;
+	unsigned int nextage;
+	int count;
+	int i;
+	int j;
+
+	/* Count the number of different ages. */
+	count = 0;
+	nextage = (unsigned int)-1;
+	do {
+		maxage = nextage;
+		nextage = 0;
+		for (i = 0; i <= corrections_count; i++) {
+			data = &corrections[i];
+			if (nextage < data->correction &&
+			    data->correction < maxage)
+				nextage = data->correction;
+		}
+		count++;
+	} while (nextage);
+
+	/* Two trees per age: nfdi and nfdicf */
+	trees_count = count * 2;
+	trees = calloc(trees_count, sizeof(struct tree));
+
+	/* Assign ages to the trees. */
+	count = trees_count;
+	nextage = (unsigned int)-1;
+	do {
+		maxage = nextage;
+		trees[--count].maxage = maxage;
+		trees[--count].maxage = maxage;
+		nextage = 0;
+		for (i = 0; i <= corrections_count; i++) {
+			data = &corrections[i];
+			if (nextage < data->correction &&
+			    data->correction < maxage)
+				nextage = data->correction;
+		}
+	} while (nextage);
+
+	/* The ages assigned above are off by one. */
+	for (i = 0; i != trees_count; i++) {
+		j = 0;
+		while (ages[j] < trees[i].maxage)
+			j++;
+		trees[i].maxage = ages[j-1];
+	}
+
+	/* Set up the forwarding between trees. */
+	trees[trees_count-2].next = &trees[trees_count-1];
+	trees[trees_count-1].leaf_mark = nfdi_mark;
+	trees[trees_count-2].leaf_mark = nfdicf_mark;
+	for (i = 0; i != trees_count-2; i += 2) {
+		trees[i].next = &trees[trees_count-2];
+		trees[i].leaf_mark = correction_mark;
+		trees[i+1].next = &trees[trees_count-1];
+		trees[i+1].leaf_mark = correction_mark;
+	}
+
+	/* Assign the callouts. */
+	for (i = 0; i != trees_count; i += 2) {
+		trees[i].type = "nfdicf";
+		trees[i].leaf_equal = nfdicf_equal;
+		trees[i].leaf_print = nfdicf_print;
+		trees[i].leaf_size = nfdicf_size;
+		trees[i].leaf_index = nfdicf_index;
+		trees[i].leaf_emit = nfdicf_emit;
+
+		trees[i+1].type = "nfdi";
+		trees[i+1].leaf_equal = nfdi_equal;
+		trees[i+1].leaf_print = nfdi_print;
+		trees[i+1].leaf_size = nfdi_size;
+		trees[i+1].leaf_index = nfdi_index;
+		trees[i+1].leaf_emit = nfdi_emit;
+	}
+
+	/* Finish init. */
+	for (i = 0; i != trees_count; i++)
+		trees[i].childnode = NODE;
+}
+
+static void trees_populate(void)
+{
+	struct unicode_data *data;
+	unsigned int unichar;
+	char keyval[4];
+	int keylen;
+	int i;
+
+	for (i = 0; i != trees_count; i++) {
+		if (verbose > 0) {
+			printf("Populating %s_%x\n",
+				trees[i].type, trees[i].maxage);
+		}
+		for (unichar = 0; unichar != 0x110000; unichar++) {
+			if (unicode_data[unichar].gen < 0)
+				continue;
+			keylen = utf8encode(keyval, unichar);
+			data = corrections_lookup(&unicode_data[unichar]);
+			if (data->correction <= trees[i].maxage)
+				data = &unicode_data[unichar];
+			insert(&trees[i], keyval, keylen, data);
+		}
+	}
+}
+
+static void trees_reduce(void)
+{
+	int i;
+	int size;
+	int changed;
+
+	for (i = 0; i != trees_count; i++)
+		prune(&trees[i]);
+	for (i = 0; i != trees_count; i++)
+		mark_nodes(&trees[i]);
+	do {
+		size = 0;
+		for (i = 0; i != trees_count; i++)
+			size = index_nodes(&trees[i], size);
+		changed = 0;
+		for (i = 0; i != trees_count; i++)
+			changed += size_nodes(&trees[i]);
+	} while (changed);
+
+	utf8data = calloc(size, 1);
+	utf8data_size = size;
+	for (i = 0; i != trees_count; i++)
+		emit(&trees[i], utf8data);
+
+	if (verbose > 0) {
+		for (i = 0; i != trees_count; i++) {
+			printf("%s_%x idx %d\n",
+				trees[i].type, trees[i].maxage, trees[i].index);
+		}
+	}
+
+	nfdi = utf8data + trees[trees_count-1].index;
+	nfdicf = utf8data + trees[trees_count-2].index;
+
+	nfdi_tree = &trees[trees_count-1];
+	nfdicf_tree = &trees[trees_count-2];
+}
+
+static void verify(struct tree *tree)
+{
+	struct unicode_data *data;
+	utf8leaf_t	*leaf;
+	unsigned int	unichar;
+	char		key[4];
+	unsigned char	hangul[UTF8HANGULLEAF];
+	int		report;
+	int		nocf;
+
+	if (verbose > 0)
+		printf("Verifying %s_%x\n", tree->type, tree->maxage);
+	nocf = strcmp(tree->type, "nfdicf");
+
+	for (unichar = 0; unichar != 0x110000; unichar++) {
+		report = 0;
+		data = corrections_lookup(&unicode_data[unichar]);
+		if (data->correction <= tree->maxage)
+			data = &unicode_data[unichar];
+		utf8encode(key,unichar);
+		leaf = utf8lookup(tree, hangul, key);
+
+		if (!leaf) {
+			if (data->gen != -1)
+				report++;
+			if (unichar < 0xd800 || unichar > 0xdfff)
+				report++;
+		} else {
+			if (unichar >= 0xd800 && unichar <= 0xdfff)
+				report++;
+			if (data->gen == -1)
+				report++;
+			if (data->gen != LEAF_GEN(leaf))
+				report++;
+			if (LEAF_CCC(leaf) == DECOMPOSE) {
+				if (HANGUL_SYLLABLE(data->code)) {
+					if (data->utf8nfdi[0] != HANGUL)
+						report++;
+				} else if (nocf) {
+					if (!data->utf8nfdi) {
+						report++;
+					} else if (strcmp(data->utf8nfdi,
+							  LEAF_STR(leaf))) {
+						report++;
+					}
+				} else {
+					if (!data->utf8nfdicf &&
+					    !data->utf8nfdi) {
+						report++;
+					} else if (data->utf8nfdicf) {
+						if (strcmp(data->utf8nfdicf,
+							   LEAF_STR(leaf)))
+							report++;
+					} else if (strcmp(data->utf8nfdi,
+							  LEAF_STR(leaf))) {
+						report++;
+					}
+				}
+			} else if (data->ccc != LEAF_CCC(leaf)) {
+				report++;
+			}
+		}
+		if (report) {
+			printf("%X code %X gen %d ccc %d"
+				" nfdi -> \"%s\"",
+				unichar, data->code, data->gen,
+				data->ccc,
+				data->utf8nfdi);
+			if (leaf) {
+				printf(" gen %d ccc %d"
+					" nfdi -> \"%s\"",
+					LEAF_GEN(leaf),
+					LEAF_CCC(leaf),
+					LEAF_CCC(leaf) == DECOMPOSE ?
+						LEAF_STR(leaf) : "");
+			}
+			printf("\n");
+		}
+	}
+}
+
+static void trees_verify(void)
+{
+	int i;
+
+	for (i = 0; i != trees_count; i++)
+		verify(&trees[i]);
+}
+
+/* ------------------------------------------------------------------ */
+
+static void help(void)
+{
+	printf("Usage: %s [options]\n", argv0);
+	printf("\n");
+	printf("This program creates an a data trie used for parsing and\n");
+	printf("normalization of UTF-8 strings. The trie is derived from\n");
+	printf("a set of input files from the Unicode character database\n");
+	printf("found at: http://www.unicode.org/Public/UCD/latest/ucd/\n");
+	printf("\n");
+	printf("The generated tree supports two normalization forms:\n");
+	printf("\n");
+	printf("\tnfdi:\n");
+	printf("\t- Apply unicode normalization form NFD.\n");
+	printf("\t- Remove any Default_Ignorable_Code_Point.\n");
+	printf("\n");
+	printf("\tnfdicf:\n");
+	printf("\t- Apply unicode normalization form NFD.\n");
+	printf("\t- Remove any Default_Ignorable_Code_Point.\n");
+	printf("\t- Apply a full casefold (C + F).\n");
+	printf("\n");
+	printf("These forms were chosen as being most useful when dealing\n");
+	printf("with file names: NFD catches most cases where characters\n");
+	printf("should be considered equivalent. The ignorables are mostly\n");
+	printf("invisible, making names hard to type.\n");
+	printf("\n");
+	printf("The options to specify the files to be used are listed\n");
+	printf("below with their default values, which are the names used\n");
+	printf("by version 11.0.0 of the Unicode Character Database.\n");
+	printf("\n");
+	printf("The input files:\n");
+	printf("\t-a %s\n", AGE_NAME);
+	printf("\t-c %s\n", CCC_NAME);
+	printf("\t-p %s\n", PROP_NAME);
+	printf("\t-d %s\n", DATA_NAME);
+	printf("\t-f %s\n", FOLD_NAME);
+	printf("\t-n %s\n", NORM_NAME);
+	printf("\n");
+	printf("Additionally, the generated tables are tested using:\n");
+	printf("\t-t %s\n", TEST_NAME);
+	printf("\n");
+	printf("Finally, the output file:\n");
+	printf("\t-o %s\n", UTF8_NAME);
+	printf("\n");
+}
+
+static void usage(void)
+{
+	help();
+	exit(1);
+}
+
+static void open_fail(const char *name, int error)
+{
+	printf("Error %d opening %s: %s\n", error, name, strerror(error));
+	exit(1);
+}
+
+static void file_fail(const char *filename)
+{
+	printf("Error parsing %s\n", filename);
+	exit(1);
+}
+
+static void line_fail(const char *filename, const char *line)
+{
+	printf("Error parsing %s:%s\n", filename, line);
+	exit(1);
+}
+
+/* ------------------------------------------------------------------ */
+
+static void print_utf32(unsigned int *utf32str)
+{
+	int	i;
+
+	for (i = 0; utf32str[i]; i++)
+		printf(" %X", utf32str[i]);
+}
+
+static void print_utf32nfdi(unsigned int unichar)
+{
+	printf(" %X ->", unichar);
+	print_utf32(unicode_data[unichar].utf32nfdi);
+	printf("\n");
+}
+
+static void print_utf32nfdicf(unsigned int unichar)
+{
+	printf(" %X ->", unichar);
+	print_utf32(unicode_data[unichar].utf32nfdicf);
+	printf("\n");
+}
+
+/* ------------------------------------------------------------------ */
+
+static void age_init(void)
+{
+	FILE *file;
+	unsigned int first;
+	unsigned int last;
+	unsigned int unichar;
+	unsigned int major;
+	unsigned int minor;
+	unsigned int revision;
+	int gen;
+	int count;
+	int ret;
+
+	if (verbose > 0)
+		printf("Parsing %s\n", age_name);
+
+	file = fopen(age_name, "r");
+	if (!file)
+		open_fail(age_name, errno);
+	count = 0;
+
+	gen = 0;
+	while (fgets(line, LINESIZE, file)) {
+		ret = sscanf(line, "# Age=V%d_%d_%d",
+				&major, &minor, &revision);
+		if (ret == 3) {
+			ages_count++;
+			if (verbose > 1)
+				printf(" Age V%d_%d_%d\n",
+					major, minor, revision);
+			if (!age_valid(major, minor, revision))
+				line_fail(age_name, line);
+			continue;
+		}
+		ret = sscanf(line, "# Age=V%d_%d", &major, &minor);
+		if (ret == 2) {
+			ages_count++;
+			if (verbose > 1)
+				printf(" Age V%d_%d\n", major, minor);
+			if (!age_valid(major, minor, 0))
+				line_fail(age_name, line);
+			continue;
+		}
+	}
+
+	/* We must have found something above. */
+	if (verbose > 1)
+		printf("%d age entries\n", ages_count);
+	if (ages_count == 0 || ages_count > MAXGEN)
+		file_fail(age_name);
+
+	/* There is a 0 entry. */
+	ages_count++;
+	ages = calloc(ages_count + 1, sizeof(*ages));
+	/* And a guard entry. */
+	ages[ages_count] = (unsigned int)-1;
+
+	rewind(file);
+	count = 0;
+	gen = 0;
+	while (fgets(line, LINESIZE, file)) {
+		ret = sscanf(line, "# Age=V%d_%d_%d",
+				&major, &minor, &revision);
+		if (ret == 3) {
+			ages[++gen] =
+				UNICODE_AGE(major, minor, revision);
+			if (verbose > 1)
+				printf(" Age V%d_%d_%d = gen %d\n",
+					major, minor, revision, gen);
+			if (!age_valid(major, minor, revision))
+				line_fail(age_name, line);
+			continue;
+		}
+		ret = sscanf(line, "# Age=V%d_%d", &major, &minor);
+		if (ret == 2) {
+			ages[++gen] = UNICODE_AGE(major, minor, 0);
+			if (verbose > 1)
+				printf(" Age V%d_%d = %d\n",
+					major, minor, gen);
+			if (!age_valid(major, minor, 0))
+				line_fail(age_name, line);
+			continue;
+		}
+		ret = sscanf(line, "%X..%X ; %d.%d #",
+			     &first, &last, &major, &minor);
+		if (ret == 4) {
+			for (unichar = first; unichar <= last; unichar++)
+				unicode_data[unichar].gen = gen;
+			count += 1 + last - first;
+			if (verbose > 1)
+				printf("  %X..%X gen %d\n", first, last, gen);
+			if (!utf32valid(first) || !utf32valid(last))
+				line_fail(age_name, line);
+			continue;
+		}
+		ret = sscanf(line, "%X ; %d.%d #", &unichar, &major, &minor);
+		if (ret == 3) {
+			unicode_data[unichar].gen = gen;
+			count++;
+			if (verbose > 1)
+				printf("  %X gen %d\n", unichar, gen);
+			if (!utf32valid(unichar))
+				line_fail(age_name, line);
+			continue;
+		}
+	}
+	unicode_maxage = ages[gen];
+	fclose(file);
+
+	/* Nix surrogate block */
+	if (verbose > 1)
+		printf(" Removing surrogate block D800..DFFF\n");
+	for (unichar = 0xd800; unichar <= 0xdfff; unichar++)
+		unicode_data[unichar].gen = -1;
+
+	if (verbose > 0)
+	        printf("Found %d entries\n", count);
+	if (count == 0)
+		file_fail(age_name);
+}
+
+static void ccc_init(void)
+{
+	FILE *file;
+	unsigned int first;
+	unsigned int last;
+	unsigned int unichar;
+	unsigned int value;
+	int count;
+	int ret;
+
+	if (verbose > 0)
+		printf("Parsing %s\n", ccc_name);
+
+	file = fopen(ccc_name, "r");
+	if (!file)
+		open_fail(ccc_name, errno);
+
+	count = 0;
+	while (fgets(line, LINESIZE, file)) {
+		ret = sscanf(line, "%X..%X ; %d #", &first, &last, &value);
+		if (ret == 3) {
+			for (unichar = first; unichar <= last; unichar++) {
+				unicode_data[unichar].ccc = value;
+                                count++;
+			}
+			if (verbose > 1)
+				printf(" %X..%X ccc %d\n", first, last, value);
+			if (!utf32valid(first) || !utf32valid(last))
+				line_fail(ccc_name, line);
+			continue;
+		}
+		ret = sscanf(line, "%X ; %d #", &unichar, &value);
+		if (ret == 2) {
+			unicode_data[unichar].ccc = value;
+                        count++;
+			if (verbose > 1)
+				printf(" %X ccc %d\n", unichar, value);
+			if (!utf32valid(unichar))
+				line_fail(ccc_name, line);
+			continue;
+		}
+	}
+	fclose(file);
+
+	if (verbose > 0)
+		printf("Found %d entries\n", count);
+	if (count == 0)
+		file_fail(ccc_name);
+}
+
+static int ignore_compatibility_form(char *type)
+{
+	int i;
+	char *ignored_types[] = {"font", "noBreak", "initial", "medial",
+				 "final", "isolated", "circle", "super",
+				 "sub", "vertical", "wide", "narrow",
+				 "small", "square", "fraction", "compat"};
+
+	for (i = 0 ; i < ARRAY_SIZE(ignored_types); i++)
+		if (strcmp(type, ignored_types[i]) == 0)
+			return 1;
+	return 0;
+}
+
+static void nfdi_init(void)
+{
+	FILE *file;
+	unsigned int unichar;
+	unsigned int mapping[19]; /* Magic - guaranteed not to be exceeded. */
+	char *s;
+	char *type;
+	unsigned int *um;
+	int count;
+	int i;
+	int ret;
+
+	if (verbose > 0)
+		printf("Parsing %s\n", data_name);
+	file = fopen(data_name, "r");
+	if (!file)
+		open_fail(data_name, errno);
+
+	count = 0;
+	while (fgets(line, LINESIZE, file)) {
+		ret = sscanf(line, "%X;%*[^;];%*[^;];%*[^;];%*[^;];%[^;];",
+			     &unichar, buf0);
+		if (ret != 2)
+			continue;
+		if (!utf32valid(unichar))
+			line_fail(data_name, line);
+
+		s = buf0;
+		/* skip over <tag> */
+		if (*s == '<') {
+			type = ++s;
+			while (*++s != '>');
+			*s++ = '\0';
+			if(ignore_compatibility_form(type))
+				continue;
+		}
+		/* decode the decomposition into UTF-32 */
+		i = 0;
+		while (*s) {
+			mapping[i] = strtoul(s, &s, 16);
+			if (!utf32valid(mapping[i]))
+				line_fail(data_name, line);
+			i++;
+		}
+		mapping[i++] = 0;
+
+		um = malloc(i * sizeof(unsigned int));
+		memcpy(um, mapping, i * sizeof(unsigned int));
+		unicode_data[unichar].utf32nfdi = um;
+
+		if (verbose > 1)
+			print_utf32nfdi(unichar);
+		count++;
+	}
+	fclose(file);
+	if (verbose > 0)
+		printf("Found %d entries\n", count);
+	if (count == 0)
+		file_fail(data_name);
+}
+
+static void nfdicf_init(void)
+{
+	FILE *file;
+	unsigned int unichar;
+	unsigned int mapping[19]; /* Magic - guaranteed not to be exceeded. */
+	char status;
+	char *s;
+	unsigned int *um;
+	int i;
+	int count;
+	int ret;
+
+	if (verbose > 0)
+		printf("Parsing %s\n", fold_name);
+	file = fopen(fold_name, "r");
+	if (!file)
+		open_fail(fold_name, errno);
+
+	count = 0;
+	while (fgets(line, LINESIZE, file)) {
+		ret = sscanf(line, "%X; %c; %[^;];", &unichar, &status, buf0);
+		if (ret != 3)
+			continue;
+		if (!utf32valid(unichar))
+			line_fail(fold_name, line);
+		/* Use the C+F casefold. */
+		if (status != 'C' && status != 'F')
+			continue;
+		s = buf0;
+		if (*s == '<')
+			while (*s++ != ' ')
+				;
+		i = 0;
+		while (*s) {
+			mapping[i] = strtoul(s, &s, 16);
+			if (!utf32valid(mapping[i]))
+				line_fail(fold_name, line);
+			i++;
+		}
+		mapping[i++] = 0;
+
+		um = malloc(i * sizeof(unsigned int));
+		memcpy(um, mapping, i * sizeof(unsigned int));
+		unicode_data[unichar].utf32nfdicf = um;
+
+		if (verbose > 1)
+			print_utf32nfdicf(unichar);
+		count++;
+	}
+	fclose(file);
+	if (verbose > 0)
+		printf("Found %d entries\n", count);
+	if (count == 0)
+		file_fail(fold_name);
+}
+
+static void ignore_init(void)
+{
+	FILE *file;
+	unsigned int unichar;
+	unsigned int first;
+	unsigned int last;
+	unsigned int *um;
+	int count;
+	int ret;
+
+	if (verbose > 0)
+		printf("Parsing %s\n", prop_name);
+	file = fopen(prop_name, "r");
+	if (!file)
+		open_fail(prop_name, errno);
+	assert(file);
+	count = 0;
+	while (fgets(line, LINESIZE, file)) {
+		ret = sscanf(line, "%X..%X ; %s # ", &first, &last, buf0);
+		if (ret == 3) {
+			if (strcmp(buf0, "Default_Ignorable_Code_Point"))
+				continue;
+			if (!utf32valid(first) || !utf32valid(last))
+				line_fail(prop_name, line);
+			for (unichar = first; unichar <= last; unichar++) {
+				free(unicode_data[unichar].utf32nfdi);
+				um = malloc(sizeof(unsigned int));
+				*um = 0;
+				unicode_data[unichar].utf32nfdi = um;
+				free(unicode_data[unichar].utf32nfdicf);
+				um = malloc(sizeof(unsigned int));
+				*um = 0;
+				unicode_data[unichar].utf32nfdicf = um;
+				count++;
+			}
+			if (verbose > 1)
+				printf(" %X..%X Default_Ignorable_Code_Point\n",
+					first, last);
+			continue;
+		}
+		ret = sscanf(line, "%X ; %s # ", &unichar, buf0);
+		if (ret == 2) {
+			if (strcmp(buf0, "Default_Ignorable_Code_Point"))
+				continue;
+			if (!utf32valid(unichar))
+				line_fail(prop_name, line);
+			free(unicode_data[unichar].utf32nfdi);
+			um = malloc(sizeof(unsigned int));
+			*um = 0;
+			unicode_data[unichar].utf32nfdi = um;
+			free(unicode_data[unichar].utf32nfdicf);
+			um = malloc(sizeof(unsigned int));
+			*um = 0;
+			unicode_data[unichar].utf32nfdicf = um;
+			if (verbose > 1)
+				printf(" %X Default_Ignorable_Code_Point\n",
+					unichar);
+			count++;
+			continue;
+		}
+	}
+	fclose(file);
+
+	if (verbose > 0)
+		printf("Found %d entries\n", count);
+	if (count == 0)
+		file_fail(prop_name);
+}
+
+static void corrections_init(void)
+{
+	FILE *file;
+	unsigned int unichar;
+	unsigned int major;
+	unsigned int minor;
+	unsigned int revision;
+	unsigned int age;
+	unsigned int *um;
+	unsigned int mapping[19]; /* Magic - guaranteed not to be exceeded. */
+	char *s;
+	int i;
+	int count;
+	int ret;
+
+	if (verbose > 0)
+		printf("Parsing %s\n", norm_name);
+	file = fopen(norm_name, "r");
+	if (!file)
+		open_fail(norm_name, errno);
+
+	count = 0;
+	while (fgets(line, LINESIZE, file)) {
+		ret = sscanf(line, "%X;%[^;];%[^;];%d.%d.%d #",
+				&unichar, buf0, buf1,
+				&major, &minor, &revision);
+		if (ret != 6)
+			continue;
+		if (!utf32valid(unichar) || !age_valid(major, minor, revision))
+			line_fail(norm_name, line);
+		count++;
+	}
+	corrections = calloc(count, sizeof(struct unicode_data));
+	corrections_count = count;
+	rewind(file);
+
+	count = 0;
+	while (fgets(line, LINESIZE, file)) {
+		ret = sscanf(line, "%X;%[^;];%[^;];%d.%d.%d #",
+				&unichar, buf0, buf1,
+				&major, &minor, &revision);
+		if (ret != 6)
+			continue;
+		if (!utf32valid(unichar) || !age_valid(major, minor, revision))
+			line_fail(norm_name, line);
+		corrections[count] = unicode_data[unichar];
+		assert(corrections[count].code == unichar);
+		age = UNICODE_AGE(major, minor, revision);
+		corrections[count].correction = age;
+
+		i = 0;
+		s = buf0;
+		while (*s) {
+			mapping[i] = strtoul(s, &s, 16);
+			if (!utf32valid(mapping[i]))
+				line_fail(norm_name, line);
+			i++;
+		}
+		mapping[i++] = 0;
+
+		um = malloc(i * sizeof(unsigned int));
+		memcpy(um, mapping, i * sizeof(unsigned int));
+		corrections[count].utf32nfdi = um;
+
+		if (verbose > 1)
+			printf(" %X -> %s -> %s V%d_%d_%d\n",
+				unichar, buf0, buf1, major, minor, revision);
+		count++;
+	}
+	fclose(file);
+
+	if (verbose > 0)
+	        printf("Found %d entries\n", count);
+	if (count == 0)
+		file_fail(norm_name);
+}
+
+/* ------------------------------------------------------------------ */
+
+/*
+ * Hangul decomposition (algorithm from Section 3.12 of Unicode 6.3.0)
+ *
+ * AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+ * D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+ *
+ * SBase = 0xAC00
+ * LBase = 0x1100
+ * VBase = 0x1161
+ * TBase = 0x11A7
+ * LCount = 19
+ * VCount = 21
+ * TCount = 28
+ * NCount = 588 (VCount * TCount)
+ * SCount = 11172 (LCount * NCount)
+ *
+ * Decomposition:
+ *   SIndex = s - SBase
+ *
+ * LV (Canonical/Full)
+ *   LIndex = SIndex / NCount
+ *   VIndex = (Sindex % NCount) / TCount
+ *   LPart = LBase + LIndex
+ *   VPart = VBase + VIndex
+ *
+ * LVT (Canonical)
+ *   LVIndex = (SIndex / TCount) * TCount
+ *   TIndex = (Sindex % TCount)
+ *   LVPart = SBase + LVIndex
+ *   TPart = TBase + TIndex
+ *
+ * LVT (Full)
+ *   LIndex = SIndex / NCount
+ *   VIndex = (Sindex % NCount) / TCount
+ *   TIndex = (Sindex % TCount)
+ *   LPart = LBase + LIndex
+ *   VPart = VBase + VIndex
+ *   if (TIndex == 0) {
+ *          d = <LPart, VPart>
+ *   } else {
+ *          TPart = TBase + TIndex
+ *          d = <LPart, VPart, TPart>
+ *   }
+ *
+ */
+
+static void hangul_decompose(void)
+{
+	unsigned int sb = 0xAC00;
+	unsigned int lb = 0x1100;
+	unsigned int vb = 0x1161;
+	unsigned int tb = 0x11a7;
+	/* unsigned int lc = 19; */
+	unsigned int vc = 21;
+	unsigned int tc = 28;
+	unsigned int nc = (vc * tc);
+	/* unsigned int sc = (lc * nc); */
+	unsigned int unichar;
+	unsigned int mapping[4];
+	unsigned int *um;
+        int count;
+	int i;
+
+	if (verbose > 0)
+		printf("Decomposing hangul\n");
+	/* Hangul */
+	count = 0;
+	for (unichar = 0xAC00; unichar <= 0xD7A3; unichar++) {
+		unsigned int si = unichar - sb;
+		unsigned int li = si / nc;
+		unsigned int vi = (si % nc) / tc;
+		unsigned int ti = si % tc;
+
+		i = 0;
+		mapping[i++] = lb + li;
+		mapping[i++] = vb + vi;
+		if (ti)
+			mapping[i++] = tb + ti;
+		mapping[i++] = 0;
+
+		assert(!unicode_data[unichar].utf32nfdi);
+		um = malloc(i * sizeof(unsigned int));
+		memcpy(um, mapping, i * sizeof(unsigned int));
+		unicode_data[unichar].utf32nfdi = um;
+
+		assert(!unicode_data[unichar].utf32nfdicf);
+		um = malloc(i * sizeof(unsigned int));
+		memcpy(um, mapping, i * sizeof(unsigned int));
+		unicode_data[unichar].utf32nfdicf = um;
+
+		/*
+		 * Add a cookie as a reminder that the hangul syllable
+		 * decompositions must not be stored in the generated
+		 * trie.
+		 */
+		unicode_data[unichar].utf8nfdi = malloc(2);
+		unicode_data[unichar].utf8nfdi[0] = HANGUL;
+		unicode_data[unichar].utf8nfdi[1] = '\0';
+
+		if (verbose > 1)
+			print_utf32nfdi(unichar);
+
+		count++;
+	}
+	if (verbose > 0)
+		printf("Created %d entries\n", count);
+}
+
+static void nfdi_decompose(void)
+{
+	unsigned int unichar;
+	unsigned int mapping[19]; /* Magic - guaranteed not to be exceeded. */
+	unsigned int *um;
+	unsigned int *dc;
+	int count;
+	int i;
+	int j;
+	int ret;
+
+	if (verbose > 0)
+		printf("Decomposing nfdi\n");
+
+	count = 0;
+	for (unichar = 0; unichar != 0x110000; unichar++) {
+		if (!unicode_data[unichar].utf32nfdi)
+			continue;
+		for (;;) {
+			ret = 1;
+			i = 0;
+			um = unicode_data[unichar].utf32nfdi;
+			while (*um) {
+				dc = unicode_data[*um].utf32nfdi;
+				if (dc) {
+					for (j = 0; dc[j]; j++)
+						mapping[i++] = dc[j];
+					ret = 0;
+				} else {
+					mapping[i++] = *um;
+				}
+				um++;
+			}
+			mapping[i++] = 0;
+			if (ret)
+				break;
+			free(unicode_data[unichar].utf32nfdi);
+			um = malloc(i * sizeof(unsigned int));
+			memcpy(um, mapping, i * sizeof(unsigned int));
+			unicode_data[unichar].utf32nfdi = um;
+		}
+		/* Add this decomposition to nfdicf if there is no entry. */
+		if (!unicode_data[unichar].utf32nfdicf) {
+			um = malloc(i * sizeof(unsigned int));
+			memcpy(um, mapping, i * sizeof(unsigned int));
+			unicode_data[unichar].utf32nfdicf = um;
+		}
+		if (verbose > 1)
+			print_utf32nfdi(unichar);
+		count++;
+	}
+	if (verbose > 0)
+		printf("Processed %d entries\n", count);
+}
+
+static void nfdicf_decompose(void)
+{
+	unsigned int unichar;
+	unsigned int mapping[19]; /* Magic - guaranteed not to be exceeded. */
+	unsigned int *um;
+	unsigned int *dc;
+	int count;
+	int i;
+	int j;
+	int ret;
+
+	if (verbose > 0)
+		printf("Decomposing nfdicf\n");
+	count = 0;
+	for (unichar = 0; unichar != 0x110000; unichar++) {
+		if (!unicode_data[unichar].utf32nfdicf)
+			continue;
+		for (;;) {
+			ret = 1;
+			i = 0;
+			um = unicode_data[unichar].utf32nfdicf;
+			while (*um) {
+				dc = unicode_data[*um].utf32nfdicf;
+				if (dc) {
+					for (j = 0; dc[j]; j++)
+						mapping[i++] = dc[j];
+					ret = 0;
+				} else {
+					mapping[i++] = *um;
+				}
+				um++;
+			}
+			mapping[i++] = 0;
+			if (ret)
+				break;
+			free(unicode_data[unichar].utf32nfdicf);
+			um = malloc(i * sizeof(unsigned int));
+			memcpy(um, mapping, i * sizeof(unsigned int));
+			unicode_data[unichar].utf32nfdicf = um;
+		}
+		if (verbose > 1)
+			print_utf32nfdicf(unichar);
+		count++;
+	}
+	if (verbose > 0)
+		printf("Processed %d entries\n", count);
+}
+
+/* ------------------------------------------------------------------ */
+
+int utf8agemax(struct tree *, const char *);
+int utf8nagemax(struct tree *, const char *, size_t);
+int utf8agemin(struct tree *, const char *);
+int utf8nagemin(struct tree *, const char *, size_t);
+ssize_t utf8len(struct tree *, const char *);
+ssize_t utf8nlen(struct tree *, const char *, size_t);
+struct utf8cursor;
+int utf8cursor(struct utf8cursor *, struct tree *, const char *);
+int utf8ncursor(struct utf8cursor *, struct tree *, const char *, size_t);
+int utf8byte(struct utf8cursor *);
+
+/*
+ * Hangul decomposition (algorithm from Section 3.12 of Unicode 6.3.0)
+ *
+ * AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+ * D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+ *
+ * SBase = 0xAC00
+ * LBase = 0x1100
+ * VBase = 0x1161
+ * TBase = 0x11A7
+ * LCount = 19
+ * VCount = 21
+ * TCount = 28
+ * NCount = 588 (VCount * TCount)
+ * SCount = 11172 (LCount * NCount)
+ *
+ * Decomposition:
+ *   SIndex = s - SBase
+ *
+ * LV (Canonical/Full)
+ *   LIndex = SIndex / NCount
+ *   VIndex = (Sindex % NCount) / TCount
+ *   LPart = LBase + LIndex
+ *   VPart = VBase + VIndex
+ *
+ * LVT (Canonical)
+ *   LVIndex = (SIndex / TCount) * TCount
+ *   TIndex = (Sindex % TCount)
+ *   LVPart = SBase + LVIndex
+ *   TPart = TBase + TIndex
+ *
+ * LVT (Full)
+ *   LIndex = SIndex / NCount
+ *   VIndex = (Sindex % NCount) / TCount
+ *   TIndex = (Sindex % TCount)
+ *   LPart = LBase + LIndex
+ *   VPart = VBase + VIndex
+ *   if (TIndex == 0) {
+ *          d = <LPart, VPart>
+ *   } else {
+ *          TPart = TBase + TIndex
+ *          d = <LPart, VPart, TPart>
+ *   }
+ */
+
+/* Constants */
+#define SB	(0xAC00)
+#define LB	(0x1100)
+#define VB	(0x1161)
+#define TB	(0x11A7)
+#define LC	(19)
+#define VC	(21)
+#define TC	(28)
+#define NC	(VC * TC)
+#define SC	(LC * NC)
+
+/* Algorithmic decomposition of hangul syllable. */
+static utf8leaf_t *utf8hangul(const char *str, unsigned char *hangul)
+{
+	unsigned int	si;
+	unsigned int	li;
+	unsigned int	vi;
+	unsigned int	ti;
+	unsigned char	*h;
+
+	/* Calculate the SI, LI, VI, and TI values. */
+	si = utf8decode(str) - SB;
+	li = si / NC;
+	vi = (si % NC) / TC;
+	ti = si % TC;
+
+	/* Fill in base of leaf. */
+	h = hangul;
+	LEAF_GEN(h) = 2;
+	LEAF_CCC(h) = DECOMPOSE;
+	h += 2;
+
+	/* Add LPart, a 3-byte UTF-8 sequence. */
+	h += utf8encode((char *)h, li + LB);
+
+	/* Add VPart, a 3-byte UTF-8 sequence. */
+	h += utf8encode((char *)h, vi + VB);
+
+	/* Add TPart if required, also a 3-byte UTF-8 sequence. */
+	if (ti)
+		h += utf8encode((char *)h, ti + TB);
+
+	/* Terminate string. */
+	h[0] = '\0';
+
+	return hangul;
+}
+
+/*
+ * Use trie to scan s, touching at most len bytes.
+ * Returns the leaf if one exists, NULL otherwise.
+ *
+ * A non-NULL return guarantees that the UTF-8 sequence starting at s
+ * is well-formed and corresponds to a known unicode code point.  The
+ * shorthand for this will be "is valid UTF-8 unicode".
+ */
+static utf8leaf_t *utf8nlookup(struct tree *tree, unsigned char *hangul,
+			       const char *s, size_t len)
+{
+	utf8trie_t	*trie;
+	int		offlen;
+	int		offset;
+	int		mask;
+	int		node;
+
+	if (!tree)
+		return NULL;
+	if (len == 0)
+		return NULL;
+	node = 1;
+	trie = utf8data + tree->index;
+	while (node) {
+		offlen = (*trie & OFFLEN) >> OFFLEN_SHIFT;
+		if (*trie & NEXTBYTE) {
+			if (--len == 0)
+				return NULL;
+			s++;
+		}
+		mask = 1 << (*trie & BITNUM);
+		if (*s & mask) {
+			/* Right leg */
+			if (offlen) {
+				/* Right node at offset of trie */
+				node = (*trie & RIGHTNODE);
+				offset = trie[offlen];
+				while (--offlen) {
+					offset <<= 8;
+					offset |= trie[offlen];
+				}
+				trie += offset;
+			} else if (*trie & RIGHTPATH) {
+				/* Right node after this node */
+				node = (*trie & TRIENODE);
+				trie++;
+			} else {
+				/* No right node. */
+				return NULL;
+			}
+		} else {
+			/* Left leg */
+			if (offlen) {
+				/* Left node after this node. */
+				node = (*trie & LEFTNODE);
+				trie += offlen + 1;
+			} else if (*trie & RIGHTPATH) {
+				/* No left node. */
+				return NULL;
+			} else {
+				/* Left node after this node */
+				node = (*trie & TRIENODE);
+				trie++;
+			}
+		}
+	}
+	/*
+	 * Hangul decomposition is done algorithmically. These are the
+	 * codepoints >= 0xAC00 and <= 0xD7A3. Their UTF-8 encoding is
+	 * always 3 bytes long, so s has been advanced twice, and the
+	 * start of the sequence is at s-2.
+	 */
+	if (LEAF_CCC(trie) == DECOMPOSE && LEAF_STR(trie)[0] == HANGUL)
+		trie = utf8hangul(s - 2, hangul);
+	return trie;
+}
+
+/*
+ * Use trie to scan s.
+ * Returns the leaf if one exists, NULL otherwise.
+ *
+ * Forwards to trie_nlookup().
+ */
+static utf8leaf_t *utf8lookup(struct tree *tree, unsigned char *hangul,
+			      const char *s)
+{
+	return utf8nlookup(tree, hangul, s, (size_t)-1);
+}
+
+/*
+ * Return the number of bytes used by the current UTF-8 sequence.
+ * Assumes the input points to the first byte of a valid UTF-8
+ * sequence.
+ */
+static inline int utf8clen(const char *s)
+{
+	unsigned char c = *s;
+	return 1 + (c >= 0xC0) + (c >= 0xE0) + (c >= 0xF0);
+}
+
+/*
+ * Maximum age of any character in s.
+ * Return -1 if s is not valid UTF-8 unicode.
+ * Return 0 if only non-assigned code points are used.
+ */
+int utf8agemax(struct tree *tree, const char *s)
+{
+	utf8leaf_t	*leaf;
+	int		age = 0;
+	int		leaf_age;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!tree)
+		return -1;
+
+	while (*s) {
+		leaf = utf8lookup(tree, hangul, s);
+		if (!leaf)
+			return -1;
+		leaf_age = ages[LEAF_GEN(leaf)];
+		if (leaf_age <= tree->maxage && leaf_age > age)
+			age = leaf_age;
+		s += utf8clen(s);
+	}
+	return age;
+}
+
+/*
+ * Minimum age of any character in s.
+ * Return -1 if s is not valid UTF-8 unicode.
+ * Return 0 if non-assigned code points are used.
+ */
+int utf8agemin(struct tree *tree, const char *s)
+{
+	utf8leaf_t	*leaf;
+	int		age;
+	int		leaf_age;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!tree)
+		return -1;
+	age = tree->maxage;
+	while (*s) {
+		leaf = utf8lookup(tree, hangul, s);
+		if (!leaf)
+			return -1;
+		leaf_age = ages[LEAF_GEN(leaf)];
+		if (leaf_age <= tree->maxage && leaf_age < age)
+			age = leaf_age;
+		s += utf8clen(s);
+	}
+	return age;
+}
+
+/*
+ * Maximum age of any character in s, touch at most len bytes.
+ * Return -1 if s is not valid UTF-8 unicode.
+ */
+int utf8nagemax(struct tree *tree, const char *s, size_t len)
+{
+	utf8leaf_t	*leaf;
+	int		age = 0;
+	int		leaf_age;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!tree)
+		return -1;
+
+        while (len && *s) {
+		leaf = utf8nlookup(tree, hangul, s, len);
+		if (!leaf)
+			return -1;
+		leaf_age = ages[LEAF_GEN(leaf)];
+		if (leaf_age <= tree->maxage && leaf_age > age)
+			age = leaf_age;
+		len -= utf8clen(s);
+		s += utf8clen(s);
+	}
+	return age;
+}
+
+/*
+ * Maximum age of any character in s, touch at most len bytes.
+ * Return -1 if s is not valid UTF-8 unicode.
+ */
+int utf8nagemin(struct tree *tree, const char *s, size_t len)
+{
+	utf8leaf_t	*leaf;
+	int		leaf_age;
+	int		age;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!tree)
+		return -1;
+	age = tree->maxage;
+        while (len && *s) {
+		leaf = utf8nlookup(tree, hangul, s, len);
+		if (!leaf)
+			return -1;
+		leaf_age = ages[LEAF_GEN(leaf)];
+		if (leaf_age <= tree->maxage && leaf_age < age)
+			age = leaf_age;
+		len -= utf8clen(s);
+		s += utf8clen(s);
+	}
+	return age;
+}
+
+/*
+ * Length of the normalization of s.
+ * Return -1 if s is not valid UTF-8 unicode.
+ *
+ * A string of Default_Ignorable_Code_Point has length 0.
+ */
+ssize_t utf8len(struct tree *tree, const char *s)
+{
+	utf8leaf_t	*leaf;
+	size_t		ret = 0;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!tree)
+		return -1;
+	while (*s) {
+		leaf = utf8lookup(tree, hangul, s);
+		if (!leaf)
+			return -1;
+		if (ages[LEAF_GEN(leaf)] > tree->maxage)
+			ret += utf8clen(s);
+		else if (LEAF_CCC(leaf) == DECOMPOSE)
+			ret += strlen(LEAF_STR(leaf));
+		else
+			ret += utf8clen(s);
+		s += utf8clen(s);
+	}
+	return ret;
+}
+
+/*
+ * Length of the normalization of s, touch at most len bytes.
+ * Return -1 if s is not valid UTF-8 unicode.
+ */
+ssize_t utf8nlen(struct tree *tree, const char *s, size_t len)
+{
+	utf8leaf_t	*leaf;
+	size_t		ret = 0;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!tree)
+		return -1;
+	while (len && *s) {
+		leaf = utf8nlookup(tree, hangul, s, len);
+		if (!leaf)
+			return -1;
+		if (ages[LEAF_GEN(leaf)] > tree->maxage)
+			ret += utf8clen(s);
+		else if (LEAF_CCC(leaf) == DECOMPOSE)
+			ret += strlen(LEAF_STR(leaf));
+		else
+			ret += utf8clen(s);
+		len -= utf8clen(s);
+		s += utf8clen(s);
+	}
+	return ret;
+}
+
+/*
+ * Cursor structure used by the normalizer.
+ */
+struct utf8cursor {
+	struct tree	*tree;
+	const char	*s;
+	const char	*p;
+	const char	*ss;
+	const char	*sp;
+	unsigned int	len;
+	unsigned int	slen;
+	short int	ccc;
+	short int	nccc;
+	unsigned int	unichar;
+	unsigned char	hangul[UTF8HANGULLEAF];
+};
+
+/*
+ * Set up an utf8cursor for use by utf8byte().
+ *
+ *   s      : string.
+ *   len    : length of s.
+ *   u8c    : pointer to cursor.
+ *   trie   : utf8trie_t to use for normalization.
+ *
+ * Returns -1 on error, 0 on success.
+ */
+int utf8ncursor(struct utf8cursor *u8c, struct tree *tree, const char *s,
+		size_t len)
+{
+	if (!tree)
+		return -1;
+	if (!s)
+		return -1;
+	u8c->tree = tree;
+	u8c->s = s;
+	u8c->p = NULL;
+	u8c->ss = NULL;
+	u8c->sp = NULL;
+	u8c->len = len;
+	u8c->slen = 0;
+	u8c->ccc = STOPPER;
+	u8c->nccc = STOPPER;
+	u8c->unichar = 0;
+	/* Check we didn't clobber the maximum length. */
+	if (u8c->len != len)
+		return -1;
+	/* The first byte of s may not be an utf8 continuation. */
+	if (len > 0 && (*s & 0xC0) == 0x80)
+		return -1;
+	return 0;
+}
+
+/*
+ * Set up an utf8cursor for use by utf8byte().
+ *
+ *   s      : NUL-terminated string.
+ *   u8c    : pointer to cursor.
+ *   trie   : utf8trie_t to use for normalization.
+ *
+ * Returns -1 on error, 0 on success.
+ */
+int utf8cursor(struct utf8cursor *u8c, struct tree *tree, const char *s)
+{
+	return utf8ncursor(u8c, tree, s, (unsigned int)-1);
+}
+
+/*
+ * Get one byte from the normalized form of the string described by u8c.
+ *
+ * Returns the byte cast to an unsigned char on succes, and -1 on failure.
+ *
+ * The cursor keeps track of the location in the string in u8c->s.
+ * When a character is decomposed, the current location is stored in
+ * u8c->p, and u8c->s is set to the start of the decomposition. Note
+ * that bytes from a decomposition do not count against u8c->len.
+ *
+ * Characters are emitted if they match the current CCC in u8c->ccc.
+ * Hitting end-of-string while u8c->ccc == STOPPER means we're done,
+ * and the function returns 0 in that case.
+ *
+ * Sorting by CCC is done by repeatedly scanning the string.  The
+ * values of u8c->s and u8c->p are stored in u8c->ss and u8c->sp at
+ * the start of the scan.  The first pass finds the lowest CCC to be
+ * emitted and stores it in u8c->nccc, the second pass emits the
+ * characters with this CCC and finds the next lowest CCC. This limits
+ * the number of passes to 1 + the number of different CCCs in the
+ * sequence being scanned.
+ *
+ * Therefore:
+ *  u8c->p  != NULL -> a decomposition is being scanned.
+ *  u8c->ss != NULL -> this is a repeating scan.
+ *  u8c->ccc == -1  -> this is the first scan of a repeating scan.
+ */
+int utf8byte(struct utf8cursor *u8c)
+{
+	utf8leaf_t *leaf;
+	int ccc;
+
+	for (;;) {
+		/* Check for the end of a decomposed character. */
+		if (u8c->p && *u8c->s == '\0') {
+			u8c->s = u8c->p;
+			u8c->p = NULL;
+		}
+
+		/* Check for end-of-string. */
+		if (!u8c->p && (u8c->len == 0 || *u8c->s == '\0')) {
+			/* There is no next byte. */
+			if (u8c->ccc == STOPPER)
+				return 0;
+			/* End-of-string during a scan counts as a stopper. */
+			ccc = STOPPER;
+			goto ccc_mismatch;
+		} else if ((*u8c->s & 0xC0) == 0x80) {
+			/* This is a continuation of the current character. */
+			if (!u8c->p)
+				u8c->len--;
+			return (unsigned char)*u8c->s++;
+		}
+
+		/* Look up the data for the current character. */
+		if (u8c->p) {
+			leaf = utf8lookup(u8c->tree, u8c->hangul, u8c->s);
+		} else {
+			leaf = utf8nlookup(u8c->tree, u8c->hangul,
+					   u8c->s, u8c->len);
+		}
+
+		/* No leaf found implies that the input is a binary blob. */
+		if (!leaf)
+			return -1;
+
+		/* Characters that are too new have CCC 0. */
+		if (ages[LEAF_GEN(leaf)] > u8c->tree->maxage) {
+			ccc = STOPPER;
+		} else if ((ccc = LEAF_CCC(leaf)) == DECOMPOSE) {
+			u8c->len -= utf8clen(u8c->s);
+			u8c->p = u8c->s + utf8clen(u8c->s);
+			u8c->s = LEAF_STR(leaf);
+			/* Empty decomposition implies CCC 0. */
+			if (*u8c->s == '\0') {
+				if (u8c->ccc == STOPPER)
+					continue;
+				ccc = STOPPER;
+				goto ccc_mismatch;
+			}
+			leaf = utf8lookup(u8c->tree, u8c->hangul, u8c->s);
+			ccc = LEAF_CCC(leaf);
+		}
+		u8c->unichar = utf8decode(u8c->s);
+
+		/*
+		 * If this is not a stopper, then see if it updates
+		 * the next canonical class to be emitted.
+		 */
+		if (ccc != STOPPER && u8c->ccc < ccc && ccc < u8c->nccc)
+			u8c->nccc = ccc;
+
+		/*
+		 * Return the current byte if this is the current
+		 * combining class.
+		 */
+		if (ccc == u8c->ccc) {
+			if (!u8c->p)
+				u8c->len--;
+			return (unsigned char)*u8c->s++;
+		}
+
+		/* Current combining class mismatch. */
+	ccc_mismatch:
+		if (u8c->nccc == STOPPER) {
+			/*
+			 * Scan forward for the first canonical class
+			 * to be emitted.  Save the position from
+			 * which to restart.
+			 */
+			assert(u8c->ccc == STOPPER);
+			u8c->ccc = MINCCC - 1;
+			u8c->nccc = ccc;
+			u8c->sp = u8c->p;
+			u8c->ss = u8c->s;
+			u8c->slen = u8c->len;
+			if (!u8c->p)
+				u8c->len -= utf8clen(u8c->s);
+			u8c->s += utf8clen(u8c->s);
+		} else if (ccc != STOPPER) {
+			/* Not a stopper, and not the ccc we're emitting. */
+			if (!u8c->p)
+				u8c->len -= utf8clen(u8c->s);
+			u8c->s += utf8clen(u8c->s);
+		} else if (u8c->nccc != MAXCCC + 1) {
+			/* At a stopper, restart for next ccc. */
+			u8c->ccc = u8c->nccc;
+			u8c->nccc = MAXCCC + 1;
+			u8c->s = u8c->ss;
+			u8c->p = u8c->sp;
+			u8c->len = u8c->slen;
+		} else {
+			/* All done, proceed from here. */
+			u8c->ccc = STOPPER;
+			u8c->nccc = STOPPER;
+			u8c->sp = NULL;
+			u8c->ss = NULL;
+			u8c->slen = 0;
+		}
+	}
+}
+
+/* ------------------------------------------------------------------ */
+
+static int normalize_line(struct tree *tree)
+{
+	char *s;
+	char *t;
+	int c;
+	struct utf8cursor u8c;
+
+	/* First test: null-terminated string. */
+	s = buf2;
+	t = buf3;
+	if (utf8cursor(&u8c, tree, s))
+		return -1;
+	while ((c = utf8byte(&u8c)) > 0)
+		if (c != (unsigned char)*t++)
+			return -1;
+	if (c < 0)
+		return -1;
+	if (*t != 0)
+		return -1;
+
+	/* Second test: length-limited string. */
+	s = buf2;
+	/* Replace NUL with a value that will cause an error if seen. */
+	s[strlen(s) + 1] = -1;
+	t = buf3;
+	if (utf8cursor(&u8c, tree, s))
+		return -1;
+	while ((c = utf8byte(&u8c)) > 0)
+		if (c != (unsigned char)*t++)
+			return -1;
+	if (c < 0)
+		return -1;
+	if (*t != 0)
+		return -1;
+
+	return 0;
+}
+
+static void normalization_test(void)
+{
+	FILE *file;
+	unsigned int unichar;
+	struct unicode_data *data;
+	char *s;
+	char *t;
+	int ret;
+	int ignorables;
+	int tests = 0;
+	int failures = 0;
+
+	if (verbose > 0)
+		printf("Parsing %s\n", test_name);
+	/* Step one, read data from file. */
+	file = fopen(test_name, "r");
+	if (!file)
+		open_fail(test_name, errno);
+
+	while (fgets(line, LINESIZE, file)) {
+		ret = sscanf(line, "%[^;];%*[^;];%[^;];%*[^;];%*[^;];",
+			     buf0, buf1);
+		if (ret != 2 || *line == '#')
+			continue;
+		s = buf0;
+		t = buf2;
+		while (*s) {
+			unichar = strtoul(s, &s, 16);
+			t += utf8encode(t, unichar);
+		}
+		*t = '\0';
+
+		ignorables = 0;
+		s = buf1;
+		t = buf3;
+		while (*s) {
+			unichar = strtoul(s, &s, 16);
+			data = &unicode_data[unichar];
+			if (data->utf8nfdi && !*data->utf8nfdi)
+				ignorables = 1;
+			else
+				t += utf8encode(t, unichar);
+		}
+		*t = '\0';
+
+		tests++;
+		if (normalize_line(nfdi_tree) < 0) {
+			printf("Line %s -> %s", buf0, buf1);
+			if (ignorables)
+				printf(" (ignorables removed)");
+			printf(" failure\n");
+			failures++;
+		}
+	}
+	fclose(file);
+	if (verbose > 0)
+		printf("Ran %d tests with %d failures\n", tests, failures);
+	if (failures)
+		file_fail(test_name);
+}
+
+/* ------------------------------------------------------------------ */
+
+static void write_file(void)
+{
+	FILE *file;
+	int i;
+	int j;
+	int t;
+	int gen;
+
+	if (verbose > 0)
+		printf("Writing %s\n", utf8_name);
+	file = fopen(utf8_name, "w");
+	if (!file)
+		open_fail(utf8_name, errno);
+
+	fprintf(file, "/* This file is generated code, do not edit. */\n");
+	fprintf(file, "#ifndef __INCLUDED_FROM_UTF8NORM_C__\n");
+	fprintf(file, "#error Only nls_utf8-norm.c should include this file.\n");
+	fprintf(file, "#endif\n");
+	fprintf(file, "\n");
+	fprintf(file, "static const unsigned int utf8vers = %#x;\n",
+		unicode_maxage);
+	fprintf(file, "\n");
+	fprintf(file, "static const unsigned int utf8agetab[] = {\n");
+	for (i = 0; i != ages_count; i++)
+		fprintf(file, "\t%#x%s\n", ages[i],
+			ages[i] == unicode_maxage ? "" : ",");
+	fprintf(file, "};\n");
+	fprintf(file, "\n");
+	fprintf(file, "static const struct utf8data utf8nfdicfdata[] = {\n");
+	t = 0;
+	for (gen = 0; gen < ages_count; gen++) {
+		fprintf(file, "\t{ %#x, %d }%s\n",
+			ages[gen], trees[t].index,
+			ages[gen] == unicode_maxage ? "" : ",");
+		if (trees[t].maxage == ages[gen])
+			t += 2;
+	}
+	fprintf(file, "};\n");
+	fprintf(file, "\n");
+	fprintf(file, "static const struct utf8data utf8nfdidata[] = {\n");
+	t = 1;
+	for (gen = 0; gen < ages_count; gen++) {
+		fprintf(file, "\t{ %#x, %d }%s\n",
+			ages[gen], trees[t].index,
+			ages[gen] == unicode_maxage ? "" : ",");
+		if (trees[t].maxage == ages[gen])
+			t += 2;
+	}
+	fprintf(file, "};\n");
+	fprintf(file, "\n");
+	fprintf(file, "static const unsigned char utf8data[%zd] = {\n",
+		utf8data_size);
+	t = 0;
+	for (i = 0; i != utf8data_size; i += 16) {
+		if (i == trees[t].index) {
+			fprintf(file, "\t/* %s_%x */\n",
+				trees[t].type, trees[t].maxage);
+			if (t < trees_count-1)
+				t++;
+		}
+		fprintf(file, "\t");
+		for (j = i; j != i + 16; j++)
+			fprintf(file, "0x%.2x%s", utf8data[j],
+				(j < utf8data_size -1 ? "," : ""));
+		fprintf(file, "\n");
+	}
+	fprintf(file, "};\n");
+	fclose(file);
+}
+
+/* ------------------------------------------------------------------ */
+
+int main(int argc, char *argv[])
+{
+	unsigned int unichar;
+	int opt;
+
+	argv0 = argv[0];
+
+	while ((opt = getopt(argc, argv, "a:c:d:f:hn:o:p:t:v")) != -1) {
+		switch (opt) {
+		case 'a':
+			age_name = optarg;
+			break;
+		case 'c':
+			ccc_name = optarg;
+			break;
+		case 'd':
+			data_name = optarg;
+			break;
+		case 'f':
+			fold_name = optarg;
+			break;
+		case 'n':
+			norm_name = optarg;
+			break;
+		case 'o':
+			utf8_name = optarg;
+			break;
+		case 'p':
+			prop_name = optarg;
+			break;
+		case 't':
+			test_name = optarg;
+			break;
+		case 'v':
+			verbose++;
+			break;
+		case 'h':
+			help();
+			exit(0);
+		default:
+			usage();
+		}
+	}
+
+	if (verbose > 1)
+		help();
+	for (unichar = 0; unichar != 0x110000; unichar++)
+		unicode_data[unichar].code = unichar;
+	age_init();
+	ccc_init();
+	nfdi_init();
+	nfdicf_init();
+	ignore_init();
+	corrections_init();
+	hangul_decompose();
+	nfdi_decompose();
+	nfdicf_decompose();
+	utf8_init();
+	trees_init();
+	trees_populate();
+	trees_reduce();
+	trees_verify();
+	/* Prevent "unused function" warning. */
+	(void)lookup(nfdi_tree, " ");
+	if (verbose > 2)
+		tree_walk(nfdi_tree);
+	if (verbose > 2)
+		tree_walk(nfdicf_tree);
+	normalization_test();
+	write_file();
+
+	return 0;
+}
diff --git a/fs/unicode/utf8-core.c b/fs/unicode/utf8-core.c
new file mode 100644
index 0000000..71ca4d0
--- /dev/null
+++ b/fs/unicode/utf8-core.c
@@ -0,0 +1,215 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/parser.h>
+#include <linux/errno.h>
+#include <linux/unicode.h>
+
+#include "utf8n.h"
+
+int utf8_validate(const struct unicode_map *um, const struct qstr *str)
+{
+	const struct utf8data *data = utf8nfdi(um->version);
+
+	if (utf8nlen(data, str->name, str->len) < 0)
+		return -1;
+	return 0;
+}
+EXPORT_SYMBOL(utf8_validate);
+
+int utf8_strncmp(const struct unicode_map *um,
+		 const struct qstr *s1, const struct qstr *s2)
+{
+	const struct utf8data *data = utf8nfdi(um->version);
+	struct utf8cursor cur1, cur2;
+	int c1, c2;
+
+	if (utf8ncursor(&cur1, data, s1->name, s1->len) < 0)
+		return -EINVAL;
+
+	if (utf8ncursor(&cur2, data, s2->name, s2->len) < 0)
+		return -EINVAL;
+
+	do {
+		c1 = utf8byte(&cur1);
+		c2 = utf8byte(&cur2);
+
+		if (c1 < 0 || c2 < 0)
+			return -EINVAL;
+		if (c1 != c2)
+			return 1;
+	} while (c1);
+
+	return 0;
+}
+EXPORT_SYMBOL(utf8_strncmp);
+
+int utf8_strncasecmp(const struct unicode_map *um,
+		     const struct qstr *s1, const struct qstr *s2)
+{
+	const struct utf8data *data = utf8nfdicf(um->version);
+	struct utf8cursor cur1, cur2;
+	int c1, c2;
+
+	if (utf8ncursor(&cur1, data, s1->name, s1->len) < 0)
+		return -EINVAL;
+
+	if (utf8ncursor(&cur2, data, s2->name, s2->len) < 0)
+		return -EINVAL;
+
+	do {
+		c1 = utf8byte(&cur1);
+		c2 = utf8byte(&cur2);
+
+		if (c1 < 0 || c2 < 0)
+			return -EINVAL;
+		if (c1 != c2)
+			return 1;
+	} while (c1);
+
+	return 0;
+}
+EXPORT_SYMBOL(utf8_strncasecmp);
+
+/* String cf is expected to be a valid UTF-8 casefolded
+ * string.
+ */
+int utf8_strncasecmp_folded(const struct unicode_map *um,
+			    const struct qstr *cf,
+			    const struct qstr *s1)
+{
+	const struct utf8data *data = utf8nfdicf(um->version);
+	struct utf8cursor cur1;
+	int c1, c2;
+	int i = 0;
+
+	if (utf8ncursor(&cur1, data, s1->name, s1->len) < 0)
+		return -EINVAL;
+
+	do {
+		c1 = utf8byte(&cur1);
+		c2 = cf->name[i++];
+		if (c1 < 0)
+			return -EINVAL;
+		if (c1 != c2)
+			return 1;
+	} while (c1);
+
+	return 0;
+}
+EXPORT_SYMBOL(utf8_strncasecmp_folded);
+
+int utf8_casefold(const struct unicode_map *um, const struct qstr *str,
+		  unsigned char *dest, size_t dlen)
+{
+	const struct utf8data *data = utf8nfdicf(um->version);
+	struct utf8cursor cur;
+	size_t nlen = 0;
+
+	if (utf8ncursor(&cur, data, str->name, str->len) < 0)
+		return -EINVAL;
+
+	for (nlen = 0; nlen < dlen; nlen++) {
+		int c = utf8byte(&cur);
+
+		dest[nlen] = c;
+		if (!c)
+			return nlen;
+		if (c == -1)
+			break;
+	}
+	return -EINVAL;
+}
+
+EXPORT_SYMBOL(utf8_casefold);
+
+int utf8_normalize(const struct unicode_map *um, const struct qstr *str,
+		   unsigned char *dest, size_t dlen)
+{
+	const struct utf8data *data = utf8nfdi(um->version);
+	struct utf8cursor cur;
+	ssize_t nlen = 0;
+
+	if (utf8ncursor(&cur, data, str->name, str->len) < 0)
+		return -EINVAL;
+
+	for (nlen = 0; nlen < dlen; nlen++) {
+		int c = utf8byte(&cur);
+
+		dest[nlen] = c;
+		if (!c)
+			return nlen;
+		if (c == -1)
+			break;
+	}
+	return -EINVAL;
+}
+
+EXPORT_SYMBOL(utf8_normalize);
+
+static int utf8_parse_version(const char *version, unsigned int *maj,
+			      unsigned int *min, unsigned int *rev)
+{
+	substring_t args[3];
+	char version_string[12];
+	const struct match_token token[] = {
+		{1, "%d.%d.%d"},
+		{0, NULL}
+	};
+
+	strncpy(version_string, version, sizeof(version_string));
+
+	if (match_token(version_string, token, args) != 1)
+		return -EINVAL;
+
+	if (match_int(&args[0], maj) || match_int(&args[1], min) ||
+	    match_int(&args[2], rev))
+		return -EINVAL;
+
+	return 0;
+}
+
+struct unicode_map *utf8_load(const char *version)
+{
+	struct unicode_map *um = NULL;
+	int unicode_version;
+
+	if (version) {
+		unsigned int maj, min, rev;
+
+		if (utf8_parse_version(version, &maj, &min, &rev) < 0)
+			return ERR_PTR(-EINVAL);
+
+		if (!utf8version_is_supported(maj, min, rev))
+			return ERR_PTR(-EINVAL);
+
+		unicode_version = UNICODE_AGE(maj, min, rev);
+	} else {
+		unicode_version = utf8version_latest();
+		printk(KERN_WARNING"UTF-8 version not specified. "
+		       "Assuming latest supported version (%d.%d.%d).",
+		       (unicode_version >> 16) & 0xff,
+		       (unicode_version >> 8) & 0xff,
+		       (unicode_version & 0xff));
+	}
+
+	um = kzalloc(sizeof(struct unicode_map), GFP_KERNEL);
+	if (!um)
+		return ERR_PTR(-ENOMEM);
+
+	um->charset = "UTF-8";
+	um->version = unicode_version;
+
+	return um;
+}
+EXPORT_SYMBOL(utf8_load);
+
+void utf8_unload(struct unicode_map *um)
+{
+	kfree(um);
+}
+EXPORT_SYMBOL(utf8_unload);
+
+MODULE_LICENSE("GPL v2");
diff --git a/fs/unicode/utf8-norm.c b/fs/unicode/utf8-norm.c
new file mode 100644
index 0000000..801ed6d
--- /dev/null
+++ b/fs/unicode/utf8-norm.c
@@ -0,0 +1,801 @@
+/*
+ * Copyright (c) 2014 SGI.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would 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.
+ *
+ */
+
+#include "utf8n.h"
+
+struct utf8data {
+	unsigned int maxage;
+	unsigned int offset;
+};
+
+#define __INCLUDED_FROM_UTF8NORM_C__
+#include "utf8data.h"
+#undef __INCLUDED_FROM_UTF8NORM_C__
+
+int utf8version_is_supported(u8 maj, u8 min, u8 rev)
+{
+	int i = ARRAY_SIZE(utf8agetab) - 1;
+	unsigned int sb_utf8version = UNICODE_AGE(maj, min, rev);
+
+	while (i >= 0 && utf8agetab[i] != 0) {
+		if (sb_utf8version == utf8agetab[i])
+			return 1;
+		i--;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(utf8version_is_supported);
+
+int utf8version_latest(void)
+{
+	return utf8vers;
+}
+EXPORT_SYMBOL(utf8version_latest);
+
+/*
+ * UTF-8 valid ranges.
+ *
+ * The UTF-8 encoding spreads the bits of a 32bit word over several
+ * bytes. This table gives the ranges that can be held and how they'd
+ * be represented.
+ *
+ * 0x00000000 0x0000007F: 0xxxxxxx
+ * 0x00000000 0x000007FF: 110xxxxx 10xxxxxx
+ * 0x00000000 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
+ * 0x00000000 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 0x00000000 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 0x00000000 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ *
+ * There is an additional requirement on UTF-8, in that only the
+ * shortest representation of a 32bit value is to be used.  A decoder
+ * must not decode sequences that do not satisfy this requirement.
+ * Thus the allowed ranges have a lower bound.
+ *
+ * 0x00000000 0x0000007F: 0xxxxxxx
+ * 0x00000080 0x000007FF: 110xxxxx 10xxxxxx
+ * 0x00000800 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
+ * 0x00010000 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 0x00200000 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 0x04000000 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ *
+ * Actual unicode characters are limited to the range 0x0 - 0x10FFFF,
+ * 17 planes of 65536 values.  This limits the sequences actually seen
+ * even more, to just the following.
+ *
+ *          0 -     0x7F: 0                   - 0x7F
+ *       0x80 -    0x7FF: 0xC2 0x80           - 0xDF 0xBF
+ *      0x800 -   0xFFFF: 0xE0 0xA0 0x80      - 0xEF 0xBF 0xBF
+ *    0x10000 - 0x10FFFF: 0xF0 0x90 0x80 0x80 - 0xF4 0x8F 0xBF 0xBF
+ *
+ * Within those ranges the surrogates 0xD800 - 0xDFFF are not allowed.
+ *
+ * Note that the longest sequence seen with valid usage is 4 bytes,
+ * the same a single UTF-32 character.  This makes the UTF-8
+ * representation of Unicode strictly smaller than UTF-32.
+ *
+ * The shortest sequence requirement was introduced by:
+ *    Corrigendum #1: UTF-8 Shortest Form
+ * It can be found here:
+ *    http://www.unicode.org/versions/corrigendum1.html
+ *
+ */
+
+/*
+ * Return the number of bytes used by the current UTF-8 sequence.
+ * Assumes the input points to the first byte of a valid UTF-8
+ * sequence.
+ */
+static inline int utf8clen(const char *s)
+{
+	unsigned char c = *s;
+
+	return 1 + (c >= 0xC0) + (c >= 0xE0) + (c >= 0xF0);
+}
+
+/*
+ * Decode a 3-byte UTF-8 sequence.
+ */
+static unsigned int
+utf8decode3(const char *str)
+{
+	unsigned int		uc;
+
+	uc = *str++ & 0x0F;
+	uc <<= 6;
+	uc |= *str++ & 0x3F;
+	uc <<= 6;
+	uc |= *str++ & 0x3F;
+
+	return uc;
+}
+
+/*
+ * Encode a 3-byte UTF-8 sequence.
+ */
+static int
+utf8encode3(char *str, unsigned int val)
+{
+	str[2] = (val & 0x3F) | 0x80;
+	val >>= 6;
+	str[1] = (val & 0x3F) | 0x80;
+	val >>= 6;
+	str[0] = val | 0xE0;
+
+	return 3;
+}
+
+/*
+ * utf8trie_t
+ *
+ * A compact binary tree, used to decode UTF-8 characters.
+ *
+ * Internal nodes are one byte for the node itself, and up to three
+ * bytes for an offset into the tree.  The first byte contains the
+ * following information:
+ *  NEXTBYTE  - flag        - advance to next byte if set
+ *  BITNUM    - 3 bit field - the bit number to tested
+ *  OFFLEN    - 2 bit field - number of bytes in the offset
+ * if offlen == 0 (non-branching node)
+ *  RIGHTPATH - 1 bit field - set if the following node is for the
+ *                            right-hand path (tested bit is set)
+ *  TRIENODE  - 1 bit field - set if the following node is an internal
+ *                            node, otherwise it is a leaf node
+ * if offlen != 0 (branching node)
+ *  LEFTNODE  - 1 bit field - set if the left-hand node is internal
+ *  RIGHTNODE - 1 bit field - set if the right-hand node is internal
+ *
+ * Due to the way utf8 works, there cannot be branching nodes with
+ * NEXTBYTE set, and moreover those nodes always have a righthand
+ * descendant.
+ */
+typedef const unsigned char utf8trie_t;
+#define BITNUM		0x07
+#define NEXTBYTE	0x08
+#define OFFLEN		0x30
+#define OFFLEN_SHIFT	4
+#define RIGHTPATH	0x40
+#define TRIENODE	0x80
+#define RIGHTNODE	0x40
+#define LEFTNODE	0x80
+
+/*
+ * utf8leaf_t
+ *
+ * The leaves of the trie are embedded in the trie, and so the same
+ * underlying datatype: unsigned char.
+ *
+ * leaf[0]: The unicode version, stored as a generation number that is
+ *          an index into utf8agetab[].  With this we can filter code
+ *          points based on the unicode version in which they were
+ *          defined.  The CCC of a non-defined code point is 0.
+ * leaf[1]: Canonical Combining Class. During normalization, we need
+ *          to do a stable sort into ascending order of all characters
+ *          with a non-zero CCC that occur between two characters with
+ *          a CCC of 0, or at the begin or end of a string.
+ *          The unicode standard guarantees that all CCC values are
+ *          between 0 and 254 inclusive, which leaves 255 available as
+ *          a special value.
+ *          Code points with CCC 0 are known as stoppers.
+ * leaf[2]: Decomposition. If leaf[1] == 255, then leaf[2] is the
+ *          start of a NUL-terminated string that is the decomposition
+ *          of the character.
+ *          The CCC of a decomposable character is the same as the CCC
+ *          of the first character of its decomposition.
+ *          Some characters decompose as the empty string: these are
+ *          characters with the Default_Ignorable_Code_Point property.
+ *          These do affect normalization, as they all have CCC 0.
+ *
+ * The decompositions in the trie have been fully expanded, with the
+ * exception of Hangul syllables, which are decomposed algorithmically.
+ *
+ * Casefolding, if applicable, is also done using decompositions.
+ *
+ * The trie is constructed in such a way that leaves exist for all
+ * UTF-8 sequences that match the criteria from the "UTF-8 valid
+ * ranges" comment above, and only for those sequences.  Therefore a
+ * lookup in the trie can be used to validate the UTF-8 input.
+ */
+typedef const unsigned char utf8leaf_t;
+
+#define LEAF_GEN(LEAF)	((LEAF)[0])
+#define LEAF_CCC(LEAF)	((LEAF)[1])
+#define LEAF_STR(LEAF)	((const char *)((LEAF) + 2))
+
+#define MINCCC		(0)
+#define MAXCCC		(254)
+#define STOPPER		(0)
+#define	DECOMPOSE	(255)
+
+/* Marker for hangul syllable decomposition. */
+#define HANGUL		((char)(255))
+/* Size of the synthesized leaf used for Hangul syllable decomposition. */
+#define UTF8HANGULLEAF	(12)
+
+/*
+ * Hangul decomposition (algorithm from Section 3.12 of Unicode 6.3.0)
+ *
+ * AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+ * D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+ *
+ * SBase = 0xAC00
+ * LBase = 0x1100
+ * VBase = 0x1161
+ * TBase = 0x11A7
+ * LCount = 19
+ * VCount = 21
+ * TCount = 28
+ * NCount = 588 (VCount * TCount)
+ * SCount = 11172 (LCount * NCount)
+ *
+ * Decomposition:
+ *   SIndex = s - SBase
+ *
+ * LV (Canonical/Full)
+ *   LIndex = SIndex / NCount
+ *   VIndex = (Sindex % NCount) / TCount
+ *   LPart = LBase + LIndex
+ *   VPart = VBase + VIndex
+ *
+ * LVT (Canonical)
+ *   LVIndex = (SIndex / TCount) * TCount
+ *   TIndex = (Sindex % TCount)
+ *   LVPart = SBase + LVIndex
+ *   TPart = TBase + TIndex
+ *
+ * LVT (Full)
+ *   LIndex = SIndex / NCount
+ *   VIndex = (Sindex % NCount) / TCount
+ *   TIndex = (Sindex % TCount)
+ *   LPart = LBase + LIndex
+ *   VPart = VBase + VIndex
+ *   if (TIndex == 0) {
+ *          d = <LPart, VPart>
+ *   } else {
+ *          TPart = TBase + TIndex
+ *          d = <LPart, TPart, VPart>
+ *   }
+ */
+
+/* Constants */
+#define SB	(0xAC00)
+#define LB	(0x1100)
+#define VB	(0x1161)
+#define TB	(0x11A7)
+#define LC	(19)
+#define VC	(21)
+#define TC	(28)
+#define NC	(VC * TC)
+#define SC	(LC * NC)
+
+/* Algorithmic decomposition of hangul syllable. */
+static utf8leaf_t *
+utf8hangul(const char *str, unsigned char *hangul)
+{
+	unsigned int	si;
+	unsigned int	li;
+	unsigned int	vi;
+	unsigned int	ti;
+	unsigned char	*h;
+
+	/* Calculate the SI, LI, VI, and TI values. */
+	si = utf8decode3(str) - SB;
+	li = si / NC;
+	vi = (si % NC) / TC;
+	ti = si % TC;
+
+	/* Fill in base of leaf. */
+	h = hangul;
+	LEAF_GEN(h) = 2;
+	LEAF_CCC(h) = DECOMPOSE;
+	h += 2;
+
+	/* Add LPart, a 3-byte UTF-8 sequence. */
+	h += utf8encode3((char *)h, li + LB);
+
+	/* Add VPart, a 3-byte UTF-8 sequence. */
+	h += utf8encode3((char *)h, vi + VB);
+
+	/* Add TPart if required, also a 3-byte UTF-8 sequence. */
+	if (ti)
+		h += utf8encode3((char *)h, ti + TB);
+
+	/* Terminate string. */
+	h[0] = '\0';
+
+	return hangul;
+}
+
+/*
+ * Use trie to scan s, touching at most len bytes.
+ * Returns the leaf if one exists, NULL otherwise.
+ *
+ * A non-NULL return guarantees that the UTF-8 sequence starting at s
+ * is well-formed and corresponds to a known unicode code point.  The
+ * shorthand for this will be "is valid UTF-8 unicode".
+ */
+static utf8leaf_t *utf8nlookup(const struct utf8data *data,
+			       unsigned char *hangul, const char *s, size_t len)
+{
+	utf8trie_t	*trie = NULL;
+	int		offlen;
+	int		offset;
+	int		mask;
+	int		node;
+
+	if (!data)
+		return NULL;
+	if (len == 0)
+		return NULL;
+
+	trie = utf8data + data->offset;
+	node = 1;
+	while (node) {
+		offlen = (*trie & OFFLEN) >> OFFLEN_SHIFT;
+		if (*trie & NEXTBYTE) {
+			if (--len == 0)
+				return NULL;
+			s++;
+		}
+		mask = 1 << (*trie & BITNUM);
+		if (*s & mask) {
+			/* Right leg */
+			if (offlen) {
+				/* Right node at offset of trie */
+				node = (*trie & RIGHTNODE);
+				offset = trie[offlen];
+				while (--offlen) {
+					offset <<= 8;
+					offset |= trie[offlen];
+				}
+				trie += offset;
+			} else if (*trie & RIGHTPATH) {
+				/* Right node after this node */
+				node = (*trie & TRIENODE);
+				trie++;
+			} else {
+				/* No right node. */
+				return NULL;
+			}
+		} else {
+			/* Left leg */
+			if (offlen) {
+				/* Left node after this node. */
+				node = (*trie & LEFTNODE);
+				trie += offlen + 1;
+			} else if (*trie & RIGHTPATH) {
+				/* No left node. */
+				return NULL;
+			} else {
+				/* Left node after this node */
+				node = (*trie & TRIENODE);
+				trie++;
+			}
+		}
+	}
+	/*
+	 * Hangul decomposition is done algorithmically. These are the
+	 * codepoints >= 0xAC00 and <= 0xD7A3. Their UTF-8 encoding is
+	 * always 3 bytes long, so s has been advanced twice, and the
+	 * start of the sequence is at s-2.
+	 */
+	if (LEAF_CCC(trie) == DECOMPOSE && LEAF_STR(trie)[0] == HANGUL)
+		trie = utf8hangul(s - 2, hangul);
+	return trie;
+}
+
+/*
+ * Use trie to scan s.
+ * Returns the leaf if one exists, NULL otherwise.
+ *
+ * Forwards to utf8nlookup().
+ */
+static utf8leaf_t *utf8lookup(const struct utf8data *data,
+			      unsigned char *hangul, const char *s)
+{
+	return utf8nlookup(data, hangul, s, (size_t)-1);
+}
+
+/*
+ * Maximum age of any character in s.
+ * Return -1 if s is not valid UTF-8 unicode.
+ * Return 0 if only non-assigned code points are used.
+ */
+int utf8agemax(const struct utf8data *data, const char *s)
+{
+	utf8leaf_t	*leaf;
+	int		age = 0;
+	int		leaf_age;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!data)
+		return -1;
+
+	while (*s) {
+		leaf = utf8lookup(data, hangul, s);
+		if (!leaf)
+			return -1;
+
+		leaf_age = utf8agetab[LEAF_GEN(leaf)];
+		if (leaf_age <= data->maxage && leaf_age > age)
+			age = leaf_age;
+		s += utf8clen(s);
+	}
+	return age;
+}
+EXPORT_SYMBOL(utf8agemax);
+
+/*
+ * Minimum age of any character in s.
+ * Return -1 if s is not valid UTF-8 unicode.
+ * Return 0 if non-assigned code points are used.
+ */
+int utf8agemin(const struct utf8data *data, const char *s)
+{
+	utf8leaf_t	*leaf;
+	int		age;
+	int		leaf_age;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!data)
+		return -1;
+	age = data->maxage;
+	while (*s) {
+		leaf = utf8lookup(data, hangul, s);
+		if (!leaf)
+			return -1;
+		leaf_age = utf8agetab[LEAF_GEN(leaf)];
+		if (leaf_age <= data->maxage && leaf_age < age)
+			age = leaf_age;
+		s += utf8clen(s);
+	}
+	return age;
+}
+EXPORT_SYMBOL(utf8agemin);
+
+/*
+ * Maximum age of any character in s, touch at most len bytes.
+ * Return -1 if s is not valid UTF-8 unicode.
+ */
+int utf8nagemax(const struct utf8data *data, const char *s, size_t len)
+{
+	utf8leaf_t	*leaf;
+	int		age = 0;
+	int		leaf_age;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!data)
+		return -1;
+
+	while (len && *s) {
+		leaf = utf8nlookup(data, hangul, s, len);
+		if (!leaf)
+			return -1;
+		leaf_age = utf8agetab[LEAF_GEN(leaf)];
+		if (leaf_age <= data->maxage && leaf_age > age)
+			age = leaf_age;
+		len -= utf8clen(s);
+		s += utf8clen(s);
+	}
+	return age;
+}
+EXPORT_SYMBOL(utf8nagemax);
+
+/*
+ * Maximum age of any character in s, touch at most len bytes.
+ * Return -1 if s is not valid UTF-8 unicode.
+ */
+int utf8nagemin(const struct utf8data *data, const char *s, size_t len)
+{
+	utf8leaf_t	*leaf;
+	int		leaf_age;
+	int		age;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!data)
+		return -1;
+	age = data->maxage;
+	while (len && *s) {
+		leaf = utf8nlookup(data, hangul, s, len);
+		if (!leaf)
+			return -1;
+		leaf_age = utf8agetab[LEAF_GEN(leaf)];
+		if (leaf_age <= data->maxage && leaf_age < age)
+			age = leaf_age;
+		len -= utf8clen(s);
+		s += utf8clen(s);
+	}
+	return age;
+}
+EXPORT_SYMBOL(utf8nagemin);
+
+/*
+ * Length of the normalization of s.
+ * Return -1 if s is not valid UTF-8 unicode.
+ *
+ * A string of Default_Ignorable_Code_Point has length 0.
+ */
+ssize_t utf8len(const struct utf8data *data, const char *s)
+{
+	utf8leaf_t	*leaf;
+	size_t		ret = 0;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!data)
+		return -1;
+	while (*s) {
+		leaf = utf8lookup(data, hangul, s);
+		if (!leaf)
+			return -1;
+		if (utf8agetab[LEAF_GEN(leaf)] > data->maxage)
+			ret += utf8clen(s);
+		else if (LEAF_CCC(leaf) == DECOMPOSE)
+			ret += strlen(LEAF_STR(leaf));
+		else
+			ret += utf8clen(s);
+		s += utf8clen(s);
+	}
+	return ret;
+}
+EXPORT_SYMBOL(utf8len);
+
+/*
+ * Length of the normalization of s, touch at most len bytes.
+ * Return -1 if s is not valid UTF-8 unicode.
+ */
+ssize_t utf8nlen(const struct utf8data *data, const char *s, size_t len)
+{
+	utf8leaf_t	*leaf;
+	size_t		ret = 0;
+	unsigned char	hangul[UTF8HANGULLEAF];
+
+	if (!data)
+		return -1;
+	while (len && *s) {
+		leaf = utf8nlookup(data, hangul, s, len);
+		if (!leaf)
+			return -1;
+		if (utf8agetab[LEAF_GEN(leaf)] > data->maxage)
+			ret += utf8clen(s);
+		else if (LEAF_CCC(leaf) == DECOMPOSE)
+			ret += strlen(LEAF_STR(leaf));
+		else
+			ret += utf8clen(s);
+		len -= utf8clen(s);
+		s += utf8clen(s);
+	}
+	return ret;
+}
+EXPORT_SYMBOL(utf8nlen);
+
+/*
+ * Set up an utf8cursor for use by utf8byte().
+ *
+ *   u8c    : pointer to cursor.
+ *   data   : const struct utf8data to use for normalization.
+ *   s      : string.
+ *   len    : length of s.
+ *
+ * Returns -1 on error, 0 on success.
+ */
+int utf8ncursor(struct utf8cursor *u8c, const struct utf8data *data,
+		const char *s, size_t len)
+{
+	if (!data)
+		return -1;
+	if (!s)
+		return -1;
+	u8c->data = data;
+	u8c->s = s;
+	u8c->p = NULL;
+	u8c->ss = NULL;
+	u8c->sp = NULL;
+	u8c->len = len;
+	u8c->slen = 0;
+	u8c->ccc = STOPPER;
+	u8c->nccc = STOPPER;
+	/* Check we didn't clobber the maximum length. */
+	if (u8c->len != len)
+		return -1;
+	/* The first byte of s may not be an utf8 continuation. */
+	if (len > 0 && (*s & 0xC0) == 0x80)
+		return -1;
+	return 0;
+}
+EXPORT_SYMBOL(utf8ncursor);
+
+/*
+ * Set up an utf8cursor for use by utf8byte().
+ *
+ *   u8c    : pointer to cursor.
+ *   data   : const struct utf8data to use for normalization.
+ *   s      : NUL-terminated string.
+ *
+ * Returns -1 on error, 0 on success.
+ */
+int utf8cursor(struct utf8cursor *u8c, const struct utf8data *data,
+	       const char *s)
+{
+	return utf8ncursor(u8c, data, s, (unsigned int)-1);
+}
+EXPORT_SYMBOL(utf8cursor);
+
+/*
+ * Get one byte from the normalized form of the string described by u8c.
+ *
+ * Returns the byte cast to an unsigned char on succes, and -1 on failure.
+ *
+ * The cursor keeps track of the location in the string in u8c->s.
+ * When a character is decomposed, the current location is stored in
+ * u8c->p, and u8c->s is set to the start of the decomposition. Note
+ * that bytes from a decomposition do not count against u8c->len.
+ *
+ * Characters are emitted if they match the current CCC in u8c->ccc.
+ * Hitting end-of-string while u8c->ccc == STOPPER means we're done,
+ * and the function returns 0 in that case.
+ *
+ * Sorting by CCC is done by repeatedly scanning the string.  The
+ * values of u8c->s and u8c->p are stored in u8c->ss and u8c->sp at
+ * the start of the scan.  The first pass finds the lowest CCC to be
+ * emitted and stores it in u8c->nccc, the second pass emits the
+ * characters with this CCC and finds the next lowest CCC. This limits
+ * the number of passes to 1 + the number of different CCCs in the
+ * sequence being scanned.
+ *
+ * Therefore:
+ *  u8c->p  != NULL -> a decomposition is being scanned.
+ *  u8c->ss != NULL -> this is a repeating scan.
+ *  u8c->ccc == -1   -> this is the first scan of a repeating scan.
+ */
+int utf8byte(struct utf8cursor *u8c)
+{
+	utf8leaf_t *leaf;
+	int ccc;
+
+	for (;;) {
+		/* Check for the end of a decomposed character. */
+		if (u8c->p && *u8c->s == '\0') {
+			u8c->s = u8c->p;
+			u8c->p = NULL;
+		}
+
+		/* Check for end-of-string. */
+		if (!u8c->p && (u8c->len == 0 || *u8c->s == '\0')) {
+			/* There is no next byte. */
+			if (u8c->ccc == STOPPER)
+				return 0;
+			/* End-of-string during a scan counts as a stopper. */
+			ccc = STOPPER;
+			goto ccc_mismatch;
+		} else if ((*u8c->s & 0xC0) == 0x80) {
+			/* This is a continuation of the current character. */
+			if (!u8c->p)
+				u8c->len--;
+			return (unsigned char)*u8c->s++;
+		}
+
+		/* Look up the data for the current character. */
+		if (u8c->p) {
+			leaf = utf8lookup(u8c->data, u8c->hangul, u8c->s);
+		} else {
+			leaf = utf8nlookup(u8c->data, u8c->hangul,
+					   u8c->s, u8c->len);
+		}
+
+		/* No leaf found implies that the input is a binary blob. */
+		if (!leaf)
+			return -1;
+
+		ccc = LEAF_CCC(leaf);
+		/* Characters that are too new have CCC 0. */
+		if (utf8agetab[LEAF_GEN(leaf)] > u8c->data->maxage) {
+			ccc = STOPPER;
+		} else if (ccc == DECOMPOSE) {
+			u8c->len -= utf8clen(u8c->s);
+			u8c->p = u8c->s + utf8clen(u8c->s);
+			u8c->s = LEAF_STR(leaf);
+			/* Empty decomposition implies CCC 0. */
+			if (*u8c->s == '\0') {
+				if (u8c->ccc == STOPPER)
+					continue;
+				ccc = STOPPER;
+				goto ccc_mismatch;
+			}
+
+			leaf = utf8lookup(u8c->data, u8c->hangul, u8c->s);
+			if (!leaf)
+				return -1;
+			ccc = LEAF_CCC(leaf);
+		}
+
+		/*
+		 * If this is not a stopper, then see if it updates
+		 * the next canonical class to be emitted.
+		 */
+		if (ccc != STOPPER && u8c->ccc < ccc && ccc < u8c->nccc)
+			u8c->nccc = ccc;
+
+		/*
+		 * Return the current byte if this is the current
+		 * combining class.
+		 */
+		if (ccc == u8c->ccc) {
+			if (!u8c->p)
+				u8c->len--;
+			return (unsigned char)*u8c->s++;
+		}
+
+		/* Current combining class mismatch. */
+ccc_mismatch:
+		if (u8c->nccc == STOPPER) {
+			/*
+			 * Scan forward for the first canonical class
+			 * to be emitted.  Save the position from
+			 * which to restart.
+			 */
+			u8c->ccc = MINCCC - 1;
+			u8c->nccc = ccc;
+			u8c->sp = u8c->p;
+			u8c->ss = u8c->s;
+			u8c->slen = u8c->len;
+			if (!u8c->p)
+				u8c->len -= utf8clen(u8c->s);
+			u8c->s += utf8clen(u8c->s);
+		} else if (ccc != STOPPER) {
+			/* Not a stopper, and not the ccc we're emitting. */
+			if (!u8c->p)
+				u8c->len -= utf8clen(u8c->s);
+			u8c->s += utf8clen(u8c->s);
+		} else if (u8c->nccc != MAXCCC + 1) {
+			/* At a stopper, restart for next ccc. */
+			u8c->ccc = u8c->nccc;
+			u8c->nccc = MAXCCC + 1;
+			u8c->s = u8c->ss;
+			u8c->p = u8c->sp;
+			u8c->len = u8c->slen;
+		} else {
+			/* All done, proceed from here. */
+			u8c->ccc = STOPPER;
+			u8c->nccc = STOPPER;
+			u8c->sp = NULL;
+			u8c->ss = NULL;
+			u8c->slen = 0;
+		}
+	}
+}
+EXPORT_SYMBOL(utf8byte);
+
+const struct utf8data *utf8nfdi(unsigned int maxage)
+{
+	int i = ARRAY_SIZE(utf8nfdidata) - 1;
+
+	while (maxage < utf8nfdidata[i].maxage)
+		i--;
+	if (maxage > utf8nfdidata[i].maxage)
+		return NULL;
+	return &utf8nfdidata[i];
+}
+EXPORT_SYMBOL(utf8nfdi);
+
+const struct utf8data *utf8nfdicf(unsigned int maxage)
+{
+	int i = ARRAY_SIZE(utf8nfdicfdata) - 1;
+
+	while (maxage < utf8nfdicfdata[i].maxage)
+		i--;
+	if (maxage > utf8nfdicfdata[i].maxage)
+		return NULL;
+	return &utf8nfdicfdata[i];
+}
+EXPORT_SYMBOL(utf8nfdicf);
diff --git a/fs/unicode/utf8-selftest.c b/fs/unicode/utf8-selftest.c
new file mode 100644
index 0000000..8075201
--- /dev/null
+++ b/fs/unicode/utf8-selftest.c
@@ -0,0 +1,320 @@
+/*
+ * Kernel module for testing utf-8 support.
+ *
+ * Copyright 2017 Collabora Ltd.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/module.h>
+#include <linux/printk.h>
+#include <linux/unicode.h>
+#include <linux/dcache.h>
+
+#include "utf8n.h"
+
+unsigned int failed_tests;
+unsigned int total_tests;
+
+/* Tests will be based on this version. */
+#define latest_maj 12
+#define latest_min 1
+#define latest_rev 0
+
+#define _test(cond, func, line, fmt, ...) do {				\
+		total_tests++;						\
+		if (!cond) {						\
+			failed_tests++;					\
+			pr_err("test %s:%d Failed: %s%s",		\
+			       func, line, #cond, (fmt?":":"."));	\
+			if (fmt)					\
+				pr_err(fmt, ##__VA_ARGS__);		\
+		}							\
+	} while (0)
+#define test_f(cond, fmt, ...) _test(cond, __func__, __LINE__, fmt, ##__VA_ARGS__)
+#define test(cond) _test(cond, __func__, __LINE__, "")
+
+const static struct {
+	/* UTF-8 strings in this vector _must_ be NULL-terminated. */
+	unsigned char str[10];
+	unsigned char dec[10];
+} nfdi_test_data[] = {
+	/* Trivial sequence */
+	{
+		/* "ABba" decomposes to itself */
+		.str = "aBba",
+		.dec = "aBba",
+	},
+	/* Simple equivalent sequences */
+	{
+               /* 'VULGAR FRACTION ONE QUARTER' cannot decompose to
+                  'NUMBER 1' + 'FRACTION SLASH' + 'NUMBER 4' on
+                  canonical decomposition */
+               .str = {0xc2, 0xbc, 0x00},
+	       .dec = {0xc2, 0xbc, 0x00},
+	},
+	{
+		/* 'LATIN SMALL LETTER A WITH DIAERESIS' decomposes to
+		   'LETTER A' + 'COMBINING DIAERESIS' */
+		.str = {0xc3, 0xa4, 0x00},
+		.dec = {0x61, 0xcc, 0x88, 0x00},
+	},
+	{
+		/* 'LATIN SMALL LETTER LJ' can't decompose to
+		   'LETTER L' + 'LETTER J' on canonical decomposition */
+		.str = {0xC7, 0x89, 0x00},
+		.dec = {0xC7, 0x89, 0x00},
+	},
+	{
+		/* GREEK ANO TELEIA decomposes to MIDDLE DOT */
+		.str = {0xCE, 0x87, 0x00},
+		.dec = {0xC2, 0xB7, 0x00}
+	},
+	/* Canonical ordering */
+	{
+		/* A + 'COMBINING ACUTE ACCENT' + 'COMBINING OGONEK' decomposes
+		   to A + 'COMBINING OGONEK' + 'COMBINING ACUTE ACCENT' */
+		.str = {0x41, 0xcc, 0x81, 0xcc, 0xa8, 0x0},
+		.dec = {0x41, 0xcc, 0xa8, 0xcc, 0x81, 0x0},
+	},
+	{
+		/* 'LATIN SMALL LETTER A WITH DIAERESIS' + 'COMBINING OGONEK'
+		   decomposes to
+		   'LETTER A' + 'COMBINING OGONEK' + 'COMBINING DIAERESIS' */
+		.str = {0xc3, 0xa4, 0xCC, 0xA8, 0x00},
+
+		.dec = {0x61, 0xCC, 0xA8, 0xcc, 0x88, 0x00},
+	},
+
+};
+
+const static struct {
+	/* UTF-8 strings in this vector _must_ be NULL-terminated. */
+	unsigned char str[30];
+	unsigned char ncf[30];
+} nfdicf_test_data[] = {
+	/* Trivial sequences */
+	{
+		/* "ABba" folds to lowercase */
+		.str = {0x41, 0x42, 0x62, 0x61, 0x00},
+		.ncf = {0x61, 0x62, 0x62, 0x61, 0x00},
+	},
+	{
+		/* All ASCII folds to lower-case */
+		.str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0.1",
+		.ncf = "abcdefghijklmnopqrstuvwxyz0.1",
+	},
+	{
+		/* LATIN SMALL LETTER SHARP S folds to
+		   LATIN SMALL LETTER S + LATIN SMALL LETTER S */
+		.str = {0xc3, 0x9f, 0x00},
+		.ncf = {0x73, 0x73, 0x00},
+	},
+	{
+		/* LATIN CAPITAL LETTER A WITH RING ABOVE folds to
+		   LATIN SMALL LETTER A + COMBINING RING ABOVE */
+		.str = {0xC3, 0x85, 0x00},
+		.ncf = {0x61, 0xcc, 0x8a, 0x00},
+	},
+	/* Introduced by UTF-8.0.0. */
+	/* Cherokee letters are interesting test-cases because they fold
+	   to upper-case.  Before 8.0.0, Cherokee lowercase were
+	   undefined, thus, the folding from LC is not stable between
+	   7.0.0 -> 8.0.0, but it is from UC. */
+	{
+		/* CHEROKEE SMALL LETTER A folds to CHEROKEE LETTER A */
+		.str = {0xea, 0xad, 0xb0, 0x00},
+		.ncf = {0xe1, 0x8e, 0xa0, 0x00},
+	},
+	{
+		/* CHEROKEE SMALL LETTER YE folds to CHEROKEE LETTER YE */
+		.str = {0xe1, 0x8f, 0xb8, 0x00},
+		.ncf = {0xe1, 0x8f, 0xb0, 0x00},
+	},
+	{
+		/* OLD HUNGARIAN CAPITAL LETTER AMB folds to
+		   OLD HUNGARIAN SMALL LETTER AMB */
+		.str = {0xf0, 0x90, 0xb2, 0x83, 0x00},
+		.ncf = {0xf0, 0x90, 0xb3, 0x83, 0x00},
+	},
+	/* Introduced by UTF-9.0.0. */
+	{
+		/* OSAGE CAPITAL LETTER CHA folds to
+		   OSAGE SMALL LETTER CHA */
+		.str = {0xf0, 0x90, 0x92, 0xb5, 0x00},
+		.ncf = {0xf0, 0x90, 0x93, 0x9d, 0x00},
+	},
+	{
+		/* LATIN CAPITAL LETTER SMALL CAPITAL I folds to
+		   LATIN LETTER SMALL CAPITAL I */
+		.str = {0xea, 0x9e, 0xae, 0x00},
+		.ncf = {0xc9, 0xaa, 0x00},
+	},
+	/* Introduced by UTF-11.0.0. */
+	{
+		/* GEORGIAN SMALL LETTER AN folds to GEORGIAN MTAVRULI
+		   CAPITAL LETTER AN */
+		.str = {0xe1, 0xb2, 0x90, 0x00},
+		.ncf = {0xe1, 0x83, 0x90, 0x00},
+	}
+};
+
+static void check_utf8_nfdi(void)
+{
+	int i;
+	struct utf8cursor u8c;
+	const struct utf8data *data;
+
+	data = utf8nfdi(UNICODE_AGE(latest_maj, latest_min, latest_rev));
+	if (!data) {
+		pr_err("%s: Unable to load utf8-%d.%d.%d. Skipping.\n",
+		       __func__, latest_maj, latest_min, latest_rev);
+		return;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(nfdi_test_data); i++) {
+		int len = strlen(nfdi_test_data[i].str);
+		int nlen = strlen(nfdi_test_data[i].dec);
+		int j = 0;
+		unsigned char c;
+
+		test((utf8len(data, nfdi_test_data[i].str) == nlen));
+		test((utf8nlen(data, nfdi_test_data[i].str, len) == nlen));
+
+		if (utf8cursor(&u8c, data, nfdi_test_data[i].str) < 0)
+			pr_err("can't create cursor\n");
+
+		while ((c = utf8byte(&u8c)) > 0) {
+			test_f((c == nfdi_test_data[i].dec[j]),
+			       "Unexpected byte 0x%x should be 0x%x\n",
+			       c, nfdi_test_data[i].dec[j]);
+			j++;
+		}
+
+		test((j == nlen));
+	}
+}
+
+static void check_utf8_nfdicf(void)
+{
+	int i;
+	struct utf8cursor u8c;
+	const struct utf8data *data;
+
+	data = utf8nfdicf(UNICODE_AGE(latest_maj, latest_min, latest_rev));
+	if (!data) {
+		pr_err("%s: Unable to load utf8-%d.%d.%d. Skipping.\n",
+		       __func__, latest_maj, latest_min, latest_rev);
+		return;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(nfdicf_test_data); i++) {
+		int len = strlen(nfdicf_test_data[i].str);
+		int nlen = strlen(nfdicf_test_data[i].ncf);
+		int j = 0;
+		unsigned char c;
+
+		test((utf8len(data, nfdicf_test_data[i].str) == nlen));
+		test((utf8nlen(data, nfdicf_test_data[i].str, len) == nlen));
+
+		if (utf8cursor(&u8c, data, nfdicf_test_data[i].str) < 0)
+			pr_err("can't create cursor\n");
+
+		while ((c = utf8byte(&u8c)) > 0) {
+			test_f((c == nfdicf_test_data[i].ncf[j]),
+			       "Unexpected byte 0x%x should be 0x%x\n",
+			       c, nfdicf_test_data[i].ncf[j]);
+			j++;
+		}
+
+		test((j == nlen));
+	}
+}
+
+static void check_utf8_comparisons(void)
+{
+	int i;
+	struct unicode_map *table = utf8_load("12.1.0");
+
+	if (IS_ERR(table)) {
+		pr_err("%s: Unable to load utf8 %d.%d.%d. Skipping.\n",
+		       __func__, latest_maj, latest_min, latest_rev);
+		return;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(nfdi_test_data); i++) {
+		const struct qstr s1 = {.name = nfdi_test_data[i].str,
+					.len = sizeof(nfdi_test_data[i].str)};
+		const struct qstr s2 = {.name = nfdi_test_data[i].dec,
+					.len = sizeof(nfdi_test_data[i].dec)};
+
+		test_f(!utf8_strncmp(table, &s1, &s2),
+		       "%s %s comparison mismatch\n", s1.name, s2.name);
+	}
+
+	for (i = 0; i < ARRAY_SIZE(nfdicf_test_data); i++) {
+		const struct qstr s1 = {.name = nfdicf_test_data[i].str,
+					.len = sizeof(nfdicf_test_data[i].str)};
+		const struct qstr s2 = {.name = nfdicf_test_data[i].ncf,
+					.len = sizeof(nfdicf_test_data[i].ncf)};
+
+		test_f(!utf8_strncasecmp(table, &s1, &s2),
+		       "%s %s comparison mismatch\n", s1.name, s2.name);
+	}
+
+	utf8_unload(table);
+}
+
+static void check_supported_versions(void)
+{
+	/* Unicode 7.0.0 should be supported. */
+	test(utf8version_is_supported(7, 0, 0));
+
+	/* Unicode 9.0.0 should be supported. */
+	test(utf8version_is_supported(9, 0, 0));
+
+	/* Unicode 1x.0.0 (the latest version) should be supported. */
+	test(utf8version_is_supported(latest_maj, latest_min, latest_rev));
+
+	/* Next versions don't exist. */
+	test(!utf8version_is_supported(13, 0, 0));
+	test(!utf8version_is_supported(0, 0, 0));
+	test(!utf8version_is_supported(-1, -1, -1));
+}
+
+static int __init init_test_ucd(void)
+{
+	failed_tests = 0;
+	total_tests = 0;
+
+	check_supported_versions();
+	check_utf8_nfdi();
+	check_utf8_nfdicf();
+	check_utf8_comparisons();
+
+	if (!failed_tests)
+		pr_info("All %u tests passed\n", total_tests);
+	else
+		pr_err("%u out of %u tests failed\n", failed_tests,
+		       total_tests);
+	return 0;
+}
+
+static void __exit exit_test_ucd(void)
+{
+}
+
+module_init(init_test_ucd);
+module_exit(exit_test_ucd);
+
+MODULE_AUTHOR("Gabriel Krisman Bertazi <krisman@collabora.co.uk>");
+MODULE_LICENSE("GPL");
diff --git a/fs/unicode/utf8data.h_shipped b/fs/unicode/utf8data.h_shipped
new file mode 100644
index 0000000..76e4f0e
--- /dev/null
+++ b/fs/unicode/utf8data.h_shipped
@@ -0,0 +1,4109 @@
+/* This file is generated code, do not edit. */
+#ifndef __INCLUDED_FROM_UTF8NORM_C__
+#error Only nls_utf8-norm.c should include this file.
+#endif
+
+static const unsigned int utf8vers = 0xc0100;
+
+static const unsigned int utf8agetab[] = {
+	0,
+	0x10100,
+	0x20000,
+	0x20100,
+	0x30000,
+	0x30100,
+	0x30200,
+	0x40000,
+	0x40100,
+	0x50000,
+	0x50100,
+	0x50200,
+	0x60000,
+	0x60100,
+	0x60200,
+	0x60300,
+	0x70000,
+	0x80000,
+	0x90000,
+	0xa0000,
+	0xb0000,
+	0xc0000,
+	0xc0100
+};
+
+static const struct utf8data utf8nfdicfdata[] = {
+	{ 0, 0 },
+	{ 0x10100, 0 },
+	{ 0x20000, 0 },
+	{ 0x20100, 0 },
+	{ 0x30000, 0 },
+	{ 0x30100, 0 },
+	{ 0x30200, 1792 },
+	{ 0x40000, 3200 },
+	{ 0x40100, 3200 },
+	{ 0x50000, 3200 },
+	{ 0x50100, 3200 },
+	{ 0x50200, 3200 },
+	{ 0x60000, 3200 },
+	{ 0x60100, 3200 },
+	{ 0x60200, 3200 },
+	{ 0x60300, 3200 },
+	{ 0x70000, 3200 },
+	{ 0x80000, 3200 },
+	{ 0x90000, 3200 },
+	{ 0xa0000, 3200 },
+	{ 0xb0000, 3200 },
+	{ 0xc0000, 3200 },
+	{ 0xc0100, 3200 }
+};
+
+static const struct utf8data utf8nfdidata[] = {
+	{ 0, 896 },
+	{ 0x10100, 896 },
+	{ 0x20000, 896 },
+	{ 0x20100, 896 },
+	{ 0x30000, 896 },
+	{ 0x30100, 896 },
+	{ 0x30200, 2496 },
+	{ 0x40000, 20736 },
+	{ 0x40100, 20736 },
+	{ 0x50000, 20736 },
+	{ 0x50100, 20736 },
+	{ 0x50200, 20736 },
+	{ 0x60000, 20736 },
+	{ 0x60100, 20736 },
+	{ 0x60200, 20736 },
+	{ 0x60300, 20736 },
+	{ 0x70000, 20736 },
+	{ 0x80000, 20736 },
+	{ 0x90000, 20736 },
+	{ 0xa0000, 20736 },
+	{ 0xb0000, 20736 },
+	{ 0xc0000, 20736 },
+	{ 0xc0100, 20736 }
+};
+
+static const unsigned char utf8data[64256] = {
+	/* nfdicf_30100 */
+	0xd7,0x07,0x66,0x84,0x0c,0x01,0x00,0xc6,0xd5,0x16,0xe4,0x99,0x1a,0xe3,0x63,0x15,
+	0xe2,0x4c,0x0e,0xc1,0xe0,0x4e,0x0d,0xcf,0x86,0x65,0x2d,0x0d,0x01,0x00,0xd4,0xb8,
+	0xd3,0x27,0xe2,0x89,0xa3,0xe1,0xce,0x35,0xe0,0x2c,0x22,0xcf,0x86,0xc5,0xe4,0x15,
+	0x6d,0xe3,0x60,0x68,0xe2,0xf6,0x65,0xe1,0x29,0x65,0xe0,0xee,0x64,0xcf,0x86,0xe5,
+	0xb3,0x64,0x64,0x96,0x64,0x0b,0x00,0xd2,0x0e,0xe1,0xb5,0x3c,0xe0,0xba,0xa3,0xcf,
+	0x86,0xcf,0x06,0x01,0x00,0xd1,0x0c,0xe0,0x1e,0xa9,0xcf,0x86,0xcf,0x06,0x02,0xff,
+	0xff,0xd0,0x08,0xcf,0x86,0xcf,0x06,0x01,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x01,
+	0x00,0xe4,0xe1,0x45,0xe3,0x3b,0x45,0xd2,0x06,0xcf,0x06,0x01,0x00,0xe1,0x87,0xad,
+	0xd0,0x21,0xcf,0x86,0xe5,0x81,0xaa,0xe4,0x00,0xaa,0xe3,0xbf,0xa9,0xe2,0x9e,0xa9,
+	0xe1,0x8d,0xa9,0x10,0x08,0x01,0xff,0xe8,0xb1,0x88,0x00,0x01,0xff,0xe6,0x9b,0xb4,
+	0x00,0xcf,0x86,0xe5,0x63,0xac,0xd4,0x19,0xe3,0xa2,0xab,0xe2,0x81,0xab,0xe1,0x70,
+	0xab,0x10,0x08,0x01,0xff,0xe9,0xb9,0xbf,0x00,0x01,0xff,0xe8,0xab,0x96,0x00,0xe3,
+	0x09,0xac,0xe2,0xe8,0xab,0xe1,0xd7,0xab,0x10,0x08,0x01,0xff,0xe7,0xb8,0xb7,0x00,
+	0x01,0xff,0xe9,0x9b,0xbb,0x00,0x83,0xe2,0x19,0xfa,0xe1,0xf2,0xf6,0xe0,0x6f,0xf5,
+	0xcf,0x86,0xd5,0x31,0xc4,0xe3,0x54,0x4e,0xe2,0xf5,0x4c,0xe1,0xa4,0xcc,0xe0,0x9c,
+	0x4b,0xcf,0x86,0xe5,0x8e,0x49,0xe4,0xaf,0x46,0xe3,0x11,0xbd,0xe2,0x68,0xbc,0xe1,
+	0x43,0xbc,0xe0,0x1c,0xbc,0xcf,0x86,0xe5,0xe9,0xbb,0x94,0x07,0x63,0xd4,0xbb,0x07,
+	0x00,0x07,0x00,0xe4,0xdb,0xf4,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x05,0x00,0xd2,0x0b,
+	0xe1,0xea,0xe1,0xcf,0x86,0xcf,0x06,0x05,0x00,0xd1,0x0e,0xe0,0xd9,0xe2,0xcf,0x86,
+	0xe5,0x9e,0xe2,0xcf,0x06,0x11,0x00,0xd0,0x0b,0xcf,0x86,0xe5,0xd9,0xe2,0xcf,0x06,
+	0x13,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xe4,0x74,0xf4,0xe3,0x5d,0xf3,
+	0xd2,0xa0,0xe1,0x13,0xe7,0xd0,0x21,0xcf,0x86,0xe5,0x14,0xe4,0xe4,0x90,0xe3,0xe3,
+	0x4e,0xe3,0xe2,0x2d,0xe3,0xe1,0x1b,0xe3,0x10,0x08,0x05,0xff,0xe4,0xb8,0xbd,0x00,
+	0x05,0xff,0xe4,0xb8,0xb8,0x00,0xcf,0x86,0xd5,0x1c,0xe4,0x70,0xe5,0xe3,0x2f,0xe5,
+	0xe2,0x0e,0xe5,0xe1,0xfd,0xe4,0x10,0x08,0x05,0xff,0xe5,0x92,0xa2,0x00,0x05,0xff,
+	0xe5,0x93,0xb6,0x00,0xd4,0x34,0xd3,0x18,0xe2,0xf7,0xe5,0xe1,0xe6,0xe5,0x10,0x09,
+	0x05,0xff,0xf0,0xa1,0x9a,0xa8,0x00,0x05,0xff,0xf0,0xa1,0x9b,0xaa,0x00,0xe2,0x17,
+	0xe6,0x91,0x11,0x10,0x09,0x05,0xff,0xf0,0xa1,0x8d,0xaa,0x00,0x05,0xff,0xe5,0xac,
+	0x88,0x00,0x05,0xff,0xe5,0xac,0xbe,0x00,0xe3,0x5d,0xe6,0xd2,0x14,0xe1,0x2c,0xe6,
+	0x10,0x08,0x05,0xff,0xe5,0xaf,0xb3,0x00,0x05,0xff,0xf0,0xa1,0xac,0x98,0x00,0xe1,
+	0x38,0xe6,0x10,0x08,0x05,0xff,0xe5,0xbc,0xb3,0x00,0x05,0xff,0xe5,0xb0,0xa2,0x00,
+	0xd1,0xd5,0xd0,0x6a,0xcf,0x86,0xe5,0x8d,0xeb,0xd4,0x19,0xe3,0xc6,0xea,0xe2,0xa4,
+	0xea,0xe1,0x93,0xea,0x10,0x08,0x05,0xff,0xe6,0xb4,0xbe,0x00,0x05,0xff,0xe6,0xb5,
+	0xb7,0x00,0xd3,0x18,0xe2,0x10,0xeb,0xe1,0xff,0xea,0x10,0x09,0x05,0xff,0xf0,0xa3,
+	0xbd,0x9e,0x00,0x05,0xff,0xf0,0xa3,0xbe,0x8e,0x00,0xd2,0x13,0xe1,0x28,0xeb,0x10,
+	0x08,0x05,0xff,0xe7,0x81,0xbd,0x00,0x05,0xff,0xe7,0x81,0xb7,0x00,0xd1,0x11,0x10,
+	0x08,0x05,0xff,0xe7,0x85,0x85,0x00,0x05,0xff,0xf0,0xa4,0x89,0xa3,0x00,0x10,0x08,
+	0x05,0xff,0xe7,0x86,0x9c,0x00,0x05,0xff,0xe4,0x8e,0xab,0x00,0xcf,0x86,0xe5,0x2a,
+	0xed,0xd4,0x1a,0xe3,0x62,0xec,0xe2,0x48,0xec,0xe1,0x35,0xec,0x10,0x08,0x05,0xff,
+	0xe7,0x9b,0xb4,0x00,0x05,0xff,0xf0,0xa5,0x83,0xb3,0x00,0xd3,0x16,0xe2,0xaa,0xec,
+	0xe1,0x98,0xec,0x10,0x08,0x05,0xff,0xe7,0xa3,0x8c,0x00,0x05,0xff,0xe4,0x83,0xa3,
+	0x00,0xd2,0x13,0xe1,0xc6,0xec,0x10,0x08,0x05,0xff,0xe4,0x84,0xaf,0x00,0x05,0xff,
+	0xe7,0xa9,0x80,0x00,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa5,0xa5,0xbc,0x00,0x05,
+	0xff,0xf0,0xa5,0xaa,0xa7,0x00,0x10,0x09,0x05,0xff,0xf0,0xa5,0xaa,0xa7,0x00,0x05,
+	0xff,0xe7,0xaa,0xae,0x00,0xe0,0xdc,0xef,0xcf,0x86,0xd5,0x1d,0xe4,0x51,0xee,0xe3,
+	0x0d,0xee,0xe2,0xeb,0xed,0xe1,0xda,0xed,0x10,0x09,0x05,0xff,0xf0,0xa3,0x8d,0x9f,
+	0x00,0x05,0xff,0xe4,0x8f,0x95,0x00,0xd4,0x19,0xe3,0xf8,0xee,0xe2,0xd4,0xee,0xe1,
+	0xc3,0xee,0x10,0x08,0x05,0xff,0xe8,0x8d,0x93,0x00,0x05,0xff,0xe8,0x8f,0x8a,0x00,
+	0xd3,0x18,0xe2,0x43,0xef,0xe1,0x32,0xef,0x10,0x09,0x05,0xff,0xf0,0xa6,0xbe,0xb1,
+	0x00,0x05,0xff,0xf0,0xa7,0x83,0x92,0x00,0xd2,0x13,0xe1,0x5b,0xef,0x10,0x08,0x05,
+	0xff,0xe8,0x9a,0x88,0x00,0x05,0xff,0xe8,0x9c,0x8e,0x00,0xd1,0x10,0x10,0x08,0x05,
+	0xff,0xe8,0x9c,0xa8,0x00,0x05,0xff,0xe8,0x9d,0xab,0x00,0x10,0x08,0x05,0xff,0xe8,
+	0x9e,0x86,0x00,0x05,0xff,0xe4,0xb5,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	/* nfdi_30100 */
+	0x57,0x04,0x01,0x00,0xc6,0xd5,0x16,0xe4,0xc2,0x59,0xe3,0xfb,0x54,0xe2,0x74,0x4f,
+	0xc1,0xe0,0xa0,0x4d,0xcf,0x86,0x65,0x84,0x4d,0x01,0x00,0xd4,0xb8,0xd3,0x27,0xe2,
+	0x0c,0xa0,0xe1,0xdf,0x8d,0xe0,0x39,0x71,0xcf,0x86,0xc5,0xe4,0x98,0x69,0xe3,0xe3,
+	0x64,0xe2,0x79,0x62,0xe1,0xac,0x61,0xe0,0x71,0x61,0xcf,0x86,0xe5,0x36,0x61,0x64,
+	0x19,0x61,0x0b,0x00,0xd2,0x0e,0xe1,0xc2,0xa0,0xe0,0x3d,0xa0,0xcf,0x86,0xcf,0x06,
+	0x01,0x00,0xd1,0x0c,0xe0,0xa1,0xa5,0xcf,0x86,0xcf,0x06,0x02,0xff,0xff,0xd0,0x08,
+	0xcf,0x86,0xcf,0x06,0x01,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x01,0x00,0xe4,0x9e,
+	0xb6,0xe3,0x18,0xae,0xd2,0x06,0xcf,0x06,0x01,0x00,0xe1,0x0a,0xaa,0xd0,0x21,0xcf,
+	0x86,0xe5,0x04,0xa7,0xe4,0x83,0xa6,0xe3,0x42,0xa6,0xe2,0x21,0xa6,0xe1,0x10,0xa6,
+	0x10,0x08,0x01,0xff,0xe8,0xb1,0x88,0x00,0x01,0xff,0xe6,0x9b,0xb4,0x00,0xcf,0x86,
+	0xe5,0xe6,0xa8,0xd4,0x19,0xe3,0x25,0xa8,0xe2,0x04,0xa8,0xe1,0xf3,0xa7,0x10,0x08,
+	0x01,0xff,0xe9,0xb9,0xbf,0x00,0x01,0xff,0xe8,0xab,0x96,0x00,0xe3,0x8c,0xa8,0xe2,
+	0x6b,0xa8,0xe1,0x5a,0xa8,0x10,0x08,0x01,0xff,0xe7,0xb8,0xb7,0x00,0x01,0xff,0xe9,
+	0x9b,0xbb,0x00,0x83,0xe2,0x9c,0xf6,0xe1,0x75,0xf3,0xe0,0xf2,0xf1,0xcf,0x86,0xd5,
+	0x31,0xc4,0xe3,0x6d,0xcc,0xe2,0x46,0xca,0xe1,0x27,0xc9,0xe0,0xb7,0xbf,0xcf,0x86,
+	0xe5,0xaa,0xbb,0xe4,0xa3,0xba,0xe3,0x94,0xb9,0xe2,0xeb,0xb8,0xe1,0xc6,0xb8,0xe0,
+	0x9f,0xb8,0xcf,0x86,0xe5,0x6c,0xb8,0x94,0x07,0x63,0x57,0xb8,0x07,0x00,0x07,0x00,
+	0xe4,0x5e,0xf1,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x05,0x00,0xd2,0x0b,0xe1,0x6d,0xde,
+	0xcf,0x86,0xcf,0x06,0x05,0x00,0xd1,0x0e,0xe0,0x5c,0xdf,0xcf,0x86,0xe5,0x21,0xdf,
+	0xcf,0x06,0x11,0x00,0xd0,0x0b,0xcf,0x86,0xe5,0x5c,0xdf,0xcf,0x06,0x13,0x00,0xcf,
+	0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xe4,0xf7,0xf0,0xe3,0xe0,0xef,0xd2,0xa0,0xe1,
+	0x96,0xe3,0xd0,0x21,0xcf,0x86,0xe5,0x97,0xe0,0xe4,0x13,0xe0,0xe3,0xd1,0xdf,0xe2,
+	0xb0,0xdf,0xe1,0x9e,0xdf,0x10,0x08,0x05,0xff,0xe4,0xb8,0xbd,0x00,0x05,0xff,0xe4,
+	0xb8,0xb8,0x00,0xcf,0x86,0xd5,0x1c,0xe4,0xf3,0xe1,0xe3,0xb2,0xe1,0xe2,0x91,0xe1,
+	0xe1,0x80,0xe1,0x10,0x08,0x05,0xff,0xe5,0x92,0xa2,0x00,0x05,0xff,0xe5,0x93,0xb6,
+	0x00,0xd4,0x34,0xd3,0x18,0xe2,0x7a,0xe2,0xe1,0x69,0xe2,0x10,0x09,0x05,0xff,0xf0,
+	0xa1,0x9a,0xa8,0x00,0x05,0xff,0xf0,0xa1,0x9b,0xaa,0x00,0xe2,0x9a,0xe2,0x91,0x11,
+	0x10,0x09,0x05,0xff,0xf0,0xa1,0x8d,0xaa,0x00,0x05,0xff,0xe5,0xac,0x88,0x00,0x05,
+	0xff,0xe5,0xac,0xbe,0x00,0xe3,0xe0,0xe2,0xd2,0x14,0xe1,0xaf,0xe2,0x10,0x08,0x05,
+	0xff,0xe5,0xaf,0xb3,0x00,0x05,0xff,0xf0,0xa1,0xac,0x98,0x00,0xe1,0xbb,0xe2,0x10,
+	0x08,0x05,0xff,0xe5,0xbc,0xb3,0x00,0x05,0xff,0xe5,0xb0,0xa2,0x00,0xd1,0xd5,0xd0,
+	0x6a,0xcf,0x86,0xe5,0x10,0xe8,0xd4,0x19,0xe3,0x49,0xe7,0xe2,0x27,0xe7,0xe1,0x16,
+	0xe7,0x10,0x08,0x05,0xff,0xe6,0xb4,0xbe,0x00,0x05,0xff,0xe6,0xb5,0xb7,0x00,0xd3,
+	0x18,0xe2,0x93,0xe7,0xe1,0x82,0xe7,0x10,0x09,0x05,0xff,0xf0,0xa3,0xbd,0x9e,0x00,
+	0x05,0xff,0xf0,0xa3,0xbe,0x8e,0x00,0xd2,0x13,0xe1,0xab,0xe7,0x10,0x08,0x05,0xff,
+	0xe7,0x81,0xbd,0x00,0x05,0xff,0xe7,0x81,0xb7,0x00,0xd1,0x11,0x10,0x08,0x05,0xff,
+	0xe7,0x85,0x85,0x00,0x05,0xff,0xf0,0xa4,0x89,0xa3,0x00,0x10,0x08,0x05,0xff,0xe7,
+	0x86,0x9c,0x00,0x05,0xff,0xe4,0x8e,0xab,0x00,0xcf,0x86,0xe5,0xad,0xe9,0xd4,0x1a,
+	0xe3,0xe5,0xe8,0xe2,0xcb,0xe8,0xe1,0xb8,0xe8,0x10,0x08,0x05,0xff,0xe7,0x9b,0xb4,
+	0x00,0x05,0xff,0xf0,0xa5,0x83,0xb3,0x00,0xd3,0x16,0xe2,0x2d,0xe9,0xe1,0x1b,0xe9,
+	0x10,0x08,0x05,0xff,0xe7,0xa3,0x8c,0x00,0x05,0xff,0xe4,0x83,0xa3,0x00,0xd2,0x13,
+	0xe1,0x49,0xe9,0x10,0x08,0x05,0xff,0xe4,0x84,0xaf,0x00,0x05,0xff,0xe7,0xa9,0x80,
+	0x00,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa5,0xa5,0xbc,0x00,0x05,0xff,0xf0,0xa5,
+	0xaa,0xa7,0x00,0x10,0x09,0x05,0xff,0xf0,0xa5,0xaa,0xa7,0x00,0x05,0xff,0xe7,0xaa,
+	0xae,0x00,0xe0,0x5f,0xec,0xcf,0x86,0xd5,0x1d,0xe4,0xd4,0xea,0xe3,0x90,0xea,0xe2,
+	0x6e,0xea,0xe1,0x5d,0xea,0x10,0x09,0x05,0xff,0xf0,0xa3,0x8d,0x9f,0x00,0x05,0xff,
+	0xe4,0x8f,0x95,0x00,0xd4,0x19,0xe3,0x7b,0xeb,0xe2,0x57,0xeb,0xe1,0x46,0xeb,0x10,
+	0x08,0x05,0xff,0xe8,0x8d,0x93,0x00,0x05,0xff,0xe8,0x8f,0x8a,0x00,0xd3,0x18,0xe2,
+	0xc6,0xeb,0xe1,0xb5,0xeb,0x10,0x09,0x05,0xff,0xf0,0xa6,0xbe,0xb1,0x00,0x05,0xff,
+	0xf0,0xa7,0x83,0x92,0x00,0xd2,0x13,0xe1,0xde,0xeb,0x10,0x08,0x05,0xff,0xe8,0x9a,
+	0x88,0x00,0x05,0xff,0xe8,0x9c,0x8e,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe8,0x9c,
+	0xa8,0x00,0x05,0xff,0xe8,0x9d,0xab,0x00,0x10,0x08,0x05,0xff,0xe8,0x9e,0x86,0x00,
+	0x05,0xff,0xe4,0xb5,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	/* nfdicf_30200 */
+	0xd7,0x07,0x66,0x84,0x05,0x01,0x00,0xc6,0xd5,0x16,0xe4,0x99,0x13,0xe3,0x63,0x0e,
+	0xe2,0x4c,0x07,0xc1,0xe0,0x4e,0x06,0xcf,0x86,0x65,0x2d,0x06,0x01,0x00,0xd4,0x2a,
+	0xe3,0xd0,0x35,0xe2,0x88,0x9c,0xe1,0xcd,0x2e,0xe0,0x2b,0x1b,0xcf,0x86,0xc5,0xe4,
+	0x14,0x66,0xe3,0x5f,0x61,0xe2,0xf5,0x5e,0xe1,0x28,0x5e,0xe0,0xed,0x5d,0xcf,0x86,
+	0xe5,0xb2,0x5d,0x64,0x95,0x5d,0x0b,0x00,0x83,0xe2,0xa7,0xf3,0xe1,0x80,0xf0,0xe0,
+	0xfd,0xee,0xcf,0x86,0xd5,0x31,0xc4,0xe3,0xe2,0x47,0xe2,0x83,0x46,0xe1,0x32,0xc6,
+	0xe0,0x2a,0x45,0xcf,0x86,0xe5,0x1c,0x43,0xe4,0x3d,0x40,0xe3,0x9f,0xb6,0xe2,0xf6,
+	0xb5,0xe1,0xd1,0xb5,0xe0,0xaa,0xb5,0xcf,0x86,0xe5,0x77,0xb5,0x94,0x07,0x63,0x62,
+	0xb5,0x07,0x00,0x07,0x00,0xe4,0x69,0xee,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x05,0x00,
+	0xd2,0x0b,0xe1,0x78,0xdb,0xcf,0x86,0xcf,0x06,0x05,0x00,0xd1,0x0e,0xe0,0x67,0xdc,
+	0xcf,0x86,0xe5,0x2c,0xdc,0xcf,0x06,0x11,0x00,0xd0,0x0b,0xcf,0x86,0xe5,0x67,0xdc,
+	0xcf,0x06,0x13,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xe4,0x02,0xee,0xe3,
+	0xeb,0xec,0xd2,0xa0,0xe1,0xa1,0xe0,0xd0,0x21,0xcf,0x86,0xe5,0xa2,0xdd,0xe4,0x1e,
+	0xdd,0xe3,0xdc,0xdc,0xe2,0xbb,0xdc,0xe1,0xa9,0xdc,0x10,0x08,0x05,0xff,0xe4,0xb8,
+	0xbd,0x00,0x05,0xff,0xe4,0xb8,0xb8,0x00,0xcf,0x86,0xd5,0x1c,0xe4,0xfe,0xde,0xe3,
+	0xbd,0xde,0xe2,0x9c,0xde,0xe1,0x8b,0xde,0x10,0x08,0x05,0xff,0xe5,0x92,0xa2,0x00,
+	0x05,0xff,0xe5,0x93,0xb6,0x00,0xd4,0x34,0xd3,0x18,0xe2,0x85,0xdf,0xe1,0x74,0xdf,
+	0x10,0x09,0x05,0xff,0xf0,0xa1,0x9a,0xa8,0x00,0x05,0xff,0xf0,0xa1,0x9b,0xaa,0x00,
+	0xe2,0xa5,0xdf,0x91,0x11,0x10,0x09,0x05,0xff,0xf0,0xa1,0x8d,0xaa,0x00,0x05,0xff,
+	0xe5,0xac,0x88,0x00,0x05,0xff,0xe5,0xac,0xbe,0x00,0xe3,0xeb,0xdf,0xd2,0x14,0xe1,
+	0xba,0xdf,0x10,0x08,0x05,0xff,0xe5,0xaf,0xb3,0x00,0x05,0xff,0xf0,0xa1,0xac,0x98,
+	0x00,0xe1,0xc6,0xdf,0x10,0x08,0x05,0xff,0xe5,0xbc,0xb3,0x00,0x05,0xff,0xe5,0xb0,
+	0xa2,0x00,0xd1,0xd5,0xd0,0x6a,0xcf,0x86,0xe5,0x1b,0xe5,0xd4,0x19,0xe3,0x54,0xe4,
+	0xe2,0x32,0xe4,0xe1,0x21,0xe4,0x10,0x08,0x05,0xff,0xe6,0xb4,0xbe,0x00,0x05,0xff,
+	0xe6,0xb5,0xb7,0x00,0xd3,0x18,0xe2,0x9e,0xe4,0xe1,0x8d,0xe4,0x10,0x09,0x05,0xff,
+	0xf0,0xa3,0xbd,0x9e,0x00,0x05,0xff,0xf0,0xa3,0xbe,0x8e,0x00,0xd2,0x13,0xe1,0xb6,
+	0xe4,0x10,0x08,0x05,0xff,0xe7,0x81,0xbd,0x00,0x05,0xff,0xe7,0x81,0xb7,0x00,0xd1,
+	0x11,0x10,0x08,0x05,0xff,0xe7,0x85,0x85,0x00,0x05,0xff,0xf0,0xa4,0x89,0xa3,0x00,
+	0x10,0x08,0x05,0xff,0xe7,0x86,0x9c,0x00,0x05,0xff,0xe4,0x8e,0xab,0x00,0xcf,0x86,
+	0xe5,0xb8,0xe6,0xd4,0x1a,0xe3,0xf0,0xe5,0xe2,0xd6,0xe5,0xe1,0xc3,0xe5,0x10,0x08,
+	0x05,0xff,0xe7,0x9b,0xb4,0x00,0x05,0xff,0xf0,0xa5,0x83,0xb3,0x00,0xd3,0x16,0xe2,
+	0x38,0xe6,0xe1,0x26,0xe6,0x10,0x08,0x05,0xff,0xe7,0xa3,0x8c,0x00,0x05,0xff,0xe4,
+	0x83,0xa3,0x00,0xd2,0x13,0xe1,0x54,0xe6,0x10,0x08,0x05,0xff,0xe4,0x84,0xaf,0x00,
+	0x05,0xff,0xe7,0xa9,0x80,0x00,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa5,0xa5,0xbc,
+	0x00,0x05,0xff,0xf0,0xa5,0xaa,0xa7,0x00,0x10,0x09,0x05,0xff,0xf0,0xa5,0xaa,0xa7,
+	0x00,0x05,0xff,0xe7,0xaa,0xae,0x00,0xe0,0x6a,0xe9,0xcf,0x86,0xd5,0x1d,0xe4,0xdf,
+	0xe7,0xe3,0x9b,0xe7,0xe2,0x79,0xe7,0xe1,0x68,0xe7,0x10,0x09,0x05,0xff,0xf0,0xa3,
+	0x8d,0x9f,0x00,0x05,0xff,0xe4,0x8f,0x95,0x00,0xd4,0x19,0xe3,0x86,0xe8,0xe2,0x62,
+	0xe8,0xe1,0x51,0xe8,0x10,0x08,0x05,0xff,0xe8,0x8d,0x93,0x00,0x05,0xff,0xe8,0x8f,
+	0x8a,0x00,0xd3,0x18,0xe2,0xd1,0xe8,0xe1,0xc0,0xe8,0x10,0x09,0x05,0xff,0xf0,0xa6,
+	0xbe,0xb1,0x00,0x05,0xff,0xf0,0xa7,0x83,0x92,0x00,0xd2,0x13,0xe1,0xe9,0xe8,0x10,
+	0x08,0x05,0xff,0xe8,0x9a,0x88,0x00,0x05,0xff,0xe8,0x9c,0x8e,0x00,0xd1,0x10,0x10,
+	0x08,0x05,0xff,0xe8,0x9c,0xa8,0x00,0x05,0xff,0xe8,0x9d,0xab,0x00,0x10,0x08,0x05,
+	0xff,0xe8,0x9e,0x86,0x00,0x05,0xff,0xe4,0xb5,0x97,0x00,0x00,0x00,0x00,0x00,0x00,
+	/* nfdi_30200 */
+	0x57,0x04,0x01,0x00,0xc6,0xd5,0x16,0xe4,0x82,0x53,0xe3,0xbb,0x4e,0xe2,0x34,0x49,
+	0xc1,0xe0,0x60,0x47,0xcf,0x86,0x65,0x44,0x47,0x01,0x00,0xd4,0x2a,0xe3,0x1c,0x9a,
+	0xe2,0xcb,0x99,0xe1,0x9e,0x87,0xe0,0xf8,0x6a,0xcf,0x86,0xc5,0xe4,0x57,0x63,0xe3,
+	0xa2,0x5e,0xe2,0x38,0x5c,0xe1,0x6b,0x5b,0xe0,0x30,0x5b,0xcf,0x86,0xe5,0xf5,0x5a,
+	0x64,0xd8,0x5a,0x0b,0x00,0x83,0xe2,0xea,0xf0,0xe1,0xc3,0xed,0xe0,0x40,0xec,0xcf,
+	0x86,0xd5,0x31,0xc4,0xe3,0xbb,0xc6,0xe2,0x94,0xc4,0xe1,0x75,0xc3,0xe0,0x05,0xba,
+	0xcf,0x86,0xe5,0xf8,0xb5,0xe4,0xf1,0xb4,0xe3,0xe2,0xb3,0xe2,0x39,0xb3,0xe1,0x14,
+	0xb3,0xe0,0xed,0xb2,0xcf,0x86,0xe5,0xba,0xb2,0x94,0x07,0x63,0xa5,0xb2,0x07,0x00,
+	0x07,0x00,0xe4,0xac,0xeb,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x05,0x00,0xd2,0x0b,0xe1,
+	0xbb,0xd8,0xcf,0x86,0xcf,0x06,0x05,0x00,0xd1,0x0e,0xe0,0xaa,0xd9,0xcf,0x86,0xe5,
+	0x6f,0xd9,0xcf,0x06,0x11,0x00,0xd0,0x0b,0xcf,0x86,0xe5,0xaa,0xd9,0xcf,0x06,0x13,
+	0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xe4,0x45,0xeb,0xe3,0x2e,0xea,0xd2,
+	0xa0,0xe1,0xe4,0xdd,0xd0,0x21,0xcf,0x86,0xe5,0xe5,0xda,0xe4,0x61,0xda,0xe3,0x1f,
+	0xda,0xe2,0xfe,0xd9,0xe1,0xec,0xd9,0x10,0x08,0x05,0xff,0xe4,0xb8,0xbd,0x00,0x05,
+	0xff,0xe4,0xb8,0xb8,0x00,0xcf,0x86,0xd5,0x1c,0xe4,0x41,0xdc,0xe3,0x00,0xdc,0xe2,
+	0xdf,0xdb,0xe1,0xce,0xdb,0x10,0x08,0x05,0xff,0xe5,0x92,0xa2,0x00,0x05,0xff,0xe5,
+	0x93,0xb6,0x00,0xd4,0x34,0xd3,0x18,0xe2,0xc8,0xdc,0xe1,0xb7,0xdc,0x10,0x09,0x05,
+	0xff,0xf0,0xa1,0x9a,0xa8,0x00,0x05,0xff,0xf0,0xa1,0x9b,0xaa,0x00,0xe2,0xe8,0xdc,
+	0x91,0x11,0x10,0x09,0x05,0xff,0xf0,0xa1,0x8d,0xaa,0x00,0x05,0xff,0xe5,0xac,0x88,
+	0x00,0x05,0xff,0xe5,0xac,0xbe,0x00,0xe3,0x2e,0xdd,0xd2,0x14,0xe1,0xfd,0xdc,0x10,
+	0x08,0x05,0xff,0xe5,0xaf,0xb3,0x00,0x05,0xff,0xf0,0xa1,0xac,0x98,0x00,0xe1,0x09,
+	0xdd,0x10,0x08,0x05,0xff,0xe5,0xbc,0xb3,0x00,0x05,0xff,0xe5,0xb0,0xa2,0x00,0xd1,
+	0xd5,0xd0,0x6a,0xcf,0x86,0xe5,0x5e,0xe2,0xd4,0x19,0xe3,0x97,0xe1,0xe2,0x75,0xe1,
+	0xe1,0x64,0xe1,0x10,0x08,0x05,0xff,0xe6,0xb4,0xbe,0x00,0x05,0xff,0xe6,0xb5,0xb7,
+	0x00,0xd3,0x18,0xe2,0xe1,0xe1,0xe1,0xd0,0xe1,0x10,0x09,0x05,0xff,0xf0,0xa3,0xbd,
+	0x9e,0x00,0x05,0xff,0xf0,0xa3,0xbe,0x8e,0x00,0xd2,0x13,0xe1,0xf9,0xe1,0x10,0x08,
+	0x05,0xff,0xe7,0x81,0xbd,0x00,0x05,0xff,0xe7,0x81,0xb7,0x00,0xd1,0x11,0x10,0x08,
+	0x05,0xff,0xe7,0x85,0x85,0x00,0x05,0xff,0xf0,0xa4,0x89,0xa3,0x00,0x10,0x08,0x05,
+	0xff,0xe7,0x86,0x9c,0x00,0x05,0xff,0xe4,0x8e,0xab,0x00,0xcf,0x86,0xe5,0xfb,0xe3,
+	0xd4,0x1a,0xe3,0x33,0xe3,0xe2,0x19,0xe3,0xe1,0x06,0xe3,0x10,0x08,0x05,0xff,0xe7,
+	0x9b,0xb4,0x00,0x05,0xff,0xf0,0xa5,0x83,0xb3,0x00,0xd3,0x16,0xe2,0x7b,0xe3,0xe1,
+	0x69,0xe3,0x10,0x08,0x05,0xff,0xe7,0xa3,0x8c,0x00,0x05,0xff,0xe4,0x83,0xa3,0x00,
+	0xd2,0x13,0xe1,0x97,0xe3,0x10,0x08,0x05,0xff,0xe4,0x84,0xaf,0x00,0x05,0xff,0xe7,
+	0xa9,0x80,0x00,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa5,0xa5,0xbc,0x00,0x05,0xff,
+	0xf0,0xa5,0xaa,0xa7,0x00,0x10,0x09,0x05,0xff,0xf0,0xa5,0xaa,0xa7,0x00,0x05,0xff,
+	0xe7,0xaa,0xae,0x00,0xe0,0xad,0xe6,0xcf,0x86,0xd5,0x1d,0xe4,0x22,0xe5,0xe3,0xde,
+	0xe4,0xe2,0xbc,0xe4,0xe1,0xab,0xe4,0x10,0x09,0x05,0xff,0xf0,0xa3,0x8d,0x9f,0x00,
+	0x05,0xff,0xe4,0x8f,0x95,0x00,0xd4,0x19,0xe3,0xc9,0xe5,0xe2,0xa5,0xe5,0xe1,0x94,
+	0xe5,0x10,0x08,0x05,0xff,0xe8,0x8d,0x93,0x00,0x05,0xff,0xe8,0x8f,0x8a,0x00,0xd3,
+	0x18,0xe2,0x14,0xe6,0xe1,0x03,0xe6,0x10,0x09,0x05,0xff,0xf0,0xa6,0xbe,0xb1,0x00,
+	0x05,0xff,0xf0,0xa7,0x83,0x92,0x00,0xd2,0x13,0xe1,0x2c,0xe6,0x10,0x08,0x05,0xff,
+	0xe8,0x9a,0x88,0x00,0x05,0xff,0xe8,0x9c,0x8e,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,
+	0xe8,0x9c,0xa8,0x00,0x05,0xff,0xe8,0x9d,0xab,0x00,0x10,0x08,0x05,0xff,0xe8,0x9e,
+	0x86,0x00,0x05,0xff,0xe4,0xb5,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	/* nfdicf_c0100 */
+	0xd7,0xb0,0x56,0x04,0x01,0x00,0x95,0xa8,0xd4,0x5e,0xd3,0x2e,0xd2,0x16,0xd1,0x0a,
+	0x10,0x04,0x01,0x00,0x01,0xff,0x61,0x00,0x10,0x06,0x01,0xff,0x62,0x00,0x01,0xff,
+	0x63,0x00,0xd1,0x0c,0x10,0x06,0x01,0xff,0x64,0x00,0x01,0xff,0x65,0x00,0x10,0x06,
+	0x01,0xff,0x66,0x00,0x01,0xff,0x67,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x06,0x01,0xff,
+	0x68,0x00,0x01,0xff,0x69,0x00,0x10,0x06,0x01,0xff,0x6a,0x00,0x01,0xff,0x6b,0x00,
+	0xd1,0x0c,0x10,0x06,0x01,0xff,0x6c,0x00,0x01,0xff,0x6d,0x00,0x10,0x06,0x01,0xff,
+	0x6e,0x00,0x01,0xff,0x6f,0x00,0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x06,0x01,0xff,
+	0x70,0x00,0x01,0xff,0x71,0x00,0x10,0x06,0x01,0xff,0x72,0x00,0x01,0xff,0x73,0x00,
+	0xd1,0x0c,0x10,0x06,0x01,0xff,0x74,0x00,0x01,0xff,0x75,0x00,0x10,0x06,0x01,0xff,
+	0x76,0x00,0x01,0xff,0x77,0x00,0x92,0x16,0xd1,0x0c,0x10,0x06,0x01,0xff,0x78,0x00,
+	0x01,0xff,0x79,0x00,0x10,0x06,0x01,0xff,0x7a,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+	0xc6,0xe5,0xf9,0x14,0xe4,0x6f,0x0d,0xe3,0x39,0x08,0xe2,0x22,0x01,0xc1,0xd0,0x24,
+	0xcf,0x86,0x55,0x04,0x01,0x00,0xd4,0x07,0x63,0xd8,0x43,0x01,0x00,0x93,0x13,0x52,
+	0x04,0x01,0x00,0x91,0x0b,0x10,0x04,0x01,0x00,0x01,0xff,0xce,0xbc,0x00,0x01,0x00,
+	0x01,0x00,0xcf,0x86,0xe5,0xb3,0x44,0xd4,0x7f,0xd3,0x3f,0xd2,0x20,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x61,0xcc,0x80,0x00,0x01,0xff,0x61,0xcc,0x81,0x00,0x10,0x08,0x01,
+	0xff,0x61,0xcc,0x82,0x00,0x01,0xff,0x61,0xcc,0x83,0x00,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x61,0xcc,0x88,0x00,0x01,0xff,0x61,0xcc,0x8a,0x00,0x10,0x07,0x01,0xff,0xc3,
+	0xa6,0x00,0x01,0xff,0x63,0xcc,0xa7,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0x65,0xcc,0x80,0x00,0x01,0xff,0x65,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x65,0xcc,
+	0x82,0x00,0x01,0xff,0x65,0xcc,0x88,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x69,0xcc,
+	0x80,0x00,0x01,0xff,0x69,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x69,0xcc,0x82,0x00,
+	0x01,0xff,0x69,0xcc,0x88,0x00,0xd3,0x3b,0xd2,0x1f,0xd1,0x0f,0x10,0x07,0x01,0xff,
+	0xc3,0xb0,0x00,0x01,0xff,0x6e,0xcc,0x83,0x00,0x10,0x08,0x01,0xff,0x6f,0xcc,0x80,
+	0x00,0x01,0xff,0x6f,0xcc,0x81,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x6f,0xcc,0x82,
+	0x00,0x01,0xff,0x6f,0xcc,0x83,0x00,0x10,0x08,0x01,0xff,0x6f,0xcc,0x88,0x00,0x01,
+	0x00,0xd2,0x1f,0xd1,0x0f,0x10,0x07,0x01,0xff,0xc3,0xb8,0x00,0x01,0xff,0x75,0xcc,
+	0x80,0x00,0x10,0x08,0x01,0xff,0x75,0xcc,0x81,0x00,0x01,0xff,0x75,0xcc,0x82,0x00,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0x75,0xcc,0x88,0x00,0x01,0xff,0x79,0xcc,0x81,0x00,
+	0x10,0x07,0x01,0xff,0xc3,0xbe,0x00,0x01,0xff,0x73,0x73,0x00,0xe1,0xd4,0x03,0xe0,
+	0xeb,0x01,0xcf,0x86,0xd5,0xfb,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0x61,0xcc,0x84,0x00,0x01,0xff,0x61,0xcc,0x84,0x00,0x10,0x08,0x01,0xff,
+	0x61,0xcc,0x86,0x00,0x01,0xff,0x61,0xcc,0x86,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0x61,0xcc,0xa8,0x00,0x01,0xff,0x61,0xcc,0xa8,0x00,0x10,0x08,0x01,0xff,0x63,0xcc,
+	0x81,0x00,0x01,0xff,0x63,0xcc,0x81,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0x63,0xcc,0x82,0x00,0x01,0xff,0x63,0xcc,0x82,0x00,0x10,0x08,0x01,0xff,0x63,0xcc,
+	0x87,0x00,0x01,0xff,0x63,0xcc,0x87,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x63,0xcc,
+	0x8c,0x00,0x01,0xff,0x63,0xcc,0x8c,0x00,0x10,0x08,0x01,0xff,0x64,0xcc,0x8c,0x00,
+	0x01,0xff,0x64,0xcc,0x8c,0x00,0xd3,0x3b,0xd2,0x1b,0xd1,0x0b,0x10,0x07,0x01,0xff,
+	0xc4,0x91,0x00,0x01,0x00,0x10,0x08,0x01,0xff,0x65,0xcc,0x84,0x00,0x01,0xff,0x65,
+	0xcc,0x84,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x65,0xcc,0x86,0x00,0x01,0xff,0x65,
+	0xcc,0x86,0x00,0x10,0x08,0x01,0xff,0x65,0xcc,0x87,0x00,0x01,0xff,0x65,0xcc,0x87,
+	0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x65,0xcc,0xa8,0x00,0x01,0xff,0x65,
+	0xcc,0xa8,0x00,0x10,0x08,0x01,0xff,0x65,0xcc,0x8c,0x00,0x01,0xff,0x65,0xcc,0x8c,
+	0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x67,0xcc,0x82,0x00,0x01,0xff,0x67,0xcc,0x82,
+	0x00,0x10,0x08,0x01,0xff,0x67,0xcc,0x86,0x00,0x01,0xff,0x67,0xcc,0x86,0x00,0xd4,
+	0x7b,0xd3,0x3b,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x67,0xcc,0x87,0x00,0x01,
+	0xff,0x67,0xcc,0x87,0x00,0x10,0x08,0x01,0xff,0x67,0xcc,0xa7,0x00,0x01,0xff,0x67,
+	0xcc,0xa7,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x68,0xcc,0x82,0x00,0x01,0xff,0x68,
+	0xcc,0x82,0x00,0x10,0x07,0x01,0xff,0xc4,0xa7,0x00,0x01,0x00,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0x69,0xcc,0x83,0x00,0x01,0xff,0x69,0xcc,0x83,0x00,0x10,0x08,
+	0x01,0xff,0x69,0xcc,0x84,0x00,0x01,0xff,0x69,0xcc,0x84,0x00,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0x69,0xcc,0x86,0x00,0x01,0xff,0x69,0xcc,0x86,0x00,0x10,0x08,0x01,0xff,
+	0x69,0xcc,0xa8,0x00,0x01,0xff,0x69,0xcc,0xa8,0x00,0xd3,0x37,0xd2,0x17,0xd1,0x0c,
+	0x10,0x08,0x01,0xff,0x69,0xcc,0x87,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xc4,0xb3,
+	0x00,0x01,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x6a,0xcc,0x82,0x00,0x01,0xff,0x6a,
+	0xcc,0x82,0x00,0x10,0x08,0x01,0xff,0x6b,0xcc,0xa7,0x00,0x01,0xff,0x6b,0xcc,0xa7,
+	0x00,0xd2,0x1c,0xd1,0x0c,0x10,0x04,0x01,0x00,0x01,0xff,0x6c,0xcc,0x81,0x00,0x10,
+	0x08,0x01,0xff,0x6c,0xcc,0x81,0x00,0x01,0xff,0x6c,0xcc,0xa7,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x6c,0xcc,0xa7,0x00,0x01,0xff,0x6c,0xcc,0x8c,0x00,0x10,0x08,0x01,
+	0xff,0x6c,0xcc,0x8c,0x00,0x01,0xff,0xc5,0x80,0x00,0xcf,0x86,0xd5,0xed,0xd4,0x72,
+	0xd3,0x37,0xd2,0x17,0xd1,0x0b,0x10,0x04,0x01,0x00,0x01,0xff,0xc5,0x82,0x00,0x10,
+	0x04,0x01,0x00,0x01,0xff,0x6e,0xcc,0x81,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x6e,
+	0xcc,0x81,0x00,0x01,0xff,0x6e,0xcc,0xa7,0x00,0x10,0x08,0x01,0xff,0x6e,0xcc,0xa7,
+	0x00,0x01,0xff,0x6e,0xcc,0x8c,0x00,0xd2,0x1b,0xd1,0x10,0x10,0x08,0x01,0xff,0x6e,
+	0xcc,0x8c,0x00,0x01,0xff,0xca,0xbc,0x6e,0x00,0x10,0x07,0x01,0xff,0xc5,0x8b,0x00,
+	0x01,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x6f,0xcc,0x84,0x00,0x01,0xff,0x6f,0xcc,
+	0x84,0x00,0x10,0x08,0x01,0xff,0x6f,0xcc,0x86,0x00,0x01,0xff,0x6f,0xcc,0x86,0x00,
+	0xd3,0x3b,0xd2,0x1b,0xd1,0x10,0x10,0x08,0x01,0xff,0x6f,0xcc,0x8b,0x00,0x01,0xff,
+	0x6f,0xcc,0x8b,0x00,0x10,0x07,0x01,0xff,0xc5,0x93,0x00,0x01,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x72,0xcc,0x81,0x00,0x01,0xff,0x72,0xcc,0x81,0x00,0x10,0x08,0x01,
+	0xff,0x72,0xcc,0xa7,0x00,0x01,0xff,0x72,0xcc,0xa7,0x00,0xd2,0x20,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x72,0xcc,0x8c,0x00,0x01,0xff,0x72,0xcc,0x8c,0x00,0x10,0x08,0x01,
+	0xff,0x73,0xcc,0x81,0x00,0x01,0xff,0x73,0xcc,0x81,0x00,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x73,0xcc,0x82,0x00,0x01,0xff,0x73,0xcc,0x82,0x00,0x10,0x08,0x01,0xff,0x73,
+	0xcc,0xa7,0x00,0x01,0xff,0x73,0xcc,0xa7,0x00,0xd4,0x7b,0xd3,0x3b,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x73,0xcc,0x8c,0x00,0x01,0xff,0x73,0xcc,0x8c,0x00,0x10,
+	0x08,0x01,0xff,0x74,0xcc,0xa7,0x00,0x01,0xff,0x74,0xcc,0xa7,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x74,0xcc,0x8c,0x00,0x01,0xff,0x74,0xcc,0x8c,0x00,0x10,0x07,0x01,
+	0xff,0xc5,0xa7,0x00,0x01,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x75,0xcc,
+	0x83,0x00,0x01,0xff,0x75,0xcc,0x83,0x00,0x10,0x08,0x01,0xff,0x75,0xcc,0x84,0x00,
+	0x01,0xff,0x75,0xcc,0x84,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x75,0xcc,0x86,0x00,
+	0x01,0xff,0x75,0xcc,0x86,0x00,0x10,0x08,0x01,0xff,0x75,0xcc,0x8a,0x00,0x01,0xff,
+	0x75,0xcc,0x8a,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x75,0xcc,
+	0x8b,0x00,0x01,0xff,0x75,0xcc,0x8b,0x00,0x10,0x08,0x01,0xff,0x75,0xcc,0xa8,0x00,
+	0x01,0xff,0x75,0xcc,0xa8,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x77,0xcc,0x82,0x00,
+	0x01,0xff,0x77,0xcc,0x82,0x00,0x10,0x08,0x01,0xff,0x79,0xcc,0x82,0x00,0x01,0xff,
+	0x79,0xcc,0x82,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x79,0xcc,0x88,0x00,
+	0x01,0xff,0x7a,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x7a,0xcc,0x81,0x00,0x01,0xff,
+	0x7a,0xcc,0x87,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x7a,0xcc,0x87,0x00,0x01,0xff,
+	0x7a,0xcc,0x8c,0x00,0x10,0x08,0x01,0xff,0x7a,0xcc,0x8c,0x00,0x01,0xff,0x73,0x00,
+	0xe0,0x65,0x01,0xcf,0x86,0xd5,0xb4,0xd4,0x5a,0xd3,0x2f,0xd2,0x16,0xd1,0x0b,0x10,
+	0x04,0x01,0x00,0x01,0xff,0xc9,0x93,0x00,0x10,0x07,0x01,0xff,0xc6,0x83,0x00,0x01,
+	0x00,0xd1,0x0b,0x10,0x07,0x01,0xff,0xc6,0x85,0x00,0x01,0x00,0x10,0x07,0x01,0xff,
+	0xc9,0x94,0x00,0x01,0xff,0xc6,0x88,0x00,0xd2,0x19,0xd1,0x0b,0x10,0x04,0x01,0x00,
+	0x01,0xff,0xc9,0x96,0x00,0x10,0x07,0x01,0xff,0xc9,0x97,0x00,0x01,0xff,0xc6,0x8c,
+	0x00,0x51,0x04,0x01,0x00,0x10,0x07,0x01,0xff,0xc7,0x9d,0x00,0x01,0xff,0xc9,0x99,
+	0x00,0xd3,0x32,0xd2,0x19,0xd1,0x0e,0x10,0x07,0x01,0xff,0xc9,0x9b,0x00,0x01,0xff,
+	0xc6,0x92,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0xc9,0xa0,0x00,0xd1,0x0b,0x10,0x07,
+	0x01,0xff,0xc9,0xa3,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xc9,0xa9,0x00,0x01,0xff,
+	0xc9,0xa8,0x00,0xd2,0x0f,0x91,0x0b,0x10,0x07,0x01,0xff,0xc6,0x99,0x00,0x01,0x00,
+	0x01,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xc9,0xaf,0x00,0x01,0xff,0xc9,0xb2,0x00,
+	0x10,0x04,0x01,0x00,0x01,0xff,0xc9,0xb5,0x00,0xd4,0x5d,0xd3,0x34,0xd2,0x1b,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x6f,0xcc,0x9b,0x00,0x01,0xff,0x6f,0xcc,0x9b,0x00,0x10,
+	0x07,0x01,0xff,0xc6,0xa3,0x00,0x01,0x00,0xd1,0x0b,0x10,0x07,0x01,0xff,0xc6,0xa5,
+	0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xca,0x80,0x00,0x01,0xff,0xc6,0xa8,0x00,0xd2,
+	0x0f,0x91,0x0b,0x10,0x04,0x01,0x00,0x01,0xff,0xca,0x83,0x00,0x01,0x00,0xd1,0x0b,
+	0x10,0x07,0x01,0xff,0xc6,0xad,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xca,0x88,0x00,
+	0x01,0xff,0x75,0xcc,0x9b,0x00,0xd3,0x33,0xd2,0x1d,0xd1,0x0f,0x10,0x08,0x01,0xff,
+	0x75,0xcc,0x9b,0x00,0x01,0xff,0xca,0x8a,0x00,0x10,0x07,0x01,0xff,0xca,0x8b,0x00,
+	0x01,0xff,0xc6,0xb4,0x00,0xd1,0x0b,0x10,0x04,0x01,0x00,0x01,0xff,0xc6,0xb6,0x00,
+	0x10,0x04,0x01,0x00,0x01,0xff,0xca,0x92,0x00,0xd2,0x0f,0x91,0x0b,0x10,0x07,0x01,
+	0xff,0xc6,0xb9,0x00,0x01,0x00,0x01,0x00,0x91,0x0b,0x10,0x07,0x01,0xff,0xc6,0xbd,
+	0x00,0x01,0x00,0x01,0x00,0xcf,0x86,0xd5,0xd4,0xd4,0x44,0xd3,0x16,0x52,0x04,0x01,
+	0x00,0x51,0x07,0x01,0xff,0xc7,0x86,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0xc7,0x89,
+	0x00,0xd2,0x12,0x91,0x0b,0x10,0x07,0x01,0xff,0xc7,0x89,0x00,0x01,0x00,0x01,0xff,
+	0xc7,0x8c,0x00,0xd1,0x0c,0x10,0x04,0x01,0x00,0x01,0xff,0x61,0xcc,0x8c,0x00,0x10,
+	0x08,0x01,0xff,0x61,0xcc,0x8c,0x00,0x01,0xff,0x69,0xcc,0x8c,0x00,0xd3,0x46,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x69,0xcc,0x8c,0x00,0x01,0xff,0x6f,0xcc,0x8c,
+	0x00,0x10,0x08,0x01,0xff,0x6f,0xcc,0x8c,0x00,0x01,0xff,0x75,0xcc,0x8c,0x00,0xd1,
+	0x12,0x10,0x08,0x01,0xff,0x75,0xcc,0x8c,0x00,0x01,0xff,0x75,0xcc,0x88,0xcc,0x84,
+	0x00,0x10,0x0a,0x01,0xff,0x75,0xcc,0x88,0xcc,0x84,0x00,0x01,0xff,0x75,0xcc,0x88,
+	0xcc,0x81,0x00,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x75,0xcc,0x88,0xcc,0x81,
+	0x00,0x01,0xff,0x75,0xcc,0x88,0xcc,0x8c,0x00,0x10,0x0a,0x01,0xff,0x75,0xcc,0x88,
+	0xcc,0x8c,0x00,0x01,0xff,0x75,0xcc,0x88,0xcc,0x80,0x00,0xd1,0x0e,0x10,0x0a,0x01,
+	0xff,0x75,0xcc,0x88,0xcc,0x80,0x00,0x01,0x00,0x10,0x0a,0x01,0xff,0x61,0xcc,0x88,
+	0xcc,0x84,0x00,0x01,0xff,0x61,0xcc,0x88,0xcc,0x84,0x00,0xd4,0x87,0xd3,0x41,0xd2,
+	0x26,0xd1,0x14,0x10,0x0a,0x01,0xff,0x61,0xcc,0x87,0xcc,0x84,0x00,0x01,0xff,0x61,
+	0xcc,0x87,0xcc,0x84,0x00,0x10,0x09,0x01,0xff,0xc3,0xa6,0xcc,0x84,0x00,0x01,0xff,
+	0xc3,0xa6,0xcc,0x84,0x00,0xd1,0x0b,0x10,0x07,0x01,0xff,0xc7,0xa5,0x00,0x01,0x00,
+	0x10,0x08,0x01,0xff,0x67,0xcc,0x8c,0x00,0x01,0xff,0x67,0xcc,0x8c,0x00,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0x6b,0xcc,0x8c,0x00,0x01,0xff,0x6b,0xcc,0x8c,0x00,
+	0x10,0x08,0x01,0xff,0x6f,0xcc,0xa8,0x00,0x01,0xff,0x6f,0xcc,0xa8,0x00,0xd1,0x14,
+	0x10,0x0a,0x01,0xff,0x6f,0xcc,0xa8,0xcc,0x84,0x00,0x01,0xff,0x6f,0xcc,0xa8,0xcc,
+	0x84,0x00,0x10,0x09,0x01,0xff,0xca,0x92,0xcc,0x8c,0x00,0x01,0xff,0xca,0x92,0xcc,
+	0x8c,0x00,0xd3,0x38,0xd2,0x1a,0xd1,0x0f,0x10,0x08,0x01,0xff,0x6a,0xcc,0x8c,0x00,
+	0x01,0xff,0xc7,0xb3,0x00,0x10,0x07,0x01,0xff,0xc7,0xb3,0x00,0x01,0x00,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0x67,0xcc,0x81,0x00,0x01,0xff,0x67,0xcc,0x81,0x00,0x10,0x07,
+	0x04,0xff,0xc6,0x95,0x00,0x04,0xff,0xc6,0xbf,0x00,0xd2,0x24,0xd1,0x10,0x10,0x08,
+	0x04,0xff,0x6e,0xcc,0x80,0x00,0x04,0xff,0x6e,0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,
+	0x61,0xcc,0x8a,0xcc,0x81,0x00,0x01,0xff,0x61,0xcc,0x8a,0xcc,0x81,0x00,0xd1,0x12,
+	0x10,0x09,0x01,0xff,0xc3,0xa6,0xcc,0x81,0x00,0x01,0xff,0xc3,0xa6,0xcc,0x81,0x00,
+	0x10,0x09,0x01,0xff,0xc3,0xb8,0xcc,0x81,0x00,0x01,0xff,0xc3,0xb8,0xcc,0x81,0x00,
+	0xe2,0x31,0x02,0xe1,0xc3,0x44,0xe0,0xc8,0x01,0xcf,0x86,0xd5,0xfb,0xd4,0x80,0xd3,
+	0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x61,0xcc,0x8f,0x00,0x01,0xff,0x61,
+	0xcc,0x8f,0x00,0x10,0x08,0x01,0xff,0x61,0xcc,0x91,0x00,0x01,0xff,0x61,0xcc,0x91,
+	0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x65,0xcc,0x8f,0x00,0x01,0xff,0x65,0xcc,0x8f,
+	0x00,0x10,0x08,0x01,0xff,0x65,0xcc,0x91,0x00,0x01,0xff,0x65,0xcc,0x91,0x00,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x69,0xcc,0x8f,0x00,0x01,0xff,0x69,0xcc,0x8f,
+	0x00,0x10,0x08,0x01,0xff,0x69,0xcc,0x91,0x00,0x01,0xff,0x69,0xcc,0x91,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x6f,0xcc,0x8f,0x00,0x01,0xff,0x6f,0xcc,0x8f,0x00,0x10,
+	0x08,0x01,0xff,0x6f,0xcc,0x91,0x00,0x01,0xff,0x6f,0xcc,0x91,0x00,0xd3,0x40,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x72,0xcc,0x8f,0x00,0x01,0xff,0x72,0xcc,0x8f,
+	0x00,0x10,0x08,0x01,0xff,0x72,0xcc,0x91,0x00,0x01,0xff,0x72,0xcc,0x91,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x75,0xcc,0x8f,0x00,0x01,0xff,0x75,0xcc,0x8f,0x00,0x10,
+	0x08,0x01,0xff,0x75,0xcc,0x91,0x00,0x01,0xff,0x75,0xcc,0x91,0x00,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x04,0xff,0x73,0xcc,0xa6,0x00,0x04,0xff,0x73,0xcc,0xa6,0x00,0x10,
+	0x08,0x04,0xff,0x74,0xcc,0xa6,0x00,0x04,0xff,0x74,0xcc,0xa6,0x00,0xd1,0x0b,0x10,
+	0x07,0x04,0xff,0xc8,0x9d,0x00,0x04,0x00,0x10,0x08,0x04,0xff,0x68,0xcc,0x8c,0x00,
+	0x04,0xff,0x68,0xcc,0x8c,0x00,0xd4,0x79,0xd3,0x31,0xd2,0x16,0xd1,0x0b,0x10,0x07,
+	0x06,0xff,0xc6,0x9e,0x00,0x07,0x00,0x10,0x07,0x04,0xff,0xc8,0xa3,0x00,0x04,0x00,
+	0xd1,0x0b,0x10,0x07,0x04,0xff,0xc8,0xa5,0x00,0x04,0x00,0x10,0x08,0x04,0xff,0x61,
+	0xcc,0x87,0x00,0x04,0xff,0x61,0xcc,0x87,0x00,0xd2,0x24,0xd1,0x10,0x10,0x08,0x04,
+	0xff,0x65,0xcc,0xa7,0x00,0x04,0xff,0x65,0xcc,0xa7,0x00,0x10,0x0a,0x04,0xff,0x6f,
+	0xcc,0x88,0xcc,0x84,0x00,0x04,0xff,0x6f,0xcc,0x88,0xcc,0x84,0x00,0xd1,0x14,0x10,
+	0x0a,0x04,0xff,0x6f,0xcc,0x83,0xcc,0x84,0x00,0x04,0xff,0x6f,0xcc,0x83,0xcc,0x84,
+	0x00,0x10,0x08,0x04,0xff,0x6f,0xcc,0x87,0x00,0x04,0xff,0x6f,0xcc,0x87,0x00,0xd3,
+	0x27,0xe2,0x21,0x43,0xd1,0x14,0x10,0x0a,0x04,0xff,0x6f,0xcc,0x87,0xcc,0x84,0x00,
+	0x04,0xff,0x6f,0xcc,0x87,0xcc,0x84,0x00,0x10,0x08,0x04,0xff,0x79,0xcc,0x84,0x00,
+	0x04,0xff,0x79,0xcc,0x84,0x00,0xd2,0x13,0x51,0x04,0x08,0x00,0x10,0x08,0x08,0xff,
+	0xe2,0xb1,0xa5,0x00,0x08,0xff,0xc8,0xbc,0x00,0xd1,0x0b,0x10,0x04,0x08,0x00,0x08,
+	0xff,0xc6,0x9a,0x00,0x10,0x08,0x08,0xff,0xe2,0xb1,0xa6,0x00,0x08,0x00,0xcf,0x86,
+	0x95,0x5f,0x94,0x5b,0xd3,0x2f,0xd2,0x16,0xd1,0x0b,0x10,0x04,0x08,0x00,0x08,0xff,
+	0xc9,0x82,0x00,0x10,0x04,0x09,0x00,0x09,0xff,0xc6,0x80,0x00,0xd1,0x0e,0x10,0x07,
+	0x09,0xff,0xca,0x89,0x00,0x09,0xff,0xca,0x8c,0x00,0x10,0x07,0x09,0xff,0xc9,0x87,
+	0x00,0x09,0x00,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x09,0xff,0xc9,0x89,0x00,0x09,0x00,
+	0x10,0x07,0x09,0xff,0xc9,0x8b,0x00,0x09,0x00,0xd1,0x0b,0x10,0x07,0x09,0xff,0xc9,
+	0x8d,0x00,0x09,0x00,0x10,0x07,0x09,0xff,0xc9,0x8f,0x00,0x09,0x00,0x01,0x00,0x01,
+	0x00,0xd1,0x8b,0xd0,0x0c,0xcf,0x86,0xe5,0x10,0x43,0x64,0xef,0x42,0x01,0xe6,0xcf,
+	0x86,0xd5,0x2a,0xe4,0x99,0x43,0xe3,0x7f,0x43,0xd2,0x11,0xe1,0x5e,0x43,0x10,0x07,
+	0x01,0xff,0xcc,0x80,0x00,0x01,0xff,0xcc,0x81,0x00,0xe1,0x65,0x43,0x10,0x09,0x01,
+	0xff,0xcc,0x88,0xcc,0x81,0x00,0x01,0xff,0xce,0xb9,0x00,0xd4,0x0f,0x93,0x0b,0x92,
+	0x07,0x61,0xab,0x43,0x01,0xea,0x06,0xe6,0x06,0xe6,0xd3,0x2c,0xd2,0x16,0xd1,0x0b,
+	0x10,0x07,0x0a,0xff,0xcd,0xb1,0x00,0x0a,0x00,0x10,0x07,0x0a,0xff,0xcd,0xb3,0x00,
+	0x0a,0x00,0xd1,0x0b,0x10,0x07,0x01,0xff,0xca,0xb9,0x00,0x01,0x00,0x10,0x07,0x0a,
+	0xff,0xcd,0xb7,0x00,0x0a,0x00,0xd2,0x07,0x61,0x97,0x43,0x00,0x00,0x51,0x04,0x09,
+	0x00,0x10,0x06,0x01,0xff,0x3b,0x00,0x10,0xff,0xcf,0xb3,0x00,0xe0,0x31,0x01,0xcf,
+	0x86,0xd5,0xd3,0xd4,0x5f,0xd3,0x21,0x52,0x04,0x00,0x00,0xd1,0x0d,0x10,0x04,0x01,
+	0x00,0x01,0xff,0xc2,0xa8,0xcc,0x81,0x00,0x10,0x09,0x01,0xff,0xce,0xb1,0xcc,0x81,
+	0x00,0x01,0xff,0xc2,0xb7,0x00,0xd2,0x1f,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb5,
+	0xcc,0x81,0x00,0x01,0xff,0xce,0xb7,0xcc,0x81,0x00,0x10,0x09,0x01,0xff,0xce,0xb9,
+	0xcc,0x81,0x00,0x00,0x00,0xd1,0x0d,0x10,0x09,0x01,0xff,0xce,0xbf,0xcc,0x81,0x00,
+	0x00,0x00,0x10,0x09,0x01,0xff,0xcf,0x85,0xcc,0x81,0x00,0x01,0xff,0xcf,0x89,0xcc,
+	0x81,0x00,0xd3,0x3c,0xd2,0x20,0xd1,0x12,0x10,0x0b,0x01,0xff,0xce,0xb9,0xcc,0x88,
+	0xcc,0x81,0x00,0x01,0xff,0xce,0xb1,0x00,0x10,0x07,0x01,0xff,0xce,0xb2,0x00,0x01,
+	0xff,0xce,0xb3,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xce,0xb4,0x00,0x01,0xff,0xce,
+	0xb5,0x00,0x10,0x07,0x01,0xff,0xce,0xb6,0x00,0x01,0xff,0xce,0xb7,0x00,0xd2,0x1c,
+	0xd1,0x0e,0x10,0x07,0x01,0xff,0xce,0xb8,0x00,0x01,0xff,0xce,0xb9,0x00,0x10,0x07,
+	0x01,0xff,0xce,0xba,0x00,0x01,0xff,0xce,0xbb,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,
+	0xce,0xbc,0x00,0x01,0xff,0xce,0xbd,0x00,0x10,0x07,0x01,0xff,0xce,0xbe,0x00,0x01,
+	0xff,0xce,0xbf,0x00,0xe4,0x85,0x43,0xd3,0x35,0xd2,0x19,0xd1,0x0e,0x10,0x07,0x01,
+	0xff,0xcf,0x80,0x00,0x01,0xff,0xcf,0x81,0x00,0x10,0x04,0x00,0x00,0x01,0xff,0xcf,
+	0x83,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xcf,0x84,0x00,0x01,0xff,0xcf,0x85,0x00,
+	0x10,0x07,0x01,0xff,0xcf,0x86,0x00,0x01,0xff,0xcf,0x87,0x00,0xe2,0x2b,0x43,0xd1,
+	0x0e,0x10,0x07,0x01,0xff,0xcf,0x88,0x00,0x01,0xff,0xcf,0x89,0x00,0x10,0x09,0x01,
+	0xff,0xce,0xb9,0xcc,0x88,0x00,0x01,0xff,0xcf,0x85,0xcc,0x88,0x00,0xcf,0x86,0xd5,
+	0x94,0xd4,0x3c,0xd3,0x13,0x92,0x0f,0x51,0x04,0x01,0x00,0x10,0x07,0x01,0xff,0xcf,
+	0x83,0x00,0x01,0x00,0x01,0x00,0xd2,0x07,0x61,0x3a,0x43,0x01,0x00,0xd1,0x12,0x10,
+	0x09,0x01,0xff,0xce,0xbf,0xcc,0x81,0x00,0x01,0xff,0xcf,0x85,0xcc,0x81,0x00,0x10,
+	0x09,0x01,0xff,0xcf,0x89,0xcc,0x81,0x00,0x0a,0xff,0xcf,0x97,0x00,0xd3,0x2c,0xd2,
+	0x11,0xe1,0x46,0x43,0x10,0x07,0x01,0xff,0xce,0xb2,0x00,0x01,0xff,0xce,0xb8,0x00,
+	0xd1,0x10,0x10,0x09,0x01,0xff,0xcf,0x92,0xcc,0x88,0x00,0x01,0xff,0xcf,0x86,0x00,
+	0x10,0x07,0x01,0xff,0xcf,0x80,0x00,0x04,0x00,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x06,
+	0xff,0xcf,0x99,0x00,0x06,0x00,0x10,0x07,0x01,0xff,0xcf,0x9b,0x00,0x04,0x00,0xd1,
+	0x0b,0x10,0x07,0x01,0xff,0xcf,0x9d,0x00,0x04,0x00,0x10,0x07,0x01,0xff,0xcf,0x9f,
+	0x00,0x04,0x00,0xd4,0x58,0xd3,0x2c,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x01,0xff,0xcf,
+	0xa1,0x00,0x04,0x00,0x10,0x07,0x01,0xff,0xcf,0xa3,0x00,0x01,0x00,0xd1,0x0b,0x10,
+	0x07,0x01,0xff,0xcf,0xa5,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xcf,0xa7,0x00,0x01,
+	0x00,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x01,0xff,0xcf,0xa9,0x00,0x01,0x00,0x10,0x07,
+	0x01,0xff,0xcf,0xab,0x00,0x01,0x00,0xd1,0x0b,0x10,0x07,0x01,0xff,0xcf,0xad,0x00,
+	0x01,0x00,0x10,0x07,0x01,0xff,0xcf,0xaf,0x00,0x01,0x00,0xd3,0x2b,0xd2,0x12,0x91,
+	0x0e,0x10,0x07,0x01,0xff,0xce,0xba,0x00,0x01,0xff,0xcf,0x81,0x00,0x01,0x00,0xd1,
+	0x0e,0x10,0x07,0x05,0xff,0xce,0xb8,0x00,0x05,0xff,0xce,0xb5,0x00,0x10,0x04,0x06,
+	0x00,0x07,0xff,0xcf,0xb8,0x00,0xd2,0x16,0xd1,0x0b,0x10,0x04,0x07,0x00,0x07,0xff,
+	0xcf,0xb2,0x00,0x10,0x07,0x07,0xff,0xcf,0xbb,0x00,0x07,0x00,0xd1,0x0b,0x10,0x04,
+	0x08,0x00,0x08,0xff,0xcd,0xbb,0x00,0x10,0x07,0x08,0xff,0xcd,0xbc,0x00,0x08,0xff,
+	0xcd,0xbd,0x00,0xe3,0xed,0x46,0xe2,0x3d,0x05,0xe1,0x27,0x02,0xe0,0x66,0x01,0xcf,
+	0x86,0xd5,0xf0,0xd4,0x7e,0xd3,0x40,0xd2,0x22,0xd1,0x12,0x10,0x09,0x04,0xff,0xd0,
+	0xb5,0xcc,0x80,0x00,0x01,0xff,0xd0,0xb5,0xcc,0x88,0x00,0x10,0x07,0x01,0xff,0xd1,
+	0x92,0x00,0x01,0xff,0xd0,0xb3,0xcc,0x81,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd1,
+	0x94,0x00,0x01,0xff,0xd1,0x95,0x00,0x10,0x07,0x01,0xff,0xd1,0x96,0x00,0x01,0xff,
+	0xd1,0x96,0xcc,0x88,0x00,0xd2,0x1c,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd1,0x98,0x00,
+	0x01,0xff,0xd1,0x99,0x00,0x10,0x07,0x01,0xff,0xd1,0x9a,0x00,0x01,0xff,0xd1,0x9b,
+	0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xd0,0xba,0xcc,0x81,0x00,0x04,0xff,0xd0,0xb8,
+	0xcc,0x80,0x00,0x10,0x09,0x01,0xff,0xd1,0x83,0xcc,0x86,0x00,0x01,0xff,0xd1,0x9f,
+	0x00,0xd3,0x38,0xd2,0x1c,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd0,0xb0,0x00,0x01,0xff,
+	0xd0,0xb1,0x00,0x10,0x07,0x01,0xff,0xd0,0xb2,0x00,0x01,0xff,0xd0,0xb3,0x00,0xd1,
+	0x0e,0x10,0x07,0x01,0xff,0xd0,0xb4,0x00,0x01,0xff,0xd0,0xb5,0x00,0x10,0x07,0x01,
+	0xff,0xd0,0xb6,0x00,0x01,0xff,0xd0,0xb7,0x00,0xd2,0x1e,0xd1,0x10,0x10,0x07,0x01,
+	0xff,0xd0,0xb8,0x00,0x01,0xff,0xd0,0xb8,0xcc,0x86,0x00,0x10,0x07,0x01,0xff,0xd0,
+	0xba,0x00,0x01,0xff,0xd0,0xbb,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd0,0xbc,0x00,
+	0x01,0xff,0xd0,0xbd,0x00,0x10,0x07,0x01,0xff,0xd0,0xbe,0x00,0x01,0xff,0xd0,0xbf,
+	0x00,0xe4,0x25,0x42,0xd3,0x38,0xd2,0x1c,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd1,0x80,
+	0x00,0x01,0xff,0xd1,0x81,0x00,0x10,0x07,0x01,0xff,0xd1,0x82,0x00,0x01,0xff,0xd1,
+	0x83,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd1,0x84,0x00,0x01,0xff,0xd1,0x85,0x00,
+	0x10,0x07,0x01,0xff,0xd1,0x86,0x00,0x01,0xff,0xd1,0x87,0x00,0xd2,0x1c,0xd1,0x0e,
+	0x10,0x07,0x01,0xff,0xd1,0x88,0x00,0x01,0xff,0xd1,0x89,0x00,0x10,0x07,0x01,0xff,
+	0xd1,0x8a,0x00,0x01,0xff,0xd1,0x8b,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd1,0x8c,
+	0x00,0x01,0xff,0xd1,0x8d,0x00,0x10,0x07,0x01,0xff,0xd1,0x8e,0x00,0x01,0xff,0xd1,
+	0x8f,0x00,0xcf,0x86,0xd5,0x07,0x64,0xcf,0x41,0x01,0x00,0xd4,0x58,0xd3,0x2c,0xd2,
+	0x16,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd1,0xa1,0x00,0x01,0x00,0x10,0x07,0x01,0xff,
+	0xd1,0xa3,0x00,0x01,0x00,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd1,0xa5,0x00,0x01,0x00,
+	0x10,0x07,0x01,0xff,0xd1,0xa7,0x00,0x01,0x00,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x01,
+	0xff,0xd1,0xa9,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd1,0xab,0x00,0x01,0x00,0xd1,
+	0x0b,0x10,0x07,0x01,0xff,0xd1,0xad,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd1,0xaf,
+	0x00,0x01,0x00,0xd3,0x33,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd1,0xb1,0x00,
+	0x01,0x00,0x10,0x07,0x01,0xff,0xd1,0xb3,0x00,0x01,0x00,0xd1,0x0b,0x10,0x07,0x01,
+	0xff,0xd1,0xb5,0x00,0x01,0x00,0x10,0x09,0x01,0xff,0xd1,0xb5,0xcc,0x8f,0x00,0x01,
+	0xff,0xd1,0xb5,0xcc,0x8f,0x00,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd1,0xb9,
+	0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd1,0xbb,0x00,0x01,0x00,0xd1,0x0b,0x10,0x07,
+	0x01,0xff,0xd1,0xbd,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd1,0xbf,0x00,0x01,0x00,
+	0xe0,0x41,0x01,0xcf,0x86,0xd5,0x8e,0xd4,0x36,0xd3,0x11,0xe2,0x91,0x41,0xe1,0x88,
+	0x41,0x10,0x07,0x01,0xff,0xd2,0x81,0x00,0x01,0x00,0xd2,0x0f,0x51,0x04,0x04,0x00,
+	0x10,0x07,0x06,0xff,0xd2,0x8b,0x00,0x06,0x00,0xd1,0x0b,0x10,0x07,0x04,0xff,0xd2,
+	0x8d,0x00,0x04,0x00,0x10,0x07,0x04,0xff,0xd2,0x8f,0x00,0x04,0x00,0xd3,0x2c,0xd2,
+	0x16,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd2,0x91,0x00,0x01,0x00,0x10,0x07,0x01,0xff,
+	0xd2,0x93,0x00,0x01,0x00,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd2,0x95,0x00,0x01,0x00,
+	0x10,0x07,0x01,0xff,0xd2,0x97,0x00,0x01,0x00,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x01,
+	0xff,0xd2,0x99,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd2,0x9b,0x00,0x01,0x00,0xd1,
+	0x0b,0x10,0x07,0x01,0xff,0xd2,0x9d,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd2,0x9f,
+	0x00,0x01,0x00,0xd4,0x58,0xd3,0x2c,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd2,
+	0xa1,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd2,0xa3,0x00,0x01,0x00,0xd1,0x0b,0x10,
+	0x07,0x01,0xff,0xd2,0xa5,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd2,0xa7,0x00,0x01,
+	0x00,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd2,0xa9,0x00,0x01,0x00,0x10,0x07,
+	0x01,0xff,0xd2,0xab,0x00,0x01,0x00,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd2,0xad,0x00,
+	0x01,0x00,0x10,0x07,0x01,0xff,0xd2,0xaf,0x00,0x01,0x00,0xd3,0x2c,0xd2,0x16,0xd1,
+	0x0b,0x10,0x07,0x01,0xff,0xd2,0xb1,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd2,0xb3,
+	0x00,0x01,0x00,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd2,0xb5,0x00,0x01,0x00,0x10,0x07,
+	0x01,0xff,0xd2,0xb7,0x00,0x01,0x00,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd2,
+	0xb9,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd2,0xbb,0x00,0x01,0x00,0xd1,0x0b,0x10,
+	0x07,0x01,0xff,0xd2,0xbd,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xd2,0xbf,0x00,0x01,
+	0x00,0xcf,0x86,0xd5,0xdc,0xd4,0x5a,0xd3,0x36,0xd2,0x20,0xd1,0x10,0x10,0x07,0x01,
+	0xff,0xd3,0x8f,0x00,0x01,0xff,0xd0,0xb6,0xcc,0x86,0x00,0x10,0x09,0x01,0xff,0xd0,
+	0xb6,0xcc,0x86,0x00,0x01,0xff,0xd3,0x84,0x00,0xd1,0x0b,0x10,0x04,0x01,0x00,0x06,
+	0xff,0xd3,0x86,0x00,0x10,0x04,0x06,0x00,0x01,0xff,0xd3,0x88,0x00,0xd2,0x16,0xd1,
+	0x0b,0x10,0x04,0x01,0x00,0x06,0xff,0xd3,0x8a,0x00,0x10,0x04,0x06,0x00,0x01,0xff,
+	0xd3,0x8c,0x00,0xe1,0x69,0x40,0x10,0x04,0x01,0x00,0x06,0xff,0xd3,0x8e,0x00,0xd3,
+	0x41,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xd0,0xb0,0xcc,0x86,0x00,0x01,0xff,
+	0xd0,0xb0,0xcc,0x86,0x00,0x10,0x09,0x01,0xff,0xd0,0xb0,0xcc,0x88,0x00,0x01,0xff,
+	0xd0,0xb0,0xcc,0x88,0x00,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd3,0x95,0x00,0x01,0x00,
+	0x10,0x09,0x01,0xff,0xd0,0xb5,0xcc,0x86,0x00,0x01,0xff,0xd0,0xb5,0xcc,0x86,0x00,
+	0xd2,0x1d,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd3,0x99,0x00,0x01,0x00,0x10,0x09,0x01,
+	0xff,0xd3,0x99,0xcc,0x88,0x00,0x01,0xff,0xd3,0x99,0xcc,0x88,0x00,0xd1,0x12,0x10,
+	0x09,0x01,0xff,0xd0,0xb6,0xcc,0x88,0x00,0x01,0xff,0xd0,0xb6,0xcc,0x88,0x00,0x10,
+	0x09,0x01,0xff,0xd0,0xb7,0xcc,0x88,0x00,0x01,0xff,0xd0,0xb7,0xcc,0x88,0x00,0xd4,
+	0x82,0xd3,0x41,0xd2,0x1d,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd3,0xa1,0x00,0x01,0x00,
+	0x10,0x09,0x01,0xff,0xd0,0xb8,0xcc,0x84,0x00,0x01,0xff,0xd0,0xb8,0xcc,0x84,0x00,
+	0xd1,0x12,0x10,0x09,0x01,0xff,0xd0,0xb8,0xcc,0x88,0x00,0x01,0xff,0xd0,0xb8,0xcc,
+	0x88,0x00,0x10,0x09,0x01,0xff,0xd0,0xbe,0xcc,0x88,0x00,0x01,0xff,0xd0,0xbe,0xcc,
+	0x88,0x00,0xd2,0x1d,0xd1,0x0b,0x10,0x07,0x01,0xff,0xd3,0xa9,0x00,0x01,0x00,0x10,
+	0x09,0x01,0xff,0xd3,0xa9,0xcc,0x88,0x00,0x01,0xff,0xd3,0xa9,0xcc,0x88,0x00,0xd1,
+	0x12,0x10,0x09,0x04,0xff,0xd1,0x8d,0xcc,0x88,0x00,0x04,0xff,0xd1,0x8d,0xcc,0x88,
+	0x00,0x10,0x09,0x01,0xff,0xd1,0x83,0xcc,0x84,0x00,0x01,0xff,0xd1,0x83,0xcc,0x84,
+	0x00,0xd3,0x41,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xd1,0x83,0xcc,0x88,0x00,
+	0x01,0xff,0xd1,0x83,0xcc,0x88,0x00,0x10,0x09,0x01,0xff,0xd1,0x83,0xcc,0x8b,0x00,
+	0x01,0xff,0xd1,0x83,0xcc,0x8b,0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xd1,0x87,0xcc,
+	0x88,0x00,0x01,0xff,0xd1,0x87,0xcc,0x88,0x00,0x10,0x07,0x08,0xff,0xd3,0xb7,0x00,
+	0x08,0x00,0xd2,0x1d,0xd1,0x12,0x10,0x09,0x01,0xff,0xd1,0x8b,0xcc,0x88,0x00,0x01,
+	0xff,0xd1,0x8b,0xcc,0x88,0x00,0x10,0x07,0x09,0xff,0xd3,0xbb,0x00,0x09,0x00,0xd1,
+	0x0b,0x10,0x07,0x09,0xff,0xd3,0xbd,0x00,0x09,0x00,0x10,0x07,0x09,0xff,0xd3,0xbf,
+	0x00,0x09,0x00,0xe1,0x26,0x02,0xe0,0x78,0x01,0xcf,0x86,0xd5,0xb0,0xd4,0x58,0xd3,
+	0x2c,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x06,0xff,0xd4,0x81,0x00,0x06,0x00,0x10,0x07,
+	0x06,0xff,0xd4,0x83,0x00,0x06,0x00,0xd1,0x0b,0x10,0x07,0x06,0xff,0xd4,0x85,0x00,
+	0x06,0x00,0x10,0x07,0x06,0xff,0xd4,0x87,0x00,0x06,0x00,0xd2,0x16,0xd1,0x0b,0x10,
+	0x07,0x06,0xff,0xd4,0x89,0x00,0x06,0x00,0x10,0x07,0x06,0xff,0xd4,0x8b,0x00,0x06,
+	0x00,0xd1,0x0b,0x10,0x07,0x06,0xff,0xd4,0x8d,0x00,0x06,0x00,0x10,0x07,0x06,0xff,
+	0xd4,0x8f,0x00,0x06,0x00,0xd3,0x2c,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x09,0xff,0xd4,
+	0x91,0x00,0x09,0x00,0x10,0x07,0x09,0xff,0xd4,0x93,0x00,0x09,0x00,0xd1,0x0b,0x10,
+	0x07,0x0a,0xff,0xd4,0x95,0x00,0x0a,0x00,0x10,0x07,0x0a,0xff,0xd4,0x97,0x00,0x0a,
+	0x00,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x0a,0xff,0xd4,0x99,0x00,0x0a,0x00,0x10,0x07,
+	0x0a,0xff,0xd4,0x9b,0x00,0x0a,0x00,0xd1,0x0b,0x10,0x07,0x0a,0xff,0xd4,0x9d,0x00,
+	0x0a,0x00,0x10,0x07,0x0a,0xff,0xd4,0x9f,0x00,0x0a,0x00,0xd4,0x58,0xd3,0x2c,0xd2,
+	0x16,0xd1,0x0b,0x10,0x07,0x0a,0xff,0xd4,0xa1,0x00,0x0a,0x00,0x10,0x07,0x0a,0xff,
+	0xd4,0xa3,0x00,0x0a,0x00,0xd1,0x0b,0x10,0x07,0x0b,0xff,0xd4,0xa5,0x00,0x0b,0x00,
+	0x10,0x07,0x0c,0xff,0xd4,0xa7,0x00,0x0c,0x00,0xd2,0x16,0xd1,0x0b,0x10,0x07,0x10,
+	0xff,0xd4,0xa9,0x00,0x10,0x00,0x10,0x07,0x10,0xff,0xd4,0xab,0x00,0x10,0x00,0xd1,
+	0x0b,0x10,0x07,0x10,0xff,0xd4,0xad,0x00,0x10,0x00,0x10,0x07,0x10,0xff,0xd4,0xaf,
+	0x00,0x10,0x00,0xd3,0x35,0xd2,0x19,0xd1,0x0b,0x10,0x04,0x00,0x00,0x01,0xff,0xd5,
+	0xa1,0x00,0x10,0x07,0x01,0xff,0xd5,0xa2,0x00,0x01,0xff,0xd5,0xa3,0x00,0xd1,0x0e,
+	0x10,0x07,0x01,0xff,0xd5,0xa4,0x00,0x01,0xff,0xd5,0xa5,0x00,0x10,0x07,0x01,0xff,
+	0xd5,0xa6,0x00,0x01,0xff,0xd5,0xa7,0x00,0xd2,0x1c,0xd1,0x0e,0x10,0x07,0x01,0xff,
+	0xd5,0xa8,0x00,0x01,0xff,0xd5,0xa9,0x00,0x10,0x07,0x01,0xff,0xd5,0xaa,0x00,0x01,
+	0xff,0xd5,0xab,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd5,0xac,0x00,0x01,0xff,0xd5,
+	0xad,0x00,0x10,0x07,0x01,0xff,0xd5,0xae,0x00,0x01,0xff,0xd5,0xaf,0x00,0xcf,0x86,
+	0xe5,0x08,0x3f,0xd4,0x70,0xd3,0x38,0xd2,0x1c,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd5,
+	0xb0,0x00,0x01,0xff,0xd5,0xb1,0x00,0x10,0x07,0x01,0xff,0xd5,0xb2,0x00,0x01,0xff,
+	0xd5,0xb3,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd5,0xb4,0x00,0x01,0xff,0xd5,0xb5,
+	0x00,0x10,0x07,0x01,0xff,0xd5,0xb6,0x00,0x01,0xff,0xd5,0xb7,0x00,0xd2,0x1c,0xd1,
+	0x0e,0x10,0x07,0x01,0xff,0xd5,0xb8,0x00,0x01,0xff,0xd5,0xb9,0x00,0x10,0x07,0x01,
+	0xff,0xd5,0xba,0x00,0x01,0xff,0xd5,0xbb,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd5,
+	0xbc,0x00,0x01,0xff,0xd5,0xbd,0x00,0x10,0x07,0x01,0xff,0xd5,0xbe,0x00,0x01,0xff,
+	0xd5,0xbf,0x00,0xe3,0x87,0x3e,0xd2,0x1c,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd6,0x80,
+	0x00,0x01,0xff,0xd6,0x81,0x00,0x10,0x07,0x01,0xff,0xd6,0x82,0x00,0x01,0xff,0xd6,
+	0x83,0x00,0xd1,0x0e,0x10,0x07,0x01,0xff,0xd6,0x84,0x00,0x01,0xff,0xd6,0x85,0x00,
+	0x10,0x07,0x01,0xff,0xd6,0x86,0x00,0x00,0x00,0xe0,0x2f,0x3f,0xcf,0x86,0xe5,0xc0,
+	0x3e,0xe4,0x97,0x3e,0xe3,0x76,0x3e,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,
+	0x04,0x01,0x00,0x01,0xff,0xd5,0xa5,0xd6,0x82,0x00,0xe4,0x3e,0x25,0xe3,0xc3,0x1a,
+	0xe2,0x7b,0x81,0xe1,0xc0,0x13,0xd0,0x1e,0xcf,0x86,0xc5,0xe4,0x08,0x4b,0xe3,0x53,
+	0x46,0xe2,0xe9,0x43,0xe1,0x1c,0x43,0xe0,0xe1,0x42,0xcf,0x86,0xe5,0xa6,0x42,0x64,
+	0x89,0x42,0x0b,0x00,0xcf,0x86,0xe5,0xfa,0x01,0xe4,0x03,0x56,0xe3,0x76,0x01,0xe2,
+	0x8e,0x53,0xd1,0x0c,0xe0,0xef,0x52,0xcf,0x86,0x65,0x8d,0x52,0x04,0x00,0xe0,0x0d,
+	0x01,0xcf,0x86,0xd5,0x0a,0xe4,0x10,0x53,0x63,0xff,0x52,0x0a,0x00,0xd4,0x80,0xd3,
+	0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0xb4,0x80,0x00,0x01,0xff,0xe2,
+	0xb4,0x81,0x00,0x10,0x08,0x01,0xff,0xe2,0xb4,0x82,0x00,0x01,0xff,0xe2,0xb4,0x83,
+	0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0xb4,0x84,0x00,0x01,0xff,0xe2,0xb4,0x85,
+	0x00,0x10,0x08,0x01,0xff,0xe2,0xb4,0x86,0x00,0x01,0xff,0xe2,0xb4,0x87,0x00,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0xb4,0x88,0x00,0x01,0xff,0xe2,0xb4,0x89,
+	0x00,0x10,0x08,0x01,0xff,0xe2,0xb4,0x8a,0x00,0x01,0xff,0xe2,0xb4,0x8b,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0xe2,0xb4,0x8c,0x00,0x01,0xff,0xe2,0xb4,0x8d,0x00,0x10,
+	0x08,0x01,0xff,0xe2,0xb4,0x8e,0x00,0x01,0xff,0xe2,0xb4,0x8f,0x00,0xd3,0x40,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0xb4,0x90,0x00,0x01,0xff,0xe2,0xb4,0x91,
+	0x00,0x10,0x08,0x01,0xff,0xe2,0xb4,0x92,0x00,0x01,0xff,0xe2,0xb4,0x93,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0xe2,0xb4,0x94,0x00,0x01,0xff,0xe2,0xb4,0x95,0x00,0x10,
+	0x08,0x01,0xff,0xe2,0xb4,0x96,0x00,0x01,0xff,0xe2,0xb4,0x97,0x00,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0xe2,0xb4,0x98,0x00,0x01,0xff,0xe2,0xb4,0x99,0x00,0x10,
+	0x08,0x01,0xff,0xe2,0xb4,0x9a,0x00,0x01,0xff,0xe2,0xb4,0x9b,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0xe2,0xb4,0x9c,0x00,0x01,0xff,0xe2,0xb4,0x9d,0x00,0x10,0x08,0x01,
+	0xff,0xe2,0xb4,0x9e,0x00,0x01,0xff,0xe2,0xb4,0x9f,0x00,0xcf,0x86,0xe5,0x42,0x52,
+	0x94,0x50,0xd3,0x3c,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0xb4,0xa0,0x00,
+	0x01,0xff,0xe2,0xb4,0xa1,0x00,0x10,0x08,0x01,0xff,0xe2,0xb4,0xa2,0x00,0x01,0xff,
+	0xe2,0xb4,0xa3,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0xb4,0xa4,0x00,0x01,0xff,
+	0xe2,0xb4,0xa5,0x00,0x10,0x04,0x00,0x00,0x0d,0xff,0xe2,0xb4,0xa7,0x00,0x52,0x04,
+	0x00,0x00,0x91,0x0c,0x10,0x04,0x00,0x00,0x0d,0xff,0xe2,0xb4,0xad,0x00,0x00,0x00,
+	0x01,0x00,0xd2,0x1b,0xe1,0xfc,0x52,0xe0,0xad,0x52,0xcf,0x86,0x95,0x0f,0x94,0x0b,
+	0x93,0x07,0x62,0x92,0x52,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xd1,0x13,0xe0,
+	0xd3,0x53,0xcf,0x86,0x95,0x0a,0xe4,0xa8,0x53,0x63,0x97,0x53,0x04,0x00,0x04,0x00,
+	0xd0,0x0d,0xcf,0x86,0x95,0x07,0x64,0x22,0x54,0x08,0x00,0x04,0x00,0xcf,0x86,0x55,
+	0x04,0x04,0x00,0x54,0x04,0x04,0x00,0xd3,0x07,0x62,0x2f,0x54,0x04,0x00,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x11,0xff,0xe1,0x8f,0xb0,0x00,0x11,0xff,0xe1,0x8f,0xb1,0x00,
+	0x10,0x08,0x11,0xff,0xe1,0x8f,0xb2,0x00,0x11,0xff,0xe1,0x8f,0xb3,0x00,0x91,0x10,
+	0x10,0x08,0x11,0xff,0xe1,0x8f,0xb4,0x00,0x11,0xff,0xe1,0x8f,0xb5,0x00,0x00,0x00,
+	0xd4,0x1c,0xe3,0xe0,0x56,0xe2,0x17,0x56,0xe1,0xda,0x55,0xe0,0xbb,0x55,0xcf,0x86,
+	0x95,0x0a,0xe4,0xa4,0x55,0x63,0x88,0x55,0x04,0x00,0x04,0x00,0xe3,0xd2,0x01,0xe2,
+	0x2b,0x5a,0xd1,0x0c,0xe0,0x4c,0x59,0xcf,0x86,0x65,0x25,0x59,0x0a,0x00,0xe0,0x9c,
+	0x59,0xcf,0x86,0xd5,0xc5,0xd4,0x45,0xd3,0x31,0xd2,0x1c,0xd1,0x0e,0x10,0x07,0x12,
+	0xff,0xd0,0xb2,0x00,0x12,0xff,0xd0,0xb4,0x00,0x10,0x07,0x12,0xff,0xd0,0xbe,0x00,
+	0x12,0xff,0xd1,0x81,0x00,0x51,0x07,0x12,0xff,0xd1,0x82,0x00,0x10,0x07,0x12,0xff,
+	0xd1,0x8a,0x00,0x12,0xff,0xd1,0xa3,0x00,0x92,0x10,0x91,0x0c,0x10,0x08,0x12,0xff,
+	0xea,0x99,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x14,0xff,0xe1,0x83,0x90,0x00,0x14,0xff,0xe1,0x83,0x91,0x00,0x10,0x08,
+	0x14,0xff,0xe1,0x83,0x92,0x00,0x14,0xff,0xe1,0x83,0x93,0x00,0xd1,0x10,0x10,0x08,
+	0x14,0xff,0xe1,0x83,0x94,0x00,0x14,0xff,0xe1,0x83,0x95,0x00,0x10,0x08,0x14,0xff,
+	0xe1,0x83,0x96,0x00,0x14,0xff,0xe1,0x83,0x97,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x14,0xff,0xe1,0x83,0x98,0x00,0x14,0xff,0xe1,0x83,0x99,0x00,0x10,0x08,0x14,0xff,
+	0xe1,0x83,0x9a,0x00,0x14,0xff,0xe1,0x83,0x9b,0x00,0xd1,0x10,0x10,0x08,0x14,0xff,
+	0xe1,0x83,0x9c,0x00,0x14,0xff,0xe1,0x83,0x9d,0x00,0x10,0x08,0x14,0xff,0xe1,0x83,
+	0x9e,0x00,0x14,0xff,0xe1,0x83,0x9f,0x00,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x14,0xff,0xe1,0x83,0xa0,0x00,0x14,0xff,0xe1,0x83,0xa1,0x00,0x10,0x08,
+	0x14,0xff,0xe1,0x83,0xa2,0x00,0x14,0xff,0xe1,0x83,0xa3,0x00,0xd1,0x10,0x10,0x08,
+	0x14,0xff,0xe1,0x83,0xa4,0x00,0x14,0xff,0xe1,0x83,0xa5,0x00,0x10,0x08,0x14,0xff,
+	0xe1,0x83,0xa6,0x00,0x14,0xff,0xe1,0x83,0xa7,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x14,0xff,0xe1,0x83,0xa8,0x00,0x14,0xff,0xe1,0x83,0xa9,0x00,0x10,0x08,0x14,0xff,
+	0xe1,0x83,0xaa,0x00,0x14,0xff,0xe1,0x83,0xab,0x00,0xd1,0x10,0x10,0x08,0x14,0xff,
+	0xe1,0x83,0xac,0x00,0x14,0xff,0xe1,0x83,0xad,0x00,0x10,0x08,0x14,0xff,0xe1,0x83,
+	0xae,0x00,0x14,0xff,0xe1,0x83,0xaf,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x14,0xff,0xe1,0x83,0xb0,0x00,0x14,0xff,0xe1,0x83,0xb1,0x00,0x10,0x08,0x14,0xff,
+	0xe1,0x83,0xb2,0x00,0x14,0xff,0xe1,0x83,0xb3,0x00,0xd1,0x10,0x10,0x08,0x14,0xff,
+	0xe1,0x83,0xb4,0x00,0x14,0xff,0xe1,0x83,0xb5,0x00,0x10,0x08,0x14,0xff,0xe1,0x83,
+	0xb6,0x00,0x14,0xff,0xe1,0x83,0xb7,0x00,0xd2,0x1c,0xd1,0x10,0x10,0x08,0x14,0xff,
+	0xe1,0x83,0xb8,0x00,0x14,0xff,0xe1,0x83,0xb9,0x00,0x10,0x08,0x14,0xff,0xe1,0x83,
+	0xba,0x00,0x00,0x00,0xd1,0x0c,0x10,0x04,0x00,0x00,0x14,0xff,0xe1,0x83,0xbd,0x00,
+	0x10,0x08,0x14,0xff,0xe1,0x83,0xbe,0x00,0x14,0xff,0xe1,0x83,0xbf,0x00,0xe2,0x9d,
+	0x08,0xe1,0x48,0x04,0xe0,0x1c,0x02,0xcf,0x86,0xe5,0x11,0x01,0xd4,0x84,0xd3,0x40,
+	0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x61,0xcc,0xa5,0x00,0x01,0xff,0x61,0xcc,
+	0xa5,0x00,0x10,0x08,0x01,0xff,0x62,0xcc,0x87,0x00,0x01,0xff,0x62,0xcc,0x87,0x00,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0x62,0xcc,0xa3,0x00,0x01,0xff,0x62,0xcc,0xa3,0x00,
+	0x10,0x08,0x01,0xff,0x62,0xcc,0xb1,0x00,0x01,0xff,0x62,0xcc,0xb1,0x00,0xd2,0x24,
+	0xd1,0x14,0x10,0x0a,0x01,0xff,0x63,0xcc,0xa7,0xcc,0x81,0x00,0x01,0xff,0x63,0xcc,
+	0xa7,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x64,0xcc,0x87,0x00,0x01,0xff,0x64,0xcc,
+	0x87,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x64,0xcc,0xa3,0x00,0x01,0xff,0x64,0xcc,
+	0xa3,0x00,0x10,0x08,0x01,0xff,0x64,0xcc,0xb1,0x00,0x01,0xff,0x64,0xcc,0xb1,0x00,
+	0xd3,0x48,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x64,0xcc,0xa7,0x00,0x01,0xff,
+	0x64,0xcc,0xa7,0x00,0x10,0x08,0x01,0xff,0x64,0xcc,0xad,0x00,0x01,0xff,0x64,0xcc,
+	0xad,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x65,0xcc,0x84,0xcc,0x80,0x00,0x01,0xff,
+	0x65,0xcc,0x84,0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,0x65,0xcc,0x84,0xcc,0x81,0x00,
+	0x01,0xff,0x65,0xcc,0x84,0xcc,0x81,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0x65,0xcc,0xad,0x00,0x01,0xff,0x65,0xcc,0xad,0x00,0x10,0x08,0x01,0xff,0x65,0xcc,
+	0xb0,0x00,0x01,0xff,0x65,0xcc,0xb0,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x65,0xcc,
+	0xa7,0xcc,0x86,0x00,0x01,0xff,0x65,0xcc,0xa7,0xcc,0x86,0x00,0x10,0x08,0x01,0xff,
+	0x66,0xcc,0x87,0x00,0x01,0xff,0x66,0xcc,0x87,0x00,0xd4,0x84,0xd3,0x40,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0x67,0xcc,0x84,0x00,0x01,0xff,0x67,0xcc,0x84,0x00,
+	0x10,0x08,0x01,0xff,0x68,0xcc,0x87,0x00,0x01,0xff,0x68,0xcc,0x87,0x00,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0x68,0xcc,0xa3,0x00,0x01,0xff,0x68,0xcc,0xa3,0x00,0x10,0x08,
+	0x01,0xff,0x68,0xcc,0x88,0x00,0x01,0xff,0x68,0xcc,0x88,0x00,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0x68,0xcc,0xa7,0x00,0x01,0xff,0x68,0xcc,0xa7,0x00,0x10,0x08,
+	0x01,0xff,0x68,0xcc,0xae,0x00,0x01,0xff,0x68,0xcc,0xae,0x00,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0x69,0xcc,0xb0,0x00,0x01,0xff,0x69,0xcc,0xb0,0x00,0x10,0x0a,0x01,0xff,
+	0x69,0xcc,0x88,0xcc,0x81,0x00,0x01,0xff,0x69,0xcc,0x88,0xcc,0x81,0x00,0xd3,0x40,
+	0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x6b,0xcc,0x81,0x00,0x01,0xff,0x6b,0xcc,
+	0x81,0x00,0x10,0x08,0x01,0xff,0x6b,0xcc,0xa3,0x00,0x01,0xff,0x6b,0xcc,0xa3,0x00,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0x6b,0xcc,0xb1,0x00,0x01,0xff,0x6b,0xcc,0xb1,0x00,
+	0x10,0x08,0x01,0xff,0x6c,0xcc,0xa3,0x00,0x01,0xff,0x6c,0xcc,0xa3,0x00,0xd2,0x24,
+	0xd1,0x14,0x10,0x0a,0x01,0xff,0x6c,0xcc,0xa3,0xcc,0x84,0x00,0x01,0xff,0x6c,0xcc,
+	0xa3,0xcc,0x84,0x00,0x10,0x08,0x01,0xff,0x6c,0xcc,0xb1,0x00,0x01,0xff,0x6c,0xcc,
+	0xb1,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x6c,0xcc,0xad,0x00,0x01,0xff,0x6c,0xcc,
+	0xad,0x00,0x10,0x08,0x01,0xff,0x6d,0xcc,0x81,0x00,0x01,0xff,0x6d,0xcc,0x81,0x00,
+	0xcf,0x86,0xe5,0x15,0x01,0xd4,0x88,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x6d,0xcc,0x87,0x00,0x01,0xff,0x6d,0xcc,0x87,0x00,0x10,0x08,0x01,0xff,0x6d,
+	0xcc,0xa3,0x00,0x01,0xff,0x6d,0xcc,0xa3,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x6e,
+	0xcc,0x87,0x00,0x01,0xff,0x6e,0xcc,0x87,0x00,0x10,0x08,0x01,0xff,0x6e,0xcc,0xa3,
+	0x00,0x01,0xff,0x6e,0xcc,0xa3,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x6e,
+	0xcc,0xb1,0x00,0x01,0xff,0x6e,0xcc,0xb1,0x00,0x10,0x08,0x01,0xff,0x6e,0xcc,0xad,
+	0x00,0x01,0xff,0x6e,0xcc,0xad,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x6f,0xcc,0x83,
+	0xcc,0x81,0x00,0x01,0xff,0x6f,0xcc,0x83,0xcc,0x81,0x00,0x10,0x0a,0x01,0xff,0x6f,
+	0xcc,0x83,0xcc,0x88,0x00,0x01,0xff,0x6f,0xcc,0x83,0xcc,0x88,0x00,0xd3,0x48,0xd2,
+	0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x6f,0xcc,0x84,0xcc,0x80,0x00,0x01,0xff,0x6f,
+	0xcc,0x84,0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,0x6f,0xcc,0x84,0xcc,0x81,0x00,0x01,
+	0xff,0x6f,0xcc,0x84,0xcc,0x81,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x70,0xcc,0x81,
+	0x00,0x01,0xff,0x70,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x70,0xcc,0x87,0x00,0x01,
+	0xff,0x70,0xcc,0x87,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x72,0xcc,0x87,
+	0x00,0x01,0xff,0x72,0xcc,0x87,0x00,0x10,0x08,0x01,0xff,0x72,0xcc,0xa3,0x00,0x01,
+	0xff,0x72,0xcc,0xa3,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x72,0xcc,0xa3,0xcc,0x84,
+	0x00,0x01,0xff,0x72,0xcc,0xa3,0xcc,0x84,0x00,0x10,0x08,0x01,0xff,0x72,0xcc,0xb1,
+	0x00,0x01,0xff,0x72,0xcc,0xb1,0x00,0xd4,0x8c,0xd3,0x48,0xd2,0x20,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x73,0xcc,0x87,0x00,0x01,0xff,0x73,0xcc,0x87,0x00,0x10,0x08,0x01,
+	0xff,0x73,0xcc,0xa3,0x00,0x01,0xff,0x73,0xcc,0xa3,0x00,0xd1,0x14,0x10,0x0a,0x01,
+	0xff,0x73,0xcc,0x81,0xcc,0x87,0x00,0x01,0xff,0x73,0xcc,0x81,0xcc,0x87,0x00,0x10,
+	0x0a,0x01,0xff,0x73,0xcc,0x8c,0xcc,0x87,0x00,0x01,0xff,0x73,0xcc,0x8c,0xcc,0x87,
+	0x00,0xd2,0x24,0xd1,0x14,0x10,0x0a,0x01,0xff,0x73,0xcc,0xa3,0xcc,0x87,0x00,0x01,
+	0xff,0x73,0xcc,0xa3,0xcc,0x87,0x00,0x10,0x08,0x01,0xff,0x74,0xcc,0x87,0x00,0x01,
+	0xff,0x74,0xcc,0x87,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x74,0xcc,0xa3,0x00,0x01,
+	0xff,0x74,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x74,0xcc,0xb1,0x00,0x01,0xff,0x74,
+	0xcc,0xb1,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x74,0xcc,0xad,
+	0x00,0x01,0xff,0x74,0xcc,0xad,0x00,0x10,0x08,0x01,0xff,0x75,0xcc,0xa4,0x00,0x01,
+	0xff,0x75,0xcc,0xa4,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x75,0xcc,0xb0,0x00,0x01,
+	0xff,0x75,0xcc,0xb0,0x00,0x10,0x08,0x01,0xff,0x75,0xcc,0xad,0x00,0x01,0xff,0x75,
+	0xcc,0xad,0x00,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x75,0xcc,0x83,0xcc,0x81,
+	0x00,0x01,0xff,0x75,0xcc,0x83,0xcc,0x81,0x00,0x10,0x0a,0x01,0xff,0x75,0xcc,0x84,
+	0xcc,0x88,0x00,0x01,0xff,0x75,0xcc,0x84,0xcc,0x88,0x00,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x76,0xcc,0x83,0x00,0x01,0xff,0x76,0xcc,0x83,0x00,0x10,0x08,0x01,0xff,0x76,
+	0xcc,0xa3,0x00,0x01,0xff,0x76,0xcc,0xa3,0x00,0xe0,0x11,0x02,0xcf,0x86,0xd5,0xe2,
+	0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x77,0xcc,0x80,0x00,
+	0x01,0xff,0x77,0xcc,0x80,0x00,0x10,0x08,0x01,0xff,0x77,0xcc,0x81,0x00,0x01,0xff,
+	0x77,0xcc,0x81,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x77,0xcc,0x88,0x00,0x01,0xff,
+	0x77,0xcc,0x88,0x00,0x10,0x08,0x01,0xff,0x77,0xcc,0x87,0x00,0x01,0xff,0x77,0xcc,
+	0x87,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x77,0xcc,0xa3,0x00,0x01,0xff,
+	0x77,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x78,0xcc,0x87,0x00,0x01,0xff,0x78,0xcc,
+	0x87,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x78,0xcc,0x88,0x00,0x01,0xff,0x78,0xcc,
+	0x88,0x00,0x10,0x08,0x01,0xff,0x79,0xcc,0x87,0x00,0x01,0xff,0x79,0xcc,0x87,0x00,
+	0xd3,0x33,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x7a,0xcc,0x82,0x00,0x01,0xff,
+	0x7a,0xcc,0x82,0x00,0x10,0x08,0x01,0xff,0x7a,0xcc,0xa3,0x00,0x01,0xff,0x7a,0xcc,
+	0xa3,0x00,0xe1,0x12,0x59,0x10,0x08,0x01,0xff,0x7a,0xcc,0xb1,0x00,0x01,0xff,0x7a,
+	0xcc,0xb1,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x77,0xcc,0x8a,0x00,0x01,
+	0xff,0x79,0xcc,0x8a,0x00,0x10,0x08,0x01,0xff,0x61,0xca,0xbe,0x00,0x02,0xff,0x73,
+	0xcc,0x87,0x00,0x51,0x04,0x0a,0x00,0x10,0x07,0x0a,0xff,0x73,0x73,0x00,0x0a,0x00,
+	0xd4,0x98,0xd3,0x48,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x61,0xcc,0xa3,0x00,
+	0x01,0xff,0x61,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x61,0xcc,0x89,0x00,0x01,0xff,
+	0x61,0xcc,0x89,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x61,0xcc,0x82,0xcc,0x81,0x00,
+	0x01,0xff,0x61,0xcc,0x82,0xcc,0x81,0x00,0x10,0x0a,0x01,0xff,0x61,0xcc,0x82,0xcc,
+	0x80,0x00,0x01,0xff,0x61,0xcc,0x82,0xcc,0x80,0x00,0xd2,0x28,0xd1,0x14,0x10,0x0a,
+	0x01,0xff,0x61,0xcc,0x82,0xcc,0x89,0x00,0x01,0xff,0x61,0xcc,0x82,0xcc,0x89,0x00,
+	0x10,0x0a,0x01,0xff,0x61,0xcc,0x82,0xcc,0x83,0x00,0x01,0xff,0x61,0xcc,0x82,0xcc,
+	0x83,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x61,0xcc,0xa3,0xcc,0x82,0x00,0x01,0xff,
+	0x61,0xcc,0xa3,0xcc,0x82,0x00,0x10,0x0a,0x01,0xff,0x61,0xcc,0x86,0xcc,0x81,0x00,
+	0x01,0xff,0x61,0xcc,0x86,0xcc,0x81,0x00,0xd3,0x50,0xd2,0x28,0xd1,0x14,0x10,0x0a,
+	0x01,0xff,0x61,0xcc,0x86,0xcc,0x80,0x00,0x01,0xff,0x61,0xcc,0x86,0xcc,0x80,0x00,
+	0x10,0x0a,0x01,0xff,0x61,0xcc,0x86,0xcc,0x89,0x00,0x01,0xff,0x61,0xcc,0x86,0xcc,
+	0x89,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x61,0xcc,0x86,0xcc,0x83,0x00,0x01,0xff,
+	0x61,0xcc,0x86,0xcc,0x83,0x00,0x10,0x0a,0x01,0xff,0x61,0xcc,0xa3,0xcc,0x86,0x00,
+	0x01,0xff,0x61,0xcc,0xa3,0xcc,0x86,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0x65,0xcc,0xa3,0x00,0x01,0xff,0x65,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x65,0xcc,
+	0x89,0x00,0x01,0xff,0x65,0xcc,0x89,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x65,0xcc,
+	0x83,0x00,0x01,0xff,0x65,0xcc,0x83,0x00,0x10,0x0a,0x01,0xff,0x65,0xcc,0x82,0xcc,
+	0x81,0x00,0x01,0xff,0x65,0xcc,0x82,0xcc,0x81,0x00,0xcf,0x86,0xe5,0x31,0x01,0xd4,
+	0x90,0xd3,0x50,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x65,0xcc,0x82,0xcc,0x80,
+	0x00,0x01,0xff,0x65,0xcc,0x82,0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,0x65,0xcc,0x82,
+	0xcc,0x89,0x00,0x01,0xff,0x65,0xcc,0x82,0xcc,0x89,0x00,0xd1,0x14,0x10,0x0a,0x01,
+	0xff,0x65,0xcc,0x82,0xcc,0x83,0x00,0x01,0xff,0x65,0xcc,0x82,0xcc,0x83,0x00,0x10,
+	0x0a,0x01,0xff,0x65,0xcc,0xa3,0xcc,0x82,0x00,0x01,0xff,0x65,0xcc,0xa3,0xcc,0x82,
+	0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x69,0xcc,0x89,0x00,0x01,0xff,0x69,
+	0xcc,0x89,0x00,0x10,0x08,0x01,0xff,0x69,0xcc,0xa3,0x00,0x01,0xff,0x69,0xcc,0xa3,
+	0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x6f,0xcc,0xa3,0x00,0x01,0xff,0x6f,0xcc,0xa3,
+	0x00,0x10,0x08,0x01,0xff,0x6f,0xcc,0x89,0x00,0x01,0xff,0x6f,0xcc,0x89,0x00,0xd3,
+	0x50,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x6f,0xcc,0x82,0xcc,0x81,0x00,0x01,
+	0xff,0x6f,0xcc,0x82,0xcc,0x81,0x00,0x10,0x0a,0x01,0xff,0x6f,0xcc,0x82,0xcc,0x80,
+	0x00,0x01,0xff,0x6f,0xcc,0x82,0xcc,0x80,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x6f,
+	0xcc,0x82,0xcc,0x89,0x00,0x01,0xff,0x6f,0xcc,0x82,0xcc,0x89,0x00,0x10,0x0a,0x01,
+	0xff,0x6f,0xcc,0x82,0xcc,0x83,0x00,0x01,0xff,0x6f,0xcc,0x82,0xcc,0x83,0x00,0xd2,
+	0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x6f,0xcc,0xa3,0xcc,0x82,0x00,0x01,0xff,0x6f,
+	0xcc,0xa3,0xcc,0x82,0x00,0x10,0x0a,0x01,0xff,0x6f,0xcc,0x9b,0xcc,0x81,0x00,0x01,
+	0xff,0x6f,0xcc,0x9b,0xcc,0x81,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x6f,0xcc,0x9b,
+	0xcc,0x80,0x00,0x01,0xff,0x6f,0xcc,0x9b,0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,0x6f,
+	0xcc,0x9b,0xcc,0x89,0x00,0x01,0xff,0x6f,0xcc,0x9b,0xcc,0x89,0x00,0xd4,0x98,0xd3,
+	0x48,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x6f,0xcc,0x9b,0xcc,0x83,0x00,0x01,
+	0xff,0x6f,0xcc,0x9b,0xcc,0x83,0x00,0x10,0x0a,0x01,0xff,0x6f,0xcc,0x9b,0xcc,0xa3,
+	0x00,0x01,0xff,0x6f,0xcc,0x9b,0xcc,0xa3,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x75,
+	0xcc,0xa3,0x00,0x01,0xff,0x75,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x75,0xcc,0x89,
+	0x00,0x01,0xff,0x75,0xcc,0x89,0x00,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x75,
+	0xcc,0x9b,0xcc,0x81,0x00,0x01,0xff,0x75,0xcc,0x9b,0xcc,0x81,0x00,0x10,0x0a,0x01,
+	0xff,0x75,0xcc,0x9b,0xcc,0x80,0x00,0x01,0xff,0x75,0xcc,0x9b,0xcc,0x80,0x00,0xd1,
+	0x14,0x10,0x0a,0x01,0xff,0x75,0xcc,0x9b,0xcc,0x89,0x00,0x01,0xff,0x75,0xcc,0x9b,
+	0xcc,0x89,0x00,0x10,0x0a,0x01,0xff,0x75,0xcc,0x9b,0xcc,0x83,0x00,0x01,0xff,0x75,
+	0xcc,0x9b,0xcc,0x83,0x00,0xd3,0x44,0xd2,0x24,0xd1,0x14,0x10,0x0a,0x01,0xff,0x75,
+	0xcc,0x9b,0xcc,0xa3,0x00,0x01,0xff,0x75,0xcc,0x9b,0xcc,0xa3,0x00,0x10,0x08,0x01,
+	0xff,0x79,0xcc,0x80,0x00,0x01,0xff,0x79,0xcc,0x80,0x00,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x79,0xcc,0xa3,0x00,0x01,0xff,0x79,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x79,
+	0xcc,0x89,0x00,0x01,0xff,0x79,0xcc,0x89,0x00,0xd2,0x1c,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x79,0xcc,0x83,0x00,0x01,0xff,0x79,0xcc,0x83,0x00,0x10,0x08,0x0a,0xff,0xe1,
+	0xbb,0xbb,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xe1,0xbb,0xbd,0x00,0x0a,
+	0x00,0x10,0x08,0x0a,0xff,0xe1,0xbb,0xbf,0x00,0x0a,0x00,0xe1,0xbf,0x02,0xe0,0xa1,
+	0x01,0xcf,0x86,0xd5,0xc6,0xd4,0x6c,0xd3,0x18,0xe2,0x0e,0x59,0xe1,0xf7,0x58,0x10,
+	0x09,0x01,0xff,0xce,0xb1,0xcc,0x93,0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0x00,0xd2,
+	0x28,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb1,0xcc,0x93,0x00,0x01,0xff,0xce,0xb1,
+	0xcc,0x94,0x00,0x10,0x0b,0x01,0xff,0xce,0xb1,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,
+	0xce,0xb1,0xcc,0x94,0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0xb1,0xcc,
+	0x93,0xcc,0x81,0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0xcc,0x81,0x00,0x10,0x0b,0x01,
+	0xff,0xce,0xb1,0xcc,0x93,0xcd,0x82,0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0xcd,0x82,
+	0x00,0xd3,0x18,0xe2,0x4a,0x59,0xe1,0x33,0x59,0x10,0x09,0x01,0xff,0xce,0xb5,0xcc,
+	0x93,0x00,0x01,0xff,0xce,0xb5,0xcc,0x94,0x00,0xd2,0x28,0xd1,0x12,0x10,0x09,0x01,
+	0xff,0xce,0xb5,0xcc,0x93,0x00,0x01,0xff,0xce,0xb5,0xcc,0x94,0x00,0x10,0x0b,0x01,
+	0xff,0xce,0xb5,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xce,0xb5,0xcc,0x94,0xcc,0x80,
+	0x00,0x91,0x16,0x10,0x0b,0x01,0xff,0xce,0xb5,0xcc,0x93,0xcc,0x81,0x00,0x01,0xff,
+	0xce,0xb5,0xcc,0x94,0xcc,0x81,0x00,0x00,0x00,0xd4,0x6c,0xd3,0x18,0xe2,0x74,0x59,
+	0xe1,0x5d,0x59,0x10,0x09,0x01,0xff,0xce,0xb7,0xcc,0x93,0x00,0x01,0xff,0xce,0xb7,
+	0xcc,0x94,0x00,0xd2,0x28,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb7,0xcc,0x93,0x00,
+	0x01,0xff,0xce,0xb7,0xcc,0x94,0x00,0x10,0x0b,0x01,0xff,0xce,0xb7,0xcc,0x93,0xcc,
+	0x80,0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,
+	0xff,0xce,0xb7,0xcc,0x93,0xcc,0x81,0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcc,0x81,
+	0x00,0x10,0x0b,0x01,0xff,0xce,0xb7,0xcc,0x93,0xcd,0x82,0x00,0x01,0xff,0xce,0xb7,
+	0xcc,0x94,0xcd,0x82,0x00,0xd3,0x18,0xe2,0xb0,0x59,0xe1,0x99,0x59,0x10,0x09,0x01,
+	0xff,0xce,0xb9,0xcc,0x93,0x00,0x01,0xff,0xce,0xb9,0xcc,0x94,0x00,0xd2,0x28,0xd1,
+	0x12,0x10,0x09,0x01,0xff,0xce,0xb9,0xcc,0x93,0x00,0x01,0xff,0xce,0xb9,0xcc,0x94,
+	0x00,0x10,0x0b,0x01,0xff,0xce,0xb9,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xce,0xb9,
+	0xcc,0x94,0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0xb9,0xcc,0x93,0xcc,
+	0x81,0x00,0x01,0xff,0xce,0xb9,0xcc,0x94,0xcc,0x81,0x00,0x10,0x0b,0x01,0xff,0xce,
+	0xb9,0xcc,0x93,0xcd,0x82,0x00,0x01,0xff,0xce,0xb9,0xcc,0x94,0xcd,0x82,0x00,0xcf,
+	0x86,0xd5,0xac,0xd4,0x5a,0xd3,0x18,0xe2,0xed,0x59,0xe1,0xd6,0x59,0x10,0x09,0x01,
+	0xff,0xce,0xbf,0xcc,0x93,0x00,0x01,0xff,0xce,0xbf,0xcc,0x94,0x00,0xd2,0x28,0xd1,
+	0x12,0x10,0x09,0x01,0xff,0xce,0xbf,0xcc,0x93,0x00,0x01,0xff,0xce,0xbf,0xcc,0x94,
+	0x00,0x10,0x0b,0x01,0xff,0xce,0xbf,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xce,0xbf,
+	0xcc,0x94,0xcc,0x80,0x00,0x91,0x16,0x10,0x0b,0x01,0xff,0xce,0xbf,0xcc,0x93,0xcc,
+	0x81,0x00,0x01,0xff,0xce,0xbf,0xcc,0x94,0xcc,0x81,0x00,0x00,0x00,0xd3,0x18,0xe2,
+	0x17,0x5a,0xe1,0x00,0x5a,0x10,0x09,0x01,0xff,0xcf,0x85,0xcc,0x93,0x00,0x01,0xff,
+	0xcf,0x85,0xcc,0x94,0x00,0xd2,0x1c,0xd1,0x0d,0x10,0x04,0x00,0x00,0x01,0xff,0xcf,
+	0x85,0xcc,0x94,0x00,0x10,0x04,0x00,0x00,0x01,0xff,0xcf,0x85,0xcc,0x94,0xcc,0x80,
+	0x00,0xd1,0x0f,0x10,0x04,0x00,0x00,0x01,0xff,0xcf,0x85,0xcc,0x94,0xcc,0x81,0x00,
+	0x10,0x04,0x00,0x00,0x01,0xff,0xcf,0x85,0xcc,0x94,0xcd,0x82,0x00,0xe4,0xd3,0x5a,
+	0xd3,0x18,0xe2,0x52,0x5a,0xe1,0x3b,0x5a,0x10,0x09,0x01,0xff,0xcf,0x89,0xcc,0x93,
+	0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0x00,0xd2,0x28,0xd1,0x12,0x10,0x09,0x01,0xff,
+	0xcf,0x89,0xcc,0x93,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0x00,0x10,0x0b,0x01,0xff,
+	0xcf,0x89,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xcc,0x80,0x00,
+	0xd1,0x16,0x10,0x0b,0x01,0xff,0xcf,0x89,0xcc,0x93,0xcc,0x81,0x00,0x01,0xff,0xcf,
+	0x89,0xcc,0x94,0xcc,0x81,0x00,0x10,0x0b,0x01,0xff,0xcf,0x89,0xcc,0x93,0xcd,0x82,
+	0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xcd,0x82,0x00,0xe0,0xd9,0x02,0xcf,0x86,0xe5,
+	0x91,0x01,0xd4,0xc8,0xd3,0x64,0xd2,0x30,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0xb1,
+	0xcc,0x93,0xce,0xb9,0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0xce,0xb9,0x00,0x10,0x0d,
+	0x01,0xff,0xce,0xb1,0xcc,0x93,0xcc,0x80,0xce,0xb9,0x00,0x01,0xff,0xce,0xb1,0xcc,
+	0x94,0xcc,0x80,0xce,0xb9,0x00,0xd1,0x1a,0x10,0x0d,0x01,0xff,0xce,0xb1,0xcc,0x93,
+	0xcc,0x81,0xce,0xb9,0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0xcc,0x81,0xce,0xb9,0x00,
+	0x10,0x0d,0x01,0xff,0xce,0xb1,0xcc,0x93,0xcd,0x82,0xce,0xb9,0x00,0x01,0xff,0xce,
+	0xb1,0xcc,0x94,0xcd,0x82,0xce,0xb9,0x00,0xd2,0x30,0xd1,0x16,0x10,0x0b,0x01,0xff,
+	0xce,0xb1,0xcc,0x93,0xce,0xb9,0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0xce,0xb9,0x00,
+	0x10,0x0d,0x01,0xff,0xce,0xb1,0xcc,0x93,0xcc,0x80,0xce,0xb9,0x00,0x01,0xff,0xce,
+	0xb1,0xcc,0x94,0xcc,0x80,0xce,0xb9,0x00,0xd1,0x1a,0x10,0x0d,0x01,0xff,0xce,0xb1,
+	0xcc,0x93,0xcc,0x81,0xce,0xb9,0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0xcc,0x81,0xce,
+	0xb9,0x00,0x10,0x0d,0x01,0xff,0xce,0xb1,0xcc,0x93,0xcd,0x82,0xce,0xb9,0x00,0x01,
+	0xff,0xce,0xb1,0xcc,0x94,0xcd,0x82,0xce,0xb9,0x00,0xd3,0x64,0xd2,0x30,0xd1,0x16,
+	0x10,0x0b,0x01,0xff,0xce,0xb7,0xcc,0x93,0xce,0xb9,0x00,0x01,0xff,0xce,0xb7,0xcc,
+	0x94,0xce,0xb9,0x00,0x10,0x0d,0x01,0xff,0xce,0xb7,0xcc,0x93,0xcc,0x80,0xce,0xb9,
+	0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcc,0x80,0xce,0xb9,0x00,0xd1,0x1a,0x10,0x0d,
+	0x01,0xff,0xce,0xb7,0xcc,0x93,0xcc,0x81,0xce,0xb9,0x00,0x01,0xff,0xce,0xb7,0xcc,
+	0x94,0xcc,0x81,0xce,0xb9,0x00,0x10,0x0d,0x01,0xff,0xce,0xb7,0xcc,0x93,0xcd,0x82,
+	0xce,0xb9,0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcd,0x82,0xce,0xb9,0x00,0xd2,0x30,
+	0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0xb7,0xcc,0x93,0xce,0xb9,0x00,0x01,0xff,0xce,
+	0xb7,0xcc,0x94,0xce,0xb9,0x00,0x10,0x0d,0x01,0xff,0xce,0xb7,0xcc,0x93,0xcc,0x80,
+	0xce,0xb9,0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcc,0x80,0xce,0xb9,0x00,0xd1,0x1a,
+	0x10,0x0d,0x01,0xff,0xce,0xb7,0xcc,0x93,0xcc,0x81,0xce,0xb9,0x00,0x01,0xff,0xce,
+	0xb7,0xcc,0x94,0xcc,0x81,0xce,0xb9,0x00,0x10,0x0d,0x01,0xff,0xce,0xb7,0xcc,0x93,
+	0xcd,0x82,0xce,0xb9,0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcd,0x82,0xce,0xb9,0x00,
+	0xd4,0xc8,0xd3,0x64,0xd2,0x30,0xd1,0x16,0x10,0x0b,0x01,0xff,0xcf,0x89,0xcc,0x93,
+	0xce,0xb9,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xce,0xb9,0x00,0x10,0x0d,0x01,0xff,
+	0xcf,0x89,0xcc,0x93,0xcc,0x80,0xce,0xb9,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xcc,
+	0x80,0xce,0xb9,0x00,0xd1,0x1a,0x10,0x0d,0x01,0xff,0xcf,0x89,0xcc,0x93,0xcc,0x81,
+	0xce,0xb9,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xcc,0x81,0xce,0xb9,0x00,0x10,0x0d,
+	0x01,0xff,0xcf,0x89,0xcc,0x93,0xcd,0x82,0xce,0xb9,0x00,0x01,0xff,0xcf,0x89,0xcc,
+	0x94,0xcd,0x82,0xce,0xb9,0x00,0xd2,0x30,0xd1,0x16,0x10,0x0b,0x01,0xff,0xcf,0x89,
+	0xcc,0x93,0xce,0xb9,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xce,0xb9,0x00,0x10,0x0d,
+	0x01,0xff,0xcf,0x89,0xcc,0x93,0xcc,0x80,0xce,0xb9,0x00,0x01,0xff,0xcf,0x89,0xcc,
+	0x94,0xcc,0x80,0xce,0xb9,0x00,0xd1,0x1a,0x10,0x0d,0x01,0xff,0xcf,0x89,0xcc,0x93,
+	0xcc,0x81,0xce,0xb9,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xcc,0x81,0xce,0xb9,0x00,
+	0x10,0x0d,0x01,0xff,0xcf,0x89,0xcc,0x93,0xcd,0x82,0xce,0xb9,0x00,0x01,0xff,0xcf,
+	0x89,0xcc,0x94,0xcd,0x82,0xce,0xb9,0x00,0xd3,0x49,0xd2,0x26,0xd1,0x12,0x10,0x09,
+	0x01,0xff,0xce,0xb1,0xcc,0x86,0x00,0x01,0xff,0xce,0xb1,0xcc,0x84,0x00,0x10,0x0b,
+	0x01,0xff,0xce,0xb1,0xcc,0x80,0xce,0xb9,0x00,0x01,0xff,0xce,0xb1,0xce,0xb9,0x00,
+	0xd1,0x0f,0x10,0x0b,0x01,0xff,0xce,0xb1,0xcc,0x81,0xce,0xb9,0x00,0x00,0x00,0x10,
+	0x09,0x01,0xff,0xce,0xb1,0xcd,0x82,0x00,0x01,0xff,0xce,0xb1,0xcd,0x82,0xce,0xb9,
+	0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb1,0xcc,0x86,0x00,0x01,0xff,
+	0xce,0xb1,0xcc,0x84,0x00,0x10,0x09,0x01,0xff,0xce,0xb1,0xcc,0x80,0x00,0x01,0xff,
+	0xce,0xb1,0xcc,0x81,0x00,0xe1,0xf3,0x5a,0x10,0x09,0x01,0xff,0xce,0xb1,0xce,0xb9,
+	0x00,0x01,0x00,0xcf,0x86,0xd5,0xbd,0xd4,0x7e,0xd3,0x44,0xd2,0x21,0xd1,0x0d,0x10,
+	0x04,0x01,0x00,0x01,0xff,0xc2,0xa8,0xcd,0x82,0x00,0x10,0x0b,0x01,0xff,0xce,0xb7,
+	0xcc,0x80,0xce,0xb9,0x00,0x01,0xff,0xce,0xb7,0xce,0xb9,0x00,0xd1,0x0f,0x10,0x0b,
+	0x01,0xff,0xce,0xb7,0xcc,0x81,0xce,0xb9,0x00,0x00,0x00,0x10,0x09,0x01,0xff,0xce,
+	0xb7,0xcd,0x82,0x00,0x01,0xff,0xce,0xb7,0xcd,0x82,0xce,0xb9,0x00,0xd2,0x24,0xd1,
+	0x12,0x10,0x09,0x01,0xff,0xce,0xb5,0xcc,0x80,0x00,0x01,0xff,0xce,0xb5,0xcc,0x81,
+	0x00,0x10,0x09,0x01,0xff,0xce,0xb7,0xcc,0x80,0x00,0x01,0xff,0xce,0xb7,0xcc,0x81,
+	0x00,0xe1,0x02,0x5b,0x10,0x09,0x01,0xff,0xce,0xb7,0xce,0xb9,0x00,0x01,0xff,0xe1,
+	0xbe,0xbf,0xcc,0x80,0x00,0xd3,0x18,0xe2,0x28,0x5b,0xe1,0x11,0x5b,0x10,0x09,0x01,
+	0xff,0xce,0xb9,0xcc,0x86,0x00,0x01,0xff,0xce,0xb9,0xcc,0x84,0x00,0xe2,0x4c,0x5b,
+	0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb9,0xcc,0x86,0x00,0x01,0xff,0xce,0xb9,0xcc,
+	0x84,0x00,0x10,0x09,0x01,0xff,0xce,0xb9,0xcc,0x80,0x00,0x01,0xff,0xce,0xb9,0xcc,
+	0x81,0x00,0xd4,0x51,0xd3,0x18,0xe2,0x6f,0x5b,0xe1,0x58,0x5b,0x10,0x09,0x01,0xff,
+	0xcf,0x85,0xcc,0x86,0x00,0x01,0xff,0xcf,0x85,0xcc,0x84,0x00,0xd2,0x24,0xd1,0x12,
+	0x10,0x09,0x01,0xff,0xcf,0x85,0xcc,0x86,0x00,0x01,0xff,0xcf,0x85,0xcc,0x84,0x00,
+	0x10,0x09,0x01,0xff,0xcf,0x85,0xcc,0x80,0x00,0x01,0xff,0xcf,0x85,0xcc,0x81,0x00,
+	0xe1,0x8f,0x5b,0x10,0x09,0x01,0xff,0xcf,0x81,0xcc,0x94,0x00,0x01,0xff,0xc2,0xa8,
+	0xcc,0x80,0x00,0xd3,0x3b,0xd2,0x18,0x51,0x04,0x00,0x00,0x10,0x0b,0x01,0xff,0xcf,
+	0x89,0xcc,0x80,0xce,0xb9,0x00,0x01,0xff,0xcf,0x89,0xce,0xb9,0x00,0xd1,0x0f,0x10,
+	0x0b,0x01,0xff,0xcf,0x89,0xcc,0x81,0xce,0xb9,0x00,0x00,0x00,0x10,0x09,0x01,0xff,
+	0xcf,0x89,0xcd,0x82,0x00,0x01,0xff,0xcf,0x89,0xcd,0x82,0xce,0xb9,0x00,0xd2,0x24,
+	0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xbf,0xcc,0x80,0x00,0x01,0xff,0xce,0xbf,0xcc,
+	0x81,0x00,0x10,0x09,0x01,0xff,0xcf,0x89,0xcc,0x80,0x00,0x01,0xff,0xcf,0x89,0xcc,
+	0x81,0x00,0xe1,0x99,0x5b,0x10,0x09,0x01,0xff,0xcf,0x89,0xce,0xb9,0x00,0x01,0xff,
+	0xc2,0xb4,0x00,0xe0,0x0c,0x68,0xcf,0x86,0xe5,0x23,0x02,0xe4,0x25,0x01,0xe3,0x85,
+	0x5e,0xd2,0x2a,0xe1,0x5f,0x5c,0xe0,0xdd,0x5b,0xcf,0x86,0xe5,0xbb,0x5b,0x94,0x1b,
+	0xe3,0xa4,0x5b,0x92,0x14,0x91,0x10,0x10,0x08,0x01,0xff,0xe2,0x80,0x82,0x00,0x01,
+	0xff,0xe2,0x80,0x83,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd1,0xd6,0xd0,0x46,0xcf,
+	0x86,0x55,0x04,0x01,0x00,0xd4,0x29,0xd3,0x13,0x52,0x04,0x01,0x00,0x51,0x04,0x01,
+	0x00,0x10,0x07,0x01,0xff,0xcf,0x89,0x00,0x01,0x00,0x92,0x12,0x51,0x04,0x01,0x00,
+	0x10,0x06,0x01,0xff,0x6b,0x00,0x01,0xff,0x61,0xcc,0x8a,0x00,0x01,0x00,0xe3,0x25,
+	0x5d,0x92,0x10,0x51,0x04,0x01,0x00,0x10,0x08,0x01,0xff,0xe2,0x85,0x8e,0x00,0x01,
+	0x00,0x01,0x00,0xcf,0x86,0xd5,0x0a,0xe4,0x42,0x5d,0x63,0x2d,0x5d,0x06,0x00,0x94,
+	0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0x85,0xb0,0x00,0x01,
+	0xff,0xe2,0x85,0xb1,0x00,0x10,0x08,0x01,0xff,0xe2,0x85,0xb2,0x00,0x01,0xff,0xe2,
+	0x85,0xb3,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0x85,0xb4,0x00,0x01,0xff,0xe2,
+	0x85,0xb5,0x00,0x10,0x08,0x01,0xff,0xe2,0x85,0xb6,0x00,0x01,0xff,0xe2,0x85,0xb7,
+	0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0x85,0xb8,0x00,0x01,0xff,0xe2,
+	0x85,0xb9,0x00,0x10,0x08,0x01,0xff,0xe2,0x85,0xba,0x00,0x01,0xff,0xe2,0x85,0xbb,
+	0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0x85,0xbc,0x00,0x01,0xff,0xe2,0x85,0xbd,
+	0x00,0x10,0x08,0x01,0xff,0xe2,0x85,0xbe,0x00,0x01,0xff,0xe2,0x85,0xbf,0x00,0x01,
+	0x00,0xe0,0x34,0x5d,0xcf,0x86,0xe5,0x13,0x5d,0xe4,0xf2,0x5c,0xe3,0xe1,0x5c,0xe2,
+	0xd4,0x5c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x04,0xff,0xe2,0x86,0x84,0x00,
+	0xe3,0x23,0x61,0xe2,0xf0,0x60,0xd1,0x0c,0xe0,0x9d,0x60,0xcf,0x86,0x65,0x7e,0x60,
+	0x01,0x00,0xd0,0x62,0xcf,0x86,0x55,0x04,0x01,0x00,0x54,0x04,0x01,0x00,0xd3,0x18,
+	0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x08,0x01,0xff,0xe2,0x93,0x90,0x00,
+	0x01,0xff,0xe2,0x93,0x91,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0x93,
+	0x92,0x00,0x01,0xff,0xe2,0x93,0x93,0x00,0x10,0x08,0x01,0xff,0xe2,0x93,0x94,0x00,
+	0x01,0xff,0xe2,0x93,0x95,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe2,0x93,0x96,0x00,
+	0x01,0xff,0xe2,0x93,0x97,0x00,0x10,0x08,0x01,0xff,0xe2,0x93,0x98,0x00,0x01,0xff,
+	0xe2,0x93,0x99,0x00,0xcf,0x86,0xe5,0x57,0x60,0x94,0x80,0xd3,0x40,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0xe2,0x93,0x9a,0x00,0x01,0xff,0xe2,0x93,0x9b,0x00,0x10,
+	0x08,0x01,0xff,0xe2,0x93,0x9c,0x00,0x01,0xff,0xe2,0x93,0x9d,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0xe2,0x93,0x9e,0x00,0x01,0xff,0xe2,0x93,0x9f,0x00,0x10,0x08,0x01,
+	0xff,0xe2,0x93,0xa0,0x00,0x01,0xff,0xe2,0x93,0xa1,0x00,0xd2,0x20,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0xe2,0x93,0xa2,0x00,0x01,0xff,0xe2,0x93,0xa3,0x00,0x10,0x08,0x01,
+	0xff,0xe2,0x93,0xa4,0x00,0x01,0xff,0xe2,0x93,0xa5,0x00,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0xe2,0x93,0xa6,0x00,0x01,0xff,0xe2,0x93,0xa7,0x00,0x10,0x08,0x01,0xff,0xe2,
+	0x93,0xa8,0x00,0x01,0xff,0xe2,0x93,0xa9,0x00,0x01,0x00,0xd4,0x0c,0xe3,0x33,0x62,
+	0xe2,0x2c,0x62,0xcf,0x06,0x04,0x00,0xe3,0x0c,0x65,0xe2,0xff,0x63,0xe1,0x2e,0x02,
+	0xe0,0x84,0x01,0xcf,0x86,0xe5,0x01,0x01,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x08,0xff,0xe2,0xb0,0xb0,0x00,0x08,0xff,0xe2,0xb0,0xb1,0x00,0x10,0x08,
+	0x08,0xff,0xe2,0xb0,0xb2,0x00,0x08,0xff,0xe2,0xb0,0xb3,0x00,0xd1,0x10,0x10,0x08,
+	0x08,0xff,0xe2,0xb0,0xb4,0x00,0x08,0xff,0xe2,0xb0,0xb5,0x00,0x10,0x08,0x08,0xff,
+	0xe2,0xb0,0xb6,0x00,0x08,0xff,0xe2,0xb0,0xb7,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x08,0xff,0xe2,0xb0,0xb8,0x00,0x08,0xff,0xe2,0xb0,0xb9,0x00,0x10,0x08,0x08,0xff,
+	0xe2,0xb0,0xba,0x00,0x08,0xff,0xe2,0xb0,0xbb,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe2,0xb0,0xbc,0x00,0x08,0xff,0xe2,0xb0,0xbd,0x00,0x10,0x08,0x08,0xff,0xe2,0xb0,
+	0xbe,0x00,0x08,0xff,0xe2,0xb0,0xbf,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x08,0xff,0xe2,0xb1,0x80,0x00,0x08,0xff,0xe2,0xb1,0x81,0x00,0x10,0x08,0x08,0xff,
+	0xe2,0xb1,0x82,0x00,0x08,0xff,0xe2,0xb1,0x83,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe2,0xb1,0x84,0x00,0x08,0xff,0xe2,0xb1,0x85,0x00,0x10,0x08,0x08,0xff,0xe2,0xb1,
+	0x86,0x00,0x08,0xff,0xe2,0xb1,0x87,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe2,0xb1,0x88,0x00,0x08,0xff,0xe2,0xb1,0x89,0x00,0x10,0x08,0x08,0xff,0xe2,0xb1,
+	0x8a,0x00,0x08,0xff,0xe2,0xb1,0x8b,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,0xe2,0xb1,
+	0x8c,0x00,0x08,0xff,0xe2,0xb1,0x8d,0x00,0x10,0x08,0x08,0xff,0xe2,0xb1,0x8e,0x00,
+	0x08,0xff,0xe2,0xb1,0x8f,0x00,0x94,0x7c,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x08,0xff,0xe2,0xb1,0x90,0x00,0x08,0xff,0xe2,0xb1,0x91,0x00,0x10,0x08,0x08,0xff,
+	0xe2,0xb1,0x92,0x00,0x08,0xff,0xe2,0xb1,0x93,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe2,0xb1,0x94,0x00,0x08,0xff,0xe2,0xb1,0x95,0x00,0x10,0x08,0x08,0xff,0xe2,0xb1,
+	0x96,0x00,0x08,0xff,0xe2,0xb1,0x97,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe2,0xb1,0x98,0x00,0x08,0xff,0xe2,0xb1,0x99,0x00,0x10,0x08,0x08,0xff,0xe2,0xb1,
+	0x9a,0x00,0x08,0xff,0xe2,0xb1,0x9b,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,0xe2,0xb1,
+	0x9c,0x00,0x08,0xff,0xe2,0xb1,0x9d,0x00,0x10,0x08,0x08,0xff,0xe2,0xb1,0x9e,0x00,
+	0x00,0x00,0x08,0x00,0xcf,0x86,0xd5,0x07,0x64,0xef,0x61,0x08,0x00,0xd4,0x63,0xd3,
+	0x32,0xd2,0x1b,0xd1,0x0c,0x10,0x08,0x09,0xff,0xe2,0xb1,0xa1,0x00,0x09,0x00,0x10,
+	0x07,0x09,0xff,0xc9,0xab,0x00,0x09,0xff,0xe1,0xb5,0xbd,0x00,0xd1,0x0b,0x10,0x07,
+	0x09,0xff,0xc9,0xbd,0x00,0x09,0x00,0x10,0x04,0x09,0x00,0x09,0xff,0xe2,0xb1,0xa8,
+	0x00,0xd2,0x18,0xd1,0x0c,0x10,0x04,0x09,0x00,0x09,0xff,0xe2,0xb1,0xaa,0x00,0x10,
+	0x04,0x09,0x00,0x09,0xff,0xe2,0xb1,0xac,0x00,0xd1,0x0b,0x10,0x04,0x09,0x00,0x0a,
+	0xff,0xc9,0x91,0x00,0x10,0x07,0x0a,0xff,0xc9,0xb1,0x00,0x0a,0xff,0xc9,0x90,0x00,
+	0xd3,0x27,0xd2,0x17,0xd1,0x0b,0x10,0x07,0x0b,0xff,0xc9,0x92,0x00,0x0a,0x00,0x10,
+	0x08,0x0a,0xff,0xe2,0xb1,0xb3,0x00,0x0a,0x00,0x91,0x0c,0x10,0x04,0x09,0x00,0x09,
+	0xff,0xe2,0xb1,0xb6,0x00,0x09,0x00,0x52,0x04,0x0a,0x00,0x51,0x04,0x0a,0x00,0x10,
+	0x07,0x0b,0xff,0xc8,0xbf,0x00,0x0b,0xff,0xc9,0x80,0x00,0xe0,0x83,0x01,0xcf,0x86,
+	0xd5,0xc0,0xd4,0x60,0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb2,
+	0x81,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0x83,0x00,0x08,0x00,0xd1,0x0c,
+	0x10,0x08,0x08,0xff,0xe2,0xb2,0x85,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,
+	0x87,0x00,0x08,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb2,0x89,0x00,
+	0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0x8b,0x00,0x08,0x00,0xd1,0x0c,0x10,0x08,
+	0x08,0xff,0xe2,0xb2,0x8d,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0x8f,0x00,
+	0x08,0x00,0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb2,0x91,0x00,
+	0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0x93,0x00,0x08,0x00,0xd1,0x0c,0x10,0x08,
+	0x08,0xff,0xe2,0xb2,0x95,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0x97,0x00,
+	0x08,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb2,0x99,0x00,0x08,0x00,
+	0x10,0x08,0x08,0xff,0xe2,0xb2,0x9b,0x00,0x08,0x00,0xd1,0x0c,0x10,0x08,0x08,0xff,
+	0xe2,0xb2,0x9d,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0x9f,0x00,0x08,0x00,
+	0xd4,0x60,0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb2,0xa1,0x00,
+	0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0xa3,0x00,0x08,0x00,0xd1,0x0c,0x10,0x08,
+	0x08,0xff,0xe2,0xb2,0xa5,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0xa7,0x00,
+	0x08,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb2,0xa9,0x00,0x08,0x00,
+	0x10,0x08,0x08,0xff,0xe2,0xb2,0xab,0x00,0x08,0x00,0xd1,0x0c,0x10,0x08,0x08,0xff,
+	0xe2,0xb2,0xad,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0xaf,0x00,0x08,0x00,
+	0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb2,0xb1,0x00,0x08,0x00,
+	0x10,0x08,0x08,0xff,0xe2,0xb2,0xb3,0x00,0x08,0x00,0xd1,0x0c,0x10,0x08,0x08,0xff,
+	0xe2,0xb2,0xb5,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0xb7,0x00,0x08,0x00,
+	0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb2,0xb9,0x00,0x08,0x00,0x10,0x08,
+	0x08,0xff,0xe2,0xb2,0xbb,0x00,0x08,0x00,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb2,
+	0xbd,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb2,0xbf,0x00,0x08,0x00,0xcf,0x86,
+	0xd5,0xc0,0xd4,0x60,0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb3,
+	0x81,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb3,0x83,0x00,0x08,0x00,0xd1,0x0c,
+	0x10,0x08,0x08,0xff,0xe2,0xb3,0x85,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb3,
+	0x87,0x00,0x08,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb3,0x89,0x00,
+	0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb3,0x8b,0x00,0x08,0x00,0xd1,0x0c,0x10,0x08,
+	0x08,0xff,0xe2,0xb3,0x8d,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb3,0x8f,0x00,
+	0x08,0x00,0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb3,0x91,0x00,
+	0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb3,0x93,0x00,0x08,0x00,0xd1,0x0c,0x10,0x08,
+	0x08,0xff,0xe2,0xb3,0x95,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb3,0x97,0x00,
+	0x08,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb3,0x99,0x00,0x08,0x00,
+	0x10,0x08,0x08,0xff,0xe2,0xb3,0x9b,0x00,0x08,0x00,0xd1,0x0c,0x10,0x08,0x08,0xff,
+	0xe2,0xb3,0x9d,0x00,0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb3,0x9f,0x00,0x08,0x00,
+	0xd4,0x3b,0xd3,0x1c,0x92,0x18,0xd1,0x0c,0x10,0x08,0x08,0xff,0xe2,0xb3,0xa1,0x00,
+	0x08,0x00,0x10,0x08,0x08,0xff,0xe2,0xb3,0xa3,0x00,0x08,0x00,0x08,0x00,0xd2,0x10,
+	0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x0b,0xff,0xe2,0xb3,0xac,0x00,0xe1,0x3b,
+	0x5f,0x10,0x04,0x0b,0x00,0x0b,0xff,0xe2,0xb3,0xae,0x00,0xe3,0x40,0x5f,0x92,0x10,
+	0x51,0x04,0x0b,0xe6,0x10,0x08,0x0d,0xff,0xe2,0xb3,0xb3,0x00,0x0d,0x00,0x00,0x00,
+	0xe2,0x98,0x08,0xd1,0x0b,0xe0,0x11,0x67,0xcf,0x86,0xcf,0x06,0x01,0x00,0xe0,0x65,
+	0x6c,0xcf,0x86,0xe5,0xa7,0x05,0xd4,0x06,0xcf,0x06,0x04,0x00,0xd3,0x0c,0xe2,0xf8,
+	0x67,0xe1,0x8f,0x67,0xcf,0x06,0x04,0x00,0xe2,0xdb,0x01,0xe1,0x26,0x01,0xd0,0x09,
+	0xcf,0x86,0x65,0xf4,0x67,0x0a,0x00,0xcf,0x86,0xd5,0xc0,0xd4,0x60,0xd3,0x30,0xd2,
+	0x18,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x99,0x81,0x00,0x0a,0x00,0x10,0x08,0x0a,
+	0xff,0xea,0x99,0x83,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x99,0x85,
+	0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x99,0x87,0x00,0x0a,0x00,0xd2,0x18,0xd1,
+	0x0c,0x10,0x08,0x0a,0xff,0xea,0x99,0x89,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,
+	0x99,0x8b,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x99,0x8d,0x00,0x0a,
+	0x00,0x10,0x08,0x0a,0xff,0xea,0x99,0x8f,0x00,0x0a,0x00,0xd3,0x30,0xd2,0x18,0xd1,
+	0x0c,0x10,0x08,0x0a,0xff,0xea,0x99,0x91,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,
+	0x99,0x93,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x99,0x95,0x00,0x0a,
+	0x00,0x10,0x08,0x0a,0xff,0xea,0x99,0x97,0x00,0x0a,0x00,0xd2,0x18,0xd1,0x0c,0x10,
+	0x08,0x0a,0xff,0xea,0x99,0x99,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x99,0x9b,
+	0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x99,0x9d,0x00,0x0a,0x00,0x10,
+	0x08,0x0a,0xff,0xea,0x99,0x9f,0x00,0x0a,0x00,0xe4,0x5d,0x67,0xd3,0x30,0xd2,0x18,
+	0xd1,0x0c,0x10,0x08,0x0c,0xff,0xea,0x99,0xa1,0x00,0x0c,0x00,0x10,0x08,0x0a,0xff,
+	0xea,0x99,0xa3,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x99,0xa5,0x00,
+	0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x99,0xa7,0x00,0x0a,0x00,0xd2,0x18,0xd1,0x0c,
+	0x10,0x08,0x0a,0xff,0xea,0x99,0xa9,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x99,
+	0xab,0x00,0x0a,0x00,0xe1,0x0c,0x67,0x10,0x08,0x0a,0xff,0xea,0x99,0xad,0x00,0x0a,
+	0x00,0xe0,0x35,0x67,0xcf,0x86,0x95,0xab,0xd4,0x60,0xd3,0x30,0xd2,0x18,0xd1,0x0c,
+	0x10,0x08,0x0a,0xff,0xea,0x9a,0x81,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9a,
+	0x83,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9a,0x85,0x00,0x0a,0x00,
+	0x10,0x08,0x0a,0xff,0xea,0x9a,0x87,0x00,0x0a,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,
+	0x0a,0xff,0xea,0x9a,0x89,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9a,0x8b,0x00,
+	0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9a,0x8d,0x00,0x0a,0x00,0x10,0x08,
+	0x0a,0xff,0xea,0x9a,0x8f,0x00,0x0a,0x00,0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,
+	0x0a,0xff,0xea,0x9a,0x91,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9a,0x93,0x00,
+	0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9a,0x95,0x00,0x0a,0x00,0x10,0x08,
+	0x0a,0xff,0xea,0x9a,0x97,0x00,0x0a,0x00,0xe2,0x92,0x66,0xd1,0x0c,0x10,0x08,0x10,
+	0xff,0xea,0x9a,0x99,0x00,0x10,0x00,0x10,0x08,0x10,0xff,0xea,0x9a,0x9b,0x00,0x10,
+	0x00,0x0b,0x00,0xe1,0x10,0x02,0xd0,0xb9,0xcf,0x86,0xd5,0x07,0x64,0x9e,0x66,0x08,
+	0x00,0xd4,0x58,0xd3,0x28,0xd2,0x10,0x51,0x04,0x09,0x00,0x10,0x08,0x0a,0xff,0xea,
+	0x9c,0xa3,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9c,0xa5,0x00,0x0a,
+	0x00,0x10,0x08,0x0a,0xff,0xea,0x9c,0xa7,0x00,0x0a,0x00,0xd2,0x18,0xd1,0x0c,0x10,
+	0x08,0x0a,0xff,0xea,0x9c,0xa9,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9c,0xab,
+	0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9c,0xad,0x00,0x0a,0x00,0x10,
+	0x08,0x0a,0xff,0xea,0x9c,0xaf,0x00,0x0a,0x00,0xd3,0x28,0xd2,0x10,0x51,0x04,0x0a,
+	0x00,0x10,0x08,0x0a,0xff,0xea,0x9c,0xb3,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,
+	0xff,0xea,0x9c,0xb5,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9c,0xb7,0x00,0x0a,
+	0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9c,0xb9,0x00,0x0a,0x00,0x10,
+	0x08,0x0a,0xff,0xea,0x9c,0xbb,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,
+	0x9c,0xbd,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9c,0xbf,0x00,0x0a,0x00,0xcf,
+	0x86,0xd5,0xc0,0xd4,0x60,0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,
+	0x9d,0x81,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0x83,0x00,0x0a,0x00,0xd1,
+	0x0c,0x10,0x08,0x0a,0xff,0xea,0x9d,0x85,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,
+	0x9d,0x87,0x00,0x0a,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9d,0x89,
+	0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0x8b,0x00,0x0a,0x00,0xd1,0x0c,0x10,
+	0x08,0x0a,0xff,0xea,0x9d,0x8d,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0x8f,
+	0x00,0x0a,0x00,0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9d,0x91,
+	0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0x93,0x00,0x0a,0x00,0xd1,0x0c,0x10,
+	0x08,0x0a,0xff,0xea,0x9d,0x95,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0x97,
+	0x00,0x0a,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9d,0x99,0x00,0x0a,
+	0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0x9b,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,
+	0xff,0xea,0x9d,0x9d,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0x9f,0x00,0x0a,
+	0x00,0xd4,0x60,0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9d,0xa1,
+	0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0xa3,0x00,0x0a,0x00,0xd1,0x0c,0x10,
+	0x08,0x0a,0xff,0xea,0x9d,0xa5,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0xa7,
+	0x00,0x0a,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9d,0xa9,0x00,0x0a,
+	0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0xab,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,
+	0xff,0xea,0x9d,0xad,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0xaf,0x00,0x0a,
+	0x00,0x53,0x04,0x0a,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x04,0x0a,0x00,0x0a,0xff,0xea,
+	0x9d,0xba,0x00,0x10,0x04,0x0a,0x00,0x0a,0xff,0xea,0x9d,0xbc,0x00,0xd1,0x0c,0x10,
+	0x04,0x0a,0x00,0x0a,0xff,0xe1,0xb5,0xb9,0x00,0x10,0x08,0x0a,0xff,0xea,0x9d,0xbf,
+	0x00,0x0a,0x00,0xe0,0x71,0x01,0xcf,0x86,0xd5,0xa6,0xd4,0x4e,0xd3,0x30,0xd2,0x18,
+	0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9e,0x81,0x00,0x0a,0x00,0x10,0x08,0x0a,0xff,
+	0xea,0x9e,0x83,0x00,0x0a,0x00,0xd1,0x0c,0x10,0x08,0x0a,0xff,0xea,0x9e,0x85,0x00,
+	0x0a,0x00,0x10,0x08,0x0a,0xff,0xea,0x9e,0x87,0x00,0x0a,0x00,0xd2,0x10,0x51,0x04,
+	0x0a,0x00,0x10,0x04,0x0a,0x00,0x0a,0xff,0xea,0x9e,0x8c,0x00,0xe1,0x9a,0x64,0x10,
+	0x04,0x0a,0x00,0x0c,0xff,0xc9,0xa5,0x00,0xd3,0x28,0xd2,0x18,0xd1,0x0c,0x10,0x08,
+	0x0c,0xff,0xea,0x9e,0x91,0x00,0x0c,0x00,0x10,0x08,0x0d,0xff,0xea,0x9e,0x93,0x00,
+	0x0d,0x00,0x51,0x04,0x10,0x00,0x10,0x08,0x10,0xff,0xea,0x9e,0x97,0x00,0x10,0x00,
+	0xd2,0x18,0xd1,0x0c,0x10,0x08,0x10,0xff,0xea,0x9e,0x99,0x00,0x10,0x00,0x10,0x08,
+	0x10,0xff,0xea,0x9e,0x9b,0x00,0x10,0x00,0xd1,0x0c,0x10,0x08,0x10,0xff,0xea,0x9e,
+	0x9d,0x00,0x10,0x00,0x10,0x08,0x10,0xff,0xea,0x9e,0x9f,0x00,0x10,0x00,0xd4,0x63,
+	0xd3,0x30,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x0c,0xff,0xea,0x9e,0xa1,0x00,0x0c,0x00,
+	0x10,0x08,0x0c,0xff,0xea,0x9e,0xa3,0x00,0x0c,0x00,0xd1,0x0c,0x10,0x08,0x0c,0xff,
+	0xea,0x9e,0xa5,0x00,0x0c,0x00,0x10,0x08,0x0c,0xff,0xea,0x9e,0xa7,0x00,0x0c,0x00,
+	0xd2,0x1a,0xd1,0x0c,0x10,0x08,0x0c,0xff,0xea,0x9e,0xa9,0x00,0x0c,0x00,0x10,0x07,
+	0x0d,0xff,0xc9,0xa6,0x00,0x10,0xff,0xc9,0x9c,0x00,0xd1,0x0e,0x10,0x07,0x10,0xff,
+	0xc9,0xa1,0x00,0x10,0xff,0xc9,0xac,0x00,0x10,0x07,0x12,0xff,0xc9,0xaa,0x00,0x14,
+	0x00,0xd3,0x35,0xd2,0x1d,0xd1,0x0e,0x10,0x07,0x10,0xff,0xca,0x9e,0x00,0x10,0xff,
+	0xca,0x87,0x00,0x10,0x07,0x11,0xff,0xca,0x9d,0x00,0x11,0xff,0xea,0xad,0x93,0x00,
+	0xd1,0x0c,0x10,0x08,0x11,0xff,0xea,0x9e,0xb5,0x00,0x11,0x00,0x10,0x08,0x11,0xff,
+	0xea,0x9e,0xb7,0x00,0x11,0x00,0xd2,0x18,0xd1,0x0c,0x10,0x08,0x14,0xff,0xea,0x9e,
+	0xb9,0x00,0x14,0x00,0x10,0x08,0x15,0xff,0xea,0x9e,0xbb,0x00,0x15,0x00,0xd1,0x0c,
+	0x10,0x08,0x15,0xff,0xea,0x9e,0xbd,0x00,0x15,0x00,0x10,0x08,0x15,0xff,0xea,0x9e,
+	0xbf,0x00,0x15,0x00,0xcf,0x86,0xe5,0xd4,0x63,0x94,0x2f,0x93,0x2b,0xd2,0x10,0x51,
+	0x04,0x00,0x00,0x10,0x08,0x15,0xff,0xea,0x9f,0x83,0x00,0x15,0x00,0xd1,0x0f,0x10,
+	0x08,0x15,0xff,0xea,0x9e,0x94,0x00,0x15,0xff,0xca,0x82,0x00,0x10,0x08,0x15,0xff,
+	0xe1,0xb6,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0xb4,0x66,0xd3,0x1d,0xe2,
+	0x5b,0x64,0xe1,0x0a,0x64,0xe0,0xf7,0x63,0xcf,0x86,0xe5,0xd8,0x63,0x94,0x0b,0x93,
+	0x07,0x62,0xc3,0x63,0x08,0x00,0x08,0x00,0x08,0x00,0xd2,0x0f,0xe1,0x5a,0x65,0xe0,
+	0x27,0x65,0xcf,0x86,0x65,0x0c,0x65,0x0a,0x00,0xd1,0xab,0xd0,0x1a,0xcf,0x86,0xe5,
+	0x17,0x66,0xe4,0xfa,0x65,0xe3,0xe1,0x65,0xe2,0xd4,0x65,0x91,0x08,0x10,0x04,0x00,
+	0x00,0x0c,0x00,0x0c,0x00,0xcf,0x86,0x55,0x04,0x10,0x00,0xd4,0x0b,0x93,0x07,0x62,
+	0x27,0x66,0x11,0x00,0x00,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x11,0xff,
+	0xe1,0x8e,0xa0,0x00,0x11,0xff,0xe1,0x8e,0xa1,0x00,0x10,0x08,0x11,0xff,0xe1,0x8e,
+	0xa2,0x00,0x11,0xff,0xe1,0x8e,0xa3,0x00,0xd1,0x10,0x10,0x08,0x11,0xff,0xe1,0x8e,
+	0xa4,0x00,0x11,0xff,0xe1,0x8e,0xa5,0x00,0x10,0x08,0x11,0xff,0xe1,0x8e,0xa6,0x00,
+	0x11,0xff,0xe1,0x8e,0xa7,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x11,0xff,0xe1,0x8e,
+	0xa8,0x00,0x11,0xff,0xe1,0x8e,0xa9,0x00,0x10,0x08,0x11,0xff,0xe1,0x8e,0xaa,0x00,
+	0x11,0xff,0xe1,0x8e,0xab,0x00,0xd1,0x10,0x10,0x08,0x11,0xff,0xe1,0x8e,0xac,0x00,
+	0x11,0xff,0xe1,0x8e,0xad,0x00,0x10,0x08,0x11,0xff,0xe1,0x8e,0xae,0x00,0x11,0xff,
+	0xe1,0x8e,0xaf,0x00,0xe0,0xb2,0x65,0xcf,0x86,0xe5,0x01,0x01,0xd4,0x80,0xd3,0x40,
+	0xd2,0x20,0xd1,0x10,0x10,0x08,0x11,0xff,0xe1,0x8e,0xb0,0x00,0x11,0xff,0xe1,0x8e,
+	0xb1,0x00,0x10,0x08,0x11,0xff,0xe1,0x8e,0xb2,0x00,0x11,0xff,0xe1,0x8e,0xb3,0x00,
+	0xd1,0x10,0x10,0x08,0x11,0xff,0xe1,0x8e,0xb4,0x00,0x11,0xff,0xe1,0x8e,0xb5,0x00,
+	0x10,0x08,0x11,0xff,0xe1,0x8e,0xb6,0x00,0x11,0xff,0xe1,0x8e,0xb7,0x00,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x11,0xff,0xe1,0x8e,0xb8,0x00,0x11,0xff,0xe1,0x8e,0xb9,0x00,
+	0x10,0x08,0x11,0xff,0xe1,0x8e,0xba,0x00,0x11,0xff,0xe1,0x8e,0xbb,0x00,0xd1,0x10,
+	0x10,0x08,0x11,0xff,0xe1,0x8e,0xbc,0x00,0x11,0xff,0xe1,0x8e,0xbd,0x00,0x10,0x08,
+	0x11,0xff,0xe1,0x8e,0xbe,0x00,0x11,0xff,0xe1,0x8e,0xbf,0x00,0xd3,0x40,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x11,0xff,0xe1,0x8f,0x80,0x00,0x11,0xff,0xe1,0x8f,0x81,0x00,
+	0x10,0x08,0x11,0xff,0xe1,0x8f,0x82,0x00,0x11,0xff,0xe1,0x8f,0x83,0x00,0xd1,0x10,
+	0x10,0x08,0x11,0xff,0xe1,0x8f,0x84,0x00,0x11,0xff,0xe1,0x8f,0x85,0x00,0x10,0x08,
+	0x11,0xff,0xe1,0x8f,0x86,0x00,0x11,0xff,0xe1,0x8f,0x87,0x00,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x11,0xff,0xe1,0x8f,0x88,0x00,0x11,0xff,0xe1,0x8f,0x89,0x00,0x10,0x08,
+	0x11,0xff,0xe1,0x8f,0x8a,0x00,0x11,0xff,0xe1,0x8f,0x8b,0x00,0xd1,0x10,0x10,0x08,
+	0x11,0xff,0xe1,0x8f,0x8c,0x00,0x11,0xff,0xe1,0x8f,0x8d,0x00,0x10,0x08,0x11,0xff,
+	0xe1,0x8f,0x8e,0x00,0x11,0xff,0xe1,0x8f,0x8f,0x00,0xd4,0x80,0xd3,0x40,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x11,0xff,0xe1,0x8f,0x90,0x00,0x11,0xff,0xe1,0x8f,0x91,0x00,
+	0x10,0x08,0x11,0xff,0xe1,0x8f,0x92,0x00,0x11,0xff,0xe1,0x8f,0x93,0x00,0xd1,0x10,
+	0x10,0x08,0x11,0xff,0xe1,0x8f,0x94,0x00,0x11,0xff,0xe1,0x8f,0x95,0x00,0x10,0x08,
+	0x11,0xff,0xe1,0x8f,0x96,0x00,0x11,0xff,0xe1,0x8f,0x97,0x00,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x11,0xff,0xe1,0x8f,0x98,0x00,0x11,0xff,0xe1,0x8f,0x99,0x00,0x10,0x08,
+	0x11,0xff,0xe1,0x8f,0x9a,0x00,0x11,0xff,0xe1,0x8f,0x9b,0x00,0xd1,0x10,0x10,0x08,
+	0x11,0xff,0xe1,0x8f,0x9c,0x00,0x11,0xff,0xe1,0x8f,0x9d,0x00,0x10,0x08,0x11,0xff,
+	0xe1,0x8f,0x9e,0x00,0x11,0xff,0xe1,0x8f,0x9f,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x11,0xff,0xe1,0x8f,0xa0,0x00,0x11,0xff,0xe1,0x8f,0xa1,0x00,0x10,0x08,
+	0x11,0xff,0xe1,0x8f,0xa2,0x00,0x11,0xff,0xe1,0x8f,0xa3,0x00,0xd1,0x10,0x10,0x08,
+	0x11,0xff,0xe1,0x8f,0xa4,0x00,0x11,0xff,0xe1,0x8f,0xa5,0x00,0x10,0x08,0x11,0xff,
+	0xe1,0x8f,0xa6,0x00,0x11,0xff,0xe1,0x8f,0xa7,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x11,0xff,0xe1,0x8f,0xa8,0x00,0x11,0xff,0xe1,0x8f,0xa9,0x00,0x10,0x08,0x11,0xff,
+	0xe1,0x8f,0xaa,0x00,0x11,0xff,0xe1,0x8f,0xab,0x00,0xd1,0x10,0x10,0x08,0x11,0xff,
+	0xe1,0x8f,0xac,0x00,0x11,0xff,0xe1,0x8f,0xad,0x00,0x10,0x08,0x11,0xff,0xe1,0x8f,
+	0xae,0x00,0x11,0xff,0xe1,0x8f,0xaf,0x00,0xd1,0x0c,0xe0,0xeb,0x63,0xcf,0x86,0xcf,
+	0x06,0x02,0xff,0xff,0xd0,0x08,0xcf,0x86,0xcf,0x06,0x01,0x00,0xcf,0x86,0xd5,0x06,
+	0xcf,0x06,0x01,0x00,0xd4,0xae,0xd3,0x09,0xe2,0x54,0x64,0xcf,0x06,0x01,0x00,0xd2,
+	0x27,0xe1,0x1f,0x70,0xe0,0x26,0x6e,0xcf,0x86,0xe5,0x3f,0x6d,0xe4,0xce,0x6c,0xe3,
+	0x99,0x6c,0xe2,0x78,0x6c,0xe1,0x67,0x6c,0x10,0x08,0x01,0xff,0xe5,0x88,0x87,0x00,
+	0x01,0xff,0xe5,0xba,0xa6,0x00,0xe1,0x74,0x74,0xe0,0xe8,0x73,0xcf,0x86,0xe5,0x22,
+	0x73,0xd4,0x3b,0x93,0x37,0xd2,0x1d,0xd1,0x0e,0x10,0x07,0x01,0xff,0x66,0x66,0x00,
+	0x01,0xff,0x66,0x69,0x00,0x10,0x07,0x01,0xff,0x66,0x6c,0x00,0x01,0xff,0x66,0x66,
+	0x69,0x00,0xd1,0x0f,0x10,0x08,0x01,0xff,0x66,0x66,0x6c,0x00,0x01,0xff,0x73,0x74,
+	0x00,0x10,0x07,0x01,0xff,0x73,0x74,0x00,0x00,0x00,0x00,0x00,0xe3,0xc8,0x72,0xd2,
+	0x11,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0xff,0xd5,0xb4,0xd5,0xb6,0x00,
+	0xd1,0x12,0x10,0x09,0x01,0xff,0xd5,0xb4,0xd5,0xa5,0x00,0x01,0xff,0xd5,0xb4,0xd5,
+	0xab,0x00,0x10,0x09,0x01,0xff,0xd5,0xbe,0xd5,0xb6,0x00,0x01,0xff,0xd5,0xb4,0xd5,
+	0xad,0x00,0xd3,0x09,0xe2,0x40,0x74,0xcf,0x06,0x01,0x00,0xd2,0x13,0xe1,0x30,0x75,
+	0xe0,0xc1,0x74,0xcf,0x86,0xe5,0x9e,0x74,0x64,0x8d,0x74,0x06,0xff,0x00,0xe1,0x96,
+	0x75,0xe0,0x63,0x75,0xcf,0x86,0xd5,0x18,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd4,0x7c,
+	0xd3,0x3c,0xd2,0x1c,0xd1,0x0c,0x10,0x04,0x01,0x00,0x01,0xff,0xef,0xbd,0x81,0x00,
+	0x10,0x08,0x01,0xff,0xef,0xbd,0x82,0x00,0x01,0xff,0xef,0xbd,0x83,0x00,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xef,0xbd,0x84,0x00,0x01,0xff,0xef,0xbd,0x85,0x00,0x10,0x08,
+	0x01,0xff,0xef,0xbd,0x86,0x00,0x01,0xff,0xef,0xbd,0x87,0x00,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xef,0xbd,0x88,0x00,0x01,0xff,0xef,0xbd,0x89,0x00,0x10,0x08,
+	0x01,0xff,0xef,0xbd,0x8a,0x00,0x01,0xff,0xef,0xbd,0x8b,0x00,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xef,0xbd,0x8c,0x00,0x01,0xff,0xef,0xbd,0x8d,0x00,0x10,0x08,0x01,0xff,
+	0xef,0xbd,0x8e,0x00,0x01,0xff,0xef,0xbd,0x8f,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xef,0xbd,0x90,0x00,0x01,0xff,0xef,0xbd,0x91,0x00,0x10,0x08,
+	0x01,0xff,0xef,0xbd,0x92,0x00,0x01,0xff,0xef,0xbd,0x93,0x00,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xef,0xbd,0x94,0x00,0x01,0xff,0xef,0xbd,0x95,0x00,0x10,0x08,0x01,0xff,
+	0xef,0xbd,0x96,0x00,0x01,0xff,0xef,0xbd,0x97,0x00,0x92,0x1c,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xef,0xbd,0x98,0x00,0x01,0xff,0xef,0xbd,0x99,0x00,0x10,0x08,0x01,0xff,
+	0xef,0xbd,0x9a,0x00,0x01,0x00,0x01,0x00,0x83,0xe2,0x87,0xb3,0xe1,0x60,0xb0,0xe0,
+	0xdd,0xae,0xcf,0x86,0xe5,0x81,0x9b,0xc4,0xe3,0xc1,0x07,0xe2,0x62,0x06,0xe1,0x11,
+	0x86,0xe0,0x09,0x05,0xcf,0x86,0xe5,0xfb,0x02,0xd4,0x1c,0xe3,0x7f,0x76,0xe2,0xd6,
+	0x75,0xe1,0xb1,0x75,0xe0,0x8a,0x75,0xcf,0x86,0xe5,0x57,0x75,0x94,0x07,0x63,0x42,
+	0x75,0x07,0x00,0x07,0x00,0xe3,0x2b,0x78,0xe2,0xf0,0x77,0xe1,0x77,0x01,0xe0,0x88,
+	0x77,0xcf,0x86,0xe5,0x21,0x01,0xd4,0x90,0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,0x09,
+	0x05,0xff,0xf0,0x90,0x90,0xa8,0x00,0x05,0xff,0xf0,0x90,0x90,0xa9,0x00,0x10,0x09,
+	0x05,0xff,0xf0,0x90,0x90,0xaa,0x00,0x05,0xff,0xf0,0x90,0x90,0xab,0x00,0xd1,0x12,
+	0x10,0x09,0x05,0xff,0xf0,0x90,0x90,0xac,0x00,0x05,0xff,0xf0,0x90,0x90,0xad,0x00,
+	0x10,0x09,0x05,0xff,0xf0,0x90,0x90,0xae,0x00,0x05,0xff,0xf0,0x90,0x90,0xaf,0x00,
+	0xd2,0x24,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0x90,0x90,0xb0,0x00,0x05,0xff,0xf0,
+	0x90,0x90,0xb1,0x00,0x10,0x09,0x05,0xff,0xf0,0x90,0x90,0xb2,0x00,0x05,0xff,0xf0,
+	0x90,0x90,0xb3,0x00,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0x90,0x90,0xb4,0x00,0x05,
+	0xff,0xf0,0x90,0x90,0xb5,0x00,0x10,0x09,0x05,0xff,0xf0,0x90,0x90,0xb6,0x00,0x05,
+	0xff,0xf0,0x90,0x90,0xb7,0x00,0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,0x09,0x05,0xff,
+	0xf0,0x90,0x90,0xb8,0x00,0x05,0xff,0xf0,0x90,0x90,0xb9,0x00,0x10,0x09,0x05,0xff,
+	0xf0,0x90,0x90,0xba,0x00,0x05,0xff,0xf0,0x90,0x90,0xbb,0x00,0xd1,0x12,0x10,0x09,
+	0x05,0xff,0xf0,0x90,0x90,0xbc,0x00,0x05,0xff,0xf0,0x90,0x90,0xbd,0x00,0x10,0x09,
+	0x05,0xff,0xf0,0x90,0x90,0xbe,0x00,0x05,0xff,0xf0,0x90,0x90,0xbf,0x00,0xd2,0x24,
+	0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0x90,0x91,0x80,0x00,0x05,0xff,0xf0,0x90,0x91,
+	0x81,0x00,0x10,0x09,0x05,0xff,0xf0,0x90,0x91,0x82,0x00,0x05,0xff,0xf0,0x90,0x91,
+	0x83,0x00,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0x90,0x91,0x84,0x00,0x05,0xff,0xf0,
+	0x90,0x91,0x85,0x00,0x10,0x09,0x05,0xff,0xf0,0x90,0x91,0x86,0x00,0x05,0xff,0xf0,
+	0x90,0x91,0x87,0x00,0x94,0x4c,0x93,0x48,0xd2,0x24,0xd1,0x12,0x10,0x09,0x05,0xff,
+	0xf0,0x90,0x91,0x88,0x00,0x05,0xff,0xf0,0x90,0x91,0x89,0x00,0x10,0x09,0x05,0xff,
+	0xf0,0x90,0x91,0x8a,0x00,0x05,0xff,0xf0,0x90,0x91,0x8b,0x00,0xd1,0x12,0x10,0x09,
+	0x05,0xff,0xf0,0x90,0x91,0x8c,0x00,0x05,0xff,0xf0,0x90,0x91,0x8d,0x00,0x10,0x09,
+	0x07,0xff,0xf0,0x90,0x91,0x8e,0x00,0x07,0xff,0xf0,0x90,0x91,0x8f,0x00,0x05,0x00,
+	0x05,0x00,0xd0,0xa0,0xcf,0x86,0xd5,0x07,0x64,0x30,0x76,0x07,0x00,0xd4,0x07,0x63,
+	0x3d,0x76,0x07,0x00,0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,0x09,0x12,0xff,0xf0,0x90,
+	0x93,0x98,0x00,0x12,0xff,0xf0,0x90,0x93,0x99,0x00,0x10,0x09,0x12,0xff,0xf0,0x90,
+	0x93,0x9a,0x00,0x12,0xff,0xf0,0x90,0x93,0x9b,0x00,0xd1,0x12,0x10,0x09,0x12,0xff,
+	0xf0,0x90,0x93,0x9c,0x00,0x12,0xff,0xf0,0x90,0x93,0x9d,0x00,0x10,0x09,0x12,0xff,
+	0xf0,0x90,0x93,0x9e,0x00,0x12,0xff,0xf0,0x90,0x93,0x9f,0x00,0xd2,0x24,0xd1,0x12,
+	0x10,0x09,0x12,0xff,0xf0,0x90,0x93,0xa0,0x00,0x12,0xff,0xf0,0x90,0x93,0xa1,0x00,
+	0x10,0x09,0x12,0xff,0xf0,0x90,0x93,0xa2,0x00,0x12,0xff,0xf0,0x90,0x93,0xa3,0x00,
+	0xd1,0x12,0x10,0x09,0x12,0xff,0xf0,0x90,0x93,0xa4,0x00,0x12,0xff,0xf0,0x90,0x93,
+	0xa5,0x00,0x10,0x09,0x12,0xff,0xf0,0x90,0x93,0xa6,0x00,0x12,0xff,0xf0,0x90,0x93,
+	0xa7,0x00,0xcf,0x86,0xe5,0xc6,0x75,0xd4,0x90,0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,
+	0x09,0x12,0xff,0xf0,0x90,0x93,0xa8,0x00,0x12,0xff,0xf0,0x90,0x93,0xa9,0x00,0x10,
+	0x09,0x12,0xff,0xf0,0x90,0x93,0xaa,0x00,0x12,0xff,0xf0,0x90,0x93,0xab,0x00,0xd1,
+	0x12,0x10,0x09,0x12,0xff,0xf0,0x90,0x93,0xac,0x00,0x12,0xff,0xf0,0x90,0x93,0xad,
+	0x00,0x10,0x09,0x12,0xff,0xf0,0x90,0x93,0xae,0x00,0x12,0xff,0xf0,0x90,0x93,0xaf,
+	0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x12,0xff,0xf0,0x90,0x93,0xb0,0x00,0x12,0xff,
+	0xf0,0x90,0x93,0xb1,0x00,0x10,0x09,0x12,0xff,0xf0,0x90,0x93,0xb2,0x00,0x12,0xff,
+	0xf0,0x90,0x93,0xb3,0x00,0xd1,0x12,0x10,0x09,0x12,0xff,0xf0,0x90,0x93,0xb4,0x00,
+	0x12,0xff,0xf0,0x90,0x93,0xb5,0x00,0x10,0x09,0x12,0xff,0xf0,0x90,0x93,0xb6,0x00,
+	0x12,0xff,0xf0,0x90,0x93,0xb7,0x00,0x93,0x28,0x92,0x24,0xd1,0x12,0x10,0x09,0x12,
+	0xff,0xf0,0x90,0x93,0xb8,0x00,0x12,0xff,0xf0,0x90,0x93,0xb9,0x00,0x10,0x09,0x12,
+	0xff,0xf0,0x90,0x93,0xba,0x00,0x12,0xff,0xf0,0x90,0x93,0xbb,0x00,0x00,0x00,0x12,
+	0x00,0xd4,0x1f,0xe3,0xdf,0x76,0xe2,0x6a,0x76,0xe1,0x09,0x76,0xe0,0xea,0x75,0xcf,
+	0x86,0xe5,0xb7,0x75,0x94,0x0a,0xe3,0xa2,0x75,0x62,0x99,0x75,0x07,0x00,0x07,0x00,
+	0xe3,0xde,0x78,0xe2,0xaf,0x78,0xd1,0x09,0xe0,0x4c,0x78,0xcf,0x06,0x0b,0x00,0xe0,
+	0x7f,0x78,0xcf,0x86,0xe5,0x21,0x01,0xd4,0x90,0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,
+	0x09,0x11,0xff,0xf0,0x90,0xb3,0x80,0x00,0x11,0xff,0xf0,0x90,0xb3,0x81,0x00,0x10,
+	0x09,0x11,0xff,0xf0,0x90,0xb3,0x82,0x00,0x11,0xff,0xf0,0x90,0xb3,0x83,0x00,0xd1,
+	0x12,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0x84,0x00,0x11,0xff,0xf0,0x90,0xb3,0x85,
+	0x00,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0x86,0x00,0x11,0xff,0xf0,0x90,0xb3,0x87,
+	0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0x88,0x00,0x11,0xff,
+	0xf0,0x90,0xb3,0x89,0x00,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0x8a,0x00,0x11,0xff,
+	0xf0,0x90,0xb3,0x8b,0x00,0xd1,0x12,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0x8c,0x00,
+	0x11,0xff,0xf0,0x90,0xb3,0x8d,0x00,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0x8e,0x00,
+	0x11,0xff,0xf0,0x90,0xb3,0x8f,0x00,0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,0x09,0x11,
+	0xff,0xf0,0x90,0xb3,0x90,0x00,0x11,0xff,0xf0,0x90,0xb3,0x91,0x00,0x10,0x09,0x11,
+	0xff,0xf0,0x90,0xb3,0x92,0x00,0x11,0xff,0xf0,0x90,0xb3,0x93,0x00,0xd1,0x12,0x10,
+	0x09,0x11,0xff,0xf0,0x90,0xb3,0x94,0x00,0x11,0xff,0xf0,0x90,0xb3,0x95,0x00,0x10,
+	0x09,0x11,0xff,0xf0,0x90,0xb3,0x96,0x00,0x11,0xff,0xf0,0x90,0xb3,0x97,0x00,0xd2,
+	0x24,0xd1,0x12,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0x98,0x00,0x11,0xff,0xf0,0x90,
+	0xb3,0x99,0x00,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0x9a,0x00,0x11,0xff,0xf0,0x90,
+	0xb3,0x9b,0x00,0xd1,0x12,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0x9c,0x00,0x11,0xff,
+	0xf0,0x90,0xb3,0x9d,0x00,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0x9e,0x00,0x11,0xff,
+	0xf0,0x90,0xb3,0x9f,0x00,0xd4,0x90,0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,0x09,0x11,
+	0xff,0xf0,0x90,0xb3,0xa0,0x00,0x11,0xff,0xf0,0x90,0xb3,0xa1,0x00,0x10,0x09,0x11,
+	0xff,0xf0,0x90,0xb3,0xa2,0x00,0x11,0xff,0xf0,0x90,0xb3,0xa3,0x00,0xd1,0x12,0x10,
+	0x09,0x11,0xff,0xf0,0x90,0xb3,0xa4,0x00,0x11,0xff,0xf0,0x90,0xb3,0xa5,0x00,0x10,
+	0x09,0x11,0xff,0xf0,0x90,0xb3,0xa6,0x00,0x11,0xff,0xf0,0x90,0xb3,0xa7,0x00,0xd2,
+	0x24,0xd1,0x12,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0xa8,0x00,0x11,0xff,0xf0,0x90,
+	0xb3,0xa9,0x00,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0xaa,0x00,0x11,0xff,0xf0,0x90,
+	0xb3,0xab,0x00,0xd1,0x12,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0xac,0x00,0x11,0xff,
+	0xf0,0x90,0xb3,0xad,0x00,0x10,0x09,0x11,0xff,0xf0,0x90,0xb3,0xae,0x00,0x11,0xff,
+	0xf0,0x90,0xb3,0xaf,0x00,0x93,0x23,0x92,0x1f,0xd1,0x12,0x10,0x09,0x11,0xff,0xf0,
+	0x90,0xb3,0xb0,0x00,0x11,0xff,0xf0,0x90,0xb3,0xb1,0x00,0x10,0x09,0x11,0xff,0xf0,
+	0x90,0xb3,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0xd5,0x15,0xe4,0x91,
+	0x7b,0xe3,0x9b,0x79,0xe2,0x94,0x78,0xe1,0xe4,0x77,0xe0,0x9d,0x77,0xcf,0x06,0x0c,
+	0x00,0xe4,0xeb,0x7e,0xe3,0x44,0x7e,0xe2,0xed,0x7d,0xd1,0x0c,0xe0,0xb2,0x7d,0xcf,
+	0x86,0x65,0x93,0x7d,0x14,0x00,0xe0,0xb6,0x7d,0xcf,0x86,0x55,0x04,0x00,0x00,0xd4,
+	0x90,0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,0x09,0x10,0xff,0xf0,0x91,0xa3,0x80,0x00,
+	0x10,0xff,0xf0,0x91,0xa3,0x81,0x00,0x10,0x09,0x10,0xff,0xf0,0x91,0xa3,0x82,0x00,
+	0x10,0xff,0xf0,0x91,0xa3,0x83,0x00,0xd1,0x12,0x10,0x09,0x10,0xff,0xf0,0x91,0xa3,
+	0x84,0x00,0x10,0xff,0xf0,0x91,0xa3,0x85,0x00,0x10,0x09,0x10,0xff,0xf0,0x91,0xa3,
+	0x86,0x00,0x10,0xff,0xf0,0x91,0xa3,0x87,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x10,
+	0xff,0xf0,0x91,0xa3,0x88,0x00,0x10,0xff,0xf0,0x91,0xa3,0x89,0x00,0x10,0x09,0x10,
+	0xff,0xf0,0x91,0xa3,0x8a,0x00,0x10,0xff,0xf0,0x91,0xa3,0x8b,0x00,0xd1,0x12,0x10,
+	0x09,0x10,0xff,0xf0,0x91,0xa3,0x8c,0x00,0x10,0xff,0xf0,0x91,0xa3,0x8d,0x00,0x10,
+	0x09,0x10,0xff,0xf0,0x91,0xa3,0x8e,0x00,0x10,0xff,0xf0,0x91,0xa3,0x8f,0x00,0xd3,
+	0x48,0xd2,0x24,0xd1,0x12,0x10,0x09,0x10,0xff,0xf0,0x91,0xa3,0x90,0x00,0x10,0xff,
+	0xf0,0x91,0xa3,0x91,0x00,0x10,0x09,0x10,0xff,0xf0,0x91,0xa3,0x92,0x00,0x10,0xff,
+	0xf0,0x91,0xa3,0x93,0x00,0xd1,0x12,0x10,0x09,0x10,0xff,0xf0,0x91,0xa3,0x94,0x00,
+	0x10,0xff,0xf0,0x91,0xa3,0x95,0x00,0x10,0x09,0x10,0xff,0xf0,0x91,0xa3,0x96,0x00,
+	0x10,0xff,0xf0,0x91,0xa3,0x97,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x10,0xff,0xf0,
+	0x91,0xa3,0x98,0x00,0x10,0xff,0xf0,0x91,0xa3,0x99,0x00,0x10,0x09,0x10,0xff,0xf0,
+	0x91,0xa3,0x9a,0x00,0x10,0xff,0xf0,0x91,0xa3,0x9b,0x00,0xd1,0x12,0x10,0x09,0x10,
+	0xff,0xf0,0x91,0xa3,0x9c,0x00,0x10,0xff,0xf0,0x91,0xa3,0x9d,0x00,0x10,0x09,0x10,
+	0xff,0xf0,0x91,0xa3,0x9e,0x00,0x10,0xff,0xf0,0x91,0xa3,0x9f,0x00,0xd1,0x11,0xe0,
+	0x12,0x81,0xcf,0x86,0xe5,0x09,0x81,0xe4,0xd2,0x80,0xcf,0x06,0x00,0x00,0xe0,0xdb,
+	0x82,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x09,0xe3,0x10,0x81,0xcf,0x06,
+	0x0c,0x00,0xd3,0x06,0xcf,0x06,0x00,0x00,0xe2,0x3b,0x82,0xe1,0x16,0x82,0xd0,0x06,
+	0xcf,0x06,0x00,0x00,0xcf,0x86,0xa5,0x21,0x01,0xd4,0x90,0xd3,0x48,0xd2,0x24,0xd1,
+	0x12,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xa0,0x00,0x14,0xff,0xf0,0x96,0xb9,0xa1,
+	0x00,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xa2,0x00,0x14,0xff,0xf0,0x96,0xb9,0xa3,
+	0x00,0xd1,0x12,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xa4,0x00,0x14,0xff,0xf0,0x96,
+	0xb9,0xa5,0x00,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xa6,0x00,0x14,0xff,0xf0,0x96,
+	0xb9,0xa7,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xa8,0x00,
+	0x14,0xff,0xf0,0x96,0xb9,0xa9,0x00,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xaa,0x00,
+	0x14,0xff,0xf0,0x96,0xb9,0xab,0x00,0xd1,0x12,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,
+	0xac,0x00,0x14,0xff,0xf0,0x96,0xb9,0xad,0x00,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,
+	0xae,0x00,0x14,0xff,0xf0,0x96,0xb9,0xaf,0x00,0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,
+	0x09,0x14,0xff,0xf0,0x96,0xb9,0xb0,0x00,0x14,0xff,0xf0,0x96,0xb9,0xb1,0x00,0x10,
+	0x09,0x14,0xff,0xf0,0x96,0xb9,0xb2,0x00,0x14,0xff,0xf0,0x96,0xb9,0xb3,0x00,0xd1,
+	0x12,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xb4,0x00,0x14,0xff,0xf0,0x96,0xb9,0xb5,
+	0x00,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xb6,0x00,0x14,0xff,0xf0,0x96,0xb9,0xb7,
+	0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xb8,0x00,0x14,0xff,
+	0xf0,0x96,0xb9,0xb9,0x00,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xba,0x00,0x14,0xff,
+	0xf0,0x96,0xb9,0xbb,0x00,0xd1,0x12,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xbc,0x00,
+	0x14,0xff,0xf0,0x96,0xb9,0xbd,0x00,0x10,0x09,0x14,0xff,0xf0,0x96,0xb9,0xbe,0x00,
+	0x14,0xff,0xf0,0x96,0xb9,0xbf,0x00,0x14,0x00,0xd2,0x14,0xe1,0x25,0x82,0xe0,0x1c,
+	0x82,0xcf,0x86,0xe5,0xdd,0x81,0xe4,0x9a,0x81,0xcf,0x06,0x12,0x00,0xd1,0x0b,0xe0,
+	0x51,0x83,0xcf,0x86,0xcf,0x06,0x00,0x00,0xe0,0x95,0x8b,0xcf,0x86,0xd5,0x22,0xe4,
+	0xd0,0x88,0xe3,0x93,0x88,0xe2,0x38,0x88,0xe1,0x31,0x88,0xe0,0x2a,0x88,0xcf,0x86,
+	0xe5,0xfb,0x87,0xe4,0xe2,0x87,0x93,0x07,0x62,0xd1,0x87,0x12,0xe6,0x12,0xe6,0xe4,
+	0x36,0x89,0xe3,0x2f,0x89,0xd2,0x09,0xe1,0xb8,0x88,0xcf,0x06,0x10,0x00,0xe1,0x1f,
+	0x89,0xe0,0xec,0x88,0xcf,0x86,0xe5,0x21,0x01,0xd4,0x90,0xd3,0x48,0xd2,0x24,0xd1,
+	0x12,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xa2,0x00,0x12,0xff,0xf0,0x9e,0xa4,0xa3,
+	0x00,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xa4,0x00,0x12,0xff,0xf0,0x9e,0xa4,0xa5,
+	0x00,0xd1,0x12,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xa6,0x00,0x12,0xff,0xf0,0x9e,
+	0xa4,0xa7,0x00,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xa8,0x00,0x12,0xff,0xf0,0x9e,
+	0xa4,0xa9,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xaa,0x00,
+	0x12,0xff,0xf0,0x9e,0xa4,0xab,0x00,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xac,0x00,
+	0x12,0xff,0xf0,0x9e,0xa4,0xad,0x00,0xd1,0x12,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,
+	0xae,0x00,0x12,0xff,0xf0,0x9e,0xa4,0xaf,0x00,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,
+	0xb0,0x00,0x12,0xff,0xf0,0x9e,0xa4,0xb1,0x00,0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,
+	0x09,0x12,0xff,0xf0,0x9e,0xa4,0xb2,0x00,0x12,0xff,0xf0,0x9e,0xa4,0xb3,0x00,0x10,
+	0x09,0x12,0xff,0xf0,0x9e,0xa4,0xb4,0x00,0x12,0xff,0xf0,0x9e,0xa4,0xb5,0x00,0xd1,
+	0x12,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xb6,0x00,0x12,0xff,0xf0,0x9e,0xa4,0xb7,
+	0x00,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xb8,0x00,0x12,0xff,0xf0,0x9e,0xa4,0xb9,
+	0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xba,0x00,0x12,0xff,
+	0xf0,0x9e,0xa4,0xbb,0x00,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xbc,0x00,0x12,0xff,
+	0xf0,0x9e,0xa4,0xbd,0x00,0xd1,0x12,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa4,0xbe,0x00,
+	0x12,0xff,0xf0,0x9e,0xa4,0xbf,0x00,0x10,0x09,0x12,0xff,0xf0,0x9e,0xa5,0x80,0x00,
+	0x12,0xff,0xf0,0x9e,0xa5,0x81,0x00,0x94,0x1e,0x93,0x1a,0x92,0x16,0x91,0x12,0x10,
+	0x09,0x12,0xff,0xf0,0x9e,0xa5,0x82,0x00,0x12,0xff,0xf0,0x9e,0xa5,0x83,0x00,0x12,
+	0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	/* nfdi_c0100 */
+	0x57,0x04,0x01,0x00,0xc6,0xe5,0xac,0x13,0xe4,0x41,0x0c,0xe3,0x7a,0x07,0xe2,0xf3,
+	0x01,0xc1,0xd0,0x1f,0xcf,0x86,0x55,0x04,0x01,0x00,0x94,0x15,0x53,0x04,0x01,0x00,
+	0x52,0x04,0x01,0x00,0x91,0x09,0x10,0x04,0x01,0x00,0x01,0xff,0x00,0x01,0x00,0x01,
+	0x00,0xcf,0x86,0xd5,0xe4,0xd4,0x7c,0xd3,0x3c,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x41,0xcc,0x80,0x00,0x01,0xff,0x41,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x41,
+	0xcc,0x82,0x00,0x01,0xff,0x41,0xcc,0x83,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x41,
+	0xcc,0x88,0x00,0x01,0xff,0x41,0xcc,0x8a,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0x43,
+	0xcc,0xa7,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x45,0xcc,0x80,0x00,0x01,
+	0xff,0x45,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x45,0xcc,0x82,0x00,0x01,0xff,0x45,
+	0xcc,0x88,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x49,0xcc,0x80,0x00,0x01,0xff,0x49,
+	0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x49,0xcc,0x82,0x00,0x01,0xff,0x49,0xcc,0x88,
+	0x00,0xd3,0x38,0xd2,0x1c,0xd1,0x0c,0x10,0x04,0x01,0x00,0x01,0xff,0x4e,0xcc,0x83,
+	0x00,0x10,0x08,0x01,0xff,0x4f,0xcc,0x80,0x00,0x01,0xff,0x4f,0xcc,0x81,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x4f,0xcc,0x82,0x00,0x01,0xff,0x4f,0xcc,0x83,0x00,0x10,
+	0x08,0x01,0xff,0x4f,0xcc,0x88,0x00,0x01,0x00,0xd2,0x1c,0xd1,0x0c,0x10,0x04,0x01,
+	0x00,0x01,0xff,0x55,0xcc,0x80,0x00,0x10,0x08,0x01,0xff,0x55,0xcc,0x81,0x00,0x01,
+	0xff,0x55,0xcc,0x82,0x00,0x91,0x10,0x10,0x08,0x01,0xff,0x55,0xcc,0x88,0x00,0x01,
+	0xff,0x59,0xcc,0x81,0x00,0x01,0x00,0xd4,0x7c,0xd3,0x3c,0xd2,0x20,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x61,0xcc,0x80,0x00,0x01,0xff,0x61,0xcc,0x81,0x00,0x10,0x08,0x01,
+	0xff,0x61,0xcc,0x82,0x00,0x01,0xff,0x61,0xcc,0x83,0x00,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x61,0xcc,0x88,0x00,0x01,0xff,0x61,0xcc,0x8a,0x00,0x10,0x04,0x01,0x00,0x01,
+	0xff,0x63,0xcc,0xa7,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x65,0xcc,0x80,
+	0x00,0x01,0xff,0x65,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x65,0xcc,0x82,0x00,0x01,
+	0xff,0x65,0xcc,0x88,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x69,0xcc,0x80,0x00,0x01,
+	0xff,0x69,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x69,0xcc,0x82,0x00,0x01,0xff,0x69,
+	0xcc,0x88,0x00,0xd3,0x38,0xd2,0x1c,0xd1,0x0c,0x10,0x04,0x01,0x00,0x01,0xff,0x6e,
+	0xcc,0x83,0x00,0x10,0x08,0x01,0xff,0x6f,0xcc,0x80,0x00,0x01,0xff,0x6f,0xcc,0x81,
+	0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x6f,0xcc,0x82,0x00,0x01,0xff,0x6f,0xcc,0x83,
+	0x00,0x10,0x08,0x01,0xff,0x6f,0xcc,0x88,0x00,0x01,0x00,0xd2,0x1c,0xd1,0x0c,0x10,
+	0x04,0x01,0x00,0x01,0xff,0x75,0xcc,0x80,0x00,0x10,0x08,0x01,0xff,0x75,0xcc,0x81,
+	0x00,0x01,0xff,0x75,0xcc,0x82,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x75,0xcc,0x88,
+	0x00,0x01,0xff,0x79,0xcc,0x81,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0x79,0xcc,0x88,
+	0x00,0xe1,0x9a,0x03,0xe0,0xd3,0x01,0xcf,0x86,0xd5,0xf4,0xd4,0x80,0xd3,0x40,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x41,0xcc,0x84,0x00,0x01,0xff,0x61,0xcc,0x84,
+	0x00,0x10,0x08,0x01,0xff,0x41,0xcc,0x86,0x00,0x01,0xff,0x61,0xcc,0x86,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x41,0xcc,0xa8,0x00,0x01,0xff,0x61,0xcc,0xa8,0x00,0x10,
+	0x08,0x01,0xff,0x43,0xcc,0x81,0x00,0x01,0xff,0x63,0xcc,0x81,0x00,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x43,0xcc,0x82,0x00,0x01,0xff,0x63,0xcc,0x82,0x00,0x10,
+	0x08,0x01,0xff,0x43,0xcc,0x87,0x00,0x01,0xff,0x63,0xcc,0x87,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x43,0xcc,0x8c,0x00,0x01,0xff,0x63,0xcc,0x8c,0x00,0x10,0x08,0x01,
+	0xff,0x44,0xcc,0x8c,0x00,0x01,0xff,0x64,0xcc,0x8c,0x00,0xd3,0x34,0xd2,0x14,0x51,
+	0x04,0x01,0x00,0x10,0x08,0x01,0xff,0x45,0xcc,0x84,0x00,0x01,0xff,0x65,0xcc,0x84,
+	0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x45,0xcc,0x86,0x00,0x01,0xff,0x65,0xcc,0x86,
+	0x00,0x10,0x08,0x01,0xff,0x45,0xcc,0x87,0x00,0x01,0xff,0x65,0xcc,0x87,0x00,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x45,0xcc,0xa8,0x00,0x01,0xff,0x65,0xcc,0xa8,
+	0x00,0x10,0x08,0x01,0xff,0x45,0xcc,0x8c,0x00,0x01,0xff,0x65,0xcc,0x8c,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x47,0xcc,0x82,0x00,0x01,0xff,0x67,0xcc,0x82,0x00,0x10,
+	0x08,0x01,0xff,0x47,0xcc,0x86,0x00,0x01,0xff,0x67,0xcc,0x86,0x00,0xd4,0x74,0xd3,
+	0x34,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x47,0xcc,0x87,0x00,0x01,0xff,0x67,
+	0xcc,0x87,0x00,0x10,0x08,0x01,0xff,0x47,0xcc,0xa7,0x00,0x01,0xff,0x67,0xcc,0xa7,
+	0x00,0x91,0x10,0x10,0x08,0x01,0xff,0x48,0xcc,0x82,0x00,0x01,0xff,0x68,0xcc,0x82,
+	0x00,0x01,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x49,0xcc,0x83,0x00,0x01,
+	0xff,0x69,0xcc,0x83,0x00,0x10,0x08,0x01,0xff,0x49,0xcc,0x84,0x00,0x01,0xff,0x69,
+	0xcc,0x84,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x49,0xcc,0x86,0x00,0x01,0xff,0x69,
+	0xcc,0x86,0x00,0x10,0x08,0x01,0xff,0x49,0xcc,0xa8,0x00,0x01,0xff,0x69,0xcc,0xa8,
+	0x00,0xd3,0x30,0xd2,0x10,0x91,0x0c,0x10,0x08,0x01,0xff,0x49,0xcc,0x87,0x00,0x01,
+	0x00,0x01,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x4a,0xcc,0x82,0x00,0x01,0xff,0x6a,
+	0xcc,0x82,0x00,0x10,0x08,0x01,0xff,0x4b,0xcc,0xa7,0x00,0x01,0xff,0x6b,0xcc,0xa7,
+	0x00,0xd2,0x1c,0xd1,0x0c,0x10,0x04,0x01,0x00,0x01,0xff,0x4c,0xcc,0x81,0x00,0x10,
+	0x08,0x01,0xff,0x6c,0xcc,0x81,0x00,0x01,0xff,0x4c,0xcc,0xa7,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x6c,0xcc,0xa7,0x00,0x01,0xff,0x4c,0xcc,0x8c,0x00,0x10,0x08,0x01,
+	0xff,0x6c,0xcc,0x8c,0x00,0x01,0x00,0xcf,0x86,0xd5,0xd4,0xd4,0x60,0xd3,0x30,0xd2,
+	0x10,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0x4e,0xcc,0x81,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x6e,0xcc,0x81,0x00,0x01,0xff,0x4e,0xcc,0xa7,0x00,0x10,
+	0x08,0x01,0xff,0x6e,0xcc,0xa7,0x00,0x01,0xff,0x4e,0xcc,0x8c,0x00,0xd2,0x10,0x91,
+	0x0c,0x10,0x08,0x01,0xff,0x6e,0xcc,0x8c,0x00,0x01,0x00,0x01,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x4f,0xcc,0x84,0x00,0x01,0xff,0x6f,0xcc,0x84,0x00,0x10,0x08,0x01,
+	0xff,0x4f,0xcc,0x86,0x00,0x01,0xff,0x6f,0xcc,0x86,0x00,0xd3,0x34,0xd2,0x14,0x91,
+	0x10,0x10,0x08,0x01,0xff,0x4f,0xcc,0x8b,0x00,0x01,0xff,0x6f,0xcc,0x8b,0x00,0x01,
+	0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x52,0xcc,0x81,0x00,0x01,0xff,0x72,0xcc,0x81,
+	0x00,0x10,0x08,0x01,0xff,0x52,0xcc,0xa7,0x00,0x01,0xff,0x72,0xcc,0xa7,0x00,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x52,0xcc,0x8c,0x00,0x01,0xff,0x72,0xcc,0x8c,
+	0x00,0x10,0x08,0x01,0xff,0x53,0xcc,0x81,0x00,0x01,0xff,0x73,0xcc,0x81,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x53,0xcc,0x82,0x00,0x01,0xff,0x73,0xcc,0x82,0x00,0x10,
+	0x08,0x01,0xff,0x53,0xcc,0xa7,0x00,0x01,0xff,0x73,0xcc,0xa7,0x00,0xd4,0x74,0xd3,
+	0x34,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x53,0xcc,0x8c,0x00,0x01,0xff,0x73,
+	0xcc,0x8c,0x00,0x10,0x08,0x01,0xff,0x54,0xcc,0xa7,0x00,0x01,0xff,0x74,0xcc,0xa7,
+	0x00,0x91,0x10,0x10,0x08,0x01,0xff,0x54,0xcc,0x8c,0x00,0x01,0xff,0x74,0xcc,0x8c,
+	0x00,0x01,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x55,0xcc,0x83,0x00,0x01,
+	0xff,0x75,0xcc,0x83,0x00,0x10,0x08,0x01,0xff,0x55,0xcc,0x84,0x00,0x01,0xff,0x75,
+	0xcc,0x84,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x55,0xcc,0x86,0x00,0x01,0xff,0x75,
+	0xcc,0x86,0x00,0x10,0x08,0x01,0xff,0x55,0xcc,0x8a,0x00,0x01,0xff,0x75,0xcc,0x8a,
+	0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x55,0xcc,0x8b,0x00,0x01,
+	0xff,0x75,0xcc,0x8b,0x00,0x10,0x08,0x01,0xff,0x55,0xcc,0xa8,0x00,0x01,0xff,0x75,
+	0xcc,0xa8,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x57,0xcc,0x82,0x00,0x01,0xff,0x77,
+	0xcc,0x82,0x00,0x10,0x08,0x01,0xff,0x59,0xcc,0x82,0x00,0x01,0xff,0x79,0xcc,0x82,
+	0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x59,0xcc,0x88,0x00,0x01,0xff,0x5a,
+	0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x7a,0xcc,0x81,0x00,0x01,0xff,0x5a,0xcc,0x87,
+	0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x7a,0xcc,0x87,0x00,0x01,0xff,0x5a,0xcc,0x8c,
+	0x00,0x10,0x08,0x01,0xff,0x7a,0xcc,0x8c,0x00,0x01,0x00,0xd0,0x4a,0xcf,0x86,0x55,
+	0x04,0x01,0x00,0xd4,0x2c,0xd3,0x18,0x92,0x14,0x91,0x10,0x10,0x08,0x01,0xff,0x4f,
+	0xcc,0x9b,0x00,0x01,0xff,0x6f,0xcc,0x9b,0x00,0x01,0x00,0x01,0x00,0x52,0x04,0x01,
+	0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0x55,0xcc,0x9b,0x00,0x93,
+	0x14,0x92,0x10,0x91,0x0c,0x10,0x08,0x01,0xff,0x75,0xcc,0x9b,0x00,0x01,0x00,0x01,
+	0x00,0x01,0x00,0x01,0x00,0xcf,0x86,0xd5,0xb4,0xd4,0x24,0x53,0x04,0x01,0x00,0x52,
+	0x04,0x01,0x00,0xd1,0x0c,0x10,0x04,0x01,0x00,0x01,0xff,0x41,0xcc,0x8c,0x00,0x10,
+	0x08,0x01,0xff,0x61,0xcc,0x8c,0x00,0x01,0xff,0x49,0xcc,0x8c,0x00,0xd3,0x46,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x69,0xcc,0x8c,0x00,0x01,0xff,0x4f,0xcc,0x8c,
+	0x00,0x10,0x08,0x01,0xff,0x6f,0xcc,0x8c,0x00,0x01,0xff,0x55,0xcc,0x8c,0x00,0xd1,
+	0x12,0x10,0x08,0x01,0xff,0x75,0xcc,0x8c,0x00,0x01,0xff,0x55,0xcc,0x88,0xcc,0x84,
+	0x00,0x10,0x0a,0x01,0xff,0x75,0xcc,0x88,0xcc,0x84,0x00,0x01,0xff,0x55,0xcc,0x88,
+	0xcc,0x81,0x00,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x75,0xcc,0x88,0xcc,0x81,
+	0x00,0x01,0xff,0x55,0xcc,0x88,0xcc,0x8c,0x00,0x10,0x0a,0x01,0xff,0x75,0xcc,0x88,
+	0xcc,0x8c,0x00,0x01,0xff,0x55,0xcc,0x88,0xcc,0x80,0x00,0xd1,0x0e,0x10,0x0a,0x01,
+	0xff,0x75,0xcc,0x88,0xcc,0x80,0x00,0x01,0x00,0x10,0x0a,0x01,0xff,0x41,0xcc,0x88,
+	0xcc,0x84,0x00,0x01,0xff,0x61,0xcc,0x88,0xcc,0x84,0x00,0xd4,0x80,0xd3,0x3a,0xd2,
+	0x26,0xd1,0x14,0x10,0x0a,0x01,0xff,0x41,0xcc,0x87,0xcc,0x84,0x00,0x01,0xff,0x61,
+	0xcc,0x87,0xcc,0x84,0x00,0x10,0x09,0x01,0xff,0xc3,0x86,0xcc,0x84,0x00,0x01,0xff,
+	0xc3,0xa6,0xcc,0x84,0x00,0x51,0x04,0x01,0x00,0x10,0x08,0x01,0xff,0x47,0xcc,0x8c,
+	0x00,0x01,0xff,0x67,0xcc,0x8c,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x4b,
+	0xcc,0x8c,0x00,0x01,0xff,0x6b,0xcc,0x8c,0x00,0x10,0x08,0x01,0xff,0x4f,0xcc,0xa8,
+	0x00,0x01,0xff,0x6f,0xcc,0xa8,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x4f,0xcc,0xa8,
+	0xcc,0x84,0x00,0x01,0xff,0x6f,0xcc,0xa8,0xcc,0x84,0x00,0x10,0x09,0x01,0xff,0xc6,
+	0xb7,0xcc,0x8c,0x00,0x01,0xff,0xca,0x92,0xcc,0x8c,0x00,0xd3,0x24,0xd2,0x10,0x91,
+	0x0c,0x10,0x08,0x01,0xff,0x6a,0xcc,0x8c,0x00,0x01,0x00,0x01,0x00,0x91,0x10,0x10,
+	0x08,0x01,0xff,0x47,0xcc,0x81,0x00,0x01,0xff,0x67,0xcc,0x81,0x00,0x04,0x00,0xd2,
+	0x24,0xd1,0x10,0x10,0x08,0x04,0xff,0x4e,0xcc,0x80,0x00,0x04,0xff,0x6e,0xcc,0x80,
+	0x00,0x10,0x0a,0x01,0xff,0x41,0xcc,0x8a,0xcc,0x81,0x00,0x01,0xff,0x61,0xcc,0x8a,
+	0xcc,0x81,0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xc3,0x86,0xcc,0x81,0x00,0x01,0xff,
+	0xc3,0xa6,0xcc,0x81,0x00,0x10,0x09,0x01,0xff,0xc3,0x98,0xcc,0x81,0x00,0x01,0xff,
+	0xc3,0xb8,0xcc,0x81,0x00,0xe2,0x07,0x02,0xe1,0xae,0x01,0xe0,0x93,0x01,0xcf,0x86,
+	0xd5,0xf4,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x41,0xcc,
+	0x8f,0x00,0x01,0xff,0x61,0xcc,0x8f,0x00,0x10,0x08,0x01,0xff,0x41,0xcc,0x91,0x00,
+	0x01,0xff,0x61,0xcc,0x91,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x45,0xcc,0x8f,0x00,
+	0x01,0xff,0x65,0xcc,0x8f,0x00,0x10,0x08,0x01,0xff,0x45,0xcc,0x91,0x00,0x01,0xff,
+	0x65,0xcc,0x91,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x49,0xcc,0x8f,0x00,
+	0x01,0xff,0x69,0xcc,0x8f,0x00,0x10,0x08,0x01,0xff,0x49,0xcc,0x91,0x00,0x01,0xff,
+	0x69,0xcc,0x91,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x4f,0xcc,0x8f,0x00,0x01,0xff,
+	0x6f,0xcc,0x8f,0x00,0x10,0x08,0x01,0xff,0x4f,0xcc,0x91,0x00,0x01,0xff,0x6f,0xcc,
+	0x91,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x52,0xcc,0x8f,0x00,
+	0x01,0xff,0x72,0xcc,0x8f,0x00,0x10,0x08,0x01,0xff,0x52,0xcc,0x91,0x00,0x01,0xff,
+	0x72,0xcc,0x91,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x55,0xcc,0x8f,0x00,0x01,0xff,
+	0x75,0xcc,0x8f,0x00,0x10,0x08,0x01,0xff,0x55,0xcc,0x91,0x00,0x01,0xff,0x75,0xcc,
+	0x91,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x04,0xff,0x53,0xcc,0xa6,0x00,0x04,0xff,
+	0x73,0xcc,0xa6,0x00,0x10,0x08,0x04,0xff,0x54,0xcc,0xa6,0x00,0x04,0xff,0x74,0xcc,
+	0xa6,0x00,0x51,0x04,0x04,0x00,0x10,0x08,0x04,0xff,0x48,0xcc,0x8c,0x00,0x04,0xff,
+	0x68,0xcc,0x8c,0x00,0xd4,0x68,0xd3,0x20,0xd2,0x0c,0x91,0x08,0x10,0x04,0x06,0x00,
+	0x07,0x00,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x08,0x04,0xff,0x41,0xcc,0x87,0x00,
+	0x04,0xff,0x61,0xcc,0x87,0x00,0xd2,0x24,0xd1,0x10,0x10,0x08,0x04,0xff,0x45,0xcc,
+	0xa7,0x00,0x04,0xff,0x65,0xcc,0xa7,0x00,0x10,0x0a,0x04,0xff,0x4f,0xcc,0x88,0xcc,
+	0x84,0x00,0x04,0xff,0x6f,0xcc,0x88,0xcc,0x84,0x00,0xd1,0x14,0x10,0x0a,0x04,0xff,
+	0x4f,0xcc,0x83,0xcc,0x84,0x00,0x04,0xff,0x6f,0xcc,0x83,0xcc,0x84,0x00,0x10,0x08,
+	0x04,0xff,0x4f,0xcc,0x87,0x00,0x04,0xff,0x6f,0xcc,0x87,0x00,0x93,0x30,0xd2,0x24,
+	0xd1,0x14,0x10,0x0a,0x04,0xff,0x4f,0xcc,0x87,0xcc,0x84,0x00,0x04,0xff,0x6f,0xcc,
+	0x87,0xcc,0x84,0x00,0x10,0x08,0x04,0xff,0x59,0xcc,0x84,0x00,0x04,0xff,0x79,0xcc,
+	0x84,0x00,0x51,0x04,0x07,0x00,0x10,0x04,0x07,0x00,0x08,0x00,0x08,0x00,0xcf,0x86,
+	0x95,0x14,0x94,0x10,0x93,0x0c,0x92,0x08,0x11,0x04,0x08,0x00,0x09,0x00,0x09,0x00,
+	0x09,0x00,0x01,0x00,0x01,0x00,0xd0,0x22,0xcf,0x86,0x55,0x04,0x01,0x00,0x94,0x18,
+	0x53,0x04,0x01,0x00,0xd2,0x0c,0x91,0x08,0x10,0x04,0x01,0x00,0x04,0x00,0x04,0x00,
+	0x11,0x04,0x04,0x00,0x07,0x00,0x01,0x00,0xcf,0x86,0xd5,0x18,0x54,0x04,0x01,0x00,
+	0x53,0x04,0x01,0x00,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,
+	0x04,0x00,0x94,0x18,0x53,0x04,0x01,0x00,0xd2,0x08,0x11,0x04,0x01,0x00,0x04,0x00,
+	0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x07,0x00,0x07,0x00,0xe1,0x35,0x01,0xd0,
+	0x72,0xcf,0x86,0xd5,0x24,0x54,0x04,0x01,0xe6,0xd3,0x10,0x52,0x04,0x01,0xe6,0x91,
+	0x08,0x10,0x04,0x01,0xe6,0x01,0xe8,0x01,0xdc,0x92,0x0c,0x51,0x04,0x01,0xdc,0x10,
+	0x04,0x01,0xe8,0x01,0xd8,0x01,0xdc,0xd4,0x2c,0xd3,0x1c,0xd2,0x10,0xd1,0x08,0x10,
+	0x04,0x01,0xdc,0x01,0xca,0x10,0x04,0x01,0xca,0x01,0xdc,0x51,0x04,0x01,0xdc,0x10,
+	0x04,0x01,0xdc,0x01,0xca,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,0xca,0x01,0xdc,0x01,
+	0xdc,0x01,0xdc,0xd3,0x08,0x12,0x04,0x01,0xdc,0x01,0x01,0xd2,0x0c,0x91,0x08,0x10,
+	0x04,0x01,0x01,0x01,0xdc,0x01,0xdc,0x91,0x08,0x10,0x04,0x01,0xdc,0x01,0xe6,0x01,
+	0xe6,0xcf,0x86,0xd5,0x7f,0xd4,0x47,0xd3,0x2e,0xd2,0x19,0xd1,0x0e,0x10,0x07,0x01,
+	0xff,0xcc,0x80,0x00,0x01,0xff,0xcc,0x81,0x00,0x10,0x04,0x01,0xe6,0x01,0xff,0xcc,
+	0x93,0x00,0xd1,0x0d,0x10,0x09,0x01,0xff,0xcc,0x88,0xcc,0x81,0x00,0x01,0xf0,0x10,
+	0x04,0x04,0xe6,0x04,0xdc,0xd2,0x08,0x11,0x04,0x04,0xdc,0x04,0xe6,0xd1,0x08,0x10,
+	0x04,0x04,0xe6,0x04,0xdc,0x10,0x04,0x04,0xdc,0x06,0xff,0x00,0xd3,0x18,0xd2,0x0c,
+	0x51,0x04,0x07,0xe6,0x10,0x04,0x07,0xe6,0x07,0xdc,0x51,0x04,0x07,0xdc,0x10,0x04,
+	0x07,0xdc,0x07,0xe6,0xd2,0x10,0xd1,0x08,0x10,0x04,0x08,0xe8,0x08,0xdc,0x10,0x04,
+	0x08,0xdc,0x08,0xe6,0xd1,0x08,0x10,0x04,0x08,0xe9,0x07,0xea,0x10,0x04,0x07,0xea,
+	0x07,0xe9,0xd4,0x14,0x93,0x10,0x92,0x0c,0x51,0x04,0x01,0xea,0x10,0x04,0x04,0xe9,
+	0x06,0xe6,0x06,0xe6,0x06,0xe6,0xd3,0x13,0x52,0x04,0x0a,0x00,0x91,0x0b,0x10,0x07,
+	0x01,0xff,0xca,0xb9,0x00,0x01,0x00,0x0a,0x00,0xd2,0x0c,0x51,0x04,0x00,0x00,0x10,
+	0x04,0x01,0x00,0x09,0x00,0x51,0x04,0x09,0x00,0x10,0x06,0x01,0xff,0x3b,0x00,0x10,
+	0x00,0xd0,0xe1,0xcf,0x86,0xd5,0x7a,0xd4,0x5f,0xd3,0x21,0x52,0x04,0x00,0x00,0xd1,
+	0x0d,0x10,0x04,0x01,0x00,0x01,0xff,0xc2,0xa8,0xcc,0x81,0x00,0x10,0x09,0x01,0xff,
+	0xce,0x91,0xcc,0x81,0x00,0x01,0xff,0xc2,0xb7,0x00,0xd2,0x1f,0xd1,0x12,0x10,0x09,
+	0x01,0xff,0xce,0x95,0xcc,0x81,0x00,0x01,0xff,0xce,0x97,0xcc,0x81,0x00,0x10,0x09,
+	0x01,0xff,0xce,0x99,0xcc,0x81,0x00,0x00,0x00,0xd1,0x0d,0x10,0x09,0x01,0xff,0xce,
+	0x9f,0xcc,0x81,0x00,0x00,0x00,0x10,0x09,0x01,0xff,0xce,0xa5,0xcc,0x81,0x00,0x01,
+	0xff,0xce,0xa9,0xcc,0x81,0x00,0x93,0x17,0x92,0x13,0x91,0x0f,0x10,0x0b,0x01,0xff,
+	0xce,0xb9,0xcc,0x88,0xcc,0x81,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd4,
+	0x4a,0xd3,0x10,0x92,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x00,0x00,0x01,0x00,0x01,
+	0x00,0xd2,0x16,0x51,0x04,0x01,0x00,0x10,0x09,0x01,0xff,0xce,0x99,0xcc,0x88,0x00,
+	0x01,0xff,0xce,0xa5,0xcc,0x88,0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb1,0xcc,
+	0x81,0x00,0x01,0xff,0xce,0xb5,0xcc,0x81,0x00,0x10,0x09,0x01,0xff,0xce,0xb7,0xcc,
+	0x81,0x00,0x01,0xff,0xce,0xb9,0xcc,0x81,0x00,0x93,0x17,0x92,0x13,0x91,0x0f,0x10,
+	0x0b,0x01,0xff,0xcf,0x85,0xcc,0x88,0xcc,0x81,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+	0x01,0x00,0xcf,0x86,0xd5,0x7b,0xd4,0x39,0x53,0x04,0x01,0x00,0xd2,0x16,0x51,0x04,
+	0x01,0x00,0x10,0x09,0x01,0xff,0xce,0xb9,0xcc,0x88,0x00,0x01,0xff,0xcf,0x85,0xcc,
+	0x88,0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xbf,0xcc,0x81,0x00,0x01,0xff,0xcf,
+	0x85,0xcc,0x81,0x00,0x10,0x09,0x01,0xff,0xcf,0x89,0xcc,0x81,0x00,0x0a,0x00,0xd3,
+	0x26,0xd2,0x11,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0xcf,0x92,0xcc,
+	0x81,0x00,0xd1,0x0d,0x10,0x09,0x01,0xff,0xcf,0x92,0xcc,0x88,0x00,0x01,0x00,0x10,
+	0x04,0x01,0x00,0x04,0x00,0xd2,0x0c,0x51,0x04,0x06,0x00,0x10,0x04,0x01,0x00,0x04,
+	0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x04,0x00,0x10,0x04,0x01,0x00,0x04,0x00,0xd4,
+	0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,0x00,0x04,0x00,0x01,0x00,0x01,
+	0x00,0x01,0x00,0xd3,0x10,0x52,0x04,0x01,0x00,0x51,0x04,0x05,0x00,0x10,0x04,0x06,
+	0x00,0x07,0x00,0x12,0x04,0x07,0x00,0x08,0x00,0xe3,0x47,0x04,0xe2,0xbe,0x02,0xe1,
+	0x07,0x01,0xd0,0x8b,0xcf,0x86,0xd5,0x6c,0xd4,0x53,0xd3,0x30,0xd2,0x1f,0xd1,0x12,
+	0x10,0x09,0x04,0xff,0xd0,0x95,0xcc,0x80,0x00,0x01,0xff,0xd0,0x95,0xcc,0x88,0x00,
+	0x10,0x04,0x01,0x00,0x01,0xff,0xd0,0x93,0xcc,0x81,0x00,0x51,0x04,0x01,0x00,0x10,
+	0x04,0x01,0x00,0x01,0xff,0xd0,0x86,0xcc,0x88,0x00,0x52,0x04,0x01,0x00,0xd1,0x12,
+	0x10,0x09,0x01,0xff,0xd0,0x9a,0xcc,0x81,0x00,0x04,0xff,0xd0,0x98,0xcc,0x80,0x00,
+	0x10,0x09,0x01,0xff,0xd0,0xa3,0xcc,0x86,0x00,0x01,0x00,0x53,0x04,0x01,0x00,0x92,
+	0x11,0x91,0x0d,0x10,0x04,0x01,0x00,0x01,0xff,0xd0,0x98,0xcc,0x86,0x00,0x01,0x00,
+	0x01,0x00,0x54,0x04,0x01,0x00,0x53,0x04,0x01,0x00,0x92,0x11,0x91,0x0d,0x10,0x04,
+	0x01,0x00,0x01,0xff,0xd0,0xb8,0xcc,0x86,0x00,0x01,0x00,0x01,0x00,0xcf,0x86,0xd5,
+	0x57,0x54,0x04,0x01,0x00,0xd3,0x30,0xd2,0x1f,0xd1,0x12,0x10,0x09,0x04,0xff,0xd0,
+	0xb5,0xcc,0x80,0x00,0x01,0xff,0xd0,0xb5,0xcc,0x88,0x00,0x10,0x04,0x01,0x00,0x01,
+	0xff,0xd0,0xb3,0xcc,0x81,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x01,0xff,
+	0xd1,0x96,0xcc,0x88,0x00,0x52,0x04,0x01,0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xd0,
+	0xba,0xcc,0x81,0x00,0x04,0xff,0xd0,0xb8,0xcc,0x80,0x00,0x10,0x09,0x01,0xff,0xd1,
+	0x83,0xcc,0x86,0x00,0x01,0x00,0x54,0x04,0x01,0x00,0x93,0x1a,0x52,0x04,0x01,0x00,
+	0x51,0x04,0x01,0x00,0x10,0x09,0x01,0xff,0xd1,0xb4,0xcc,0x8f,0x00,0x01,0xff,0xd1,
+	0xb5,0xcc,0x8f,0x00,0x01,0x00,0xd0,0x2e,0xcf,0x86,0x95,0x28,0x94,0x24,0xd3,0x18,
+	0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x01,0xe6,0x51,0x04,0x01,0xe6,
+	0x10,0x04,0x01,0xe6,0x0a,0xe6,0x92,0x08,0x11,0x04,0x04,0x00,0x06,0x00,0x04,0x00,
+	0x01,0x00,0x01,0x00,0xcf,0x86,0xd5,0xbe,0xd4,0x4a,0xd3,0x2a,0xd2,0x1a,0xd1,0x0d,
+	0x10,0x04,0x01,0x00,0x01,0xff,0xd0,0x96,0xcc,0x86,0x00,0x10,0x09,0x01,0xff,0xd0,
+	0xb6,0xcc,0x86,0x00,0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x06,0x00,0x10,0x04,
+	0x06,0x00,0x01,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x01,0x00,0x06,0x00,0x10,0x04,
+	0x06,0x00,0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x06,0x00,0x10,0x04,0x06,0x00,
+	0x09,0x00,0xd3,0x3a,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xd0,0x90,0xcc,0x86,
+	0x00,0x01,0xff,0xd0,0xb0,0xcc,0x86,0x00,0x10,0x09,0x01,0xff,0xd0,0x90,0xcc,0x88,
+	0x00,0x01,0xff,0xd0,0xb0,0xcc,0x88,0x00,0x51,0x04,0x01,0x00,0x10,0x09,0x01,0xff,
+	0xd0,0x95,0xcc,0x86,0x00,0x01,0xff,0xd0,0xb5,0xcc,0x86,0x00,0xd2,0x16,0x51,0x04,
+	0x01,0x00,0x10,0x09,0x01,0xff,0xd3,0x98,0xcc,0x88,0x00,0x01,0xff,0xd3,0x99,0xcc,
+	0x88,0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xd0,0x96,0xcc,0x88,0x00,0x01,0xff,0xd0,
+	0xb6,0xcc,0x88,0x00,0x10,0x09,0x01,0xff,0xd0,0x97,0xcc,0x88,0x00,0x01,0xff,0xd0,
+	0xb7,0xcc,0x88,0x00,0xd4,0x74,0xd3,0x3a,0xd2,0x16,0x51,0x04,0x01,0x00,0x10,0x09,
+	0x01,0xff,0xd0,0x98,0xcc,0x84,0x00,0x01,0xff,0xd0,0xb8,0xcc,0x84,0x00,0xd1,0x12,
+	0x10,0x09,0x01,0xff,0xd0,0x98,0xcc,0x88,0x00,0x01,0xff,0xd0,0xb8,0xcc,0x88,0x00,
+	0x10,0x09,0x01,0xff,0xd0,0x9e,0xcc,0x88,0x00,0x01,0xff,0xd0,0xbe,0xcc,0x88,0x00,
+	0xd2,0x16,0x51,0x04,0x01,0x00,0x10,0x09,0x01,0xff,0xd3,0xa8,0xcc,0x88,0x00,0x01,
+	0xff,0xd3,0xa9,0xcc,0x88,0x00,0xd1,0x12,0x10,0x09,0x04,0xff,0xd0,0xad,0xcc,0x88,
+	0x00,0x04,0xff,0xd1,0x8d,0xcc,0x88,0x00,0x10,0x09,0x01,0xff,0xd0,0xa3,0xcc,0x84,
+	0x00,0x01,0xff,0xd1,0x83,0xcc,0x84,0x00,0xd3,0x3a,0xd2,0x24,0xd1,0x12,0x10,0x09,
+	0x01,0xff,0xd0,0xa3,0xcc,0x88,0x00,0x01,0xff,0xd1,0x83,0xcc,0x88,0x00,0x10,0x09,
+	0x01,0xff,0xd0,0xa3,0xcc,0x8b,0x00,0x01,0xff,0xd1,0x83,0xcc,0x8b,0x00,0x91,0x12,
+	0x10,0x09,0x01,0xff,0xd0,0xa7,0xcc,0x88,0x00,0x01,0xff,0xd1,0x87,0xcc,0x88,0x00,
+	0x08,0x00,0x92,0x16,0x91,0x12,0x10,0x09,0x01,0xff,0xd0,0xab,0xcc,0x88,0x00,0x01,
+	0xff,0xd1,0x8b,0xcc,0x88,0x00,0x09,0x00,0x09,0x00,0xd1,0x74,0xd0,0x36,0xcf,0x86,
+	0xd5,0x10,0x54,0x04,0x06,0x00,0x93,0x08,0x12,0x04,0x09,0x00,0x0a,0x00,0x0a,0x00,
+	0xd4,0x10,0x93,0x0c,0x52,0x04,0x0a,0x00,0x11,0x04,0x0b,0x00,0x0c,0x00,0x10,0x00,
+	0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+	0x01,0x00,0xcf,0x86,0xd5,0x24,0x54,0x04,0x01,0x00,0xd3,0x10,0x52,0x04,0x01,0x00,
+	0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,
+	0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x14,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd0,0xba,
+	0xcf,0x86,0xd5,0x4c,0xd4,0x24,0x53,0x04,0x01,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,
+	0x14,0x00,0x01,0x00,0x10,0x04,0x04,0x00,0x00,0x00,0xd1,0x08,0x10,0x04,0x00,0x00,
+	0x10,0x00,0x10,0x04,0x10,0x00,0x0d,0x00,0xd3,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,
+	0x00,0x00,0x02,0xdc,0x02,0xe6,0x51,0x04,0x02,0xe6,0x10,0x04,0x02,0xdc,0x02,0xe6,
+	0x92,0x0c,0x51,0x04,0x02,0xe6,0x10,0x04,0x02,0xde,0x02,0xdc,0x02,0xe6,0xd4,0x2c,
+	0xd3,0x10,0x92,0x0c,0x51,0x04,0x02,0xe6,0x10,0x04,0x08,0xdc,0x02,0xdc,0x02,0xdc,
+	0xd2,0x0c,0x51,0x04,0x02,0xe6,0x10,0x04,0x02,0xdc,0x02,0xe6,0xd1,0x08,0x10,0x04,
+	0x02,0xe6,0x02,0xde,0x10,0x04,0x02,0xe4,0x02,0xe6,0xd3,0x20,0xd2,0x10,0xd1,0x08,
+	0x10,0x04,0x01,0x0a,0x01,0x0b,0x10,0x04,0x01,0x0c,0x01,0x0d,0xd1,0x08,0x10,0x04,
+	0x01,0x0e,0x01,0x0f,0x10,0x04,0x01,0x10,0x01,0x11,0xd2,0x10,0xd1,0x08,0x10,0x04,
+	0x01,0x12,0x01,0x13,0x10,0x04,0x09,0x13,0x01,0x14,0xd1,0x08,0x10,0x04,0x01,0x15,
+	0x01,0x16,0x10,0x04,0x01,0x00,0x01,0x17,0xcf,0x86,0xd5,0x28,0x94,0x24,0x93,0x20,
+	0xd2,0x10,0xd1,0x08,0x10,0x04,0x01,0x00,0x01,0x18,0x10,0x04,0x01,0x19,0x01,0x00,
+	0xd1,0x08,0x10,0x04,0x02,0xe6,0x08,0xdc,0x10,0x04,0x08,0x00,0x08,0x12,0x00,0x00,
+	0x01,0x00,0xd4,0x1c,0x53,0x04,0x01,0x00,0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,
+	0x01,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x14,0x00,0x93,0x10,
+	0x52,0x04,0x01,0x00,0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0xe2,0xfb,0x01,0xe1,0x2b,0x01,0xd0,0xa8,0xcf,0x86,0xd5,0x55,0xd4,0x28,0xd3,0x10,
+	0x52,0x04,0x07,0x00,0x91,0x08,0x10,0x04,0x0d,0x00,0x10,0x00,0x0a,0x00,0xd2,0x0c,
+	0x51,0x04,0x0a,0x00,0x10,0x04,0x0a,0x00,0x08,0x00,0x91,0x08,0x10,0x04,0x01,0x00,
+	0x07,0x00,0x07,0x00,0xd3,0x0c,0x52,0x04,0x07,0xe6,0x11,0x04,0x07,0xe6,0x0a,0xe6,
+	0xd2,0x10,0xd1,0x08,0x10,0x04,0x0a,0x1e,0x0a,0x1f,0x10,0x04,0x0a,0x20,0x01,0x00,
+	0xd1,0x09,0x10,0x05,0x0f,0xff,0x00,0x00,0x00,0x10,0x04,0x08,0x00,0x01,0x00,0xd4,
+	0x3d,0x93,0x39,0xd2,0x1a,0xd1,0x08,0x10,0x04,0x0c,0x00,0x01,0x00,0x10,0x09,0x01,
+	0xff,0xd8,0xa7,0xd9,0x93,0x00,0x01,0xff,0xd8,0xa7,0xd9,0x94,0x00,0xd1,0x12,0x10,
+	0x09,0x01,0xff,0xd9,0x88,0xd9,0x94,0x00,0x01,0xff,0xd8,0xa7,0xd9,0x95,0x00,0x10,
+	0x09,0x01,0xff,0xd9,0x8a,0xd9,0x94,0x00,0x01,0x00,0x01,0x00,0x53,0x04,0x01,0x00,
+	0x92,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x0a,0x00,0x0a,0x00,0xcf,0x86,
+	0xd5,0x5c,0xd4,0x20,0x53,0x04,0x01,0x00,0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,
+	0x01,0x00,0x01,0x1b,0xd1,0x08,0x10,0x04,0x01,0x1c,0x01,0x1d,0x10,0x04,0x01,0x1e,
+	0x01,0x1f,0xd3,0x20,0xd2,0x10,0xd1,0x08,0x10,0x04,0x01,0x20,0x01,0x21,0x10,0x04,
+	0x01,0x22,0x04,0xe6,0xd1,0x08,0x10,0x04,0x04,0xe6,0x04,0xdc,0x10,0x04,0x07,0xdc,
+	0x07,0xe6,0xd2,0x0c,0x91,0x08,0x10,0x04,0x07,0xe6,0x08,0xe6,0x08,0xe6,0xd1,0x08,
+	0x10,0x04,0x08,0xdc,0x08,0xe6,0x10,0x04,0x08,0xe6,0x0c,0xdc,0xd4,0x10,0x53,0x04,
+	0x01,0x00,0x52,0x04,0x01,0x00,0x11,0x04,0x01,0x00,0x06,0x00,0x93,0x10,0x92,0x0c,
+	0x91,0x08,0x10,0x04,0x01,0x23,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd0,0x22,
+	0xcf,0x86,0x55,0x04,0x01,0x00,0x54,0x04,0x01,0x00,0x53,0x04,0x01,0x00,0xd2,0x08,
+	0x11,0x04,0x04,0x00,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x04,0x00,
+	0xcf,0x86,0xd5,0x5b,0xd4,0x2e,0xd3,0x1e,0x92,0x1a,0xd1,0x0d,0x10,0x09,0x01,0xff,
+	0xdb,0x95,0xd9,0x94,0x00,0x01,0x00,0x10,0x09,0x01,0xff,0xdb,0x81,0xd9,0x94,0x00,
+	0x01,0x00,0x01,0x00,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,
+	0x04,0x00,0xd3,0x19,0xd2,0x11,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x01,0xff,
+	0xdb,0x92,0xd9,0x94,0x00,0x11,0x04,0x01,0x00,0x01,0xe6,0x52,0x04,0x01,0xe6,0xd1,
+	0x08,0x10,0x04,0x01,0xe6,0x01,0x00,0x10,0x04,0x01,0x00,0x01,0xe6,0xd4,0x38,0xd3,
+	0x1c,0xd2,0x0c,0x51,0x04,0x01,0xe6,0x10,0x04,0x01,0xe6,0x01,0xdc,0xd1,0x08,0x10,
+	0x04,0x01,0xe6,0x01,0x00,0x10,0x04,0x01,0x00,0x01,0xe6,0xd2,0x10,0xd1,0x08,0x10,
+	0x04,0x01,0xe6,0x01,0x00,0x10,0x04,0x01,0xdc,0x01,0xe6,0x91,0x08,0x10,0x04,0x01,
+	0xe6,0x01,0xdc,0x07,0x00,0x53,0x04,0x01,0x00,0xd2,0x08,0x11,0x04,0x01,0x00,0x04,
+	0x00,0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x07,0x00,0xd1,0xc8,0xd0,0x76,0xcf,
+	0x86,0xd5,0x28,0xd4,0x14,0x53,0x04,0x04,0x00,0x52,0x04,0x04,0x00,0x51,0x04,0x04,
+	0x00,0x10,0x04,0x00,0x00,0x04,0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x04,
+	0x00,0x04,0x24,0x04,0x00,0x04,0x00,0x04,0x00,0xd4,0x14,0x53,0x04,0x04,0x00,0x52,
+	0x04,0x04,0x00,0x91,0x08,0x10,0x04,0x04,0x00,0x07,0x00,0x07,0x00,0xd3,0x1c,0xd2,
+	0x0c,0x91,0x08,0x10,0x04,0x04,0xe6,0x04,0xdc,0x04,0xe6,0xd1,0x08,0x10,0x04,0x04,
+	0xdc,0x04,0xe6,0x10,0x04,0x04,0xe6,0x04,0xdc,0xd2,0x0c,0x51,0x04,0x04,0xdc,0x10,
+	0x04,0x04,0xe6,0x04,0xdc,0xd1,0x08,0x10,0x04,0x04,0xdc,0x04,0xe6,0x10,0x04,0x04,
+	0xdc,0x04,0xe6,0xcf,0x86,0xd5,0x3c,0x94,0x38,0xd3,0x1c,0xd2,0x0c,0x51,0x04,0x04,
+	0xe6,0x10,0x04,0x04,0xdc,0x04,0xe6,0xd1,0x08,0x10,0x04,0x04,0xdc,0x04,0xe6,0x10,
+	0x04,0x04,0xdc,0x04,0xe6,0xd2,0x10,0xd1,0x08,0x10,0x04,0x04,0xdc,0x04,0xe6,0x10,
+	0x04,0x04,0xe6,0x00,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x07,0x00,0x07,0x00,0x08,
+	0x00,0x94,0x10,0x53,0x04,0x08,0x00,0x52,0x04,0x08,0x00,0x11,0x04,0x08,0x00,0x0a,
+	0x00,0x0a,0x00,0xd0,0x1e,0xcf,0x86,0x55,0x04,0x04,0x00,0x54,0x04,0x04,0x00,0x93,
+	0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x04,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0xcf,0x86,0x55,0x04,0x09,0x00,0xd4,0x14,0x53,0x04,0x09,0x00,0x92,0x0c,0x51,
+	0x04,0x09,0x00,0x10,0x04,0x09,0x00,0x09,0xe6,0x09,0xe6,0xd3,0x10,0x92,0x0c,0x51,
+	0x04,0x09,0xe6,0x10,0x04,0x09,0xdc,0x09,0xe6,0x09,0x00,0xd2,0x0c,0x51,0x04,0x09,
+	0x00,0x10,0x04,0x09,0x00,0x00,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x14,0xdc,0x14,
+	0x00,0xe4,0xf8,0x57,0xe3,0x45,0x3f,0xe2,0xf4,0x3e,0xe1,0xc7,0x2c,0xe0,0x21,0x10,
+	0xcf,0x86,0xc5,0xe4,0x80,0x08,0xe3,0xcb,0x03,0xe2,0x61,0x01,0xd1,0x94,0xd0,0x5a,
+	0xcf,0x86,0xd5,0x20,0x54,0x04,0x0b,0x00,0xd3,0x0c,0x52,0x04,0x0b,0x00,0x11,0x04,
+	0x0b,0x00,0x0b,0xe6,0x92,0x0c,0x51,0x04,0x0b,0xe6,0x10,0x04,0x0b,0x00,0x0b,0xe6,
+	0x0b,0xe6,0xd4,0x24,0xd3,0x10,0x52,0x04,0x0b,0xe6,0x91,0x08,0x10,0x04,0x0b,0x00,
+	0x0b,0xe6,0x0b,0xe6,0xd2,0x0c,0x91,0x08,0x10,0x04,0x0b,0x00,0x0b,0xe6,0x0b,0xe6,
+	0x11,0x04,0x0b,0xe6,0x00,0x00,0x53,0x04,0x0b,0x00,0x52,0x04,0x0b,0x00,0x51,0x04,
+	0x0b,0x00,0x10,0x04,0x0b,0x00,0x00,0x00,0xcf,0x86,0xd5,0x20,0x54,0x04,0x0c,0x00,
+	0x53,0x04,0x0c,0x00,0xd2,0x0c,0x91,0x08,0x10,0x04,0x0c,0x00,0x0c,0xdc,0x0c,0xdc,
+	0x51,0x04,0x00,0x00,0x10,0x04,0x0c,0x00,0x00,0x00,0x94,0x14,0x53,0x04,0x13,0x00,
+	0x92,0x0c,0x51,0x04,0x13,0x00,0x10,0x04,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0xd0,0x4a,0xcf,0x86,0x55,0x04,0x00,0x00,0xd4,0x20,0xd3,0x10,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x0d,0x00,0x10,0x00,0x0d,0x00,0x0d,0x00,0x52,0x04,0x0d,0x00,0x91,0x08,
+	0x10,0x04,0x0d,0x00,0x10,0x00,0x10,0x00,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x10,0x00,
+	0x10,0x04,0x10,0x00,0x11,0x00,0x91,0x08,0x10,0x04,0x11,0x00,0x00,0x00,0x12,0x00,
+	0x52,0x04,0x12,0x00,0x11,0x04,0x12,0x00,0x00,0x00,0xcf,0x86,0xd5,0x18,0x54,0x04,
+	0x00,0x00,0x93,0x10,0x92,0x0c,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x14,0xdc,
+	0x12,0xe6,0x12,0xe6,0xd4,0x30,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x12,0xe6,0x10,0x04,
+	0x12,0x00,0x11,0xdc,0x51,0x04,0x0d,0xe6,0x10,0x04,0x0d,0xdc,0x0d,0xe6,0xd2,0x0c,
+	0x91,0x08,0x10,0x04,0x0d,0xe6,0x0d,0xdc,0x0d,0xe6,0x91,0x08,0x10,0x04,0x0d,0xe6,
+	0x0d,0xdc,0x0d,0xdc,0xd3,0x1c,0xd2,0x10,0xd1,0x08,0x10,0x04,0x0d,0x1b,0x0d,0x1c,
+	0x10,0x04,0x0d,0x1d,0x0d,0xe6,0x51,0x04,0x0d,0xe6,0x10,0x04,0x0d,0xdc,0x0d,0xe6,
+	0xd2,0x10,0xd1,0x08,0x10,0x04,0x0d,0xe6,0x0d,0xdc,0x10,0x04,0x0d,0xdc,0x0d,0xe6,
+	0x51,0x04,0x0d,0xe6,0x10,0x04,0x0d,0xe6,0x10,0xe6,0xe1,0x3a,0x01,0xd0,0x77,0xcf,
+	0x86,0xd5,0x20,0x94,0x1c,0x93,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,0x0b,0x00,0x01,
+	0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x07,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
+	0x00,0xd4,0x1b,0x53,0x04,0x01,0x00,0x92,0x13,0x91,0x0f,0x10,0x04,0x01,0x00,0x01,
+	0xff,0xe0,0xa4,0xa8,0xe0,0xa4,0xbc,0x00,0x01,0x00,0x01,0x00,0xd3,0x26,0xd2,0x13,
+	0x91,0x0f,0x10,0x04,0x01,0x00,0x01,0xff,0xe0,0xa4,0xb0,0xe0,0xa4,0xbc,0x00,0x01,
+	0x00,0x91,0x0f,0x10,0x0b,0x01,0xff,0xe0,0xa4,0xb3,0xe0,0xa4,0xbc,0x00,0x01,0x00,
+	0x01,0x00,0xd2,0x08,0x11,0x04,0x01,0x00,0x0c,0x00,0x91,0x08,0x10,0x04,0x01,0x07,
+	0x01,0x00,0x01,0x00,0xcf,0x86,0xd5,0x8c,0xd4,0x18,0x53,0x04,0x01,0x00,0x52,0x04,
+	0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x01,0x09,0x10,0x04,0x0b,0x00,0x0c,0x00,
+	0xd3,0x1c,0xd2,0x10,0xd1,0x08,0x10,0x04,0x01,0x00,0x01,0xe6,0x10,0x04,0x01,0xdc,
+	0x01,0xe6,0x91,0x08,0x10,0x04,0x01,0xe6,0x0b,0x00,0x0c,0x00,0xd2,0x2c,0xd1,0x16,
+	0x10,0x0b,0x01,0xff,0xe0,0xa4,0x95,0xe0,0xa4,0xbc,0x00,0x01,0xff,0xe0,0xa4,0x96,
+	0xe0,0xa4,0xbc,0x00,0x10,0x0b,0x01,0xff,0xe0,0xa4,0x97,0xe0,0xa4,0xbc,0x00,0x01,
+	0xff,0xe0,0xa4,0x9c,0xe0,0xa4,0xbc,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xe0,0xa4,
+	0xa1,0xe0,0xa4,0xbc,0x00,0x01,0xff,0xe0,0xa4,0xa2,0xe0,0xa4,0xbc,0x00,0x10,0x0b,
+	0x01,0xff,0xe0,0xa4,0xab,0xe0,0xa4,0xbc,0x00,0x01,0xff,0xe0,0xa4,0xaf,0xe0,0xa4,
+	0xbc,0x00,0x54,0x04,0x01,0x00,0xd3,0x14,0x92,0x10,0xd1,0x08,0x10,0x04,0x01,0x00,
+	0x0a,0x00,0x10,0x04,0x0a,0x00,0x0c,0x00,0x0c,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,
+	0x10,0x00,0x0b,0x00,0x10,0x04,0x0b,0x00,0x09,0x00,0x91,0x08,0x10,0x04,0x09,0x00,
+	0x08,0x00,0x09,0x00,0xd0,0x86,0xcf,0x86,0xd5,0x44,0xd4,0x2c,0xd3,0x18,0xd2,0x0c,
+	0x91,0x08,0x10,0x04,0x10,0x00,0x01,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x00,0x00,
+	0x01,0x00,0x01,0x00,0x52,0x04,0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,
+	0x10,0x04,0x00,0x00,0x01,0x00,0x93,0x14,0x92,0x10,0xd1,0x08,0x10,0x04,0x01,0x00,
+	0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd4,0x14,0x53,0x04,
+	0x01,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
+	0xd3,0x18,0xd2,0x10,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x10,0x04,0x01,0x00,
+	0x00,0x00,0x11,0x04,0x00,0x00,0x01,0x00,0xd2,0x08,0x11,0x04,0x01,0x00,0x00,0x00,
+	0x91,0x08,0x10,0x04,0x01,0x07,0x07,0x00,0x01,0x00,0xcf,0x86,0xd5,0x7b,0xd4,0x42,
+	0xd3,0x14,0x52,0x04,0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x10,0x04,
+	0x00,0x00,0x01,0x00,0xd2,0x17,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x10,0x04,
+	0x00,0x00,0x01,0xff,0xe0,0xa7,0x87,0xe0,0xa6,0xbe,0x00,0xd1,0x0f,0x10,0x0b,0x01,
+	0xff,0xe0,0xa7,0x87,0xe0,0xa7,0x97,0x00,0x01,0x09,0x10,0x04,0x08,0x00,0x00,0x00,
+	0xd3,0x10,0x52,0x04,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x00,
+	0x52,0x04,0x00,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xe0,0xa6,0xa1,0xe0,0xa6,0xbc,
+	0x00,0x01,0xff,0xe0,0xa6,0xa2,0xe0,0xa6,0xbc,0x00,0x10,0x04,0x00,0x00,0x01,0xff,
+	0xe0,0xa6,0xaf,0xe0,0xa6,0xbc,0x00,0xd4,0x10,0x93,0x0c,0x52,0x04,0x01,0x00,0x11,
+	0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x53,0x04,0x01,0x00,0xd2,0x0c,0x51,0x04,0x01,
+	0x00,0x10,0x04,0x01,0x00,0x0b,0x00,0x51,0x04,0x13,0x00,0x10,0x04,0x14,0xe6,0x00,
+	0x00,0xe2,0x48,0x02,0xe1,0x4f,0x01,0xd0,0xa4,0xcf,0x86,0xd5,0x4c,0xd4,0x34,0xd3,
+	0x1c,0xd2,0x10,0xd1,0x08,0x10,0x04,0x00,0x00,0x07,0x00,0x10,0x04,0x01,0x00,0x07,
+	0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0xd2,0x0c,0x51,0x04,0x01,
+	0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x01,
+	0x00,0x93,0x14,0x92,0x10,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x10,0x04,0x00,
+	0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd4,0x14,0x53,0x04,0x01,0x00,0x92,0x0c,0x91,
+	0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0xd3,0x2e,0xd2,0x17,0xd1,
+	0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0xe0,0xa8,0xb2,
+	0xe0,0xa8,0xbc,0x00,0xd1,0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x10,0x0b,0x01,0xff,
+	0xe0,0xa8,0xb8,0xe0,0xa8,0xbc,0x00,0x00,0x00,0xd2,0x08,0x11,0x04,0x01,0x00,0x00,
+	0x00,0x91,0x08,0x10,0x04,0x01,0x07,0x00,0x00,0x01,0x00,0xcf,0x86,0xd5,0x80,0xd4,
+	0x34,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x51,
+	0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x01,
+	0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x01,0x00,0x01,
+	0x09,0x00,0x00,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x0a,0x00,0x00,
+	0x00,0x00,0x00,0xd2,0x25,0xd1,0x0f,0x10,0x04,0x00,0x00,0x01,0xff,0xe0,0xa8,0x96,
+	0xe0,0xa8,0xbc,0x00,0x10,0x0b,0x01,0xff,0xe0,0xa8,0x97,0xe0,0xa8,0xbc,0x00,0x01,
+	0xff,0xe0,0xa8,0x9c,0xe0,0xa8,0xbc,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,
+	0x10,0x0b,0x01,0xff,0xe0,0xa8,0xab,0xe0,0xa8,0xbc,0x00,0x00,0x00,0xd4,0x10,0x93,
+	0x0c,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x93,0x14,0x52,
+	0x04,0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x0a,0x00,0x10,0x04,0x14,0x00,0x00,
+	0x00,0x00,0x00,0xd0,0x82,0xcf,0x86,0xd5,0x40,0xd4,0x2c,0xd3,0x18,0xd2,0x0c,0x91,
+	0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x01,
+	0x00,0x01,0x00,0x52,0x04,0x01,0x00,0xd1,0x08,0x10,0x04,0x07,0x00,0x01,0x00,0x10,
+	0x04,0x00,0x00,0x01,0x00,0x93,0x10,0x92,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x00,
+	0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd4,0x14,0x53,0x04,0x01,0x00,0x92,0x0c,0x91,
+	0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0xd3,0x18,0xd2,0x0c,0x91,
+	0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x01,
+	0x00,0x01,0x00,0xd2,0x08,0x11,0x04,0x01,0x00,0x00,0x00,0x91,0x08,0x10,0x04,0x01,
+	0x07,0x01,0x00,0x01,0x00,0xcf,0x86,0xd5,0x3c,0xd4,0x28,0xd3,0x10,0x52,0x04,0x01,
+	0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x00,0x00,0x01,0x00,0xd2,0x0c,0x51,0x04,0x01,
+	0x00,0x10,0x04,0x00,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x01,0x00,0x01,0x09,0x00,
+	0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0xd4,0x18,0x93,0x14,0xd2,0x0c,0x91,0x08,0x10,0x04,0x01,0x00,0x07,
+	0x00,0x07,0x00,0x11,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0xd3,0x10,0x92,0x0c,0x91,
+	0x08,0x10,0x04,0x0d,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x92,0x0c,0x91,0x08,0x10,
+	0x04,0x00,0x00,0x11,0x00,0x13,0x00,0x13,0x00,0xe1,0x24,0x01,0xd0,0x86,0xcf,0x86,
+	0xd5,0x44,0xd4,0x2c,0xd3,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x01,0x00,
+	0x01,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x52,0x04,0x01,0x00,
+	0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x00,0x93,0x14,
+	0x92,0x10,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x00,
+	0x01,0x00,0x01,0x00,0xd4,0x14,0x53,0x04,0x01,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,
+	0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0xd3,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,
+	0x01,0x00,0x00,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x07,0x00,0x01,0x00,
+	0xd2,0x08,0x11,0x04,0x01,0x00,0x00,0x00,0x91,0x08,0x10,0x04,0x01,0x07,0x01,0x00,
+	0x01,0x00,0xcf,0x86,0xd5,0x73,0xd4,0x45,0xd3,0x14,0x52,0x04,0x01,0x00,0xd1,0x08,
+	0x10,0x04,0x0a,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x00,0xd2,0x1e,0xd1,0x0f,
+	0x10,0x0b,0x01,0xff,0xe0,0xad,0x87,0xe0,0xad,0x96,0x00,0x00,0x00,0x10,0x04,0x00,
+	0x00,0x01,0xff,0xe0,0xad,0x87,0xe0,0xac,0xbe,0x00,0x91,0x0f,0x10,0x0b,0x01,0xff,
+	0xe0,0xad,0x87,0xe0,0xad,0x97,0x00,0x01,0x09,0x00,0x00,0xd3,0x0c,0x52,0x04,0x00,
+	0x00,0x11,0x04,0x00,0x00,0x01,0x00,0x52,0x04,0x00,0x00,0xd1,0x16,0x10,0x0b,0x01,
+	0xff,0xe0,0xac,0xa1,0xe0,0xac,0xbc,0x00,0x01,0xff,0xe0,0xac,0xa2,0xe0,0xac,0xbc,
+	0x00,0x10,0x04,0x00,0x00,0x01,0x00,0xd4,0x14,0x93,0x10,0xd2,0x08,0x11,0x04,0x01,
+	0x00,0x0a,0x00,0x11,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x93,0x10,0x92,0x0c,0x91,
+	0x08,0x10,0x04,0x01,0x00,0x07,0x00,0x0c,0x00,0x0c,0x00,0x00,0x00,0xd0,0xb1,0xcf,
+	0x86,0xd5,0x63,0xd4,0x28,0xd3,0x14,0xd2,0x08,0x11,0x04,0x00,0x00,0x01,0x00,0x91,
+	0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,
+	0x04,0x01,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x01,0x00,0xd3,0x1f,0xd2,0x0c,0x91,
+	0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x91,0x0f,0x10,0x0b,0x01,0xff,0xe0,
+	0xae,0x92,0xe0,0xaf,0x97,0x00,0x01,0x00,0x00,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,
+	0x00,0x00,0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x91,0x08,0x10,0x04,0x01,0x00,
+	0x00,0x00,0x01,0x00,0xd4,0x2c,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x00,0x00,0x10,0x04,
+	0x00,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0xd2,0x0c,
+	0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x01,0x00,
+	0xd3,0x10,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x08,0x00,0x01,0x00,
+	0xd2,0x08,0x11,0x04,0x01,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x01,0x00,0xcf,0x86,
+	0xd5,0x61,0xd4,0x45,0xd3,0x14,0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,
+	0x00,0x00,0x11,0x04,0x00,0x00,0x01,0x00,0xd2,0x1e,0xd1,0x08,0x10,0x04,0x01,0x00,
+	0x00,0x00,0x10,0x0b,0x01,0xff,0xe0,0xaf,0x86,0xe0,0xae,0xbe,0x00,0x01,0xff,0xe0,
+	0xaf,0x87,0xe0,0xae,0xbe,0x00,0x91,0x0f,0x10,0x0b,0x01,0xff,0xe0,0xaf,0x86,0xe0,
+	0xaf,0x97,0x00,0x01,0x09,0x00,0x00,0x93,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,0x0a,
+	0x00,0x00,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x00,0x00,
+	0x00,0xd4,0x14,0x93,0x10,0x52,0x04,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x08,
+	0x00,0x01,0x00,0x01,0x00,0xd3,0x10,0x92,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,
+	0x00,0x07,0x00,0x07,0x00,0x92,0x0c,0x51,0x04,0x07,0x00,0x10,0x04,0x07,0x00,0x00,
+	0x00,0x00,0x00,0xe3,0x1c,0x04,0xe2,0x1a,0x02,0xd1,0xf3,0xd0,0x76,0xcf,0x86,0xd5,
+	0x3c,0xd4,0x28,0xd3,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,0x10,0x00,0x01,0x00,0x01,
+	0x00,0x91,0x08,0x10,0x04,0x14,0x00,0x01,0x00,0x01,0x00,0x52,0x04,0x01,0x00,0x91,
+	0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,
+	0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd4,0x14,0x53,0x04,0x01,
+	0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0xd3,
+	0x10,0x52,0x04,0x01,0x00,0x91,0x08,0x10,0x04,0x10,0x00,0x01,0x00,0x01,0x00,0xd2,
+	0x08,0x11,0x04,0x01,0x00,0x00,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x0a,0x00,0x01,
+	0x00,0xcf,0x86,0xd5,0x53,0xd4,0x2f,0xd3,0x10,0x52,0x04,0x01,0x00,0x91,0x08,0x10,
+	0x04,0x01,0x00,0x00,0x00,0x01,0x00,0xd2,0x13,0x91,0x0f,0x10,0x0b,0x01,0xff,0xe0,
+	0xb1,0x86,0xe0,0xb1,0x96,0x00,0x00,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x01,0x00,
+	0x01,0x09,0x00,0x00,0xd3,0x14,0x52,0x04,0x00,0x00,0xd1,0x08,0x10,0x04,0x00,0x00,
+	0x01,0x54,0x10,0x04,0x01,0x5b,0x00,0x00,0x92,0x0c,0x51,0x04,0x0a,0x00,0x10,0x04,
+	0x11,0x00,0x00,0x00,0x00,0x00,0xd4,0x14,0x93,0x10,0xd2,0x08,0x11,0x04,0x01,0x00,
+	0x0a,0x00,0x11,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x93,0x10,0x52,0x04,0x00,0x00,
+	0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x15,0x00,0x0a,0x00,0xd0,0x76,0xcf,0x86,
+	0xd5,0x3c,0xd4,0x28,0xd3,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,0x12,0x00,0x10,0x00,
+	0x01,0x00,0x91,0x08,0x10,0x04,0x14,0x00,0x01,0x00,0x01,0x00,0x52,0x04,0x01,0x00,
+	0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x93,0x10,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd4,0x14,0x53,0x04,
+	0x01,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
+	0xd3,0x10,0x52,0x04,0x01,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,
+	0xd2,0x08,0x11,0x04,0x01,0x00,0x00,0x00,0x91,0x08,0x10,0x04,0x07,0x07,0x07,0x00,
+	0x01,0x00,0xcf,0x86,0xd5,0x82,0xd4,0x5e,0xd3,0x2a,0xd2,0x13,0x91,0x0f,0x10,0x0b,
+	0x01,0xff,0xe0,0xb2,0xbf,0xe0,0xb3,0x95,0x00,0x01,0x00,0x01,0x00,0xd1,0x08,0x10,
+	0x04,0x01,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0xe0,0xb3,0x86,0xe0,0xb3,
+	0x95,0x00,0xd2,0x28,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe0,0xb3,0x86,0xe0,0xb3,0x96,
+	0x00,0x00,0x00,0x10,0x0b,0x01,0xff,0xe0,0xb3,0x86,0xe0,0xb3,0x82,0x00,0x01,0xff,
+	0xe0,0xb3,0x86,0xe0,0xb3,0x82,0xe0,0xb3,0x95,0x00,0x91,0x08,0x10,0x04,0x01,0x00,
+	0x01,0x09,0x00,0x00,0xd3,0x14,0x52,0x04,0x00,0x00,0xd1,0x08,0x10,0x04,0x00,0x00,
+	0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x52,0x04,0x00,0x00,0x51,0x04,0x00,0x00,
+	0x10,0x04,0x01,0x00,0x00,0x00,0xd4,0x14,0x93,0x10,0xd2,0x08,0x11,0x04,0x01,0x00,
+	0x09,0x00,0x11,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x93,0x14,0x92,0x10,0xd1,0x08,
+	0x10,0x04,0x00,0x00,0x09,0x00,0x10,0x04,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0xe1,0x06,0x01,0xd0,0x6e,0xcf,0x86,0xd5,0x3c,0xd4,0x28,0xd3,0x18,0xd2,0x0c,0x91,
+	0x08,0x10,0x04,0x13,0x00,0x10,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x01,
+	0x00,0x01,0x00,0x52,0x04,0x01,0x00,0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,
+	0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x01,
+	0x00,0x01,0x00,0xd4,0x14,0x53,0x04,0x01,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,
+	0x00,0x0c,0x00,0x01,0x00,0x01,0x00,0x53,0x04,0x01,0x00,0xd2,0x0c,0x51,0x04,0x01,
+	0x00,0x10,0x04,0x0c,0x00,0x13,0x09,0x91,0x08,0x10,0x04,0x13,0x09,0x0a,0x00,0x01,
+	0x00,0xcf,0x86,0xd5,0x65,0xd4,0x45,0xd3,0x10,0x52,0x04,0x01,0x00,0x91,0x08,0x10,
+	0x04,0x0a,0x00,0x00,0x00,0x01,0x00,0xd2,0x1e,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,
+	0x00,0x10,0x0b,0x01,0xff,0xe0,0xb5,0x86,0xe0,0xb4,0xbe,0x00,0x01,0xff,0xe0,0xb5,
+	0x87,0xe0,0xb4,0xbe,0x00,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe0,0xb5,0x86,0xe0,0xb5,
+	0x97,0x00,0x01,0x09,0x10,0x04,0x0c,0x00,0x12,0x00,0xd3,0x10,0x52,0x04,0x00,0x00,
+	0x51,0x04,0x12,0x00,0x10,0x04,0x12,0x00,0x01,0x00,0x52,0x04,0x12,0x00,0x51,0x04,
+	0x12,0x00,0x10,0x04,0x12,0x00,0x11,0x00,0xd4,0x14,0x93,0x10,0xd2,0x08,0x11,0x04,
+	0x01,0x00,0x0a,0x00,0x11,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0xd3,0x0c,0x52,0x04,
+	0x0a,0x00,0x11,0x04,0x0a,0x00,0x12,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x12,0x00,
+	0x0a,0x00,0x0a,0x00,0x0a,0x00,0xd0,0x5a,0xcf,0x86,0xd5,0x34,0xd4,0x18,0x93,0x14,
+	0xd2,0x08,0x11,0x04,0x00,0x00,0x04,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x04,0x00,
+	0x04,0x00,0x04,0x00,0xd3,0x10,0x52,0x04,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x04,
+	0x04,0x00,0x00,0x00,0x92,0x08,0x11,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x54,0x04,
+	0x04,0x00,0xd3,0x10,0x92,0x0c,0x51,0x04,0x04,0x00,0x10,0x04,0x00,0x00,0x04,0x00,
+	0x04,0x00,0x52,0x04,0x04,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,
+	0xcf,0x86,0xd5,0x77,0xd4,0x28,0xd3,0x10,0x52,0x04,0x04,0x00,0x51,0x04,0x04,0x00,
+	0x10,0x04,0x04,0x00,0x00,0x00,0xd2,0x0c,0x51,0x04,0x00,0x00,0x10,0x04,0x04,0x09,
+	0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x04,0x00,0xd3,0x14,0x52,0x04,
+	0x04,0x00,0xd1,0x08,0x10,0x04,0x04,0x00,0x00,0x00,0x10,0x04,0x04,0x00,0x00,0x00,
+	0xd2,0x13,0x51,0x04,0x04,0x00,0x10,0x0b,0x04,0xff,0xe0,0xb7,0x99,0xe0,0xb7,0x8a,
+	0x00,0x04,0x00,0xd1,0x19,0x10,0x0b,0x04,0xff,0xe0,0xb7,0x99,0xe0,0xb7,0x8f,0x00,
+	0x04,0xff,0xe0,0xb7,0x99,0xe0,0xb7,0x8f,0xe0,0xb7,0x8a,0x00,0x10,0x0b,0x04,0xff,
+	0xe0,0xb7,0x99,0xe0,0xb7,0x9f,0x00,0x04,0x00,0xd4,0x10,0x93,0x0c,0x52,0x04,0x00,
+	0x00,0x11,0x04,0x00,0x00,0x10,0x00,0x10,0x00,0x93,0x14,0xd2,0x08,0x11,0x04,0x00,
+	0x00,0x04,0x00,0x91,0x08,0x10,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,
+	0x31,0x01,0xd1,0x58,0xd0,0x3a,0xcf,0x86,0xd5,0x18,0x94,0x14,0x93,0x10,0x92,0x0c,
+	0x91,0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+	0x54,0x04,0x01,0x00,0x53,0x04,0x01,0x00,0xd2,0x0c,0x51,0x04,0x01,0x67,0x10,0x04,
+	0x01,0x09,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x01,0x00,0xcf,0x86,
+	0x95,0x18,0xd4,0x0c,0x53,0x04,0x01,0x00,0x12,0x04,0x01,0x6b,0x01,0x00,0x53,0x04,
+	0x01,0x00,0x12,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0xd0,0x9e,0xcf,0x86,0xd5,0x54,
+	0xd4,0x3c,0xd3,0x20,0xd2,0x10,0xd1,0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x10,0x04,
+	0x01,0x00,0x00,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x10,0x04,0x15,0x00,
+	0x01,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x01,0x00,0x15,0x00,0x10,0x04,0x01,0x00,
+	0x00,0x00,0x91,0x08,0x10,0x04,0x15,0x00,0x01,0x00,0x15,0x00,0xd3,0x08,0x12,0x04,
+	0x15,0x00,0x01,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x15,0x00,0x01,0x00,0x01,0x00,
+	0x01,0x00,0xd4,0x30,0xd3,0x1c,0xd2,0x0c,0x91,0x08,0x10,0x04,0x15,0x00,0x01,0x00,
+	0x01,0x00,0xd1,0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x10,0x04,0x00,0x00,0x01,0x00,
+	0xd2,0x08,0x11,0x04,0x15,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x15,0x00,0x01,0x00,
+	0x01,0x00,0x53,0x04,0x01,0x00,0xd2,0x0c,0x51,0x04,0x01,0x76,0x10,0x04,0x15,0x09,
+	0x01,0x00,0x11,0x04,0x01,0x00,0x00,0x00,0xcf,0x86,0x95,0x34,0xd4,0x20,0xd3,0x14,
+	0x52,0x04,0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x10,0x04,0x01,0x00,
+	0x00,0x00,0x52,0x04,0x01,0x7a,0x11,0x04,0x01,0x00,0x00,0x00,0x53,0x04,0x01,0x00,
+	0xd2,0x08,0x11,0x04,0x01,0x00,0x00,0x00,0x11,0x04,0x01,0x00,0x0d,0x00,0x00,0x00,
+	0xe1,0x2b,0x01,0xd0,0x3e,0xcf,0x86,0xd5,0x14,0x54,0x04,0x02,0x00,0x53,0x04,0x02,
+	0x00,0x92,0x08,0x11,0x04,0x02,0xdc,0x02,0x00,0x02,0x00,0x54,0x04,0x02,0x00,0xd3,
+	0x14,0x52,0x04,0x02,0x00,0xd1,0x08,0x10,0x04,0x02,0x00,0x02,0xdc,0x10,0x04,0x02,
+	0x00,0x02,0xdc,0x92,0x0c,0x91,0x08,0x10,0x04,0x02,0x00,0x02,0xd8,0x02,0x00,0x02,
+	0x00,0xcf,0x86,0xd5,0x73,0xd4,0x36,0xd3,0x17,0x92,0x13,0x51,0x04,0x02,0x00,0x10,
+	0x04,0x02,0x00,0x02,0xff,0xe0,0xbd,0x82,0xe0,0xbe,0xb7,0x00,0x02,0x00,0xd2,0x0c,
+	0x91,0x08,0x10,0x04,0x00,0x00,0x02,0x00,0x02,0x00,0x91,0x0f,0x10,0x04,0x02,0x00,
+	0x02,0xff,0xe0,0xbd,0x8c,0xe0,0xbe,0xb7,0x00,0x02,0x00,0xd3,0x26,0xd2,0x13,0x51,
+	0x04,0x02,0x00,0x10,0x0b,0x02,0xff,0xe0,0xbd,0x91,0xe0,0xbe,0xb7,0x00,0x02,0x00,
+	0x51,0x04,0x02,0x00,0x10,0x04,0x02,0x00,0x02,0xff,0xe0,0xbd,0x96,0xe0,0xbe,0xb7,
+	0x00,0x52,0x04,0x02,0x00,0x91,0x0f,0x10,0x0b,0x02,0xff,0xe0,0xbd,0x9b,0xe0,0xbe,
+	0xb7,0x00,0x02,0x00,0x02,0x00,0xd4,0x27,0x53,0x04,0x02,0x00,0xd2,0x17,0xd1,0x0f,
+	0x10,0x04,0x02,0x00,0x02,0xff,0xe0,0xbd,0x80,0xe0,0xbe,0xb5,0x00,0x10,0x04,0x04,
+	0x00,0x0a,0x00,0x91,0x08,0x10,0x04,0x0a,0x00,0x00,0x00,0x00,0x00,0xd3,0x35,0xd2,
+	0x17,0xd1,0x08,0x10,0x04,0x00,0x00,0x02,0x81,0x10,0x04,0x02,0x82,0x02,0xff,0xe0,
+	0xbd,0xb1,0xe0,0xbd,0xb2,0x00,0xd1,0x0f,0x10,0x04,0x02,0x84,0x02,0xff,0xe0,0xbd,
+	0xb1,0xe0,0xbd,0xb4,0x00,0x10,0x0b,0x02,0xff,0xe0,0xbe,0xb2,0xe0,0xbe,0x80,0x00,
+	0x02,0x00,0xd2,0x13,0x91,0x0f,0x10,0x0b,0x02,0xff,0xe0,0xbe,0xb3,0xe0,0xbe,0x80,
+	0x00,0x02,0x00,0x02,0x82,0x11,0x04,0x02,0x82,0x02,0x00,0xd0,0xd3,0xcf,0x86,0xd5,
+	0x65,0xd4,0x27,0xd3,0x1f,0xd2,0x13,0x91,0x0f,0x10,0x04,0x02,0x82,0x02,0xff,0xe0,
+	0xbd,0xb1,0xe0,0xbe,0x80,0x00,0x02,0xe6,0x91,0x08,0x10,0x04,0x02,0x09,0x02,0x00,
+	0x02,0xe6,0x12,0x04,0x02,0x00,0x0c,0x00,0xd3,0x1f,0xd2,0x13,0x51,0x04,0x02,0x00,
+	0x10,0x04,0x02,0x00,0x02,0xff,0xe0,0xbe,0x92,0xe0,0xbe,0xb7,0x00,0x51,0x04,0x02,
+	0x00,0x10,0x04,0x04,0x00,0x02,0x00,0xd2,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x02,
+	0x00,0x02,0x00,0x91,0x0f,0x10,0x04,0x02,0x00,0x02,0xff,0xe0,0xbe,0x9c,0xe0,0xbe,
+	0xb7,0x00,0x02,0x00,0xd4,0x3d,0xd3,0x26,0xd2,0x13,0x51,0x04,0x02,0x00,0x10,0x0b,
+	0x02,0xff,0xe0,0xbe,0xa1,0xe0,0xbe,0xb7,0x00,0x02,0x00,0x51,0x04,0x02,0x00,0x10,
+	0x04,0x02,0x00,0x02,0xff,0xe0,0xbe,0xa6,0xe0,0xbe,0xb7,0x00,0x52,0x04,0x02,0x00,
+	0x91,0x0f,0x10,0x0b,0x02,0xff,0xe0,0xbe,0xab,0xe0,0xbe,0xb7,0x00,0x02,0x00,0x04,
+	0x00,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x04,0x00,0x02,0x00,0x02,0x00,0x02,
+	0x00,0xd2,0x13,0x91,0x0f,0x10,0x04,0x04,0x00,0x02,0xff,0xe0,0xbe,0x90,0xe0,0xbe,
+	0xb5,0x00,0x04,0x00,0x91,0x08,0x10,0x04,0x04,0x00,0x00,0x00,0x04,0x00,0xcf,0x86,
+	0x95,0x4c,0xd4,0x24,0xd3,0x10,0x52,0x04,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x04,
+	0x04,0xdc,0x04,0x00,0x52,0x04,0x04,0x00,0xd1,0x08,0x10,0x04,0x04,0x00,0x00,0x00,
+	0x10,0x04,0x0a,0x00,0x04,0x00,0xd3,0x14,0xd2,0x08,0x11,0x04,0x08,0x00,0x0a,0x00,
+	0x91,0x08,0x10,0x04,0x0a,0x00,0x0b,0x00,0x0b,0x00,0x92,0x10,0xd1,0x08,0x10,0x04,
+	0x0b,0x00,0x0c,0x00,0x10,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,
+	0xe5,0xf7,0x04,0xe4,0x79,0x03,0xe3,0x7b,0x01,0xe2,0x04,0x01,0xd1,0x7f,0xd0,0x65,
+	0xcf,0x86,0x55,0x04,0x04,0x00,0xd4,0x33,0xd3,0x1f,0xd2,0x0c,0x51,0x04,0x04,0x00,
+	0x10,0x04,0x0a,0x00,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x0b,0x04,0xff,0xe1,0x80,
+	0xa5,0xe1,0x80,0xae,0x00,0x04,0x00,0x92,0x10,0xd1,0x08,0x10,0x04,0x0a,0x00,0x04,
+	0x00,0x10,0x04,0x04,0x00,0x0a,0x00,0x04,0x00,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x04,
+	0x00,0x10,0x04,0x04,0x00,0x0a,0x00,0x51,0x04,0x0a,0x00,0x10,0x04,0x04,0x00,0x04,
+	0x07,0x92,0x10,0xd1,0x08,0x10,0x04,0x04,0x00,0x04,0x09,0x10,0x04,0x0a,0x09,0x0a,
+	0x00,0x0a,0x00,0xcf,0x86,0x95,0x14,0x54,0x04,0x04,0x00,0x53,0x04,0x04,0x00,0x92,
+	0x08,0x11,0x04,0x04,0x00,0x0a,0x00,0x0a,0x00,0x0a,0x00,0xd0,0x2e,0xcf,0x86,0x95,
+	0x28,0xd4,0x14,0x53,0x04,0x0a,0x00,0x52,0x04,0x0a,0x00,0x91,0x08,0x10,0x04,0x0a,
+	0x00,0x0a,0xdc,0x0a,0x00,0x53,0x04,0x0a,0x00,0xd2,0x08,0x11,0x04,0x0a,0x00,0x0b,
+	0x00,0x11,0x04,0x0b,0x00,0x0a,0x00,0x01,0x00,0xcf,0x86,0xd5,0x24,0x94,0x20,0xd3,
+	0x10,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x00,0x00,0x0d,0x00,0x52,
+	0x04,0x00,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x54,
+	0x04,0x01,0x00,0xd3,0x10,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,
+	0x00,0x06,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x06,0x00,0x08,0x00,0x10,0x04,0x08,
+	0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x08,0x00,0x0d,0x00,0x0d,0x00,0xd1,0x3e,0xd0,
+	0x06,0xcf,0x06,0x01,0x00,0xcf,0x86,0xd5,0x1d,0x54,0x04,0x01,0x00,0x53,0x04,0x01,
+	0x00,0xd2,0x08,0x11,0x04,0x01,0x00,0x0b,0x00,0x51,0x04,0x0b,0x00,0x10,0x04,0x0b,
+	0x00,0x01,0xff,0x00,0x94,0x15,0x93,0x11,0x92,0x0d,0x91,0x09,0x10,0x05,0x01,0xff,
+	0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd0,0x1e,0xcf,0x86,0x55,
+	0x04,0x01,0x00,0x94,0x14,0x93,0x10,0x92,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,
+	0x00,0x0b,0x00,0x0b,0x00,0x01,0x00,0x01,0x00,0xcf,0x86,0x55,0x04,0x01,0x00,0x54,
+	0x04,0x01,0x00,0x53,0x04,0x01,0x00,0x92,0x08,0x11,0x04,0x01,0x00,0x0b,0x00,0x0b,
+	0x00,0xe2,0x21,0x01,0xd1,0x6c,0xd0,0x1e,0xcf,0x86,0x95,0x18,0x94,0x14,0x93,0x10,
+	0x52,0x04,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x08,0x00,0x04,0x00,
+	0x04,0x00,0x04,0x00,0xcf,0x86,0x95,0x48,0xd4,0x24,0xd3,0x10,0x52,0x04,0x04,0x00,
+	0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x08,0x00,0xd2,0x0c,0x91,0x08,0x10,0x04,
+	0x04,0x00,0x00,0x00,0x04,0x00,0x11,0x04,0x04,0x00,0x00,0x00,0xd3,0x10,0x52,0x04,
+	0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x00,0x00,0xd2,0x0c,0x91,0x08,
+	0x10,0x04,0x04,0x00,0x00,0x00,0x04,0x00,0x11,0x04,0x04,0x00,0x00,0x00,0x04,0x00,
+	0xd0,0x62,0xcf,0x86,0xd5,0x28,0x94,0x24,0xd3,0x10,0x52,0x04,0x04,0x00,0x51,0x04,
+	0x04,0x00,0x10,0x04,0x04,0x00,0x08,0x00,0xd2,0x0c,0x91,0x08,0x10,0x04,0x04,0x00,
+	0x00,0x00,0x04,0x00,0x11,0x04,0x04,0x00,0x00,0x00,0x04,0x00,0xd4,0x14,0x53,0x04,
+	0x04,0x00,0x52,0x04,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x08,0x00,
+	0xd3,0x14,0xd2,0x0c,0x91,0x08,0x10,0x04,0x04,0x00,0x00,0x00,0x04,0x00,0x11,0x04,
+	0x04,0x00,0x00,0x00,0x52,0x04,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,
+	0x00,0x00,0xcf,0x86,0xd5,0x38,0xd4,0x24,0xd3,0x14,0xd2,0x0c,0x91,0x08,0x10,0x04,
+	0x04,0x00,0x00,0x00,0x04,0x00,0x11,0x04,0x04,0x00,0x00,0x00,0x52,0x04,0x04,0x00,
+	0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x08,0x00,0x93,0x10,0x52,0x04,0x04,0x00,
+	0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x00,0x00,0x04,0x00,0x94,0x14,0x53,0x04,
+	0x04,0x00,0x52,0x04,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x08,0x00,
+	0x04,0x00,0xd1,0x9c,0xd0,0x3e,0xcf,0x86,0x95,0x38,0xd4,0x14,0x53,0x04,0x04,0x00,
+	0x52,0x04,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x08,0x00,0xd3,0x14,
+	0xd2,0x0c,0x91,0x08,0x10,0x04,0x04,0x00,0x00,0x00,0x04,0x00,0x11,0x04,0x04,0x00,
+	0x00,0x00,0x52,0x04,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x08,0x00,
+	0x04,0x00,0xcf,0x86,0xd5,0x34,0xd4,0x14,0x93,0x10,0x52,0x04,0x04,0x00,0x51,0x04,
+	0x04,0x00,0x10,0x04,0x04,0x00,0x08,0x00,0x04,0x00,0x53,0x04,0x04,0x00,0xd2,0x0c,
+	0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x00,0x00,0xd1,0x08,0x10,0x04,0x00,0x00,
+	0x0c,0xe6,0x10,0x04,0x0c,0xe6,0x08,0xe6,0xd4,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x53,0x04,0x04,0x00,
+	0x52,0x04,0x04,0x00,0x91,0x08,0x10,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0xd0,0x1a,
+	0xcf,0x86,0x95,0x14,0x54,0x04,0x08,0x00,0x53,0x04,0x08,0x00,0x92,0x08,0x11,0x04,
+	0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xcf,0x86,0x55,0x04,0x04,0x00,0x54,0x04,
+	0x04,0x00,0xd3,0x10,0x52,0x04,0x04,0x00,0x91,0x08,0x10,0x04,0x04,0x00,0x11,0x00,
+	0x00,0x00,0x52,0x04,0x11,0x00,0x11,0x04,0x11,0x00,0x00,0x00,0xd3,0x30,0xd2,0x2a,
+	0xd1,0x24,0xd0,0x1e,0xcf,0x86,0x95,0x18,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x0b,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,
+	0xcf,0x06,0x04,0x00,0xcf,0x06,0x04,0x00,0xcf,0x06,0x04,0x00,0xd2,0x6c,0xd1,0x24,
+	0xd0,0x06,0xcf,0x06,0x04,0x00,0xcf,0x86,0x55,0x04,0x04,0x00,0x54,0x04,0x04,0x00,
+	0x93,0x10,0x52,0x04,0x04,0x00,0x51,0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x0b,0x00,
+	0x0b,0x00,0xd0,0x1e,0xcf,0x86,0x95,0x18,0x54,0x04,0x04,0x00,0x53,0x04,0x04,0x00,
+	0x52,0x04,0x04,0x00,0x91,0x08,0x10,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,
+	0xcf,0x86,0x55,0x04,0x04,0x00,0x54,0x04,0x04,0x00,0xd3,0x10,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x04,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,
+	0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x80,0xd0,0x46,0xcf,0x86,0xd5,0x28,
+	0xd4,0x14,0x53,0x04,0x06,0x00,0x52,0x04,0x06,0x00,0x91,0x08,0x10,0x04,0x06,0x00,
+	0x00,0x00,0x06,0x00,0x93,0x10,0x52,0x04,0x06,0x00,0x91,0x08,0x10,0x04,0x06,0x09,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x04,0x06,0x00,0x93,0x14,0x52,0x04,0x06,0x00,
+	0xd1,0x08,0x10,0x04,0x06,0x09,0x06,0x00,0x10,0x04,0x06,0x00,0x00,0x00,0x00,0x00,
+	0xcf,0x86,0xd5,0x10,0x54,0x04,0x06,0x00,0x93,0x08,0x12,0x04,0x06,0x00,0x00,0x00,
+	0x00,0x00,0xd4,0x14,0x53,0x04,0x06,0x00,0x52,0x04,0x06,0x00,0x91,0x08,0x10,0x04,
+	0x06,0x00,0x00,0x00,0x06,0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x06,0x00,
+	0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0xd0,0x1b,0xcf,0x86,0x55,0x04,0x04,0x00,
+	0x54,0x04,0x04,0x00,0x93,0x0d,0x52,0x04,0x04,0x00,0x11,0x05,0x04,0xff,0x00,0x04,
+	0x00,0x04,0x00,0xcf,0x86,0xd5,0x24,0x54,0x04,0x04,0x00,0xd3,0x10,0x92,0x0c,0x51,
+	0x04,0x04,0x00,0x10,0x04,0x04,0x09,0x04,0x00,0x04,0x00,0x52,0x04,0x04,0x00,0x91,
+	0x08,0x10,0x04,0x04,0x00,0x07,0xe6,0x00,0x00,0xd4,0x10,0x53,0x04,0x04,0x00,0x92,
+	0x08,0x11,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x53,0x04,0x07,0x00,0x92,0x08,0x11,
+	0x04,0x07,0x00,0x00,0x00,0x00,0x00,0xe4,0xb7,0x03,0xe3,0x58,0x01,0xd2,0x8f,0xd1,
+	0x53,0xd0,0x35,0xcf,0x86,0x95,0x2f,0xd4,0x1f,0x53,0x04,0x04,0x00,0xd2,0x0d,0x51,
+	0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x04,0xff,0x00,0x51,0x05,0x04,0xff,0x00,0x10,
+	0x05,0x04,0xff,0x00,0x00,0x00,0x53,0x04,0x04,0x00,0x92,0x08,0x11,0x04,0x04,0x00,
+	0x00,0x00,0x00,0x00,0x04,0x00,0xcf,0x86,0x55,0x04,0x04,0x00,0x54,0x04,0x04,0x00,
+	0x53,0x04,0x04,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x14,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0xd0,0x22,0xcf,0x86,0x55,0x04,0x04,0x00,0x94,0x18,0x53,0x04,0x04,0x00,
+	0x92,0x10,0xd1,0x08,0x10,0x04,0x04,0x00,0x04,0xe4,0x10,0x04,0x0a,0x00,0x00,0x00,
+	0x00,0x00,0x0b,0x00,0xcf,0x86,0x55,0x04,0x0b,0x00,0x54,0x04,0x0b,0x00,0x93,0x0c,
+	0x52,0x04,0x0b,0x00,0x11,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,0xd1,0x80,0xd0,0x42,
+	0xcf,0x86,0xd5,0x1c,0x54,0x04,0x07,0x00,0x53,0x04,0x07,0x00,0x52,0x04,0x07,0x00,
+	0xd1,0x08,0x10,0x04,0x07,0x00,0x10,0x00,0x10,0x04,0x10,0x00,0x00,0x00,0xd4,0x0c,
+	0x53,0x04,0x07,0x00,0x12,0x04,0x07,0x00,0x00,0x00,0x53,0x04,0x07,0x00,0x92,0x10,
+	0xd1,0x08,0x10,0x04,0x07,0x00,0x07,0xde,0x10,0x04,0x07,0xe6,0x07,0xdc,0x00,0x00,
+	0xcf,0x86,0xd5,0x18,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x07,0x00,
+	0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0xd4,0x10,0x53,0x04,0x07,0x00,
+	0x52,0x04,0x07,0x00,0x11,0x04,0x07,0x00,0x00,0x00,0x93,0x10,0x52,0x04,0x07,0x00,
+	0x91,0x08,0x10,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x1a,0xcf,0x86,
+	0x55,0x04,0x08,0x00,0x94,0x10,0x53,0x04,0x08,0x00,0x92,0x08,0x11,0x04,0x08,0x00,
+	0x0b,0x00,0x00,0x00,0x08,0x00,0xcf,0x86,0x95,0x28,0xd4,0x10,0x53,0x04,0x08,0x00,
+	0x92,0x08,0x11,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x53,0x04,0x08,0x00,0xd2,0x0c,
+	0x51,0x04,0x08,0x00,0x10,0x04,0x0b,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x08,0x00,
+	0x07,0x00,0xd2,0xe4,0xd1,0x80,0xd0,0x2e,0xcf,0x86,0x95,0x28,0x54,0x04,0x08,0x00,
+	0xd3,0x10,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x08,0xe6,
+	0xd2,0x0c,0x91,0x08,0x10,0x04,0x08,0xdc,0x08,0x00,0x08,0x00,0x11,0x04,0x00,0x00,
+	0x08,0x00,0x0b,0x00,0xcf,0x86,0xd5,0x18,0x54,0x04,0x0b,0x00,0x53,0x04,0x0b,0x00,
+	0x52,0x04,0x0b,0x00,0x51,0x04,0x0b,0x00,0x10,0x04,0x0b,0x00,0x00,0x00,0xd4,0x14,
+	0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x0b,0x09,0x0b,0x00,0x0b,0x00,0x0b,0x00,
+	0x0b,0x00,0xd3,0x10,0x52,0x04,0x0b,0x00,0x91,0x08,0x10,0x04,0x0b,0x00,0x0b,0xe6,
+	0x0b,0xe6,0x52,0x04,0x0b,0xe6,0xd1,0x08,0x10,0x04,0x0b,0xe6,0x00,0x00,0x10,0x04,
+	0x00,0x00,0x0b,0xdc,0xd0,0x5e,0xcf,0x86,0xd5,0x20,0xd4,0x10,0x53,0x04,0x0b,0x00,
+	0x92,0x08,0x11,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,0x53,0x04,0x0b,0x00,0x92,0x08,
+	0x11,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,0xd4,0x10,0x53,0x04,0x0b,0x00,0x52,0x04,
+	0x0b,0x00,0x11,0x04,0x0b,0x00,0x00,0x00,0xd3,0x10,0x52,0x04,0x10,0xe6,0x91,0x08,
+	0x10,0x04,0x10,0xe6,0x10,0xdc,0x10,0xdc,0xd2,0x0c,0x51,0x04,0x10,0xdc,0x10,0x04,
+	0x10,0xdc,0x10,0xe6,0xd1,0x08,0x10,0x04,0x10,0xe6,0x10,0xdc,0x10,0x04,0x10,0x00,
+	0x00,0x00,0xcf,0x06,0x00,0x00,0xe1,0x1e,0x01,0xd0,0xaa,0xcf,0x86,0xd5,0x6e,0xd4,
+	0x53,0xd3,0x17,0x52,0x04,0x09,0x00,0x51,0x04,0x09,0x00,0x10,0x0b,0x09,0xff,0xe1,
+	0xac,0x85,0xe1,0xac,0xb5,0x00,0x09,0x00,0xd2,0x1e,0xd1,0x0f,0x10,0x0b,0x09,0xff,
+	0xe1,0xac,0x87,0xe1,0xac,0xb5,0x00,0x09,0x00,0x10,0x0b,0x09,0xff,0xe1,0xac,0x89,
+	0xe1,0xac,0xb5,0x00,0x09,0x00,0xd1,0x0f,0x10,0x0b,0x09,0xff,0xe1,0xac,0x8b,0xe1,
+	0xac,0xb5,0x00,0x09,0x00,0x10,0x0b,0x09,0xff,0xe1,0xac,0x8d,0xe1,0xac,0xb5,0x00,
+	0x09,0x00,0x93,0x17,0x92,0x13,0x51,0x04,0x09,0x00,0x10,0x0b,0x09,0xff,0xe1,0xac,
+	0x91,0xe1,0xac,0xb5,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x54,0x04,0x09,0x00,0xd3,
+	0x10,0x52,0x04,0x09,0x00,0x91,0x08,0x10,0x04,0x09,0x07,0x09,0x00,0x09,0x00,0xd2,
+	0x13,0x51,0x04,0x09,0x00,0x10,0x04,0x09,0x00,0x09,0xff,0xe1,0xac,0xba,0xe1,0xac,
+	0xb5,0x00,0x91,0x0f,0x10,0x04,0x09,0x00,0x09,0xff,0xe1,0xac,0xbc,0xe1,0xac,0xb5,
+	0x00,0x09,0x00,0xcf,0x86,0xd5,0x3d,0x94,0x39,0xd3,0x31,0xd2,0x25,0xd1,0x16,0x10,
+	0x0b,0x09,0xff,0xe1,0xac,0xbe,0xe1,0xac,0xb5,0x00,0x09,0xff,0xe1,0xac,0xbf,0xe1,
+	0xac,0xb5,0x00,0x10,0x04,0x09,0x00,0x09,0xff,0xe1,0xad,0x82,0xe1,0xac,0xb5,0x00,
+	0x91,0x08,0x10,0x04,0x09,0x09,0x09,0x00,0x09,0x00,0x12,0x04,0x09,0x00,0x00,0x00,
+	0x09,0x00,0xd4,0x1c,0x53,0x04,0x09,0x00,0xd2,0x0c,0x51,0x04,0x09,0x00,0x10,0x04,
+	0x09,0x00,0x09,0xe6,0x91,0x08,0x10,0x04,0x09,0xdc,0x09,0xe6,0x09,0xe6,0xd3,0x08,
+	0x12,0x04,0x09,0xe6,0x09,0x00,0x52,0x04,0x09,0x00,0x91,0x08,0x10,0x04,0x09,0x00,
+	0x00,0x00,0x00,0x00,0xd0,0x2e,0xcf,0x86,0x55,0x04,0x0a,0x00,0xd4,0x18,0x53,0x04,
+	0x0a,0x00,0xd2,0x0c,0x51,0x04,0x0a,0x00,0x10,0x04,0x0a,0x09,0x0d,0x09,0x11,0x04,
+	0x0d,0x00,0x0a,0x00,0x53,0x04,0x0a,0x00,0x92,0x08,0x11,0x04,0x0a,0x00,0x0d,0x00,
+	0x0d,0x00,0xcf,0x86,0x55,0x04,0x0c,0x00,0xd4,0x14,0x93,0x10,0x52,0x04,0x0c,0x00,
+	0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x07,0x0c,0x00,0x0c,0x00,0xd3,0x0c,0x92,0x08,
+	0x11,0x04,0x0c,0x00,0x0c,0x09,0x00,0x00,0x12,0x04,0x00,0x00,0x0c,0x00,0xe3,0xb2,
+	0x01,0xe2,0x09,0x01,0xd1,0x4c,0xd0,0x2a,0xcf,0x86,0x55,0x04,0x0a,0x00,0x54,0x04,
+	0x0a,0x00,0xd3,0x10,0x52,0x04,0x0a,0x00,0x51,0x04,0x0a,0x00,0x10,0x04,0x0a,0x00,
+	0x0a,0x07,0x92,0x0c,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x0a,0x00,0x0a,0x00,
+	0xcf,0x86,0x95,0x1c,0x94,0x18,0x53,0x04,0x0a,0x00,0xd2,0x08,0x11,0x04,0x0a,0x00,
+	0x00,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x0a,0x00,0x0a,0x00,0x0a,0x00,0x0a,0x00,
+	0xd0,0x3a,0xcf,0x86,0xd5,0x18,0x94,0x14,0x53,0x04,0x12,0x00,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x54,0x04,0x14,0x00,
+	0x53,0x04,0x14,0x00,0xd2,0x0c,0x51,0x04,0x14,0x00,0x10,0x04,0x14,0x00,0x00,0x00,
+	0x91,0x08,0x10,0x04,0x00,0x00,0x14,0x00,0x14,0x00,0xcf,0x86,0xd5,0x2c,0xd4,0x08,
+	0x13,0x04,0x0d,0x00,0x00,0x00,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x0b,0xe6,0x10,0x04,
+	0x0b,0xe6,0x0b,0x00,0x91,0x08,0x10,0x04,0x0b,0x01,0x0b,0xdc,0x0b,0xdc,0x92,0x08,
+	0x11,0x04,0x0b,0xdc,0x0b,0xe6,0x0b,0xdc,0xd4,0x28,0xd3,0x10,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x0b,0xe6,0x0b,0x00,0x0b,0x01,0x0b,0x01,0xd2,0x0c,0x91,0x08,0x10,0x04,
+	0x0b,0x01,0x0b,0x00,0x0b,0x00,0x91,0x08,0x10,0x04,0x0b,0x00,0x0b,0xdc,0x0b,0x00,
+	0xd3,0x1c,0xd2,0x0c,0x51,0x04,0x0b,0x00,0x10,0x04,0x0b,0x00,0x0d,0x00,0xd1,0x08,
+	0x10,0x04,0x0d,0xe6,0x0d,0x00,0x10,0x04,0x0d,0x00,0x13,0x00,0x92,0x0c,0x51,0x04,
+	0x10,0xe6,0x10,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0xd1,0x1c,0xd0,0x06,0xcf,0x06,
+	0x07,0x00,0xcf,0x86,0x55,0x04,0x07,0x00,0x94,0x0c,0x53,0x04,0x07,0x00,0x12,0x04,
+	0x07,0x00,0x08,0x00,0x08,0x00,0xd0,0x06,0xcf,0x06,0x08,0x00,0xcf,0x86,0xd5,0x40,
+	0xd4,0x2c,0xd3,0x10,0x92,0x0c,0x51,0x04,0x08,0xe6,0x10,0x04,0x08,0xdc,0x08,0xe6,
+	0x09,0xe6,0xd2,0x0c,0x51,0x04,0x09,0xe6,0x10,0x04,0x09,0xdc,0x0a,0xe6,0xd1,0x08,
+	0x10,0x04,0x0a,0xe6,0x0a,0xea,0x10,0x04,0x0a,0xd6,0x0a,0xdc,0x93,0x10,0x92,0x0c,
+	0x91,0x08,0x10,0x04,0x0a,0xca,0x0a,0xe6,0x0a,0xe6,0x0a,0xe6,0x0a,0xe6,0xd4,0x14,
+	0x93,0x10,0x52,0x04,0x0a,0xe6,0x51,0x04,0x0a,0xe6,0x10,0x04,0x0a,0xe6,0x10,0xe6,
+	0x10,0xe6,0xd3,0x10,0x52,0x04,0x10,0xe6,0x51,0x04,0x10,0xe6,0x10,0x04,0x13,0xe8,
+	0x13,0xe4,0xd2,0x10,0xd1,0x08,0x10,0x04,0x13,0xe4,0x13,0xdc,0x10,0x04,0x00,0x00,
+	0x12,0xe6,0xd1,0x08,0x10,0x04,0x0c,0xe9,0x0b,0xdc,0x10,0x04,0x09,0xe6,0x09,0xdc,
+	0xe2,0x80,0x08,0xe1,0x48,0x04,0xe0,0x1c,0x02,0xcf,0x86,0xe5,0x11,0x01,0xd4,0x84,
+	0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x41,0xcc,0xa5,0x00,0x01,0xff,
+	0x61,0xcc,0xa5,0x00,0x10,0x08,0x01,0xff,0x42,0xcc,0x87,0x00,0x01,0xff,0x62,0xcc,
+	0x87,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x42,0xcc,0xa3,0x00,0x01,0xff,0x62,0xcc,
+	0xa3,0x00,0x10,0x08,0x01,0xff,0x42,0xcc,0xb1,0x00,0x01,0xff,0x62,0xcc,0xb1,0x00,
+	0xd2,0x24,0xd1,0x14,0x10,0x0a,0x01,0xff,0x43,0xcc,0xa7,0xcc,0x81,0x00,0x01,0xff,
+	0x63,0xcc,0xa7,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x44,0xcc,0x87,0x00,0x01,0xff,
+	0x64,0xcc,0x87,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x44,0xcc,0xa3,0x00,0x01,0xff,
+	0x64,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x44,0xcc,0xb1,0x00,0x01,0xff,0x64,0xcc,
+	0xb1,0x00,0xd3,0x48,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x44,0xcc,0xa7,0x00,
+	0x01,0xff,0x64,0xcc,0xa7,0x00,0x10,0x08,0x01,0xff,0x44,0xcc,0xad,0x00,0x01,0xff,
+	0x64,0xcc,0xad,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x45,0xcc,0x84,0xcc,0x80,0x00,
+	0x01,0xff,0x65,0xcc,0x84,0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,0x45,0xcc,0x84,0xcc,
+	0x81,0x00,0x01,0xff,0x65,0xcc,0x84,0xcc,0x81,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0x45,0xcc,0xad,0x00,0x01,0xff,0x65,0xcc,0xad,0x00,0x10,0x08,0x01,0xff,
+	0x45,0xcc,0xb0,0x00,0x01,0xff,0x65,0xcc,0xb0,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,
+	0x45,0xcc,0xa7,0xcc,0x86,0x00,0x01,0xff,0x65,0xcc,0xa7,0xcc,0x86,0x00,0x10,0x08,
+	0x01,0xff,0x46,0xcc,0x87,0x00,0x01,0xff,0x66,0xcc,0x87,0x00,0xd4,0x84,0xd3,0x40,
+	0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x47,0xcc,0x84,0x00,0x01,0xff,0x67,0xcc,
+	0x84,0x00,0x10,0x08,0x01,0xff,0x48,0xcc,0x87,0x00,0x01,0xff,0x68,0xcc,0x87,0x00,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0x48,0xcc,0xa3,0x00,0x01,0xff,0x68,0xcc,0xa3,0x00,
+	0x10,0x08,0x01,0xff,0x48,0xcc,0x88,0x00,0x01,0xff,0x68,0xcc,0x88,0x00,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0x48,0xcc,0xa7,0x00,0x01,0xff,0x68,0xcc,0xa7,0x00,
+	0x10,0x08,0x01,0xff,0x48,0xcc,0xae,0x00,0x01,0xff,0x68,0xcc,0xae,0x00,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0x49,0xcc,0xb0,0x00,0x01,0xff,0x69,0xcc,0xb0,0x00,0x10,0x0a,
+	0x01,0xff,0x49,0xcc,0x88,0xcc,0x81,0x00,0x01,0xff,0x69,0xcc,0x88,0xcc,0x81,0x00,
+	0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x4b,0xcc,0x81,0x00,0x01,0xff,
+	0x6b,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x4b,0xcc,0xa3,0x00,0x01,0xff,0x6b,0xcc,
+	0xa3,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x4b,0xcc,0xb1,0x00,0x01,0xff,0x6b,0xcc,
+	0xb1,0x00,0x10,0x08,0x01,0xff,0x4c,0xcc,0xa3,0x00,0x01,0xff,0x6c,0xcc,0xa3,0x00,
+	0xd2,0x24,0xd1,0x14,0x10,0x0a,0x01,0xff,0x4c,0xcc,0xa3,0xcc,0x84,0x00,0x01,0xff,
+	0x6c,0xcc,0xa3,0xcc,0x84,0x00,0x10,0x08,0x01,0xff,0x4c,0xcc,0xb1,0x00,0x01,0xff,
+	0x6c,0xcc,0xb1,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x4c,0xcc,0xad,0x00,0x01,0xff,
+	0x6c,0xcc,0xad,0x00,0x10,0x08,0x01,0xff,0x4d,0xcc,0x81,0x00,0x01,0xff,0x6d,0xcc,
+	0x81,0x00,0xcf,0x86,0xe5,0x15,0x01,0xd4,0x88,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x4d,0xcc,0x87,0x00,0x01,0xff,0x6d,0xcc,0x87,0x00,0x10,0x08,0x01,
+	0xff,0x4d,0xcc,0xa3,0x00,0x01,0xff,0x6d,0xcc,0xa3,0x00,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x4e,0xcc,0x87,0x00,0x01,0xff,0x6e,0xcc,0x87,0x00,0x10,0x08,0x01,0xff,0x4e,
+	0xcc,0xa3,0x00,0x01,0xff,0x6e,0xcc,0xa3,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x4e,0xcc,0xb1,0x00,0x01,0xff,0x6e,0xcc,0xb1,0x00,0x10,0x08,0x01,0xff,0x4e,
+	0xcc,0xad,0x00,0x01,0xff,0x6e,0xcc,0xad,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x4f,
+	0xcc,0x83,0xcc,0x81,0x00,0x01,0xff,0x6f,0xcc,0x83,0xcc,0x81,0x00,0x10,0x0a,0x01,
+	0xff,0x4f,0xcc,0x83,0xcc,0x88,0x00,0x01,0xff,0x6f,0xcc,0x83,0xcc,0x88,0x00,0xd3,
+	0x48,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x4f,0xcc,0x84,0xcc,0x80,0x00,0x01,
+	0xff,0x6f,0xcc,0x84,0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,0x4f,0xcc,0x84,0xcc,0x81,
+	0x00,0x01,0xff,0x6f,0xcc,0x84,0xcc,0x81,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x50,
+	0xcc,0x81,0x00,0x01,0xff,0x70,0xcc,0x81,0x00,0x10,0x08,0x01,0xff,0x50,0xcc,0x87,
+	0x00,0x01,0xff,0x70,0xcc,0x87,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x52,
+	0xcc,0x87,0x00,0x01,0xff,0x72,0xcc,0x87,0x00,0x10,0x08,0x01,0xff,0x52,0xcc,0xa3,
+	0x00,0x01,0xff,0x72,0xcc,0xa3,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x52,0xcc,0xa3,
+	0xcc,0x84,0x00,0x01,0xff,0x72,0xcc,0xa3,0xcc,0x84,0x00,0x10,0x08,0x01,0xff,0x52,
+	0xcc,0xb1,0x00,0x01,0xff,0x72,0xcc,0xb1,0x00,0xd4,0x8c,0xd3,0x48,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0x53,0xcc,0x87,0x00,0x01,0xff,0x73,0xcc,0x87,0x00,0x10,
+	0x08,0x01,0xff,0x53,0xcc,0xa3,0x00,0x01,0xff,0x73,0xcc,0xa3,0x00,0xd1,0x14,0x10,
+	0x0a,0x01,0xff,0x53,0xcc,0x81,0xcc,0x87,0x00,0x01,0xff,0x73,0xcc,0x81,0xcc,0x87,
+	0x00,0x10,0x0a,0x01,0xff,0x53,0xcc,0x8c,0xcc,0x87,0x00,0x01,0xff,0x73,0xcc,0x8c,
+	0xcc,0x87,0x00,0xd2,0x24,0xd1,0x14,0x10,0x0a,0x01,0xff,0x53,0xcc,0xa3,0xcc,0x87,
+	0x00,0x01,0xff,0x73,0xcc,0xa3,0xcc,0x87,0x00,0x10,0x08,0x01,0xff,0x54,0xcc,0x87,
+	0x00,0x01,0xff,0x74,0xcc,0x87,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x54,0xcc,0xa3,
+	0x00,0x01,0xff,0x74,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x54,0xcc,0xb1,0x00,0x01,
+	0xff,0x74,0xcc,0xb1,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x54,
+	0xcc,0xad,0x00,0x01,0xff,0x74,0xcc,0xad,0x00,0x10,0x08,0x01,0xff,0x55,0xcc,0xa4,
+	0x00,0x01,0xff,0x75,0xcc,0xa4,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x55,0xcc,0xb0,
+	0x00,0x01,0xff,0x75,0xcc,0xb0,0x00,0x10,0x08,0x01,0xff,0x55,0xcc,0xad,0x00,0x01,
+	0xff,0x75,0xcc,0xad,0x00,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x55,0xcc,0x83,
+	0xcc,0x81,0x00,0x01,0xff,0x75,0xcc,0x83,0xcc,0x81,0x00,0x10,0x0a,0x01,0xff,0x55,
+	0xcc,0x84,0xcc,0x88,0x00,0x01,0xff,0x75,0xcc,0x84,0xcc,0x88,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0x56,0xcc,0x83,0x00,0x01,0xff,0x76,0xcc,0x83,0x00,0x10,0x08,0x01,
+	0xff,0x56,0xcc,0xa3,0x00,0x01,0xff,0x76,0xcc,0xa3,0x00,0xe0,0x10,0x02,0xcf,0x86,
+	0xd5,0xe1,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x57,0xcc,
+	0x80,0x00,0x01,0xff,0x77,0xcc,0x80,0x00,0x10,0x08,0x01,0xff,0x57,0xcc,0x81,0x00,
+	0x01,0xff,0x77,0xcc,0x81,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x57,0xcc,0x88,0x00,
+	0x01,0xff,0x77,0xcc,0x88,0x00,0x10,0x08,0x01,0xff,0x57,0xcc,0x87,0x00,0x01,0xff,
+	0x77,0xcc,0x87,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x57,0xcc,0xa3,0x00,
+	0x01,0xff,0x77,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x58,0xcc,0x87,0x00,0x01,0xff,
+	0x78,0xcc,0x87,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x58,0xcc,0x88,0x00,0x01,0xff,
+	0x78,0xcc,0x88,0x00,0x10,0x08,0x01,0xff,0x59,0xcc,0x87,0x00,0x01,0xff,0x79,0xcc,
+	0x87,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x5a,0xcc,0x82,0x00,
+	0x01,0xff,0x7a,0xcc,0x82,0x00,0x10,0x08,0x01,0xff,0x5a,0xcc,0xa3,0x00,0x01,0xff,
+	0x7a,0xcc,0xa3,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x5a,0xcc,0xb1,0x00,0x01,0xff,
+	0x7a,0xcc,0xb1,0x00,0x10,0x08,0x01,0xff,0x68,0xcc,0xb1,0x00,0x01,0xff,0x74,0xcc,
+	0x88,0x00,0x92,0x1d,0xd1,0x10,0x10,0x08,0x01,0xff,0x77,0xcc,0x8a,0x00,0x01,0xff,
+	0x79,0xcc,0x8a,0x00,0x10,0x04,0x01,0x00,0x02,0xff,0xc5,0xbf,0xcc,0x87,0x00,0x0a,
+	0x00,0xd4,0x98,0xd3,0x48,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x41,0xcc,0xa3,
+	0x00,0x01,0xff,0x61,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x41,0xcc,0x89,0x00,0x01,
+	0xff,0x61,0xcc,0x89,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x41,0xcc,0x82,0xcc,0x81,
+	0x00,0x01,0xff,0x61,0xcc,0x82,0xcc,0x81,0x00,0x10,0x0a,0x01,0xff,0x41,0xcc,0x82,
+	0xcc,0x80,0x00,0x01,0xff,0x61,0xcc,0x82,0xcc,0x80,0x00,0xd2,0x28,0xd1,0x14,0x10,
+	0x0a,0x01,0xff,0x41,0xcc,0x82,0xcc,0x89,0x00,0x01,0xff,0x61,0xcc,0x82,0xcc,0x89,
+	0x00,0x10,0x0a,0x01,0xff,0x41,0xcc,0x82,0xcc,0x83,0x00,0x01,0xff,0x61,0xcc,0x82,
+	0xcc,0x83,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x41,0xcc,0xa3,0xcc,0x82,0x00,0x01,
+	0xff,0x61,0xcc,0xa3,0xcc,0x82,0x00,0x10,0x0a,0x01,0xff,0x41,0xcc,0x86,0xcc,0x81,
+	0x00,0x01,0xff,0x61,0xcc,0x86,0xcc,0x81,0x00,0xd3,0x50,0xd2,0x28,0xd1,0x14,0x10,
+	0x0a,0x01,0xff,0x41,0xcc,0x86,0xcc,0x80,0x00,0x01,0xff,0x61,0xcc,0x86,0xcc,0x80,
+	0x00,0x10,0x0a,0x01,0xff,0x41,0xcc,0x86,0xcc,0x89,0x00,0x01,0xff,0x61,0xcc,0x86,
+	0xcc,0x89,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x41,0xcc,0x86,0xcc,0x83,0x00,0x01,
+	0xff,0x61,0xcc,0x86,0xcc,0x83,0x00,0x10,0x0a,0x01,0xff,0x41,0xcc,0xa3,0xcc,0x86,
+	0x00,0x01,0xff,0x61,0xcc,0xa3,0xcc,0x86,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0x45,0xcc,0xa3,0x00,0x01,0xff,0x65,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x45,
+	0xcc,0x89,0x00,0x01,0xff,0x65,0xcc,0x89,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x45,
+	0xcc,0x83,0x00,0x01,0xff,0x65,0xcc,0x83,0x00,0x10,0x0a,0x01,0xff,0x45,0xcc,0x82,
+	0xcc,0x81,0x00,0x01,0xff,0x65,0xcc,0x82,0xcc,0x81,0x00,0xcf,0x86,0xe5,0x31,0x01,
+	0xd4,0x90,0xd3,0x50,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x45,0xcc,0x82,0xcc,
+	0x80,0x00,0x01,0xff,0x65,0xcc,0x82,0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,0x45,0xcc,
+	0x82,0xcc,0x89,0x00,0x01,0xff,0x65,0xcc,0x82,0xcc,0x89,0x00,0xd1,0x14,0x10,0x0a,
+	0x01,0xff,0x45,0xcc,0x82,0xcc,0x83,0x00,0x01,0xff,0x65,0xcc,0x82,0xcc,0x83,0x00,
+	0x10,0x0a,0x01,0xff,0x45,0xcc,0xa3,0xcc,0x82,0x00,0x01,0xff,0x65,0xcc,0xa3,0xcc,
+	0x82,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0x49,0xcc,0x89,0x00,0x01,0xff,
+	0x69,0xcc,0x89,0x00,0x10,0x08,0x01,0xff,0x49,0xcc,0xa3,0x00,0x01,0xff,0x69,0xcc,
+	0xa3,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0x4f,0xcc,0xa3,0x00,0x01,0xff,0x6f,0xcc,
+	0xa3,0x00,0x10,0x08,0x01,0xff,0x4f,0xcc,0x89,0x00,0x01,0xff,0x6f,0xcc,0x89,0x00,
+	0xd3,0x50,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x4f,0xcc,0x82,0xcc,0x81,0x00,
+	0x01,0xff,0x6f,0xcc,0x82,0xcc,0x81,0x00,0x10,0x0a,0x01,0xff,0x4f,0xcc,0x82,0xcc,
+	0x80,0x00,0x01,0xff,0x6f,0xcc,0x82,0xcc,0x80,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,
+	0x4f,0xcc,0x82,0xcc,0x89,0x00,0x01,0xff,0x6f,0xcc,0x82,0xcc,0x89,0x00,0x10,0x0a,
+	0x01,0xff,0x4f,0xcc,0x82,0xcc,0x83,0x00,0x01,0xff,0x6f,0xcc,0x82,0xcc,0x83,0x00,
+	0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x4f,0xcc,0xa3,0xcc,0x82,0x00,0x01,0xff,
+	0x6f,0xcc,0xa3,0xcc,0x82,0x00,0x10,0x0a,0x01,0xff,0x4f,0xcc,0x9b,0xcc,0x81,0x00,
+	0x01,0xff,0x6f,0xcc,0x9b,0xcc,0x81,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0x4f,0xcc,
+	0x9b,0xcc,0x80,0x00,0x01,0xff,0x6f,0xcc,0x9b,0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,
+	0x4f,0xcc,0x9b,0xcc,0x89,0x00,0x01,0xff,0x6f,0xcc,0x9b,0xcc,0x89,0x00,0xd4,0x98,
+	0xd3,0x48,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0x4f,0xcc,0x9b,0xcc,0x83,0x00,
+	0x01,0xff,0x6f,0xcc,0x9b,0xcc,0x83,0x00,0x10,0x0a,0x01,0xff,0x4f,0xcc,0x9b,0xcc,
+	0xa3,0x00,0x01,0xff,0x6f,0xcc,0x9b,0xcc,0xa3,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0x55,0xcc,0xa3,0x00,0x01,0xff,0x75,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,0x55,0xcc,
+	0x89,0x00,0x01,0xff,0x75,0xcc,0x89,0x00,0xd2,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,
+	0x55,0xcc,0x9b,0xcc,0x81,0x00,0x01,0xff,0x75,0xcc,0x9b,0xcc,0x81,0x00,0x10,0x0a,
+	0x01,0xff,0x55,0xcc,0x9b,0xcc,0x80,0x00,0x01,0xff,0x75,0xcc,0x9b,0xcc,0x80,0x00,
+	0xd1,0x14,0x10,0x0a,0x01,0xff,0x55,0xcc,0x9b,0xcc,0x89,0x00,0x01,0xff,0x75,0xcc,
+	0x9b,0xcc,0x89,0x00,0x10,0x0a,0x01,0xff,0x55,0xcc,0x9b,0xcc,0x83,0x00,0x01,0xff,
+	0x75,0xcc,0x9b,0xcc,0x83,0x00,0xd3,0x44,0xd2,0x24,0xd1,0x14,0x10,0x0a,0x01,0xff,
+	0x55,0xcc,0x9b,0xcc,0xa3,0x00,0x01,0xff,0x75,0xcc,0x9b,0xcc,0xa3,0x00,0x10,0x08,
+	0x01,0xff,0x59,0xcc,0x80,0x00,0x01,0xff,0x79,0xcc,0x80,0x00,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0x59,0xcc,0xa3,0x00,0x01,0xff,0x79,0xcc,0xa3,0x00,0x10,0x08,0x01,0xff,
+	0x59,0xcc,0x89,0x00,0x01,0xff,0x79,0xcc,0x89,0x00,0x92,0x14,0x91,0x10,0x10,0x08,
+	0x01,0xff,0x59,0xcc,0x83,0x00,0x01,0xff,0x79,0xcc,0x83,0x00,0x0a,0x00,0x0a,0x00,
+	0xe1,0xc0,0x04,0xe0,0x80,0x02,0xcf,0x86,0xe5,0x2d,0x01,0xd4,0xa8,0xd3,0x54,0xd2,
+	0x28,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb1,0xcc,0x93,0x00,0x01,0xff,0xce,0xb1,
+	0xcc,0x94,0x00,0x10,0x0b,0x01,0xff,0xce,0xb1,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,
+	0xce,0xb1,0xcc,0x94,0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0xb1,0xcc,
+	0x93,0xcc,0x81,0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0xcc,0x81,0x00,0x10,0x0b,0x01,
+	0xff,0xce,0xb1,0xcc,0x93,0xcd,0x82,0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0xcd,0x82,
+	0x00,0xd2,0x28,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0x91,0xcc,0x93,0x00,0x01,0xff,
+	0xce,0x91,0xcc,0x94,0x00,0x10,0x0b,0x01,0xff,0xce,0x91,0xcc,0x93,0xcc,0x80,0x00,
+	0x01,0xff,0xce,0x91,0xcc,0x94,0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,
+	0x91,0xcc,0x93,0xcc,0x81,0x00,0x01,0xff,0xce,0x91,0xcc,0x94,0xcc,0x81,0x00,0x10,
+	0x0b,0x01,0xff,0xce,0x91,0xcc,0x93,0xcd,0x82,0x00,0x01,0xff,0xce,0x91,0xcc,0x94,
+	0xcd,0x82,0x00,0xd3,0x42,0xd2,0x28,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb5,0xcc,
+	0x93,0x00,0x01,0xff,0xce,0xb5,0xcc,0x94,0x00,0x10,0x0b,0x01,0xff,0xce,0xb5,0xcc,
+	0x93,0xcc,0x80,0x00,0x01,0xff,0xce,0xb5,0xcc,0x94,0xcc,0x80,0x00,0x91,0x16,0x10,
+	0x0b,0x01,0xff,0xce,0xb5,0xcc,0x93,0xcc,0x81,0x00,0x01,0xff,0xce,0xb5,0xcc,0x94,
+	0xcc,0x81,0x00,0x00,0x00,0xd2,0x28,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0x95,0xcc,
+	0x93,0x00,0x01,0xff,0xce,0x95,0xcc,0x94,0x00,0x10,0x0b,0x01,0xff,0xce,0x95,0xcc,
+	0x93,0xcc,0x80,0x00,0x01,0xff,0xce,0x95,0xcc,0x94,0xcc,0x80,0x00,0x91,0x16,0x10,
+	0x0b,0x01,0xff,0xce,0x95,0xcc,0x93,0xcc,0x81,0x00,0x01,0xff,0xce,0x95,0xcc,0x94,
+	0xcc,0x81,0x00,0x00,0x00,0xd4,0xa8,0xd3,0x54,0xd2,0x28,0xd1,0x12,0x10,0x09,0x01,
+	0xff,0xce,0xb7,0xcc,0x93,0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0x00,0x10,0x0b,0x01,
+	0xff,0xce,0xb7,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcc,0x80,
+	0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0xb7,0xcc,0x93,0xcc,0x81,0x00,0x01,0xff,
+	0xce,0xb7,0xcc,0x94,0xcc,0x81,0x00,0x10,0x0b,0x01,0xff,0xce,0xb7,0xcc,0x93,0xcd,
+	0x82,0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcd,0x82,0x00,0xd2,0x28,0xd1,0x12,0x10,
+	0x09,0x01,0xff,0xce,0x97,0xcc,0x93,0x00,0x01,0xff,0xce,0x97,0xcc,0x94,0x00,0x10,
+	0x0b,0x01,0xff,0xce,0x97,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xce,0x97,0xcc,0x94,
+	0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0x97,0xcc,0x93,0xcc,0x81,0x00,
+	0x01,0xff,0xce,0x97,0xcc,0x94,0xcc,0x81,0x00,0x10,0x0b,0x01,0xff,0xce,0x97,0xcc,
+	0x93,0xcd,0x82,0x00,0x01,0xff,0xce,0x97,0xcc,0x94,0xcd,0x82,0x00,0xd3,0x54,0xd2,
+	0x28,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb9,0xcc,0x93,0x00,0x01,0xff,0xce,0xb9,
+	0xcc,0x94,0x00,0x10,0x0b,0x01,0xff,0xce,0xb9,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,
+	0xce,0xb9,0xcc,0x94,0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0xb9,0xcc,
+	0x93,0xcc,0x81,0x00,0x01,0xff,0xce,0xb9,0xcc,0x94,0xcc,0x81,0x00,0x10,0x0b,0x01,
+	0xff,0xce,0xb9,0xcc,0x93,0xcd,0x82,0x00,0x01,0xff,0xce,0xb9,0xcc,0x94,0xcd,0x82,
+	0x00,0xd2,0x28,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0x99,0xcc,0x93,0x00,0x01,0xff,
+	0xce,0x99,0xcc,0x94,0x00,0x10,0x0b,0x01,0xff,0xce,0x99,0xcc,0x93,0xcc,0x80,0x00,
+	0x01,0xff,0xce,0x99,0xcc,0x94,0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,
+	0x99,0xcc,0x93,0xcc,0x81,0x00,0x01,0xff,0xce,0x99,0xcc,0x94,0xcc,0x81,0x00,0x10,
+	0x0b,0x01,0xff,0xce,0x99,0xcc,0x93,0xcd,0x82,0x00,0x01,0xff,0xce,0x99,0xcc,0x94,
+	0xcd,0x82,0x00,0xcf,0x86,0xe5,0x13,0x01,0xd4,0x84,0xd3,0x42,0xd2,0x28,0xd1,0x12,
+	0x10,0x09,0x01,0xff,0xce,0xbf,0xcc,0x93,0x00,0x01,0xff,0xce,0xbf,0xcc,0x94,0x00,
+	0x10,0x0b,0x01,0xff,0xce,0xbf,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xce,0xbf,0xcc,
+	0x94,0xcc,0x80,0x00,0x91,0x16,0x10,0x0b,0x01,0xff,0xce,0xbf,0xcc,0x93,0xcc,0x81,
+	0x00,0x01,0xff,0xce,0xbf,0xcc,0x94,0xcc,0x81,0x00,0x00,0x00,0xd2,0x28,0xd1,0x12,
+	0x10,0x09,0x01,0xff,0xce,0x9f,0xcc,0x93,0x00,0x01,0xff,0xce,0x9f,0xcc,0x94,0x00,
+	0x10,0x0b,0x01,0xff,0xce,0x9f,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xce,0x9f,0xcc,
+	0x94,0xcc,0x80,0x00,0x91,0x16,0x10,0x0b,0x01,0xff,0xce,0x9f,0xcc,0x93,0xcc,0x81,
+	0x00,0x01,0xff,0xce,0x9f,0xcc,0x94,0xcc,0x81,0x00,0x00,0x00,0xd3,0x54,0xd2,0x28,
+	0xd1,0x12,0x10,0x09,0x01,0xff,0xcf,0x85,0xcc,0x93,0x00,0x01,0xff,0xcf,0x85,0xcc,
+	0x94,0x00,0x10,0x0b,0x01,0xff,0xcf,0x85,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xcf,
+	0x85,0xcc,0x94,0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xcf,0x85,0xcc,0x93,
+	0xcc,0x81,0x00,0x01,0xff,0xcf,0x85,0xcc,0x94,0xcc,0x81,0x00,0x10,0x0b,0x01,0xff,
+	0xcf,0x85,0xcc,0x93,0xcd,0x82,0x00,0x01,0xff,0xcf,0x85,0xcc,0x94,0xcd,0x82,0x00,
+	0xd2,0x1c,0xd1,0x0d,0x10,0x04,0x00,0x00,0x01,0xff,0xce,0xa5,0xcc,0x94,0x00,0x10,
+	0x04,0x00,0x00,0x01,0xff,0xce,0xa5,0xcc,0x94,0xcc,0x80,0x00,0xd1,0x0f,0x10,0x04,
+	0x00,0x00,0x01,0xff,0xce,0xa5,0xcc,0x94,0xcc,0x81,0x00,0x10,0x04,0x00,0x00,0x01,
+	0xff,0xce,0xa5,0xcc,0x94,0xcd,0x82,0x00,0xd4,0xa8,0xd3,0x54,0xd2,0x28,0xd1,0x12,
+	0x10,0x09,0x01,0xff,0xcf,0x89,0xcc,0x93,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0x00,
+	0x10,0x0b,0x01,0xff,0xcf,0x89,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xcf,0x89,0xcc,
+	0x94,0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xcf,0x89,0xcc,0x93,0xcc,0x81,
+	0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xcc,0x81,0x00,0x10,0x0b,0x01,0xff,0xcf,0x89,
+	0xcc,0x93,0xcd,0x82,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xcd,0x82,0x00,0xd2,0x28,
+	0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xa9,0xcc,0x93,0x00,0x01,0xff,0xce,0xa9,0xcc,
+	0x94,0x00,0x10,0x0b,0x01,0xff,0xce,0xa9,0xcc,0x93,0xcc,0x80,0x00,0x01,0xff,0xce,
+	0xa9,0xcc,0x94,0xcc,0x80,0x00,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0xa9,0xcc,0x93,
+	0xcc,0x81,0x00,0x01,0xff,0xce,0xa9,0xcc,0x94,0xcc,0x81,0x00,0x10,0x0b,0x01,0xff,
+	0xce,0xa9,0xcc,0x93,0xcd,0x82,0x00,0x01,0xff,0xce,0xa9,0xcc,0x94,0xcd,0x82,0x00,
+	0xd3,0x48,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb1,0xcc,0x80,0x00,0x01,
+	0xff,0xce,0xb1,0xcc,0x81,0x00,0x10,0x09,0x01,0xff,0xce,0xb5,0xcc,0x80,0x00,0x01,
+	0xff,0xce,0xb5,0xcc,0x81,0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb7,0xcc,0x80,
+	0x00,0x01,0xff,0xce,0xb7,0xcc,0x81,0x00,0x10,0x09,0x01,0xff,0xce,0xb9,0xcc,0x80,
+	0x00,0x01,0xff,0xce,0xb9,0xcc,0x81,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,
+	0xce,0xbf,0xcc,0x80,0x00,0x01,0xff,0xce,0xbf,0xcc,0x81,0x00,0x10,0x09,0x01,0xff,
+	0xcf,0x85,0xcc,0x80,0x00,0x01,0xff,0xcf,0x85,0xcc,0x81,0x00,0x91,0x12,0x10,0x09,
+	0x01,0xff,0xcf,0x89,0xcc,0x80,0x00,0x01,0xff,0xcf,0x89,0xcc,0x81,0x00,0x00,0x00,
+	0xe0,0xe1,0x02,0xcf,0x86,0xe5,0x91,0x01,0xd4,0xc8,0xd3,0x64,0xd2,0x30,0xd1,0x16,
+	0x10,0x0b,0x01,0xff,0xce,0xb1,0xcc,0x93,0xcd,0x85,0x00,0x01,0xff,0xce,0xb1,0xcc,
+	0x94,0xcd,0x85,0x00,0x10,0x0d,0x01,0xff,0xce,0xb1,0xcc,0x93,0xcc,0x80,0xcd,0x85,
+	0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0xcc,0x80,0xcd,0x85,0x00,0xd1,0x1a,0x10,0x0d,
+	0x01,0xff,0xce,0xb1,0xcc,0x93,0xcc,0x81,0xcd,0x85,0x00,0x01,0xff,0xce,0xb1,0xcc,
+	0x94,0xcc,0x81,0xcd,0x85,0x00,0x10,0x0d,0x01,0xff,0xce,0xb1,0xcc,0x93,0xcd,0x82,
+	0xcd,0x85,0x00,0x01,0xff,0xce,0xb1,0xcc,0x94,0xcd,0x82,0xcd,0x85,0x00,0xd2,0x30,
+	0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0x91,0xcc,0x93,0xcd,0x85,0x00,0x01,0xff,0xce,
+	0x91,0xcc,0x94,0xcd,0x85,0x00,0x10,0x0d,0x01,0xff,0xce,0x91,0xcc,0x93,0xcc,0x80,
+	0xcd,0x85,0x00,0x01,0xff,0xce,0x91,0xcc,0x94,0xcc,0x80,0xcd,0x85,0x00,0xd1,0x1a,
+	0x10,0x0d,0x01,0xff,0xce,0x91,0xcc,0x93,0xcc,0x81,0xcd,0x85,0x00,0x01,0xff,0xce,
+	0x91,0xcc,0x94,0xcc,0x81,0xcd,0x85,0x00,0x10,0x0d,0x01,0xff,0xce,0x91,0xcc,0x93,
+	0xcd,0x82,0xcd,0x85,0x00,0x01,0xff,0xce,0x91,0xcc,0x94,0xcd,0x82,0xcd,0x85,0x00,
+	0xd3,0x64,0xd2,0x30,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0xb7,0xcc,0x93,0xcd,0x85,
+	0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcd,0x85,0x00,0x10,0x0d,0x01,0xff,0xce,0xb7,
+	0xcc,0x93,0xcc,0x80,0xcd,0x85,0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcc,0x80,0xcd,
+	0x85,0x00,0xd1,0x1a,0x10,0x0d,0x01,0xff,0xce,0xb7,0xcc,0x93,0xcc,0x81,0xcd,0x85,
+	0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcc,0x81,0xcd,0x85,0x00,0x10,0x0d,0x01,0xff,
+	0xce,0xb7,0xcc,0x93,0xcd,0x82,0xcd,0x85,0x00,0x01,0xff,0xce,0xb7,0xcc,0x94,0xcd,
+	0x82,0xcd,0x85,0x00,0xd2,0x30,0xd1,0x16,0x10,0x0b,0x01,0xff,0xce,0x97,0xcc,0x93,
+	0xcd,0x85,0x00,0x01,0xff,0xce,0x97,0xcc,0x94,0xcd,0x85,0x00,0x10,0x0d,0x01,0xff,
+	0xce,0x97,0xcc,0x93,0xcc,0x80,0xcd,0x85,0x00,0x01,0xff,0xce,0x97,0xcc,0x94,0xcc,
+	0x80,0xcd,0x85,0x00,0xd1,0x1a,0x10,0x0d,0x01,0xff,0xce,0x97,0xcc,0x93,0xcc,0x81,
+	0xcd,0x85,0x00,0x01,0xff,0xce,0x97,0xcc,0x94,0xcc,0x81,0xcd,0x85,0x00,0x10,0x0d,
+	0x01,0xff,0xce,0x97,0xcc,0x93,0xcd,0x82,0xcd,0x85,0x00,0x01,0xff,0xce,0x97,0xcc,
+	0x94,0xcd,0x82,0xcd,0x85,0x00,0xd4,0xc8,0xd3,0x64,0xd2,0x30,0xd1,0x16,0x10,0x0b,
+	0x01,0xff,0xcf,0x89,0xcc,0x93,0xcd,0x85,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xcd,
+	0x85,0x00,0x10,0x0d,0x01,0xff,0xcf,0x89,0xcc,0x93,0xcc,0x80,0xcd,0x85,0x00,0x01,
+	0xff,0xcf,0x89,0xcc,0x94,0xcc,0x80,0xcd,0x85,0x00,0xd1,0x1a,0x10,0x0d,0x01,0xff,
+	0xcf,0x89,0xcc,0x93,0xcc,0x81,0xcd,0x85,0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xcc,
+	0x81,0xcd,0x85,0x00,0x10,0x0d,0x01,0xff,0xcf,0x89,0xcc,0x93,0xcd,0x82,0xcd,0x85,
+	0x00,0x01,0xff,0xcf,0x89,0xcc,0x94,0xcd,0x82,0xcd,0x85,0x00,0xd2,0x30,0xd1,0x16,
+	0x10,0x0b,0x01,0xff,0xce,0xa9,0xcc,0x93,0xcd,0x85,0x00,0x01,0xff,0xce,0xa9,0xcc,
+	0x94,0xcd,0x85,0x00,0x10,0x0d,0x01,0xff,0xce,0xa9,0xcc,0x93,0xcc,0x80,0xcd,0x85,
+	0x00,0x01,0xff,0xce,0xa9,0xcc,0x94,0xcc,0x80,0xcd,0x85,0x00,0xd1,0x1a,0x10,0x0d,
+	0x01,0xff,0xce,0xa9,0xcc,0x93,0xcc,0x81,0xcd,0x85,0x00,0x01,0xff,0xce,0xa9,0xcc,
+	0x94,0xcc,0x81,0xcd,0x85,0x00,0x10,0x0d,0x01,0xff,0xce,0xa9,0xcc,0x93,0xcd,0x82,
+	0xcd,0x85,0x00,0x01,0xff,0xce,0xa9,0xcc,0x94,0xcd,0x82,0xcd,0x85,0x00,0xd3,0x49,
+	0xd2,0x26,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0xb1,0xcc,0x86,0x00,0x01,0xff,0xce,
+	0xb1,0xcc,0x84,0x00,0x10,0x0b,0x01,0xff,0xce,0xb1,0xcc,0x80,0xcd,0x85,0x00,0x01,
+	0xff,0xce,0xb1,0xcd,0x85,0x00,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xce,0xb1,0xcc,0x81,
+	0xcd,0x85,0x00,0x00,0x00,0x10,0x09,0x01,0xff,0xce,0xb1,0xcd,0x82,0x00,0x01,0xff,
+	0xce,0xb1,0xcd,0x82,0xcd,0x85,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,
+	0x91,0xcc,0x86,0x00,0x01,0xff,0xce,0x91,0xcc,0x84,0x00,0x10,0x09,0x01,0xff,0xce,
+	0x91,0xcc,0x80,0x00,0x01,0xff,0xce,0x91,0xcc,0x81,0x00,0xd1,0x0d,0x10,0x09,0x01,
+	0xff,0xce,0x91,0xcd,0x85,0x00,0x01,0x00,0x10,0x07,0x01,0xff,0xce,0xb9,0x00,0x01,
+	0x00,0xcf,0x86,0xe5,0x16,0x01,0xd4,0x8f,0xd3,0x44,0xd2,0x21,0xd1,0x0d,0x10,0x04,
+	0x01,0x00,0x01,0xff,0xc2,0xa8,0xcd,0x82,0x00,0x10,0x0b,0x01,0xff,0xce,0xb7,0xcc,
+	0x80,0xcd,0x85,0x00,0x01,0xff,0xce,0xb7,0xcd,0x85,0x00,0xd1,0x0f,0x10,0x0b,0x01,
+	0xff,0xce,0xb7,0xcc,0x81,0xcd,0x85,0x00,0x00,0x00,0x10,0x09,0x01,0xff,0xce,0xb7,
+	0xcd,0x82,0x00,0x01,0xff,0xce,0xb7,0xcd,0x82,0xcd,0x85,0x00,0xd2,0x24,0xd1,0x12,
+	0x10,0x09,0x01,0xff,0xce,0x95,0xcc,0x80,0x00,0x01,0xff,0xce,0x95,0xcc,0x81,0x00,
+	0x10,0x09,0x01,0xff,0xce,0x97,0xcc,0x80,0x00,0x01,0xff,0xce,0x97,0xcc,0x81,0x00,
+	0xd1,0x13,0x10,0x09,0x01,0xff,0xce,0x97,0xcd,0x85,0x00,0x01,0xff,0xe1,0xbe,0xbf,
+	0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,0xe1,0xbe,0xbf,0xcc,0x81,0x00,0x01,0xff,0xe1,
+	0xbe,0xbf,0xcd,0x82,0x00,0xd3,0x40,0xd2,0x28,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,
+	0xb9,0xcc,0x86,0x00,0x01,0xff,0xce,0xb9,0xcc,0x84,0x00,0x10,0x0b,0x01,0xff,0xce,
+	0xb9,0xcc,0x88,0xcc,0x80,0x00,0x01,0xff,0xce,0xb9,0xcc,0x88,0xcc,0x81,0x00,0x51,
+	0x04,0x00,0x00,0x10,0x09,0x01,0xff,0xce,0xb9,0xcd,0x82,0x00,0x01,0xff,0xce,0xb9,
+	0xcc,0x88,0xcd,0x82,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,0x99,0xcc,
+	0x86,0x00,0x01,0xff,0xce,0x99,0xcc,0x84,0x00,0x10,0x09,0x01,0xff,0xce,0x99,0xcc,
+	0x80,0x00,0x01,0xff,0xce,0x99,0xcc,0x81,0x00,0xd1,0x0e,0x10,0x04,0x00,0x00,0x01,
+	0xff,0xe1,0xbf,0xbe,0xcc,0x80,0x00,0x10,0x0a,0x01,0xff,0xe1,0xbf,0xbe,0xcc,0x81,
+	0x00,0x01,0xff,0xe1,0xbf,0xbe,0xcd,0x82,0x00,0xd4,0x93,0xd3,0x4e,0xd2,0x28,0xd1,
+	0x12,0x10,0x09,0x01,0xff,0xcf,0x85,0xcc,0x86,0x00,0x01,0xff,0xcf,0x85,0xcc,0x84,
+	0x00,0x10,0x0b,0x01,0xff,0xcf,0x85,0xcc,0x88,0xcc,0x80,0x00,0x01,0xff,0xcf,0x85,
+	0xcc,0x88,0xcc,0x81,0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xcf,0x81,0xcc,0x93,0x00,
+	0x01,0xff,0xcf,0x81,0xcc,0x94,0x00,0x10,0x09,0x01,0xff,0xcf,0x85,0xcd,0x82,0x00,
+	0x01,0xff,0xcf,0x85,0xcc,0x88,0xcd,0x82,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,
+	0xff,0xce,0xa5,0xcc,0x86,0x00,0x01,0xff,0xce,0xa5,0xcc,0x84,0x00,0x10,0x09,0x01,
+	0xff,0xce,0xa5,0xcc,0x80,0x00,0x01,0xff,0xce,0xa5,0xcc,0x81,0x00,0xd1,0x12,0x10,
+	0x09,0x01,0xff,0xce,0xa1,0xcc,0x94,0x00,0x01,0xff,0xc2,0xa8,0xcc,0x80,0x00,0x10,
+	0x09,0x01,0xff,0xc2,0xa8,0xcc,0x81,0x00,0x01,0xff,0x60,0x00,0xd3,0x3b,0xd2,0x18,
+	0x51,0x04,0x00,0x00,0x10,0x0b,0x01,0xff,0xcf,0x89,0xcc,0x80,0xcd,0x85,0x00,0x01,
+	0xff,0xcf,0x89,0xcd,0x85,0x00,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xcf,0x89,0xcc,0x81,
+	0xcd,0x85,0x00,0x00,0x00,0x10,0x09,0x01,0xff,0xcf,0x89,0xcd,0x82,0x00,0x01,0xff,
+	0xcf,0x89,0xcd,0x82,0xcd,0x85,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xce,
+	0x9f,0xcc,0x80,0x00,0x01,0xff,0xce,0x9f,0xcc,0x81,0x00,0x10,0x09,0x01,0xff,0xce,
+	0xa9,0xcc,0x80,0x00,0x01,0xff,0xce,0xa9,0xcc,0x81,0x00,0xd1,0x10,0x10,0x09,0x01,
+	0xff,0xce,0xa9,0xcd,0x85,0x00,0x01,0xff,0xc2,0xb4,0x00,0x10,0x04,0x01,0x00,0x00,
+	0x00,0xe0,0x7e,0x0c,0xcf,0x86,0xe5,0xbb,0x08,0xe4,0x14,0x06,0xe3,0xf7,0x02,0xe2,
+	0xbd,0x01,0xd1,0xd0,0xd0,0x4f,0xcf,0x86,0xd5,0x2e,0x94,0x2a,0xd3,0x18,0x92,0x14,
+	0x91,0x10,0x10,0x08,0x01,0xff,0xe2,0x80,0x82,0x00,0x01,0xff,0xe2,0x80,0x83,0x00,
+	0x01,0x00,0x01,0x00,0x92,0x0d,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x01,0xff,
+	0x00,0x01,0xff,0x00,0x01,0x00,0x94,0x1b,0x53,0x04,0x01,0x00,0xd2,0x09,0x11,0x04,
+	0x01,0x00,0x01,0xff,0x00,0x51,0x05,0x01,0xff,0x00,0x10,0x05,0x01,0xff,0x00,0x04,
+	0x00,0x01,0x00,0xcf,0x86,0xd5,0x48,0xd4,0x1c,0xd3,0x10,0x52,0x04,0x01,0x00,0x51,
+	0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x06,0x00,0x52,0x04,0x04,0x00,0x11,0x04,0x04,
+	0x00,0x06,0x00,0xd3,0x1c,0xd2,0x0c,0x51,0x04,0x06,0x00,0x10,0x04,0x06,0x00,0x07,
+	0x00,0xd1,0x08,0x10,0x04,0x07,0x00,0x08,0x00,0x10,0x04,0x08,0x00,0x06,0x00,0x52,
+	0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x06,0x00,0xd4,0x23,0xd3,
+	0x14,0x52,0x05,0x06,0xff,0x00,0x91,0x0a,0x10,0x05,0x0a,0xff,0x00,0x00,0xff,0x00,
+	0x0f,0xff,0x00,0x92,0x0a,0x11,0x05,0x0f,0xff,0x00,0x01,0xff,0x00,0x01,0xff,0x00,
+	0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,0x00,0x06,0x00,0x00,0x00,0x01,0x00,
+	0x01,0x00,0xd0,0x7e,0xcf,0x86,0xd5,0x34,0xd4,0x14,0x53,0x04,0x01,0x00,0x52,0x04,
+	0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0xd3,0x10,0x52,0x04,
+	0x08,0x00,0x91,0x08,0x10,0x04,0x08,0x00,0x0c,0x00,0x0c,0x00,0x52,0x04,0x0c,0x00,
+	0x91,0x08,0x10,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0xd4,0x1c,0x53,0x04,0x01,0x00,
+	0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x02,0x00,0x91,0x08,0x10,0x04,
+	0x03,0x00,0x04,0x00,0x04,0x00,0xd3,0x10,0xd2,0x08,0x11,0x04,0x06,0x00,0x08,0x00,
+	0x11,0x04,0x08,0x00,0x0b,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x0b,0x00,0x0c,0x00,
+	0x10,0x04,0x0e,0x00,0x10,0x00,0x51,0x04,0x10,0x00,0x10,0x04,0x11,0x00,0x13,0x00,
+	0xcf,0x86,0xd5,0x28,0x54,0x04,0x00,0x00,0xd3,0x0c,0x92,0x08,0x11,0x04,0x01,0xe6,
+	0x01,0x01,0x01,0xe6,0xd2,0x0c,0x51,0x04,0x01,0x01,0x10,0x04,0x01,0x01,0x01,0xe6,
+	0x91,0x08,0x10,0x04,0x01,0xe6,0x01,0x00,0x01,0x00,0xd4,0x30,0xd3,0x1c,0xd2,0x0c,
+	0x91,0x08,0x10,0x04,0x01,0x00,0x01,0xe6,0x04,0x00,0xd1,0x08,0x10,0x04,0x06,0x00,
+	0x06,0x01,0x10,0x04,0x06,0x01,0x06,0xe6,0x92,0x10,0xd1,0x08,0x10,0x04,0x06,0xdc,
+	0x06,0xe6,0x10,0x04,0x06,0x01,0x08,0x01,0x09,0xdc,0x93,0x10,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x0a,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x81,0xd0,0x4f,
+	0xcf,0x86,0x55,0x04,0x01,0x00,0xd4,0x29,0xd3,0x13,0x52,0x04,0x01,0x00,0x51,0x04,
+	0x01,0x00,0x10,0x07,0x01,0xff,0xce,0xa9,0x00,0x01,0x00,0x92,0x12,0x51,0x04,0x01,
+	0x00,0x10,0x06,0x01,0xff,0x4b,0x00,0x01,0xff,0x41,0xcc,0x8a,0x00,0x01,0x00,0x53,
+	0x04,0x01,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x01,0x00,0x04,0x00,0x10,0x04,0x04,
+	0x00,0x07,0x00,0x91,0x08,0x10,0x04,0x08,0x00,0x06,0x00,0x06,0x00,0xcf,0x86,0x95,
+	0x2c,0xd4,0x18,0x53,0x04,0x06,0x00,0x52,0x04,0x06,0x00,0xd1,0x08,0x10,0x04,0x08,
+	0x00,0x09,0x00,0x10,0x04,0x09,0x00,0x0a,0x00,0x93,0x10,0x92,0x0c,0x51,0x04,0x0b,
+	0x00,0x10,0x04,0x0b,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd0,0x68,0xcf,
+	0x86,0xd5,0x48,0xd4,0x28,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,
+	0x00,0x04,0x00,0x91,0x08,0x10,0x04,0x09,0x00,0x0a,0x00,0x0a,0x00,0x92,0x0c,0x91,
+	0x08,0x10,0x04,0x0a,0x00,0x0b,0x00,0x11,0x00,0x00,0x00,0x53,0x04,0x01,0x00,0x92,
+	0x18,0x51,0x04,0x01,0x00,0x10,0x0a,0x01,0xff,0xe2,0x86,0x90,0xcc,0xb8,0x00,0x01,
+	0xff,0xe2,0x86,0x92,0xcc,0xb8,0x00,0x01,0x00,0x94,0x1a,0x53,0x04,0x01,0x00,0x52,
+	0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x0a,0x01,0xff,0xe2,0x86,0x94,0xcc,0xb8,
+	0x00,0x01,0x00,0x01,0x00,0xcf,0x86,0xd5,0x2e,0x94,0x2a,0x53,0x04,0x01,0x00,0x52,
+	0x04,0x01,0x00,0xd1,0x0e,0x10,0x04,0x01,0x00,0x01,0xff,0xe2,0x87,0x90,0xcc,0xb8,
+	0x00,0x10,0x0a,0x01,0xff,0xe2,0x87,0x94,0xcc,0xb8,0x00,0x01,0xff,0xe2,0x87,0x92,
+	0xcc,0xb8,0x00,0x01,0x00,0xd4,0x14,0x53,0x04,0x01,0x00,0x92,0x0c,0x51,0x04,0x01,
+	0x00,0x10,0x04,0x01,0x00,0x04,0x00,0x04,0x00,0x93,0x08,0x12,0x04,0x04,0x00,0x06,
+	0x00,0x06,0x00,0xe2,0x38,0x02,0xe1,0x3f,0x01,0xd0,0x68,0xcf,0x86,0xd5,0x3e,0x94,
+	0x3a,0xd3,0x16,0x52,0x04,0x01,0x00,0x91,0x0e,0x10,0x0a,0x01,0xff,0xe2,0x88,0x83,
+	0xcc,0xb8,0x00,0x01,0x00,0x01,0x00,0xd2,0x12,0x91,0x0e,0x10,0x04,0x01,0x00,0x01,
+	0xff,0xe2,0x88,0x88,0xcc,0xb8,0x00,0x01,0x00,0x91,0x0e,0x10,0x0a,0x01,0xff,0xe2,
+	0x88,0x8b,0xcc,0xb8,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x94,0x24,0x93,0x20,0x52,
+	0x04,0x01,0x00,0xd1,0x0e,0x10,0x0a,0x01,0xff,0xe2,0x88,0xa3,0xcc,0xb8,0x00,0x01,
+	0x00,0x10,0x0a,0x01,0xff,0xe2,0x88,0xa5,0xcc,0xb8,0x00,0x01,0x00,0x01,0x00,0x01,
+	0x00,0xcf,0x86,0xd5,0x48,0x94,0x44,0xd3,0x2e,0xd2,0x12,0x91,0x0e,0x10,0x04,0x01,
+	0x00,0x01,0xff,0xe2,0x88,0xbc,0xcc,0xb8,0x00,0x01,0x00,0xd1,0x0e,0x10,0x0a,0x01,
+	0xff,0xe2,0x89,0x83,0xcc,0xb8,0x00,0x01,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0xe2,
+	0x89,0x85,0xcc,0xb8,0x00,0x92,0x12,0x91,0x0e,0x10,0x04,0x01,0x00,0x01,0xff,0xe2,
+	0x89,0x88,0xcc,0xb8,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd4,0x40,0xd3,0x1e,0x92,
+	0x1a,0xd1,0x0c,0x10,0x08,0x01,0xff,0x3d,0xcc,0xb8,0x00,0x01,0x00,0x10,0x0a,0x01,
+	0xff,0xe2,0x89,0xa1,0xcc,0xb8,0x00,0x01,0x00,0x01,0x00,0x52,0x04,0x01,0x00,0xd1,
+	0x0e,0x10,0x04,0x01,0x00,0x01,0xff,0xe2,0x89,0x8d,0xcc,0xb8,0x00,0x10,0x08,0x01,
+	0xff,0x3c,0xcc,0xb8,0x00,0x01,0xff,0x3e,0xcc,0xb8,0x00,0xd3,0x30,0xd2,0x18,0x91,
+	0x14,0x10,0x0a,0x01,0xff,0xe2,0x89,0xa4,0xcc,0xb8,0x00,0x01,0xff,0xe2,0x89,0xa5,
+	0xcc,0xb8,0x00,0x01,0x00,0x91,0x14,0x10,0x0a,0x01,0xff,0xe2,0x89,0xb2,0xcc,0xb8,
+	0x00,0x01,0xff,0xe2,0x89,0xb3,0xcc,0xb8,0x00,0x01,0x00,0x92,0x18,0x91,0x14,0x10,
+	0x0a,0x01,0xff,0xe2,0x89,0xb6,0xcc,0xb8,0x00,0x01,0xff,0xe2,0x89,0xb7,0xcc,0xb8,
+	0x00,0x01,0x00,0x01,0x00,0xd0,0x86,0xcf,0x86,0xd5,0x50,0x94,0x4c,0xd3,0x30,0xd2,
+	0x18,0x91,0x14,0x10,0x0a,0x01,0xff,0xe2,0x89,0xba,0xcc,0xb8,0x00,0x01,0xff,0xe2,
+	0x89,0xbb,0xcc,0xb8,0x00,0x01,0x00,0x91,0x14,0x10,0x0a,0x01,0xff,0xe2,0x8a,0x82,
+	0xcc,0xb8,0x00,0x01,0xff,0xe2,0x8a,0x83,0xcc,0xb8,0x00,0x01,0x00,0x92,0x18,0x91,
+	0x14,0x10,0x0a,0x01,0xff,0xe2,0x8a,0x86,0xcc,0xb8,0x00,0x01,0xff,0xe2,0x8a,0x87,
+	0xcc,0xb8,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x94,0x30,0x53,0x04,0x01,0x00,0x52,
+	0x04,0x01,0x00,0xd1,0x14,0x10,0x0a,0x01,0xff,0xe2,0x8a,0xa2,0xcc,0xb8,0x00,0x01,
+	0xff,0xe2,0x8a,0xa8,0xcc,0xb8,0x00,0x10,0x0a,0x01,0xff,0xe2,0x8a,0xa9,0xcc,0xb8,
+	0x00,0x01,0xff,0xe2,0x8a,0xab,0xcc,0xb8,0x00,0x01,0x00,0xcf,0x86,0x55,0x04,0x01,
+	0x00,0xd4,0x5c,0xd3,0x2c,0x92,0x28,0xd1,0x14,0x10,0x0a,0x01,0xff,0xe2,0x89,0xbc,
+	0xcc,0xb8,0x00,0x01,0xff,0xe2,0x89,0xbd,0xcc,0xb8,0x00,0x10,0x0a,0x01,0xff,0xe2,
+	0x8a,0x91,0xcc,0xb8,0x00,0x01,0xff,0xe2,0x8a,0x92,0xcc,0xb8,0x00,0x01,0x00,0xd2,
+	0x18,0x51,0x04,0x01,0x00,0x10,0x0a,0x01,0xff,0xe2,0x8a,0xb2,0xcc,0xb8,0x00,0x01,
+	0xff,0xe2,0x8a,0xb3,0xcc,0xb8,0x00,0x91,0x14,0x10,0x0a,0x01,0xff,0xe2,0x8a,0xb4,
+	0xcc,0xb8,0x00,0x01,0xff,0xe2,0x8a,0xb5,0xcc,0xb8,0x00,0x01,0x00,0x93,0x0c,0x92,
+	0x08,0x11,0x04,0x01,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xd1,0x64,0xd0,0x3e,0xcf,
+	0x86,0xd5,0x18,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,0x00,0x04,
+	0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x94,0x20,0x53,0x04,0x01,0x00,0x92,
+	0x18,0xd1,0x0c,0x10,0x04,0x01,0x00,0x01,0xff,0xe3,0x80,0x88,0x00,0x10,0x08,0x01,
+	0xff,0xe3,0x80,0x89,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xcf,0x86,0x55,0x04,0x01,
+	0x00,0x54,0x04,0x01,0x00,0x53,0x04,0x01,0x00,0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,
+	0x04,0x01,0x00,0x04,0x00,0x91,0x08,0x10,0x04,0x06,0x00,0x04,0x00,0x04,0x00,0xd0,
+	0x1e,0xcf,0x86,0x95,0x18,0x54,0x04,0x04,0x00,0x53,0x04,0x04,0x00,0x92,0x0c,0x51,
+	0x04,0x04,0x00,0x10,0x04,0x04,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xcf,0x86,0xd5,
+	0x2c,0xd4,0x14,0x53,0x04,0x06,0x00,0x52,0x04,0x06,0x00,0x51,0x04,0x06,0x00,0x10,
+	0x04,0x06,0x00,0x07,0x00,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x07,0x00,0x08,
+	0x00,0x08,0x00,0x08,0x00,0x12,0x04,0x08,0x00,0x09,0x00,0xd4,0x14,0x53,0x04,0x09,
+	0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x0b,0x00,0x0c,0x00,0x0c,0x00,0x0c,0x00,0xd3,
+	0x08,0x12,0x04,0x0c,0x00,0x10,0x00,0xd2,0x0c,0x51,0x04,0x10,0x00,0x10,0x04,0x10,
+	0x00,0x12,0x00,0x51,0x04,0x12,0x00,0x10,0x04,0x12,0x00,0x13,0x00,0xd3,0xa6,0xd2,
+	0x74,0xd1,0x40,0xd0,0x22,0xcf,0x86,0x55,0x04,0x01,0x00,0x94,0x18,0x93,0x14,0x52,
+	0x04,0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x04,0x00,0x10,0x04,0x04,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0x95,0x18,0x94,0x14,0x53,0x04,0x01,0x00,0x92,
+	0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+	0x00,0xd0,0x06,0xcf,0x06,0x01,0x00,0xcf,0x86,0x55,0x04,0x01,0x00,0xd4,0x14,0x53,
+	0x04,0x01,0x00,0x92,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x06,0x00,0x06,
+	0x00,0x53,0x04,0x06,0x00,0x52,0x04,0x06,0x00,0x51,0x04,0x06,0x00,0x10,0x04,0x06,
+	0x00,0x07,0x00,0xd1,0x06,0xcf,0x06,0x01,0x00,0xd0,0x1a,0xcf,0x86,0x95,0x14,0x54,
+	0x04,0x01,0x00,0x93,0x0c,0x52,0x04,0x01,0x00,0x11,0x04,0x01,0x00,0x06,0x00,0x06,
+	0x00,0x01,0x00,0xcf,0x86,0x55,0x04,0x01,0x00,0x54,0x04,0x01,0x00,0x13,0x04,0x04,
+	0x00,0x06,0x00,0xd2,0xdc,0xd1,0x48,0xd0,0x26,0xcf,0x86,0x95,0x20,0x54,0x04,0x01,
+	0x00,0xd3,0x0c,0x52,0x04,0x01,0x00,0x11,0x04,0x07,0x00,0x06,0x00,0x92,0x0c,0x91,
+	0x08,0x10,0x04,0x08,0x00,0x04,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xcf,0x86,0x55,
+	0x04,0x01,0x00,0x54,0x04,0x01,0x00,0xd3,0x0c,0x92,0x08,0x11,0x04,0x04,0x00,0x06,
+	0x00,0x06,0x00,0x52,0x04,0x06,0x00,0x11,0x04,0x06,0x00,0x08,0x00,0xd0,0x5e,0xcf,
+	0x86,0xd5,0x2c,0xd4,0x10,0x53,0x04,0x06,0x00,0x92,0x08,0x11,0x04,0x06,0x00,0x07,
+	0x00,0x07,0x00,0xd3,0x0c,0x92,0x08,0x11,0x04,0x07,0x00,0x08,0x00,0x08,0x00,0x52,
+	0x04,0x08,0x00,0x91,0x08,0x10,0x04,0x08,0x00,0x0a,0x00,0x0b,0x00,0xd4,0x10,0x93,
+	0x0c,0x92,0x08,0x11,0x04,0x07,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0xd3,0x10,0x92,
+	0x0c,0x51,0x04,0x08,0x00,0x10,0x04,0x09,0x00,0x0a,0x00,0x0a,0x00,0x52,0x04,0x0a,
+	0x00,0x91,0x08,0x10,0x04,0x0a,0x00,0x0b,0x00,0x0b,0x00,0xcf,0x86,0xd5,0x1c,0x94,
+	0x18,0xd3,0x08,0x12,0x04,0x0a,0x00,0x0b,0x00,0x52,0x04,0x0b,0x00,0x51,0x04,0x0b,
+	0x00,0x10,0x04,0x0c,0x00,0x0b,0x00,0x0b,0x00,0x94,0x14,0x93,0x10,0x92,0x0c,0x51,
+	0x04,0x0b,0x00,0x10,0x04,0x0c,0x00,0x0b,0x00,0x0c,0x00,0x0b,0x00,0x0b,0x00,0xd1,
+	0xa8,0xd0,0x42,0xcf,0x86,0xd5,0x28,0x94,0x24,0xd3,0x18,0xd2,0x0c,0x91,0x08,0x10,
+	0x04,0x10,0x00,0x01,0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x01,0x00,0x0c,0x00,0x01,
+	0x00,0x92,0x08,0x11,0x04,0x01,0x00,0x0c,0x00,0x01,0x00,0x01,0x00,0x94,0x14,0x53,
+	0x04,0x01,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x0c,0x00,0x01,0x00,0x01,0x00,0x01,
+	0x00,0x01,0x00,0xcf,0x86,0xd5,0x40,0xd4,0x18,0x53,0x04,0x01,0x00,0x52,0x04,0x01,
+	0x00,0xd1,0x08,0x10,0x04,0x0c,0x00,0x01,0x00,0x10,0x04,0x0c,0x00,0x01,0x00,0xd3,
+	0x18,0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x0c,0x00,0x51,0x04,0x0c,
+	0x00,0x10,0x04,0x01,0x00,0x0b,0x00,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,
+	0x04,0x01,0x00,0x0c,0x00,0xd4,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x0c,
+	0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x06,0x00,0x93,0x0c,0x52,0x04,0x06,0x00,0x11,
+	0x04,0x06,0x00,0x01,0x00,0x01,0x00,0xd0,0x3e,0xcf,0x86,0xd5,0x18,0x54,0x04,0x01,
+	0x00,0x93,0x10,0x52,0x04,0x01,0x00,0x91,0x08,0x10,0x04,0x01,0x00,0x0c,0x00,0x0c,
+	0x00,0x01,0x00,0x54,0x04,0x01,0x00,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x0c,
+	0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,
+	0x04,0x01,0x00,0x0c,0x00,0xcf,0x86,0xd5,0x2c,0x94,0x28,0xd3,0x10,0x52,0x04,0x08,
+	0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x09,0x00,0xd2,0x0c,0x51,0x04,0x09,
+	0x00,0x10,0x04,0x09,0x00,0x0d,0x00,0x91,0x08,0x10,0x04,0x0a,0x00,0x0d,0x00,0x0c,
+	0x00,0x06,0x00,0x94,0x0c,0x53,0x04,0x06,0x00,0x12,0x04,0x06,0x00,0x0a,0x00,0x06,
+	0x00,0xe4,0x39,0x01,0xd3,0x0c,0xd2,0x06,0xcf,0x06,0x04,0x00,0xcf,0x06,0x06,0x00,
+	0xd2,0x30,0xd1,0x06,0xcf,0x06,0x06,0x00,0xd0,0x06,0xcf,0x06,0x06,0x00,0xcf,0x86,
+	0x95,0x1e,0x54,0x04,0x06,0x00,0x53,0x04,0x06,0x00,0x52,0x04,0x06,0x00,0x91,0x0e,
+	0x10,0x0a,0x06,0xff,0xe2,0xab,0x9d,0xcc,0xb8,0x00,0x06,0x00,0x06,0x00,0x06,0x00,
+	0xd1,0x80,0xd0,0x3a,0xcf,0x86,0xd5,0x28,0xd4,0x10,0x53,0x04,0x07,0x00,0x52,0x04,
+	0x07,0x00,0x11,0x04,0x07,0x00,0x08,0x00,0xd3,0x08,0x12,0x04,0x08,0x00,0x09,0x00,
+	0x92,0x0c,0x51,0x04,0x09,0x00,0x10,0x04,0x09,0x00,0x0a,0x00,0x0a,0x00,0x94,0x0c,
+	0x93,0x08,0x12,0x04,0x09,0x00,0x0a,0x00,0x0a,0x00,0x0a,0x00,0xcf,0x86,0xd5,0x30,
+	0xd4,0x14,0x53,0x04,0x0a,0x00,0x52,0x04,0x0a,0x00,0x91,0x08,0x10,0x04,0x0a,0x00,
+	0x10,0x00,0x10,0x00,0xd3,0x10,0x52,0x04,0x0a,0x00,0x91,0x08,0x10,0x04,0x0a,0x00,
+	0x0b,0x00,0x0b,0x00,0x92,0x08,0x11,0x04,0x0b,0x00,0x10,0x00,0x10,0x00,0x54,0x04,
+	0x10,0x00,0x93,0x0c,0x52,0x04,0x10,0x00,0x11,0x04,0x00,0x00,0x10,0x00,0x10,0x00,
+	0xd0,0x32,0xcf,0x86,0xd5,0x14,0x54,0x04,0x10,0x00,0x93,0x0c,0x52,0x04,0x10,0x00,
+	0x11,0x04,0x10,0x00,0x00,0x00,0x10,0x00,0x54,0x04,0x10,0x00,0x53,0x04,0x10,0x00,
+	0xd2,0x08,0x11,0x04,0x10,0x00,0x14,0x00,0x91,0x08,0x10,0x04,0x14,0x00,0x10,0x00,
+	0x10,0x00,0xcf,0x86,0xd5,0x28,0xd4,0x14,0x53,0x04,0x10,0x00,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x10,0x00,0x15,0x00,0x10,0x00,0x10,0x00,0x93,0x10,0x92,0x0c,0x51,0x04,
+	0x10,0x00,0x10,0x04,0x13,0x00,0x14,0x00,0x14,0x00,0x14,0x00,0xd4,0x0c,0x53,0x04,
+	0x14,0x00,0x12,0x04,0x14,0x00,0x11,0x00,0x53,0x04,0x14,0x00,0x52,0x04,0x14,0x00,
+	0x51,0x04,0x14,0x00,0x10,0x04,0x14,0x00,0x15,0x00,0xe3,0xb9,0x01,0xd2,0xac,0xd1,
+	0x68,0xd0,0x1e,0xcf,0x86,0x55,0x04,0x08,0x00,0x94,0x14,0x53,0x04,0x08,0x00,0x52,
+	0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x00,0x00,0x08,0x00,0xcf,
+	0x86,0xd5,0x18,0x54,0x04,0x08,0x00,0x53,0x04,0x08,0x00,0x52,0x04,0x08,0x00,0x51,
+	0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x00,0x00,0xd4,0x14,0x53,0x04,0x09,0x00,0x52,
+	0x04,0x09,0x00,0x91,0x08,0x10,0x04,0x09,0x00,0x0a,0x00,0x0a,0x00,0xd3,0x10,0x92,
+	0x0c,0x91,0x08,0x10,0x04,0x0b,0x00,0x0a,0x00,0x0a,0x00,0x09,0x00,0x52,0x04,0x0a,
+	0x00,0x11,0x04,0x0a,0x00,0x0b,0x00,0xd0,0x06,0xcf,0x06,0x08,0x00,0xcf,0x86,0x55,
+	0x04,0x08,0x00,0xd4,0x1c,0x53,0x04,0x08,0x00,0xd2,0x0c,0x51,0x04,0x08,0x00,0x10,
+	0x04,0x08,0x00,0x0b,0x00,0x51,0x04,0x0b,0x00,0x10,0x04,0x0b,0x00,0x0b,0xe6,0xd3,
+	0x0c,0x92,0x08,0x11,0x04,0x0b,0xe6,0x0d,0x00,0x00,0x00,0x92,0x0c,0x91,0x08,0x10,
+	0x04,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0xd1,0x6c,0xd0,0x2a,0xcf,0x86,0x55,
+	0x04,0x08,0x00,0x94,0x20,0xd3,0x10,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,
+	0x04,0x00,0x00,0x0d,0x00,0x52,0x04,0x00,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x0d,
+	0x00,0x00,0x00,0x08,0x00,0xcf,0x86,0x55,0x04,0x08,0x00,0xd4,0x1c,0xd3,0x0c,0x52,
+	0x04,0x08,0x00,0x11,0x04,0x08,0x00,0x0d,0x00,0x52,0x04,0x00,0x00,0x51,0x04,0x00,
+	0x00,0x10,0x04,0x00,0x00,0x08,0x00,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x0c,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x04,0x00,0x00,0x51,0x04,0x00,0x00,0x10,
+	0x04,0x00,0x00,0x0c,0x09,0xd0,0x5a,0xcf,0x86,0xd5,0x18,0x54,0x04,0x08,0x00,0x93,
+	0x10,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x00,0x00,0x00,
+	0x00,0xd4,0x20,0xd3,0x10,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,
+	0x00,0x00,0x00,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x00,
+	0x00,0xd3,0x10,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x00,
+	0x00,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x00,0x00,0xcf,
+	0x86,0x95,0x40,0xd4,0x20,0xd3,0x10,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,
+	0x04,0x08,0x00,0x00,0x00,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,
+	0x00,0x00,0x00,0xd3,0x10,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,
+	0x00,0x00,0x00,0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x00,
+	0x00,0x0a,0xe6,0xd2,0x9c,0xd1,0x68,0xd0,0x32,0xcf,0x86,0xd5,0x14,0x54,0x04,0x08,
+	0x00,0x53,0x04,0x08,0x00,0x52,0x04,0x0a,0x00,0x11,0x04,0x08,0x00,0x0a,0x00,0x54,
+	0x04,0x0a,0x00,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x0a,0x00,0x0b,0x00,0x0d,
+	0x00,0x0d,0x00,0x12,0x04,0x0d,0x00,0x10,0x00,0xcf,0x86,0x95,0x30,0x94,0x2c,0xd3,
+	0x18,0xd2,0x0c,0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x00,0x12,0x00,0x91,0x08,0x10,
+	0x04,0x12,0x00,0x13,0x00,0x13,0x00,0xd2,0x08,0x11,0x04,0x13,0x00,0x14,0x00,0x51,
+	0x04,0x14,0x00,0x10,0x04,0x14,0x00,0x15,0x00,0x00,0x00,0x00,0x00,0xd0,0x1e,0xcf,
+	0x86,0x95,0x18,0x54,0x04,0x04,0x00,0x53,0x04,0x04,0x00,0x92,0x0c,0x51,0x04,0x04,
+	0x00,0x10,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xcf,0x86,0x55,0x04,0x04,
+	0x00,0x54,0x04,0x04,0x00,0x93,0x08,0x12,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0xd1,
+	0x06,0xcf,0x06,0x04,0x00,0xd0,0x06,0xcf,0x06,0x04,0x00,0xcf,0x86,0xd5,0x14,0x54,
+	0x04,0x04,0x00,0x93,0x0c,0x52,0x04,0x04,0x00,0x11,0x04,0x04,0x00,0x00,0x00,0x00,
+	0x00,0x54,0x04,0x00,0x00,0x53,0x04,0x04,0x00,0x12,0x04,0x04,0x00,0x00,0x00,0xcf,
+	0x86,0xe5,0xa6,0x05,0xe4,0x9f,0x05,0xe3,0x96,0x04,0xe2,0xe4,0x03,0xe1,0xc0,0x01,
+	0xd0,0x3e,0xcf,0x86,0x55,0x04,0x01,0x00,0xd4,0x1c,0x53,0x04,0x01,0x00,0xd2,0x0c,
+	0x51,0x04,0x01,0x00,0x10,0x04,0x01,0xda,0x01,0xe4,0x91,0x08,0x10,0x04,0x01,0xe8,
+	0x01,0xde,0x01,0xe0,0x53,0x04,0x01,0x00,0xd2,0x0c,0x51,0x04,0x04,0x00,0x10,0x04,
+	0x04,0x00,0x06,0x00,0x51,0x04,0x06,0x00,0x10,0x04,0x04,0x00,0x01,0x00,0xcf,0x86,
+	0xd5,0xaa,0xd4,0x32,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x01,0x00,
+	0x01,0x00,0x01,0x00,0x52,0x04,0x01,0x00,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,0x81,
+	0x8b,0xe3,0x82,0x99,0x00,0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x81,0x8d,0xe3,0x82,
+	0x99,0x00,0x01,0x00,0xd3,0x3c,0xd2,0x1e,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,0x81,
+	0x8f,0xe3,0x82,0x99,0x00,0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x81,0x91,0xe3,0x82,
+	0x99,0x00,0x01,0x00,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,0x81,0x93,0xe3,0x82,0x99,
+	0x00,0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x81,0x95,0xe3,0x82,0x99,0x00,0x01,0x00,
+	0xd2,0x1e,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,0x81,0x97,0xe3,0x82,0x99,0x00,0x01,
+	0x00,0x10,0x0b,0x01,0xff,0xe3,0x81,0x99,0xe3,0x82,0x99,0x00,0x01,0x00,0xd1,0x0f,
+	0x10,0x0b,0x01,0xff,0xe3,0x81,0x9b,0xe3,0x82,0x99,0x00,0x01,0x00,0x10,0x0b,0x01,
+	0xff,0xe3,0x81,0x9d,0xe3,0x82,0x99,0x00,0x01,0x00,0xd4,0x53,0xd3,0x3c,0xd2,0x1e,
+	0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,0x81,0x9f,0xe3,0x82,0x99,0x00,0x01,0x00,0x10,
+	0x0b,0x01,0xff,0xe3,0x81,0xa1,0xe3,0x82,0x99,0x00,0x01,0x00,0xd1,0x0f,0x10,0x04,
+	0x01,0x00,0x01,0xff,0xe3,0x81,0xa4,0xe3,0x82,0x99,0x00,0x10,0x04,0x01,0x00,0x01,
+	0xff,0xe3,0x81,0xa6,0xe3,0x82,0x99,0x00,0x92,0x13,0x91,0x0f,0x10,0x04,0x01,0x00,
+	0x01,0xff,0xe3,0x81,0xa8,0xe3,0x82,0x99,0x00,0x01,0x00,0x01,0x00,0xd3,0x4a,0xd2,
+	0x25,0xd1,0x16,0x10,0x0b,0x01,0xff,0xe3,0x81,0xaf,0xe3,0x82,0x99,0x00,0x01,0xff,
+	0xe3,0x81,0xaf,0xe3,0x82,0x9a,0x00,0x10,0x04,0x01,0x00,0x01,0xff,0xe3,0x81,0xb2,
+	0xe3,0x82,0x99,0x00,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,0x81,0xb2,0xe3,0x82,0x9a,
+	0x00,0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x81,0xb5,0xe3,0x82,0x99,0x00,0x01,0xff,
+	0xe3,0x81,0xb5,0xe3,0x82,0x9a,0x00,0xd2,0x1e,0xd1,0x0f,0x10,0x04,0x01,0x00,0x01,
+	0xff,0xe3,0x81,0xb8,0xe3,0x82,0x99,0x00,0x10,0x0b,0x01,0xff,0xe3,0x81,0xb8,0xe3,
+	0x82,0x9a,0x00,0x01,0x00,0x91,0x16,0x10,0x0b,0x01,0xff,0xe3,0x81,0xbb,0xe3,0x82,
+	0x99,0x00,0x01,0xff,0xe3,0x81,0xbb,0xe3,0x82,0x9a,0x00,0x01,0x00,0xd0,0xee,0xcf,
+	0x86,0xd5,0x42,0x54,0x04,0x01,0x00,0xd3,0x1b,0x52,0x04,0x01,0x00,0xd1,0x0f,0x10,
+	0x0b,0x01,0xff,0xe3,0x81,0x86,0xe3,0x82,0x99,0x00,0x06,0x00,0x10,0x04,0x06,0x00,
+	0x00,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x00,0x00,0x01,0x08,0x10,0x04,0x01,0x08,
+	0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x82,0x9d,0xe3,0x82,0x99,
+	0x00,0x06,0x00,0xd4,0x32,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x06,0x00,0x01,
+	0x00,0x01,0x00,0x01,0x00,0x52,0x04,0x01,0x00,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,
+	0x82,0xab,0xe3,0x82,0x99,0x00,0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x82,0xad,0xe3,
+	0x82,0x99,0x00,0x01,0x00,0xd3,0x3c,0xd2,0x1e,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,
+	0x82,0xaf,0xe3,0x82,0x99,0x00,0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x82,0xb1,0xe3,
+	0x82,0x99,0x00,0x01,0x00,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,0x82,0xb3,0xe3,0x82,
+	0x99,0x00,0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x82,0xb5,0xe3,0x82,0x99,0x00,0x01,
+	0x00,0xd2,0x1e,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,0x82,0xb7,0xe3,0x82,0x99,0x00,
+	0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x82,0xb9,0xe3,0x82,0x99,0x00,0x01,0x00,0xd1,
+	0x0f,0x10,0x0b,0x01,0xff,0xe3,0x82,0xbb,0xe3,0x82,0x99,0x00,0x01,0x00,0x10,0x0b,
+	0x01,0xff,0xe3,0x82,0xbd,0xe3,0x82,0x99,0x00,0x01,0x00,0xcf,0x86,0xd5,0xd5,0xd4,
+	0x53,0xd3,0x3c,0xd2,0x1e,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,0x82,0xbf,0xe3,0x82,
+	0x99,0x00,0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x83,0x81,0xe3,0x82,0x99,0x00,0x01,
+	0x00,0xd1,0x0f,0x10,0x04,0x01,0x00,0x01,0xff,0xe3,0x83,0x84,0xe3,0x82,0x99,0x00,
+	0x10,0x04,0x01,0x00,0x01,0xff,0xe3,0x83,0x86,0xe3,0x82,0x99,0x00,0x92,0x13,0x91,
+	0x0f,0x10,0x04,0x01,0x00,0x01,0xff,0xe3,0x83,0x88,0xe3,0x82,0x99,0x00,0x01,0x00,
+	0x01,0x00,0xd3,0x4a,0xd2,0x25,0xd1,0x16,0x10,0x0b,0x01,0xff,0xe3,0x83,0x8f,0xe3,
+	0x82,0x99,0x00,0x01,0xff,0xe3,0x83,0x8f,0xe3,0x82,0x9a,0x00,0x10,0x04,0x01,0x00,
+	0x01,0xff,0xe3,0x83,0x92,0xe3,0x82,0x99,0x00,0xd1,0x0f,0x10,0x0b,0x01,0xff,0xe3,
+	0x83,0x92,0xe3,0x82,0x9a,0x00,0x01,0x00,0x10,0x0b,0x01,0xff,0xe3,0x83,0x95,0xe3,
+	0x82,0x99,0x00,0x01,0xff,0xe3,0x83,0x95,0xe3,0x82,0x9a,0x00,0xd2,0x1e,0xd1,0x0f,
+	0x10,0x04,0x01,0x00,0x01,0xff,0xe3,0x83,0x98,0xe3,0x82,0x99,0x00,0x10,0x0b,0x01,
+	0xff,0xe3,0x83,0x98,0xe3,0x82,0x9a,0x00,0x01,0x00,0x91,0x16,0x10,0x0b,0x01,0xff,
+	0xe3,0x83,0x9b,0xe3,0x82,0x99,0x00,0x01,0xff,0xe3,0x83,0x9b,0xe3,0x82,0x9a,0x00,
+	0x01,0x00,0x54,0x04,0x01,0x00,0xd3,0x22,0x52,0x04,0x01,0x00,0xd1,0x0f,0x10,0x0b,
+	0x01,0xff,0xe3,0x82,0xa6,0xe3,0x82,0x99,0x00,0x01,0x00,0x10,0x04,0x01,0x00,0x01,
+	0xff,0xe3,0x83,0xaf,0xe3,0x82,0x99,0x00,0xd2,0x25,0xd1,0x16,0x10,0x0b,0x01,0xff,
+	0xe3,0x83,0xb0,0xe3,0x82,0x99,0x00,0x01,0xff,0xe3,0x83,0xb1,0xe3,0x82,0x99,0x00,
+	0x10,0x0b,0x01,0xff,0xe3,0x83,0xb2,0xe3,0x82,0x99,0x00,0x01,0x00,0x51,0x04,0x01,
+	0x00,0x10,0x0b,0x01,0xff,0xe3,0x83,0xbd,0xe3,0x82,0x99,0x00,0x06,0x00,0xd1,0x65,
+	0xd0,0x46,0xcf,0x86,0xd5,0x18,0x94,0x14,0x93,0x10,0x52,0x04,0x00,0x00,0x91,0x08,
+	0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd4,0x18,0x53,0x04,
+	0x01,0x00,0x52,0x04,0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x0a,0x00,0x10,0x04,
+	0x13,0x00,0x14,0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x01,0x00,
+	0x01,0x00,0x01,0x00,0x01,0x00,0xcf,0x86,0x55,0x04,0x01,0x00,0x94,0x15,0x93,0x11,
+	0x52,0x04,0x01,0x00,0x91,0x09,0x10,0x05,0x01,0xff,0x00,0x01,0x00,0x01,0x00,0x01,
+	0x00,0x01,0x00,0xd0,0x32,0xcf,0x86,0xd5,0x18,0x94,0x14,0x53,0x04,0x01,0x00,0x52,
+	0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x54,
+	0x04,0x04,0x00,0x53,0x04,0x04,0x00,0x92,0x0c,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,
+	0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0xd5,0x08,0x14,0x04,0x08,0x00,0x0a,0x00,0x94,
+	0x0c,0x93,0x08,0x12,0x04,0x0a,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0xd2,0xa4,0xd1,
+	0x5c,0xd0,0x22,0xcf,0x86,0x95,0x1c,0x54,0x04,0x01,0x00,0x53,0x04,0x01,0x00,0x52,
+	0x04,0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x07,0x00,0x10,0x04,0x07,0x00,0x00,
+	0x00,0x01,0x00,0xcf,0x86,0xd5,0x20,0xd4,0x0c,0x93,0x08,0x12,0x04,0x01,0x00,0x0b,
+	0x00,0x0b,0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x07,0x00,0x06,0x00,0x06,
+	0x00,0x06,0x00,0x06,0x00,0x54,0x04,0x01,0x00,0x53,0x04,0x01,0x00,0x52,0x04,0x01,
+	0x00,0x51,0x04,0x07,0x00,0x10,0x04,0x08,0x00,0x01,0x00,0xd0,0x1e,0xcf,0x86,0x55,
+	0x04,0x01,0x00,0x54,0x04,0x01,0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x01,
+	0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xcf,0x86,0xd5,0x10,0x94,0x0c,0x53,
+	0x04,0x01,0x00,0x12,0x04,0x01,0x00,0x07,0x00,0x01,0x00,0x54,0x04,0x01,0x00,0x53,
+	0x04,0x01,0x00,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x16,
+	0x00,0xd1,0x30,0xd0,0x06,0xcf,0x06,0x01,0x00,0xcf,0x86,0x55,0x04,0x01,0x00,0x54,
+	0x04,0x01,0x00,0xd3,0x10,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,
+	0x00,0x07,0x00,0x92,0x0c,0x51,0x04,0x07,0x00,0x10,0x04,0x07,0x00,0x01,0x00,0x01,
+	0x00,0xd0,0x06,0xcf,0x06,0x01,0x00,0xcf,0x86,0xd5,0x14,0x54,0x04,0x01,0x00,0x53,
+	0x04,0x01,0x00,0x52,0x04,0x01,0x00,0x11,0x04,0x01,0x00,0x07,0x00,0x54,0x04,0x01,
+	0x00,0x53,0x04,0x01,0x00,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,
+	0x00,0x07,0x00,0xcf,0x06,0x04,0x00,0xcf,0x06,0x04,0x00,0xd1,0x48,0xd0,0x40,0xcf,
+	0x86,0xd5,0x06,0xcf,0x06,0x04,0x00,0xd4,0x06,0xcf,0x06,0x04,0x00,0xd3,0x2c,0xd2,
+	0x06,0xcf,0x06,0x04,0x00,0xd1,0x06,0xcf,0x06,0x04,0x00,0xd0,0x1a,0xcf,0x86,0x55,
+	0x04,0x04,0x00,0x54,0x04,0x04,0x00,0x93,0x0c,0x52,0x04,0x04,0x00,0x11,0x04,0x04,
+	0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x07,0x00,0xcf,0x06,0x01,0x00,0xcf,0x86,0xcf,
+	0x06,0x01,0x00,0xcf,0x86,0xcf,0x06,0x01,0x00,0xe2,0x71,0x05,0xd1,0x8c,0xd0,0x08,
+	0xcf,0x86,0xcf,0x06,0x01,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x01,0x00,0xd4,0x06,
+	0xcf,0x06,0x01,0x00,0xd3,0x06,0xcf,0x06,0x01,0x00,0xd2,0x06,0xcf,0x06,0x01,0x00,
+	0xd1,0x06,0xcf,0x06,0x01,0x00,0xd0,0x22,0xcf,0x86,0x55,0x04,0x01,0x00,0xd4,0x10,
+	0x93,0x0c,0x52,0x04,0x01,0x00,0x11,0x04,0x01,0x00,0x08,0x00,0x08,0x00,0x53,0x04,
+	0x08,0x00,0x12,0x04,0x08,0x00,0x0a,0x00,0xcf,0x86,0xd5,0x28,0xd4,0x18,0xd3,0x08,
+	0x12,0x04,0x0a,0x00,0x0b,0x00,0x52,0x04,0x0b,0x00,0x91,0x08,0x10,0x04,0x0d,0x00,
+	0x11,0x00,0x11,0x00,0x93,0x0c,0x52,0x04,0x11,0x00,0x11,0x04,0x11,0x00,0x13,0x00,
+	0x13,0x00,0x94,0x14,0x53,0x04,0x13,0x00,0x92,0x0c,0x51,0x04,0x13,0x00,0x10,0x04,
+	0x13,0x00,0x14,0x00,0x14,0x00,0x00,0x00,0xe0,0xdb,0x04,0xcf,0x86,0xe5,0xdf,0x01,
+	0xd4,0x06,0xcf,0x06,0x04,0x00,0xd3,0x74,0xd2,0x6e,0xd1,0x06,0xcf,0x06,0x04,0x00,
+	0xd0,0x3e,0xcf,0x86,0xd5,0x18,0x94,0x14,0x53,0x04,0x04,0x00,0x52,0x04,0x04,0x00,
+	0x91,0x08,0x10,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xd4,0x10,0x93,0x0c,
+	0x92,0x08,0x11,0x04,0x04,0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x93,0x10,0x52,0x04,
+	0x04,0x00,0x91,0x08,0x10,0x04,0x06,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xcf,0x86,
+	0x95,0x24,0x94,0x20,0x93,0x1c,0xd2,0x0c,0x91,0x08,0x10,0x04,0x04,0x00,0x06,0x00,
+	0x04,0x00,0xd1,0x08,0x10,0x04,0x04,0x00,0x06,0x00,0x10,0x04,0x04,0x00,0x00,0x00,
+	0x00,0x00,0x0b,0x00,0x0b,0x00,0xcf,0x06,0x0a,0x00,0xd2,0x84,0xd1,0x4c,0xd0,0x16,
+	0xcf,0x86,0x55,0x04,0x0a,0x00,0x94,0x0c,0x53,0x04,0x0a,0x00,0x12,0x04,0x0a,0x00,
+	0x00,0x00,0x00,0x00,0xcf,0x86,0x55,0x04,0x0a,0x00,0xd4,0x1c,0xd3,0x0c,0x92,0x08,
+	0x11,0x04,0x0c,0x00,0x0a,0x00,0x0a,0x00,0x52,0x04,0x0a,0x00,0x51,0x04,0x0a,0x00,
+	0x10,0x04,0x0a,0x00,0x0a,0xe6,0xd3,0x08,0x12,0x04,0x0a,0x00,0x0d,0xe6,0x52,0x04,
+	0x0d,0xe6,0x11,0x04,0x0a,0xe6,0x0a,0x00,0xd0,0x1e,0xcf,0x86,0x95,0x18,0x54,0x04,
+	0x0a,0x00,0x53,0x04,0x0a,0x00,0x52,0x04,0x10,0x00,0x51,0x04,0x10,0x00,0x10,0x04,
+	0x11,0xe6,0x0d,0xe6,0x0b,0x00,0xcf,0x86,0x55,0x04,0x0b,0x00,0x54,0x04,0x0b,0x00,
+	0x93,0x0c,0x92,0x08,0x11,0x04,0x0b,0xe6,0x0b,0x00,0x0b,0x00,0x00,0x00,0xd1,0x40,
+	0xd0,0x3a,0xcf,0x86,0xd5,0x24,0x54,0x04,0x08,0x00,0xd3,0x10,0x52,0x04,0x08,0x00,
+	0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x09,0x00,0x92,0x0c,0x51,0x04,0x09,0x00,
+	0x10,0x04,0x09,0x00,0x0a,0x00,0x0a,0x00,0x94,0x10,0x93,0x0c,0x92,0x08,0x11,0x04,
+	0x09,0x00,0x0a,0x00,0x0a,0x00,0x0a,0x00,0x0a,0x00,0xcf,0x06,0x0a,0x00,0xd0,0x5e,
+	0xcf,0x86,0xd5,0x28,0xd4,0x18,0x53,0x04,0x0a,0x00,0x52,0x04,0x0a,0x00,0xd1,0x08,
+	0x10,0x04,0x0a,0x00,0x0c,0x00,0x10,0x04,0x0c,0x00,0x11,0x00,0x93,0x0c,0x92,0x08,
+	0x11,0x04,0x0c,0x00,0x0d,0x00,0x10,0x00,0x10,0x00,0xd4,0x1c,0x53,0x04,0x0c,0x00,
+	0xd2,0x0c,0x51,0x04,0x0c,0x00,0x10,0x04,0x0d,0x00,0x10,0x00,0x51,0x04,0x10,0x00,
+	0x10,0x04,0x12,0x00,0x14,0x00,0xd3,0x0c,0x92,0x08,0x11,0x04,0x10,0x00,0x11,0x00,
+	0x11,0x00,0x92,0x08,0x11,0x04,0x14,0x00,0x15,0x00,0x15,0x00,0xcf,0x86,0xd5,0x1c,
+	0x94,0x18,0x93,0x14,0xd2,0x08,0x11,0x04,0x00,0x00,0x15,0x00,0x51,0x04,0x15,0x00,
+	0x10,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x04,0x00,0x00,0xd3,0x10,
+	0x52,0x04,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0x00,0x92,0x0c,
+	0x51,0x04,0x0d,0x00,0x10,0x04,0x0c,0x00,0x0a,0x00,0x0a,0x00,0xe4,0xf2,0x02,0xe3,
+	0x65,0x01,0xd2,0x98,0xd1,0x48,0xd0,0x36,0xcf,0x86,0xd5,0x18,0x94,0x14,0x93,0x10,
+	0x52,0x04,0x08,0x00,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x09,0x08,0x00,0x08,0x00,
+	0x08,0x00,0xd4,0x0c,0x53,0x04,0x08,0x00,0x12,0x04,0x08,0x00,0x00,0x00,0x53,0x04,
+	0x0b,0x00,0x92,0x08,0x11,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0x55,0x04,
+	0x09,0x00,0x54,0x04,0x09,0x00,0x13,0x04,0x09,0x00,0x00,0x00,0xd0,0x06,0xcf,0x06,
+	0x0a,0x00,0xcf,0x86,0xd5,0x2c,0xd4,0x1c,0xd3,0x10,0x52,0x04,0x0a,0x00,0x91,0x08,
+	0x10,0x04,0x0a,0x09,0x12,0x00,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,
+	0x0a,0x00,0x53,0x04,0x0a,0x00,0x92,0x08,0x11,0x04,0x0a,0x00,0x00,0x00,0x00,0x00,
+	0x54,0x04,0x0b,0xe6,0xd3,0x0c,0x92,0x08,0x11,0x04,0x0b,0xe6,0x0b,0x00,0x0b,0x00,
+	0x52,0x04,0x0b,0x00,0x11,0x04,0x11,0x00,0x14,0x00,0xd1,0x60,0xd0,0x22,0xcf,0x86,
+	0x55,0x04,0x0a,0x00,0x94,0x18,0x53,0x04,0x0a,0x00,0xd2,0x0c,0x51,0x04,0x0a,0x00,
+	0x10,0x04,0x0a,0x00,0x0a,0xdc,0x11,0x04,0x0a,0xdc,0x0a,0x00,0x0a,0x00,0xcf,0x86,
+	0xd5,0x24,0x54,0x04,0x0a,0x00,0xd3,0x10,0x92,0x0c,0x51,0x04,0x0a,0x00,0x10,0x04,
+	0x0a,0x00,0x0a,0x09,0x00,0x00,0x52,0x04,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,
+	0x00,0x00,0x0a,0x00,0x54,0x04,0x0b,0x00,0x53,0x04,0x0b,0x00,0x52,0x04,0x0b,0x00,
+	0x91,0x08,0x10,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,0xd0,0x1e,0xcf,0x86,0x55,0x04,
+	0x0b,0x00,0x54,0x04,0x0b,0x00,0x93,0x10,0x92,0x0c,0x51,0x04,0x0b,0x00,0x10,0x04,
+	0x0b,0x00,0x0b,0x07,0x0b,0x00,0x0b,0x00,0xcf,0x86,0xd5,0x34,0xd4,0x20,0xd3,0x10,
+	0x92,0x0c,0x91,0x08,0x10,0x04,0x0b,0x09,0x0b,0x00,0x0b,0x00,0x0b,0x00,0x52,0x04,
+	0x0b,0x00,0x51,0x04,0x0b,0x00,0x10,0x04,0x00,0x00,0x0b,0x00,0x53,0x04,0x0b,0x00,
+	0xd2,0x08,0x11,0x04,0x0b,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x0b,0x00,0x54,0x04,
+	0x10,0x00,0x53,0x04,0x10,0x00,0x52,0x04,0x10,0x00,0x51,0x04,0x10,0x00,0x10,0x04,
+	0x10,0x00,0x00,0x00,0xd2,0xd0,0xd1,0x50,0xd0,0x1e,0xcf,0x86,0x55,0x04,0x0a,0x00,
+	0x54,0x04,0x0a,0x00,0x93,0x10,0x52,0x04,0x0a,0x00,0x51,0x04,0x0a,0x00,0x10,0x04,
+	0x0a,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0xd5,0x20,0xd4,0x10,0x53,0x04,0x0a,0x00,
+	0x52,0x04,0x0a,0x00,0x11,0x04,0x0a,0x00,0x00,0x00,0x53,0x04,0x0a,0x00,0x92,0x08,
+	0x11,0x04,0x0a,0x00,0x00,0x00,0x0a,0x00,0x54,0x04,0x0b,0x00,0x53,0x04,0x0b,0x00,
+	0x12,0x04,0x0b,0x00,0x10,0x00,0xd0,0x3a,0xcf,0x86,0x55,0x04,0x0b,0x00,0x54,0x04,
+	0x0b,0x00,0xd3,0x1c,0xd2,0x0c,0x91,0x08,0x10,0x04,0x0b,0xe6,0x0b,0x00,0x0b,0xe6,
+	0xd1,0x08,0x10,0x04,0x0b,0xdc,0x0b,0x00,0x10,0x04,0x0b,0x00,0x0b,0xe6,0xd2,0x0c,
+	0x91,0x08,0x10,0x04,0x0b,0xe6,0x0b,0x00,0x0b,0x00,0x11,0x04,0x0b,0x00,0x0b,0xe6,
+	0xcf,0x86,0xd5,0x2c,0xd4,0x18,0x93,0x14,0x92,0x10,0xd1,0x08,0x10,0x04,0x0b,0x00,
+	0x0b,0xe6,0x10,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x04,0x00,0x00,
+	0x92,0x0c,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x0b,0x00,0x0b,0x00,0x54,0x04,
+	0x0d,0x00,0x93,0x10,0x52,0x04,0x0d,0x00,0x51,0x04,0x0d,0x00,0x10,0x04,0x0d,0x09,
+	0x00,0x00,0x00,0x00,0xd1,0x8c,0xd0,0x72,0xcf,0x86,0xd5,0x4c,0xd4,0x30,0xd3,0x18,
+	0xd2,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x0c,0x00,0x0c,0x00,0x51,0x04,0x0c,0x00,
+	0x10,0x04,0x0c,0x00,0x00,0x00,0xd2,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x0c,0x00,
+	0x0c,0x00,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x00,0x00,0x00,0x93,0x18,0xd2,0x0c,
+	0x91,0x08,0x10,0x04,0x00,0x00,0x0c,0x00,0x0c,0x00,0x51,0x04,0x0c,0x00,0x10,0x04,
+	0x0c,0x00,0x00,0x00,0x00,0x00,0x94,0x20,0xd3,0x10,0x52,0x04,0x0c,0x00,0x51,0x04,
+	0x0c,0x00,0x10,0x04,0x0c,0x00,0x00,0x00,0x52,0x04,0x0c,0x00,0x51,0x04,0x0c,0x00,
+	0x10,0x04,0x0c,0x00,0x00,0x00,0x10,0x00,0xcf,0x86,0x55,0x04,0x10,0x00,0x94,0x10,
+	0x93,0x0c,0x52,0x04,0x11,0x00,0x11,0x04,0x10,0x00,0x15,0x00,0x00,0x00,0x11,0x00,
+	0xd0,0x06,0xcf,0x06,0x11,0x00,0xcf,0x86,0x55,0x04,0x0b,0x00,0xd4,0x14,0x53,0x04,
+	0x0b,0x00,0x52,0x04,0x0b,0x00,0x91,0x08,0x10,0x04,0x0b,0x00,0x0b,0x09,0x00,0x00,
+	0x53,0x04,0x0b,0x00,0x92,0x08,0x11,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,
+	0x02,0xff,0xff,0xcf,0x86,0xcf,0x06,0x02,0xff,0xff,0xd1,0x76,0xd0,0x09,0xcf,0x86,
+	0xcf,0x06,0x02,0xff,0xff,0xcf,0x86,0x85,0xd4,0x07,0xcf,0x06,0x02,0xff,0xff,0xd3,
+	0x07,0xcf,0x06,0x02,0xff,0xff,0xd2,0x07,0xcf,0x06,0x02,0xff,0xff,0xd1,0x07,0xcf,
+	0x06,0x02,0xff,0xff,0xd0,0x18,0xcf,0x86,0x55,0x05,0x02,0xff,0xff,0x94,0x0d,0x93,
+	0x09,0x12,0x05,0x02,0xff,0xff,0x00,0x00,0x00,0x00,0x0b,0x00,0xcf,0x86,0xd5,0x24,
+	0x94,0x20,0xd3,0x10,0x52,0x04,0x0b,0x00,0x51,0x04,0x0b,0x00,0x10,0x04,0x0b,0x00,
+	0x00,0x00,0x92,0x0c,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x0b,0x00,0x0b,0x00,
+	0x0b,0x00,0x54,0x04,0x0b,0x00,0x53,0x04,0x0b,0x00,0x12,0x04,0x0b,0x00,0x00,0x00,
+	0xd0,0x08,0xcf,0x86,0xcf,0x06,0x01,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x01,0x00,
+	0xe4,0x9c,0x10,0xe3,0x16,0x08,0xd2,0x06,0xcf,0x06,0x01,0x00,0xe1,0x08,0x04,0xe0,
+	0x04,0x02,0xcf,0x86,0xe5,0x01,0x01,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0xe8,0xb1,0x88,0x00,0x01,0xff,0xe6,0x9b,0xb4,0x00,0x10,0x08,0x01,
+	0xff,0xe8,0xbb,0x8a,0x00,0x01,0xff,0xe8,0xb3,0x88,0x00,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0xe6,0xbb,0x91,0x00,0x01,0xff,0xe4,0xb8,0xb2,0x00,0x10,0x08,0x01,0xff,0xe5,
+	0x8f,0xa5,0x00,0x01,0xff,0xe9,0xbe,0x9c,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0xe9,0xbe,0x9c,0x00,0x01,0xff,0xe5,0xa5,0x91,0x00,0x10,0x08,0x01,0xff,0xe9,
+	0x87,0x91,0x00,0x01,0xff,0xe5,0x96,0x87,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe5,
+	0xa5,0x88,0x00,0x01,0xff,0xe6,0x87,0xb6,0x00,0x10,0x08,0x01,0xff,0xe7,0x99,0xa9,
+	0x00,0x01,0xff,0xe7,0xbe,0x85,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0xe8,0x98,0xbf,0x00,0x01,0xff,0xe8,0x9e,0xba,0x00,0x10,0x08,0x01,0xff,0xe8,
+	0xa3,0xb8,0x00,0x01,0xff,0xe9,0x82,0x8f,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe6,
+	0xa8,0x82,0x00,0x01,0xff,0xe6,0xb4,0x9b,0x00,0x10,0x08,0x01,0xff,0xe7,0x83,0x99,
+	0x00,0x01,0xff,0xe7,0x8f,0x9e,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe8,
+	0x90,0xbd,0x00,0x01,0xff,0xe9,0x85,0xaa,0x00,0x10,0x08,0x01,0xff,0xe9,0xa7,0xb1,
+	0x00,0x01,0xff,0xe4,0xba,0x82,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe5,0x8d,0xb5,
+	0x00,0x01,0xff,0xe6,0xac,0x84,0x00,0x10,0x08,0x01,0xff,0xe7,0x88,0x9b,0x00,0x01,
+	0xff,0xe8,0x98,0xad,0x00,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0xe9,0xb8,0x9e,0x00,0x01,0xff,0xe5,0xb5,0x90,0x00,0x10,0x08,0x01,0xff,0xe6,
+	0xbf,0xab,0x00,0x01,0xff,0xe8,0x97,0x8d,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe8,
+	0xa5,0xa4,0x00,0x01,0xff,0xe6,0x8b,0x89,0x00,0x10,0x08,0x01,0xff,0xe8,0x87,0x98,
+	0x00,0x01,0xff,0xe8,0xa0,0x9f,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe5,
+	0xbb,0x8a,0x00,0x01,0xff,0xe6,0x9c,0x97,0x00,0x10,0x08,0x01,0xff,0xe6,0xb5,0xaa,
+	0x00,0x01,0xff,0xe7,0x8b,0xbc,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe9,0x83,0x8e,
+	0x00,0x01,0xff,0xe4,0xbe,0x86,0x00,0x10,0x08,0x01,0xff,0xe5,0x86,0xb7,0x00,0x01,
+	0xff,0xe5,0x8b,0x9e,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe6,
+	0x93,0x84,0x00,0x01,0xff,0xe6,0xab,0x93,0x00,0x10,0x08,0x01,0xff,0xe7,0x88,0x90,
+	0x00,0x01,0xff,0xe7,0x9b,0xa7,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe8,0x80,0x81,
+	0x00,0x01,0xff,0xe8,0x98,0x86,0x00,0x10,0x08,0x01,0xff,0xe8,0x99,0x9c,0x00,0x01,
+	0xff,0xe8,0xb7,0xaf,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe9,0x9c,0xb2,
+	0x00,0x01,0xff,0xe9,0xad,0xaf,0x00,0x10,0x08,0x01,0xff,0xe9,0xb7,0xba,0x00,0x01,
+	0xff,0xe7,0xa2,0x8c,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe7,0xa5,0xbf,0x00,0x01,
+	0xff,0xe7,0xb6,0xa0,0x00,0x10,0x08,0x01,0xff,0xe8,0x8f,0x89,0x00,0x01,0xff,0xe9,
+	0x8c,0x84,0x00,0xcf,0x86,0xe5,0x01,0x01,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xe9,0xb9,0xbf,0x00,0x01,0xff,0xe8,0xab,0x96,0x00,0x10,0x08,
+	0x01,0xff,0xe5,0xa3,0x9f,0x00,0x01,0xff,0xe5,0xbc,0x84,0x00,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xe7,0xb1,0xa0,0x00,0x01,0xff,0xe8,0x81,0xbe,0x00,0x10,0x08,0x01,0xff,
+	0xe7,0x89,0xa2,0x00,0x01,0xff,0xe7,0xa3,0x8a,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xe8,0xb3,0x82,0x00,0x01,0xff,0xe9,0x9b,0xb7,0x00,0x10,0x08,0x01,0xff,
+	0xe5,0xa3,0x98,0x00,0x01,0xff,0xe5,0xb1,0xa2,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0xe6,0xa8,0x93,0x00,0x01,0xff,0xe6,0xb7,0x9a,0x00,0x10,0x08,0x01,0xff,0xe6,0xbc,
+	0x8f,0x00,0x01,0xff,0xe7,0xb4,0xaf,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xe7,0xb8,0xb7,0x00,0x01,0xff,0xe9,0x99,0x8b,0x00,0x10,0x08,0x01,0xff,
+	0xe5,0x8b,0x92,0x00,0x01,0xff,0xe8,0x82,0x8b,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0xe5,0x87,0x9c,0x00,0x01,0xff,0xe5,0x87,0x8c,0x00,0x10,0x08,0x01,0xff,0xe7,0xa8,
+	0x9c,0x00,0x01,0xff,0xe7,0xb6,0xbe,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0xe8,0x8f,0xb1,0x00,0x01,0xff,0xe9,0x99,0xb5,0x00,0x10,0x08,0x01,0xff,0xe8,0xae,
+	0x80,0x00,0x01,0xff,0xe6,0x8b,0x8f,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe6,0xa8,
+	0x82,0x00,0x01,0xff,0xe8,0xab,0xbe,0x00,0x10,0x08,0x01,0xff,0xe4,0xb8,0xb9,0x00,
+	0x01,0xff,0xe5,0xaf,0xa7,0x00,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xe6,0x80,0x92,0x00,0x01,0xff,0xe7,0x8e,0x87,0x00,0x10,0x08,0x01,0xff,
+	0xe7,0x95,0xb0,0x00,0x01,0xff,0xe5,0x8c,0x97,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0xe7,0xa3,0xbb,0x00,0x01,0xff,0xe4,0xbe,0xbf,0x00,0x10,0x08,0x01,0xff,0xe5,0xbe,
+	0xa9,0x00,0x01,0xff,0xe4,0xb8,0x8d,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0xe6,0xb3,0x8c,0x00,0x01,0xff,0xe6,0x95,0xb8,0x00,0x10,0x08,0x01,0xff,0xe7,0xb4,
+	0xa2,0x00,0x01,0xff,0xe5,0x8f,0x83,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe5,0xa1,
+	0x9e,0x00,0x01,0xff,0xe7,0x9c,0x81,0x00,0x10,0x08,0x01,0xff,0xe8,0x91,0x89,0x00,
+	0x01,0xff,0xe8,0xaa,0xaa,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0xe6,0xae,0xba,0x00,0x01,0xff,0xe8,0xbe,0xb0,0x00,0x10,0x08,0x01,0xff,0xe6,0xb2,
+	0x88,0x00,0x01,0xff,0xe6,0x8b,0xbe,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe8,0x8b,
+	0xa5,0x00,0x01,0xff,0xe6,0x8e,0xa0,0x00,0x10,0x08,0x01,0xff,0xe7,0x95,0xa5,0x00,
+	0x01,0xff,0xe4,0xba,0xae,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe5,0x85,
+	0xa9,0x00,0x01,0xff,0xe5,0x87,0x89,0x00,0x10,0x08,0x01,0xff,0xe6,0xa2,0x81,0x00,
+	0x01,0xff,0xe7,0xb3,0xa7,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe8,0x89,0xaf,0x00,
+	0x01,0xff,0xe8,0xab,0x92,0x00,0x10,0x08,0x01,0xff,0xe9,0x87,0x8f,0x00,0x01,0xff,
+	0xe5,0x8b,0xb5,0x00,0xe0,0x04,0x02,0xcf,0x86,0xe5,0x01,0x01,0xd4,0x80,0xd3,0x40,
+	0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe5,0x91,0x82,0x00,0x01,0xff,0xe5,0xa5,
+	0xb3,0x00,0x10,0x08,0x01,0xff,0xe5,0xbb,0xac,0x00,0x01,0xff,0xe6,0x97,0x85,0x00,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0xe6,0xbf,0xbe,0x00,0x01,0xff,0xe7,0xa4,0xaa,0x00,
+	0x10,0x08,0x01,0xff,0xe9,0x96,0xad,0x00,0x01,0xff,0xe9,0xa9,0xaa,0x00,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0xe9,0xba,0x97,0x00,0x01,0xff,0xe9,0xbb,0x8e,0x00,
+	0x10,0x08,0x01,0xff,0xe5,0x8a,0x9b,0x00,0x01,0xff,0xe6,0x9b,0x86,0x00,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xe6,0xad,0xb7,0x00,0x01,0xff,0xe8,0xbd,0xa2,0x00,0x10,0x08,
+	0x01,0xff,0xe5,0xb9,0xb4,0x00,0x01,0xff,0xe6,0x86,0x90,0x00,0xd3,0x40,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0xe6,0x88,0x80,0x00,0x01,0xff,0xe6,0x92,0x9a,0x00,
+	0x10,0x08,0x01,0xff,0xe6,0xbc,0xa3,0x00,0x01,0xff,0xe7,0x85,0x89,0x00,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xe7,0x92,0x89,0x00,0x01,0xff,0xe7,0xa7,0x8a,0x00,0x10,0x08,
+	0x01,0xff,0xe7,0xb7,0xb4,0x00,0x01,0xff,0xe8,0x81,0xaf,0x00,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xe8,0xbc,0xa6,0x00,0x01,0xff,0xe8,0x93,0xae,0x00,0x10,0x08,
+	0x01,0xff,0xe9,0x80,0xa3,0x00,0x01,0xff,0xe9,0x8d,0x8a,0x00,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xe5,0x88,0x97,0x00,0x01,0xff,0xe5,0x8a,0xa3,0x00,0x10,0x08,0x01,0xff,
+	0xe5,0x92,0xbd,0x00,0x01,0xff,0xe7,0x83,0x88,0x00,0xd4,0x80,0xd3,0x40,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0xe8,0xa3,0x82,0x00,0x01,0xff,0xe8,0xaa,0xaa,0x00,
+	0x10,0x08,0x01,0xff,0xe5,0xbb,0x89,0x00,0x01,0xff,0xe5,0xbf,0xb5,0x00,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xe6,0x8d,0xbb,0x00,0x01,0xff,0xe6,0xae,0xae,0x00,0x10,0x08,
+	0x01,0xff,0xe7,0xb0,0xbe,0x00,0x01,0xff,0xe7,0x8d,0xb5,0x00,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xe4,0xbb,0xa4,0x00,0x01,0xff,0xe5,0x9b,0xb9,0x00,0x10,0x08,
+	0x01,0xff,0xe5,0xaf,0xa7,0x00,0x01,0xff,0xe5,0xb6,0xba,0x00,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xe6,0x80,0x9c,0x00,0x01,0xff,0xe7,0x8e,0xb2,0x00,0x10,0x08,0x01,0xff,
+	0xe7,0x91,0xa9,0x00,0x01,0xff,0xe7,0xbe,0x9a,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xe8,0x81,0x86,0x00,0x01,0xff,0xe9,0x88,0xb4,0x00,0x10,0x08,
+	0x01,0xff,0xe9,0x9b,0xb6,0x00,0x01,0xff,0xe9,0x9d,0x88,0x00,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xe9,0xa0,0x98,0x00,0x01,0xff,0xe4,0xbe,0x8b,0x00,0x10,0x08,0x01,0xff,
+	0xe7,0xa6,0xae,0x00,0x01,0xff,0xe9,0x86,0xb4,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xe9,0x9a,0xb8,0x00,0x01,0xff,0xe6,0x83,0xa1,0x00,0x10,0x08,0x01,0xff,
+	0xe4,0xba,0x86,0x00,0x01,0xff,0xe5,0x83,0x9a,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0xe5,0xaf,0xae,0x00,0x01,0xff,0xe5,0xb0,0xbf,0x00,0x10,0x08,0x01,0xff,0xe6,0x96,
+	0x99,0x00,0x01,0xff,0xe6,0xa8,0x82,0x00,0xcf,0x86,0xe5,0x01,0x01,0xd4,0x80,0xd3,
+	0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe7,0x87,0x8e,0x00,0x01,0xff,0xe7,
+	0x99,0x82,0x00,0x10,0x08,0x01,0xff,0xe8,0x93,0xbc,0x00,0x01,0xff,0xe9,0x81,0xbc,
+	0x00,0xd1,0x10,0x10,0x08,0x01,0xff,0xe9,0xbe,0x8d,0x00,0x01,0xff,0xe6,0x9a,0x88,
+	0x00,0x10,0x08,0x01,0xff,0xe9,0x98,0xae,0x00,0x01,0xff,0xe5,0x8a,0x89,0x00,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe6,0x9d,0xbb,0x00,0x01,0xff,0xe6,0x9f,0xb3,
+	0x00,0x10,0x08,0x01,0xff,0xe6,0xb5,0x81,0x00,0x01,0xff,0xe6,0xba,0x9c,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0xe7,0x90,0x89,0x00,0x01,0xff,0xe7,0x95,0x99,0x00,0x10,
+	0x08,0x01,0xff,0xe7,0xa1,0xab,0x00,0x01,0xff,0xe7,0xb4,0x90,0x00,0xd3,0x40,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe9,0xa1,0x9e,0x00,0x01,0xff,0xe5,0x85,0xad,
+	0x00,0x10,0x08,0x01,0xff,0xe6,0x88,0xae,0x00,0x01,0xff,0xe9,0x99,0xb8,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0xe5,0x80,0xab,0x00,0x01,0xff,0xe5,0xb4,0x99,0x00,0x10,
+	0x08,0x01,0xff,0xe6,0xb7,0xaa,0x00,0x01,0xff,0xe8,0xbc,0xaa,0x00,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0xe5,0xbe,0x8b,0x00,0x01,0xff,0xe6,0x85,0x84,0x00,0x10,
+	0x08,0x01,0xff,0xe6,0xa0,0x97,0x00,0x01,0xff,0xe7,0x8e,0x87,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0xe9,0x9a,0x86,0x00,0x01,0xff,0xe5,0x88,0xa9,0x00,0x10,0x08,0x01,
+	0xff,0xe5,0x90,0x8f,0x00,0x01,0xff,0xe5,0xb1,0xa5,0x00,0xd4,0x80,0xd3,0x40,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x01,0xff,0xe6,0x98,0x93,0x00,0x01,0xff,0xe6,0x9d,0x8e,
+	0x00,0x10,0x08,0x01,0xff,0xe6,0xa2,0xa8,0x00,0x01,0xff,0xe6,0xb3,0xa5,0x00,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0xe7,0x90,0x86,0x00,0x01,0xff,0xe7,0x97,0xa2,0x00,0x10,
+	0x08,0x01,0xff,0xe7,0xbd,0xb9,0x00,0x01,0xff,0xe8,0xa3,0x8f,0x00,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0xe8,0xa3,0xa1,0x00,0x01,0xff,0xe9,0x87,0x8c,0x00,0x10,
+	0x08,0x01,0xff,0xe9,0x9b,0xa2,0x00,0x01,0xff,0xe5,0x8c,0xbf,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0xe6,0xba,0xba,0x00,0x01,0xff,0xe5,0x90,0x9d,0x00,0x10,0x08,0x01,
+	0xff,0xe7,0x87,0x90,0x00,0x01,0xff,0xe7,0x92,0x98,0x00,0xd3,0x40,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x01,0xff,0xe8,0x97,0xba,0x00,0x01,0xff,0xe9,0x9a,0xa3,0x00,0x10,
+	0x08,0x01,0xff,0xe9,0xb1,0x97,0x00,0x01,0xff,0xe9,0xba,0x9f,0x00,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0xe6,0x9e,0x97,0x00,0x01,0xff,0xe6,0xb7,0x8b,0x00,0x10,0x08,0x01,
+	0xff,0xe8,0x87,0xa8,0x00,0x01,0xff,0xe7,0xab,0x8b,0x00,0xd2,0x20,0xd1,0x10,0x10,
+	0x08,0x01,0xff,0xe7,0xac,0xa0,0x00,0x01,0xff,0xe7,0xb2,0x92,0x00,0x10,0x08,0x01,
+	0xff,0xe7,0x8b,0x80,0x00,0x01,0xff,0xe7,0x82,0x99,0x00,0xd1,0x10,0x10,0x08,0x01,
+	0xff,0xe8,0xad,0x98,0x00,0x01,0xff,0xe4,0xbb,0x80,0x00,0x10,0x08,0x01,0xff,0xe8,
+	0x8c,0xb6,0x00,0x01,0xff,0xe5,0x88,0xba,0x00,0xe2,0xad,0x06,0xe1,0xc4,0x03,0xe0,
+	0xcb,0x01,0xcf,0x86,0xd5,0xe4,0xd4,0x74,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x01,0xff,0xe5,0x88,0x87,0x00,0x01,0xff,0xe5,0xba,0xa6,0x00,0x10,0x08,0x01,0xff,
+	0xe6,0x8b,0x93,0x00,0x01,0xff,0xe7,0xb3,0x96,0x00,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0xe5,0xae,0x85,0x00,0x01,0xff,0xe6,0xb4,0x9e,0x00,0x10,0x08,0x01,0xff,0xe6,0x9a,
+	0xb4,0x00,0x01,0xff,0xe8,0xbc,0xbb,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x01,0xff,
+	0xe8,0xa1,0x8c,0x00,0x01,0xff,0xe9,0x99,0x8d,0x00,0x10,0x08,0x01,0xff,0xe8,0xa6,
+	0x8b,0x00,0x01,0xff,0xe5,0xbb,0x93,0x00,0x91,0x10,0x10,0x08,0x01,0xff,0xe5,0x85,
+	0x80,0x00,0x01,0xff,0xe5,0x97,0x80,0x00,0x01,0x00,0xd3,0x34,0xd2,0x18,0xd1,0x0c,
+	0x10,0x08,0x01,0xff,0xe5,0xa1,0x9a,0x00,0x01,0x00,0x10,0x08,0x01,0xff,0xe6,0x99,
+	0xb4,0x00,0x01,0x00,0xd1,0x0c,0x10,0x04,0x01,0x00,0x01,0xff,0xe5,0x87,0x9e,0x00,
+	0x10,0x08,0x01,0xff,0xe7,0x8c,0xaa,0x00,0x01,0xff,0xe7,0x9b,0x8a,0x00,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x01,0xff,0xe7,0xa4,0xbc,0x00,0x01,0xff,0xe7,0xa5,0x9e,0x00,
+	0x10,0x08,0x01,0xff,0xe7,0xa5,0xa5,0x00,0x01,0xff,0xe7,0xa6,0x8f,0x00,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xe9,0x9d,0x96,0x00,0x01,0xff,0xe7,0xb2,0xbe,0x00,0x10,0x08,
+	0x01,0xff,0xe7,0xbe,0xbd,0x00,0x01,0x00,0xd4,0x64,0xd3,0x30,0xd2,0x18,0xd1,0x0c,
+	0x10,0x08,0x01,0xff,0xe8,0x98,0x92,0x00,0x01,0x00,0x10,0x08,0x01,0xff,0xe8,0xab,
+	0xb8,0x00,0x01,0x00,0xd1,0x0c,0x10,0x04,0x01,0x00,0x01,0xff,0xe9,0x80,0xb8,0x00,
+	0x10,0x08,0x01,0xff,0xe9,0x83,0xbd,0x00,0x01,0x00,0xd2,0x14,0x51,0x04,0x01,0x00,
+	0x10,0x08,0x01,0xff,0xe9,0xa3,0xaf,0x00,0x01,0xff,0xe9,0xa3,0xbc,0x00,0xd1,0x10,
+	0x10,0x08,0x01,0xff,0xe9,0xa4,0xa8,0x00,0x01,0xff,0xe9,0xb6,0xb4,0x00,0x10,0x08,
+	0x0d,0xff,0xe9,0x83,0x9e,0x00,0x0d,0xff,0xe9,0x9a,0xb7,0x00,0xd3,0x40,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x06,0xff,0xe4,0xbe,0xae,0x00,0x06,0xff,0xe5,0x83,0xa7,0x00,
+	0x10,0x08,0x06,0xff,0xe5,0x85,0x8d,0x00,0x06,0xff,0xe5,0x8b,0x89,0x00,0xd1,0x10,
+	0x10,0x08,0x06,0xff,0xe5,0x8b,0xa4,0x00,0x06,0xff,0xe5,0x8d,0x91,0x00,0x10,0x08,
+	0x06,0xff,0xe5,0x96,0x9d,0x00,0x06,0xff,0xe5,0x98,0x86,0x00,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x06,0xff,0xe5,0x99,0xa8,0x00,0x06,0xff,0xe5,0xa1,0x80,0x00,0x10,0x08,
+	0x06,0xff,0xe5,0xa2,0xa8,0x00,0x06,0xff,0xe5,0xb1,0xa4,0x00,0xd1,0x10,0x10,0x08,
+	0x06,0xff,0xe5,0xb1,0xae,0x00,0x06,0xff,0xe6,0x82,0x94,0x00,0x10,0x08,0x06,0xff,
+	0xe6,0x85,0xa8,0x00,0x06,0xff,0xe6,0x86,0x8e,0x00,0xcf,0x86,0xe5,0x01,0x01,0xd4,
+	0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x06,0xff,0xe6,0x87,0xb2,0x00,0x06,
+	0xff,0xe6,0x95,0x8f,0x00,0x10,0x08,0x06,0xff,0xe6,0x97,0xa2,0x00,0x06,0xff,0xe6,
+	0x9a,0x91,0x00,0xd1,0x10,0x10,0x08,0x06,0xff,0xe6,0xa2,0x85,0x00,0x06,0xff,0xe6,
+	0xb5,0xb7,0x00,0x10,0x08,0x06,0xff,0xe6,0xb8,0x9a,0x00,0x06,0xff,0xe6,0xbc,0xa2,
+	0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x06,0xff,0xe7,0x85,0xae,0x00,0x06,0xff,0xe7,
+	0x88,0xab,0x00,0x10,0x08,0x06,0xff,0xe7,0x90,0xa2,0x00,0x06,0xff,0xe7,0xa2,0x91,
+	0x00,0xd1,0x10,0x10,0x08,0x06,0xff,0xe7,0xa4,0xbe,0x00,0x06,0xff,0xe7,0xa5,0x89,
+	0x00,0x10,0x08,0x06,0xff,0xe7,0xa5,0x88,0x00,0x06,0xff,0xe7,0xa5,0x90,0x00,0xd3,
+	0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x06,0xff,0xe7,0xa5,0x96,0x00,0x06,0xff,0xe7,
+	0xa5,0x9d,0x00,0x10,0x08,0x06,0xff,0xe7,0xa6,0x8d,0x00,0x06,0xff,0xe7,0xa6,0x8e,
+	0x00,0xd1,0x10,0x10,0x08,0x06,0xff,0xe7,0xa9,0x80,0x00,0x06,0xff,0xe7,0xaa,0x81,
+	0x00,0x10,0x08,0x06,0xff,0xe7,0xaf,0x80,0x00,0x06,0xff,0xe7,0xb7,0xb4,0x00,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x06,0xff,0xe7,0xb8,0x89,0x00,0x06,0xff,0xe7,0xb9,0x81,
+	0x00,0x10,0x08,0x06,0xff,0xe7,0xbd,0xb2,0x00,0x06,0xff,0xe8,0x80,0x85,0x00,0xd1,
+	0x10,0x10,0x08,0x06,0xff,0xe8,0x87,0xad,0x00,0x06,0xff,0xe8,0x89,0xb9,0x00,0x10,
+	0x08,0x06,0xff,0xe8,0x89,0xb9,0x00,0x06,0xff,0xe8,0x91,0x97,0x00,0xd4,0x75,0xd3,
+	0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x06,0xff,0xe8,0xa4,0x90,0x00,0x06,0xff,0xe8,
+	0xa6,0x96,0x00,0x10,0x08,0x06,0xff,0xe8,0xac,0x81,0x00,0x06,0xff,0xe8,0xac,0xb9,
+	0x00,0xd1,0x10,0x10,0x08,0x06,0xff,0xe8,0xb3,0x93,0x00,0x06,0xff,0xe8,0xb4,0x88,
+	0x00,0x10,0x08,0x06,0xff,0xe8,0xbe,0xb6,0x00,0x06,0xff,0xe9,0x80,0xb8,0x00,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x06,0xff,0xe9,0x9b,0xa3,0x00,0x06,0xff,0xe9,0x9f,0xbf,
+	0x00,0x10,0x08,0x06,0xff,0xe9,0xa0,0xbb,0x00,0x0b,0xff,0xe6,0x81,0xb5,0x00,0x91,
+	0x11,0x10,0x09,0x0b,0xff,0xf0,0xa4,0x8b,0xae,0x00,0x0b,0xff,0xe8,0x88,0x98,0x00,
+	0x00,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x08,0xff,0xe4,0xb8,0xa6,0x00,
+	0x08,0xff,0xe5,0x86,0xb5,0x00,0x10,0x08,0x08,0xff,0xe5,0x85,0xa8,0x00,0x08,0xff,
+	0xe4,0xbe,0x80,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,0xe5,0x85,0x85,0x00,0x08,0xff,
+	0xe5,0x86,0x80,0x00,0x10,0x08,0x08,0xff,0xe5,0x8b,0x87,0x00,0x08,0xff,0xe5,0x8b,
+	0xba,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x08,0xff,0xe5,0x96,0x9d,0x00,0x08,0xff,
+	0xe5,0x95,0x95,0x00,0x10,0x08,0x08,0xff,0xe5,0x96,0x99,0x00,0x08,0xff,0xe5,0x97,
+	0xa2,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,0xe5,0xa1,0x9a,0x00,0x08,0xff,0xe5,0xa2,
+	0xb3,0x00,0x10,0x08,0x08,0xff,0xe5,0xa5,0x84,0x00,0x08,0xff,0xe5,0xa5,0x94,0x00,
+	0xe0,0x04,0x02,0xcf,0x86,0xe5,0x01,0x01,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x08,0xff,0xe5,0xa9,0xa2,0x00,0x08,0xff,0xe5,0xac,0xa8,0x00,0x10,0x08,
+	0x08,0xff,0xe5,0xbb,0x92,0x00,0x08,0xff,0xe5,0xbb,0x99,0x00,0xd1,0x10,0x10,0x08,
+	0x08,0xff,0xe5,0xbd,0xa9,0x00,0x08,0xff,0xe5,0xbe,0xad,0x00,0x10,0x08,0x08,0xff,
+	0xe6,0x83,0x98,0x00,0x08,0xff,0xe6,0x85,0x8e,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x08,0xff,0xe6,0x84,0x88,0x00,0x08,0xff,0xe6,0x86,0x8e,0x00,0x10,0x08,0x08,0xff,
+	0xe6,0x85,0xa0,0x00,0x08,0xff,0xe6,0x87,0xb2,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe6,0x88,0xb4,0x00,0x08,0xff,0xe6,0x8f,0x84,0x00,0x10,0x08,0x08,0xff,0xe6,0x90,
+	0x9c,0x00,0x08,0xff,0xe6,0x91,0x92,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x08,0xff,0xe6,0x95,0x96,0x00,0x08,0xff,0xe6,0x99,0xb4,0x00,0x10,0x08,0x08,0xff,
+	0xe6,0x9c,0x97,0x00,0x08,0xff,0xe6,0x9c,0x9b,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe6,0x9d,0x96,0x00,0x08,0xff,0xe6,0xad,0xb9,0x00,0x10,0x08,0x08,0xff,0xe6,0xae,
+	0xba,0x00,0x08,0xff,0xe6,0xb5,0x81,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe6,0xbb,0x9b,0x00,0x08,0xff,0xe6,0xbb,0x8b,0x00,0x10,0x08,0x08,0xff,0xe6,0xbc,
+	0xa2,0x00,0x08,0xff,0xe7,0x80,0x9e,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,0xe7,0x85,
+	0xae,0x00,0x08,0xff,0xe7,0x9e,0xa7,0x00,0x10,0x08,0x08,0xff,0xe7,0x88,0xb5,0x00,
+	0x08,0xff,0xe7,0x8a,0xaf,0x00,0xd4,0x80,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x08,0xff,0xe7,0x8c,0xaa,0x00,0x08,0xff,0xe7,0x91,0xb1,0x00,0x10,0x08,0x08,0xff,
+	0xe7,0x94,0x86,0x00,0x08,0xff,0xe7,0x94,0xbb,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe7,0x98,0x9d,0x00,0x08,0xff,0xe7,0x98,0x9f,0x00,0x10,0x08,0x08,0xff,0xe7,0x9b,
+	0x8a,0x00,0x08,0xff,0xe7,0x9b,0x9b,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe7,0x9b,0xb4,0x00,0x08,0xff,0xe7,0x9d,0x8a,0x00,0x10,0x08,0x08,0xff,0xe7,0x9d,
+	0x80,0x00,0x08,0xff,0xe7,0xa3,0x8c,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,0xe7,0xaa,
+	0xb1,0x00,0x08,0xff,0xe7,0xaf,0x80,0x00,0x10,0x08,0x08,0xff,0xe7,0xb1,0xbb,0x00,
+	0x08,0xff,0xe7,0xb5,0x9b,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe7,0xb7,0xb4,0x00,0x08,0xff,0xe7,0xbc,0xbe,0x00,0x10,0x08,0x08,0xff,0xe8,0x80,
+	0x85,0x00,0x08,0xff,0xe8,0x8d,0x92,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,0xe8,0x8f,
+	0xaf,0x00,0x08,0xff,0xe8,0x9d,0xb9,0x00,0x10,0x08,0x08,0xff,0xe8,0xa5,0x81,0x00,
+	0x08,0xff,0xe8,0xa6,0x86,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x08,0xff,0xe8,0xa6,
+	0x96,0x00,0x08,0xff,0xe8,0xaa,0xbf,0x00,0x10,0x08,0x08,0xff,0xe8,0xab,0xb8,0x00,
+	0x08,0xff,0xe8,0xab,0x8b,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,0xe8,0xac,0x81,0x00,
+	0x08,0xff,0xe8,0xab,0xbe,0x00,0x10,0x08,0x08,0xff,0xe8,0xab,0xad,0x00,0x08,0xff,
+	0xe8,0xac,0xb9,0x00,0xcf,0x86,0x95,0xde,0xd4,0x81,0xd3,0x40,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x08,0xff,0xe8,0xae,0x8a,0x00,0x08,0xff,0xe8,0xb4,0x88,0x00,0x10,0x08,
+	0x08,0xff,0xe8,0xbc,0xb8,0x00,0x08,0xff,0xe9,0x81,0xb2,0x00,0xd1,0x10,0x10,0x08,
+	0x08,0xff,0xe9,0x86,0x99,0x00,0x08,0xff,0xe9,0x89,0xb6,0x00,0x10,0x08,0x08,0xff,
+	0xe9,0x99,0xbc,0x00,0x08,0xff,0xe9,0x9b,0xa3,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x08,0xff,0xe9,0x9d,0x96,0x00,0x08,0xff,0xe9,0x9f,0x9b,0x00,0x10,0x08,0x08,0xff,
+	0xe9,0x9f,0xbf,0x00,0x08,0xff,0xe9,0xa0,0x8b,0x00,0xd1,0x10,0x10,0x08,0x08,0xff,
+	0xe9,0xa0,0xbb,0x00,0x08,0xff,0xe9,0xac,0x92,0x00,0x10,0x08,0x08,0xff,0xe9,0xbe,
+	0x9c,0x00,0x08,0xff,0xf0,0xa2,0xa1,0x8a,0x00,0xd3,0x45,0xd2,0x22,0xd1,0x12,0x10,
+	0x09,0x08,0xff,0xf0,0xa2,0xa1,0x84,0x00,0x08,0xff,0xf0,0xa3,0x8f,0x95,0x00,0x10,
+	0x08,0x08,0xff,0xe3,0xae,0x9d,0x00,0x08,0xff,0xe4,0x80,0x98,0x00,0xd1,0x11,0x10,
+	0x08,0x08,0xff,0xe4,0x80,0xb9,0x00,0x08,0xff,0xf0,0xa5,0x89,0x89,0x00,0x10,0x09,
+	0x08,0xff,0xf0,0xa5,0xb3,0x90,0x00,0x08,0xff,0xf0,0xa7,0xbb,0x93,0x00,0x92,0x14,
+	0x91,0x10,0x10,0x08,0x08,0xff,0xe9,0xbd,0x83,0x00,0x08,0xff,0xe9,0xbe,0x8e,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x94,0x01,0xe0,0x08,0x01,0xcf,0x86,0xd5,0x42,
+	0xd4,0x14,0x93,0x10,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,
+	0x00,0x00,0x00,0x00,0xd3,0x10,0x92,0x0c,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,
+	0x01,0x00,0x01,0x00,0x52,0x04,0x00,0x00,0xd1,0x0d,0x10,0x04,0x00,0x00,0x04,0xff,
+	0xd7,0x99,0xd6,0xb4,0x00,0x10,0x04,0x01,0x1a,0x01,0xff,0xd7,0xb2,0xd6,0xb7,0x00,
+	0xd4,0x42,0x53,0x04,0x01,0x00,0xd2,0x16,0x51,0x04,0x01,0x00,0x10,0x09,0x01,0xff,
+	0xd7,0xa9,0xd7,0x81,0x00,0x01,0xff,0xd7,0xa9,0xd7,0x82,0x00,0xd1,0x16,0x10,0x0b,
+	0x01,0xff,0xd7,0xa9,0xd6,0xbc,0xd7,0x81,0x00,0x01,0xff,0xd7,0xa9,0xd6,0xbc,0xd7,
+	0x82,0x00,0x10,0x09,0x01,0xff,0xd7,0x90,0xd6,0xb7,0x00,0x01,0xff,0xd7,0x90,0xd6,
+	0xb8,0x00,0xd3,0x43,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xd7,0x90,0xd6,0xbc,
+	0x00,0x01,0xff,0xd7,0x91,0xd6,0xbc,0x00,0x10,0x09,0x01,0xff,0xd7,0x92,0xd6,0xbc,
+	0x00,0x01,0xff,0xd7,0x93,0xd6,0xbc,0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xd7,0x94,
+	0xd6,0xbc,0x00,0x01,0xff,0xd7,0x95,0xd6,0xbc,0x00,0x10,0x09,0x01,0xff,0xd7,0x96,
+	0xd6,0xbc,0x00,0x00,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xd7,0x98,0xd6,
+	0xbc,0x00,0x01,0xff,0xd7,0x99,0xd6,0xbc,0x00,0x10,0x09,0x01,0xff,0xd7,0x9a,0xd6,
+	0xbc,0x00,0x01,0xff,0xd7,0x9b,0xd6,0xbc,0x00,0xd1,0x0d,0x10,0x09,0x01,0xff,0xd7,
+	0x9c,0xd6,0xbc,0x00,0x00,0x00,0x10,0x09,0x01,0xff,0xd7,0x9e,0xd6,0xbc,0x00,0x00,
+	0x00,0xcf,0x86,0x95,0x85,0x94,0x81,0xd3,0x3e,0xd2,0x1f,0xd1,0x12,0x10,0x09,0x01,
+	0xff,0xd7,0xa0,0xd6,0xbc,0x00,0x01,0xff,0xd7,0xa1,0xd6,0xbc,0x00,0x10,0x04,0x00,
+	0x00,0x01,0xff,0xd7,0xa3,0xd6,0xbc,0x00,0xd1,0x0d,0x10,0x09,0x01,0xff,0xd7,0xa4,
+	0xd6,0xbc,0x00,0x00,0x00,0x10,0x09,0x01,0xff,0xd7,0xa6,0xd6,0xbc,0x00,0x01,0xff,
+	0xd7,0xa7,0xd6,0xbc,0x00,0xd2,0x24,0xd1,0x12,0x10,0x09,0x01,0xff,0xd7,0xa8,0xd6,
+	0xbc,0x00,0x01,0xff,0xd7,0xa9,0xd6,0xbc,0x00,0x10,0x09,0x01,0xff,0xd7,0xaa,0xd6,
+	0xbc,0x00,0x01,0xff,0xd7,0x95,0xd6,0xb9,0x00,0xd1,0x12,0x10,0x09,0x01,0xff,0xd7,
+	0x91,0xd6,0xbf,0x00,0x01,0xff,0xd7,0x9b,0xd6,0xbf,0x00,0x10,0x09,0x01,0xff,0xd7,
+	0xa4,0xd6,0xbf,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd0,0x1a,0xcf,0x86,0x55,0x04,
+	0x01,0x00,0x54,0x04,0x01,0x00,0x93,0x0c,0x92,0x08,0x11,0x04,0x01,0x00,0x0c,0x00,
+	0x0c,0x00,0x0c,0x00,0xcf,0x86,0x95,0x24,0xd4,0x10,0x93,0x0c,0x92,0x08,0x11,0x04,
+	0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x10,0x92,0x0c,0x51,0x04,0x00,0x00,
+	0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xd3,0x5a,0xd2,0x06,
+	0xcf,0x06,0x01,0x00,0xd1,0x14,0xd0,0x06,0xcf,0x06,0x01,0x00,0xcf,0x86,0x95,0x08,
+	0x14,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0xd0,0x1a,0xcf,0x86,0x95,0x14,0x54,0x04,
+	0x01,0x00,0x93,0x0c,0x92,0x08,0x11,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+	0x01,0x00,0xcf,0x86,0xd5,0x0c,0x94,0x08,0x13,0x04,0x01,0x00,0x00,0x00,0x05,0x00,
+	0x54,0x04,0x05,0x00,0x53,0x04,0x01,0x00,0x52,0x04,0x01,0x00,0x91,0x08,0x10,0x04,
+	0x06,0x00,0x07,0x00,0x00,0x00,0xd2,0xce,0xd1,0xa5,0xd0,0x37,0xcf,0x86,0xd5,0x15,
+	0x54,0x05,0x06,0xff,0x00,0x53,0x04,0x08,0x00,0x92,0x08,0x11,0x04,0x08,0x00,0x00,
+	0x00,0x00,0x00,0x94,0x1c,0xd3,0x10,0x52,0x04,0x01,0xe6,0x51,0x04,0x0a,0xe6,0x10,
+	0x04,0x0a,0xe6,0x10,0xdc,0x52,0x04,0x10,0xdc,0x11,0x04,0x10,0xdc,0x11,0xe6,0x01,
+	0x00,0xcf,0x86,0xd5,0x38,0xd4,0x24,0xd3,0x14,0x52,0x04,0x01,0x00,0xd1,0x08,0x10,
+	0x04,0x01,0x00,0x06,0x00,0x10,0x04,0x06,0x00,0x07,0x00,0x92,0x0c,0x91,0x08,0x10,
+	0x04,0x07,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x93,0x10,0x92,0x0c,0x51,0x04,0x01,
+	0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0xd4,0x18,0xd3,0x10,0x52,
+	0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x12,0x04,0x01,
+	0x00,0x00,0x00,0x93,0x18,0xd2,0x0c,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x06,
+	0x00,0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0xd0,0x06,0xcf,
+	0x06,0x01,0x00,0xcf,0x86,0x55,0x04,0x01,0x00,0x54,0x04,0x01,0x00,0x53,0x04,0x01,
+	0x00,0x52,0x04,0x01,0x00,0xd1,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x10,0x04,0x00,
+	0x00,0x01,0xff,0x00,0xd1,0x50,0xd0,0x1e,0xcf,0x86,0x95,0x18,0x94,0x14,0x93,0x10,
+	0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+	0x01,0x00,0x01,0x00,0xcf,0x86,0xd5,0x18,0x54,0x04,0x01,0x00,0x53,0x04,0x01,0x00,
+	0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x06,0x00,0x94,0x14,
+	0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x06,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
+	0x01,0x00,0x01,0x00,0xd0,0x2f,0xcf,0x86,0x55,0x04,0x01,0x00,0xd4,0x15,0x93,0x11,
+	0x92,0x0d,0x91,0x09,0x10,0x05,0x01,0xff,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
+	0x00,0x53,0x04,0x01,0x00,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,
+	0x00,0x00,0x00,0xcf,0x86,0xd5,0x38,0xd4,0x18,0xd3,0x0c,0x92,0x08,0x11,0x04,0x00,
+	0x00,0x01,0x00,0x01,0x00,0x92,0x08,0x11,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0xd3,
+	0x0c,0x92,0x08,0x11,0x04,0x00,0x00,0x01,0x00,0x01,0x00,0xd2,0x08,0x11,0x04,0x00,
+	0x00,0x01,0x00,0x91,0x08,0x10,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0xd4,0x20,0xd3,
+	0x10,0x52,0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x52,
+	0x04,0x01,0x00,0x51,0x04,0x01,0x00,0x10,0x04,0x01,0x00,0x00,0x00,0x53,0x05,0x00,
+	0xff,0x00,0xd2,0x0d,0x91,0x09,0x10,0x05,0x00,0xff,0x00,0x04,0x00,0x04,0x00,0x91,
+	0x08,0x10,0x04,0x03,0x00,0x01,0x00,0x01,0x00,0x83,0xe2,0x46,0x3e,0xe1,0x1f,0x3b,
+	0xe0,0x9c,0x39,0xcf,0x86,0xe5,0x40,0x26,0xc4,0xe3,0x16,0x14,0xe2,0xef,0x11,0xe1,
+	0xd0,0x10,0xe0,0x60,0x07,0xcf,0x86,0xe5,0x53,0x03,0xe4,0x4c,0x02,0xe3,0x3d,0x01,
+	0xd2,0x94,0xd1,0x70,0xd0,0x4a,0xcf,0x86,0xd5,0x18,0x94,0x14,0x53,0x04,0x07,0x00,
+	0x52,0x04,0x07,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,
+	0xd4,0x14,0x93,0x10,0x52,0x04,0x07,0x00,0x51,0x04,0x07,0x00,0x10,0x04,0x07,0x00,
+	0x00,0x00,0x07,0x00,0x53,0x04,0x07,0x00,0xd2,0x0c,0x51,0x04,0x07,0x00,0x10,0x04,
+	0x07,0x00,0x00,0x00,0x51,0x04,0x07,0x00,0x10,0x04,0x00,0x00,0x07,0x00,0xcf,0x86,
+	0x95,0x20,0xd4,0x10,0x53,0x04,0x07,0x00,0x52,0x04,0x07,0x00,0x11,0x04,0x07,0x00,
+	0x00,0x00,0x53,0x04,0x07,0x00,0x52,0x04,0x07,0x00,0x11,0x04,0x07,0x00,0x00,0x00,
+	0x00,0x00,0xd0,0x06,0xcf,0x06,0x07,0x00,0xcf,0x86,0x55,0x04,0x07,0x00,0x54,0x04,
+	0x07,0x00,0x53,0x04,0x07,0x00,0x92,0x0c,0x51,0x04,0x07,0x00,0x10,0x04,0x07,0x00,
+	0x00,0x00,0x00,0x00,0xd1,0x40,0xd0,0x3a,0xcf,0x86,0xd5,0x20,0x94,0x1c,0x93,0x18,
+	0xd2,0x0c,0x51,0x04,0x07,0x00,0x10,0x04,0x07,0x00,0x00,0x00,0x51,0x04,0x00,0x00,
+	0x10,0x04,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x54,0x04,0x07,0x00,0x93,0x10,
+	0x52,0x04,0x07,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x07,0x00,0x07,0x00,
+	0xcf,0x06,0x08,0x00,0xd0,0x46,0xcf,0x86,0xd5,0x2c,0xd4,0x20,0x53,0x04,0x08,0x00,
+	0xd2,0x0c,0x51,0x04,0x08,0x00,0x10,0x04,0x08,0x00,0x10,0x00,0xd1,0x08,0x10,0x04,
+	0x10,0x00,0x12,0x00,0x10,0x04,0x12,0x00,0x00,0x00,0x53,0x04,0x0a,0x00,0x12,0x04,
+	0x0a,0x00,0x00,0x00,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x10,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0xd5,0x08,0x14,0x04,
+	0x00,0x00,0x0a,0x00,0x54,0x04,0x0a,0x00,0x53,0x04,0x0a,0x00,0x52,0x04,0x0a,0x00,
+	0x91,0x08,0x10,0x04,0x0a,0x00,0x0a,0xdc,0x00,0x00,0xd2,0x5e,0xd1,0x06,0xcf,0x06,
+	0x00,0x00,0xd0,0x1e,0xcf,0x86,0x95,0x18,0x54,0x04,0x0a,0x00,0x53,0x04,0x0a,0x00,
+	0x52,0x04,0x0a,0x00,0x91,0x08,0x10,0x04,0x0a,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,
+	0xcf,0x86,0xd5,0x18,0x54,0x04,0x0a,0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,
+	0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x14,0x93,0x10,0x92,0x0c,
+	0x91,0x08,0x10,0x04,0x10,0xdc,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x53,0x04,
+	0x10,0x00,0x12,0x04,0x10,0x00,0x00,0x00,0xd1,0x70,0xd0,0x36,0xcf,0x86,0xd5,0x18,
+	0x54,0x04,0x05,0x00,0x53,0x04,0x05,0x00,0x52,0x04,0x05,0x00,0x51,0x04,0x05,0x00,
+	0x10,0x04,0x05,0x00,0x10,0x00,0x94,0x18,0xd3,0x08,0x12,0x04,0x05,0x00,0x00,0x00,
+	0x52,0x04,0x00,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x13,0x00,0x13,0x00,0x05,0x00,
+	0xcf,0x86,0xd5,0x18,0x94,0x14,0x53,0x04,0x05,0x00,0x92,0x0c,0x51,0x04,0x05,0x00,
+	0x10,0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x54,0x04,0x10,0x00,0xd3,0x0c,
+	0x52,0x04,0x10,0x00,0x11,0x04,0x10,0x00,0x10,0xe6,0x92,0x0c,0x51,0x04,0x10,0xe6,
+	0x10,0x04,0x10,0xe6,0x00,0x00,0x00,0x00,0xd0,0x1e,0xcf,0x86,0x95,0x18,0x54,0x04,
+	0x07,0x00,0x53,0x04,0x07,0x00,0x52,0x04,0x07,0x00,0x51,0x04,0x07,0x00,0x10,0x04,
+	0x00,0x00,0x07,0x00,0x08,0x00,0xcf,0x86,0x95,0x1c,0xd4,0x0c,0x93,0x08,0x12,0x04,
+	0x08,0x00,0x00,0x00,0x08,0x00,0x93,0x0c,0x52,0x04,0x08,0x00,0x11,0x04,0x08,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0xba,0xd2,0x80,0xd1,0x34,0xd0,0x1a,0xcf,0x86,
+	0x55,0x04,0x05,0x00,0x94,0x10,0x93,0x0c,0x52,0x04,0x05,0x00,0x11,0x04,0x05,0x00,
+	0x07,0x00,0x05,0x00,0x05,0x00,0xcf,0x86,0x95,0x14,0x94,0x10,0x53,0x04,0x05,0x00,
+	0x52,0x04,0x05,0x00,0x11,0x04,0x05,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0xd0,0x2a,
+	0xcf,0x86,0xd5,0x14,0x54,0x04,0x07,0x00,0x53,0x04,0x07,0x00,0x52,0x04,0x07,0x00,
+	0x11,0x04,0x07,0x00,0x00,0x00,0x94,0x10,0x53,0x04,0x07,0x00,0x92,0x08,0x11,0x04,
+	0x07,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0xcf,0x86,0xd5,0x10,0x54,0x04,0x12,0x00,
+	0x93,0x08,0x12,0x04,0x12,0x00,0x00,0x00,0x12,0x00,0x54,0x04,0x12,0x00,0x53,0x04,
+	0x12,0x00,0x12,0x04,0x12,0x00,0x00,0x00,0xd1,0x34,0xd0,0x12,0xcf,0x86,0x55,0x04,
+	0x10,0x00,0x94,0x08,0x13,0x04,0x10,0x00,0x00,0x00,0x10,0x00,0xcf,0x86,0x55,0x04,
+	0x10,0x00,0x94,0x18,0xd3,0x08,0x12,0x04,0x10,0x00,0x00,0x00,0x52,0x04,0x00,0x00,
+	0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,
+	0xd2,0x06,0xcf,0x06,0x10,0x00,0xd1,0x40,0xd0,0x1e,0xcf,0x86,0x55,0x04,0x10,0x00,
+	0x54,0x04,0x10,0x00,0x93,0x10,0x52,0x04,0x10,0x00,0x51,0x04,0x10,0x00,0x10,0x04,
+	0x10,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0xd5,0x14,0x54,0x04,0x10,0x00,0x93,0x0c,
+	0x52,0x04,0x10,0x00,0x11,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x94,0x08,0x13,0x04,
+	0x10,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xe4,0xce,0x02,0xe3,0x45,0x01,
+	0xd2,0xd0,0xd1,0x70,0xd0,0x52,0xcf,0x86,0xd5,0x20,0x94,0x1c,0xd3,0x0c,0x52,0x04,
+	0x07,0x00,0x11,0x04,0x07,0x00,0x00,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x07,0x00,
+	0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x54,0x04,0x07,0x00,0xd3,0x10,0x52,0x04,
+	0x07,0x00,0x51,0x04,0x07,0x00,0x10,0x04,0x00,0x00,0x07,0x00,0xd2,0x0c,0x91,0x08,
+	0x10,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0xd1,0x08,0x10,0x04,0x07,0x00,0x00,0x00,
+	0x10,0x04,0x00,0x00,0x07,0x00,0xcf,0x86,0x95,0x18,0x54,0x04,0x0b,0x00,0x93,0x10,
+	0x52,0x04,0x0b,0x00,0x51,0x04,0x0b,0x00,0x10,0x04,0x00,0x00,0x0b,0x00,0x0b,0x00,
+	0x10,0x00,0xd0,0x32,0xcf,0x86,0xd5,0x18,0x54,0x04,0x10,0x00,0x53,0x04,0x10,0x00,
+	0x52,0x04,0x10,0x00,0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x00,0x00,0x00,0x94,0x14,
+	0x93,0x10,0x52,0x04,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0x00,
+	0x10,0x00,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x11,0x00,0xd3,0x14,
+	0xd2,0x0c,0x51,0x04,0x11,0x00,0x10,0x04,0x11,0x00,0x00,0x00,0x11,0x04,0x11,0x00,
+	0x00,0x00,0x92,0x0c,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x11,0x00,0x11,0x00,
+	0xd1,0x40,0xd0,0x3a,0xcf,0x86,0xd5,0x1c,0x54,0x04,0x09,0x00,0x53,0x04,0x09,0x00,
+	0xd2,0x08,0x11,0x04,0x09,0x00,0x0b,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,
+	0x09,0x00,0x54,0x04,0x0a,0x00,0x53,0x04,0x0a,0x00,0xd2,0x08,0x11,0x04,0x0a,0x00,
+	0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x0a,0x00,0xcf,0x06,0x00,0x00,
+	0xd0,0x1a,0xcf,0x86,0x55,0x04,0x0d,0x00,0x54,0x04,0x0d,0x00,0x53,0x04,0x0d,0x00,
+	0x52,0x04,0x00,0x00,0x11,0x04,0x11,0x00,0x0d,0x00,0xcf,0x86,0x95,0x14,0x54,0x04,
+	0x11,0x00,0x93,0x0c,0x92,0x08,0x11,0x04,0x00,0x00,0x11,0x00,0x11,0x00,0x11,0x00,
+	0x11,0x00,0xd2,0xec,0xd1,0xa4,0xd0,0x76,0xcf,0x86,0xd5,0x48,0xd4,0x28,0xd3,0x14,
+	0x52,0x04,0x08,0x00,0xd1,0x08,0x10,0x04,0x00,0x00,0x08,0x00,0x10,0x04,0x08,0x00,
+	0x00,0x00,0x52,0x04,0x00,0x00,0xd1,0x08,0x10,0x04,0x08,0x00,0x08,0xdc,0x10,0x04,
+	0x08,0x00,0x08,0xe6,0xd3,0x10,0x52,0x04,0x08,0x00,0x91,0x08,0x10,0x04,0x00,0x00,
+	0x08,0x00,0x08,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x08,0x00,0x08,0x00,
+	0x08,0x00,0x54,0x04,0x08,0x00,0xd3,0x0c,0x52,0x04,0x08,0x00,0x11,0x04,0x14,0x00,
+	0x00,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x08,0xe6,0x08,0x01,0x10,0x04,0x08,0xdc,
+	0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x08,0x09,0xcf,0x86,0x95,0x28,
+	0xd4,0x14,0x53,0x04,0x08,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x14,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x53,0x04,0x08,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x08,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0xd0,0x0a,0xcf,0x86,0x15,0x04,0x10,0x00,
+	0x00,0x00,0xcf,0x86,0x55,0x04,0x10,0x00,0xd4,0x24,0xd3,0x14,0x52,0x04,0x10,0x00,
+	0xd1,0x08,0x10,0x04,0x10,0x00,0x10,0xe6,0x10,0x04,0x10,0xdc,0x00,0x00,0x92,0x0c,
+	0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0x00,0x10,0x00,0x93,0x10,0x52,0x04,
+	0x10,0x00,0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0xd1,0x54,
+	0xd0,0x26,0xcf,0x86,0x55,0x04,0x0b,0x00,0x54,0x04,0x0b,0x00,0xd3,0x0c,0x52,0x04,
+	0x0b,0x00,0x11,0x04,0x0b,0x00,0x00,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,
+	0x0b,0x00,0x0b,0x00,0x0b,0x00,0xcf,0x86,0xd5,0x14,0x54,0x04,0x0b,0x00,0x93,0x0c,
+	0x52,0x04,0x0b,0x00,0x11,0x04,0x0b,0x00,0x00,0x00,0x0b,0x00,0x54,0x04,0x0b,0x00,
+	0x93,0x10,0x92,0x0c,0x51,0x04,0x0b,0x00,0x10,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,
+	0x0b,0x00,0xd0,0x42,0xcf,0x86,0xd5,0x28,0x54,0x04,0x10,0x00,0xd3,0x0c,0x92,0x08,
+	0x11,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0xd2,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,
+	0x10,0x00,0x10,0x00,0x91,0x08,0x10,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x94,0x14,
+	0x53,0x04,0x00,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x10,0x00,0x10,0x00,
+	0x10,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xd3,0x96,0xd2,0x68,0xd1,0x24,0xd0,0x06,
+	0xcf,0x06,0x0b,0x00,0xcf,0x86,0x95,0x18,0x94,0x14,0x53,0x04,0x0b,0x00,0x92,0x0c,
+	0x91,0x08,0x10,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0xd0,0x1e,0xcf,0x86,0x55,0x04,0x11,0x00,0x54,0x04,0x11,0x00,0x93,0x10,0x92,0x0c,
+	0x51,0x04,0x11,0x00,0x10,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,
+	0x55,0x04,0x11,0x00,0x54,0x04,0x11,0x00,0xd3,0x10,0x92,0x0c,0x51,0x04,0x11,0x00,
+	0x10,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0x92,0x08,0x11,0x04,0x00,0x00,0x11,0x00,
+	0x11,0x00,0xd1,0x28,0xd0,0x22,0xcf,0x86,0x55,0x04,0x14,0x00,0xd4,0x0c,0x93,0x08,
+	0x12,0x04,0x14,0x00,0x14,0xe6,0x00,0x00,0x53,0x04,0x14,0x00,0x92,0x08,0x11,0x04,
+	0x14,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xd2,0x2a,
+	0xd1,0x24,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,
+	0x0b,0x00,0x53,0x04,0x0b,0x00,0x52,0x04,0x0b,0x00,0x51,0x04,0x0b,0x00,0x10,0x04,
+	0x0b,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xd1,0x58,0xd0,0x12,0xcf,0x86,0x55,0x04,
+	0x14,0x00,0x94,0x08,0x13,0x04,0x14,0x00,0x00,0x00,0x14,0x00,0xcf,0x86,0x95,0x40,
+	0xd4,0x24,0xd3,0x0c,0x52,0x04,0x14,0x00,0x11,0x04,0x14,0x00,0x14,0xdc,0xd2,0x0c,
+	0x51,0x04,0x14,0xe6,0x10,0x04,0x14,0xe6,0x14,0xdc,0x91,0x08,0x10,0x04,0x14,0xe6,
+	0x14,0xdc,0x14,0xdc,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x14,0xdc,0x14,0x00,
+	0x14,0x00,0x14,0x00,0x92,0x08,0x11,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x15,0x00,
+	0x93,0x10,0x52,0x04,0x15,0x00,0x51,0x04,0x15,0x00,0x10,0x04,0x15,0x00,0x00,0x00,
+	0x00,0x00,0xcf,0x86,0xe5,0x0f,0x06,0xe4,0xf8,0x03,0xe3,0x02,0x02,0xd2,0xfb,0xd1,
+	0x4c,0xd0,0x06,0xcf,0x06,0x0c,0x00,0xcf,0x86,0xd5,0x2c,0xd4,0x1c,0xd3,0x10,0x52,
+	0x04,0x0c,0x00,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x09,0x0c,0x00,0x52,0x04,0x0c,
+	0x00,0x11,0x04,0x0c,0x00,0x00,0x00,0x93,0x0c,0x92,0x08,0x11,0x04,0x00,0x00,0x0c,
+	0x00,0x0c,0x00,0x0c,0x00,0x54,0x04,0x0c,0x00,0x53,0x04,0x00,0x00,0x52,0x04,0x00,
+	0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0x09,0xd0,0x69,0xcf,0x86,0xd5,
+	0x32,0x54,0x04,0x0b,0x00,0x53,0x04,0x0b,0x00,0xd2,0x15,0x51,0x04,0x0b,0x00,0x10,
+	0x0d,0x0b,0xff,0xf0,0x91,0x82,0x99,0xf0,0x91,0x82,0xba,0x00,0x0b,0x00,0x91,0x11,
+	0x10,0x0d,0x0b,0xff,0xf0,0x91,0x82,0x9b,0xf0,0x91,0x82,0xba,0x00,0x0b,0x00,0x0b,
+	0x00,0xd4,0x1d,0x53,0x04,0x0b,0x00,0x92,0x15,0x51,0x04,0x0b,0x00,0x10,0x04,0x0b,
+	0x00,0x0b,0xff,0xf0,0x91,0x82,0xa5,0xf0,0x91,0x82,0xba,0x00,0x0b,0x00,0x53,0x04,
+	0x0b,0x00,0x92,0x10,0xd1,0x08,0x10,0x04,0x0b,0x00,0x0b,0x09,0x10,0x04,0x0b,0x07,
+	0x0b,0x00,0x0b,0x00,0xcf,0x86,0xd5,0x20,0x94,0x1c,0xd3,0x0c,0x92,0x08,0x11,0x04,
+	0x0b,0x00,0x00,0x00,0x00,0x00,0x52,0x04,0x00,0x00,0x91,0x08,0x10,0x04,0x00,0x00,
+	0x14,0x00,0x00,0x00,0x0d,0x00,0xd4,0x14,0x53,0x04,0x0d,0x00,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x04,0x0d,0x00,0x92,0x08,
+	0x11,0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0xd1,0x96,0xd0,0x5c,0xcf,0x86,0xd5,0x18,
+	0x94,0x14,0x93,0x10,0x92,0x0c,0x51,0x04,0x0d,0xe6,0x10,0x04,0x0d,0xe6,0x0d,0x00,
+	0x0d,0x00,0x0d,0x00,0x0d,0x00,0xd4,0x26,0x53,0x04,0x0d,0x00,0x52,0x04,0x0d,0x00,
+	0x51,0x04,0x0d,0x00,0x10,0x0d,0x0d,0xff,0xf0,0x91,0x84,0xb1,0xf0,0x91,0x84,0xa7,
+	0x00,0x0d,0xff,0xf0,0x91,0x84,0xb2,0xf0,0x91,0x84,0xa7,0x00,0x93,0x18,0xd2,0x0c,
+	0x51,0x04,0x0d,0x00,0x10,0x04,0x0d,0x00,0x0d,0x09,0x91,0x08,0x10,0x04,0x0d,0x09,
+	0x00,0x00,0x0d,0x00,0x0d,0x00,0xcf,0x86,0xd5,0x18,0x94,0x14,0x93,0x10,0x52,0x04,
+	0x0d,0x00,0x51,0x04,0x14,0x00,0x10,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+	0x54,0x04,0x10,0x00,0x93,0x18,0xd2,0x0c,0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x00,
+	0x10,0x07,0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0xd0,0x06,
+	0xcf,0x06,0x0d,0x00,0xcf,0x86,0xd5,0x40,0xd4,0x2c,0xd3,0x10,0x92,0x0c,0x91,0x08,
+	0x10,0x04,0x0d,0x09,0x0d,0x00,0x0d,0x00,0x0d,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,
+	0x0d,0x00,0x11,0x00,0x10,0x04,0x11,0x07,0x11,0x00,0x91,0x08,0x10,0x04,0x11,0x00,
+	0x10,0x00,0x00,0x00,0x53,0x04,0x0d,0x00,0x92,0x0c,0x51,0x04,0x0d,0x00,0x10,0x04,
+	0x10,0x00,0x11,0x00,0x11,0x00,0xd4,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,
+	0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x93,0x10,0x52,0x04,0x10,0x00,
+	0x91,0x08,0x10,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0xc8,0xd1,0x48,
+	0xd0,0x42,0xcf,0x86,0xd5,0x18,0x54,0x04,0x10,0x00,0x93,0x10,0x92,0x0c,0x51,0x04,
+	0x10,0x00,0x10,0x04,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x54,0x04,0x10,0x00,
+	0xd3,0x14,0x52,0x04,0x10,0x00,0xd1,0x08,0x10,0x04,0x10,0x00,0x10,0x09,0x10,0x04,
+	0x10,0x07,0x10,0x00,0x52,0x04,0x10,0x00,0x51,0x04,0x10,0x00,0x10,0x04,0x12,0x00,
+	0x00,0x00,0xcf,0x06,0x00,0x00,0xd0,0x52,0xcf,0x86,0xd5,0x3c,0xd4,0x28,0xd3,0x10,
+	0x52,0x04,0x11,0x00,0x51,0x04,0x11,0x00,0x10,0x04,0x11,0x00,0x00,0x00,0xd2,0x0c,
+	0x91,0x08,0x10,0x04,0x11,0x00,0x00,0x00,0x11,0x00,0x51,0x04,0x11,0x00,0x10,0x04,
+	0x00,0x00,0x11,0x00,0x53,0x04,0x11,0x00,0x52,0x04,0x11,0x00,0x51,0x04,0x11,0x00,
+	0x10,0x04,0x00,0x00,0x11,0x00,0x94,0x10,0x53,0x04,0x11,0x00,0x92,0x08,0x11,0x04,
+	0x11,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0xcf,0x86,0x55,0x04,0x10,0x00,0xd4,0x18,
+	0x53,0x04,0x10,0x00,0x92,0x10,0xd1,0x08,0x10,0x04,0x10,0x00,0x10,0x07,0x10,0x04,
+	0x10,0x09,0x00,0x00,0x00,0x00,0x53,0x04,0x10,0x00,0x92,0x08,0x11,0x04,0x10,0x00,
+	0x00,0x00,0x00,0x00,0xe1,0x27,0x01,0xd0,0x8a,0xcf,0x86,0xd5,0x44,0xd4,0x2c,0xd3,
+	0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,0x11,0x00,0x10,0x00,0x10,0x00,0x91,0x08,0x10,
+	0x04,0x00,0x00,0x10,0x00,0x10,0x00,0x52,0x04,0x10,0x00,0xd1,0x08,0x10,0x04,0x10,
+	0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0x00,0x93,0x14,0x92,0x10,0xd1,0x08,0x10,
+	0x04,0x10,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0xd4,
+	0x14,0x53,0x04,0x10,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x10,0x00,0x00,0x00,0x10,
+	0x00,0x10,0x00,0xd3,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,0x10,0x00,0x00,0x00,0x10,
+	0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x10,0x00,0x10,0x00,0xd2,0x0c,0x51,0x04,0x10,
+	0x00,0x10,0x04,0x00,0x00,0x14,0x07,0x91,0x08,0x10,0x04,0x10,0x07,0x10,0x00,0x10,
+	0x00,0xcf,0x86,0xd5,0x6a,0xd4,0x42,0xd3,0x14,0x52,0x04,0x10,0x00,0xd1,0x08,0x10,
+	0x04,0x10,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0x00,0xd2,0x19,0xd1,0x08,0x10,
+	0x04,0x10,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0xff,0xf0,0x91,0x8d,0x87,0xf0,
+	0x91,0x8c,0xbe,0x00,0x91,0x11,0x10,0x0d,0x10,0xff,0xf0,0x91,0x8d,0x87,0xf0,0x91,
+	0x8d,0x97,0x00,0x10,0x09,0x00,0x00,0xd3,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,0x11,
+	0x00,0x00,0x00,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0x00,0x52,
+	0x04,0x00,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x10,0x00,0x10,0x00,0xd4,0x1c,0xd3,
+	0x0c,0x52,0x04,0x10,0x00,0x11,0x04,0x00,0x00,0x10,0xe6,0x52,0x04,0x10,0xe6,0x91,
+	0x08,0x10,0x04,0x10,0xe6,0x00,0x00,0x00,0x00,0x93,0x10,0x52,0x04,0x10,0xe6,0x91,
+	0x08,0x10,0x04,0x10,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xe3,
+	0x30,0x01,0xd2,0xb7,0xd1,0x48,0xd0,0x06,0xcf,0x06,0x12,0x00,0xcf,0x86,0x95,0x3c,
+	0xd4,0x1c,0x93,0x18,0xd2,0x0c,0x51,0x04,0x12,0x00,0x10,0x04,0x12,0x09,0x12,0x00,
+	0x51,0x04,0x12,0x00,0x10,0x04,0x12,0x07,0x12,0x00,0x12,0x00,0x53,0x04,0x12,0x00,
+	0xd2,0x0c,0x51,0x04,0x12,0x00,0x10,0x04,0x00,0x00,0x12,0x00,0xd1,0x08,0x10,0x04,
+	0x00,0x00,0x12,0x00,0x10,0x04,0x14,0xe6,0x15,0x00,0x00,0x00,0xd0,0x45,0xcf,0x86,
+	0x55,0x04,0x10,0x00,0x54,0x04,0x10,0x00,0x53,0x04,0x10,0x00,0xd2,0x15,0x51,0x04,
+	0x10,0x00,0x10,0x04,0x10,0x00,0x10,0xff,0xf0,0x91,0x92,0xb9,0xf0,0x91,0x92,0xba,
+	0x00,0xd1,0x11,0x10,0x0d,0x10,0xff,0xf0,0x91,0x92,0xb9,0xf0,0x91,0x92,0xb0,0x00,
+	0x10,0x00,0x10,0x0d,0x10,0xff,0xf0,0x91,0x92,0xb9,0xf0,0x91,0x92,0xbd,0x00,0x10,
+	0x00,0xcf,0x86,0x95,0x24,0xd4,0x14,0x93,0x10,0x92,0x0c,0x51,0x04,0x10,0x00,0x10,
+	0x04,0x10,0x09,0x10,0x07,0x10,0x00,0x00,0x00,0x53,0x04,0x10,0x00,0x92,0x08,0x11,
+	0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x06,0xcf,0x06,0x00,0x00,0xd0,
+	0x40,0xcf,0x86,0x55,0x04,0x10,0x00,0x54,0x04,0x10,0x00,0xd3,0x0c,0x52,0x04,0x10,
+	0x00,0x11,0x04,0x10,0x00,0x00,0x00,0xd2,0x1e,0x51,0x04,0x10,0x00,0x10,0x0d,0x10,
+	0xff,0xf0,0x91,0x96,0xb8,0xf0,0x91,0x96,0xaf,0x00,0x10,0xff,0xf0,0x91,0x96,0xb9,
+	0xf0,0x91,0x96,0xaf,0x00,0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x00,0x10,0x09,0xcf,
+	0x86,0x95,0x2c,0xd4,0x1c,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x10,0x07,0x10,
+	0x00,0x10,0x00,0x10,0x00,0x92,0x08,0x11,0x04,0x10,0x00,0x11,0x00,0x11,0x00,0x53,
+	0x04,0x11,0x00,0x52,0x04,0x11,0x00,0x11,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0xd2,
+	0xa0,0xd1,0x5c,0xd0,0x1e,0xcf,0x86,0x55,0x04,0x10,0x00,0x54,0x04,0x10,0x00,0x53,
+	0x04,0x10,0x00,0x52,0x04,0x10,0x00,0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x00,0x10,
+	0x09,0xcf,0x86,0xd5,0x24,0xd4,0x14,0x93,0x10,0x52,0x04,0x10,0x00,0x91,0x08,0x10,
+	0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x04,0x10,0x00,0x92,0x08,0x11,
+	0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x94,0x14,0x53,0x04,0x12,0x00,0x52,0x04,0x12,
+	0x00,0x91,0x08,0x10,0x04,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x2a,0xcf,
+	0x86,0x55,0x04,0x0d,0x00,0x54,0x04,0x0d,0x00,0xd3,0x10,0x52,0x04,0x0d,0x00,0x51,
+	0x04,0x0d,0x00,0x10,0x04,0x0d,0x09,0x0d,0x07,0x92,0x0c,0x91,0x08,0x10,0x04,0x15,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0x95,0x14,0x94,0x10,0x53,0x04,0x0d,
+	0x00,0x92,0x08,0x11,0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,
+	0x40,0xd0,0x3a,0xcf,0x86,0xd5,0x20,0x54,0x04,0x11,0x00,0x53,0x04,0x11,0x00,0xd2,
+	0x0c,0x51,0x04,0x11,0x00,0x10,0x04,0x14,0x00,0x00,0x00,0x91,0x08,0x10,0x04,0x00,
+	0x00,0x11,0x00,0x11,0x00,0x94,0x14,0x53,0x04,0x11,0x00,0x92,0x0c,0x51,0x04,0x11,
+	0x00,0x10,0x04,0x11,0x00,0x11,0x09,0x00,0x00,0x11,0x00,0xcf,0x06,0x00,0x00,0xcf,
+	0x06,0x00,0x00,0xe4,0x59,0x01,0xd3,0xb2,0xd2,0x5c,0xd1,0x28,0xd0,0x22,0xcf,0x86,
+	0x55,0x04,0x14,0x00,0x54,0x04,0x14,0x00,0x53,0x04,0x14,0x00,0x92,0x10,0xd1,0x08,
+	0x10,0x04,0x14,0x00,0x14,0x09,0x10,0x04,0x14,0x07,0x14,0x00,0x00,0x00,0xcf,0x06,
+	0x00,0x00,0xd0,0x0a,0xcf,0x86,0x15,0x04,0x00,0x00,0x10,0x00,0xcf,0x86,0x55,0x04,
+	0x10,0x00,0x54,0x04,0x10,0x00,0xd3,0x10,0x92,0x0c,0x51,0x04,0x10,0x00,0x10,0x04,
+	0x10,0x00,0x00,0x00,0x00,0x00,0x52,0x04,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,
+	0x00,0x00,0x10,0x00,0xd1,0x06,0xcf,0x06,0x00,0x00,0xd0,0x1a,0xcf,0x86,0x55,0x04,
+	0x00,0x00,0x94,0x10,0x53,0x04,0x15,0x00,0x92,0x08,0x11,0x04,0x00,0x00,0x15,0x00,
+	0x15,0x00,0x15,0x00,0xcf,0x86,0xd5,0x14,0x54,0x04,0x15,0x00,0x53,0x04,0x15,0x00,
+	0x92,0x08,0x11,0x04,0x00,0x00,0x15,0x00,0x15,0x00,0x94,0x1c,0x93,0x18,0xd2,0x0c,
+	0x91,0x08,0x10,0x04,0x15,0x09,0x15,0x00,0x15,0x00,0x91,0x08,0x10,0x04,0x15,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0xa0,0xd1,0x3c,0xd0,0x1e,0xcf,0x86,
+	0x55,0x04,0x13,0x00,0x54,0x04,0x13,0x00,0x93,0x10,0x52,0x04,0x13,0x00,0x91,0x08,
+	0x10,0x04,0x13,0x09,0x13,0x00,0x13,0x00,0x13,0x00,0xcf,0x86,0x95,0x18,0x94,0x14,
+	0x93,0x10,0x52,0x04,0x13,0x00,0x51,0x04,0x13,0x00,0x10,0x04,0x13,0x00,0x13,0x09,
+	0x00,0x00,0x13,0x00,0x13,0x00,0xd0,0x46,0xcf,0x86,0xd5,0x2c,0xd4,0x10,0x93,0x0c,
+	0x52,0x04,0x13,0x00,0x11,0x04,0x15,0x00,0x13,0x00,0x13,0x00,0x53,0x04,0x13,0x00,
+	0xd2,0x0c,0x91,0x08,0x10,0x04,0x13,0x00,0x13,0x09,0x13,0x00,0x91,0x08,0x10,0x04,
+	0x13,0x00,0x14,0x00,0x13,0x00,0x94,0x14,0x93,0x10,0x92,0x0c,0x51,0x04,0x13,0x00,
+	0x10,0x04,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0x55,0x04,
+	0x10,0x00,0x54,0x04,0x10,0x00,0x53,0x04,0x10,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,
+	0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xe3,0xa9,0x01,0xd2,
+	0xb0,0xd1,0x6c,0xd0,0x3e,0xcf,0x86,0xd5,0x18,0x94,0x14,0x53,0x04,0x12,0x00,0x92,
+	0x0c,0x91,0x08,0x10,0x04,0x12,0x00,0x00,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x54,
+	0x04,0x12,0x00,0xd3,0x10,0x52,0x04,0x12,0x00,0x51,0x04,0x12,0x00,0x10,0x04,0x12,
+	0x00,0x00,0x00,0x52,0x04,0x12,0x00,0x51,0x04,0x12,0x00,0x10,0x04,0x12,0x00,0x12,
+	0x09,0xcf,0x86,0xd5,0x14,0x94,0x10,0x93,0x0c,0x52,0x04,0x12,0x00,0x11,0x04,0x12,
+	0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x94,0x14,0x53,0x04,0x12,0x00,0x52,0x04,0x12,
+	0x00,0x91,0x08,0x10,0x04,0x12,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0xd0,0x3e,0xcf,
+	0x86,0xd5,0x14,0x54,0x04,0x12,0x00,0x93,0x0c,0x92,0x08,0x11,0x04,0x00,0x00,0x12,
+	0x00,0x12,0x00,0x12,0x00,0xd4,0x14,0x53,0x04,0x12,0x00,0x92,0x0c,0x91,0x08,0x10,
+	0x04,0x00,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x93,0x10,0x52,0x04,0x12,0x00,0x51,
+	0x04,0x12,0x00,0x10,0x04,0x12,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xd1,
+	0xa0,0xd0,0x52,0xcf,0x86,0xd5,0x24,0x94,0x20,0xd3,0x10,0x52,0x04,0x13,0x00,0x51,
+	0x04,0x13,0x00,0x10,0x04,0x13,0x00,0x00,0x00,0x92,0x0c,0x51,0x04,0x13,0x00,0x10,
+	0x04,0x00,0x00,0x13,0x00,0x13,0x00,0x13,0x00,0x54,0x04,0x13,0x00,0xd3,0x10,0x52,
+	0x04,0x13,0x00,0x51,0x04,0x13,0x00,0x10,0x04,0x13,0x00,0x00,0x00,0xd2,0x0c,0x51,
+	0x04,0x00,0x00,0x10,0x04,0x13,0x00,0x00,0x00,0x51,0x04,0x13,0x00,0x10,0x04,0x00,
+	0x00,0x13,0x00,0xcf,0x86,0xd5,0x28,0xd4,0x18,0x93,0x14,0xd2,0x0c,0x51,0x04,0x13,
+	0x00,0x10,0x04,0x13,0x07,0x13,0x00,0x11,0x04,0x13,0x09,0x13,0x00,0x00,0x00,0x53,
+	0x04,0x13,0x00,0x92,0x08,0x11,0x04,0x13,0x00,0x00,0x00,0x00,0x00,0x94,0x20,0xd3,
+	0x10,0x52,0x04,0x14,0x00,0x51,0x04,0x14,0x00,0x10,0x04,0x00,0x00,0x14,0x00,0x92,
+	0x0c,0x91,0x08,0x10,0x04,0x14,0x00,0x00,0x00,0x14,0x00,0x14,0x00,0x14,0x00,0xd0,
+	0x52,0xcf,0x86,0xd5,0x3c,0xd4,0x14,0x53,0x04,0x14,0x00,0x52,0x04,0x14,0x00,0x51,
+	0x04,0x14,0x00,0x10,0x04,0x14,0x00,0x00,0x00,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x14,
+	0x00,0x10,0x04,0x00,0x00,0x14,0x00,0x51,0x04,0x14,0x00,0x10,0x04,0x14,0x00,0x14,
+	0x09,0x92,0x0c,0x91,0x08,0x10,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,
+	0x10,0x53,0x04,0x14,0x00,0x92,0x08,0x11,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0xcf,0x06,0x00,0x00,0xd2,0x2a,0xd1,0x06,0xcf,0x06,0x00,0x00,0xd0,0x06,0xcf,
+	0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x14,0x00,0x53,0x04,0x14,
+	0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,
+	0x06,0xcf,0x06,0x00,0x00,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x15,
+	0x00,0x54,0x04,0x15,0x00,0xd3,0x0c,0x92,0x08,0x11,0x04,0x15,0x00,0x00,0x00,0x00,
+	0x00,0x52,0x04,0x00,0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x15,0x00,0xd0,
+	0xca,0xcf,0x86,0xd5,0xc2,0xd4,0x54,0xd3,0x06,0xcf,0x06,0x09,0x00,0xd2,0x06,0xcf,
+	0x06,0x09,0x00,0xd1,0x24,0xd0,0x06,0xcf,0x06,0x09,0x00,0xcf,0x86,0x55,0x04,0x09,
+	0x00,0x94,0x14,0x53,0x04,0x09,0x00,0x52,0x04,0x09,0x00,0x51,0x04,0x09,0x00,0x10,
+	0x04,0x09,0x00,0x10,0x00,0x10,0x00,0xd0,0x1e,0xcf,0x86,0x95,0x18,0x54,0x04,0x10,
+	0x00,0x53,0x04,0x10,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x10,0x00,0x11,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xd3,0x68,0xd2,0x46,0xd1,0x40,0xd0,
+	0x06,0xcf,0x06,0x09,0x00,0xcf,0x86,0x55,0x04,0x09,0x00,0xd4,0x20,0xd3,0x10,0x92,
+	0x0c,0x51,0x04,0x09,0x00,0x10,0x04,0x09,0x00,0x10,0x00,0x10,0x00,0x52,0x04,0x10,
+	0x00,0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x00,0x00,0x00,0x93,0x10,0x52,0x04,0x09,
+	0x00,0x91,0x08,0x10,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x11,
+	0x00,0xd1,0x1c,0xd0,0x06,0xcf,0x06,0x11,0x00,0xcf,0x86,0x95,0x10,0x94,0x0c,0x93,
+	0x08,0x12,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,
+	0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x86,0xd5,0x4c,0xd4,0x06,0xcf,
+	0x06,0x0b,0x00,0xd3,0x40,0xd2,0x3a,0xd1,0x34,0xd0,0x2e,0xcf,0x86,0x55,0x04,0x0b,
+	0x00,0xd4,0x14,0x53,0x04,0x0b,0x00,0x52,0x04,0x0b,0x00,0x51,0x04,0x0b,0x00,0x10,
+	0x04,0x0b,0x00,0x00,0x00,0x53,0x04,0x15,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x15,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,
+	0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xd1,0x4c,0xd0,0x44,0xcf,
+	0x86,0xd5,0x3c,0xd4,0x06,0xcf,0x06,0x00,0x00,0xd3,0x06,0xcf,0x06,0x11,0x00,0xd2,
+	0x2a,0xd1,0x24,0xd0,0x06,0xcf,0x06,0x11,0x00,0xcf,0x86,0x95,0x18,0x94,0x14,0x93,
+	0x10,0x52,0x04,0x11,0x00,0x51,0x04,0x11,0x00,0x10,0x04,0x11,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,
+	0x00,0xcf,0x86,0xcf,0x06,0x00,0x00,0xe0,0xd2,0x01,0xcf,0x86,0xd5,0x06,0xcf,0x06,
+	0x00,0x00,0xe4,0x0b,0x01,0xd3,0x06,0xcf,0x06,0x0c,0x00,0xd2,0x84,0xd1,0x50,0xd0,
+	0x1e,0xcf,0x86,0x55,0x04,0x0c,0x00,0x54,0x04,0x0c,0x00,0x53,0x04,0x0c,0x00,0x92,
+	0x0c,0x91,0x08,0x10,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0xd5,
+	0x18,0x54,0x04,0x10,0x00,0x53,0x04,0x10,0x00,0x52,0x04,0x10,0x00,0x51,0x04,0x10,
+	0x00,0x10,0x04,0x10,0x00,0x00,0x00,0x94,0x14,0x53,0x04,0x10,0x00,0xd2,0x08,0x11,
+	0x04,0x10,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x10,0x00,0x00,0x00,0xd0,0x06,0xcf,
+	0x06,0x00,0x00,0xcf,0x86,0xd5,0x08,0x14,0x04,0x00,0x00,0x10,0x00,0xd4,0x10,0x53,
+	0x04,0x10,0x00,0x52,0x04,0x10,0x00,0x11,0x04,0x10,0x00,0x00,0x00,0x93,0x10,0x52,
+	0x04,0x10,0x01,0x91,0x08,0x10,0x04,0x10,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0xd1,
+	0x6c,0xd0,0x1e,0xcf,0x86,0x55,0x04,0x10,0x00,0x54,0x04,0x10,0x00,0x93,0x10,0x52,
+	0x04,0x10,0xe6,0x51,0x04,0x10,0xe6,0x10,0x04,0x10,0xe6,0x10,0x00,0x10,0x00,0xcf,
+	0x86,0xd5,0x24,0xd4,0x10,0x93,0x0c,0x52,0x04,0x10,0x00,0x11,0x04,0x10,0x00,0x00,
+	0x00,0x00,0x00,0x53,0x04,0x10,0x00,0x92,0x0c,0x51,0x04,0x10,0x00,0x10,0x04,0x00,
+	0x00,0x10,0x00,0x10,0x00,0xd4,0x14,0x93,0x10,0x92,0x0c,0x51,0x04,0x10,0x00,0x10,
+	0x04,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x53,0x04,0x10,0x00,0x52,0x04,0x00,
+	0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x10,0x00,0x10,0x00,0xd0,0x0e,0xcf,0x86,0x95,
+	0x08,0x14,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xd3,0x06,0xcf,
+	0x06,0x00,0x00,0xd2,0x30,0xd1,0x0c,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x06,0x14,
+	0x00,0xd0,0x1e,0xcf,0x86,0x95,0x18,0x54,0x04,0x14,0x00,0x53,0x04,0x14,0x00,0x92,
+	0x0c,0x51,0x04,0x14,0x00,0x10,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,
+	0x06,0x00,0x00,0xd1,0x4c,0xd0,0x06,0xcf,0x06,0x0d,0x00,0xcf,0x86,0xd5,0x2c,0x94,
+	0x28,0xd3,0x10,0x52,0x04,0x0d,0x00,0x91,0x08,0x10,0x04,0x0d,0x00,0x15,0x00,0x15,
+	0x00,0xd2,0x0c,0x51,0x04,0x15,0x00,0x10,0x04,0x15,0x00,0x00,0x00,0x51,0x04,0x00,
+	0x00,0x10,0x04,0x00,0x00,0x15,0x00,0x0d,0x00,0x54,0x04,0x0d,0x00,0x53,0x04,0x0d,
+	0x00,0x52,0x04,0x0d,0x00,0x51,0x04,0x0d,0x00,0x10,0x04,0x0d,0x00,0x15,0x00,0xd0,
+	0x1e,0xcf,0x86,0x95,0x18,0x94,0x14,0x53,0x04,0x15,0x00,0x52,0x04,0x00,0x00,0x51,
+	0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x0d,0x00,0x0d,0x00,0x00,0x00,0xcf,0x86,0x55,
+	0x04,0x00,0x00,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x12,0x00,0x13,
+	0x00,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0xcf,0x06,0x12,0x00,0xe2,
+	0xc6,0x01,0xd1,0x8e,0xd0,0x86,0xcf,0x86,0xd5,0x48,0xd4,0x06,0xcf,0x06,0x12,0x00,
+	0xd3,0x06,0xcf,0x06,0x12,0x00,0xd2,0x06,0xcf,0x06,0x12,0x00,0xd1,0x06,0xcf,0x06,
+	0x12,0x00,0xd0,0x06,0xcf,0x06,0x12,0x00,0xcf,0x86,0x55,0x04,0x12,0x00,0xd4,0x14,
+	0x53,0x04,0x12,0x00,0x52,0x04,0x12,0x00,0x91,0x08,0x10,0x04,0x12,0x00,0x14,0x00,
+	0x14,0x00,0x93,0x0c,0x92,0x08,0x11,0x04,0x14,0x00,0x15,0x00,0x15,0x00,0x00,0x00,
+	0xd4,0x36,0xd3,0x06,0xcf,0x06,0x12,0x00,0xd2,0x2a,0xd1,0x06,0xcf,0x06,0x12,0x00,
+	0xd0,0x06,0xcf,0x06,0x12,0x00,0xcf,0x86,0x55,0x04,0x12,0x00,0x54,0x04,0x12,0x00,
+	0x93,0x10,0x92,0x0c,0x51,0x04,0x12,0x00,0x10,0x04,0x12,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x86,0xcf,0x06,0x00,0x00,
+	0xd0,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xcf,0x86,0xd5,0xa2,0xd4,0x9c,0xd3,0x74,
+	0xd2,0x26,0xd1,0x20,0xd0,0x1a,0xcf,0x86,0x95,0x14,0x94,0x10,0x93,0x0c,0x92,0x08,
+	0x11,0x04,0x0c,0x00,0x13,0x00,0x13,0x00,0x13,0x00,0x13,0x00,0x13,0x00,0xcf,0x06,
+	0x13,0x00,0xcf,0x06,0x13,0x00,0xd1,0x48,0xd0,0x1e,0xcf,0x86,0x95,0x18,0x54,0x04,
+	0x13,0x00,0x53,0x04,0x13,0x00,0x52,0x04,0x13,0x00,0x51,0x04,0x13,0x00,0x10,0x04,
+	0x13,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0xd5,0x18,0x54,0x04,0x00,0x00,0x93,0x10,
+	0x92,0x0c,0x51,0x04,0x15,0x00,0x10,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x94,0x0c,0x93,0x08,0x12,0x04,0x00,0x00,0x15,0x00,0x00,0x00,0x13,0x00,0xcf,0x06,
+	0x13,0x00,0xd2,0x22,0xd1,0x06,0xcf,0x06,0x13,0x00,0xd0,0x06,0xcf,0x06,0x13,0x00,
+	0xcf,0x86,0x55,0x04,0x13,0x00,0x54,0x04,0x13,0x00,0x53,0x04,0x13,0x00,0x12,0x04,
+	0x13,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,
+	0x00,0x00,0xd3,0x7f,0xd2,0x79,0xd1,0x34,0xd0,0x06,0xcf,0x06,0x10,0x00,0xcf,0x86,
+	0x55,0x04,0x10,0x00,0xd4,0x14,0x53,0x04,0x10,0x00,0x92,0x0c,0x51,0x04,0x10,0x00,
+	0x10,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x53,0x04,0x10,0x00,0x52,0x04,0x10,0x00,
+	0x91,0x08,0x10,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0xd0,0x3f,0xcf,0x86,0xd5,0x2c,
+	0xd4,0x14,0x53,0x04,0x10,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x10,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x53,0x04,0x10,0x00,0xd2,0x08,0x11,0x04,0x10,0x00,0x00,0x00,
+	0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x01,0x10,0x00,0x94,0x0d,0x93,0x09,0x12,0x05,
+	0x10,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,
+	0x00,0xcf,0x06,0x00,0x00,0xe1,0x96,0x04,0xd0,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,
+	0xcf,0x86,0xe5,0x33,0x04,0xe4,0x83,0x02,0xe3,0xf8,0x01,0xd2,0x26,0xd1,0x06,0xcf,
+	0x06,0x05,0x00,0xd0,0x06,0xcf,0x06,0x05,0x00,0xcf,0x86,0x55,0x04,0x05,0x00,0x54,
+	0x04,0x05,0x00,0x93,0x0c,0x52,0x04,0x05,0x00,0x11,0x04,0x05,0x00,0x00,0x00,0x00,
+	0x00,0xd1,0xef,0xd0,0x2a,0xcf,0x86,0x55,0x04,0x05,0x00,0x94,0x20,0xd3,0x10,0x52,
+	0x04,0x05,0x00,0x51,0x04,0x05,0x00,0x10,0x04,0x05,0x00,0x00,0x00,0x92,0x0c,0x91,
+	0x08,0x10,0x04,0x00,0x00,0x0a,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0xcf,0x86,0xd5,
+	0x2a,0x54,0x04,0x05,0x00,0x53,0x04,0x05,0x00,0x52,0x04,0x05,0x00,0x51,0x04,0x05,
+	0x00,0x10,0x0d,0x05,0xff,0xf0,0x9d,0x85,0x97,0xf0,0x9d,0x85,0xa5,0x00,0x05,0xff,
+	0xf0,0x9d,0x85,0x98,0xf0,0x9d,0x85,0xa5,0x00,0xd4,0x75,0xd3,0x61,0xd2,0x44,0xd1,
+	0x22,0x10,0x11,0x05,0xff,0xf0,0x9d,0x85,0x98,0xf0,0x9d,0x85,0xa5,0xf0,0x9d,0x85,
+	0xae,0x00,0x05,0xff,0xf0,0x9d,0x85,0x98,0xf0,0x9d,0x85,0xa5,0xf0,0x9d,0x85,0xaf,
+	0x00,0x10,0x11,0x05,0xff,0xf0,0x9d,0x85,0x98,0xf0,0x9d,0x85,0xa5,0xf0,0x9d,0x85,
+	0xb0,0x00,0x05,0xff,0xf0,0x9d,0x85,0x98,0xf0,0x9d,0x85,0xa5,0xf0,0x9d,0x85,0xb1,
+	0x00,0xd1,0x15,0x10,0x11,0x05,0xff,0xf0,0x9d,0x85,0x98,0xf0,0x9d,0x85,0xa5,0xf0,
+	0x9d,0x85,0xb2,0x00,0x05,0xd8,0x10,0x04,0x05,0xd8,0x05,0x01,0xd2,0x08,0x11,0x04,
+	0x05,0x01,0x05,0x00,0x91,0x08,0x10,0x04,0x05,0x00,0x05,0xe2,0x05,0xd8,0xd3,0x12,
+	0x92,0x0d,0x51,0x04,0x05,0xd8,0x10,0x04,0x05,0xd8,0x05,0xff,0x00,0x05,0xff,0x00,
+	0x92,0x0e,0x51,0x05,0x05,0xff,0x00,0x10,0x05,0x05,0xff,0x00,0x05,0xdc,0x05,0xdc,
+	0xd0,0x97,0xcf,0x86,0xd5,0x28,0x94,0x24,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x05,0xdc,
+	0x10,0x04,0x05,0xdc,0x05,0x00,0x91,0x08,0x10,0x04,0x05,0x00,0x05,0xe6,0x05,0xe6,
+	0x92,0x08,0x11,0x04,0x05,0xe6,0x05,0xdc,0x05,0x00,0x05,0x00,0xd4,0x14,0x53,0x04,
+	0x05,0x00,0xd2,0x08,0x11,0x04,0x05,0x00,0x05,0xe6,0x11,0x04,0x05,0xe6,0x05,0x00,
+	0x53,0x04,0x05,0x00,0xd2,0x15,0x51,0x04,0x05,0x00,0x10,0x04,0x05,0x00,0x05,0xff,
+	0xf0,0x9d,0x86,0xb9,0xf0,0x9d,0x85,0xa5,0x00,0xd1,0x1e,0x10,0x0d,0x05,0xff,0xf0,
+	0x9d,0x86,0xba,0xf0,0x9d,0x85,0xa5,0x00,0x05,0xff,0xf0,0x9d,0x86,0xb9,0xf0,0x9d,
+	0x85,0xa5,0xf0,0x9d,0x85,0xae,0x00,0x10,0x11,0x05,0xff,0xf0,0x9d,0x86,0xba,0xf0,
+	0x9d,0x85,0xa5,0xf0,0x9d,0x85,0xae,0x00,0x05,0xff,0xf0,0x9d,0x86,0xb9,0xf0,0x9d,
+	0x85,0xa5,0xf0,0x9d,0x85,0xaf,0x00,0xcf,0x86,0xd5,0x31,0xd4,0x21,0x93,0x1d,0x92,
+	0x19,0x91,0x15,0x10,0x11,0x05,0xff,0xf0,0x9d,0x86,0xba,0xf0,0x9d,0x85,0xa5,0xf0,
+	0x9d,0x85,0xaf,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x53,0x04,0x05,0x00,
+	0x52,0x04,0x05,0x00,0x11,0x04,0x05,0x00,0x11,0x00,0x94,0x14,0x53,0x04,0x11,0x00,
+	0x92,0x0c,0x91,0x08,0x10,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0xd2,0x44,0xd1,0x28,0xd0,0x06,0xcf,0x06,0x08,0x00,0xcf,0x86,0x95,0x1c,0x94,0x18,
+	0x93,0x14,0xd2,0x08,0x11,0x04,0x08,0x00,0x08,0xe6,0x91,0x08,0x10,0x04,0x08,0xe6,
+	0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x06,0xcf,0x06,0x00,0x00,
+	0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x14,0x00,0x93,0x08,0x12,0x04,0x14,0x00,
+	0x00,0x00,0x00,0x00,0xd1,0x40,0xd0,0x06,0xcf,0x06,0x07,0x00,0xcf,0x86,0xd5,0x18,
+	0x54,0x04,0x07,0x00,0x93,0x10,0x52,0x04,0x07,0x00,0x51,0x04,0x07,0x00,0x10,0x04,
+	0x07,0x00,0x00,0x00,0x00,0x00,0x54,0x04,0x09,0x00,0xd3,0x0c,0x92,0x08,0x11,0x04,
+	0x09,0x00,0x14,0x00,0x14,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x14,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xe3,0x5f,0x01,0xd2,0xb4,0xd1,0x24,0xd0,
+	0x06,0xcf,0x06,0x05,0x00,0xcf,0x86,0x95,0x18,0x54,0x04,0x05,0x00,0x93,0x10,0x52,
+	0x04,0x05,0x00,0x91,0x08,0x10,0x04,0x05,0x00,0x00,0x00,0x05,0x00,0x05,0x00,0x05,
+	0x00,0xd0,0x6a,0xcf,0x86,0xd5,0x18,0x54,0x04,0x05,0x00,0x53,0x04,0x05,0x00,0x52,
+	0x04,0x05,0x00,0x91,0x08,0x10,0x04,0x05,0x00,0x00,0x00,0x05,0x00,0xd4,0x34,0xd3,
+	0x1c,0xd2,0x0c,0x51,0x04,0x00,0x00,0x10,0x04,0x05,0x00,0x00,0x00,0xd1,0x08,0x10,
+	0x04,0x00,0x00,0x05,0x00,0x10,0x04,0x05,0x00,0x00,0x00,0xd2,0x0c,0x91,0x08,0x10,
+	0x04,0x00,0x00,0x05,0x00,0x05,0x00,0x91,0x08,0x10,0x04,0x05,0x00,0x00,0x00,0x05,
+	0x00,0x53,0x04,0x05,0x00,0xd2,0x0c,0x51,0x04,0x05,0x00,0x10,0x04,0x00,0x00,0x05,
+	0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x05,0x00,0x05,0x00,0xcf,0x86,0x95,0x20,0x94,
+	0x1c,0x93,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,0x05,0x00,0x07,0x00,0x05,0x00,0x91,
+	0x08,0x10,0x04,0x00,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0xd1,
+	0xa4,0xd0,0x6a,0xcf,0x86,0xd5,0x48,0xd4,0x28,0xd3,0x10,0x52,0x04,0x05,0x00,0x51,
+	0x04,0x05,0x00,0x10,0x04,0x00,0x00,0x05,0x00,0xd2,0x0c,0x51,0x04,0x05,0x00,0x10,
+	0x04,0x05,0x00,0x00,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x05,0x00,0x05,0x00,0xd3,
+	0x10,0x52,0x04,0x05,0x00,0x91,0x08,0x10,0x04,0x05,0x00,0x00,0x00,0x05,0x00,0x52,
+	0x04,0x05,0x00,0x91,0x08,0x10,0x04,0x05,0x00,0x00,0x00,0x05,0x00,0x54,0x04,0x05,
+	0x00,0x53,0x04,0x05,0x00,0xd2,0x0c,0x51,0x04,0x05,0x00,0x10,0x04,0x00,0x00,0x05,
+	0x00,0x51,0x04,0x05,0x00,0x10,0x04,0x05,0x00,0x00,0x00,0xcf,0x86,0x95,0x34,0xd4,
+	0x20,0xd3,0x14,0x52,0x04,0x05,0x00,0xd1,0x08,0x10,0x04,0x05,0x00,0x00,0x00,0x10,
+	0x04,0x05,0x00,0x00,0x00,0x92,0x08,0x11,0x04,0x00,0x00,0x05,0x00,0x05,0x00,0x93,
+	0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x05,0x00,0x00,0x00,0x05,0x00,0x05,0x00,0x05,
+	0x00,0x05,0x00,0xcf,0x06,0x05,0x00,0xd2,0x26,0xd1,0x06,0xcf,0x06,0x05,0x00,0xd0,
+	0x1a,0xcf,0x86,0x55,0x04,0x05,0x00,0x94,0x10,0x93,0x0c,0x52,0x04,0x05,0x00,0x11,
+	0x04,0x08,0x00,0x00,0x00,0x05,0x00,0x05,0x00,0xcf,0x06,0x05,0x00,0xd1,0x06,0xcf,
+	0x06,0x05,0x00,0xd0,0x06,0xcf,0x06,0x05,0x00,0xcf,0x86,0x95,0x18,0x94,0x14,0x53,
+	0x04,0x05,0x00,0xd2,0x08,0x11,0x04,0x05,0x00,0x09,0x00,0x11,0x04,0x00,0x00,0x05,
+	0x00,0x05,0x00,0x05,0x00,0xd4,0x52,0xd3,0x06,0xcf,0x06,0x11,0x00,0xd2,0x46,0xd1,
+	0x06,0xcf,0x06,0x11,0x00,0xd0,0x3a,0xcf,0x86,0xd5,0x20,0xd4,0x0c,0x53,0x04,0x11,
+	0x00,0x12,0x04,0x11,0x00,0x00,0x00,0x53,0x04,0x00,0x00,0x92,0x0c,0x51,0x04,0x00,
+	0x00,0x10,0x04,0x00,0x00,0x11,0x00,0x11,0x00,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,
+	0x08,0x10,0x04,0x00,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,0xcf,
+	0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xe0,0xc2,0x03,0xcf,0x86,
+	0xe5,0x03,0x01,0xd4,0xfc,0xd3,0xc0,0xd2,0x66,0xd1,0x60,0xd0,0x5a,0xcf,0x86,0xd5,
+	0x2c,0xd4,0x14,0x93,0x10,0x52,0x04,0x12,0xe6,0x51,0x04,0x12,0xe6,0x10,0x04,0x12,
+	0xe6,0x00,0x00,0x12,0xe6,0x53,0x04,0x12,0xe6,0x92,0x10,0xd1,0x08,0x10,0x04,0x12,
+	0xe6,0x00,0x00,0x10,0x04,0x00,0x00,0x12,0xe6,0x12,0xe6,0x94,0x28,0xd3,0x18,0xd2,
+	0x0c,0x51,0x04,0x12,0xe6,0x10,0x04,0x00,0x00,0x12,0xe6,0x91,0x08,0x10,0x04,0x12,
+	0xe6,0x00,0x00,0x12,0xe6,0x92,0x0c,0x51,0x04,0x12,0xe6,0x10,0x04,0x12,0xe6,0x00,
+	0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xd1,0x54,0xd0,
+	0x36,0xcf,0x86,0x55,0x04,0x15,0x00,0xd4,0x14,0x53,0x04,0x15,0x00,0x52,0x04,0x15,
+	0x00,0x91,0x08,0x10,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0xd3,0x10,0x52,0x04,0x15,
+	0xe6,0x51,0x04,0x15,0xe6,0x10,0x04,0x15,0xe6,0x15,0x00,0x52,0x04,0x15,0x00,0x11,
+	0x04,0x15,0x00,0x00,0x00,0xcf,0x86,0x95,0x18,0x94,0x14,0x53,0x04,0x15,0x00,0xd2,
+	0x08,0x11,0x04,0x15,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x15,0x00,0x00,0x00,0x00,
+	0x00,0xcf,0x06,0x00,0x00,0xd2,0x36,0xd1,0x06,0xcf,0x06,0x00,0x00,0xd0,0x06,0xcf,
+	0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x15,0x00,0xd4,0x0c,0x53,0x04,0x15,0x00,0x12,
+	0x04,0x15,0x00,0x15,0xe6,0x53,0x04,0x15,0x00,0xd2,0x08,0x11,0x04,0x15,0x00,0x00,
+	0x00,0x51,0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x15,0x00,0xcf,0x06,0x00,0x00,0xcf,
+	0x06,0x00,0x00,0xd4,0x82,0xd3,0x7c,0xd2,0x3e,0xd1,0x06,0xcf,0x06,0x10,0x00,0xd0,
+	0x06,0xcf,0x06,0x10,0x00,0xcf,0x86,0x95,0x2c,0xd4,0x18,0x93,0x14,0x52,0x04,0x10,
+	0x00,0xd1,0x08,0x10,0x04,0x10,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x10,0x00,0x10,
+	0x00,0x93,0x10,0x52,0x04,0x10,0xdc,0x51,0x04,0x10,0xdc,0x10,0x04,0x10,0xdc,0x00,
+	0x00,0x00,0x00,0x00,0x00,0xd1,0x38,0xd0,0x06,0xcf,0x06,0x12,0x00,0xcf,0x86,0x95,
+	0x2c,0xd4,0x18,0xd3,0x08,0x12,0x04,0x12,0x00,0x12,0xe6,0x92,0x0c,0x51,0x04,0x12,
+	0xe6,0x10,0x04,0x12,0x07,0x15,0x00,0x00,0x00,0x53,0x04,0x12,0x00,0xd2,0x08,0x11,
+	0x04,0x12,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x12,0x00,0x00,0x00,0xcf,0x06,0x00,
+	0x00,0xcf,0x06,0x00,0x00,0xd3,0x82,0xd2,0x48,0xd1,0x24,0xd0,0x06,0xcf,0x06,0x00,
+	0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x00,0x00,0x93,0x10,0x92,0x0c,0x91,
+	0x08,0x10,0x04,0x00,0x00,0x14,0x00,0x14,0x00,0x14,0x00,0x14,0x00,0xd0,0x1e,0xcf,
+	0x86,0x55,0x04,0x14,0x00,0x54,0x04,0x14,0x00,0x93,0x10,0x52,0x04,0x14,0x00,0x91,
+	0x08,0x10,0x04,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xd1,
+	0x34,0xd0,0x2e,0xcf,0x86,0xd5,0x18,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,
+	0x04,0x00,0x00,0x15,0x00,0x15,0x00,0x15,0x00,0x15,0x00,0x15,0x00,0x54,0x04,0x15,
+	0x00,0x53,0x04,0x15,0x00,0x52,0x04,0x15,0x00,0x11,0x04,0x15,0x00,0x00,0x00,0xcf,
+	0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xe2,0xb2,0x01,0xe1,0x41,0x01,0xd0,0x6e,0xcf,
+	0x86,0xd5,0x18,0x94,0x14,0x93,0x10,0x52,0x04,0x0d,0x00,0x91,0x08,0x10,0x04,0x00,
+	0x00,0x0d,0x00,0x0d,0x00,0x0d,0x00,0x0d,0x00,0xd4,0x30,0xd3,0x20,0xd2,0x10,0xd1,
+	0x08,0x10,0x04,0x00,0x00,0x0d,0x00,0x10,0x04,0x0d,0x00,0x00,0x00,0xd1,0x08,0x10,
+	0x04,0x0d,0x00,0x00,0x00,0x10,0x04,0x00,0x00,0x0d,0x00,0x92,0x0c,0x91,0x08,0x10,
+	0x04,0x00,0x00,0x0d,0x00,0x0d,0x00,0x0d,0x00,0xd3,0x10,0x92,0x0c,0x51,0x04,0x0d,
+	0x00,0x10,0x04,0x0d,0x00,0x00,0x00,0x0d,0x00,0x92,0x10,0xd1,0x08,0x10,0x04,0x00,
+	0x00,0x0d,0x00,0x10,0x04,0x00,0x00,0x0d,0x00,0x00,0x00,0xcf,0x86,0xd5,0x74,0xd4,
+	0x34,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x00,0x00,0x10,0x04,0x0d,0x00,0x00,0x00,0x51,
+	0x04,0x00,0x00,0x10,0x04,0x00,0x00,0x0d,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x00,
+	0x00,0x0d,0x00,0x10,0x04,0x00,0x00,0x0d,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x0d,
+	0x00,0x0d,0x00,0xd3,0x20,0xd2,0x10,0xd1,0x08,0x10,0x04,0x00,0x00,0x0d,0x00,0x10,
+	0x04,0x0d,0x00,0x00,0x00,0xd1,0x08,0x10,0x04,0x0d,0x00,0x00,0x00,0x10,0x04,0x00,
+	0x00,0x0d,0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x00,0x00,0x0d,0x00,0x10,0x04,0x00,
+	0x00,0x0d,0x00,0xd1,0x08,0x10,0x04,0x00,0x00,0x0d,0x00,0x10,0x04,0x00,0x00,0x0d,
+	0x00,0xd4,0x30,0xd3,0x20,0xd2,0x10,0xd1,0x08,0x10,0x04,0x00,0x00,0x0d,0x00,0x10,
+	0x04,0x0d,0x00,0x00,0x00,0xd1,0x08,0x10,0x04,0x0d,0x00,0x00,0x00,0x10,0x04,0x00,
+	0x00,0x0d,0x00,0x92,0x0c,0x51,0x04,0x0d,0x00,0x10,0x04,0x0d,0x00,0x00,0x00,0x0d,
+	0x00,0xd3,0x10,0x92,0x0c,0x51,0x04,0x0d,0x00,0x10,0x04,0x0d,0x00,0x00,0x00,0x0d,
+	0x00,0xd2,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x0d,0x00,0x0d,0x00,0xd1,0x08,0x10,
+	0x04,0x0d,0x00,0x00,0x00,0x10,0x04,0x0d,0x00,0x00,0x00,0xd0,0x56,0xcf,0x86,0xd5,
+	0x20,0xd4,0x14,0x53,0x04,0x0d,0x00,0x92,0x0c,0x51,0x04,0x0d,0x00,0x10,0x04,0x00,
+	0x00,0x0d,0x00,0x0d,0x00,0x53,0x04,0x0d,0x00,0x12,0x04,0x0d,0x00,0x00,0x00,0xd4,
+	0x28,0xd3,0x18,0xd2,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x0d,0x00,0x0d,0x00,0x91,
+	0x08,0x10,0x04,0x00,0x00,0x0d,0x00,0x0d,0x00,0x92,0x0c,0x51,0x04,0x0d,0x00,0x10,
+	0x04,0x00,0x00,0x0d,0x00,0x0d,0x00,0x53,0x04,0x0d,0x00,0x12,0x04,0x0d,0x00,0x00,
+	0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x00,0x00,0x93,0x0c,0x92,0x08,0x11,
+	0x04,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x86,0xe5,
+	0x96,0x05,0xe4,0x28,0x03,0xe3,0xed,0x01,0xd2,0xa0,0xd1,0x1c,0xd0,0x16,0xcf,0x86,
+	0x55,0x04,0x0a,0x00,0x94,0x0c,0x53,0x04,0x0a,0x00,0x12,0x04,0x0a,0x00,0x00,0x00,
+	0x0a,0x00,0xcf,0x06,0x0a,0x00,0xd0,0x46,0xcf,0x86,0xd5,0x10,0x54,0x04,0x0a,0x00,
+	0x93,0x08,0x12,0x04,0x0a,0x00,0x00,0x00,0x00,0x00,0xd4,0x14,0x53,0x04,0x0c,0x00,
+	0x52,0x04,0x0c,0x00,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x00,0x00,0x00,0xd3,0x10,
+	0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x0c,0x00,0x0c,0x00,0x0c,0x00,0x52,0x04,
+	0x0c,0x00,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x00,0x10,0x00,0xcf,0x86,0xd5,0x28,
+	0xd4,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x0c,0x00,0x0c,0x00,
+	0x0c,0x00,0x0c,0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x00,0x00,0x0c,0x00,
+	0x0c,0x00,0x0c,0x00,0x0c,0x00,0x54,0x04,0x10,0x00,0x93,0x0c,0x52,0x04,0x10,0x00,
+	0x11,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0xd1,0xe4,0xd0,0x5a,0xcf,0x86,0xd5,0x20,
+	0x94,0x1c,0x53,0x04,0x0b,0x00,0xd2,0x0c,0x51,0x04,0x0b,0x00,0x10,0x04,0x0b,0x00,
+	0x10,0x00,0x91,0x08,0x10,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0xd4,0x14,
+	0x53,0x04,0x0b,0x00,0x52,0x04,0x0b,0x00,0x51,0x04,0x0b,0x00,0x10,0x04,0x0b,0x00,
+	0x14,0x00,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x0c,0x00,0x0b,0x00,0x0c,0x00,
+	0x0c,0x00,0x52,0x04,0x0c,0x00,0xd1,0x08,0x10,0x04,0x0c,0x00,0x0b,0x00,0x10,0x04,
+	0x0c,0x00,0x0b,0x00,0xcf,0x86,0xd5,0x4c,0xd4,0x2c,0xd3,0x18,0xd2,0x0c,0x51,0x04,
+	0x0c,0x00,0x10,0x04,0x0b,0x00,0x0c,0x00,0x51,0x04,0x0c,0x00,0x10,0x04,0x0b,0x00,
+	0x0c,0x00,0xd2,0x08,0x11,0x04,0x0c,0x00,0x0b,0x00,0x51,0x04,0x0b,0x00,0x10,0x04,
+	0x0b,0x00,0x0c,0x00,0xd3,0x10,0x52,0x04,0x0c,0x00,0x51,0x04,0x0c,0x00,0x10,0x04,
+	0x0c,0x00,0x0b,0x00,0x52,0x04,0x0c,0x00,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x00,
+	0x0b,0x00,0xd4,0x18,0x53,0x04,0x0c,0x00,0xd2,0x08,0x11,0x04,0x0c,0x00,0x0d,0x00,
+	0x91,0x08,0x10,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x53,0x04,0x0c,0x00,0xd2,0x10,
+	0xd1,0x08,0x10,0x04,0x0c,0x00,0x0b,0x00,0x10,0x04,0x0c,0x00,0x0b,0x00,0xd1,0x08,
+	0x10,0x04,0x0b,0x00,0x0c,0x00,0x10,0x04,0x0c,0x00,0x0b,0x00,0xd0,0x4e,0xcf,0x86,
+	0xd5,0x34,0xd4,0x14,0x53,0x04,0x0c,0x00,0xd2,0x08,0x11,0x04,0x0c,0x00,0x0b,0x00,
+	0x11,0x04,0x0b,0x00,0x0c,0x00,0xd3,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x0b,0x00,
+	0x0c,0x00,0x0c,0x00,0x0c,0x00,0x92,0x0c,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x00,
+	0x12,0x00,0x12,0x00,0x94,0x14,0x53,0x04,0x12,0x00,0x52,0x04,0x12,0x00,0x91,0x08,
+	0x10,0x04,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,
+	0x94,0x10,0x93,0x0c,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x0c,0x00,0x0c,0x00,
+	0x0c,0x00,0xd2,0x7e,0xd1,0x78,0xd0,0x3e,0xcf,0x86,0xd5,0x1c,0x94,0x18,0x93,0x14,
+	0x92,0x10,0xd1,0x08,0x10,0x04,0x0b,0x00,0x0c,0x00,0x10,0x04,0x0c,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x0b,0x00,0x54,0x04,0x0b,0x00,0xd3,0x0c,0x92,0x08,0x11,0x04,
+	0x0b,0x00,0x0c,0x00,0x0c,0x00,0x92,0x0c,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x00,
+	0x12,0x00,0x00,0x00,0xcf,0x86,0xd5,0x24,0xd4,0x14,0x53,0x04,0x0b,0x00,0x92,0x0c,
+	0x91,0x08,0x10,0x04,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x0c,0x92,0x08,
+	0x11,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x10,0x93,0x0c,0x52,0x04,
+	0x13,0x00,0x11,0x04,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,
+	0xd1,0x58,0xd0,0x3a,0xcf,0x86,0x55,0x04,0x0c,0x00,0xd4,0x20,0xd3,0x10,0x92,0x0c,
+	0x91,0x08,0x10,0x04,0x0c,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x52,0x04,0x10,0x00,
+	0x91,0x08,0x10,0x04,0x10,0x00,0x11,0x00,0x11,0x00,0x93,0x10,0x52,0x04,0x0c,0x00,
+	0x51,0x04,0x0c,0x00,0x10,0x04,0x10,0x00,0x0c,0x00,0x0c,0x00,0xcf,0x86,0x55,0x04,
+	0x0c,0x00,0x54,0x04,0x0c,0x00,0x53,0x04,0x0c,0x00,0x52,0x04,0x0c,0x00,0x91,0x08,
+	0x10,0x04,0x0c,0x00,0x10,0x00,0x11,0x00,0xd0,0x16,0xcf,0x86,0x95,0x10,0x54,0x04,
+	0x0c,0x00,0x93,0x08,0x12,0x04,0x0c,0x00,0x10,0x00,0x10,0x00,0x0c,0x00,0xcf,0x86,
+	0xd5,0x34,0xd4,0x28,0xd3,0x10,0x52,0x04,0x0c,0x00,0x91,0x08,0x10,0x04,0x0c,0x00,
+	0x10,0x00,0x0c,0x00,0xd2,0x0c,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x00,0x10,0x00,
+	0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x00,0x11,0x00,0x93,0x08,0x12,0x04,0x11,0x00,
+	0x10,0x00,0x10,0x00,0x54,0x04,0x0c,0x00,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,
+	0x0c,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x11,0x00,0xd3,0xfc,0xd2,0x6c,0xd1,0x3c,
+	0xd0,0x1e,0xcf,0x86,0x55,0x04,0x0c,0x00,0x54,0x04,0x0c,0x00,0x53,0x04,0x0c,0x00,
+	0x52,0x04,0x0c,0x00,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x00,0x10,0x00,0xcf,0x86,
+	0x95,0x18,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x0c,0x00,0x10,0x00,
+	0x0c,0x00,0x0c,0x00,0x0c,0x00,0x0c,0x00,0x0c,0x00,0xd0,0x06,0xcf,0x06,0x0c,0x00,
+	0xcf,0x86,0x55,0x04,0x0c,0x00,0x54,0x04,0x0c,0x00,0x53,0x04,0x0c,0x00,0xd2,0x0c,
+	0x91,0x08,0x10,0x04,0x10,0x00,0x0c,0x00,0x0c,0x00,0xd1,0x08,0x10,0x04,0x0c,0x00,
+	0x10,0x00,0x10,0x04,0x10,0x00,0x11,0x00,0xd1,0x54,0xd0,0x1a,0xcf,0x86,0x55,0x04,
+	0x0c,0x00,0x54,0x04,0x0c,0x00,0x53,0x04,0x0c,0x00,0x52,0x04,0x0c,0x00,0x11,0x04,
+	0x0c,0x00,0x10,0x00,0xcf,0x86,0xd5,0x1c,0x94,0x18,0xd3,0x08,0x12,0x04,0x0d,0x00,
+	0x10,0x00,0x92,0x0c,0x51,0x04,0x10,0x00,0x10,0x04,0x10,0x00,0x11,0x00,0x11,0x00,
+	0x0c,0x00,0xd4,0x08,0x13,0x04,0x0c,0x00,0x10,0x00,0x53,0x04,0x10,0x00,0x92,0x0c,
+	0x51,0x04,0x10,0x00,0x10,0x04,0x12,0x00,0x10,0x00,0x10,0x00,0xd0,0x1e,0xcf,0x86,
+	0x55,0x04,0x10,0x00,0x94,0x14,0x93,0x10,0x52,0x04,0x10,0x00,0x91,0x08,0x10,0x04,
+	0x12,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0xcf,0x86,0x55,0x04,0x10,0x00,
+	0x54,0x04,0x10,0x00,0x53,0x04,0x10,0x00,0x92,0x0c,0x51,0x04,0x10,0x00,0x10,0x04,
+	0x10,0x00,0x0c,0x00,0x0c,0x00,0xe2,0x19,0x01,0xd1,0xa8,0xd0,0x7e,0xcf,0x86,0xd5,
+	0x4c,0xd4,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x0d,0x00,0x0c,0x00,0x0c,
+	0x00,0x0c,0x00,0x0c,0x00,0xd3,0x1c,0xd2,0x0c,0x91,0x08,0x10,0x04,0x0c,0x00,0x0d,
+	0x00,0x0c,0x00,0xd1,0x08,0x10,0x04,0x0c,0x00,0x0d,0x00,0x10,0x04,0x0c,0x00,0x0d,
+	0x00,0xd2,0x10,0xd1,0x08,0x10,0x04,0x0c,0x00,0x0d,0x00,0x10,0x04,0x0c,0x00,0x0d,
+	0x00,0x51,0x04,0x0c,0x00,0x10,0x04,0x0c,0x00,0x0d,0x00,0xd4,0x1c,0xd3,0x0c,0x52,
+	0x04,0x0c,0x00,0x11,0x04,0x0c,0x00,0x0d,0x00,0x52,0x04,0x0c,0x00,0x91,0x08,0x10,
+	0x04,0x0d,0x00,0x0c,0x00,0x0d,0x00,0x93,0x10,0x52,0x04,0x0c,0x00,0x91,0x08,0x10,
+	0x04,0x0d,0x00,0x0c,0x00,0x0c,0x00,0x0c,0x00,0xcf,0x86,0x95,0x24,0x94,0x20,0x93,
+	0x1c,0xd2,0x10,0xd1,0x08,0x10,0x04,0x0c,0x00,0x10,0x00,0x10,0x04,0x10,0x00,0x11,
+	0x00,0x91,0x08,0x10,0x04,0x11,0x00,0x0c,0x00,0x0c,0x00,0x0c,0x00,0x10,0x00,0x10,
+	0x00,0xd0,0x06,0xcf,0x06,0x0c,0x00,0xcf,0x86,0xd5,0x30,0xd4,0x10,0x93,0x0c,0x52,
+	0x04,0x0c,0x00,0x11,0x04,0x0c,0x00,0x10,0x00,0x10,0x00,0x93,0x1c,0xd2,0x10,0xd1,
+	0x08,0x10,0x04,0x11,0x00,0x12,0x00,0x10,0x04,0x12,0x00,0x13,0x00,0x91,0x08,0x10,
+	0x04,0x13,0x00,0x15,0x00,0x00,0x00,0x00,0x00,0xd4,0x14,0x53,0x04,0x10,0x00,0x52,
+	0x04,0x10,0x00,0x91,0x08,0x10,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0xd3,0x10,0x52,
+	0x04,0x10,0x00,0x51,0x04,0x12,0x00,0x10,0x04,0x12,0x00,0x13,0x00,0x92,0x10,0xd1,
+	0x08,0x10,0x04,0x13,0x00,0x14,0x00,0x10,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0xd1,
+	0x1c,0xd0,0x06,0xcf,0x06,0x0c,0x00,0xcf,0x86,0x55,0x04,0x0c,0x00,0x54,0x04,0x0c,
+	0x00,0x93,0x08,0x12,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0xd0,0x06,0xcf,0x06,0x10,
+	0x00,0xcf,0x86,0xd5,0x24,0x54,0x04,0x10,0x00,0xd3,0x10,0x52,0x04,0x10,0x00,0x91,
+	0x08,0x10,0x04,0x10,0x00,0x14,0x00,0x14,0x00,0x92,0x0c,0x91,0x08,0x10,0x04,0x14,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x0c,0x53,0x04,0x15,0x00,0x12,0x04,0x15,
+	0x00,0x00,0x00,0x00,0x00,0xe4,0x40,0x02,0xe3,0xc9,0x01,0xd2,0x5c,0xd1,0x34,0xd0,
+	0x16,0xcf,0x86,0x95,0x10,0x94,0x0c,0x53,0x04,0x10,0x00,0x12,0x04,0x10,0x00,0x00,
+	0x00,0x10,0x00,0x10,0x00,0xcf,0x86,0x95,0x18,0xd4,0x08,0x13,0x04,0x10,0x00,0x00,
+	0x00,0x53,0x04,0x10,0x00,0x92,0x08,0x11,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x10,
+	0x00,0xd0,0x22,0xcf,0x86,0xd5,0x0c,0x94,0x08,0x13,0x04,0x10,0x00,0x00,0x00,0x10,
+	0x00,0x94,0x10,0x53,0x04,0x10,0x00,0x52,0x04,0x10,0x00,0x11,0x04,0x10,0x00,0x00,
+	0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xd1,0xc0,0xd0,0x5e,0xcf,0x86,0xd5,0x30,0xd4,
+	0x14,0x53,0x04,0x13,0x00,0x52,0x04,0x13,0x00,0x91,0x08,0x10,0x04,0x00,0x00,0x15,
+	0x00,0x15,0x00,0x53,0x04,0x11,0x00,0xd2,0x0c,0x91,0x08,0x10,0x04,0x11,0x00,0x12,
+	0x00,0x12,0x00,0x51,0x04,0x12,0x00,0x10,0x04,0x12,0x00,0x13,0x00,0xd4,0x08,0x13,
+	0x04,0x12,0x00,0x13,0x00,0xd3,0x14,0x92,0x10,0xd1,0x08,0x10,0x04,0x12,0x00,0x13,
+	0x00,0x10,0x04,0x13,0x00,0x12,0x00,0x12,0x00,0x52,0x04,0x12,0x00,0x51,0x04,0x12,
+	0x00,0x10,0x04,0x12,0x00,0x15,0x00,0xcf,0x86,0xd5,0x28,0xd4,0x14,0x53,0x04,0x12,
+	0x00,0x52,0x04,0x12,0x00,0x91,0x08,0x10,0x04,0x13,0x00,0x14,0x00,0x14,0x00,0x53,
+	0x04,0x12,0x00,0x52,0x04,0x12,0x00,0x51,0x04,0x12,0x00,0x10,0x04,0x12,0x00,0x13,
+	0x00,0xd4,0x0c,0x53,0x04,0x13,0x00,0x12,0x04,0x13,0x00,0x14,0x00,0xd3,0x1c,0xd2,
+	0x10,0xd1,0x08,0x10,0x04,0x14,0x00,0x15,0x00,0x10,0x04,0x00,0x00,0x14,0x00,0x51,
+	0x04,0x14,0x00,0x10,0x04,0x14,0x00,0x00,0x00,0x92,0x0c,0x51,0x04,0x00,0x00,0x10,
+	0x04,0x14,0x00,0x15,0x00,0x14,0x00,0xd0,0x62,0xcf,0x86,0xd5,0x24,0xd4,0x14,0x93,
+	0x10,0x52,0x04,0x11,0x00,0x91,0x08,0x10,0x04,0x11,0x00,0x12,0x00,0x12,0x00,0x12,
+	0x00,0x93,0x0c,0x92,0x08,0x11,0x04,0x12,0x00,0x13,0x00,0x13,0x00,0x14,0x00,0xd4,
+	0x2c,0xd3,0x18,0xd2,0x0c,0x51,0x04,0x14,0x00,0x10,0x04,0x14,0x00,0x00,0x00,0x91,
+	0x08,0x10,0x04,0x00,0x00,0x15,0x00,0x15,0x00,0xd2,0x0c,0x51,0x04,0x15,0x00,0x10,
+	0x04,0x15,0x00,0x00,0x00,0x11,0x04,0x00,0x00,0x15,0x00,0x53,0x04,0x14,0x00,0x92,
+	0x08,0x11,0x04,0x14,0x00,0x15,0x00,0x15,0x00,0xcf,0x86,0xd5,0x30,0x94,0x2c,0xd3,
+	0x14,0x92,0x10,0xd1,0x08,0x10,0x04,0x11,0x00,0x14,0x00,0x10,0x04,0x14,0x00,0x15,
+	0x00,0x15,0x00,0xd2,0x0c,0x51,0x04,0x15,0x00,0x10,0x04,0x15,0x00,0x00,0x00,0x91,
+	0x08,0x10,0x04,0x00,0x00,0x15,0x00,0x15,0x00,0x13,0x00,0x94,0x14,0x93,0x10,0x52,
+	0x04,0x13,0x00,0x51,0x04,0x13,0x00,0x10,0x04,0x13,0x00,0x14,0x00,0x14,0x00,0x14,
+	0x00,0xd2,0x70,0xd1,0x40,0xd0,0x06,0xcf,0x06,0x15,0x00,0xcf,0x86,0xd5,0x10,0x54,
+	0x04,0x15,0x00,0x93,0x08,0x12,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0xd4,0x10,0x53,
+	0x04,0x14,0x00,0x52,0x04,0x14,0x00,0x11,0x04,0x14,0x00,0x00,0x00,0xd3,0x08,0x12,
+	0x04,0x15,0x00,0x00,0x00,0x92,0x0c,0x51,0x04,0x15,0x00,0x10,0x04,0x15,0x00,0x00,
+	0x00,0x00,0x00,0xd0,0x2a,0xcf,0x86,0x95,0x24,0xd4,0x14,0x93,0x10,0x92,0x0c,0x51,
+	0x04,0x15,0x00,0x10,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x0c,0x52,
+	0x04,0x15,0x00,0x11,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,
+	0x00,0xcf,0x06,0x00,0x00,0xd3,0x06,0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,
+	0x00,0xd1,0x06,0xcf,0x06,0x00,0x00,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,
+	0x04,0x00,0x00,0x54,0x04,0x00,0x00,0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,
+	0x04,0x00,0x00,0x02,0x00,0xe4,0xf9,0x12,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x05,0x00,
+	0xd2,0xc2,0xd1,0x08,0xcf,0x86,0xcf,0x06,0x05,0x00,0xd0,0x44,0xcf,0x86,0xd5,0x3c,
+	0xd4,0x06,0xcf,0x06,0x05,0x00,0xd3,0x06,0xcf,0x06,0x05,0x00,0xd2,0x2a,0xd1,0x06,
+	0xcf,0x06,0x05,0x00,0xd0,0x06,0xcf,0x06,0x05,0x00,0xcf,0x86,0x95,0x18,0x54,0x04,
+	0x05,0x00,0x93,0x10,0x52,0x04,0x05,0x00,0x51,0x04,0x05,0x00,0x10,0x04,0x05,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x0b,0x00,0xcf,0x06,0x0b,0x00,0xcf,0x86,
+	0xd5,0x3c,0xd4,0x06,0xcf,0x06,0x0b,0x00,0xd3,0x06,0xcf,0x06,0x0b,0x00,0xd2,0x06,
+	0xcf,0x06,0x0b,0x00,0xd1,0x24,0xd0,0x1e,0xcf,0x86,0x55,0x04,0x0b,0x00,0x54,0x04,
+	0x0b,0x00,0x93,0x10,0x52,0x04,0x0b,0x00,0x91,0x08,0x10,0x04,0x0b,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0xcf,0x06,0x0c,0x00,0xcf,0x06,0x0c,0x00,0xd4,0x32,0xd3,0x2c,
+	0xd2,0x26,0xd1,0x20,0xd0,0x1a,0xcf,0x86,0x95,0x14,0x54,0x04,0x0c,0x00,0x53,0x04,
+	0x0c,0x00,0x52,0x04,0x0c,0x00,0x11,0x04,0x0c,0x00,0x00,0x00,0x11,0x00,0xcf,0x06,
+	0x11,0x00,0xcf,0x06,0x11,0x00,0xcf,0x06,0x11,0x00,0xcf,0x06,0x11,0x00,0xcf,0x06,
+	0x11,0x00,0xd1,0x48,0xd0,0x40,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x11,0x00,0xd4,0x06,
+	0xcf,0x06,0x11,0x00,0xd3,0x06,0xcf,0x06,0x11,0x00,0xd2,0x26,0xd1,0x06,0xcf,0x06,
+	0x11,0x00,0xd0,0x1a,0xcf,0x86,0x55,0x04,0x11,0x00,0x94,0x10,0x93,0x0c,0x92,0x08,
+	0x11,0x04,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x00,0xcf,0x06,0x13,0x00,
+	0xcf,0x06,0x13,0x00,0xcf,0x86,0xcf,0x06,0x13,0x00,0xd0,0x44,0xcf,0x86,0xd5,0x06,
+	0xcf,0x06,0x13,0x00,0xd4,0x36,0xd3,0x06,0xcf,0x06,0x13,0x00,0xd2,0x06,0xcf,0x06,
+	0x13,0x00,0xd1,0x06,0xcf,0x06,0x13,0x00,0xd0,0x06,0xcf,0x06,0x13,0x00,0xcf,0x86,
+	0x55,0x04,0x13,0x00,0x94,0x14,0x93,0x10,0x92,0x0c,0x91,0x08,0x10,0x04,0x13,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x86,
+	0xd5,0x06,0xcf,0x06,0x00,0x00,0xe4,0x68,0x11,0xe3,0x51,0x10,0xe2,0x17,0x08,0xe1,
+	0x06,0x04,0xe0,0x03,0x02,0xcf,0x86,0xe5,0x06,0x01,0xd4,0x82,0xd3,0x41,0xd2,0x21,
+	0xd1,0x10,0x10,0x08,0x05,0xff,0xe4,0xb8,0xbd,0x00,0x05,0xff,0xe4,0xb8,0xb8,0x00,
+	0x10,0x08,0x05,0xff,0xe4,0xb9,0x81,0x00,0x05,0xff,0xf0,0xa0,0x84,0xa2,0x00,0xd1,
+	0x10,0x10,0x08,0x05,0xff,0xe4,0xbd,0xa0,0x00,0x05,0xff,0xe4,0xbe,0xae,0x00,0x10,
+	0x08,0x05,0xff,0xe4,0xbe,0xbb,0x00,0x05,0xff,0xe5,0x80,0x82,0x00,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x05,0xff,0xe5,0x81,0xba,0x00,0x05,0xff,0xe5,0x82,0x99,0x00,0x10,
+	0x08,0x05,0xff,0xe5,0x83,0xa7,0x00,0x05,0xff,0xe5,0x83,0x8f,0x00,0xd1,0x11,0x10,
+	0x08,0x05,0xff,0xe3,0x92,0x9e,0x00,0x05,0xff,0xf0,0xa0,0x98,0xba,0x00,0x10,0x08,
+	0x05,0xff,0xe5,0x85,0x8d,0x00,0x05,0xff,0xe5,0x85,0x94,0x00,0xd3,0x42,0xd2,0x21,
+	0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0x85,0xa4,0x00,0x05,0xff,0xe5,0x85,0xb7,0x00,
+	0x10,0x09,0x05,0xff,0xf0,0xa0,0x94,0x9c,0x00,0x05,0xff,0xe3,0x92,0xb9,0x00,0xd1,
+	0x10,0x10,0x08,0x05,0xff,0xe5,0x85,0xa7,0x00,0x05,0xff,0xe5,0x86,0x8d,0x00,0x10,
+	0x09,0x05,0xff,0xf0,0xa0,0x95,0x8b,0x00,0x05,0xff,0xe5,0x86,0x97,0x00,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0x86,0xa4,0x00,0x05,0xff,0xe4,0xbb,0x8c,0x00,
+	0x10,0x08,0x05,0xff,0xe5,0x86,0xac,0x00,0x05,0xff,0xe5,0x86,0xb5,0x00,0xd1,0x11,
+	0x10,0x09,0x05,0xff,0xf0,0xa9,0x87,0x9f,0x00,0x05,0xff,0xe5,0x87,0xb5,0x00,0x10,
+	0x08,0x05,0xff,0xe5,0x88,0x83,0x00,0x05,0xff,0xe3,0x93,0x9f,0x00,0xd4,0x80,0xd3,
+	0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0x88,0xbb,0x00,0x05,0xff,0xe5,
+	0x89,0x86,0x00,0x10,0x08,0x05,0xff,0xe5,0x89,0xb2,0x00,0x05,0xff,0xe5,0x89,0xb7,
+	0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe3,0x94,0x95,0x00,0x05,0xff,0xe5,0x8b,0x87,
+	0x00,0x10,0x08,0x05,0xff,0xe5,0x8b,0x89,0x00,0x05,0xff,0xe5,0x8b,0xa4,0x00,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0x8b,0xba,0x00,0x05,0xff,0xe5,0x8c,0x85,
+	0x00,0x10,0x08,0x05,0xff,0xe5,0x8c,0x86,0x00,0x05,0xff,0xe5,0x8c,0x97,0x00,0xd1,
+	0x10,0x10,0x08,0x05,0xff,0xe5,0x8d,0x89,0x00,0x05,0xff,0xe5,0x8d,0x91,0x00,0x10,
+	0x08,0x05,0xff,0xe5,0x8d,0x9a,0x00,0x05,0xff,0xe5,0x8d,0xb3,0x00,0xd3,0x39,0xd2,
+	0x18,0x91,0x10,0x10,0x08,0x05,0xff,0xe5,0x8d,0xbd,0x00,0x05,0xff,0xe5,0x8d,0xbf,
+	0x00,0x05,0xff,0xe5,0x8d,0xbf,0x00,0xd1,0x11,0x10,0x09,0x05,0xff,0xf0,0xa0,0xa8,
+	0xac,0x00,0x05,0xff,0xe7,0x81,0xb0,0x00,0x10,0x08,0x05,0xff,0xe5,0x8f,0x8a,0x00,
+	0x05,0xff,0xe5,0x8f,0x9f,0x00,0xd2,0x21,0xd1,0x11,0x10,0x09,0x05,0xff,0xf0,0xa0,
+	0xad,0xa3,0x00,0x05,0xff,0xe5,0x8f,0xab,0x00,0x10,0x08,0x05,0xff,0xe5,0x8f,0xb1,
+	0x00,0x05,0xff,0xe5,0x90,0x86,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0x92,0x9e,
+	0x00,0x05,0xff,0xe5,0x90,0xb8,0x00,0x10,0x08,0x05,0xff,0xe5,0x91,0x88,0x00,0x05,
+	0xff,0xe5,0x91,0xa8,0x00,0xcf,0x86,0xe5,0x02,0x01,0xd4,0x80,0xd3,0x40,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0x92,0xa2,0x00,0x05,0xff,0xe5,0x93,0xb6,0x00,
+	0x10,0x08,0x05,0xff,0xe5,0x94,0x90,0x00,0x05,0xff,0xe5,0x95,0x93,0x00,0xd1,0x10,
+	0x10,0x08,0x05,0xff,0xe5,0x95,0xa3,0x00,0x05,0xff,0xe5,0x96,0x84,0x00,0x10,0x08,
+	0x05,0xff,0xe5,0x96,0x84,0x00,0x05,0xff,0xe5,0x96,0x99,0x00,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x05,0xff,0xe5,0x96,0xab,0x00,0x05,0xff,0xe5,0x96,0xb3,0x00,0x10,0x08,
+	0x05,0xff,0xe5,0x97,0x82,0x00,0x05,0xff,0xe5,0x9c,0x96,0x00,0xd1,0x10,0x10,0x08,
+	0x05,0xff,0xe5,0x98,0x86,0x00,0x05,0xff,0xe5,0x9c,0x97,0x00,0x10,0x08,0x05,0xff,
+	0xe5,0x99,0x91,0x00,0x05,0xff,0xe5,0x99,0xb4,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x05,0xff,0xe5,0x88,0x87,0x00,0x05,0xff,0xe5,0xa3,0xae,0x00,0x10,0x08,
+	0x05,0xff,0xe5,0x9f,0x8e,0x00,0x05,0xff,0xe5,0x9f,0xb4,0x00,0xd1,0x10,0x10,0x08,
+	0x05,0xff,0xe5,0xa0,0x8d,0x00,0x05,0xff,0xe5,0x9e,0x8b,0x00,0x10,0x08,0x05,0xff,
+	0xe5,0xa0,0xb2,0x00,0x05,0xff,0xe5,0xa0,0xb1,0x00,0xd2,0x21,0xd1,0x11,0x10,0x08,
+	0x05,0xff,0xe5,0xa2,0xac,0x00,0x05,0xff,0xf0,0xa1,0x93,0xa4,0x00,0x10,0x08,0x05,
+	0xff,0xe5,0xa3,0xb2,0x00,0x05,0xff,0xe5,0xa3,0xb7,0x00,0xd1,0x10,0x10,0x08,0x05,
+	0xff,0xe5,0xa4,0x86,0x00,0x05,0xff,0xe5,0xa4,0x9a,0x00,0x10,0x08,0x05,0xff,0xe5,
+	0xa4,0xa2,0x00,0x05,0xff,0xe5,0xa5,0xa2,0x00,0xd4,0x7b,0xd3,0x42,0xd2,0x22,0xd1,
+	0x12,0x10,0x09,0x05,0xff,0xf0,0xa1,0x9a,0xa8,0x00,0x05,0xff,0xf0,0xa1,0x9b,0xaa,
+	0x00,0x10,0x08,0x05,0xff,0xe5,0xa7,0xac,0x00,0x05,0xff,0xe5,0xa8,0x9b,0x00,0xd1,
+	0x10,0x10,0x08,0x05,0xff,0xe5,0xa8,0xa7,0x00,0x05,0xff,0xe5,0xa7,0x98,0x00,0x10,
+	0x08,0x05,0xff,0xe5,0xa9,0xa6,0x00,0x05,0xff,0xe3,0x9b,0xae,0x00,0xd2,0x18,0x91,
+	0x10,0x10,0x08,0x05,0xff,0xe3,0x9b,0xbc,0x00,0x05,0xff,0xe5,0xac,0x88,0x00,0x05,
+	0xff,0xe5,0xac,0xbe,0x00,0xd1,0x11,0x10,0x09,0x05,0xff,0xf0,0xa1,0xa7,0x88,0x00,
+	0x05,0xff,0xe5,0xaf,0x83,0x00,0x10,0x08,0x05,0xff,0xe5,0xaf,0x98,0x00,0x05,0xff,
+	0xe5,0xaf,0xa7,0x00,0xd3,0x41,0xd2,0x21,0xd1,0x11,0x10,0x08,0x05,0xff,0xe5,0xaf,
+	0xb3,0x00,0x05,0xff,0xf0,0xa1,0xac,0x98,0x00,0x10,0x08,0x05,0xff,0xe5,0xaf,0xbf,
+	0x00,0x05,0xff,0xe5,0xb0,0x86,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0xbd,0x93,
+	0x00,0x05,0xff,0xe5,0xb0,0xa2,0x00,0x10,0x08,0x05,0xff,0xe3,0x9e,0x81,0x00,0x05,
+	0xff,0xe5,0xb1,0xa0,0x00,0xd2,0x21,0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0xb1,0xae,
+	0x00,0x05,0xff,0xe5,0xb3,0x80,0x00,0x10,0x08,0x05,0xff,0xe5,0xb2,0x8d,0x00,0x05,
+	0xff,0xf0,0xa1,0xb7,0xa4,0x00,0xd1,0x11,0x10,0x08,0x05,0xff,0xe5,0xb5,0x83,0x00,
+	0x05,0xff,0xf0,0xa1,0xb7,0xa6,0x00,0x10,0x08,0x05,0xff,0xe5,0xb5,0xae,0x00,0x05,
+	0xff,0xe5,0xb5,0xab,0x00,0xe0,0x04,0x02,0xcf,0x86,0xd5,0xfe,0xd4,0x82,0xd3,0x40,
+	0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0xb5,0xbc,0x00,0x05,0xff,0xe5,0xb7,
+	0xa1,0x00,0x10,0x08,0x05,0xff,0xe5,0xb7,0xa2,0x00,0x05,0xff,0xe3,0xa0,0xaf,0x00,
+	0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0xb7,0xbd,0x00,0x05,0xff,0xe5,0xb8,0xa8,0x00,
+	0x10,0x08,0x05,0xff,0xe5,0xb8,0xbd,0x00,0x05,0xff,0xe5,0xb9,0xa9,0x00,0xd2,0x21,
+	0xd1,0x11,0x10,0x08,0x05,0xff,0xe3,0xa1,0xa2,0x00,0x05,0xff,0xf0,0xa2,0x86,0x83,
+	0x00,0x10,0x08,0x05,0xff,0xe3,0xa1,0xbc,0x00,0x05,0xff,0xe5,0xba,0xb0,0x00,0xd1,
+	0x10,0x10,0x08,0x05,0xff,0xe5,0xba,0xb3,0x00,0x05,0xff,0xe5,0xba,0xb6,0x00,0x10,
+	0x08,0x05,0xff,0xe5,0xbb,0x8a,0x00,0x05,0xff,0xf0,0xaa,0x8e,0x92,0x00,0xd3,0x3b,
+	0xd2,0x22,0xd1,0x11,0x10,0x08,0x05,0xff,0xe5,0xbb,0xbe,0x00,0x05,0xff,0xf0,0xa2,
+	0x8c,0xb1,0x00,0x10,0x09,0x05,0xff,0xf0,0xa2,0x8c,0xb1,0x00,0x05,0xff,0xe8,0x88,
+	0x81,0x00,0x51,0x08,0x05,0xff,0xe5,0xbc,0xa2,0x00,0x10,0x08,0x05,0xff,0xe3,0xa3,
+	0x87,0x00,0x05,0xff,0xf0,0xa3,0x8a,0xb8,0x00,0xd2,0x21,0xd1,0x11,0x10,0x09,0x05,
+	0xff,0xf0,0xa6,0x87,0x9a,0x00,0x05,0xff,0xe5,0xbd,0xa2,0x00,0x10,0x08,0x05,0xff,
+	0xe5,0xbd,0xab,0x00,0x05,0xff,0xe3,0xa3,0xa3,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,
+	0xe5,0xbe,0x9a,0x00,0x05,0xff,0xe5,0xbf,0x8d,0x00,0x10,0x08,0x05,0xff,0xe5,0xbf,
+	0x97,0x00,0x05,0xff,0xe5,0xbf,0xb9,0x00,0xd4,0x81,0xd3,0x41,0xd2,0x20,0xd1,0x10,
+	0x10,0x08,0x05,0xff,0xe6,0x82,0x81,0x00,0x05,0xff,0xe3,0xa4,0xba,0x00,0x10,0x08,
+	0x05,0xff,0xe3,0xa4,0x9c,0x00,0x05,0xff,0xe6,0x82,0x94,0x00,0xd1,0x11,0x10,0x09,
+	0x05,0xff,0xf0,0xa2,0x9b,0x94,0x00,0x05,0xff,0xe6,0x83,0x87,0x00,0x10,0x08,0x05,
+	0xff,0xe6,0x85,0x88,0x00,0x05,0xff,0xe6,0x85,0x8c,0x00,0xd2,0x20,0xd1,0x10,0x10,
+	0x08,0x05,0xff,0xe6,0x85,0x8e,0x00,0x05,0xff,0xe6,0x85,0x8c,0x00,0x10,0x08,0x05,
+	0xff,0xe6,0x85,0xba,0x00,0x05,0xff,0xe6,0x86,0x8e,0x00,0xd1,0x10,0x10,0x08,0x05,
+	0xff,0xe6,0x86,0xb2,0x00,0x05,0xff,0xe6,0x86,0xa4,0x00,0x10,0x08,0x05,0xff,0xe6,
+	0x86,0xaf,0x00,0x05,0xff,0xe6,0x87,0x9e,0x00,0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,
+	0x08,0x05,0xff,0xe6,0x87,0xb2,0x00,0x05,0xff,0xe6,0x87,0xb6,0x00,0x10,0x08,0x05,
+	0xff,0xe6,0x88,0x90,0x00,0x05,0xff,0xe6,0x88,0x9b,0x00,0xd1,0x10,0x10,0x08,0x05,
+	0xff,0xe6,0x89,0x9d,0x00,0x05,0xff,0xe6,0x8a,0xb1,0x00,0x10,0x08,0x05,0xff,0xe6,
+	0x8b,0x94,0x00,0x05,0xff,0xe6,0x8d,0x90,0x00,0xd2,0x21,0xd1,0x11,0x10,0x09,0x05,
+	0xff,0xf0,0xa2,0xac,0x8c,0x00,0x05,0xff,0xe6,0x8c,0xbd,0x00,0x10,0x08,0x05,0xff,
+	0xe6,0x8b,0xbc,0x00,0x05,0xff,0xe6,0x8d,0xa8,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,
+	0xe6,0x8e,0x83,0x00,0x05,0xff,0xe6,0x8f,0xa4,0x00,0x10,0x09,0x05,0xff,0xf0,0xa2,
+	0xaf,0xb1,0x00,0x05,0xff,0xe6,0x90,0xa2,0x00,0xcf,0x86,0xe5,0x03,0x01,0xd4,0x81,
+	0xd3,0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0x8f,0x85,0x00,0x05,0xff,
+	0xe6,0x8e,0xa9,0x00,0x10,0x08,0x05,0xff,0xe3,0xa8,0xae,0x00,0x05,0xff,0xe6,0x91,
+	0xa9,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0x91,0xbe,0x00,0x05,0xff,0xe6,0x92,
+	0x9d,0x00,0x10,0x08,0x05,0xff,0xe6,0x91,0xb7,0x00,0x05,0xff,0xe3,0xa9,0xac,0x00,
+	0xd2,0x21,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0x95,0x8f,0x00,0x05,0xff,0xe6,0x95,
+	0xac,0x00,0x10,0x09,0x05,0xff,0xf0,0xa3,0x80,0x8a,0x00,0x05,0xff,0xe6,0x97,0xa3,
+	0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0x9b,0xb8,0x00,0x05,0xff,0xe6,0x99,0x89,
+	0x00,0x10,0x08,0x05,0xff,0xe3,0xac,0x99,0x00,0x05,0xff,0xe6,0x9a,0x91,0x00,0xd3,
+	0x40,0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe3,0xac,0x88,0x00,0x05,0xff,0xe3,
+	0xab,0xa4,0x00,0x10,0x08,0x05,0xff,0xe5,0x86,0x92,0x00,0x05,0xff,0xe5,0x86,0x95,
+	0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0x9c,0x80,0x00,0x05,0xff,0xe6,0x9a,0x9c,
+	0x00,0x10,0x08,0x05,0xff,0xe8,0x82,0xad,0x00,0x05,0xff,0xe4,0x8f,0x99,0x00,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0x9c,0x97,0x00,0x05,0xff,0xe6,0x9c,0x9b,
+	0x00,0x10,0x08,0x05,0xff,0xe6,0x9c,0xa1,0x00,0x05,0xff,0xe6,0x9d,0x9e,0x00,0xd1,
+	0x11,0x10,0x08,0x05,0xff,0xe6,0x9d,0x93,0x00,0x05,0xff,0xf0,0xa3,0x8f,0x83,0x00,
+	0x10,0x08,0x05,0xff,0xe3,0xad,0x89,0x00,0x05,0xff,0xe6,0x9f,0xba,0x00,0xd4,0x82,
+	0xd3,0x41,0xd2,0x21,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0x9e,0x85,0x00,0x05,0xff,
+	0xe6,0xa1,0x92,0x00,0x10,0x08,0x05,0xff,0xe6,0xa2,0x85,0x00,0x05,0xff,0xf0,0xa3,
+	0x91,0xad,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0xa2,0x8e,0x00,0x05,0xff,0xe6,
+	0xa0,0x9f,0x00,0x10,0x08,0x05,0xff,0xe6,0xa4,0x94,0x00,0x05,0xff,0xe3,0xae,0x9d,
+	0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0xa5,0x82,0x00,0x05,0xff,0xe6,
+	0xa6,0xa3,0x00,0x10,0x08,0x05,0xff,0xe6,0xa7,0xaa,0x00,0x05,0xff,0xe6,0xaa,0xa8,
+	0x00,0xd1,0x11,0x10,0x09,0x05,0xff,0xf0,0xa3,0x9a,0xa3,0x00,0x05,0xff,0xe6,0xab,
+	0x9b,0x00,0x10,0x08,0x05,0xff,0xe3,0xb0,0x98,0x00,0x05,0xff,0xe6,0xac,0xa1,0x00,
+	0xd3,0x42,0xd2,0x21,0xd1,0x11,0x10,0x09,0x05,0xff,0xf0,0xa3,0xa2,0xa7,0x00,0x05,
+	0xff,0xe6,0xad,0x94,0x00,0x10,0x08,0x05,0xff,0xe3,0xb1,0x8e,0x00,0x05,0xff,0xe6,
+	0xad,0xb2,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0xae,0x9f,0x00,0x05,0xff,0xe6,
+	0xae,0xba,0x00,0x10,0x08,0x05,0xff,0xe6,0xae,0xbb,0x00,0x05,0xff,0xf0,0xa3,0xaa,
+	0x8d,0x00,0xd2,0x23,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa1,0xb4,0x8b,0x00,0x05,
+	0xff,0xf0,0xa3,0xab,0xba,0x00,0x10,0x08,0x05,0xff,0xe6,0xb1,0x8e,0x00,0x05,0xff,
+	0xf0,0xa3,0xb2,0xbc,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0xb2,0xbf,0x00,0x05,
+	0xff,0xe6,0xb3,0x8d,0x00,0x10,0x08,0x05,0xff,0xe6,0xb1,0xa7,0x00,0x05,0xff,0xe6,
+	0xb4,0x96,0x00,0xe1,0x1d,0x04,0xe0,0x0c,0x02,0xcf,0x86,0xe5,0x08,0x01,0xd4,0x82,
+	0xd3,0x41,0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0xb4,0xbe,0x00,0x05,0xff,
+	0xe6,0xb5,0xb7,0x00,0x10,0x08,0x05,0xff,0xe6,0xb5,0x81,0x00,0x05,0xff,0xe6,0xb5,
+	0xa9,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0xb5,0xb8,0x00,0x05,0xff,0xe6,0xb6,
+	0x85,0x00,0x10,0x09,0x05,0xff,0xf0,0xa3,0xb4,0x9e,0x00,0x05,0xff,0xe6,0xb4,0xb4,
+	0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe6,0xb8,0xaf,0x00,0x05,0xff,0xe6,
+	0xb9,0xae,0x00,0x10,0x08,0x05,0xff,0xe3,0xb4,0xb3,0x00,0x05,0xff,0xe6,0xbb,0x8b,
+	0x00,0xd1,0x11,0x10,0x08,0x05,0xff,0xe6,0xbb,0x87,0x00,0x05,0xff,0xf0,0xa3,0xbb,
+	0x91,0x00,0x10,0x08,0x05,0xff,0xe6,0xb7,0xb9,0x00,0x05,0xff,0xe6,0xbd,0xae,0x00,
+	0xd3,0x42,0xd2,0x22,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa3,0xbd,0x9e,0x00,0x05,
+	0xff,0xf0,0xa3,0xbe,0x8e,0x00,0x10,0x08,0x05,0xff,0xe6,0xbf,0x86,0x00,0x05,0xff,
+	0xe7,0x80,0xb9,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe7,0x80,0x9e,0x00,0x05,0xff,
+	0xe7,0x80,0x9b,0x00,0x10,0x08,0x05,0xff,0xe3,0xb6,0x96,0x00,0x05,0xff,0xe7,0x81,
+	0x8a,0x00,0xd2,0x21,0xd1,0x10,0x10,0x08,0x05,0xff,0xe7,0x81,0xbd,0x00,0x05,0xff,
+	0xe7,0x81,0xb7,0x00,0x10,0x08,0x05,0xff,0xe7,0x82,0xad,0x00,0x05,0xff,0xf0,0xa0,
+	0x94,0xa5,0x00,0xd1,0x11,0x10,0x08,0x05,0xff,0xe7,0x85,0x85,0x00,0x05,0xff,0xf0,
+	0xa4,0x89,0xa3,0x00,0x10,0x08,0x05,0xff,0xe7,0x86,0x9c,0x00,0x05,0xff,0xf0,0xa4,
+	0x8e,0xab,0x00,0xd4,0x7b,0xd3,0x43,0xd2,0x21,0xd1,0x10,0x10,0x08,0x05,0xff,0xe7,
+	0x88,0xa8,0x00,0x05,0xff,0xe7,0x88,0xb5,0x00,0x10,0x08,0x05,0xff,0xe7,0x89,0x90,
+	0x00,0x05,0xff,0xf0,0xa4,0x98,0x88,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe7,0x8a,
+	0x80,0x00,0x05,0xff,0xe7,0x8a,0x95,0x00,0x10,0x09,0x05,0xff,0xf0,0xa4,0x9c,0xb5,
+	0x00,0x05,0xff,0xf0,0xa4,0xa0,0x94,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,
+	0xe7,0x8d,0xba,0x00,0x05,0xff,0xe7,0x8e,0x8b,0x00,0x10,0x08,0x05,0xff,0xe3,0xba,
+	0xac,0x00,0x05,0xff,0xe7,0x8e,0xa5,0x00,0x51,0x08,0x05,0xff,0xe3,0xba,0xb8,0x00,
+	0x10,0x08,0x05,0xff,0xe7,0x91,0x87,0x00,0x05,0xff,0xe7,0x91,0x9c,0x00,0xd3,0x42,
+	0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe7,0x91,0xb1,0x00,0x05,0xff,0xe7,0x92,
+	0x85,0x00,0x10,0x08,0x05,0xff,0xe7,0x93,0x8a,0x00,0x05,0xff,0xe3,0xbc,0x9b,0x00,
+	0xd1,0x11,0x10,0x08,0x05,0xff,0xe7,0x94,0xa4,0x00,0x05,0xff,0xf0,0xa4,0xb0,0xb6,
+	0x00,0x10,0x08,0x05,0xff,0xe7,0x94,0xbe,0x00,0x05,0xff,0xf0,0xa4,0xb2,0x92,0x00,
+	0xd2,0x22,0xd1,0x11,0x10,0x08,0x05,0xff,0xe7,0x95,0xb0,0x00,0x05,0xff,0xf0,0xa2,
+	0x86,0x9f,0x00,0x10,0x08,0x05,0xff,0xe7,0x98,0x90,0x00,0x05,0xff,0xf0,0xa4,0xbe,
+	0xa1,0x00,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa4,0xbe,0xb8,0x00,0x05,0xff,0xf0,
+	0xa5,0x81,0x84,0x00,0x10,0x08,0x05,0xff,0xe3,0xbf,0xbc,0x00,0x05,0xff,0xe4,0x80,
+	0x88,0x00,0xcf,0x86,0xe5,0x04,0x01,0xd4,0x7d,0xd3,0x3c,0xd2,0x23,0xd1,0x11,0x10,
+	0x08,0x05,0xff,0xe7,0x9b,0xb4,0x00,0x05,0xff,0xf0,0xa5,0x83,0xb3,0x00,0x10,0x09,
+	0x05,0xff,0xf0,0xa5,0x83,0xb2,0x00,0x05,0xff,0xf0,0xa5,0x84,0x99,0x00,0x91,0x11,
+	0x10,0x09,0x05,0xff,0xf0,0xa5,0x84,0xb3,0x00,0x05,0xff,0xe7,0x9c,0x9e,0x00,0x05,
+	0xff,0xe7,0x9c,0x9f,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe7,0x9d,0x8a,
+	0x00,0x05,0xff,0xe4,0x80,0xb9,0x00,0x10,0x08,0x05,0xff,0xe7,0x9e,0x8b,0x00,0x05,
+	0xff,0xe4,0x81,0x86,0x00,0xd1,0x11,0x10,0x08,0x05,0xff,0xe4,0x82,0x96,0x00,0x05,
+	0xff,0xf0,0xa5,0x90,0x9d,0x00,0x10,0x08,0x05,0xff,0xe7,0xa1,0x8e,0x00,0x05,0xff,
+	0xe7,0xa2,0x8c,0x00,0xd3,0x43,0xd2,0x21,0xd1,0x10,0x10,0x08,0x05,0xff,0xe7,0xa3,
+	0x8c,0x00,0x05,0xff,0xe4,0x83,0xa3,0x00,0x10,0x09,0x05,0xff,0xf0,0xa5,0x98,0xa6,
+	0x00,0x05,0xff,0xe7,0xa5,0x96,0x00,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa5,0x9a,
+	0x9a,0x00,0x05,0xff,0xf0,0xa5,0x9b,0x85,0x00,0x10,0x08,0x05,0xff,0xe7,0xa6,0x8f,
+	0x00,0x05,0xff,0xe7,0xa7,0xab,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe4,
+	0x84,0xaf,0x00,0x05,0xff,0xe7,0xa9,0x80,0x00,0x10,0x08,0x05,0xff,0xe7,0xa9,0x8a,
+	0x00,0x05,0xff,0xe7,0xa9,0x8f,0x00,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa5,0xa5,
+	0xbc,0x00,0x05,0xff,0xf0,0xa5,0xaa,0xa7,0x00,0x10,0x09,0x05,0xff,0xf0,0xa5,0xaa,
+	0xa7,0x00,0x05,0xff,0xe7,0xab,0xae,0x00,0xd4,0x83,0xd3,0x42,0xd2,0x21,0xd1,0x11,
+	0x10,0x08,0x05,0xff,0xe4,0x88,0x82,0x00,0x05,0xff,0xf0,0xa5,0xae,0xab,0x00,0x10,
+	0x08,0x05,0xff,0xe7,0xaf,0x86,0x00,0x05,0xff,0xe7,0xaf,0x89,0x00,0xd1,0x11,0x10,
+	0x08,0x05,0xff,0xe4,0x88,0xa7,0x00,0x05,0xff,0xf0,0xa5,0xb2,0x80,0x00,0x10,0x08,
+	0x05,0xff,0xe7,0xb3,0x92,0x00,0x05,0xff,0xe4,0x8a,0xa0,0x00,0xd2,0x21,0xd1,0x10,
+	0x10,0x08,0x05,0xff,0xe7,0xb3,0xa8,0x00,0x05,0xff,0xe7,0xb3,0xa3,0x00,0x10,0x08,
+	0x05,0xff,0xe7,0xb4,0x80,0x00,0x05,0xff,0xf0,0xa5,0xbe,0x86,0x00,0xd1,0x10,0x10,
+	0x08,0x05,0xff,0xe7,0xb5,0xa3,0x00,0x05,0xff,0xe4,0x8c,0x81,0x00,0x10,0x08,0x05,
+	0xff,0xe7,0xb7,0x87,0x00,0x05,0xff,0xe7,0xb8,0x82,0x00,0xd3,0x44,0xd2,0x22,0xd1,
+	0x10,0x10,0x08,0x05,0xff,0xe7,0xb9,0x85,0x00,0x05,0xff,0xe4,0x8c,0xb4,0x00,0x10,
+	0x09,0x05,0xff,0xf0,0xa6,0x88,0xa8,0x00,0x05,0xff,0xf0,0xa6,0x89,0x87,0x00,0xd1,
+	0x11,0x10,0x08,0x05,0xff,0xe4,0x8d,0x99,0x00,0x05,0xff,0xf0,0xa6,0x8b,0x99,0x00,
+	0x10,0x08,0x05,0xff,0xe7,0xbd,0xba,0x00,0x05,0xff,0xf0,0xa6,0x8c,0xbe,0x00,0xd2,
+	0x21,0xd1,0x10,0x10,0x08,0x05,0xff,0xe7,0xbe,0x95,0x00,0x05,0xff,0xe7,0xbf,0xba,
+	0x00,0x10,0x08,0x05,0xff,0xe8,0x80,0x85,0x00,0x05,0xff,0xf0,0xa6,0x93,0x9a,0x00,
+	0xd1,0x11,0x10,0x09,0x05,0xff,0xf0,0xa6,0x94,0xa3,0x00,0x05,0xff,0xe8,0x81,0xa0,
+	0x00,0x10,0x09,0x05,0xff,0xf0,0xa6,0x96,0xa8,0x00,0x05,0xff,0xe8,0x81,0xb0,0x00,
+	0xe0,0x11,0x02,0xcf,0x86,0xe5,0x07,0x01,0xd4,0x85,0xd3,0x42,0xd2,0x21,0xd1,0x11,
+	0x10,0x09,0x05,0xff,0xf0,0xa3,0x8d,0x9f,0x00,0x05,0xff,0xe4,0x8f,0x95,0x00,0x10,
+	0x08,0x05,0xff,0xe8,0x82,0xb2,0x00,0x05,0xff,0xe8,0x84,0x83,0x00,0xd1,0x10,0x10,
+	0x08,0x05,0xff,0xe4,0x90,0x8b,0x00,0x05,0xff,0xe8,0x84,0xbe,0x00,0x10,0x08,0x05,
+	0xff,0xe5,0xaa,0xb5,0x00,0x05,0xff,0xf0,0xa6,0x9e,0xa7,0x00,0xd2,0x23,0xd1,0x12,
+	0x10,0x09,0x05,0xff,0xf0,0xa6,0x9e,0xb5,0x00,0x05,0xff,0xf0,0xa3,0x8e,0x93,0x00,
+	0x10,0x09,0x05,0xff,0xf0,0xa3,0x8e,0x9c,0x00,0x05,0xff,0xe8,0x88,0x81,0x00,0xd1,
+	0x10,0x10,0x08,0x05,0xff,0xe8,0x88,0x84,0x00,0x05,0xff,0xe8,0xbe,0x9e,0x00,0x10,
+	0x08,0x05,0xff,0xe4,0x91,0xab,0x00,0x05,0xff,0xe8,0x8a,0x91,0x00,0xd3,0x41,0xd2,
+	0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe8,0x8a,0x8b,0x00,0x05,0xff,0xe8,0x8a,0x9d,
+	0x00,0x10,0x08,0x05,0xff,0xe5,0x8a,0xb3,0x00,0x05,0xff,0xe8,0x8a,0xb1,0x00,0xd1,
+	0x10,0x10,0x08,0x05,0xff,0xe8,0x8a,0xb3,0x00,0x05,0xff,0xe8,0x8a,0xbd,0x00,0x10,
+	0x08,0x05,0xff,0xe8,0x8b,0xa6,0x00,0x05,0xff,0xf0,0xa6,0xac,0xbc,0x00,0xd2,0x20,
+	0xd1,0x10,0x10,0x08,0x05,0xff,0xe8,0x8b,0xa5,0x00,0x05,0xff,0xe8,0x8c,0x9d,0x00,
+	0x10,0x08,0x05,0xff,0xe8,0x8d,0xa3,0x00,0x05,0xff,0xe8,0x8e,0xad,0x00,0xd1,0x10,
+	0x10,0x08,0x05,0xff,0xe8,0x8c,0xa3,0x00,0x05,0xff,0xe8,0x8e,0xbd,0x00,0x10,0x08,
+	0x05,0xff,0xe8,0x8f,0xa7,0x00,0x05,0xff,0xe8,0x91,0x97,0x00,0xd4,0x85,0xd3,0x43,
+	0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe8,0x8d,0x93,0x00,0x05,0xff,0xe8,0x8f,
+	0x8a,0x00,0x10,0x08,0x05,0xff,0xe8,0x8f,0x8c,0x00,0x05,0xff,0xe8,0x8f,0x9c,0x00,
+	0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa6,0xb0,0xb6,0x00,0x05,0xff,0xf0,0xa6,0xb5,
+	0xab,0x00,0x10,0x09,0x05,0xff,0xf0,0xa6,0xb3,0x95,0x00,0x05,0xff,0xe4,0x94,0xab,
+	0x00,0xd2,0x21,0xd1,0x10,0x10,0x08,0x05,0xff,0xe8,0x93,0xb1,0x00,0x05,0xff,0xe8,
+	0x93,0xb3,0x00,0x10,0x08,0x05,0xff,0xe8,0x94,0x96,0x00,0x05,0xff,0xf0,0xa7,0x8f,
+	0x8a,0x00,0xd1,0x11,0x10,0x08,0x05,0xff,0xe8,0x95,0xa4,0x00,0x05,0xff,0xf0,0xa6,
+	0xbc,0xac,0x00,0x10,0x08,0x05,0xff,0xe4,0x95,0x9d,0x00,0x05,0xff,0xe4,0x95,0xa1,
+	0x00,0xd3,0x42,0xd2,0x22,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa6,0xbe,0xb1,0x00,
+	0x05,0xff,0xf0,0xa7,0x83,0x92,0x00,0x10,0x08,0x05,0xff,0xe4,0x95,0xab,0x00,0x05,
+	0xff,0xe8,0x99,0x90,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe8,0x99,0x9c,0x00,0x05,
+	0xff,0xe8,0x99,0xa7,0x00,0x10,0x08,0x05,0xff,0xe8,0x99,0xa9,0x00,0x05,0xff,0xe8,
+	0x9a,0xa9,0x00,0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe8,0x9a,0x88,0x00,0x05,
+	0xff,0xe8,0x9c,0x8e,0x00,0x10,0x08,0x05,0xff,0xe8,0x9b,0xa2,0x00,0x05,0xff,0xe8,
+	0x9d,0xb9,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe8,0x9c,0xa8,0x00,0x05,0xff,0xe8,
+	0x9d,0xab,0x00,0x10,0x08,0x05,0xff,0xe8,0x9e,0x86,0x00,0x05,0xff,0xe4,0x97,0x97,
+	0x00,0xcf,0x86,0xe5,0x08,0x01,0xd4,0x83,0xd3,0x41,0xd2,0x20,0xd1,0x10,0x10,0x08,
+	0x05,0xff,0xe8,0x9f,0xa1,0x00,0x05,0xff,0xe8,0xa0,0x81,0x00,0x10,0x08,0x05,0xff,
+	0xe4,0x97,0xb9,0x00,0x05,0xff,0xe8,0xa1,0xa0,0x00,0xd1,0x11,0x10,0x08,0x05,0xff,
+	0xe8,0xa1,0xa3,0x00,0x05,0xff,0xf0,0xa7,0x99,0xa7,0x00,0x10,0x08,0x05,0xff,0xe8,
+	0xa3,0x97,0x00,0x05,0xff,0xe8,0xa3,0x9e,0x00,0xd2,0x21,0xd1,0x10,0x10,0x08,0x05,
+	0xff,0xe4,0x98,0xb5,0x00,0x05,0xff,0xe8,0xa3,0xba,0x00,0x10,0x08,0x05,0xff,0xe3,
+	0x92,0xbb,0x00,0x05,0xff,0xf0,0xa7,0xa2,0xae,0x00,0xd1,0x11,0x10,0x09,0x05,0xff,
+	0xf0,0xa7,0xa5,0xa6,0x00,0x05,0xff,0xe4,0x9a,0xbe,0x00,0x10,0x08,0x05,0xff,0xe4,
+	0x9b,0x87,0x00,0x05,0xff,0xe8,0xaa,0xa0,0x00,0xd3,0x41,0xd2,0x21,0xd1,0x10,0x10,
+	0x08,0x05,0xff,0xe8,0xab,0xad,0x00,0x05,0xff,0xe8,0xae,0x8a,0x00,0x10,0x08,0x05,
+	0xff,0xe8,0xb1,0x95,0x00,0x05,0xff,0xf0,0xa7,0xb2,0xa8,0x00,0xd1,0x10,0x10,0x08,
+	0x05,0xff,0xe8,0xb2,0xab,0x00,0x05,0xff,0xe8,0xb3,0x81,0x00,0x10,0x08,0x05,0xff,
+	0xe8,0xb4,0x9b,0x00,0x05,0xff,0xe8,0xb5,0xb7,0x00,0xd2,0x22,0xd1,0x12,0x10,0x09,
+	0x05,0xff,0xf0,0xa7,0xbc,0xaf,0x00,0x05,0xff,0xf0,0xa0,0xa0,0x84,0x00,0x10,0x08,
+	0x05,0xff,0xe8,0xb7,0x8b,0x00,0x05,0xff,0xe8,0xb6,0xbc,0x00,0xd1,0x11,0x10,0x08,
+	0x05,0xff,0xe8,0xb7,0xb0,0x00,0x05,0xff,0xf0,0xa0,0xa3,0x9e,0x00,0x10,0x08,0x05,
+	0xff,0xe8,0xbb,0x94,0x00,0x05,0xff,0xe8,0xbc,0xb8,0x00,0xd4,0x84,0xd3,0x43,0xd2,
+	0x22,0xd1,0x12,0x10,0x09,0x05,0xff,0xf0,0xa8,0x97,0x92,0x00,0x05,0xff,0xf0,0xa8,
+	0x97,0xad,0x00,0x10,0x08,0x05,0xff,0xe9,0x82,0x94,0x00,0x05,0xff,0xe9,0x83,0xb1,
+	0x00,0xd1,0x11,0x10,0x08,0x05,0xff,0xe9,0x84,0x91,0x00,0x05,0xff,0xf0,0xa8,0x9c,
+	0xae,0x00,0x10,0x08,0x05,0xff,0xe9,0x84,0x9b,0x00,0x05,0xff,0xe9,0x88,0xb8,0x00,
+	0xd2,0x20,0xd1,0x10,0x10,0x08,0x05,0xff,0xe9,0x8b,0x97,0x00,0x05,0xff,0xe9,0x8b,
+	0x98,0x00,0x10,0x08,0x05,0xff,0xe9,0x89,0xbc,0x00,0x05,0xff,0xe9,0x8f,0xb9,0x00,
+	0xd1,0x11,0x10,0x08,0x05,0xff,0xe9,0x90,0x95,0x00,0x05,0xff,0xf0,0xa8,0xaf,0xba,
+	0x00,0x10,0x08,0x05,0xff,0xe9,0x96,0x8b,0x00,0x05,0xff,0xe4,0xa6,0x95,0x00,0xd3,
+	0x43,0xd2,0x21,0xd1,0x11,0x10,0x08,0x05,0xff,0xe9,0x96,0xb7,0x00,0x05,0xff,0xf0,
+	0xa8,0xb5,0xb7,0x00,0x10,0x08,0x05,0xff,0xe4,0xa7,0xa6,0x00,0x05,0xff,0xe9,0x9b,
+	0x83,0x00,0xd1,0x10,0x10,0x08,0x05,0xff,0xe5,0xb6,0xb2,0x00,0x05,0xff,0xe9,0x9c,
+	0xa3,0x00,0x10,0x09,0x05,0xff,0xf0,0xa9,0x85,0x85,0x00,0x05,0xff,0xf0,0xa9,0x88,
+	0x9a,0x00,0xd2,0x21,0xd1,0x10,0x10,0x08,0x05,0xff,0xe4,0xa9,0xae,0x00,0x05,0xff,
+	0xe4,0xa9,0xb6,0x00,0x10,0x08,0x05,0xff,0xe9,0x9f,0xa0,0x00,0x05,0xff,0xf0,0xa9,
+	0x90,0x8a,0x00,0x91,0x11,0x10,0x08,0x05,0xff,0xe4,0xaa,0xb2,0x00,0x05,0xff,0xf0,
+	0xa9,0x92,0x96,0x00,0x05,0xff,0xe9,0xa0,0x8b,0x00,0xe2,0x10,0x01,0xe1,0x09,0x01,
+	0xe0,0x02,0x01,0xcf,0x86,0x95,0xfb,0xd4,0x82,0xd3,0x41,0xd2,0x21,0xd1,0x11,0x10,
+	0x08,0x05,0xff,0xe9,0xa0,0xa9,0x00,0x05,0xff,0xf0,0xa9,0x96,0xb6,0x00,0x10,0x08,
+	0x05,0xff,0xe9,0xa3,0xa2,0x00,0x05,0xff,0xe4,0xac,0xb3,0x00,0xd1,0x10,0x10,0x08,
+	0x05,0xff,0xe9,0xa4,0xa9,0x00,0x05,0xff,0xe9,0xa6,0xa7,0x00,0x10,0x08,0x05,0xff,
+	0xe9,0xa7,0x82,0x00,0x05,0xff,0xe9,0xa7,0xbe,0x00,0xd2,0x21,0xd1,0x11,0x10,0x08,
+	0x05,0xff,0xe4,0xaf,0x8e,0x00,0x05,0xff,0xf0,0xa9,0xac,0xb0,0x00,0x10,0x08,0x05,
+	0xff,0xe9,0xac,0x92,0x00,0x05,0xff,0xe9,0xb1,0x80,0x00,0xd1,0x10,0x10,0x08,0x05,
+	0xff,0xe9,0xb3,0xbd,0x00,0x05,0xff,0xe4,0xb3,0x8e,0x00,0x10,0x08,0x05,0xff,0xe4,
+	0xb3,0xad,0x00,0x05,0xff,0xe9,0xb5,0xa7,0x00,0xd3,0x44,0xd2,0x23,0xd1,0x11,0x10,
+	0x09,0x05,0xff,0xf0,0xaa,0x83,0x8e,0x00,0x05,0xff,0xe4,0xb3,0xb8,0x00,0x10,0x09,
+	0x05,0xff,0xf0,0xaa,0x84,0x85,0x00,0x05,0xff,0xf0,0xaa,0x88,0x8e,0x00,0xd1,0x11,
+	0x10,0x09,0x05,0xff,0xf0,0xaa,0x8a,0x91,0x00,0x05,0xff,0xe9,0xba,0xbb,0x00,0x10,
+	0x08,0x05,0xff,0xe4,0xb5,0x96,0x00,0x05,0xff,0xe9,0xbb,0xb9,0x00,0xd2,0x20,0xd1,
+	0x10,0x10,0x08,0x05,0xff,0xe9,0xbb,0xbe,0x00,0x05,0xff,0xe9,0xbc,0x85,0x00,0x10,
+	0x08,0x05,0xff,0xe9,0xbc,0x8f,0x00,0x05,0xff,0xe9,0xbc,0x96,0x00,0x91,0x11,0x10,
+	0x08,0x05,0xff,0xe9,0xbc,0xbb,0x00,0x05,0xff,0xf0,0xaa,0x98,0x80,0x00,0x00,0x00,
+	0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xcf,0x06,0x00,0x00,0xd3,0x06,
+	0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,0x06,0x00,0x00,
+	0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x00,0x00,
+	0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,0x00,0xd3,0x08,
+	0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd1,0x08,
+	0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xcf,0x86,
+	0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,0x00,0x00,0xd3,0x06,0xcf,0x06,
+	0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,0x06,0x00,0x00,0xd0,0x06,
+	0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x00,0x00,0x53,0x04,
+	0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,0x00,0xcf,0x86,0xd5,0xc0,
+	0xd4,0x60,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,0x86,0xcf,0x06,
+	0x00,0x00,0xd1,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,0x86,0xcf,0x06,
+	0x00,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,0x00,0x00,
+	0xd3,0x06,0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,0x06,
+	0x00,0x00,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,
+	0x00,0x00,0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,0x00,
+	0xd3,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,
+	0xd1,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,
+	0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,0x00,0x00,0xd3,0x06,
+	0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,0x06,0x00,0x00,
+	0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x00,0x00,
+	0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,0x00,0xd4,0x60,
+	0xd3,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,
+	0xd1,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,
+	0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,0x00,0x00,0xd3,0x06,
+	0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,0x06,0x00,0x00,
+	0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x00,0x00,
+	0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,0x00,0xd3,0x08,
+	0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd1,0x08,
+	0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xcf,0x86,
+	0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,0x00,0x00,0xd3,0x06,0xcf,0x06,
+	0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,0x06,0x00,0x00,0xd0,0x06,
+	0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x00,0x00,0x53,0x04,
+	0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,0x00,0xe0,0x83,0x01,0xcf,
+	0x86,0xd5,0xc0,0xd4,0x60,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,
+	0x86,0xcf,0x06,0x00,0x00,0xd1,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,
+	0x86,0xcf,0x06,0x00,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,
+	0x06,0x00,0x00,0xd3,0x06,0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,
+	0x06,0xcf,0x06,0x00,0x00,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,
+	0x00,0x54,0x04,0x00,0x00,0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,
+	0x00,0x02,0x00,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,0x86,0xcf,
+	0x06,0x00,0x00,0xd1,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,0x86,0xcf,
+	0x06,0x00,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,0x00,
+	0x00,0xd3,0x06,0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,
+	0x06,0x00,0x00,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,
+	0x04,0x00,0x00,0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,
+	0x00,0xd4,0x60,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,0x86,0xcf,
+	0x06,0x00,0x00,0xd1,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,0x86,0xcf,
+	0x06,0x00,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,0x00,
+	0x00,0xd3,0x06,0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,
+	0x06,0x00,0x00,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,
+	0x04,0x00,0x00,0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,
+	0x00,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,0x86,0xcf,0x06,0x00,
+	0x00,0xd1,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,0x86,0xcf,0x06,0x00,
+	0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,0x00,0x00,0xd3,
+	0x06,0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,0x06,0x00,
+	0x00,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x00,
+	0x00,0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,0x00,0xcf,
+	0x86,0xd5,0xc0,0xd4,0x60,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,
+	0x86,0xcf,0x06,0x00,0x00,0xd1,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,
+	0x86,0xcf,0x06,0x00,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,
+	0x06,0x00,0x00,0xd3,0x06,0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,
+	0x06,0xcf,0x06,0x00,0x00,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,
+	0x00,0x54,0x04,0x00,0x00,0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,
+	0x00,0x02,0x00,0xd3,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,0x86,0xcf,
+	0x06,0x00,0x00,0xd1,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,0x86,0xcf,
+	0x06,0x00,0x00,0xcf,0x86,0xd5,0x06,0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,0x00,
+	0x00,0xd3,0x06,0xcf,0x06,0x00,0x00,0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,
+	0x06,0x00,0x00,0xd0,0x06,0xcf,0x06,0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,
+	0x04,0x00,0x00,0x53,0x04,0x00,0x00,0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,
+	0x00,0xd4,0xd9,0xd3,0x81,0xd2,0x79,0xd1,0x71,0xd0,0x69,0xcf,0x86,0xd5,0x60,0xd4,
+	0x59,0xd3,0x52,0xd2,0x33,0xd1,0x2c,0xd0,0x25,0xcf,0x86,0x95,0x1e,0x94,0x19,0x93,
+	0x14,0x92,0x0f,0x91,0x0a,0x10,0x05,0x00,0xff,0x00,0x05,0xff,0x00,0x00,0xff,0x00,
+	0x00,0xff,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x05,0xff,0x00,0xcf,0x06,0x05,0xff,
+	0x00,0xcf,0x06,0x00,0xff,0x00,0xd1,0x07,0xcf,0x06,0x07,0xff,0x00,0xd0,0x07,0xcf,
+	0x06,0x07,0xff,0x00,0xcf,0x86,0x55,0x05,0x07,0xff,0x00,0x14,0x05,0x07,0xff,0x00,
+	0x00,0xff,0x00,0xcf,0x06,0x00,0xff,0x00,0xcf,0x06,0x00,0xff,0x00,0xcf,0x06,0x00,
+	0xff,0x00,0xcf,0x86,0xcf,0x06,0x00,0x00,0xcf,0x86,0xcf,0x06,0x00,0x00,0xcf,0x86,
+	0xcf,0x06,0x00,0x00,0xd2,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xd1,0x08,0xcf,0x86,
+	0xcf,0x06,0x00,0x00,0xd0,0x08,0xcf,0x86,0xcf,0x06,0x00,0x00,0xcf,0x86,0xd5,0x06,
+	0xcf,0x06,0x00,0x00,0xd4,0x06,0xcf,0x06,0x00,0x00,0xd3,0x06,0xcf,0x06,0x00,0x00,
+	0xd2,0x06,0xcf,0x06,0x00,0x00,0xd1,0x06,0xcf,0x06,0x00,0x00,0xd0,0x06,0xcf,0x06,
+	0x00,0x00,0xcf,0x86,0x55,0x04,0x00,0x00,0x54,0x04,0x00,0x00,0x53,0x04,0x00,0x00,
+	0x52,0x04,0x00,0x00,0x11,0x04,0x00,0x00,0x02,0x00,0xcf,0x86,0xcf,0x06,0x02,0x00,
+	0x81,0x80,0xcf,0x86,0x85,0x84,0xcf,0x86,0xcf,0x06,0x02,0x00,0x00,0x00,0x00,0x00
+};
diff --git a/fs/unicode/utf8n.h b/fs/unicode/utf8n.h
new file mode 100644
index 0000000..a120638
--- /dev/null
+++ b/fs/unicode/utf8n.h
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2014 SGI.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would 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.
+ *
+ */
+
+#ifndef UTF8NORM_H
+#define UTF8NORM_H
+
+#include <linux/types.h>
+#include <linux/export.h>
+#include <linux/string.h>
+#include <linux/module.h>
+
+/* Encoding a unicode version number as a single unsigned int. */
+#define UNICODE_MAJ_SHIFT		(16)
+#define UNICODE_MIN_SHIFT		(8)
+
+#define UNICODE_AGE(MAJ, MIN, REV)			\
+	(((unsigned int)(MAJ) << UNICODE_MAJ_SHIFT) |	\
+	 ((unsigned int)(MIN) << UNICODE_MIN_SHIFT) |	\
+	 ((unsigned int)(REV)))
+
+/* Highest unicode version supported by the data tables. */
+extern int utf8version_is_supported(u8 maj, u8 min, u8 rev);
+extern int utf8version_latest(void);
+
+/*
+ * Look for the correct const struct utf8data for a unicode version.
+ * Returns NULL if the version requested is too new.
+ *
+ * Two normalization forms are supported: nfdi and nfdicf.
+ *
+ * nfdi:
+ *  - Apply unicode normalization form NFD.
+ *  - Remove any Default_Ignorable_Code_Point.
+ *
+ * nfdicf:
+ *  - Apply unicode normalization form NFD.
+ *  - Remove any Default_Ignorable_Code_Point.
+ *  - Apply a full casefold (C + F).
+ */
+extern const struct utf8data *utf8nfdi(unsigned int maxage);
+extern const struct utf8data *utf8nfdicf(unsigned int maxage);
+
+/*
+ * Determine the maximum age of any unicode character in the string.
+ * Returns 0 if only unassigned code points are present.
+ * Returns -1 if the input is not valid UTF-8.
+ */
+extern int utf8agemax(const struct utf8data *data, const char *s);
+extern int utf8nagemax(const struct utf8data *data, const char *s, size_t len);
+
+/*
+ * Determine the minimum age of any unicode character in the string.
+ * Returns 0 if any unassigned code points are present.
+ * Returns -1 if the input is not valid UTF-8.
+ */
+extern int utf8agemin(const struct utf8data *data, const char *s);
+extern int utf8nagemin(const struct utf8data *data, const char *s, size_t len);
+
+/*
+ * Determine the length of the normalized from of the string,
+ * excluding any terminating NULL byte.
+ * Returns 0 if only ignorable code points are present.
+ * Returns -1 if the input is not valid UTF-8.
+ */
+extern ssize_t utf8len(const struct utf8data *data, const char *s);
+extern ssize_t utf8nlen(const struct utf8data *data, const char *s, size_t len);
+
+/* Needed in struct utf8cursor below. */
+#define UTF8HANGULLEAF	(12)
+
+/*
+ * Cursor structure used by the normalizer.
+ */
+struct utf8cursor {
+	const struct utf8data	*data;
+	const char	*s;
+	const char	*p;
+	const char	*ss;
+	const char	*sp;
+	unsigned int	len;
+	unsigned int	slen;
+	short int	ccc;
+	short int	nccc;
+	unsigned char	hangul[UTF8HANGULLEAF];
+};
+
+/*
+ * Initialize a utf8cursor to normalize a string.
+ * Returns 0 on success.
+ * Returns -1 on failure.
+ */
+extern int utf8cursor(struct utf8cursor *u8c, const struct utf8data *data,
+		      const char *s);
+extern int utf8ncursor(struct utf8cursor *u8c, const struct utf8data *data,
+		       const char *s, size_t len);
+
+/*
+ * Get the next byte in the normalization.
+ * Returns a value > 0 && < 256 on success.
+ * Returns 0 when the end of the normalization is reached.
+ * Returns -1 if the string being normalized is not valid UTF-8.
+ */
+extern int utf8byte(struct utf8cursor *u8c);
+
+#endif /* UTF8NORM_H */
diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c
index 9c2955f..c928756 100644
--- a/fs/userfaultfd.c
+++ b/fs/userfaultfd.c
@@ -913,7 +913,8 @@
 					 new_flags, vma->anon_vma,
 					 vma->vm_file, vma->vm_pgoff,
 					 vma_policy(vma),
-					 NULL_VM_UFFD_CTX);
+					 NULL_VM_UFFD_CTX,
+					 vma_get_anon_name(vma));
 			if (prev)
 				vma = prev;
 			else
@@ -1273,21 +1274,23 @@
 }
 
 static __always_inline int validate_range(struct mm_struct *mm,
-					  __u64 start, __u64 len)
+					  __u64 *start, __u64 len)
 {
 	__u64 task_size = mm->task_size;
 
-	if (start & ~PAGE_MASK)
+	*start = untagged_addr(*start);
+
+	if (*start & ~PAGE_MASK)
 		return -EINVAL;
 	if (len & ~PAGE_MASK)
 		return -EINVAL;
 	if (!len)
 		return -EINVAL;
-	if (start < mmap_min_addr)
+	if (*start < mmap_min_addr)
 		return -EINVAL;
-	if (start >= task_size)
+	if (*start >= task_size)
 		return -EINVAL;
-	if (len > task_size - start)
+	if (len > task_size - *start)
 		return -EINVAL;
 	return 0;
 }
@@ -1337,7 +1340,7 @@
 		goto out;
 	}
 
-	ret = validate_range(mm, uffdio_register.range.start,
+	ret = validate_range(mm, &uffdio_register.range.start,
 			     uffdio_register.range.len);
 	if (ret)
 		goto out;
@@ -1463,7 +1466,8 @@
 		prev = vma_merge(mm, prev, start, vma_end, new_flags,
 				 vma->anon_vma, vma->vm_file, vma->vm_pgoff,
 				 vma_policy(vma),
-				 ((struct vm_userfaultfd_ctx){ ctx }));
+				 ((struct vm_userfaultfd_ctx){ ctx }),
+				 vma_get_anon_name(vma));
 		if (prev) {
 			vma = prev;
 			goto next;
@@ -1526,7 +1530,7 @@
 	if (copy_from_user(&uffdio_unregister, buf, sizeof(uffdio_unregister)))
 		goto out;
 
-	ret = validate_range(mm, uffdio_unregister.start,
+	ret = validate_range(mm, &uffdio_unregister.start,
 			     uffdio_unregister.len);
 	if (ret)
 		goto out;
@@ -1625,7 +1629,8 @@
 		prev = vma_merge(mm, prev, start, vma_end, new_flags,
 				 vma->anon_vma, vma->vm_file, vma->vm_pgoff,
 				 vma_policy(vma),
-				 NULL_VM_UFFD_CTX);
+				 NULL_VM_UFFD_CTX,
+				 vma_get_anon_name(vma));
 		if (prev) {
 			vma = prev;
 			goto next;
@@ -1677,7 +1682,7 @@
 	if (copy_from_user(&uffdio_wake, buf, sizeof(uffdio_wake)))
 		goto out;
 
-	ret = validate_range(ctx->mm, uffdio_wake.start, uffdio_wake.len);
+	ret = validate_range(ctx->mm, &uffdio_wake.start, uffdio_wake.len);
 	if (ret)
 		goto out;
 
@@ -1717,7 +1722,7 @@
 			   sizeof(uffdio_copy)-sizeof(__s64)))
 		goto out;
 
-	ret = validate_range(ctx->mm, uffdio_copy.dst, uffdio_copy.len);
+	ret = validate_range(ctx->mm, &uffdio_copy.dst, uffdio_copy.len);
 	if (ret)
 		goto out;
 	/*
@@ -1773,7 +1778,7 @@
 			   sizeof(uffdio_zeropage)-sizeof(__s64)))
 		goto out;
 
-	ret = validate_range(ctx->mm, uffdio_zeropage.range.start,
+	ret = validate_range(ctx->mm, &uffdio_zeropage.range.start,
 			     uffdio_zeropage.range.len);
 	if (ret)
 		goto out;
diff --git a/fs/utimes.c b/fs/utimes.c
index 69d4b6b..1039ef7 100644
--- a/fs/utimes.c
+++ b/fs/utimes.c
@@ -88,7 +88,7 @@
 	}
 retry_deleg:
 	inode_lock(inode);
-	error = notify_change(path->dentry, &newattrs, &delegated_inode);
+	error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode);
 	inode_unlock(inode);
 	if (delegated_inode) {
 		error = break_deleg_wait(&delegated_inode);
diff --git a/fs/verity/Kconfig b/fs/verity/Kconfig
new file mode 100644
index 0000000..88fb251
--- /dev/null
+++ b/fs/verity/Kconfig
@@ -0,0 +1,55 @@
+# SPDX-License-Identifier: GPL-2.0
+
+config FS_VERITY
+	bool "FS Verity (read-only file-based authenticity protection)"
+	select CRYPTO
+	# SHA-256 is selected as it's intended to be the default hash algorithm.
+	# To avoid bloat, other wanted algorithms must be selected explicitly.
+	select CRYPTO_SHA256
+	help
+	  This option enables fs-verity.  fs-verity is the dm-verity
+	  mechanism implemented at the file level.  On supported
+	  filesystems (currently EXT4 and F2FS), userspace can use an
+	  ioctl to enable verity for a file, which causes the filesystem
+	  to build a Merkle tree for the file.  The filesystem will then
+	  transparently verify any data read from the file against the
+	  Merkle tree.  The file is also made read-only.
+
+	  This serves as an integrity check, but the availability of the
+	  Merkle tree root hash also allows efficiently supporting
+	  various use cases where normally the whole file would need to
+	  be hashed at once, such as: (a) auditing (logging the file's
+	  hash), or (b) authenticity verification (comparing the hash
+	  against a known good value, e.g. from a digital signature).
+
+	  fs-verity is especially useful on large files where not all
+	  the contents may actually be needed.  Also, fs-verity verifies
+	  data each time it is paged back in, which provides better
+	  protection against malicious disks vs. an ahead-of-time hash.
+
+	  If unsure, say N.
+
+config FS_VERITY_DEBUG
+	bool "FS Verity debugging"
+	depends on FS_VERITY
+	help
+	  Enable debugging messages related to fs-verity by default.
+
+	  Say N unless you are an fs-verity developer.
+
+config FS_VERITY_BUILTIN_SIGNATURES
+	bool "FS Verity builtin signature support"
+	depends on FS_VERITY
+	select SYSTEM_DATA_VERIFICATION
+	help
+	  Support verifying signatures of verity files against the X.509
+	  certificates that have been loaded into the ".fs-verity"
+	  kernel keyring.
+
+	  This is meant as a relatively simple mechanism that can be
+	  used to provide an authenticity guarantee for verity files, as
+	  an alternative to IMA appraisal.  Userspace programs still
+	  need to check that the verity bit is set in order to get an
+	  authenticity guarantee.
+
+	  If unsure, say N.
diff --git a/fs/verity/Makefile b/fs/verity/Makefile
new file mode 100644
index 0000000..570e913
--- /dev/null
+++ b/fs/verity/Makefile
@@ -0,0 +1,10 @@
+# SPDX-License-Identifier: GPL-2.0
+
+obj-$(CONFIG_FS_VERITY) += enable.o \
+			   hash_algs.o \
+			   init.o \
+			   measure.o \
+			   open.o \
+			   verify.o
+
+obj-$(CONFIG_FS_VERITY_BUILTIN_SIGNATURES) += signature.o
diff --git a/fs/verity/enable.c b/fs/verity/enable.c
new file mode 100644
index 0000000..eabc6ac
--- /dev/null
+++ b/fs/verity/enable.c
@@ -0,0 +1,377 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * fs/verity/enable.c: ioctl to enable verity on a file
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include "fsverity_private.h"
+
+#include <crypto/hash.h>
+#include <linux/mount.h>
+#include <linux/pagemap.h>
+#include <linux/sched/signal.h>
+#include <linux/uaccess.h>
+
+static int build_merkle_tree_level(struct inode *inode, unsigned int level,
+				   u64 num_blocks_to_hash,
+				   const struct merkle_tree_params *params,
+				   u8 *pending_hashes,
+				   struct ahash_request *req)
+{
+	const struct fsverity_operations *vops = inode->i_sb->s_vop;
+	unsigned int pending_size = 0;
+	u64 dst_block_num;
+	u64 i;
+	int err;
+
+	if (WARN_ON(params->block_size != PAGE_SIZE)) /* checked earlier too */
+		return -EINVAL;
+
+	if (level < params->num_levels) {
+		dst_block_num = params->level_start[level];
+	} else {
+		if (WARN_ON(num_blocks_to_hash != 1))
+			return -EINVAL;
+		dst_block_num = 0; /* unused */
+	}
+
+	for (i = 0; i < num_blocks_to_hash; i++) {
+		struct page *src_page;
+
+		if ((pgoff_t)i % 10000 == 0 || i + 1 == num_blocks_to_hash)
+			pr_debug("Hashing block %llu of %llu for level %u\n",
+				 i + 1, num_blocks_to_hash, level);
+
+		if (level == 0) {
+			/* Leaf: hashing a data block */
+			src_page = read_mapping_page(inode->i_mapping, i, NULL);
+			if (IS_ERR(src_page)) {
+				err = PTR_ERR(src_page);
+				fsverity_err(inode,
+					     "Error %d reading data page %llu",
+					     err, i);
+				return err;
+			}
+		} else {
+			/* Non-leaf: hashing hash block from level below */
+			src_page = vops->read_merkle_tree_page(inode,
+					params->level_start[level - 1] + i);
+			if (IS_ERR(src_page)) {
+				err = PTR_ERR(src_page);
+				fsverity_err(inode,
+					     "Error %d reading Merkle tree page %llu",
+					     err, params->level_start[level - 1] + i);
+				return err;
+			}
+		}
+
+		err = fsverity_hash_page(params, inode, req, src_page,
+					 &pending_hashes[pending_size]);
+		put_page(src_page);
+		if (err)
+			return err;
+		pending_size += params->digest_size;
+
+		if (level == params->num_levels) /* Root hash? */
+			return 0;
+
+		if (pending_size + params->digest_size > params->block_size ||
+		    i + 1 == num_blocks_to_hash) {
+			/* Flush the pending hash block */
+			memset(&pending_hashes[pending_size], 0,
+			       params->block_size - pending_size);
+			err = vops->write_merkle_tree_block(inode,
+					pending_hashes,
+					dst_block_num,
+					params->log_blocksize);
+			if (err) {
+				fsverity_err(inode,
+					     "Error %d writing Merkle tree block %llu",
+					     err, dst_block_num);
+				return err;
+			}
+			dst_block_num++;
+			pending_size = 0;
+		}
+
+		if (fatal_signal_pending(current))
+			return -EINTR;
+		cond_resched();
+	}
+	return 0;
+}
+
+/*
+ * Build the Merkle tree for the given inode using the given parameters, and
+ * return the root hash in @root_hash.
+ *
+ * The tree is written to a filesystem-specific location as determined by the
+ * ->write_merkle_tree_block() method.  However, the blocks that comprise the
+ * tree are the same for all filesystems.
+ */
+static int build_merkle_tree(struct inode *inode,
+			     const struct merkle_tree_params *params,
+			     u8 *root_hash)
+{
+	u8 *pending_hashes;
+	struct ahash_request *req;
+	u64 blocks;
+	unsigned int level;
+	int err = -ENOMEM;
+
+	if (inode->i_size == 0) {
+		/* Empty file is a special case; root hash is all 0's */
+		memset(root_hash, 0, params->digest_size);
+		return 0;
+	}
+
+	pending_hashes = kmalloc(params->block_size, GFP_KERNEL);
+	req = ahash_request_alloc(params->hash_alg->tfm, GFP_KERNEL);
+	if (!pending_hashes || !req)
+		goto out;
+
+	/*
+	 * Build each level of the Merkle tree, starting at the leaf level
+	 * (level 0) and ascending to the root node (level 'num_levels - 1').
+	 * Then at the end (level 'num_levels'), calculate the root hash.
+	 */
+	blocks = (inode->i_size + params->block_size - 1) >>
+		 params->log_blocksize;
+	for (level = 0; level <= params->num_levels; level++) {
+		err = build_merkle_tree_level(inode, level, blocks, params,
+					      pending_hashes, req);
+		if (err)
+			goto out;
+		blocks = (blocks + params->hashes_per_block - 1) >>
+			 params->log_arity;
+	}
+	memcpy(root_hash, pending_hashes, params->digest_size);
+	err = 0;
+out:
+	kfree(pending_hashes);
+	ahash_request_free(req);
+	return err;
+}
+
+static int enable_verity(struct file *filp,
+			 const struct fsverity_enable_arg *arg)
+{
+	struct inode *inode = file_inode(filp);
+	const struct fsverity_operations *vops = inode->i_sb->s_vop;
+	struct merkle_tree_params params = { };
+	struct fsverity_descriptor *desc;
+	size_t desc_size = sizeof(*desc) + arg->sig_size;
+	struct fsverity_info *vi;
+	int err;
+
+	/* Start initializing the fsverity_descriptor */
+	desc = kzalloc(desc_size, GFP_KERNEL);
+	if (!desc)
+		return -ENOMEM;
+	desc->version = 1;
+	desc->hash_algorithm = arg->hash_algorithm;
+	desc->log_blocksize = ilog2(arg->block_size);
+
+	/* Get the salt if the user provided one */
+	if (arg->salt_size &&
+	    copy_from_user(desc->salt,
+			   (const u8 __user *)(uintptr_t)arg->salt_ptr,
+			   arg->salt_size)) {
+		err = -EFAULT;
+		goto out;
+	}
+	desc->salt_size = arg->salt_size;
+
+	/* Get the signature if the user provided one */
+	if (arg->sig_size &&
+	    copy_from_user(desc->signature,
+			   (const u8 __user *)(uintptr_t)arg->sig_ptr,
+			   arg->sig_size)) {
+		err = -EFAULT;
+		goto out;
+	}
+	desc->sig_size = cpu_to_le32(arg->sig_size);
+
+	desc->data_size = cpu_to_le64(inode->i_size);
+
+	/* Prepare the Merkle tree parameters */
+	err = fsverity_init_merkle_tree_params(&params, inode,
+					       arg->hash_algorithm,
+					       desc->log_blocksize,
+					       desc->salt, desc->salt_size);
+	if (err)
+		goto out;
+
+	/*
+	 * Start enabling verity on this file, serialized by the inode lock.
+	 * Fail if verity is already enabled or is already being enabled.
+	 */
+	inode_lock(inode);
+	if (IS_VERITY(inode))
+		err = -EEXIST;
+	else
+		err = vops->begin_enable_verity(filp);
+	inode_unlock(inode);
+	if (err)
+		goto out;
+
+	/*
+	 * Build the Merkle tree.  Don't hold the inode lock during this, since
+	 * on huge files this may take a very long time and we don't want to
+	 * force unrelated syscalls like chown() to block forever.  We don't
+	 * need the inode lock here because deny_write_access() already prevents
+	 * the file from being written to or truncated, and we still serialize
+	 * ->begin_enable_verity() and ->end_enable_verity() using the inode
+	 * lock and only allow one process to be here at a time on a given file.
+	 */
+	pr_debug("Building Merkle tree...\n");
+	BUILD_BUG_ON(sizeof(desc->root_hash) < FS_VERITY_MAX_DIGEST_SIZE);
+	err = build_merkle_tree(inode, &params, desc->root_hash);
+	if (err) {
+		fsverity_err(inode, "Error %d building Merkle tree", err);
+		goto rollback;
+	}
+	pr_debug("Done building Merkle tree.  Root hash is %s:%*phN\n",
+		 params.hash_alg->name, params.digest_size, desc->root_hash);
+
+	/*
+	 * Create the fsverity_info.  Don't bother trying to save work by
+	 * reusing the merkle_tree_params from above.  Instead, just create the
+	 * fsverity_info from the fsverity_descriptor as if it were just loaded
+	 * from disk.  This is simpler, and it serves as an extra check that the
+	 * metadata we're writing is valid before actually enabling verity.
+	 */
+	vi = fsverity_create_info(inode, desc, desc_size);
+	if (IS_ERR(vi)) {
+		err = PTR_ERR(vi);
+		goto rollback;
+	}
+
+	if (arg->sig_size)
+		pr_debug("Storing a %u-byte PKCS#7 signature alongside the file\n",
+			 arg->sig_size);
+
+	/*
+	 * Tell the filesystem to finish enabling verity on the file.
+	 * Serialized with ->begin_enable_verity() by the inode lock.
+	 */
+	inode_lock(inode);
+	err = vops->end_enable_verity(filp, desc, desc_size, params.tree_size);
+	inode_unlock(inode);
+	if (err) {
+		fsverity_err(inode, "%ps() failed with err %d",
+			     vops->end_enable_verity, err);
+		fsverity_free_info(vi);
+	} else if (WARN_ON(!IS_VERITY(inode))) {
+		err = -EINVAL;
+		fsverity_free_info(vi);
+	} else {
+		/* Successfully enabled verity */
+
+		/*
+		 * Readers can start using ->i_verity_info immediately, so it
+		 * can't be rolled back once set.  So don't set it until just
+		 * after the filesystem has successfully enabled verity.
+		 */
+		fsverity_set_info(inode, vi);
+	}
+out:
+	kfree(params.hashstate);
+	kfree(desc);
+	return err;
+
+rollback:
+	inode_lock(inode);
+	(void)vops->end_enable_verity(filp, NULL, 0, params.tree_size);
+	inode_unlock(inode);
+	goto out;
+}
+
+/**
+ * fsverity_ioctl_enable() - enable verity on a file
+ *
+ * Enable fs-verity on a file.  See the "FS_IOC_ENABLE_VERITY" section of
+ * Documentation/filesystems/fsverity.rst for the documentation.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+int fsverity_ioctl_enable(struct file *filp, const void __user *uarg)
+{
+	struct inode *inode = file_inode(filp);
+	struct fsverity_enable_arg arg;
+	int err;
+
+	if (copy_from_user(&arg, uarg, sizeof(arg)))
+		return -EFAULT;
+
+	if (arg.version != 1)
+		return -EINVAL;
+
+	if (arg.__reserved1 ||
+	    memchr_inv(arg.__reserved2, 0, sizeof(arg.__reserved2)))
+		return -EINVAL;
+
+	if (arg.block_size != PAGE_SIZE)
+		return -EINVAL;
+
+	if (arg.salt_size > FIELD_SIZEOF(struct fsverity_descriptor, salt))
+		return -EMSGSIZE;
+
+	if (arg.sig_size > FS_VERITY_MAX_SIGNATURE_SIZE)
+		return -EMSGSIZE;
+
+	/*
+	 * Require a regular file with write access.  But the actual fd must
+	 * still be readonly so that we can lock out all writers.  This is
+	 * needed to guarantee that no writable fds exist to the file once it
+	 * has verity enabled, and to stabilize the data being hashed.
+	 */
+
+	err = inode_permission(inode, MAY_WRITE);
+	if (err)
+		return err;
+
+	if (IS_APPEND(inode))
+		return -EPERM;
+
+	if (S_ISDIR(inode->i_mode))
+		return -EISDIR;
+
+	if (!S_ISREG(inode->i_mode))
+		return -EINVAL;
+
+	err = mnt_want_write_file(filp);
+	if (err) /* -EROFS */
+		return err;
+
+	err = deny_write_access(filp);
+	if (err) /* -ETXTBSY */
+		goto out_drop_write;
+
+	err = enable_verity(filp, &arg);
+	if (err)
+		goto out_allow_write_access;
+
+	/*
+	 * Some pages of the file may have been evicted from pagecache after
+	 * being used in the Merkle tree construction, then read into pagecache
+	 * again by another process reading from the file concurrently.  Since
+	 * these pages didn't undergo verification against the file measurement
+	 * which fs-verity now claims to be enforcing, we have to wipe the
+	 * pagecache to ensure that all future reads are verified.
+	 */
+	filemap_write_and_wait(inode->i_mapping);
+	invalidate_inode_pages2(inode->i_mapping);
+
+	/*
+	 * allow_write_access() is needed to pair with deny_write_access().
+	 * Regardless, the filesystem won't allow writing to verity files.
+	 */
+out_allow_write_access:
+	allow_write_access(filp);
+out_drop_write:
+	mnt_drop_write_file(filp);
+	return err;
+}
+EXPORT_SYMBOL_GPL(fsverity_ioctl_enable);
diff --git a/fs/verity/fsverity_private.h b/fs/verity/fsverity_private.h
new file mode 100644
index 0000000..e74c79b
--- /dev/null
+++ b/fs/verity/fsverity_private.h
@@ -0,0 +1,185 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * fs-verity: read-only file-based authenticity protection
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#ifndef _FSVERITY_PRIVATE_H
+#define _FSVERITY_PRIVATE_H
+
+#ifdef CONFIG_FS_VERITY_DEBUG
+#define DEBUG
+#endif
+
+#define pr_fmt(fmt) "fs-verity: " fmt
+
+#include <crypto/sha.h>
+#include <linux/fsverity.h>
+
+struct ahash_request;
+
+/*
+ * Implementation limit: maximum depth of the Merkle tree.  For now 8 is plenty;
+ * it's enough for over U64_MAX bytes of data using SHA-256 and 4K blocks.
+ */
+#define FS_VERITY_MAX_LEVELS		8
+
+/*
+ * Largest digest size among all hash algorithms supported by fs-verity.
+ * Currently assumed to be <= size of fsverity_descriptor::root_hash.
+ */
+#define FS_VERITY_MAX_DIGEST_SIZE	SHA512_DIGEST_SIZE
+
+/* A hash algorithm supported by fs-verity */
+struct fsverity_hash_alg {
+	struct crypto_ahash *tfm; /* hash tfm, allocated on demand */
+	const char *name;	  /* crypto API name, e.g. sha256 */
+	unsigned int digest_size; /* digest size in bytes, e.g. 32 for SHA-256 */
+	unsigned int block_size;  /* block size in bytes, e.g. 64 for SHA-256 */
+};
+
+/* Merkle tree parameters: hash algorithm, initial hash state, and topology */
+struct merkle_tree_params {
+	const struct fsverity_hash_alg *hash_alg; /* the hash algorithm */
+	const u8 *hashstate;		/* initial hash state or NULL */
+	unsigned int digest_size;	/* same as hash_alg->digest_size */
+	unsigned int block_size;	/* size of data and tree blocks */
+	unsigned int hashes_per_block;	/* number of hashes per tree block */
+	unsigned int log_blocksize;	/* log2(block_size) */
+	unsigned int log_arity;		/* log2(hashes_per_block) */
+	unsigned int num_levels;	/* number of levels in Merkle tree */
+	u64 tree_size;			/* Merkle tree size in bytes */
+
+	/*
+	 * Starting block index for each tree level, ordered from leaf level (0)
+	 * to root level ('num_levels - 1')
+	 */
+	u64 level_start[FS_VERITY_MAX_LEVELS];
+};
+
+/**
+ * fsverity_info - cached verity metadata for an inode
+ *
+ * When a verity file is first opened, an instance of this struct is allocated
+ * and stored in ->i_verity_info; it remains until the inode is evicted.  It
+ * caches information about the Merkle tree that's needed to efficiently verify
+ * data read from the file.  It also caches the file measurement.  The Merkle
+ * tree pages themselves are not cached here, but the filesystem may cache them.
+ */
+struct fsverity_info {
+	struct merkle_tree_params tree_params;
+	u8 root_hash[FS_VERITY_MAX_DIGEST_SIZE];
+	u8 measurement[FS_VERITY_MAX_DIGEST_SIZE];
+	const struct inode *inode;
+};
+
+/*
+ * Merkle tree properties.  The file measurement is the hash of this structure
+ * excluding the signature and with the sig_size field set to 0.
+ */
+struct fsverity_descriptor {
+	__u8 version;		/* must be 1 */
+	__u8 hash_algorithm;	/* Merkle tree hash algorithm */
+	__u8 log_blocksize;	/* log2 of size of data and tree blocks */
+	__u8 salt_size;		/* size of salt in bytes; 0 if none */
+	__le32 sig_size;	/* size of signature in bytes; 0 if none */
+	__le64 data_size;	/* size of file the Merkle tree is built over */
+	__u8 root_hash[64];	/* Merkle tree root hash */
+	__u8 salt[32];		/* salt prepended to each hashed block */
+	__u8 __reserved[144];	/* must be 0's */
+	__u8 signature[];	/* optional PKCS#7 signature */
+};
+
+/* Arbitrary limit to bound the kmalloc() size.  Can be changed. */
+#define FS_VERITY_MAX_DESCRIPTOR_SIZE	16384
+
+#define FS_VERITY_MAX_SIGNATURE_SIZE	(FS_VERITY_MAX_DESCRIPTOR_SIZE - \
+					 sizeof(struct fsverity_descriptor))
+
+/*
+ * Format in which verity file measurements are signed.  This is the same as
+ * 'struct fsverity_digest', except here some magic bytes are prepended to
+ * provide some context about what is being signed in case the same key is used
+ * for non-fsverity purposes, and here the fields have fixed endianness.
+ */
+struct fsverity_signed_digest {
+	char magic[8];			/* must be "FSVerity" */
+	__le16 digest_algorithm;
+	__le16 digest_size;
+	__u8 digest[];
+};
+
+/* hash_algs.c */
+
+extern struct fsverity_hash_alg fsverity_hash_algs[];
+
+const struct fsverity_hash_alg *fsverity_get_hash_alg(const struct inode *inode,
+						      unsigned int num);
+const u8 *fsverity_prepare_hash_state(const struct fsverity_hash_alg *alg,
+				      const u8 *salt, size_t salt_size);
+int fsverity_hash_page(const struct merkle_tree_params *params,
+		       const struct inode *inode,
+		       struct ahash_request *req, struct page *page, u8 *out);
+int fsverity_hash_buffer(const struct fsverity_hash_alg *alg,
+			 const void *data, size_t size, u8 *out);
+void __init fsverity_check_hash_algs(void);
+
+/* init.c */
+
+extern void __printf(3, 4) __cold
+fsverity_msg(const struct inode *inode, const char *level,
+	     const char *fmt, ...);
+
+#define fsverity_warn(inode, fmt, ...)		\
+	fsverity_msg((inode), KERN_WARNING, fmt, ##__VA_ARGS__)
+#define fsverity_err(inode, fmt, ...)		\
+	fsverity_msg((inode), KERN_ERR, fmt, ##__VA_ARGS__)
+
+/* open.c */
+
+int fsverity_init_merkle_tree_params(struct merkle_tree_params *params,
+				     const struct inode *inode,
+				     unsigned int hash_algorithm,
+				     unsigned int log_blocksize,
+				     const u8 *salt, size_t salt_size);
+
+struct fsverity_info *fsverity_create_info(const struct inode *inode,
+					   void *desc, size_t desc_size);
+
+void fsverity_set_info(struct inode *inode, struct fsverity_info *vi);
+
+void fsverity_free_info(struct fsverity_info *vi);
+
+int __init fsverity_init_info_cache(void);
+void __init fsverity_exit_info_cache(void);
+
+/* signature.c */
+
+#ifdef CONFIG_FS_VERITY_BUILTIN_SIGNATURES
+int fsverity_verify_signature(const struct fsverity_info *vi,
+			      const struct fsverity_descriptor *desc,
+			      size_t desc_size);
+
+int __init fsverity_init_signature(void);
+#else /* !CONFIG_FS_VERITY_BUILTIN_SIGNATURES */
+static inline int
+fsverity_verify_signature(const struct fsverity_info *vi,
+			  const struct fsverity_descriptor *desc,
+			  size_t desc_size)
+{
+	return 0;
+}
+
+static inline int fsverity_init_signature(void)
+{
+	return 0;
+}
+#endif /* !CONFIG_FS_VERITY_BUILTIN_SIGNATURES */
+
+/* verify.c */
+
+int __init fsverity_init_workqueue(void);
+void __init fsverity_exit_workqueue(void);
+
+#endif /* _FSVERITY_PRIVATE_H */
diff --git a/fs/verity/hash_algs.c b/fs/verity/hash_algs.c
new file mode 100644
index 0000000..31e6d7d
--- /dev/null
+++ b/fs/verity/hash_algs.c
@@ -0,0 +1,280 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * fs/verity/hash_algs.c: fs-verity hash algorithms
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include "fsverity_private.h"
+
+#include <crypto/hash.h>
+#include <linux/scatterlist.h>
+
+/* The hash algorithms supported by fs-verity */
+struct fsverity_hash_alg fsverity_hash_algs[] = {
+	[FS_VERITY_HASH_ALG_SHA256] = {
+		.name = "sha256",
+		.digest_size = SHA256_DIGEST_SIZE,
+		.block_size = SHA256_BLOCK_SIZE,
+	},
+	[FS_VERITY_HASH_ALG_SHA512] = {
+		.name = "sha512",
+		.digest_size = SHA512_DIGEST_SIZE,
+		.block_size = SHA512_BLOCK_SIZE,
+	},
+};
+
+/**
+ * fsverity_get_hash_alg() - validate and prepare a hash algorithm
+ * @inode: optional inode for logging purposes
+ * @num: the hash algorithm number
+ *
+ * Get the struct fsverity_hash_alg for the given hash algorithm number, and
+ * ensure it has a hash transform ready to go.  The hash transforms are
+ * allocated on-demand so that we don't waste resources unnecessarily, and
+ * because the crypto modules may be initialized later than fs/verity/.
+ *
+ * Return: pointer to the hash alg on success, else an ERR_PTR()
+ */
+const struct fsverity_hash_alg *fsverity_get_hash_alg(const struct inode *inode,
+						      unsigned int num)
+{
+	struct fsverity_hash_alg *alg;
+	struct crypto_ahash *tfm;
+	int err;
+
+	if (num >= ARRAY_SIZE(fsverity_hash_algs) ||
+	    !fsverity_hash_algs[num].name) {
+		fsverity_warn(inode, "Unknown hash algorithm number: %u", num);
+		return ERR_PTR(-EINVAL);
+	}
+	alg = &fsverity_hash_algs[num];
+
+	/* pairs with cmpxchg() below */
+	tfm = READ_ONCE(alg->tfm);
+	if (likely(tfm != NULL))
+		return alg;
+	/*
+	 * Using the shash API would make things a bit simpler, but the ahash
+	 * API is preferable as it allows the use of crypto accelerators.
+	 */
+	tfm = crypto_alloc_ahash(alg->name, 0, 0);
+	if (IS_ERR(tfm)) {
+		if (PTR_ERR(tfm) == -ENOENT) {
+			fsverity_warn(inode,
+				      "Missing crypto API support for hash algorithm \"%s\"",
+				      alg->name);
+			return ERR_PTR(-ENOPKG);
+		}
+		fsverity_err(inode,
+			     "Error allocating hash algorithm \"%s\": %ld",
+			     alg->name, PTR_ERR(tfm));
+		return ERR_CAST(tfm);
+	}
+
+	err = -EINVAL;
+	if (WARN_ON(alg->digest_size != crypto_ahash_digestsize(tfm)))
+		goto err_free_tfm;
+	if (WARN_ON(alg->block_size != crypto_ahash_blocksize(tfm)))
+		goto err_free_tfm;
+
+	pr_info("%s using implementation \"%s\"\n",
+		alg->name, crypto_ahash_driver_name(tfm));
+
+	/* pairs with READ_ONCE() above */
+	if (cmpxchg(&alg->tfm, NULL, tfm) != NULL)
+		crypto_free_ahash(tfm);
+
+	return alg;
+
+err_free_tfm:
+	crypto_free_ahash(tfm);
+	return ERR_PTR(err);
+}
+
+/**
+ * fsverity_prepare_hash_state() - precompute the initial hash state
+ * @alg: hash algorithm
+ * @salt: a salt which is to be prepended to all data to be hashed
+ * @salt_size: salt size in bytes, possibly 0
+ *
+ * Return: NULL if the salt is empty, otherwise the kmalloc()'ed precomputed
+ *	   initial hash state on success or an ERR_PTR() on failure.
+ */
+const u8 *fsverity_prepare_hash_state(const struct fsverity_hash_alg *alg,
+				      const u8 *salt, size_t salt_size)
+{
+	u8 *hashstate = NULL;
+	struct ahash_request *req = NULL;
+	u8 *padded_salt = NULL;
+	size_t padded_salt_size;
+	struct scatterlist sg;
+	DECLARE_CRYPTO_WAIT(wait);
+	int err;
+
+	if (salt_size == 0)
+		return NULL;
+
+	hashstate = kmalloc(crypto_ahash_statesize(alg->tfm), GFP_KERNEL);
+	if (!hashstate)
+		return ERR_PTR(-ENOMEM);
+
+	req = ahash_request_alloc(alg->tfm, GFP_KERNEL);
+	if (!req) {
+		err = -ENOMEM;
+		goto err_free;
+	}
+
+	/*
+	 * Zero-pad the salt to the next multiple of the input size of the hash
+	 * algorithm's compression function, e.g. 64 bytes for SHA-256 or 128
+	 * bytes for SHA-512.  This ensures that the hash algorithm won't have
+	 * any bytes buffered internally after processing the salt, thus making
+	 * salted hashing just as fast as unsalted hashing.
+	 */
+	padded_salt_size = round_up(salt_size, alg->block_size);
+	padded_salt = kzalloc(padded_salt_size, GFP_KERNEL);
+	if (!padded_salt) {
+		err = -ENOMEM;
+		goto err_free;
+	}
+	memcpy(padded_salt, salt, salt_size);
+
+	sg_init_one(&sg, padded_salt, padded_salt_size);
+	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP |
+					CRYPTO_TFM_REQ_MAY_BACKLOG,
+				   crypto_req_done, &wait);
+	ahash_request_set_crypt(req, &sg, NULL, padded_salt_size);
+
+	err = crypto_wait_req(crypto_ahash_init(req), &wait);
+	if (err)
+		goto err_free;
+
+	err = crypto_wait_req(crypto_ahash_update(req), &wait);
+	if (err)
+		goto err_free;
+
+	err = crypto_ahash_export(req, hashstate);
+	if (err)
+		goto err_free;
+out:
+	ahash_request_free(req);
+	kfree(padded_salt);
+	return hashstate;
+
+err_free:
+	kfree(hashstate);
+	hashstate = ERR_PTR(err);
+	goto out;
+}
+
+/**
+ * fsverity_hash_page() - hash a single data or hash page
+ * @params: the Merkle tree's parameters
+ * @inode: inode for which the hashing is being done
+ * @req: preallocated hash request
+ * @page: the page to hash
+ * @out: output digest, size 'params->digest_size' bytes
+ *
+ * Hash a single data or hash block, assuming block_size == PAGE_SIZE.
+ * The hash is salted if a salt is specified in the Merkle tree parameters.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+int fsverity_hash_page(const struct merkle_tree_params *params,
+		       const struct inode *inode,
+		       struct ahash_request *req, struct page *page, u8 *out)
+{
+	struct scatterlist sg;
+	DECLARE_CRYPTO_WAIT(wait);
+	int err;
+
+	if (WARN_ON(params->block_size != PAGE_SIZE))
+		return -EINVAL;
+
+	sg_init_table(&sg, 1);
+	sg_set_page(&sg, page, PAGE_SIZE, 0);
+	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP |
+					CRYPTO_TFM_REQ_MAY_BACKLOG,
+				   crypto_req_done, &wait);
+	ahash_request_set_crypt(req, &sg, out, PAGE_SIZE);
+
+	if (params->hashstate) {
+		err = crypto_ahash_import(req, params->hashstate);
+		if (err) {
+			fsverity_err(inode,
+				     "Error %d importing hash state", err);
+			return err;
+		}
+		err = crypto_ahash_finup(req);
+	} else {
+		err = crypto_ahash_digest(req);
+	}
+
+	err = crypto_wait_req(err, &wait);
+	if (err)
+		fsverity_err(inode, "Error %d computing page hash", err);
+	return err;
+}
+
+/**
+ * fsverity_hash_buffer() - hash some data
+ * @alg: the hash algorithm to use
+ * @data: the data to hash
+ * @size: size of data to hash, in bytes
+ * @out: output digest, size 'alg->digest_size' bytes
+ *
+ * Hash some data which is located in physically contiguous memory (i.e. memory
+ * allocated by kmalloc(), not by vmalloc()).  No salt is used.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+int fsverity_hash_buffer(const struct fsverity_hash_alg *alg,
+			 const void *data, size_t size, u8 *out)
+{
+	struct ahash_request *req;
+	struct scatterlist sg;
+	DECLARE_CRYPTO_WAIT(wait);
+	int err;
+
+	req = ahash_request_alloc(alg->tfm, GFP_KERNEL);
+	if (!req)
+		return -ENOMEM;
+
+	sg_init_one(&sg, data, size);
+	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP |
+					CRYPTO_TFM_REQ_MAY_BACKLOG,
+				   crypto_req_done, &wait);
+	ahash_request_set_crypt(req, &sg, out, size);
+
+	err = crypto_wait_req(crypto_ahash_digest(req), &wait);
+
+	ahash_request_free(req);
+	return err;
+}
+
+void __init fsverity_check_hash_algs(void)
+{
+	size_t i;
+
+	/*
+	 * Sanity check the hash algorithms (could be a build-time check, but
+	 * they're in an array)
+	 */
+	for (i = 0; i < ARRAY_SIZE(fsverity_hash_algs); i++) {
+		const struct fsverity_hash_alg *alg = &fsverity_hash_algs[i];
+
+		if (!alg->name)
+			continue;
+
+		BUG_ON(alg->digest_size > FS_VERITY_MAX_DIGEST_SIZE);
+
+		/*
+		 * For efficiency, the implementation currently assumes the
+		 * digest and block sizes are powers of 2.  This limitation can
+		 * be lifted if the code is updated to handle other values.
+		 */
+		BUG_ON(!is_power_of_2(alg->digest_size));
+		BUG_ON(!is_power_of_2(alg->block_size));
+	}
+}
diff --git a/fs/verity/init.c b/fs/verity/init.c
new file mode 100644
index 0000000..94c104e
--- /dev/null
+++ b/fs/verity/init.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * fs/verity/init.c: fs-verity module initialization and logging
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include "fsverity_private.h"
+
+#include <linux/ratelimit.h>
+
+void fsverity_msg(const struct inode *inode, const char *level,
+		  const char *fmt, ...)
+{
+	static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL,
+				      DEFAULT_RATELIMIT_BURST);
+	struct va_format vaf;
+	va_list args;
+
+	if (!__ratelimit(&rs))
+		return;
+
+	va_start(args, fmt);
+	vaf.fmt = fmt;
+	vaf.va = &args;
+	if (inode)
+		printk("%sfs-verity (%s, inode %lu): %pV\n",
+		       level, inode->i_sb->s_id, inode->i_ino, &vaf);
+	else
+		printk("%sfs-verity: %pV\n", level, &vaf);
+	va_end(args);
+}
+
+static int __init fsverity_init(void)
+{
+	int err;
+
+	fsverity_check_hash_algs();
+
+	err = fsverity_init_info_cache();
+	if (err)
+		return err;
+
+	err = fsverity_init_workqueue();
+	if (err)
+		goto err_exit_info_cache;
+
+	err = fsverity_init_signature();
+	if (err)
+		goto err_exit_workqueue;
+
+	pr_debug("Initialized fs-verity\n");
+	return 0;
+
+err_exit_workqueue:
+	fsverity_exit_workqueue();
+err_exit_info_cache:
+	fsverity_exit_info_cache();
+	return err;
+}
+late_initcall(fsverity_init)
diff --git a/fs/verity/measure.c b/fs/verity/measure.c
new file mode 100644
index 0000000..05049b6
--- /dev/null
+++ b/fs/verity/measure.c
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * fs/verity/measure.c: ioctl to get a verity file's measurement
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include "fsverity_private.h"
+
+#include <linux/uaccess.h>
+
+/**
+ * fsverity_ioctl_measure() - get a verity file's measurement
+ *
+ * Retrieve the file measurement that the kernel is enforcing for reads from a
+ * verity file.  See the "FS_IOC_MEASURE_VERITY" section of
+ * Documentation/filesystems/fsverity.rst for the documentation.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+int fsverity_ioctl_measure(struct file *filp, void __user *_uarg)
+{
+	const struct inode *inode = file_inode(filp);
+	struct fsverity_digest __user *uarg = _uarg;
+	const struct fsverity_info *vi;
+	const struct fsverity_hash_alg *hash_alg;
+	struct fsverity_digest arg;
+
+	vi = fsverity_get_info(inode);
+	if (!vi)
+		return -ENODATA; /* not a verity file */
+	hash_alg = vi->tree_params.hash_alg;
+
+	/*
+	 * The user specifies the digest_size their buffer has space for; we can
+	 * return the digest if it fits in the available space.  We write back
+	 * the actual size, which may be shorter than the user-specified size.
+	 */
+
+	if (get_user(arg.digest_size, &uarg->digest_size))
+		return -EFAULT;
+	if (arg.digest_size < hash_alg->digest_size)
+		return -EOVERFLOW;
+
+	memset(&arg, 0, sizeof(arg));
+	arg.digest_algorithm = hash_alg - fsverity_hash_algs;
+	arg.digest_size = hash_alg->digest_size;
+
+	if (copy_to_user(uarg, &arg, sizeof(arg)))
+		return -EFAULT;
+
+	if (copy_to_user(uarg->digest, vi->measurement, hash_alg->digest_size))
+		return -EFAULT;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(fsverity_ioctl_measure);
diff --git a/fs/verity/open.c b/fs/verity/open.c
new file mode 100644
index 0000000..63d1004
--- /dev/null
+++ b/fs/verity/open.c
@@ -0,0 +1,356 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * fs/verity/open.c: opening fs-verity files
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include "fsverity_private.h"
+
+#include <linux/slab.h>
+
+static struct kmem_cache *fsverity_info_cachep;
+
+/**
+ * fsverity_init_merkle_tree_params() - initialize Merkle tree parameters
+ * @params: the parameters struct to initialize
+ * @inode: the inode for which the Merkle tree is being built
+ * @hash_algorithm: number of hash algorithm to use
+ * @log_blocksize: log base 2 of block size to use
+ * @salt: pointer to salt (optional)
+ * @salt_size: size of salt, possibly 0
+ *
+ * Validate the hash algorithm and block size, then compute the tree topology
+ * (num levels, num blocks in each level, etc.) and initialize @params.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+int fsverity_init_merkle_tree_params(struct merkle_tree_params *params,
+				     const struct inode *inode,
+				     unsigned int hash_algorithm,
+				     unsigned int log_blocksize,
+				     const u8 *salt, size_t salt_size)
+{
+	const struct fsverity_hash_alg *hash_alg;
+	int err;
+	u64 blocks;
+	u64 offset;
+	int level;
+
+	memset(params, 0, sizeof(*params));
+
+	hash_alg = fsverity_get_hash_alg(inode, hash_algorithm);
+	if (IS_ERR(hash_alg))
+		return PTR_ERR(hash_alg);
+	params->hash_alg = hash_alg;
+	params->digest_size = hash_alg->digest_size;
+
+	params->hashstate = fsverity_prepare_hash_state(hash_alg, salt,
+							salt_size);
+	if (IS_ERR(params->hashstate)) {
+		err = PTR_ERR(params->hashstate);
+		params->hashstate = NULL;
+		fsverity_err(inode, "Error %d preparing hash state", err);
+		goto out_err;
+	}
+
+	if (log_blocksize != PAGE_SHIFT) {
+		fsverity_warn(inode, "Unsupported log_blocksize: %u",
+			      log_blocksize);
+		err = -EINVAL;
+		goto out_err;
+	}
+	params->log_blocksize = log_blocksize;
+	params->block_size = 1 << log_blocksize;
+
+	if (WARN_ON(!is_power_of_2(params->digest_size))) {
+		err = -EINVAL;
+		goto out_err;
+	}
+	if (params->block_size < 2 * params->digest_size) {
+		fsverity_warn(inode,
+			      "Merkle tree block size (%u) too small for hash algorithm \"%s\"",
+			      params->block_size, hash_alg->name);
+		err = -EINVAL;
+		goto out_err;
+	}
+	params->log_arity = params->log_blocksize - ilog2(params->digest_size);
+	params->hashes_per_block = 1 << params->log_arity;
+
+	pr_debug("Merkle tree uses %s with %u-byte blocks (%u hashes/block), salt=%*phN\n",
+		 hash_alg->name, params->block_size, params->hashes_per_block,
+		 (int)salt_size, salt);
+
+	/*
+	 * Compute the number of levels in the Merkle tree and create a map from
+	 * level to the starting block of that level.  Level 'num_levels - 1' is
+	 * the root and is stored first.  Level 0 is the level directly "above"
+	 * the data blocks and is stored last.
+	 */
+
+	/* Compute number of levels and the number of blocks in each level */
+	blocks = (inode->i_size + params->block_size - 1) >> log_blocksize;
+	pr_debug("Data is %lld bytes (%llu blocks)\n", inode->i_size, blocks);
+	while (blocks > 1) {
+		if (params->num_levels >= FS_VERITY_MAX_LEVELS) {
+			fsverity_err(inode, "Too many levels in Merkle tree");
+			err = -EINVAL;
+			goto out_err;
+		}
+		blocks = (blocks + params->hashes_per_block - 1) >>
+			 params->log_arity;
+		/* temporarily using level_start[] to store blocks in level */
+		params->level_start[params->num_levels++] = blocks;
+	}
+
+	/* Compute the starting block of each level */
+	offset = 0;
+	for (level = (int)params->num_levels - 1; level >= 0; level--) {
+		blocks = params->level_start[level];
+		params->level_start[level] = offset;
+		pr_debug("Level %d is %llu blocks starting at index %llu\n",
+			 level, blocks, offset);
+		offset += blocks;
+	}
+
+	params->tree_size = offset << log_blocksize;
+	return 0;
+
+out_err:
+	kfree(params->hashstate);
+	memset(params, 0, sizeof(*params));
+	return err;
+}
+
+/*
+ * Compute the file measurement by hashing the fsverity_descriptor excluding the
+ * signature and with the sig_size field set to 0.
+ */
+static int compute_file_measurement(const struct fsverity_hash_alg *hash_alg,
+				    struct fsverity_descriptor *desc,
+				    u8 *measurement)
+{
+	__le32 sig_size = desc->sig_size;
+	int err;
+
+	desc->sig_size = 0;
+	err = fsverity_hash_buffer(hash_alg, desc, sizeof(*desc), measurement);
+	desc->sig_size = sig_size;
+
+	return err;
+}
+
+/*
+ * Validate the given fsverity_descriptor and create a new fsverity_info from
+ * it.  The signature (if present) is also checked.
+ */
+struct fsverity_info *fsverity_create_info(const struct inode *inode,
+					   void *_desc, size_t desc_size)
+{
+	struct fsverity_descriptor *desc = _desc;
+	struct fsverity_info *vi;
+	int err;
+
+	if (desc_size < sizeof(*desc)) {
+		fsverity_err(inode, "Unrecognized descriptor size: %zu bytes",
+			     desc_size);
+		return ERR_PTR(-EINVAL);
+	}
+
+	if (desc->version != 1) {
+		fsverity_err(inode, "Unrecognized descriptor version: %u",
+			     desc->version);
+		return ERR_PTR(-EINVAL);
+	}
+
+	if (memchr_inv(desc->__reserved, 0, sizeof(desc->__reserved))) {
+		fsverity_err(inode, "Reserved bits set in descriptor");
+		return ERR_PTR(-EINVAL);
+	}
+
+	if (desc->salt_size > sizeof(desc->salt)) {
+		fsverity_err(inode, "Invalid salt_size: %u", desc->salt_size);
+		return ERR_PTR(-EINVAL);
+	}
+
+	if (le64_to_cpu(desc->data_size) != inode->i_size) {
+		fsverity_err(inode,
+			     "Wrong data_size: %llu (desc) != %lld (inode)",
+			     le64_to_cpu(desc->data_size), inode->i_size);
+		return ERR_PTR(-EINVAL);
+	}
+
+	vi = kmem_cache_zalloc(fsverity_info_cachep, GFP_KERNEL);
+	if (!vi)
+		return ERR_PTR(-ENOMEM);
+	vi->inode = inode;
+
+	err = fsverity_init_merkle_tree_params(&vi->tree_params, inode,
+					       desc->hash_algorithm,
+					       desc->log_blocksize,
+					       desc->salt, desc->salt_size);
+	if (err) {
+		fsverity_err(inode,
+			     "Error %d initializing Merkle tree parameters",
+			     err);
+		goto out;
+	}
+
+	memcpy(vi->root_hash, desc->root_hash, vi->tree_params.digest_size);
+
+	err = compute_file_measurement(vi->tree_params.hash_alg, desc,
+				       vi->measurement);
+	if (err) {
+		fsverity_err(inode, "Error %d computing file measurement", err);
+		goto out;
+	}
+	pr_debug("Computed file measurement: %s:%*phN\n",
+		 vi->tree_params.hash_alg->name,
+		 vi->tree_params.digest_size, vi->measurement);
+
+	err = fsverity_verify_signature(vi, desc, desc_size);
+out:
+	if (err) {
+		fsverity_free_info(vi);
+		vi = ERR_PTR(err);
+	}
+	return vi;
+}
+
+void fsverity_set_info(struct inode *inode, struct fsverity_info *vi)
+{
+	/*
+	 * Multiple processes may race to set ->i_verity_info, so use cmpxchg.
+	 * This pairs with the READ_ONCE() in fsverity_get_info().
+	 */
+	if (cmpxchg(&inode->i_verity_info, NULL, vi) != NULL)
+		fsverity_free_info(vi);
+}
+
+void fsverity_free_info(struct fsverity_info *vi)
+{
+	if (!vi)
+		return;
+	kfree(vi->tree_params.hashstate);
+	kmem_cache_free(fsverity_info_cachep, vi);
+}
+
+/* Ensure the inode has an ->i_verity_info */
+static int ensure_verity_info(struct inode *inode)
+{
+	struct fsverity_info *vi = fsverity_get_info(inode);
+	struct fsverity_descriptor *desc;
+	int res;
+
+	if (vi)
+		return 0;
+
+	res = inode->i_sb->s_vop->get_verity_descriptor(inode, NULL, 0);
+	if (res < 0) {
+		fsverity_err(inode,
+			     "Error %d getting verity descriptor size", res);
+		return res;
+	}
+	if (res > FS_VERITY_MAX_DESCRIPTOR_SIZE) {
+		fsverity_err(inode, "Verity descriptor is too large (%d bytes)",
+			     res);
+		return -EMSGSIZE;
+	}
+	desc = kmalloc(res, GFP_KERNEL);
+	if (!desc)
+		return -ENOMEM;
+	res = inode->i_sb->s_vop->get_verity_descriptor(inode, desc, res);
+	if (res < 0) {
+		fsverity_err(inode, "Error %d reading verity descriptor", res);
+		goto out_free_desc;
+	}
+
+	vi = fsverity_create_info(inode, desc, res);
+	if (IS_ERR(vi)) {
+		res = PTR_ERR(vi);
+		goto out_free_desc;
+	}
+
+	fsverity_set_info(inode, vi);
+	res = 0;
+out_free_desc:
+	kfree(desc);
+	return res;
+}
+
+/**
+ * fsverity_file_open() - prepare to open a verity file
+ * @inode: the inode being opened
+ * @filp: the struct file being set up
+ *
+ * When opening a verity file, deny the open if it is for writing.  Otherwise,
+ * set up the inode's ->i_verity_info if not already done.
+ *
+ * When combined with fscrypt, this must be called after fscrypt_file_open().
+ * Otherwise, we won't have the key set up to decrypt the verity metadata.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+int fsverity_file_open(struct inode *inode, struct file *filp)
+{
+	if (!IS_VERITY(inode))
+		return 0;
+
+	if (filp->f_mode & FMODE_WRITE) {
+		pr_debug("Denying opening verity file (ino %lu) for write\n",
+			 inode->i_ino);
+		return -EPERM;
+	}
+
+	return ensure_verity_info(inode);
+}
+EXPORT_SYMBOL_GPL(fsverity_file_open);
+
+/**
+ * fsverity_prepare_setattr() - prepare to change a verity inode's attributes
+ * @dentry: dentry through which the inode is being changed
+ * @attr: attributes to change
+ *
+ * Verity files are immutable, so deny truncates.  This isn't covered by the
+ * open-time check because sys_truncate() takes a path, not a file descriptor.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+int fsverity_prepare_setattr(struct dentry *dentry, struct iattr *attr)
+{
+	if (IS_VERITY(d_inode(dentry)) && (attr->ia_valid & ATTR_SIZE)) {
+		pr_debug("Denying truncate of verity file (ino %lu)\n",
+			 d_inode(dentry)->i_ino);
+		return -EPERM;
+	}
+	return 0;
+}
+EXPORT_SYMBOL_GPL(fsverity_prepare_setattr);
+
+/**
+ * fsverity_cleanup_inode() - free the inode's verity info, if present
+ *
+ * Filesystems must call this on inode eviction to free ->i_verity_info.
+ */
+void fsverity_cleanup_inode(struct inode *inode)
+{
+	fsverity_free_info(inode->i_verity_info);
+	inode->i_verity_info = NULL;
+}
+EXPORT_SYMBOL_GPL(fsverity_cleanup_inode);
+
+int __init fsverity_init_info_cache(void)
+{
+	fsverity_info_cachep = KMEM_CACHE_USERCOPY(fsverity_info,
+						   SLAB_RECLAIM_ACCOUNT,
+						   measurement);
+	if (!fsverity_info_cachep)
+		return -ENOMEM;
+	return 0;
+}
+
+void __init fsverity_exit_info_cache(void)
+{
+	kmem_cache_destroy(fsverity_info_cachep);
+	fsverity_info_cachep = NULL;
+}
diff --git a/fs/verity/signature.c b/fs/verity/signature.c
new file mode 100644
index 0000000..3dfc56f
--- /dev/null
+++ b/fs/verity/signature.c
@@ -0,0 +1,164 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * fs/verity/signature.c: verification of builtin signatures
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include "fsverity_private.h"
+
+#include <linux/cred.h>
+#include <linux/key.h>
+#include <linux/slab.h>
+#include <linux/verification.h>
+
+/*
+ * /proc/sys/fs/verity/require_signatures
+ * If 1, all verity files must have a valid builtin signature.
+ */
+static int fsverity_require_signatures;
+
+/*
+ * Keyring that contains the trusted X.509 certificates.
+ *
+ * Only root (kuid=0) can modify this.  Also, root may use
+ * keyctl_restrict_keyring() to prevent any more additions.
+ */
+static struct key *fsverity_keyring;
+
+/**
+ * fsverity_verify_signature() - check a verity file's signature
+ *
+ * If the file's fs-verity descriptor includes a signature of the file
+ * measurement, verify it against the certificates in the fs-verity keyring.
+ *
+ * Return: 0 on success (signature valid or not required); -errno on failure
+ */
+int fsverity_verify_signature(const struct fsverity_info *vi,
+			      const struct fsverity_descriptor *desc,
+			      size_t desc_size)
+{
+	const struct inode *inode = vi->inode;
+	const struct fsverity_hash_alg *hash_alg = vi->tree_params.hash_alg;
+	const u32 sig_size = le32_to_cpu(desc->sig_size);
+	struct fsverity_signed_digest *d;
+	int err;
+
+	if (sig_size == 0) {
+		if (fsverity_require_signatures) {
+			fsverity_err(inode,
+				     "require_signatures=1, rejecting unsigned file!");
+			return -EPERM;
+		}
+		return 0;
+	}
+
+	if (sig_size > desc_size - sizeof(*desc)) {
+		fsverity_err(inode, "Signature overflows verity descriptor");
+		return -EBADMSG;
+	}
+
+	d = kzalloc(sizeof(*d) + hash_alg->digest_size, GFP_KERNEL);
+	if (!d)
+		return -ENOMEM;
+	memcpy(d->magic, "FSVerity", 8);
+	d->digest_algorithm = cpu_to_le16(hash_alg - fsverity_hash_algs);
+	d->digest_size = cpu_to_le16(hash_alg->digest_size);
+	memcpy(d->digest, vi->measurement, hash_alg->digest_size);
+
+	err = verify_pkcs7_signature(d, sizeof(*d) + hash_alg->digest_size,
+				     desc->signature, sig_size,
+				     fsverity_keyring,
+				     VERIFYING_UNSPECIFIED_SIGNATURE,
+				     NULL, NULL);
+	kfree(d);
+
+	if (err) {
+		if (err == -ENOKEY)
+			fsverity_err(inode,
+				     "File's signing cert isn't in the fs-verity keyring");
+		else if (err == -EKEYREJECTED)
+			fsverity_err(inode, "Incorrect file signature");
+		else if (err == -EBADMSG)
+			fsverity_err(inode, "Malformed file signature");
+		else
+			fsverity_err(inode, "Error %d verifying file signature",
+				     err);
+		return err;
+	}
+
+	pr_debug("Valid signature for file measurement %s:%*phN\n",
+		 hash_alg->name, hash_alg->digest_size, vi->measurement);
+	return 0;
+}
+
+#ifdef CONFIG_SYSCTL
+static struct ctl_table_header *fsverity_sysctl_header;
+
+static const struct ctl_path fsverity_sysctl_path[] = {
+	{ .procname = "fs", },
+	{ .procname = "verity", },
+	{ }
+};
+
+/* shared constants to be used in various sysctls */
+static int sysctl_vals[] = { 0, 1, INT_MAX };
+
+#define SYSCTL_ZERO	((void *)&sysctl_vals[0])
+#define SYSCTL_ONE	((void *)&sysctl_vals[1])
+#define SYSCTL_INT_MAX	((void *)&sysctl_vals[2])
+
+static struct ctl_table fsverity_sysctl_table[] = {
+	{
+		.procname       = "require_signatures",
+		.data           = &fsverity_require_signatures,
+		.maxlen         = sizeof(int),
+		.mode           = 0644,
+		.proc_handler   = proc_dointvec_minmax,
+		.extra1         = SYSCTL_ZERO,
+		.extra2         = SYSCTL_ONE,
+	},
+	{ }
+};
+
+static int __init fsverity_sysctl_init(void)
+{
+	fsverity_sysctl_header = register_sysctl_paths(fsverity_sysctl_path,
+						       fsverity_sysctl_table);
+	if (!fsverity_sysctl_header) {
+		pr_err("sysctl registration failed!\n");
+		return -ENOMEM;
+	}
+	return 0;
+}
+#else /* !CONFIG_SYSCTL */
+static inline int __init fsverity_sysctl_init(void)
+{
+	return 0;
+}
+#endif /* !CONFIG_SYSCTL */
+
+int __init fsverity_init_signature(void)
+{
+	struct key *ring;
+	int err;
+
+	ring = keyring_alloc(".fs-verity", KUIDT_INIT(0), KGIDT_INIT(0),
+			     current_cred(), KEY_POS_SEARCH |
+				KEY_USR_VIEW | KEY_USR_READ | KEY_USR_WRITE |
+				KEY_USR_SEARCH | KEY_USR_SETATTR,
+			     KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
+	if (IS_ERR(ring))
+		return PTR_ERR(ring);
+
+	err = fsverity_sysctl_init();
+	if (err)
+		goto err_put_ring;
+
+	fsverity_keyring = ring;
+	return 0;
+
+err_put_ring:
+	key_put(ring);
+	return err;
+}
diff --git a/fs/verity/verify.c b/fs/verity/verify.c
new file mode 100644
index 0000000..1818050
--- /dev/null
+++ b/fs/verity/verify.c
@@ -0,0 +1,281 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * fs/verity/verify.c: data verification functions, i.e. hooks for ->readpages()
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include "fsverity_private.h"
+
+#include <crypto/hash.h>
+#include <linux/bio.h>
+#include <linux/ratelimit.h>
+
+static struct workqueue_struct *fsverity_read_workqueue;
+
+/**
+ * hash_at_level() - compute the location of the block's hash at the given level
+ *
+ * @params:	(in) the Merkle tree parameters
+ * @dindex:	(in) the index of the data block being verified
+ * @level:	(in) the level of hash we want (0 is leaf level)
+ * @hindex:	(out) the index of the hash block containing the wanted hash
+ * @hoffset:	(out) the byte offset to the wanted hash within the hash block
+ */
+static void hash_at_level(const struct merkle_tree_params *params,
+			  pgoff_t dindex, unsigned int level, pgoff_t *hindex,
+			  unsigned int *hoffset)
+{
+	pgoff_t position;
+
+	/* Offset of the hash within the level's region, in hashes */
+	position = dindex >> (level * params->log_arity);
+
+	/* Index of the hash block in the tree overall */
+	*hindex = params->level_start[level] + (position >> params->log_arity);
+
+	/* Offset of the wanted hash (in bytes) within the hash block */
+	*hoffset = (position & ((1 << params->log_arity) - 1)) <<
+		   (params->log_blocksize - params->log_arity);
+}
+
+/* Extract a hash from a hash page */
+static void extract_hash(struct page *hpage, unsigned int hoffset,
+			 unsigned int hsize, u8 *out)
+{
+	void *virt = kmap_atomic(hpage);
+
+	memcpy(out, virt + hoffset, hsize);
+	kunmap_atomic(virt);
+}
+
+static inline int cmp_hashes(const struct fsverity_info *vi,
+			     const u8 *want_hash, const u8 *real_hash,
+			     pgoff_t index, int level)
+{
+	const unsigned int hsize = vi->tree_params.digest_size;
+
+	if (memcmp(want_hash, real_hash, hsize) == 0)
+		return 0;
+
+	fsverity_err(vi->inode,
+		     "FILE CORRUPTED! index=%lu, level=%d, want_hash=%s:%*phN, real_hash=%s:%*phN",
+		     index, level,
+		     vi->tree_params.hash_alg->name, hsize, want_hash,
+		     vi->tree_params.hash_alg->name, hsize, real_hash);
+	return -EBADMSG;
+}
+
+/*
+ * Verify a single data page against the file's Merkle tree.
+ *
+ * In principle, we need to verify the entire path to the root node.  However,
+ * for efficiency the filesystem may cache the hash pages.  Therefore we need
+ * only ascend the tree until an already-verified page is seen, as indicated by
+ * the PageChecked bit being set; then verify the path to that page.
+ *
+ * This code currently only supports the case where the verity block size is
+ * equal to PAGE_SIZE.  Doing otherwise would be possible but tricky, since we
+ * wouldn't be able to use the PageChecked bit.
+ *
+ * Note that multiple processes may race to verify a hash page and mark it
+ * Checked, but it doesn't matter; the result will be the same either way.
+ *
+ * Return: true if the page is valid, else false.
+ */
+static bool verify_page(struct inode *inode, const struct fsverity_info *vi,
+			struct ahash_request *req, struct page *data_page)
+{
+	const struct merkle_tree_params *params = &vi->tree_params;
+	const unsigned int hsize = params->digest_size;
+	const pgoff_t index = data_page->index;
+	int level;
+	u8 _want_hash[FS_VERITY_MAX_DIGEST_SIZE];
+	const u8 *want_hash;
+	u8 real_hash[FS_VERITY_MAX_DIGEST_SIZE];
+	struct page *hpages[FS_VERITY_MAX_LEVELS];
+	unsigned int hoffsets[FS_VERITY_MAX_LEVELS];
+	int err;
+
+	if (WARN_ON_ONCE(!PageLocked(data_page) || PageUptodate(data_page)))
+		return false;
+
+	pr_debug_ratelimited("Verifying data page %lu...\n", index);
+
+	/*
+	 * Starting at the leaf level, ascend the tree saving hash pages along
+	 * the way until we find a verified hash page, indicated by PageChecked;
+	 * or until we reach the root.
+	 */
+	for (level = 0; level < params->num_levels; level++) {
+		pgoff_t hindex;
+		unsigned int hoffset;
+		struct page *hpage;
+
+		hash_at_level(params, index, level, &hindex, &hoffset);
+
+		pr_debug_ratelimited("Level %d: hindex=%lu, hoffset=%u\n",
+				     level, hindex, hoffset);
+
+		hpage = inode->i_sb->s_vop->read_merkle_tree_page(inode,
+								  hindex);
+		if (IS_ERR(hpage)) {
+			err = PTR_ERR(hpage);
+			fsverity_err(inode,
+				     "Error %d reading Merkle tree page %lu",
+				     err, hindex);
+			goto out;
+		}
+
+		if (PageChecked(hpage)) {
+			extract_hash(hpage, hoffset, hsize, _want_hash);
+			want_hash = _want_hash;
+			put_page(hpage);
+			pr_debug_ratelimited("Hash page already checked, want %s:%*phN\n",
+					     params->hash_alg->name,
+					     hsize, want_hash);
+			goto descend;
+		}
+		pr_debug_ratelimited("Hash page not yet checked\n");
+		hpages[level] = hpage;
+		hoffsets[level] = hoffset;
+	}
+
+	want_hash = vi->root_hash;
+	pr_debug("Want root hash: %s:%*phN\n",
+		 params->hash_alg->name, hsize, want_hash);
+descend:
+	/* Descend the tree verifying hash pages */
+	for (; level > 0; level--) {
+		struct page *hpage = hpages[level - 1];
+		unsigned int hoffset = hoffsets[level - 1];
+
+		err = fsverity_hash_page(params, inode, req, hpage, real_hash);
+		if (err)
+			goto out;
+		err = cmp_hashes(vi, want_hash, real_hash, index, level - 1);
+		if (err)
+			goto out;
+		SetPageChecked(hpage);
+		extract_hash(hpage, hoffset, hsize, _want_hash);
+		want_hash = _want_hash;
+		put_page(hpage);
+		pr_debug("Verified hash page at level %d, now want %s:%*phN\n",
+			 level - 1, params->hash_alg->name, hsize, want_hash);
+	}
+
+	/* Finally, verify the data page */
+	err = fsverity_hash_page(params, inode, req, data_page, real_hash);
+	if (err)
+		goto out;
+	err = cmp_hashes(vi, want_hash, real_hash, index, -1);
+out:
+	for (; level > 0; level--)
+		put_page(hpages[level - 1]);
+
+	return err == 0;
+}
+
+/**
+ * fsverity_verify_page() - verify a data page
+ *
+ * Verify a page that has just been read from a verity file.  The page must be a
+ * pagecache page that is still locked and not yet uptodate.
+ *
+ * Return: true if the page is valid, else false.
+ */
+bool fsverity_verify_page(struct page *page)
+{
+	struct inode *inode = page->mapping->host;
+	const struct fsverity_info *vi = inode->i_verity_info;
+	struct ahash_request *req;
+	bool valid;
+
+	req = ahash_request_alloc(vi->tree_params.hash_alg->tfm, GFP_NOFS);
+	if (unlikely(!req))
+		return false;
+
+	valid = verify_page(inode, vi, req, page);
+
+	ahash_request_free(req);
+
+	return valid;
+}
+EXPORT_SYMBOL_GPL(fsverity_verify_page);
+
+#ifdef CONFIG_BLOCK
+/**
+ * fsverity_verify_bio() - verify a 'read' bio that has just completed
+ *
+ * Verify a set of pages that have just been read from a verity file.  The pages
+ * must be pagecache pages that are still locked and not yet uptodate.  Pages
+ * that fail verification are set to the Error state.  Verification is skipped
+ * for pages already in the Error state, e.g. due to fscrypt decryption failure.
+ *
+ * This is a helper function for use by the ->readpages() method of filesystems
+ * that issue bios to read data directly into the page cache.  Filesystems that
+ * populate the page cache without issuing bios (e.g. non block-based
+ * filesystems) must instead call fsverity_verify_page() directly on each page.
+ * All filesystems must also call fsverity_verify_page() on holes.
+ */
+void fsverity_verify_bio(struct bio *bio)
+{
+	struct inode *inode = bio_first_page_all(bio)->mapping->host;
+	const struct fsverity_info *vi = inode->i_verity_info;
+	struct ahash_request *req;
+	struct bio_vec *bv;
+	int i;
+
+	req = ahash_request_alloc(vi->tree_params.hash_alg->tfm, GFP_NOFS);
+	if (unlikely(!req)) {
+		bio_for_each_segment_all(bv, bio, i)
+			SetPageError(bv->bv_page);
+		return;
+	}
+
+	bio_for_each_segment_all(bv, bio, i) {
+		struct page *page = bv->bv_page;
+
+		if (!PageError(page) && !verify_page(inode, vi, req, page))
+			SetPageError(page);
+	}
+
+	ahash_request_free(req);
+}
+EXPORT_SYMBOL_GPL(fsverity_verify_bio);
+#endif /* CONFIG_BLOCK */
+
+/**
+ * fsverity_enqueue_verify_work() - enqueue work on the fs-verity workqueue
+ *
+ * Enqueue verification work for asynchronous processing.
+ */
+void fsverity_enqueue_verify_work(struct work_struct *work)
+{
+	queue_work(fsverity_read_workqueue, work);
+}
+EXPORT_SYMBOL_GPL(fsverity_enqueue_verify_work);
+
+int __init fsverity_init_workqueue(void)
+{
+	/*
+	 * Use an unbound workqueue to allow bios to be verified in parallel
+	 * even when they happen to complete on the same CPU.  This sacrifices
+	 * locality, but it's worthwhile since hashing is CPU-intensive.
+	 *
+	 * Also use a high-priority workqueue to prioritize verification work,
+	 * which blocks reads from completing, over regular application tasks.
+	 */
+	fsverity_read_workqueue = alloc_workqueue("fsverity_read_queue",
+						  WQ_UNBOUND | WQ_HIGHPRI,
+						  num_online_cpus());
+	if (!fsverity_read_workqueue)
+		return -ENOMEM;
+	return 0;
+}
+
+void __init fsverity_exit_workqueue(void)
+{
+	destroy_workqueue(fsverity_read_workqueue);
+	fsverity_read_workqueue = NULL;
+}
diff --git a/fs/xattr.c b/fs/xattr.c
index 0d6a6a4..fd7bafb 100644
--- a/fs/xattr.c
+++ b/fs/xattr.c
@@ -130,7 +130,7 @@
 			return -EPERM;
 	}
 
-	return inode_permission(inode, mask);
+	return inode_permission2(ERR_PTR(-EOPNOTSUPP), inode, mask);
 }
 
 int
@@ -305,6 +305,9 @@
 	handler = xattr_resolve_name(inode, &name);
 	if (IS_ERR(handler))
 		return PTR_ERR(handler);
+	if (unlikely(handler->__get))
+		return handler->__get(handler, dentry, inode, name, value,
+				      size);
 	if (!handler->get)
 		return -EOPNOTSUPP;
 	return handler->get(handler, dentry, inode, name, value, size);
@@ -316,6 +319,7 @@
 {
 	struct inode *inode = dentry->d_inode;
 	int error;
+	const struct xattr_handler *handler;
 
 	error = xattr_permission(inode, name, MAY_READ);
 	if (error)
@@ -338,7 +342,12 @@
 		return ret;
 	}
 nolsm:
-	return __vfs_getxattr(dentry, inode, name, value, size);
+	handler = xattr_resolve_name(inode, &name);
+	if (IS_ERR(handler))
+		return PTR_ERR(handler);
+	if (!handler->get)
+		return -EOPNOTSUPP;
+	return handler->get(handler, dentry, inode, name, value, size);
 }
 EXPORT_SYMBOL_GPL(vfs_getxattr);
 
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index dd38c97..8667538 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -66,8 +66,9 @@
  * RODATA_MAIN is not used because existing code already defines .rodata.x
  * sections to be brought in with rodata.
  */
-#ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
+#if defined(CONFIG_LD_DEAD_CODE_DATA_ELIMINATION) || defined(CONFIG_LTO_CLANG)
 #define TEXT_MAIN .text .text.[0-9a-zA-Z_]*
+#define TEXT_CFI_MAIN .text.[0-9a-zA-Z_]*.cfi
 #define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..LPBX*
 #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]*
 #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]*
@@ -75,6 +76,7 @@
 #define SBSS_MAIN .sbss .sbss.[0-9a-zA-Z_]*
 #else
 #define TEXT_MAIN .text
+#define TEXT_CFI_MAIN .text.cfi
 #define DATA_MAIN .data
 #define SDATA_MAIN .sdata
 #define RODATA_MAIN .rodata
@@ -491,7 +493,9 @@
 #define TEXT_TEXT							\
 		ALIGN_FUNCTION();					\
 		*(.text.hot TEXT_MAIN .text.fixup .text.unlikely)	\
+		*(TEXT_CFI_MAIN) 					\
 		*(.text..refcount)					\
+		*(.text..ftrace)					\
 		*(.ref.text)						\
 	MEM_KEEP(init.text*)						\
 	MEM_KEEP(exit.text*)						\
diff --git a/include/crypto/chacha.h b/include/crypto/chacha.h
new file mode 100644
index 0000000..3d261f5
--- /dev/null
+++ b/include/crypto/chacha.h
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Common values and helper functions for the ChaCha and XChaCha stream ciphers.
+ *
+ * XChaCha extends ChaCha's nonce to 192 bits, while provably retaining ChaCha's
+ * security.  Here they share the same key size, tfm context, and setkey
+ * function; only their IV size and encrypt/decrypt function differ.
+ *
+ * The ChaCha paper specifies 20, 12, and 8-round variants.  In general, it is
+ * recommended to use the 20-round variant ChaCha20.  However, the other
+ * variants can be needed in some performance-sensitive scenarios.  The generic
+ * ChaCha code currently allows only the 20 and 12-round variants.
+ */
+
+#ifndef _CRYPTO_CHACHA_H
+#define _CRYPTO_CHACHA_H
+
+#include <crypto/skcipher.h>
+#include <linux/types.h>
+#include <linux/crypto.h>
+
+/* 32-bit stream position, then 96-bit nonce (RFC7539 convention) */
+#define CHACHA_IV_SIZE		16
+
+#define CHACHA_KEY_SIZE		32
+#define CHACHA_BLOCK_SIZE	64
+
+/* 192-bit nonce, then 64-bit stream position */
+#define XCHACHA_IV_SIZE		32
+
+struct chacha_ctx {
+	u32 key[8];
+	int nrounds;
+};
+
+void chacha_block(u32 *state, u8 *stream, int nrounds);
+static inline void chacha20_block(u32 *state, u8 *stream)
+{
+	chacha_block(state, stream, 20);
+}
+void hchacha_block(const u32 *in, u32 *out, int nrounds);
+
+void crypto_chacha_init(u32 *state, struct chacha_ctx *ctx, u8 *iv);
+
+int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
+			   unsigned int keysize);
+int crypto_chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
+			   unsigned int keysize);
+
+int crypto_chacha_crypt(struct skcipher_request *req);
+int crypto_xchacha_crypt(struct skcipher_request *req);
+
+#endif /* _CRYPTO_CHACHA_H */
diff --git a/include/crypto/chacha20.h b/include/crypto/chacha20.h
deleted file mode 100644
index f76302d..0000000
--- a/include/crypto/chacha20.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Common values for the ChaCha20 algorithm
- */
-
-#ifndef _CRYPTO_CHACHA20_H
-#define _CRYPTO_CHACHA20_H
-
-#include <crypto/skcipher.h>
-#include <linux/types.h>
-#include <linux/crypto.h>
-
-#define CHACHA20_IV_SIZE	16
-#define CHACHA20_KEY_SIZE	32
-#define CHACHA20_BLOCK_SIZE	64
-
-struct chacha20_ctx {
-	u32 key[8];
-};
-
-void chacha20_block(u32 *state, u8 *stream);
-void crypto_chacha20_init(u32 *state, struct chacha20_ctx *ctx, u8 *iv);
-int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
-			   unsigned int keysize);
-int crypto_chacha20_crypt(struct skcipher_request *req);
-
-#endif
diff --git a/include/crypto/nhpoly1305.h b/include/crypto/nhpoly1305.h
new file mode 100644
index 0000000..53c0442
--- /dev/null
+++ b/include/crypto/nhpoly1305.h
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Common values and helper functions for the NHPoly1305 hash function.
+ */
+
+#ifndef _NHPOLY1305_H
+#define _NHPOLY1305_H
+
+#include <crypto/hash.h>
+#include <crypto/poly1305.h>
+
+/* NH parameterization: */
+
+/* Endianness: little */
+/* Word size: 32 bits (works well on NEON, SSE2, AVX2) */
+
+/* Stride: 2 words (optimal on ARM32 NEON; works okay on other CPUs too) */
+#define NH_PAIR_STRIDE		2
+#define NH_MESSAGE_UNIT		(NH_PAIR_STRIDE * 2 * sizeof(u32))
+
+/* Num passes (Toeplitz iteration count): 4, to give ε = 2^{-128} */
+#define NH_NUM_PASSES		4
+#define NH_HASH_BYTES		(NH_NUM_PASSES * sizeof(u64))
+
+/* Max message size: 1024 bytes (32x compression factor) */
+#define NH_NUM_STRIDES		64
+#define NH_MESSAGE_WORDS	(NH_PAIR_STRIDE * 2 * NH_NUM_STRIDES)
+#define NH_MESSAGE_BYTES	(NH_MESSAGE_WORDS * sizeof(u32))
+#define NH_KEY_WORDS		(NH_MESSAGE_WORDS + \
+				 NH_PAIR_STRIDE * 2 * (NH_NUM_PASSES - 1))
+#define NH_KEY_BYTES		(NH_KEY_WORDS * sizeof(u32))
+
+#define NHPOLY1305_KEY_SIZE	(POLY1305_BLOCK_SIZE + NH_KEY_BYTES)
+
+struct nhpoly1305_key {
+	struct poly1305_key poly_key;
+	u32 nh_key[NH_KEY_WORDS];
+};
+
+struct nhpoly1305_state {
+
+	/* Running total of polynomial evaluation */
+	struct poly1305_state poly_state;
+
+	/* Partial block buffer */
+	u8 buffer[NH_MESSAGE_UNIT];
+	unsigned int buflen;
+
+	/*
+	 * Number of bytes remaining until the current NH message reaches
+	 * NH_MESSAGE_BYTES.  When nonzero, 'nh_hash' holds the partial NH hash.
+	 */
+	unsigned int nh_remaining;
+
+	__le64 nh_hash[NH_NUM_PASSES];
+};
+
+typedef void (*nh_t)(const u32 *key, const u8 *message, size_t message_len,
+		     __le64 hash[NH_NUM_PASSES]);
+
+int crypto_nhpoly1305_setkey(struct crypto_shash *tfm,
+			     const u8 *key, unsigned int keylen);
+
+int crypto_nhpoly1305_init(struct shash_desc *desc);
+int crypto_nhpoly1305_update(struct shash_desc *desc,
+			     const u8 *src, unsigned int srclen);
+int crypto_nhpoly1305_update_helper(struct shash_desc *desc,
+				    const u8 *src, unsigned int srclen,
+				    nh_t nh_fn);
+int crypto_nhpoly1305_final(struct shash_desc *desc, u8 *dst);
+int crypto_nhpoly1305_final_helper(struct shash_desc *desc, u8 *dst,
+				   nh_t nh_fn);
+
+#endif /* _NHPOLY1305_H */
diff --git a/include/crypto/poly1305.h b/include/crypto/poly1305.h
index f718a19..34317ed 100644
--- a/include/crypto/poly1305.h
+++ b/include/crypto/poly1305.h
@@ -13,13 +13,21 @@
 #define POLY1305_KEY_SIZE	32
 #define POLY1305_DIGEST_SIZE	16
 
+struct poly1305_key {
+	u32 r[5];	/* key, base 2^26 */
+};
+
+struct poly1305_state {
+	u32 h[5];	/* accumulator, base 2^26 */
+};
+
 struct poly1305_desc_ctx {
 	/* key */
-	u32 r[5];
+	struct poly1305_key r;
 	/* finalize key */
 	u32 s[4];
 	/* accumulator */
-	u32 h[5];
+	struct poly1305_state h;
 	/* partial buffer */
 	u8 buf[POLY1305_BLOCK_SIZE];
 	/* bytes used in partial buffer */
@@ -30,6 +38,22 @@
 	bool sset;
 };
 
+/*
+ * Poly1305 core functions.  These implement the ε-almost-∆-universal hash
+ * function underlying the Poly1305 MAC, i.e. they don't add an encrypted nonce
+ * ("s key") at the end.  They also only support block-aligned inputs.
+ */
+void poly1305_core_setkey(struct poly1305_key *key, const u8 *raw_key);
+static inline void poly1305_core_init(struct poly1305_state *state)
+{
+	memset(state->h, 0, sizeof(state->h));
+}
+void poly1305_core_blocks(struct poly1305_state *state,
+			  const struct poly1305_key *key,
+			  const void *src, unsigned int nblocks);
+void poly1305_core_emit(const struct poly1305_state *state, void *dst);
+
+/* Crypto API helper functions for the Poly1305 MAC */
 int crypto_poly1305_init(struct shash_desc *desc);
 unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx,
 					const u8 *src, unsigned int srclen);
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 97ea41d..4d58966 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1083,6 +1083,7 @@
 		       struct drm_connector *connector,
 		       const struct drm_connector_funcs *funcs,
 		       int connector_type);
+void drm_connector_attach_edid_property(struct drm_connector *connector);
 int drm_connector_register(struct drm_connector *connector);
 void drm_connector_unregister(struct drm_connector *connector);
 int drm_connector_attach_encoder(struct drm_connector *connector,
diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h
index f9c1584..fac831c 100644
--- a/include/drm/drm_fourcc.h
+++ b/include/drm/drm_fourcc.h
@@ -25,6 +25,28 @@
 #include <linux/types.h>
 #include <uapi/drm/drm_fourcc.h>
 
+/*
+ * DRM formats are little endian.  Define host endian variants for the
+ * most common formats here, to reduce the #ifdefs needed in drivers.
+ *
+ * Note that the DRM_FORMAT_BIG_ENDIAN flag should only be used in
+ * case the format can't be specified otherwise, so we don't end up
+ * with two values describing the same format.
+ */
+#ifdef __BIG_ENDIAN
+# define DRM_FORMAT_HOST_XRGB1555     (DRM_FORMAT_XRGB1555         |	\
+				       DRM_FORMAT_BIG_ENDIAN)
+# define DRM_FORMAT_HOST_RGB565       (DRM_FORMAT_RGB565           |	\
+				       DRM_FORMAT_BIG_ENDIAN)
+# define DRM_FORMAT_HOST_XRGB8888     DRM_FORMAT_BGRX8888
+# define DRM_FORMAT_HOST_ARGB8888     DRM_FORMAT_BGRA8888
+#else
+# define DRM_FORMAT_HOST_XRGB1555     DRM_FORMAT_XRGB1555
+# define DRM_FORMAT_HOST_RGB565       DRM_FORMAT_RGB565
+# define DRM_FORMAT_HOST_XRGB8888     DRM_FORMAT_XRGB8888
+# define DRM_FORMAT_HOST_ARGB8888     DRM_FORMAT_ARGB8888
+#endif
+
 struct drm_device;
 struct drm_mode_fb_cmd2;
 
diff --git a/include/drm/drm_prime.h b/include/drm/drm_prime.h
index d716d65..0c86d75 100644
--- a/include/drm/drm_prime.h
+++ b/include/drm/drm_prime.h
@@ -70,6 +70,7 @@
 int drm_gem_prime_handle_to_fd(struct drm_device *dev,
 			       struct drm_file *file_priv, uint32_t handle, uint32_t flags,
 			       int *prime_fd);
+int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
 struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
 					    struct dma_buf *dma_buf);
 
diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h
index 2b70941..7e5a33e 100644
--- a/include/linux/arch_topology.h
+++ b/include/linux/arch_topology.h
@@ -9,6 +9,7 @@
 #include <linux/percpu.h>
 
 void topology_normalize_cpu_scale(void);
+int topology_update_cpu_topology(void);
 
 struct device_node;
 bool topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu);
@@ -32,4 +33,12 @@
 	return per_cpu(freq_scale, cpu);
 }
 
+DECLARE_PER_CPU(unsigned long, max_freq_scale);
+
+static inline
+unsigned long topology_get_max_freq_scale(struct sched_domain *sd, int cpu)
+{
+	return per_cpu(max_freq_scale, cpu);
+}
+
 #endif /* _LINUX_ARCH_TOPOLOGY_H_ */
diff --git a/include/linux/bio-crypt-ctx.h b/include/linux/bio-crypt-ctx.h
new file mode 100644
index 0000000..7c389f3
--- /dev/null
+++ b/include/linux/bio-crypt-ctx.h
@@ -0,0 +1,226 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright 2019 Google LLC
+ */
+#ifndef __LINUX_BIO_CRYPT_CTX_H
+#define __LINUX_BIO_CRYPT_CTX_H
+
+enum blk_crypto_mode_num {
+	BLK_ENCRYPTION_MODE_INVALID	= 0,
+	BLK_ENCRYPTION_MODE_AES_256_XTS	= 1,
+};
+
+#ifdef CONFIG_BLOCK
+#include <linux/blk_types.h>
+
+#ifdef CONFIG_BLK_INLINE_ENCRYPTION
+struct bio_crypt_ctx {
+	int keyslot;
+	const u8 *raw_key;
+	enum blk_crypto_mode_num crypto_mode;
+	u64 data_unit_num;
+	unsigned int data_unit_size_bits;
+
+	/*
+	 * The keyslot manager where the key has been programmed
+	 * with keyslot.
+	 */
+	struct keyslot_manager *processing_ksm;
+
+	/*
+	 * Copy of the bvec_iter when this bio was submitted.
+	 * We only want to en/decrypt the part of the bio
+	 * as described by the bvec_iter upon submission because
+	 * bio might be split before being resubmitted
+	 */
+	struct bvec_iter crypt_iter;
+	u64 sw_data_unit_num;
+};
+
+extern int bio_crypt_clone(struct bio *dst, struct bio *src,
+			   gfp_t gfp_mask);
+
+static inline bool bio_has_crypt_ctx(struct bio *bio)
+{
+	return bio->bi_crypt_context;
+}
+
+static inline void bio_crypt_advance(struct bio *bio, unsigned int bytes)
+{
+	if (bio_has_crypt_ctx(bio)) {
+		bio->bi_crypt_context->data_unit_num +=
+			bytes >> bio->bi_crypt_context->data_unit_size_bits;
+	}
+}
+
+extern bool bio_crypt_swhandled(struct bio *bio);
+
+static inline bool bio_crypt_has_keyslot(struct bio *bio)
+{
+	return bio->bi_crypt_context->keyslot >= 0;
+}
+
+extern int bio_crypt_ctx_init(void);
+
+extern struct bio_crypt_ctx *bio_crypt_alloc_ctx(gfp_t gfp_mask);
+
+extern void bio_crypt_free_ctx(struct bio *bio);
+
+static inline int bio_crypt_set_ctx(struct bio *bio,
+				    const u8 *raw_key,
+				    enum blk_crypto_mode_num crypto_mode,
+				    u64 dun,
+				    unsigned int dun_bits,
+				    gfp_t gfp_mask)
+{
+	struct bio_crypt_ctx *crypt_ctx;
+
+	crypt_ctx = bio_crypt_alloc_ctx(gfp_mask);
+	if (!crypt_ctx)
+		return -ENOMEM;
+
+	crypt_ctx->raw_key = raw_key;
+	crypt_ctx->data_unit_num = dun;
+	crypt_ctx->data_unit_size_bits = dun_bits;
+	crypt_ctx->crypto_mode = crypto_mode;
+	crypt_ctx->processing_ksm = NULL;
+	crypt_ctx->keyslot = -1;
+	bio->bi_crypt_context = crypt_ctx;
+
+	return 0;
+}
+
+static inline void bio_set_data_unit_num(struct bio *bio, u64 dun)
+{
+	bio->bi_crypt_context->data_unit_num = dun;
+}
+
+static inline int bio_crypt_get_keyslot(struct bio *bio)
+{
+	return bio->bi_crypt_context->keyslot;
+}
+
+static inline void bio_crypt_set_keyslot(struct bio *bio,
+					 unsigned int keyslot,
+					 struct keyslot_manager *ksm)
+{
+	bio->bi_crypt_context->keyslot = keyslot;
+	bio->bi_crypt_context->processing_ksm = ksm;
+}
+
+extern void bio_crypt_ctx_release_keyslot(struct bio *bio);
+
+extern int bio_crypt_ctx_acquire_keyslot(struct bio *bio,
+					 struct keyslot_manager *ksm);
+
+static inline const u8 *bio_crypt_raw_key(struct bio *bio)
+{
+	return bio->bi_crypt_context->raw_key;
+}
+
+static inline enum blk_crypto_mode_num bio_crypto_mode(struct bio *bio)
+{
+	return bio->bi_crypt_context->crypto_mode;
+}
+
+static inline u64 bio_crypt_data_unit_num(struct bio *bio)
+{
+	return bio->bi_crypt_context->data_unit_num;
+}
+
+static inline u64 bio_crypt_sw_data_unit_num(struct bio *bio)
+{
+	return bio->bi_crypt_context->sw_data_unit_num;
+}
+
+extern bool bio_crypt_should_process(struct bio *bio, struct request_queue *q);
+
+extern bool bio_crypt_ctx_compatible(struct bio *b_1, struct bio *b_2);
+
+extern bool bio_crypt_ctx_back_mergeable(struct bio *b_1,
+					 unsigned int b1_sectors,
+					 struct bio *b_2);
+
+#else /* CONFIG_BLK_INLINE_ENCRYPTION */
+struct keyslot_manager;
+
+static inline int bio_crypt_ctx_init(void)
+{
+	return 0;
+}
+
+static inline int bio_crypt_clone(struct bio *dst, struct bio *src,
+				  gfp_t gfp_mask)
+{
+	return 0;
+}
+
+static inline void bio_crypt_advance(struct bio *bio,
+				     unsigned int bytes) { }
+
+static inline bool bio_has_crypt_ctx(struct bio *bio)
+{
+	return false;
+}
+
+static inline void bio_crypt_free_ctx(struct bio *bio) { }
+
+static inline void bio_crypt_set_ctx(struct bio *bio,
+				     u8 *raw_key,
+				     enum blk_crypto_mode_num crypto_mode,
+				     u64 dun,
+				     unsigned int dun_bits,
+				     gfp_t gfp_mask) { }
+
+static inline bool bio_crypt_swhandled(struct bio *bio)
+{
+	return false;
+}
+
+static inline void bio_set_data_unit_num(struct bio *bio, u64 dun) { }
+
+static inline bool bio_crypt_has_keyslot(struct bio *bio)
+{
+	return false;
+}
+
+static inline void bio_crypt_set_keyslot(struct bio *bio,
+					 unsigned int keyslot,
+					 struct keyslot_manager *ksm) { }
+
+static inline int bio_crypt_get_keyslot(struct bio *bio)
+{
+	return -1;
+}
+
+static inline u8 *bio_crypt_raw_key(struct bio *bio)
+{
+	return NULL;
+}
+
+static inline u64 bio_crypt_data_unit_num(struct bio *bio)
+{
+	return 0;
+}
+
+static inline bool bio_crypt_should_process(struct bio *bio,
+					    struct request_queue *q)
+{
+	return false;
+}
+
+static inline bool bio_crypt_ctx_compatible(struct bio *b_1, struct bio *b_2)
+{
+	return true;
+}
+
+static inline bool bio_crypt_ctx_back_mergeable(struct bio *b_1,
+						unsigned int b1_sectors,
+						struct bio *b_2)
+{
+	return true;
+}
+
+#endif /* CONFIG_BLK_INLINE_ENCRYPTION */
+#endif /* CONFIG_BLOCK */
+#endif /* __LINUX_BIO_CRYPT_CTX_H */
diff --git a/include/linux/bio.h b/include/linux/bio.h
index c7433a2..f31600f 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -22,6 +22,7 @@
 #include <linux/mempool.h>
 #include <linux/ioprio.h>
 #include <linux/bug.h>
+#include <linux/bio-crypt-ctx.h>
 
 #ifdef CONFIG_BLOCK
 
diff --git a/include/linux/blk-crypto.h b/include/linux/blk-crypto.h
new file mode 100644
index 0000000..2a07401
--- /dev/null
+++ b/include/linux/blk-crypto.h
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright 2019 Google LLC
+ */
+
+#ifndef __LINUX_BLK_CRYPTO_H
+#define __LINUX_BLK_CRYPTO_H
+
+#include <linux/types.h>
+#include <linux/bio.h>
+
+#ifdef CONFIG_BLK_INLINE_ENCRYPTION
+
+int blk_crypto_init(void);
+
+int blk_crypto_submit_bio(struct bio **bio_ptr);
+
+bool blk_crypto_endio(struct bio *bio);
+
+int blk_crypto_start_using_mode(enum blk_crypto_mode_num mode_num,
+				unsigned int data_unit_size,
+				struct request_queue *q);
+
+int blk_crypto_evict_key(struct request_queue *q, const u8 *key,
+			 enum blk_crypto_mode_num mode,
+			 unsigned int data_unit_size);
+
+#else /* CONFIG_BLK_INLINE_ENCRYPTION */
+
+static inline int blk_crypto_init(void)
+{
+	return 0;
+}
+
+static inline int blk_crypto_submit_bio(struct bio **bio_ptr)
+{
+	return 0;
+}
+
+static inline bool blk_crypto_endio(struct bio *bio)
+{
+	return true;
+}
+
+static inline int
+blk_crypto_start_using_mode(enum blk_crypto_mode_num mode_num,
+			    unsigned int data_unit_size,
+			    struct request_queue *q)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int blk_crypto_evict_key(struct request_queue *q, const u8 *key,
+				       enum blk_crypto_mode_num mode,
+				       unsigned int data_unit_size)
+{
+	return 0;
+}
+
+#endif /* CONFIG_BLK_INLINE_ENCRYPTION */
+
+#endif /* __LINUX_BLK_CRYPTO_H */
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index f6dfb30..73568b2 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -18,6 +18,7 @@
 struct io_context;
 struct cgroup_subsys_state;
 typedef void (bio_end_io_t) (struct bio *);
+struct bio_crypt_ctx;
 
 /*
  * Block error status values.  See block/blk-core:blk_errors for the details.
@@ -182,6 +183,11 @@
 	struct blkcg_gq		*bi_blkg;
 	struct bio_issue	bi_issue;
 #endif
+
+#ifdef CONFIG_BLK_INLINE_ENCRYPTION
+	struct bio_crypt_ctx	*bi_crypt_context;
+#endif
+
 	union {
 #if defined(CONFIG_BLK_DEV_INTEGRITY)
 		struct bio_integrity_payload *bi_integrity; /* data integrity */
@@ -220,14 +226,15 @@
 #define BIO_BOUNCED	3	/* bio is a bounce bio */
 #define BIO_USER_MAPPED 4	/* contains user pages */
 #define BIO_NULL_MAPPED 5	/* contains invalid user pages */
-#define BIO_QUIET	6	/* Make BIO Quiet */
-#define BIO_CHAIN	7	/* chained bio, ->bi_remaining in effect */
-#define BIO_REFFED	8	/* bio has elevated ->bi_cnt */
-#define BIO_THROTTLED	9	/* This bio has already been subjected to
+#define BIO_WORKINGSET	6	/* contains userspace workingset pages */
+#define BIO_QUIET	7	/* Make BIO Quiet */
+#define BIO_CHAIN	8	/* chained bio, ->bi_remaining in effect */
+#define BIO_REFFED	9	/* bio has elevated ->bi_cnt */
+#define BIO_THROTTLED	10	/* This bio has already been subjected to
 				 * throttling rules. Don't do it again. */
-#define BIO_TRACE_COMPLETION 10	/* bio_endio() should trace the final completion
+#define BIO_TRACE_COMPLETION 11	/* bio_endio() should trace the final completion
 				 * of this bio. */
-#define BIO_QUEUE_ENTERED 11	/* can use blk_queue_enter_live() */
+#define BIO_QUEUE_ENTERED 12	/* can use blk_queue_enter_live() */
 
 /* See BVEC_POOL_OFFSET below before adding new flags */
 
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index d51e10f..d01246c 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -43,6 +43,7 @@
 struct rq_qos;
 struct blk_queue_stats;
 struct blk_stat_callback;
+struct keyslot_manager;
 
 #define BLKDEV_MIN_RQ	4
 #define BLKDEV_MAX_RQ	128	/* Default maximum */
@@ -574,6 +575,10 @@
 	 * queue_lock internally, e.g. scsi_request_fn().
 	 */
 	unsigned int		request_fn_active;
+#ifdef CONFIG_BLK_INLINE_ENCRYPTION
+	/* Inline crypto capabilities */
+	struct keyslot_manager *ksm;
+#endif
 
 	unsigned int		rq_timeout;
 	int			poll_nsec;
diff --git a/include/linux/cfi.h b/include/linux/cfi.h
new file mode 100644
index 0000000..e27033d
--- /dev/null
+++ b/include/linux/cfi.h
@@ -0,0 +1,38 @@
+#ifndef _LINUX_CFI_H
+#define _LINUX_CFI_H
+
+#include <linux/stringify.h>
+
+#ifdef CONFIG_CFI_CLANG
+#ifdef CONFIG_MODULES
+
+typedef void (*cfi_check_fn)(uint64_t, void *, void *);
+
+/* Compiler-generated function in each module, and the kernel */
+#define CFI_CHECK_FN		__cfi_check
+#define CFI_CHECK_FN_NAME	__stringify(CFI_CHECK_FN)
+
+extern void CFI_CHECK_FN(uint64_t, void *, void *);
+
+#ifdef CONFIG_CFI_CLANG_SHADOW
+extern void cfi_module_add(struct module *mod, unsigned long min_addr,
+	unsigned long max_addr);
+
+extern void cfi_module_remove(struct module *mod, unsigned long min_addr,
+	unsigned long max_addr);
+#else
+static inline void cfi_module_add(struct module *mod, unsigned long min_addr,
+	unsigned long max_addr)
+{
+}
+
+static inline void cfi_module_remove(struct module *mod, unsigned long min_addr,
+	unsigned long max_addr)
+{
+}
+#endif /* CONFIG_CFI_CLANG_SHADOW */
+
+#endif /* CONFIG_MODULES */
+#endif /* CONFIG_CFI_CLANG */
+
+#endif /* _LINUX_CFI_H */
diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h
index a01ebb630..e78086c 100644
--- a/include/linux/cgroup-defs.h
+++ b/include/linux/cgroup-defs.h
@@ -20,6 +20,7 @@
 #include <linux/u64_stats_sync.h>
 #include <linux/workqueue.h>
 #include <linux/bpf-cgroup.h>
+#include <linux/psi_types.h>
 
 #ifdef CONFIG_CGROUPS
 
@@ -31,6 +32,7 @@
 struct kernfs_ops;
 struct kernfs_open_file;
 struct seq_file;
+struct poll_table_struct;
 
 #define MAX_CGROUP_TYPE_NAMELEN 32
 #define MAX_CGROUP_ROOT_NAMELEN 64
@@ -442,6 +444,9 @@
 	/* used to schedule release agent */
 	struct work_struct release_agent_work;
 
+	/* used to track pressure stalls */
+	struct psi_group psi;
+
 	/* used to store eBPF programs */
 	struct cgroup_bpf bpf;
 
@@ -575,6 +580,9 @@
 	ssize_t (*write)(struct kernfs_open_file *of,
 			 char *buf, size_t nbytes, loff_t off);
 
+	__poll_t (*poll)(struct kernfs_open_file *of,
+			 struct poll_table_struct *pt);
+
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 	struct lock_class_key	lockdep_key;
 #endif
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index b4854b4..7fd81b7 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -668,6 +668,11 @@
 	pr_cont_kernfs_path(cgrp->kn);
 }
 
+static inline struct psi_group *cgroup_psi(struct cgroup *cgrp)
+{
+	return &cgrp->psi;
+}
+
 static inline void cgroup_init_kthreadd(void)
 {
 	/*
@@ -722,6 +727,16 @@
 	return NULL;
 }
 
+static inline struct cgroup *cgroup_parent(struct cgroup *cgrp)
+{
+	return NULL;
+}
+
+static inline struct psi_group *cgroup_psi(struct cgroup *cgrp)
+{
+	return NULL;
+}
+
 static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
 					       struct cgroup *ancestor)
 {
diff --git a/include/linux/cgroup_subsys.h b/include/linux/cgroup_subsys.h
index acb77dcf..8996c09 100644
--- a/include/linux/cgroup_subsys.h
+++ b/include/linux/cgroup_subsys.h
@@ -21,6 +21,10 @@
 SUBSYS(cpuacct)
 #endif
 
+#if IS_ENABLED(CONFIG_SCHED_TUNE)
+SUBSYS(schedtune)
+#endif
+
 #if IS_ENABLED(CONFIG_BLK_CGROUP)
 SUBSYS(io)
 #endif
diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h
index d756f23..f1cc965 100644
--- a/include/linux/compiler-clang.h
+++ b/include/linux/compiler-clang.h
@@ -15,12 +15,17 @@
 /* all clang versions usable with the kernel support KASAN ABI version 5 */
 #define KASAN_ABI_VERSION 5
 
-/* emulate gcc's __SANITIZE_ADDRESS__ flag */
-#if __has_feature(address_sanitizer)
-#define __SANITIZE_ADDRESS__
-#endif
+/* __no_sanitize_address has been already defined compiler-gcc.h */
+#undef __no_sanitize_address
 
-#define __no_sanitize_address __attribute__((no_sanitize("address")))
+#if __has_feature(address_sanitizer) || __has_feature(hwaddress_sanitizer)
+/* emulate gcc's __SANITIZE_ADDRESS__ flag */
+#define __SANITIZE_ADDRESS__
+#define __no_sanitize_address \
+		__attribute__((no_sanitize("address", "hwaddress")))
+#else
+#define __no_sanitize_address
+#endif
 
 /*
  * Not all versions of clang implement the the type-generic versions
@@ -43,3 +48,18 @@
 #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
 #define __assume_aligned(a, ...)	\
 	__attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
+
+#ifdef CONFIG_LTO_CLANG
+#ifdef CONFIG_FTRACE_MCOUNT_RECORD
+#define __norecordmcount \
+	__attribute__((__section__(".text..ftrace")))
+#endif
+
+#define __nocfi		__attribute__((no_sanitize("cfi")))
+#endif
+
+#if __has_feature(shadow_call_stack)
+# define __noscs	__attribute__((__no_sanitize__("shadow-call-stack")))
+#else
+# define __noscs
+#endif
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index 3ebee1c..ca37bdd0 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -183,13 +183,19 @@
 #define KASAN_ABI_VERSION 3
 #endif
 
-#if GCC_VERSION >= 40902
 /*
- * Tell the compiler that address safety instrumentation (KASAN)
- * should not be applied to that function.
- * Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
+ * Older GCCs (< 5) don't support __has_attribute, so instead of checking
+ * __has_attribute(__no_sanitize_address__) do a GCC version check.
  */
+#ifndef __has_attribute
+# define __has_attribute(x) __GCC4_has_attribute_##x
+# define __GCC4_has_attribute___no_sanitize_address__ (__GNUC_MINOR__ >= 8)
+#endif
+
+#if __has_attribute(__no_sanitize_address__)
 #define __no_sanitize_address __attribute__((no_sanitize_address))
+#else
+#define __no_sanitize_address
 #endif
 
 #if GCC_VERSION >= 50100
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index bb22908..c9fd57b 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -200,7 +200,7 @@
  * 	https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
  * '__maybe_unused' allows us to avoid defined-but-not-used warnings.
  */
-# define __no_kasan_or_inline __no_sanitize_address __maybe_unused
+# define __no_kasan_or_inline __no_sanitize_address notrace __maybe_unused
 #else
 # define __no_kasan_or_inline __always_inline
 #endif
diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
index 2b8ed70..3e44377 100644
--- a/include/linux/compiler_types.h
+++ b/include/linux/compiler_types.h
@@ -144,6 +144,10 @@
 #define __visible
 #endif
 
+#ifndef __noscs
+# define __noscs
+#endif
+
 /*
  * Assume alignment of return value.
  */
@@ -256,6 +260,14 @@
 # define __gnu_inline
 #endif
 
+#ifndef __norecordmcount
+#define __norecordmcount
+#endif
+
+#ifndef __nocfi
+#define __nocfi
+#endif
+
 /*
  * Force always-inline if the user requests it so via the .config.
  * GCC does not warn about unused static inline functions for
diff --git a/include/linux/coresight-pmu.h b/include/linux/coresight-pmu.h
index a1a959b..b0e35ee 100644
--- a/include/linux/coresight-pmu.h
+++ b/include/linux/coresight-pmu.h
@@ -12,11 +12,13 @@
 
 /* ETMv3.5/PTM's ETMCR config bit */
 #define ETM_OPT_CYCACC  12
+#define ETM_OPT_CTXTID	14
 #define ETM_OPT_TS      28
 #define ETM_OPT_RETSTK	29
 
 /* ETMv4 CONFIGR programming bits for the ETM OPTs */
 #define ETM4_CFG_BIT_CYCACC	4
+#define ETM4_CFG_BIT_CTXTID	6
 #define ETM4_CFG_BIT_TS		11
 #define ETM4_CFG_BIT_RETSTK	12
 
diff --git a/include/linux/coresight.h b/include/linux/coresight.h
index d828a6e..d29f7ea 100644
--- a/include/linux/coresight.h
+++ b/include/linux/coresight.h
@@ -159,8 +159,9 @@
  * @orphan:	true if the component has connections that haven't been linked.
  * @enable:	'true' if component is currently part of an active path.
  * @activated:	'true' only if a _sink_ has been activated.  A sink can be
-		activated but not yet enabled.  Enabling for a _sink_
-		happens when a source has been selected for that it.
+ *		activated but not yet enabled.  Enabling for a _sink_
+ *		appens when a source has been selected for that it.
+ * @ea:		Device attribute for sink representation under PMU directory.
  */
 struct coresight_device {
 	struct coresight_connection *conns;
@@ -173,7 +174,9 @@
 	atomic_t *refcnt;
 	bool orphan;
 	bool enable;	/* true only if configured as part of a path */
+	/* sink specific fields */
 	bool activated;	/* true only if a sink is part of a path */
+	struct dev_ext_attribute *ea;
 };
 
 #define to_coresight_device(d) container_of(d, struct coresight_device, dev)
@@ -190,23 +193,16 @@
  * @disable:		disables the sink.
  * @alloc_buffer:	initialises perf's ring buffer for trace collection.
  * @free_buffer:	release memory allocated in @get_config.
- * @set_buffer:		initialises buffer mechanic before a trace session.
- * @reset_buffer:	finalises buffer mechanic after a trace session.
  * @update_buffer:	update buffer pointers after a trace session.
  */
 struct coresight_ops_sink {
-	int (*enable)(struct coresight_device *csdev, u32 mode);
-	void (*disable)(struct coresight_device *csdev);
-	void *(*alloc_buffer)(struct coresight_device *csdev, int cpu,
-			      void **pages, int nr_pages, bool overwrite);
+	int (*enable)(struct coresight_device *csdev, u32 mode, void *data);
+	int (*disable)(struct coresight_device *csdev);
+	void *(*alloc_buffer)(struct coresight_device *csdev,
+			      struct perf_event *event, void **pages,
+			      int nr_pages, bool overwrite);
 	void (*free_buffer)(void *config);
-	int (*set_buffer)(struct coresight_device *csdev,
-			  struct perf_output_handle *handle,
-			  void *sink_config);
-	unsigned long (*reset_buffer)(struct coresight_device *csdev,
-				      struct perf_output_handle *handle,
-				      void *sink_config);
-	void (*update_buffer)(struct coresight_device *csdev,
+	unsigned long (*update_buffer)(struct coresight_device *csdev,
 			      struct perf_output_handle *handle,
 			      void *sink_config);
 };
@@ -270,6 +266,14 @@
 extern void coresight_disable(struct coresight_device *csdev);
 extern int coresight_timeout(void __iomem *addr, u32 offset,
 			     int position, int value);
+
+extern int coresight_claim_device(void __iomem *base);
+extern int coresight_claim_device_unlocked(void __iomem *base);
+
+extern void coresight_disclaim_device(void __iomem *base);
+extern void coresight_disclaim_device_unlocked(void __iomem *base);
+
+extern bool coresight_loses_context_with_cpu(struct device *dev);
 #else
 static inline struct coresight_device *
 coresight_register(struct coresight_desc *desc) { return NULL; }
@@ -279,6 +283,23 @@
 static inline void coresight_disable(struct coresight_device *csdev) {}
 static inline int coresight_timeout(void __iomem *addr, u32 offset,
 				     int position, int value) { return 1; }
+static inline int coresight_claim_device_unlocked(void __iomem *base)
+{
+	return -EINVAL;
+}
+
+static inline int coresight_claim_device(void __iomem *base)
+{
+	return -EINVAL;
+}
+
+static inline void coresight_disclaim_device(void __iomem *base) {}
+static inline void coresight_disclaim_device_unlocked(void __iomem *base) {}
+
+static inline bool coresight_loses_context_with_cpu(struct device *dev)
+{
+	return false;
+}
 #endif
 
 #ifdef CONFIG_OF
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 3361663..7aca9d0 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -931,11 +931,21 @@
 }
 #endif
 
+#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
+void sched_cpufreq_governor_change(struct cpufreq_policy *policy,
+			struct cpufreq_governor *old_gov);
+#else
+static inline void sched_cpufreq_governor_change(struct cpufreq_policy *policy,
+			struct cpufreq_governor *old_gov) { }
+#endif
+
 extern void arch_freq_prepare_all(void);
 extern unsigned int arch_freq_get_on_cpu(int cpu);
 
 extern void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq,
 				unsigned long max_freq);
+extern void arch_set_max_freq_scale(struct cpumask *cpus,
+				    unsigned long policy_max_freq);
 
 /* the following are really really optional */
 extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
diff --git a/include/linux/cpufreq_times.h b/include/linux/cpufreq_times.h
new file mode 100644
index 0000000..0eb6dc9
--- /dev/null
+++ b/include/linux/cpufreq_times.h
@@ -0,0 +1,46 @@
+/* drivers/cpufreq/cpufreq_times.c
+ *
+ * Copyright (C) 2018 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ *
+ */
+
+#ifndef _LINUX_CPUFREQ_TIMES_H
+#define _LINUX_CPUFREQ_TIMES_H
+
+#include <linux/cpufreq.h>
+#include <linux/pid.h>
+
+#ifdef CONFIG_CPU_FREQ_TIMES
+void cpufreq_task_times_init(struct task_struct *p);
+void cpufreq_task_times_alloc(struct task_struct *p);
+void cpufreq_task_times_exit(struct task_struct *p);
+int proc_time_in_state_show(struct seq_file *m, struct pid_namespace *ns,
+			    struct pid *pid, struct task_struct *p);
+void cpufreq_acct_update_power(struct task_struct *p, u64 cputime);
+void cpufreq_times_create_policy(struct cpufreq_policy *policy);
+void cpufreq_times_record_transition(struct cpufreq_policy *policy,
+                                     unsigned int new_freq);
+void cpufreq_task_times_remove_uids(uid_t uid_start, uid_t uid_end);
+int single_uid_time_in_state_open(struct inode *inode, struct file *file);
+#else
+static inline void cpufreq_task_times_init(struct task_struct *p) {}
+static inline void cpufreq_task_times_alloc(struct task_struct *p) {}
+static inline void cpufreq_task_times_exit(struct task_struct *p) {}
+static inline void cpufreq_acct_update_power(struct task_struct *p,
+					     u64 cputime) {}
+static inline void cpufreq_times_create_policy(struct cpufreq_policy *policy) {}
+static inline void cpufreq_times_record_transition(
+	struct cpufreq_policy *policy, unsigned int new_freq) {}
+static inline void cpufreq_task_times_remove_uids(uid_t uid_start,
+						  uid_t uid_end) {}
+#endif /* CONFIG_CPU_FREQ_TIMES */
+#endif /* _LINUX_CPUFREQ_TIMES_H */
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h
index 317aeca..8ccffba8 100644
--- a/include/linux/cpuidle.h
+++ b/include/linux/cpuidle.h
@@ -220,7 +220,7 @@
 #endif
 
 /* kernel/sched/idle.c */
-extern void sched_idle_set_state(struct cpuidle_state *idle_state);
+extern void sched_idle_set_state(struct cpuidle_state *idle_state, int index);
 extern void default_idle_call(void);
 
 #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index 0880bae..486fc3c 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -146,6 +146,7 @@
 	struct vfsmount *(*d_automount)(struct path *);
 	int (*d_manage)(const struct path *, bool);
 	struct dentry *(*d_real)(struct dentry *, const struct inode *);
+	void (*d_canonical_path)(const struct path *, struct path *);
 } ____cacheline_aligned;
 
 /*
@@ -210,7 +211,7 @@
 
 #define DCACHE_MAY_FREE			0x00800000
 #define DCACHE_FALLTHRU			0x01000000 /* Fall through to lower layer */
-#define DCACHE_ENCRYPTED_WITH_KEY	0x02000000 /* dir is encrypted with a valid key */
+#define DCACHE_ENCRYPTED_NAME		0x02000000 /* Encrypted name (dir key was unavailable) */
 #define DCACHE_OP_REAL			0x04000000
 
 #define DCACHE_PAR_LOOKUP		0x10000000 /* being looked up (with parent locked shared) */
diff --git a/include/linux/delayacct.h b/include/linux/delayacct.h
index 31c865d..577d1b2 100644
--- a/include/linux/delayacct.h
+++ b/include/linux/delayacct.h
@@ -57,7 +57,12 @@
 
 	u64 freepages_start;
 	u64 freepages_delay;	/* wait for memory reclaim */
+
+	u64 thrashing_start;
+	u64 thrashing_delay;	/* wait for thrashing page */
+
 	u32 freepages_count;	/* total count of memory reclaim */
+	u32 thrashing_count;	/* total count of thrash waits */
 };
 #endif
 
@@ -76,6 +81,8 @@
 extern __u64 __delayacct_blkio_ticks(struct task_struct *);
 extern void __delayacct_freepages_start(void);
 extern void __delayacct_freepages_end(void);
+extern void __delayacct_thrashing_start(void);
+extern void __delayacct_thrashing_end(void);
 
 static inline int delayacct_is_task_waiting_on_io(struct task_struct *p)
 {
@@ -156,6 +163,18 @@
 		__delayacct_freepages_end();
 }
 
+static inline void delayacct_thrashing_start(void)
+{
+	if (current->delays)
+		__delayacct_thrashing_start();
+}
+
+static inline void delayacct_thrashing_end(void)
+{
+	if (current->delays)
+		__delayacct_thrashing_end();
+}
+
 #else
 static inline void delayacct_set_flag(int flag)
 {}
@@ -182,6 +201,10 @@
 {}
 static inline void delayacct_freepages_end(void)
 {}
+static inline void delayacct_thrashing_start(void)
+{}
+static inline void delayacct_thrashing_end(void)
+{}
 
 #endif /* CONFIG_TASK_DELAY_ACCT */
 
diff --git a/include/linux/device.h b/include/linux/device.h
index 19dd885..5133829 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -79,6 +79,13 @@
  *		that generate uevents to add the environment variables.
  * @probe:	Called when a new device or driver add to this bus, and callback
  *		the specific driver's probe to initial the matched device.
+ * @sync_state:	Called to sync device state to software state after all the
+ *		state tracking consumers linked to this device (present at
+ *		the time of late_initcall) have successfully bound to a
+ *		driver. If the device has no consumers, this function will
+ *		be called at late_initcall_sync level. If the device has
+ *		consumers that are never bound to a driver, this function
+ *		will never get called until they do.
  * @remove:	Called when a device removed from this bus.
  * @shutdown:	Called at shut-down time to quiesce the device.
  *
@@ -122,6 +129,7 @@
 	int (*match)(struct device *dev, struct device_driver *drv);
 	int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
 	int (*probe)(struct device *dev);
+	void (*sync_state)(struct device *dev);
 	int (*remove)(struct device *dev);
 	void (*shutdown)(struct device *dev);
 
@@ -251,6 +259,13 @@
  * @probe:	Called to query the existence of a specific device,
  *		whether this driver can work with it, and bind the driver
  *		to a specific device.
+ * @sync_state:	Called to sync device state to software state after all the
+ *		state tracking consumers linked to this device (present at
+ *		the time of late_initcall) have successfully bound to a
+ *		driver. If the device has no consumers, this function will
+ *		be called at late_initcall_sync level. If the device has
+ *		consumers that are never bound to a driver, this function
+ *		will never get called until they do.
  * @remove:	Called when the device is removed from the system to
  *		unbind a device from this driver.
  * @shutdown:	Called at shut-down time to quiesce the device.
@@ -288,6 +303,7 @@
 	const struct acpi_device_id	*acpi_match_table;
 
 	int (*probe) (struct device *dev);
+	void (*sync_state)(struct device *dev);
 	int (*remove) (struct device *dev);
 	void (*shutdown) (struct device *dev);
 	int (*suspend) (struct device *dev, pm_message_t state);
@@ -823,12 +839,14 @@
  * PM_RUNTIME: If set, the runtime PM framework will use this link.
  * RPM_ACTIVE: Run pm_runtime_get_sync() on the supplier during link creation.
  * AUTOREMOVE_SUPPLIER: Remove the link automatically on supplier driver unbind.
+ * SYNC_STATE_ONLY: Link only affects sync_state() behavior.
  */
 #define DL_FLAG_STATELESS		BIT(0)
 #define DL_FLAG_AUTOREMOVE_CONSUMER	BIT(1)
 #define DL_FLAG_PM_RUNTIME		BIT(2)
 #define DL_FLAG_RPM_ACTIVE		BIT(3)
 #define DL_FLAG_AUTOREMOVE_SUPPLIER	BIT(4)
+#define DL_FLAG_SYNC_STATE_ONLY		BIT(7)
 
 /**
  * struct device_link - Device link representation.
@@ -874,11 +892,18 @@
  * struct dev_links_info - Device data related to device links.
  * @suppliers: List of links to supplier devices.
  * @consumers: List of links to consumer devices.
+ * @needs_suppliers: Hook to global list of devices waiting for suppliers.
+ * @defer_sync: Hook to global list of devices that have deferred sync_state.
+ * @need_for_probe: If needs_suppliers is on a list, this indicates if the
+ *		    suppliers are needed for probe or not.
  * @status: Driver status information.
  */
 struct dev_links_info {
 	struct list_head suppliers;
 	struct list_head consumers;
+	struct list_head needs_suppliers;
+	struct list_head defer_sync;
+	bool need_for_probe;
 	enum dl_dev_state status;
 };
 
@@ -951,6 +976,9 @@
  * @offline:	Set after successful invocation of bus type's .offline().
  * @of_node_reused: Set if the device-tree node is shared with an ancestor
  *              device.
+ * @state_synced: The hardware state of this device has been synced to match
+ *		  the software state of this device by calling the driver/bus
+ *		  sync_state() callback.
  *
  * At the lowest level, every device in a Linux system is represented by an
  * instance of struct device. The device structure contains the information
@@ -1040,6 +1068,7 @@
 	bool			offline_disabled:1;
 	bool			offline:1;
 	bool			of_node_reused:1;
+	bool			state_synced:1;
 };
 
 static inline struct device *kobj_to_dev(struct kobject *kobj)
@@ -1144,6 +1173,16 @@
 	return !!dev->power.async_suspend;
 }
 
+static inline bool device_pm_not_required(struct device *dev)
+{
+	return dev->power.no_pm;
+}
+
+static inline void device_set_pm_not_required(struct device *dev)
+{
+	dev->power.no_pm = true;
+}
+
 static inline void dev_pm_syscore_device(struct device *dev, bool val)
 {
 #ifdef CONFIG_PM_SLEEP
@@ -1355,6 +1394,8 @@
 				    struct device *supplier, u32 flags);
 void device_link_del(struct device_link *link);
 void device_link_remove(void *consumer, struct device *supplier);
+void device_links_supplier_sync_state_pause(void);
+void device_links_supplier_sync_state_resume(void);
 
 #ifndef dev_fmt
 #define dev_fmt(fmt) fmt
diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
index 58725f8..582998e 100644
--- a/include/linux/dma-buf.h
+++ b/include/linux/dma-buf.h
@@ -255,10 +255,12 @@
  * @file: file pointer used for sharing buffers across, and for refcounting.
  * @attachments: list of dma_buf_attachment that denotes all devices attached.
  * @ops: dma_buf_ops associated with this buffer object.
- * @lock: used internally to serialize list manipulation, attach/detach and vmap/unmap
+ * @lock: used internally to serialize list manipulation, attach/detach and
+ *        vmap/unmap, and accesses to name
  * @vmapping_counter: used internally to refcnt the vmaps
  * @vmap_ptr: the current vmap ptr if vmapping_counter > 0
  * @exp_name: name of the exporter; useful for debugging.
+ * @name: userspace-provided name; useful for accounting and debugging.
  * @owner: pointer to exporter module; used for refcounting when exporter is a
  *         kernel module.
  * @list_node: node for dma_buf accounting and debugging.
@@ -286,6 +288,7 @@
 	unsigned vmapping_counter;
 	void *vmap_ptr;
 	const char *exp_name;
+	const char *name;
 	struct module *owner;
 	struct list_head list_node;
 	void *priv;
diff --git a/include/linux/energy_model.h b/include/linux/energy_model.h
new file mode 100644
index 0000000..aa027f7
--- /dev/null
+++ b/include/linux/energy_model.h
@@ -0,0 +1,187 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_ENERGY_MODEL_H
+#define _LINUX_ENERGY_MODEL_H
+#include <linux/cpumask.h>
+#include <linux/jump_label.h>
+#include <linux/kobject.h>
+#include <linux/rcupdate.h>
+#include <linux/sched/cpufreq.h>
+#include <linux/sched/topology.h>
+#include <linux/types.h>
+
+#ifdef CONFIG_ENERGY_MODEL
+/**
+ * em_cap_state - Capacity state of a performance domain
+ * @frequency:	The CPU frequency in KHz, for consistency with CPUFreq
+ * @power:	The power consumed by 1 CPU at this level, in milli-watts
+ * @cost:	The cost coefficient associated with this level, used during
+ *		energy calculation. Equal to: power * max_frequency / frequency
+ */
+struct em_cap_state {
+	unsigned long frequency;
+	unsigned long power;
+	unsigned long cost;
+};
+
+/**
+ * em_perf_domain - Performance domain
+ * @table:		List of capacity states, in ascending order
+ * @nr_cap_states:	Number of capacity states
+ * @cpus:		Cpumask covering the CPUs of the domain
+ *
+ * A "performance domain" represents a group of CPUs whose performance is
+ * scaled together. All CPUs of a performance domain must have the same
+ * micro-architecture. Performance domains often have a 1-to-1 mapping with
+ * CPUFreq policies.
+ */
+struct em_perf_domain {
+	struct em_cap_state *table;
+	int nr_cap_states;
+	unsigned long cpus[0];
+};
+
+#define EM_CPU_MAX_POWER 0xFFFF
+
+struct em_data_callback {
+	/**
+	 * active_power() - Provide power at the next capacity state of a CPU
+	 * @power	: Active power at the capacity state in mW (modified)
+	 * @freq	: Frequency at the capacity state in kHz (modified)
+	 * @cpu		: CPU for which we do this operation
+	 *
+	 * active_power() must find the lowest capacity state of 'cpu' above
+	 * 'freq' and update 'power' and 'freq' to the matching active power
+	 * and frequency.
+	 *
+	 * The power is the one of a single CPU in the domain, expressed in
+	 * milli-watts. It is expected to fit in the [0, EM_CPU_MAX_POWER]
+	 * range.
+	 *
+	 * Return 0 on success.
+	 */
+	int (*active_power)(unsigned long *power, unsigned long *freq, int cpu);
+};
+#define EM_DATA_CB(_active_power_cb) { .active_power = &_active_power_cb }
+
+struct em_perf_domain *em_cpu_get(int cpu);
+int em_register_perf_domain(cpumask_t *span, unsigned int nr_states,
+						struct em_data_callback *cb);
+
+/**
+ * em_pd_energy() - Estimates the energy consumed by the CPUs of a perf. domain
+ * @pd		: performance domain for which energy has to be estimated
+ * @max_util	: highest utilization among CPUs of the domain
+ * @sum_util	: sum of the utilization of all CPUs in the domain
+ *
+ * Return: the sum of the energy consumed by the CPUs of the domain assuming
+ * a capacity state satisfying the max utilization of the domain.
+ */
+static inline unsigned long em_pd_energy(struct em_perf_domain *pd,
+				unsigned long max_util, unsigned long sum_util)
+{
+	unsigned long freq, scale_cpu;
+	struct em_cap_state *cs;
+	int i, cpu;
+
+	/*
+	 * In order to predict the capacity state, map the utilization of the
+	 * most utilized CPU of the performance domain to a requested frequency,
+	 * like schedutil.
+	 */
+	cpu = cpumask_first(to_cpumask(pd->cpus));
+	scale_cpu = arch_scale_cpu_capacity(NULL, cpu);
+	cs = &pd->table[pd->nr_cap_states - 1];
+	freq = map_util_freq(max_util, cs->frequency, scale_cpu);
+
+	/*
+	 * Find the lowest capacity state of the Energy Model above the
+	 * requested frequency.
+	 */
+	for (i = 0; i < pd->nr_cap_states; i++) {
+		cs = &pd->table[i];
+		if (cs->frequency >= freq)
+			break;
+	}
+
+	/*
+	 * The capacity of a CPU in the domain at that capacity state (cs)
+	 * can be computed as:
+	 *
+	 *             cs->freq * scale_cpu
+	 *   cs->cap = --------------------                          (1)
+	 *                 cpu_max_freq
+	 *
+	 * So, ignoring the costs of idle states (which are not available in
+	 * the EM), the energy consumed by this CPU at that capacity state is
+	 * estimated as:
+	 *
+	 *             cs->power * cpu_util
+	 *   cpu_nrg = --------------------                          (2)
+	 *                   cs->cap
+	 *
+	 * since 'cpu_util / cs->cap' represents its percentage of busy time.
+	 *
+	 *   NOTE: Although the result of this computation actually is in
+	 *         units of power, it can be manipulated as an energy value
+	 *         over a scheduling period, since it is assumed to be
+	 *         constant during that interval.
+	 *
+	 * By injecting (1) in (2), 'cpu_nrg' can be re-expressed as a product
+	 * of two terms:
+	 *
+	 *             cs->power * cpu_max_freq   cpu_util
+	 *   cpu_nrg = ------------------------ * ---------          (3)
+	 *                    cs->freq            scale_cpu
+	 *
+	 * The first term is static, and is stored in the em_cap_state struct
+	 * as 'cs->cost'.
+	 *
+	 * Since all CPUs of the domain have the same micro-architecture, they
+	 * share the same 'cs->cost', and the same CPU capacity. Hence, the
+	 * total energy of the domain (which is the simple sum of the energy of
+	 * all of its CPUs) can be factorized as:
+	 *
+	 *            cs->cost * \Sum cpu_util
+	 *   pd_nrg = ------------------------                       (4)
+	 *                  scale_cpu
+	 */
+	return cs->cost * sum_util / scale_cpu;
+}
+
+/**
+ * em_pd_nr_cap_states() - Get the number of capacity states of a perf. domain
+ * @pd		: performance domain for which this must be done
+ *
+ * Return: the number of capacity states in the performance domain table
+ */
+static inline int em_pd_nr_cap_states(struct em_perf_domain *pd)
+{
+	return pd->nr_cap_states;
+}
+
+#else
+struct em_perf_domain {};
+struct em_data_callback {};
+#define EM_DATA_CB(_active_power_cb) { }
+
+static inline int em_register_perf_domain(cpumask_t *span,
+			unsigned int nr_states, struct em_data_callback *cb)
+{
+	return -EINVAL;
+}
+static inline struct em_perf_domain *em_cpu_get(int cpu)
+{
+	return NULL;
+}
+static inline unsigned long em_pd_energy(struct em_perf_domain *pd,
+			unsigned long max_util, unsigned long sum_util)
+{
+	return 0;
+}
+static inline int em_pd_nr_cap_states(struct em_perf_domain *pd)
+{
+	return 0;
+}
+#endif
+
+#endif
diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h
index 40fec5f..2847389 100644
--- a/include/linux/f2fs_fs.h
+++ b/include/linux/f2fs_fs.h
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /**
  * include/linux/f2fs_fs.h
  *
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 #ifndef _LINUX_F2FS_FS_H
 #define _LINUX_F2FS_FS_H
@@ -39,11 +36,17 @@
 
 #define F2FS_MAX_QUOTAS		3
 
+#define F2FS_ENC_UTF8_12_1	1
+#define F2FS_ENC_STRICT_MODE_FL	(1 << 0)
+#define f2fs_has_strict_mode(sbi) \
+	(sbi->s_encoding_flags & F2FS_ENC_STRICT_MODE_FL)
+
 #define F2FS_IO_SIZE(sbi)	(1 << F2FS_OPTION(sbi).write_io_size_bits) /* Blocks */
 #define F2FS_IO_SIZE_KB(sbi)	(1 << (F2FS_OPTION(sbi).write_io_size_bits + 2)) /* KB */
 #define F2FS_IO_SIZE_BYTES(sbi)	(1 << (F2FS_OPTION(sbi).write_io_size_bits + 12)) /* B */
 #define F2FS_IO_SIZE_BITS(sbi)	(F2FS_OPTION(sbi).write_io_size_bits) /* power of 2 */
 #define F2FS_IO_SIZE_MASK(sbi)	(F2FS_IO_SIZE(sbi) - 1)
+#define F2FS_IO_ALIGNED(sbi)	(F2FS_IO_SIZE(sbi) > 1)
 
 /* This flag is used by node and meta inodes, and by recovery */
 #define GFP_F2FS_ZERO		(GFP_NOFS | __GFP_ZERO)
@@ -112,12 +115,18 @@
 	struct f2fs_device devs[MAX_DEVICES];	/* device list */
 	__le32 qf_ino[F2FS_MAX_QUOTAS];	/* quota inode numbers */
 	__u8 hot_ext_count;		/* # of hot file extension */
-	__u8 reserved[314];		/* valid reserved region */
+	__le16  s_encoding;		/* Filename charset encoding */
+	__le16  s_encoding_flags;	/* Filename charset encoding flags */
+	__u8 reserved[306];		/* valid reserved region */
+	__le32 crc;			/* checksum of superblock */
 } __packed;
 
 /*
  * For checkpoint
  */
+#define CP_DISABLED_QUICK_FLAG		0x00002000
+#define CP_DISABLED_FLAG		0x00001000
+#define CP_QUOTA_NEED_FSCK_FLAG		0x00000800
 #define CP_LARGE_NAT_BITMAP_FLAG	0x00000400
 #define CP_NOCRC_RECOVERY_FLAG	0x00000200
 #define CP_TRIMMED_FLAG		0x00000100
@@ -163,6 +172,10 @@
 	unsigned char sit_nat_version_bitmap[1];
 } __packed;
 
+#define CP_CHKSUM_OFFSET	4092	/* default chksum offset in checkpoint */
+#define CP_MIN_CHKSUM_OFFSET						\
+	(offsetof(struct f2fs_checkpoint, sit_nat_version_bitmap))
+
 /*
  * For orphan inode management
  */
@@ -186,7 +199,7 @@
 struct f2fs_extent {
 	__le32 fofs;		/* start file offset of the extent */
 	__le32 blk;		/* start block address of the extent */
-	__le32 len;		/* lengh of the extent */
+	__le32 len;		/* length of the extent */
 } __packed;
 
 #define F2FS_NAME_LEN		255
@@ -197,11 +210,12 @@
 					get_extra_isize(inode))
 #define DEF_NIDS_PER_INODE	5	/* Node IDs in an Inode */
 #define ADDRS_PER_INODE(inode)	addrs_per_inode(inode)
-#define ADDRS_PER_BLOCK		1018	/* Address Pointers in a Direct Block */
+#define DEF_ADDRS_PER_BLOCK	1018	/* Address Pointers in a Direct Block */
+#define ADDRS_PER_BLOCK(inode)	addrs_per_block(inode)
 #define NIDS_PER_BLOCK		1018	/* Node IDs in an Indirect Block */
 
 #define ADDRS_PER_PAGE(page, inode)	\
-	(IS_INODE(page) ? ADDRS_PER_INODE(inode) : ADDRS_PER_BLOCK)
+	(IS_INODE(page) ? ADDRS_PER_INODE(inode) : ADDRS_PER_BLOCK(inode))
 
 #define	NODE_DIR1_BLOCK		(DEF_ADDRS_PER_INODE + 1)
 #define	NODE_DIR2_BLOCK		(DEF_ADDRS_PER_INODE + 2)
@@ -266,7 +280,7 @@
 } __packed;
 
 struct direct_node {
-	__le32 addr[ADDRS_PER_BLOCK];	/* array of data block address */
+	__le32 addr[DEF_ADDRS_PER_BLOCK];	/* array of data block address */
 } __packed;
 
 struct indirect_node {
@@ -284,7 +298,7 @@
 
 struct node_footer {
 	__le32 nid;		/* node id */
-	__le32 ino;		/* inode nunmber */
+	__le32 ino;		/* inode number */
 	__le32 flag;		/* include cold/fsync/dentry marks and offset */
 	__le64 cp_ver;		/* checkpoint version */
 	__le32 next_blkaddr;	/* next node page block address */
@@ -512,7 +526,7 @@
 struct f2fs_dir_entry {
 	__le32 hash_code;	/* hash code of file name */
 	__le32 ino;		/* inode number */
-	__le16 name_len;	/* lengh of file name */
+	__le16 name_len;	/* length of file name */
 	__u8 file_type;		/* file type */
 } __packed;
 
diff --git a/include/linux/filter.h b/include/linux/filter.h
index 3705c6f..8955754 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -466,7 +466,12 @@
 	struct sock_filter	*filter;
 };
 
+#define BPF_BINARY_HEADER_MAGIC	0x05de0e82
+
 struct bpf_binary_header {
+#ifdef CONFIG_CFI_CLANG
+	u32 magic;
+#endif
 	u32 pages;
 	/* Some arches need word alignment for their instructions */
 	u8 image[] __aligned(4);
@@ -506,7 +511,62 @@
 	struct bpf_prog	*prog;
 };
 
-#define BPF_PROG_RUN(filter, ctx)  (*(filter)->bpf_func)(ctx, (filter)->insnsi)
+#if IS_ENABLED(CONFIG_BPF_JIT) && IS_ENABLED(CONFIG_CFI_CLANG)
+/*
+ * With JIT, the kernel makes an indirect call to dynamically generated
+ * code. Use bpf_call_func to perform additional validation of the call
+ * target to narrow down attack surface. Architectures implementing BPF
+ * JIT can override arch_bpf_jit_check_func for arch-specific checking.
+ */
+extern bool arch_bpf_jit_check_func(const struct bpf_prog *prog);
+
+static inline unsigned int __bpf_call_func(const struct bpf_prog *prog,
+					   const void *ctx)
+{
+	/* Call interpreter with CFI checking. */
+	return prog->bpf_func(ctx, prog->insnsi);
+}
+
+static inline struct bpf_binary_header *
+bpf_jit_binary_hdr(const struct bpf_prog *fp);
+
+static inline unsigned int __nocfi bpf_call_func(const struct bpf_prog *prog,
+						 const void *ctx)
+{
+	const struct bpf_binary_header *hdr = bpf_jit_binary_hdr(prog);
+
+	if (!IS_ENABLED(CONFIG_BPF_JIT_ALWAYS_ON) && !prog->jited)
+		return __bpf_call_func(prog, ctx);
+
+	/*
+	 * We are about to call dynamically generated code. Check that the
+	 * page has bpf_binary_header with a valid magic to limit possible
+	 * call targets.
+	 */
+	BUG_ON(hdr->magic != BPF_BINARY_HEADER_MAGIC ||
+		!arch_bpf_jit_check_func(prog));
+
+	/* Call jited function without CFI checking. */
+	return prog->bpf_func(ctx, prog->insnsi);
+}
+
+static inline void bpf_jit_set_header_magic(struct bpf_binary_header *hdr)
+{
+	hdr->magic = BPF_BINARY_HEADER_MAGIC;
+}
+#else
+static inline unsigned int bpf_call_func(const struct bpf_prog *prog,
+					 const void *ctx)
+{
+	return prog->bpf_func(ctx, prog->insnsi);
+}
+
+static inline void bpf_jit_set_header_magic(struct bpf_binary_header *hdr)
+{
+}
+#endif
+
+#define BPF_PROG_RUN(filter, ctx)  bpf_call_func(filter, ctx)
 
 #define BPF_SKB_CB_LEN QDISC_CB_PRIV_LEN
 
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 9242000..66963a1 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -61,6 +61,8 @@
 struct iov_iter;
 struct fscrypt_info;
 struct fscrypt_operations;
+struct fsverity_info;
+struct fsverity_operations;
 
 extern void __init inode_init(void);
 extern void __init inode_init_early(void);
@@ -688,10 +690,14 @@
 	struct fsnotify_mark_connector __rcu	*i_fsnotify_marks;
 #endif
 
-#if IS_ENABLED(CONFIG_FS_ENCRYPTION)
+#ifdef CONFIG_FS_ENCRYPTION
 	struct fscrypt_info	*i_crypt_info;
 #endif
 
+#ifdef CONFIG_FS_VERITY
+	struct fsverity_info	*i_verity_info;
+#endif
+
 	void			*i_private; /* fs or device private pointer */
 } __randomize_layout;
 
@@ -1388,8 +1394,12 @@
 	void                    *s_security;
 #endif
 	const struct xattr_handler **s_xattr;
-#if IS_ENABLED(CONFIG_FS_ENCRYPTION)
+#ifdef CONFIG_FS_ENCRYPTION
 	const struct fscrypt_operations	*s_cop;
+	struct key		*s_master_keys; /* master crypto keys in use */
+#endif
+#ifdef CONFIG_FS_VERITY
+	const struct fsverity_operations *s_vop;
 #endif
 	struct hlist_bl_head	s_roots;	/* alternate root dentries for NFS */
 	struct list_head	s_mounts;	/* list of mounts; _not_ for fs use */
@@ -1637,13 +1647,21 @@
  * VFS helper functions..
  */
 extern int vfs_create(struct inode *, struct dentry *, umode_t, bool);
+extern int vfs_create2(struct vfsmount *, struct inode *, struct dentry *, umode_t, bool);
 extern int vfs_mkdir(struct inode *, struct dentry *, umode_t);
+extern int vfs_mkdir2(struct vfsmount *, struct inode *, struct dentry *, umode_t);
 extern int vfs_mknod(struct inode *, struct dentry *, umode_t, dev_t);
+extern int vfs_mknod2(struct vfsmount *, struct inode *, struct dentry *, umode_t, dev_t);
 extern int vfs_symlink(struct inode *, struct dentry *, const char *);
+extern int vfs_symlink2(struct vfsmount *, struct inode *, struct dentry *, const char *);
 extern int vfs_link(struct dentry *, struct inode *, struct dentry *, struct inode **);
+extern int vfs_link2(struct vfsmount *, struct dentry *, struct inode *, struct dentry *, struct inode **);
 extern int vfs_rmdir(struct inode *, struct dentry *);
+extern int vfs_rmdir2(struct vfsmount *, struct inode *, struct dentry *);
 extern int vfs_unlink(struct inode *, struct dentry *, struct inode **);
+extern int vfs_unlink2(struct vfsmount *, struct inode *, struct dentry *, struct inode **);
 extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int);
+extern int vfs_rename2(struct vfsmount *, struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int);
 extern int vfs_whiteout(struct inode *, struct dentry *);
 
 extern struct dentry *vfs_tmpfile(struct dentry *dentry, umode_t mode,
@@ -1652,6 +1670,9 @@
 int vfs_mkobj(struct dentry *, umode_t,
 		int (*f)(struct dentry *, umode_t, void *),
 		void *);
+int vfs_mkobj2(struct vfsmount *, struct dentry *, umode_t,
+		int (*f)(struct dentry *, umode_t, void *),
+		void *);
 
 extern long vfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
 
@@ -1782,6 +1803,7 @@
 	struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int);
 	const char * (*get_link) (struct dentry *, struct inode *, struct delayed_call *);
 	int (*permission) (struct inode *, int);
+	int (*permission2) (struct vfsmount *, struct inode *, int);
 	struct posix_acl * (*get_acl)(struct inode *, int);
 
 	int (*readlink) (struct dentry *, char __user *,int);
@@ -1796,7 +1818,8 @@
 	int (*rename) (struct inode *, struct dentry *,
 			struct inode *, struct dentry *, unsigned int);
 	int (*setattr) (struct dentry *, struct iattr *);
-	int (*getattr) (const struct path *, struct kstat *, u32, unsigned int);
+	int (*setattr2) (struct vfsmount *, struct dentry *, struct iattr *);
+        int (*getattr) (const struct path *, struct kstat *, u32, unsigned int);
 	ssize_t (*listxattr) (struct dentry *, char *, size_t);
 	int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
 		      u64 len);
@@ -1870,9 +1893,13 @@
 	int (*unfreeze_fs) (struct super_block *);
 	int (*statfs) (struct dentry *, struct kstatfs *);
 	int (*remount_fs) (struct super_block *, int *, char *);
+	int (*remount_fs2) (struct vfsmount *, struct super_block *, int *, char *);
+	void *(*clone_mnt_data) (void *);
+	void (*copy_mnt_data) (void *, void *);
 	void (*umount_begin) (struct super_block *);
 
 	int (*show_options)(struct seq_file *, struct dentry *);
+	int (*show_options2)(struct vfsmount *,struct seq_file *, struct dentry *);
 	int (*show_devname)(struct seq_file *, struct dentry *);
 	int (*show_path)(struct seq_file *, struct dentry *);
 	int (*show_stats)(struct seq_file *, struct dentry *);
@@ -1910,6 +1937,8 @@
 #define S_DAX		0	/* Make all the DAX code disappear */
 #endif
 #define S_ENCRYPTED	16384	/* Encrypted file (using fs/crypto/) */
+#define S_CASEFOLD	32768	/* Casefolded file */
+#define S_VERITY	65536	/* Verity file (using fs/verity/) */
 
 /*
  * Note that nosuid etc flags are inode-specific: setting some file-system
@@ -1950,6 +1979,8 @@
 #define IS_NOSEC(inode)		((inode)->i_flags & S_NOSEC)
 #define IS_DAX(inode)		((inode)->i_flags & S_DAX)
 #define IS_ENCRYPTED(inode)	((inode)->i_flags & S_ENCRYPTED)
+#define IS_CASEFOLDED(inode)	((inode)->i_flags & S_CASEFOLD)
+#define IS_VERITY(inode)	((inode)->i_flags & S_VERITY)
 
 #define IS_WHITEOUT(inode)	(S_ISCHR(inode->i_mode) && \
 				 (inode)->i_rdev == WHITEOUT_DEV)
@@ -2132,6 +2163,9 @@
 #define FS_RENAME_DOES_D_MOVE	32768	/* FS will handle d_move() during rename() internally. */
 	struct dentry *(*mount) (struct file_system_type *, int,
 		       const char *, void *);
+	struct dentry *(*mount2) (struct vfsmount *, struct file_system_type *, int,
+			       const char *, void *);
+	void *(*alloc_mnt_data) (void);
 	void (*kill_sb) (struct super_block *);
 	struct module *owner;
 	struct file_system_type * next;
@@ -2448,6 +2482,8 @@
 extern long vfs_truncate(const struct path *, loff_t);
 extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs,
 		       struct file *filp);
+extern int do_truncate2(struct vfsmount *, struct dentry *, loff_t start,
+			unsigned int time_attrs, struct file *filp);
 extern int vfs_fallocate(struct file *file, int mode, loff_t offset,
 			loff_t len);
 extern long do_sys_open(int dfd, const char __user *filename, int flags,
@@ -2759,7 +2795,9 @@
 extern sector_t bmap(struct inode *, sector_t);
 #endif
 extern int notify_change(struct dentry *, struct iattr *, struct inode **);
+extern int notify_change2(struct vfsmount *, struct dentry *, struct iattr *, struct inode **);
 extern int inode_permission(struct inode *, int);
+extern int inode_permission2(struct vfsmount *, struct inode *, int);
 extern int generic_permission(struct inode *, int);
 extern int __check_sticky(struct inode *dir, struct inode *inode);
 
@@ -3468,4 +3506,27 @@
 extern int vfs_fadvise(struct file *file, loff_t offset, loff_t len,
 		       int advice);
 
+int vfs_ioc_setflags_prepare(struct inode *inode, unsigned int oldflags,
+			     unsigned int flags);
+
+int vfs_ioc_fssetxattr_check(struct inode *inode, const struct fsxattr *old_fa,
+			     struct fsxattr *fa);
+
+static inline void simple_fill_fsxattr(struct fsxattr *fa, __u32 xflags)
+{
+	memset(fa, 0, sizeof(*fa));
+	fa->fsx_xflags = xflags;
+}
+
+/*
+ * Flush file data before changing attributes.  Caller must hold any locks
+ * required to prevent further writes to this file until we're done setting
+ * flags.
+ */
+static inline int inode_drain_writes(struct inode *inode)
+{
+	inode_dio_wait(inode);
+	return filemap_write_and_wait(inode->i_mapping);
+}
+
 #endif /* _LINUX_FS_H */
diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h
index 952ab97..6febaa5 100644
--- a/include/linux/fscrypt.h
+++ b/include/linux/fscrypt.h
@@ -2,9 +2,8 @@
 /*
  * fscrypt.h: declarations for per-file encryption
  *
- * Filesystems that implement per-file encryption include this header
- * file with the __FS_HAS_ENCRYPTION set according to whether that filesystem
- * is being built with encryption support or not.
+ * Filesystems that implement per-file encryption must include this header
+ * file.
  *
  * Copyright (C) 2015, Google, Inc.
  *
@@ -15,10 +14,12 @@
 #define _LINUX_FSCRYPT_H
 
 #include <linux/fs.h>
+#include <linux/mm.h>
+#include <linux/slab.h>
+#include <uapi/linux/fscrypt.h>
 
 #define FS_CRYPTO_BLOCK_SIZE		16
 
-struct fscrypt_ctx;
 struct fscrypt_info;
 
 struct fscrypt_str {
@@ -32,6 +33,7 @@
 	u32 hash;
 	u32 minor_hash;
 	struct fscrypt_str crypto_buf;
+	bool is_ciphertext_name;
 };
 
 #define FSTR_INIT(n, l)		{ .name = n, .len = l }
@@ -40,13 +42,555 @@
 #define fname_len(p)		((p)->disk_name.len)
 
 /* Maximum value for the third parameter of fscrypt_operations.set_context(). */
-#define FSCRYPT_SET_CONTEXT_MAX_SIZE	28
+#define FSCRYPT_SET_CONTEXT_MAX_SIZE	40
 
-#if __FS_HAS_ENCRYPTION
-#include <linux/fscrypt_supp.h>
-#else
-#include <linux/fscrypt_notsupp.h>
-#endif
+#ifdef CONFIG_FS_ENCRYPTION
+/*
+ * fscrypt superblock flags
+ */
+#define FS_CFLG_OWN_PAGES (1U << 1)
+
+/*
+ * crypto operations for filesystems
+ */
+struct fscrypt_operations {
+	unsigned int flags;
+	const char *key_prefix;
+	int (*get_context)(struct inode *, void *, size_t);
+	int (*set_context)(struct inode *, const void *, size_t, void *);
+	bool (*dummy_context)(struct inode *);
+	bool (*empty_dir)(struct inode *);
+	unsigned int max_namelen;
+	bool (*has_stable_inodes)(struct super_block *sb);
+	void (*get_ino_and_lblk_bits)(struct super_block *sb,
+				      int *ino_bits_ret, int *lblk_bits_ret);
+	bool (*inline_crypt_enabled)(struct super_block *sb);
+};
+
+static inline bool fscrypt_has_encryption_key(const struct inode *inode)
+{
+	/* pairs with cmpxchg_release() in fscrypt_get_encryption_info() */
+	return READ_ONCE(inode->i_crypt_info) != NULL;
+}
+
+static inline bool fscrypt_dummy_context_enabled(struct inode *inode)
+{
+	return inode->i_sb->s_cop->dummy_context &&
+		inode->i_sb->s_cop->dummy_context(inode);
+}
+
+/*
+ * When d_splice_alias() moves a directory's encrypted alias to its decrypted
+ * alias as a result of the encryption key being added, DCACHE_ENCRYPTED_NAME
+ * must be cleared.  Note that we don't have to support arbitrary moves of this
+ * flag because fscrypt doesn't allow encrypted aliases to be the source or
+ * target of a rename().
+ */
+static inline void fscrypt_handle_d_move(struct dentry *dentry)
+{
+	dentry->d_flags &= ~DCACHE_ENCRYPTED_NAME;
+}
+
+/* crypto.c */
+extern void fscrypt_enqueue_decrypt_work(struct work_struct *);
+
+extern struct page *fscrypt_encrypt_pagecache_blocks(struct page *page,
+						     unsigned int len,
+						     unsigned int offs,
+						     gfp_t gfp_flags);
+extern int fscrypt_encrypt_block_inplace(const struct inode *inode,
+					 struct page *page, unsigned int len,
+					 unsigned int offs, u64 lblk_num,
+					 gfp_t gfp_flags);
+
+extern int fscrypt_decrypt_pagecache_blocks(struct page *page, unsigned int len,
+					    unsigned int offs);
+extern int fscrypt_decrypt_block_inplace(const struct inode *inode,
+					 struct page *page, unsigned int len,
+					 unsigned int offs, u64 lblk_num);
+
+static inline bool fscrypt_is_bounce_page(struct page *page)
+{
+	return page->mapping == NULL;
+}
+
+static inline struct page *fscrypt_pagecache_page(struct page *bounce_page)
+{
+	return (struct page *)page_private(bounce_page);
+}
+
+extern void fscrypt_free_bounce_page(struct page *bounce_page);
+
+/* policy.c */
+extern int fscrypt_ioctl_set_policy(struct file *, const void __user *);
+extern int fscrypt_ioctl_get_policy(struct file *, void __user *);
+extern int fscrypt_ioctl_get_policy_ex(struct file *, void __user *);
+extern int fscrypt_has_permitted_context(struct inode *, struct inode *);
+extern int fscrypt_inherit_context(struct inode *, struct inode *,
+					void *, bool);
+/* keyring.c */
+extern void fscrypt_sb_free(struct super_block *sb);
+extern int fscrypt_ioctl_add_key(struct file *filp, void __user *arg);
+extern int fscrypt_ioctl_remove_key(struct file *filp, void __user *arg);
+extern int fscrypt_ioctl_remove_key_all_users(struct file *filp,
+					      void __user *arg);
+extern int fscrypt_ioctl_get_key_status(struct file *filp, void __user *arg);
+extern int fscrypt_register_key_removal_notifier(struct notifier_block *nb);
+extern int fscrypt_unregister_key_removal_notifier(struct notifier_block *nb);
+
+/* keysetup.c */
+extern int fscrypt_get_encryption_info(struct inode *);
+extern void fscrypt_put_encryption_info(struct inode *);
+extern void fscrypt_free_inode(struct inode *);
+extern int fscrypt_drop_inode(struct inode *inode);
+
+/* fname.c */
+extern int fscrypt_setup_filename(struct inode *, const struct qstr *,
+				int lookup, struct fscrypt_name *);
+
+static inline void fscrypt_free_filename(struct fscrypt_name *fname)
+{
+	kfree(fname->crypto_buf.name);
+}
+
+extern int fscrypt_fname_alloc_buffer(const struct inode *, u32,
+				struct fscrypt_str *);
+extern void fscrypt_fname_free_buffer(struct fscrypt_str *);
+extern int fscrypt_fname_disk_to_usr(struct inode *, u32, u32,
+			const struct fscrypt_str *, struct fscrypt_str *);
+
+#define FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE	32
+
+/* Extracts the second-to-last ciphertext block; see explanation below */
+#define FSCRYPT_FNAME_DIGEST(name, len)	\
+	((name) + round_down((len) - FS_CRYPTO_BLOCK_SIZE - 1, \
+			     FS_CRYPTO_BLOCK_SIZE))
+
+#define FSCRYPT_FNAME_DIGEST_SIZE	FS_CRYPTO_BLOCK_SIZE
+
+/**
+ * fscrypt_digested_name - alternate identifier for an on-disk filename
+ *
+ * When userspace lists an encrypted directory without access to the key,
+ * filenames whose ciphertext is longer than FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE
+ * bytes are shown in this abbreviated form (base64-encoded) rather than as the
+ * full ciphertext (base64-encoded).  This is necessary to allow supporting
+ * filenames up to NAME_MAX bytes, since base64 encoding expands the length.
+ *
+ * To make it possible for filesystems to still find the correct directory entry
+ * despite not knowing the full on-disk name, we encode any filesystem-specific
+ * 'hash' and/or 'minor_hash' which the filesystem may need for its lookups,
+ * followed by the second-to-last ciphertext block of the filename.  Due to the
+ * use of the CBC-CTS encryption mode, the second-to-last ciphertext block
+ * depends on the full plaintext.  (Note that ciphertext stealing causes the
+ * last two blocks to appear "flipped".)  This makes accidental collisions very
+ * unlikely: just a 1 in 2^128 chance for two filenames to collide even if they
+ * share the same filesystem-specific hashes.
+ *
+ * However, this scheme isn't immune to intentional collisions, which can be
+ * created by anyone able to create arbitrary plaintext filenames and view them
+ * without the key.  Making the "digest" be a real cryptographic hash like
+ * SHA-256 over the full ciphertext would prevent this, although it would be
+ * less efficient and harder to implement, especially since the filesystem would
+ * need to calculate it for each directory entry examined during a search.
+ */
+struct fscrypt_digested_name {
+	u32 hash;
+	u32 minor_hash;
+	u8 digest[FSCRYPT_FNAME_DIGEST_SIZE];
+};
+
+/**
+ * fscrypt_match_name() - test whether the given name matches a directory entry
+ * @fname: the name being searched for
+ * @de_name: the name from the directory entry
+ * @de_name_len: the length of @de_name in bytes
+ *
+ * Normally @fname->disk_name will be set, and in that case we simply compare
+ * that to the name stored in the directory entry.  The only exception is that
+ * if we don't have the key for an encrypted directory and a filename in it is
+ * very long, then we won't have the full disk_name and we'll instead need to
+ * match against the fscrypt_digested_name.
+ *
+ * Return: %true if the name matches, otherwise %false.
+ */
+static inline bool fscrypt_match_name(const struct fscrypt_name *fname,
+				      const u8 *de_name, u32 de_name_len)
+{
+	if (unlikely(!fname->disk_name.name)) {
+		const struct fscrypt_digested_name *n =
+			(const void *)fname->crypto_buf.name;
+		if (WARN_ON_ONCE(fname->usr_fname->name[0] != '_'))
+			return false;
+		if (de_name_len <= FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE)
+			return false;
+		return !memcmp(FSCRYPT_FNAME_DIGEST(de_name, de_name_len),
+			       n->digest, FSCRYPT_FNAME_DIGEST_SIZE);
+	}
+
+	if (de_name_len != fname->disk_name.len)
+		return false;
+	return !memcmp(de_name, fname->disk_name.name, fname->disk_name.len);
+}
+
+/* bio.c */
+extern void fscrypt_decrypt_bio(struct bio *);
+extern int fscrypt_zeroout_range(const struct inode *, pgoff_t, sector_t,
+				 unsigned int);
+
+/* hooks.c */
+extern int fscrypt_file_open(struct inode *inode, struct file *filp);
+extern int __fscrypt_prepare_link(struct inode *inode, struct inode *dir,
+				  struct dentry *dentry);
+extern int __fscrypt_prepare_rename(struct inode *old_dir,
+				    struct dentry *old_dentry,
+				    struct inode *new_dir,
+				    struct dentry *new_dentry,
+				    unsigned int flags);
+extern int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry,
+				    struct fscrypt_name *fname);
+extern int __fscrypt_prepare_symlink(struct inode *dir, unsigned int len,
+				     unsigned int max_len,
+				     struct fscrypt_str *disk_link);
+extern int __fscrypt_encrypt_symlink(struct inode *inode, const char *target,
+				     unsigned int len,
+				     struct fscrypt_str *disk_link);
+extern const char *fscrypt_get_symlink(struct inode *inode, const void *caddr,
+				       unsigned int max_size,
+				       struct delayed_call *done);
+#else  /* !CONFIG_FS_ENCRYPTION */
+
+static inline bool fscrypt_has_encryption_key(const struct inode *inode)
+{
+	return false;
+}
+
+static inline bool fscrypt_dummy_context_enabled(struct inode *inode)
+{
+	return false;
+}
+
+static inline void fscrypt_handle_d_move(struct dentry *dentry)
+{
+}
+
+/* crypto.c */
+static inline void fscrypt_enqueue_decrypt_work(struct work_struct *work)
+{
+}
+
+static inline struct page *fscrypt_encrypt_pagecache_blocks(struct page *page,
+							    unsigned int len,
+							    unsigned int offs,
+							    gfp_t gfp_flags)
+{
+	return ERR_PTR(-EOPNOTSUPP);
+}
+
+static inline int fscrypt_encrypt_block_inplace(const struct inode *inode,
+						struct page *page,
+						unsigned int len,
+						unsigned int offs, u64 lblk_num,
+						gfp_t gfp_flags)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int fscrypt_decrypt_pagecache_blocks(struct page *page,
+						   unsigned int len,
+						   unsigned int offs)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int fscrypt_decrypt_block_inplace(const struct inode *inode,
+						struct page *page,
+						unsigned int len,
+						unsigned int offs, u64 lblk_num)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline bool fscrypt_is_bounce_page(struct page *page)
+{
+	return false;
+}
+
+static inline struct page *fscrypt_pagecache_page(struct page *bounce_page)
+{
+	WARN_ON_ONCE(1);
+	return ERR_PTR(-EINVAL);
+}
+
+static inline void fscrypt_free_bounce_page(struct page *bounce_page)
+{
+}
+
+/* policy.c */
+static inline int fscrypt_ioctl_set_policy(struct file *filp,
+					   const void __user *arg)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int fscrypt_ioctl_get_policy(struct file *filp, void __user *arg)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int fscrypt_ioctl_get_policy_ex(struct file *filp,
+					      void __user *arg)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int fscrypt_has_permitted_context(struct inode *parent,
+						struct inode *child)
+{
+	return 0;
+}
+
+static inline int fscrypt_inherit_context(struct inode *parent,
+					  struct inode *child,
+					  void *fs_data, bool preload)
+{
+	return -EOPNOTSUPP;
+}
+
+/* keyring.c */
+static inline void fscrypt_sb_free(struct super_block *sb)
+{
+}
+
+static inline int fscrypt_ioctl_add_key(struct file *filp, void __user *arg)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int fscrypt_ioctl_remove_key(struct file *filp, void __user *arg)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int fscrypt_ioctl_remove_key_all_users(struct file *filp,
+						     void __user *arg)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int fscrypt_ioctl_get_key_status(struct file *filp,
+					       void __user *arg)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int fscrypt_register_key_removal_notifier(
+						struct notifier_block *nb)
+{
+	return 0;
+}
+
+static inline int fscrypt_unregister_key_removal_notifier(
+						struct notifier_block *nb)
+{
+	return 0;
+}
+
+/* keysetup.c */
+static inline int fscrypt_get_encryption_info(struct inode *inode)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline void fscrypt_put_encryption_info(struct inode *inode)
+{
+	return;
+}
+
+static inline void fscrypt_free_inode(struct inode *inode)
+{
+}
+
+static inline int fscrypt_drop_inode(struct inode *inode)
+{
+	return 0;
+}
+
+ /* fname.c */
+static inline int fscrypt_setup_filename(struct inode *dir,
+					 const struct qstr *iname,
+					 int lookup, struct fscrypt_name *fname)
+{
+	if (IS_ENCRYPTED(dir))
+		return -EOPNOTSUPP;
+
+	memset(fname, 0, sizeof(*fname));
+	fname->usr_fname = iname;
+	fname->disk_name.name = (unsigned char *)iname->name;
+	fname->disk_name.len = iname->len;
+	return 0;
+}
+
+static inline void fscrypt_free_filename(struct fscrypt_name *fname)
+{
+	return;
+}
+
+static inline int fscrypt_fname_alloc_buffer(const struct inode *inode,
+					     u32 max_encrypted_len,
+					     struct fscrypt_str *crypto_str)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline void fscrypt_fname_free_buffer(struct fscrypt_str *crypto_str)
+{
+	return;
+}
+
+static inline int fscrypt_fname_disk_to_usr(struct inode *inode,
+					    u32 hash, u32 minor_hash,
+					    const struct fscrypt_str *iname,
+					    struct fscrypt_str *oname)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline bool fscrypt_match_name(const struct fscrypt_name *fname,
+				      const u8 *de_name, u32 de_name_len)
+{
+	/* Encryption support disabled; use standard comparison */
+	if (de_name_len != fname->disk_name.len)
+		return false;
+	return !memcmp(de_name, fname->disk_name.name, fname->disk_name.len);
+}
+
+/* bio.c */
+static inline void fscrypt_decrypt_bio(struct bio *bio)
+{
+}
+
+static inline int fscrypt_zeroout_range(const struct inode *inode, pgoff_t lblk,
+					sector_t pblk, unsigned int len)
+{
+	return -EOPNOTSUPP;
+}
+
+/* hooks.c */
+
+static inline int fscrypt_file_open(struct inode *inode, struct file *filp)
+{
+	if (IS_ENCRYPTED(inode))
+		return -EOPNOTSUPP;
+	return 0;
+}
+
+static inline int __fscrypt_prepare_link(struct inode *inode, struct inode *dir,
+					 struct dentry *dentry)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int __fscrypt_prepare_rename(struct inode *old_dir,
+					   struct dentry *old_dentry,
+					   struct inode *new_dir,
+					   struct dentry *new_dentry,
+					   unsigned int flags)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int __fscrypt_prepare_lookup(struct inode *dir,
+					   struct dentry *dentry,
+					   struct fscrypt_name *fname)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline int __fscrypt_prepare_symlink(struct inode *dir,
+					    unsigned int len,
+					    unsigned int max_len,
+					    struct fscrypt_str *disk_link)
+{
+	return -EOPNOTSUPP;
+}
+
+
+static inline int __fscrypt_encrypt_symlink(struct inode *inode,
+					    const char *target,
+					    unsigned int len,
+					    struct fscrypt_str *disk_link)
+{
+	return -EOPNOTSUPP;
+}
+
+static inline const char *fscrypt_get_symlink(struct inode *inode,
+					      const void *caddr,
+					      unsigned int max_size,
+					      struct delayed_call *done)
+{
+	return ERR_PTR(-EOPNOTSUPP);
+}
+#endif	/* !CONFIG_FS_ENCRYPTION */
+
+/* inline_crypt.c */
+#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
+extern bool fscrypt_inode_uses_inline_crypto(const struct inode *inode);
+
+extern bool fscrypt_inode_uses_fs_layer_crypto(const struct inode *inode);
+
+extern int fscrypt_set_bio_crypt_ctx(struct bio *bio, const struct inode *inode,
+				     u64 first_lblk, gfp_t gfp_mask);
+
+extern int fscrypt_set_bio_crypt_ctx_bh(struct bio *bio,
+					const struct buffer_head *first_bh,
+					gfp_t gfp_mask);
+
+extern bool fscrypt_mergeable_bio(struct bio *bio, const struct inode *inode,
+				  u64 next_lblk);
+
+extern bool fscrypt_mergeable_bio_bh(struct bio *bio,
+				     const struct buffer_head *next_bh);
+
+#else /* CONFIG_FS_ENCRYPTION_INLINE_CRYPT */
+static inline bool fscrypt_inode_uses_inline_crypto(const struct inode *inode)
+{
+	return false;
+}
+
+static inline bool fscrypt_inode_uses_fs_layer_crypto(const struct inode *inode)
+{
+	return IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode);
+}
+
+static inline int fscrypt_set_bio_crypt_ctx(struct bio *bio,
+					    const struct inode *inode,
+					    u64 first_lblk, gfp_t gfp_mask)
+{
+	return 0;
+}
+
+static inline int fscrypt_set_bio_crypt_ctx_bh(
+					struct bio *bio,
+					const struct buffer_head *first_bh,
+					gfp_t gfp_mask)
+{
+	return 0;
+}
+
+static inline bool fscrypt_mergeable_bio(struct bio *bio,
+					 const struct inode *inode,
+					 u64 next_lblk)
+{
+	return true;
+}
+
+static inline bool fscrypt_mergeable_bio_bh(struct bio *bio,
+					    const struct buffer_head *next_bh)
+{
+	return true;
+}
+#endif /* !CONFIG_FS_ENCRYPTION_INLINE_CRYPT */
 
 /**
  * fscrypt_require_key - require an inode's encryption key
@@ -89,7 +633,7 @@
  * in an encrypted directory tree use the same encryption policy.
  *
  * Return: 0 on success, -ENOKEY if the directory's encryption key is missing,
- * -EPERM if the link would result in an inconsistent encryption policy, or
+ * -EXDEV if the link would result in an inconsistent encryption policy, or
  * another -errno code.
  */
 static inline int fscrypt_prepare_link(struct dentry *old_dentry,
@@ -97,7 +641,7 @@
 				       struct dentry *dentry)
 {
 	if (IS_ENCRYPTED(dir))
-		return __fscrypt_prepare_link(d_inode(old_dentry), dir);
+		return __fscrypt_prepare_link(d_inode(old_dentry), dir, dentry);
 	return 0;
 }
 
@@ -119,7 +663,7 @@
  * We also verify that the rename will not violate the constraint that all files
  * in an encrypted directory tree use the same encryption policy.
  *
- * Return: 0 on success, -ENOKEY if an encryption key is missing, -EPERM if the
+ * Return: 0 on success, -ENOKEY if an encryption key is missing, -EXDEV if the
  * rename would cause inconsistent encryption policies, or another -errno code.
  */
 static inline int fscrypt_prepare_rename(struct inode *old_dir,
@@ -138,27 +682,32 @@
  * fscrypt_prepare_lookup - prepare to lookup a name in a possibly-encrypted directory
  * @dir: directory being searched
  * @dentry: filename being looked up
- * @flags: lookup flags
+ * @fname: (output) the name to use to search the on-disk directory
  *
- * Prepare for ->lookup() in a directory which may be encrypted.  Lookups can be
- * done with or without the directory's encryption key; without the key,
+ * Prepare for ->lookup() in a directory which may be encrypted by determining
+ * the name that will actually be used to search the directory on-disk.  Lookups
+ * can be done with or without the directory's encryption key; without the key,
  * filenames are presented in encrypted form.  Therefore, we'll try to set up
  * the directory's encryption key, but even without it the lookup can continue.
  *
- * To allow invalidating stale dentries if the directory's encryption key is
- * added later, we also install a custom ->d_revalidate() method and use the
- * DCACHE_ENCRYPTED_WITH_KEY flag to indicate whether a given dentry is a
- * plaintext name (flag set) or a ciphertext name (flag cleared).
+ * This also installs a custom ->d_revalidate() method which will invalidate the
+ * dentry if it was created without the key and the key is later added.
  *
- * Return: 0 on success, -errno if a problem occurred while setting up the
- * encryption key
+ * Return: 0 on success; -ENOENT if key is unavailable but the filename isn't a
+ * correctly formed encoded ciphertext name, so a negative dentry should be
+ * created; or another -errno code.
  */
 static inline int fscrypt_prepare_lookup(struct inode *dir,
 					 struct dentry *dentry,
-					 unsigned int flags)
+					 struct fscrypt_name *fname)
 {
 	if (IS_ENCRYPTED(dir))
-		return __fscrypt_prepare_lookup(dir, dentry);
+		return __fscrypt_prepare_lookup(dir, dentry, fname);
+
+	memset(fname, 0, sizeof(*fname));
+	fname->usr_fname = &dentry->d_name;
+	fname->disk_name.name = (unsigned char *)dentry->d_name.name;
+	fname->disk_name.len = dentry->d_name.len;
 	return 0;
 }
 
@@ -251,4 +800,15 @@
 	return 0;
 }
 
+/* If *pagep is a bounce page, free it and set *pagep to the pagecache page */
+static inline void fscrypt_finalize_bounce_page(struct page **pagep)
+{
+	struct page *page = *pagep;
+
+	if (fscrypt_is_bounce_page(page)) {
+		*pagep = fscrypt_pagecache_page(page);
+		fscrypt_free_bounce_page(page);
+	}
+}
+
 #endif	/* _LINUX_FSCRYPT_H */
diff --git a/include/linux/fscrypt_notsupp.h b/include/linux/fscrypt_notsupp.h
deleted file mode 100644
index ee8b43e..0000000
--- a/include/linux/fscrypt_notsupp.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * fscrypt_notsupp.h
- *
- * This stubs out the fscrypt functions for filesystems configured without
- * encryption support.
- *
- * Do not include this file directly. Use fscrypt.h instead!
- */
-#ifndef _LINUX_FSCRYPT_H
-#error "Incorrect include of linux/fscrypt_notsupp.h!"
-#endif
-
-#ifndef _LINUX_FSCRYPT_NOTSUPP_H
-#define _LINUX_FSCRYPT_NOTSUPP_H
-
-static inline bool fscrypt_has_encryption_key(const struct inode *inode)
-{
-	return false;
-}
-
-static inline bool fscrypt_dummy_context_enabled(struct inode *inode)
-{
-	return false;
-}
-
-/* crypto.c */
-static inline void fscrypt_enqueue_decrypt_work(struct work_struct *work)
-{
-}
-
-static inline struct fscrypt_ctx *fscrypt_get_ctx(const struct inode *inode,
-						  gfp_t gfp_flags)
-{
-	return ERR_PTR(-EOPNOTSUPP);
-}
-
-static inline void fscrypt_release_ctx(struct fscrypt_ctx *ctx)
-{
-	return;
-}
-
-static inline struct page *fscrypt_encrypt_page(const struct inode *inode,
-						struct page *page,
-						unsigned int len,
-						unsigned int offs,
-						u64 lblk_num, gfp_t gfp_flags)
-{
-	return ERR_PTR(-EOPNOTSUPP);
-}
-
-static inline int fscrypt_decrypt_page(const struct inode *inode,
-				       struct page *page,
-				       unsigned int len, unsigned int offs,
-				       u64 lblk_num)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline struct page *fscrypt_control_page(struct page *page)
-{
-	WARN_ON_ONCE(1);
-	return ERR_PTR(-EINVAL);
-}
-
-static inline void fscrypt_restore_control_page(struct page *page)
-{
-	return;
-}
-
-/* policy.c */
-static inline int fscrypt_ioctl_set_policy(struct file *filp,
-					   const void __user *arg)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline int fscrypt_ioctl_get_policy(struct file *filp, void __user *arg)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline int fscrypt_has_permitted_context(struct inode *parent,
-						struct inode *child)
-{
-	return 0;
-}
-
-static inline int fscrypt_inherit_context(struct inode *parent,
-					  struct inode *child,
-					  void *fs_data, bool preload)
-{
-	return -EOPNOTSUPP;
-}
-
-/* keyinfo.c */
-static inline int fscrypt_get_encryption_info(struct inode *inode)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline void fscrypt_put_encryption_info(struct inode *inode)
-{
-	return;
-}
-
- /* fname.c */
-static inline int fscrypt_setup_filename(struct inode *dir,
-					 const struct qstr *iname,
-					 int lookup, struct fscrypt_name *fname)
-{
-	if (IS_ENCRYPTED(dir))
-		return -EOPNOTSUPP;
-
-	memset(fname, 0, sizeof(struct fscrypt_name));
-	fname->usr_fname = iname;
-	fname->disk_name.name = (unsigned char *)iname->name;
-	fname->disk_name.len = iname->len;
-	return 0;
-}
-
-static inline void fscrypt_free_filename(struct fscrypt_name *fname)
-{
-	return;
-}
-
-static inline int fscrypt_fname_alloc_buffer(const struct inode *inode,
-					     u32 max_encrypted_len,
-					     struct fscrypt_str *crypto_str)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline void fscrypt_fname_free_buffer(struct fscrypt_str *crypto_str)
-{
-	return;
-}
-
-static inline int fscrypt_fname_disk_to_usr(struct inode *inode,
-					    u32 hash, u32 minor_hash,
-					    const struct fscrypt_str *iname,
-					    struct fscrypt_str *oname)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline bool fscrypt_match_name(const struct fscrypt_name *fname,
-				      const u8 *de_name, u32 de_name_len)
-{
-	/* Encryption support disabled; use standard comparison */
-	if (de_name_len != fname->disk_name.len)
-		return false;
-	return !memcmp(de_name, fname->disk_name.name, fname->disk_name.len);
-}
-
-/* bio.c */
-static inline void fscrypt_decrypt_bio(struct bio *bio)
-{
-}
-
-static inline void fscrypt_enqueue_decrypt_bio(struct fscrypt_ctx *ctx,
-					       struct bio *bio)
-{
-}
-
-static inline void fscrypt_pullback_bio_page(struct page **page, bool restore)
-{
-	return;
-}
-
-static inline int fscrypt_zeroout_range(const struct inode *inode, pgoff_t lblk,
-					sector_t pblk, unsigned int len)
-{
-	return -EOPNOTSUPP;
-}
-
-/* hooks.c */
-
-static inline int fscrypt_file_open(struct inode *inode, struct file *filp)
-{
-	if (IS_ENCRYPTED(inode))
-		return -EOPNOTSUPP;
-	return 0;
-}
-
-static inline int __fscrypt_prepare_link(struct inode *inode,
-					 struct inode *dir)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline int __fscrypt_prepare_rename(struct inode *old_dir,
-					   struct dentry *old_dentry,
-					   struct inode *new_dir,
-					   struct dentry *new_dentry,
-					   unsigned int flags)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline int __fscrypt_prepare_lookup(struct inode *dir,
-					   struct dentry *dentry)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline int __fscrypt_prepare_symlink(struct inode *dir,
-					    unsigned int len,
-					    unsigned int max_len,
-					    struct fscrypt_str *disk_link)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline int __fscrypt_encrypt_symlink(struct inode *inode,
-					    const char *target,
-					    unsigned int len,
-					    struct fscrypt_str *disk_link)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline const char *fscrypt_get_symlink(struct inode *inode,
-					      const void *caddr,
-					      unsigned int max_size,
-					      struct delayed_call *done)
-{
-	return ERR_PTR(-EOPNOTSUPP);
-}
-
-#endif	/* _LINUX_FSCRYPT_NOTSUPP_H */
diff --git a/include/linux/fscrypt_supp.h b/include/linux/fscrypt_supp.h
deleted file mode 100644
index 6456c6b..0000000
--- a/include/linux/fscrypt_supp.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * fscrypt_supp.h
- *
- * Do not include this file directly. Use fscrypt.h instead!
- */
-#ifndef _LINUX_FSCRYPT_H
-#error "Incorrect include of linux/fscrypt_supp.h!"
-#endif
-
-#ifndef _LINUX_FSCRYPT_SUPP_H
-#define _LINUX_FSCRYPT_SUPP_H
-
-#include <linux/mm.h>
-#include <linux/slab.h>
-
-/*
- * fscrypt superblock flags
- */
-#define FS_CFLG_OWN_PAGES (1U << 1)
-
-/*
- * crypto operations for filesystems
- */
-struct fscrypt_operations {
-	unsigned int flags;
-	const char *key_prefix;
-	int (*get_context)(struct inode *, void *, size_t);
-	int (*set_context)(struct inode *, const void *, size_t, void *);
-	bool (*dummy_context)(struct inode *);
-	bool (*empty_dir)(struct inode *);
-	unsigned int max_namelen;
-};
-
-struct fscrypt_ctx {
-	union {
-		struct {
-			struct page *bounce_page;	/* Ciphertext page */
-			struct page *control_page;	/* Original page  */
-		} w;
-		struct {
-			struct bio *bio;
-			struct work_struct work;
-		} r;
-		struct list_head free_list;	/* Free list */
-	};
-	u8 flags;				/* Flags */
-};
-
-static inline bool fscrypt_has_encryption_key(const struct inode *inode)
-{
-	return (inode->i_crypt_info != NULL);
-}
-
-static inline bool fscrypt_dummy_context_enabled(struct inode *inode)
-{
-	return inode->i_sb->s_cop->dummy_context &&
-		inode->i_sb->s_cop->dummy_context(inode);
-}
-
-/* crypto.c */
-extern void fscrypt_enqueue_decrypt_work(struct work_struct *);
-extern struct fscrypt_ctx *fscrypt_get_ctx(const struct inode *, gfp_t);
-extern void fscrypt_release_ctx(struct fscrypt_ctx *);
-extern struct page *fscrypt_encrypt_page(const struct inode *, struct page *,
-						unsigned int, unsigned int,
-						u64, gfp_t);
-extern int fscrypt_decrypt_page(const struct inode *, struct page *, unsigned int,
-				unsigned int, u64);
-
-static inline struct page *fscrypt_control_page(struct page *page)
-{
-	return ((struct fscrypt_ctx *)page_private(page))->w.control_page;
-}
-
-extern void fscrypt_restore_control_page(struct page *);
-
-/* policy.c */
-extern int fscrypt_ioctl_set_policy(struct file *, const void __user *);
-extern int fscrypt_ioctl_get_policy(struct file *, void __user *);
-extern int fscrypt_has_permitted_context(struct inode *, struct inode *);
-extern int fscrypt_inherit_context(struct inode *, struct inode *,
-					void *, bool);
-/* keyinfo.c */
-extern int fscrypt_get_encryption_info(struct inode *);
-extern void fscrypt_put_encryption_info(struct inode *);
-
-/* fname.c */
-extern int fscrypt_setup_filename(struct inode *, const struct qstr *,
-				int lookup, struct fscrypt_name *);
-
-static inline void fscrypt_free_filename(struct fscrypt_name *fname)
-{
-	kfree(fname->crypto_buf.name);
-}
-
-extern int fscrypt_fname_alloc_buffer(const struct inode *, u32,
-				struct fscrypt_str *);
-extern void fscrypt_fname_free_buffer(struct fscrypt_str *);
-extern int fscrypt_fname_disk_to_usr(struct inode *, u32, u32,
-			const struct fscrypt_str *, struct fscrypt_str *);
-
-#define FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE	32
-
-/* Extracts the second-to-last ciphertext block; see explanation below */
-#define FSCRYPT_FNAME_DIGEST(name, len)	\
-	((name) + round_down((len) - FS_CRYPTO_BLOCK_SIZE - 1, \
-			     FS_CRYPTO_BLOCK_SIZE))
-
-#define FSCRYPT_FNAME_DIGEST_SIZE	FS_CRYPTO_BLOCK_SIZE
-
-/**
- * fscrypt_digested_name - alternate identifier for an on-disk filename
- *
- * When userspace lists an encrypted directory without access to the key,
- * filenames whose ciphertext is longer than FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE
- * bytes are shown in this abbreviated form (base64-encoded) rather than as the
- * full ciphertext (base64-encoded).  This is necessary to allow supporting
- * filenames up to NAME_MAX bytes, since base64 encoding expands the length.
- *
- * To make it possible for filesystems to still find the correct directory entry
- * despite not knowing the full on-disk name, we encode any filesystem-specific
- * 'hash' and/or 'minor_hash' which the filesystem may need for its lookups,
- * followed by the second-to-last ciphertext block of the filename.  Due to the
- * use of the CBC-CTS encryption mode, the second-to-last ciphertext block
- * depends on the full plaintext.  (Note that ciphertext stealing causes the
- * last two blocks to appear "flipped".)  This makes accidental collisions very
- * unlikely: just a 1 in 2^128 chance for two filenames to collide even if they
- * share the same filesystem-specific hashes.
- *
- * However, this scheme isn't immune to intentional collisions, which can be
- * created by anyone able to create arbitrary plaintext filenames and view them
- * without the key.  Making the "digest" be a real cryptographic hash like
- * SHA-256 over the full ciphertext would prevent this, although it would be
- * less efficient and harder to implement, especially since the filesystem would
- * need to calculate it for each directory entry examined during a search.
- */
-struct fscrypt_digested_name {
-	u32 hash;
-	u32 minor_hash;
-	u8 digest[FSCRYPT_FNAME_DIGEST_SIZE];
-};
-
-/**
- * fscrypt_match_name() - test whether the given name matches a directory entry
- * @fname: the name being searched for
- * @de_name: the name from the directory entry
- * @de_name_len: the length of @de_name in bytes
- *
- * Normally @fname->disk_name will be set, and in that case we simply compare
- * that to the name stored in the directory entry.  The only exception is that
- * if we don't have the key for an encrypted directory and a filename in it is
- * very long, then we won't have the full disk_name and we'll instead need to
- * match against the fscrypt_digested_name.
- *
- * Return: %true if the name matches, otherwise %false.
- */
-static inline bool fscrypt_match_name(const struct fscrypt_name *fname,
-				      const u8 *de_name, u32 de_name_len)
-{
-	if (unlikely(!fname->disk_name.name)) {
-		const struct fscrypt_digested_name *n =
-			(const void *)fname->crypto_buf.name;
-		if (WARN_ON_ONCE(fname->usr_fname->name[0] != '_'))
-			return false;
-		if (de_name_len <= FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE)
-			return false;
-		return !memcmp(FSCRYPT_FNAME_DIGEST(de_name, de_name_len),
-			       n->digest, FSCRYPT_FNAME_DIGEST_SIZE);
-	}
-
-	if (de_name_len != fname->disk_name.len)
-		return false;
-	return !memcmp(de_name, fname->disk_name.name, fname->disk_name.len);
-}
-
-/* bio.c */
-extern void fscrypt_decrypt_bio(struct bio *);
-extern void fscrypt_enqueue_decrypt_bio(struct fscrypt_ctx *ctx,
-					struct bio *bio);
-extern void fscrypt_pullback_bio_page(struct page **, bool);
-extern int fscrypt_zeroout_range(const struct inode *, pgoff_t, sector_t,
-				 unsigned int);
-
-/* hooks.c */
-extern int fscrypt_file_open(struct inode *inode, struct file *filp);
-extern int __fscrypt_prepare_link(struct inode *inode, struct inode *dir);
-extern int __fscrypt_prepare_rename(struct inode *old_dir,
-				    struct dentry *old_dentry,
-				    struct inode *new_dir,
-				    struct dentry *new_dentry,
-				    unsigned int flags);
-extern int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry);
-extern int __fscrypt_prepare_symlink(struct inode *dir, unsigned int len,
-				     unsigned int max_len,
-				     struct fscrypt_str *disk_link);
-extern int __fscrypt_encrypt_symlink(struct inode *inode, const char *target,
-				     unsigned int len,
-				     struct fscrypt_str *disk_link);
-extern const char *fscrypt_get_symlink(struct inode *inode, const void *caddr,
-				       unsigned int max_size,
-				       struct delayed_call *done);
-
-#endif	/* _LINUX_FSCRYPT_SUPP_H */
diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h
index fd1ce10..61b7251 100644
--- a/include/linux/fsnotify.h
+++ b/include/linux/fsnotify.h
@@ -210,12 +210,19 @@
 static inline void fsnotify_open(struct file *file)
 {
 	const struct path *path = &file->f_path;
+	struct path lower_path;
 	struct inode *inode = file_inode(file);
 	__u32 mask = FS_OPEN;
 
 	if (S_ISDIR(inode->i_mode))
 		mask |= FS_ISDIR;
 
+	if (path->dentry->d_op && path->dentry->d_op->d_canonical_path) {
+		path->dentry->d_op->d_canonical_path(path, &lower_path);
+		fsnotify_parent(&lower_path, NULL, mask);
+		fsnotify(lower_path.dentry->d_inode, mask, &lower_path, FSNOTIFY_EVENT_PATH, NULL, 0);
+		path_put(&lower_path);
+	}
 	fsnotify_parent(path, NULL, mask);
 	fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0);
 }
diff --git a/include/linux/fsverity.h b/include/linux/fsverity.h
new file mode 100644
index 0000000..3b6b8cc
--- /dev/null
+++ b/include/linux/fsverity.h
@@ -0,0 +1,211 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * fs-verity: read-only file-based authenticity protection
+ *
+ * This header declares the interface between the fs/verity/ support layer and
+ * filesystems that support fs-verity.
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#ifndef _LINUX_FSVERITY_H
+#define _LINUX_FSVERITY_H
+
+#include <linux/fs.h>
+#include <uapi/linux/fsverity.h>
+
+/* Verity operations for filesystems */
+struct fsverity_operations {
+
+	/**
+	 * Begin enabling verity on the given file.
+	 *
+	 * @filp: a readonly file descriptor for the file
+	 *
+	 * The filesystem must do any needed filesystem-specific preparations
+	 * for enabling verity, e.g. evicting inline data.  It also must return
+	 * -EBUSY if verity is already being enabled on the given file.
+	 *
+	 * i_rwsem is held for write.
+	 *
+	 * Return: 0 on success, -errno on failure
+	 */
+	int (*begin_enable_verity)(struct file *filp);
+
+	/**
+	 * End enabling verity on the given file.
+	 *
+	 * @filp: a readonly file descriptor for the file
+	 * @desc: the verity descriptor to write, or NULL on failure
+	 * @desc_size: size of verity descriptor, or 0 on failure
+	 * @merkle_tree_size: total bytes the Merkle tree took up
+	 *
+	 * If desc == NULL, then enabling verity failed and the filesystem only
+	 * must do any necessary cleanups.  Else, it must also store the given
+	 * verity descriptor to a fs-specific location associated with the inode
+	 * and do any fs-specific actions needed to mark the inode as a verity
+	 * inode, e.g. setting a bit in the on-disk inode.  The filesystem is
+	 * also responsible for setting the S_VERITY flag in the VFS inode.
+	 *
+	 * i_rwsem is held for write, but it may have been dropped between
+	 * ->begin_enable_verity() and ->end_enable_verity().
+	 *
+	 * Return: 0 on success, -errno on failure
+	 */
+	int (*end_enable_verity)(struct file *filp, const void *desc,
+				 size_t desc_size, u64 merkle_tree_size);
+
+	/**
+	 * Get the verity descriptor of the given inode.
+	 *
+	 * @inode: an inode with the S_VERITY flag set
+	 * @buf: buffer in which to place the verity descriptor
+	 * @bufsize: size of @buf, or 0 to retrieve the size only
+	 *
+	 * If bufsize == 0, then the size of the verity descriptor is returned.
+	 * Otherwise the verity descriptor is written to 'buf' and its actual
+	 * size is returned; -ERANGE is returned if it's too large.  This may be
+	 * called by multiple processes concurrently on the same inode.
+	 *
+	 * Return: the size on success, -errno on failure
+	 */
+	int (*get_verity_descriptor)(struct inode *inode, void *buf,
+				     size_t bufsize);
+
+	/**
+	 * Read a Merkle tree page of the given inode.
+	 *
+	 * @inode: the inode
+	 * @index: 0-based index of the page within the Merkle tree
+	 *
+	 * This can be called at any time on an open verity file, as well as
+	 * between ->begin_enable_verity() and ->end_enable_verity().  It may be
+	 * called by multiple processes concurrently, even with the same page.
+	 *
+	 * Note that this must retrieve a *page*, not necessarily a *block*.
+	 *
+	 * Return: the page on success, ERR_PTR() on failure
+	 */
+	struct page *(*read_merkle_tree_page)(struct inode *inode,
+					      pgoff_t index);
+
+	/**
+	 * Write a Merkle tree block to the given inode.
+	 *
+	 * @inode: the inode for which the Merkle tree is being built
+	 * @buf: block to write
+	 * @index: 0-based index of the block within the Merkle tree
+	 * @log_blocksize: log base 2 of the Merkle tree block size
+	 *
+	 * This is only called between ->begin_enable_verity() and
+	 * ->end_enable_verity().
+	 *
+	 * Return: 0 on success, -errno on failure
+	 */
+	int (*write_merkle_tree_block)(struct inode *inode, const void *buf,
+				       u64 index, int log_blocksize);
+};
+
+#ifdef CONFIG_FS_VERITY
+
+static inline struct fsverity_info *fsverity_get_info(const struct inode *inode)
+{
+	/* pairs with the cmpxchg() in fsverity_set_info() */
+	return READ_ONCE(inode->i_verity_info);
+}
+
+/* enable.c */
+
+extern int fsverity_ioctl_enable(struct file *filp, const void __user *arg);
+
+/* measure.c */
+
+extern int fsverity_ioctl_measure(struct file *filp, void __user *arg);
+
+/* open.c */
+
+extern int fsverity_file_open(struct inode *inode, struct file *filp);
+extern int fsverity_prepare_setattr(struct dentry *dentry, struct iattr *attr);
+extern void fsverity_cleanup_inode(struct inode *inode);
+
+/* verify.c */
+
+extern bool fsverity_verify_page(struct page *page);
+extern void fsverity_verify_bio(struct bio *bio);
+extern void fsverity_enqueue_verify_work(struct work_struct *work);
+
+#else /* !CONFIG_FS_VERITY */
+
+static inline struct fsverity_info *fsverity_get_info(const struct inode *inode)
+{
+	return NULL;
+}
+
+/* enable.c */
+
+static inline int fsverity_ioctl_enable(struct file *filp,
+					const void __user *arg)
+{
+	return -EOPNOTSUPP;
+}
+
+/* measure.c */
+
+static inline int fsverity_ioctl_measure(struct file *filp, void __user *arg)
+{
+	return -EOPNOTSUPP;
+}
+
+/* open.c */
+
+static inline int fsverity_file_open(struct inode *inode, struct file *filp)
+{
+	return IS_VERITY(inode) ? -EOPNOTSUPP : 0;
+}
+
+static inline int fsverity_prepare_setattr(struct dentry *dentry,
+					   struct iattr *attr)
+{
+	return IS_VERITY(d_inode(dentry)) ? -EOPNOTSUPP : 0;
+}
+
+static inline void fsverity_cleanup_inode(struct inode *inode)
+{
+}
+
+/* verify.c */
+
+static inline bool fsverity_verify_page(struct page *page)
+{
+	WARN_ON(1);
+	return false;
+}
+
+static inline void fsverity_verify_bio(struct bio *bio)
+{
+	WARN_ON(1);
+}
+
+static inline void fsverity_enqueue_verify_work(struct work_struct *work)
+{
+	WARN_ON(1);
+}
+
+#endif	/* !CONFIG_FS_VERITY */
+
+/**
+ * fsverity_active() - do reads from the inode need to go through fs-verity?
+ *
+ * This checks whether ->i_verity_info has been set.
+ *
+ * Filesystems call this from ->readpages() to check whether the pages need to
+ * be verified or not.  Don't use IS_VERITY() for this purpose; it's subject to
+ * a race condition where the file is being read concurrently with
+ * FS_IOC_ENABLE_VERITY completing.  (S_VERITY is set before ->i_verity_info.)
+ */
+static inline bool fsverity_active(const struct inode *inode)
+{
+	return fsverity_get_info(inode) != NULL;
+}
+
+#endif	/* _LINUX_FSVERITY_H */
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index dd16e82..677a5ea 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -224,8 +224,16 @@
 int register_ftrace_function(struct ftrace_ops *ops);
 int unregister_ftrace_function(struct ftrace_ops *ops);
 
+#ifdef CONFIG_CFI_CLANG
+/* Use a C stub with the correct type for CFI */
+static inline void ftrace_stub(unsigned long a0, unsigned long a1,
+			       struct ftrace_ops *op, struct pt_regs *regs)
+{
+}
+#else
 extern void ftrace_stub(unsigned long a0, unsigned long a1,
 			struct ftrace_ops *op, struct pt_regs *regs);
+#endif
 
 #else /* !CONFIG_FUNCTION_TRACER */
 /*
diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h
index faebf0c..0460523 100644
--- a/include/linux/fwnode.h
+++ b/include/linux/fwnode.h
@@ -20,6 +20,7 @@
 struct fwnode_handle {
 	struct fwnode_handle *secondary;
 	const struct fwnode_operations *ops;
+	struct device *dev;
 };
 
 /**
@@ -68,6 +69,44 @@
  *			       endpoint node.
  * @graph_get_port_parent: Return the parent node of a port node.
  * @graph_parse_endpoint: Parse endpoint for port and endpoint id.
+ * @add_links:	Called after the device corresponding to the fwnode is added
+ *		using device_add(). The function is expected to create device
+ *		links to all the suppliers of the device that are available at
+ *		the time this function is called.  The function must NOT stop
+ *		at the first failed device link if other unlinked supplier
+ *		devices are present in the system.  This is necessary for the
+ *		driver/bus sync_state() callbacks to work correctly.
+ *
+ *		For example, say Device-C depends on suppliers Device-S1 and
+ *		Device-S2 and the dependency is listed in that order in the
+ *		firmware.  Say, S1 gets populated from the firmware after
+ *		late_initcall_sync().  Say S2 is populated and probed way
+ *		before that in device_initcall(). When C is populated, if this
+ *		add_links() function doesn't continue past a "failed linking to
+ *		S1" and continue linking C to S2, then S2 will get a
+ *		sync_state() callback before C is probed. This is because from
+ *		the perspective of S2, C was never a consumer when its
+ *		sync_state() evaluation is done. To avoid this, the add_links()
+ *		function has to go through all available suppliers of the
+ *		device (that corresponds to this fwnode) and link to them
+ *		before returning.
+ *
+ *		If some suppliers are not yet available (indicated by an error
+ *		return value), this function will be called again when other
+ *		devices are added to allow creating device links to any newly
+ *		available suppliers.
+ *
+ *		Return 0 if device links have been successfully created to all
+ *		the known suppliers of this device or if the supplier
+ *		information is not known.
+ *
+ *		Return -ENODEV if the suppliers needed for probing this device
+ *		have not been registered yet (because device links can only be
+ *		created to devices registered with the driver core).
+ *
+ *		Return -EAGAIN if some of the suppliers of this device have not
+ *		been registered yet, but none of those suppliers are necessary
+ *		for probing the device.
  */
 struct fwnode_operations {
 	struct fwnode_handle *(*get)(struct fwnode_handle *fwnode);
@@ -105,6 +144,8 @@
 	(*graph_get_port_parent)(struct fwnode_handle *fwnode);
 	int (*graph_parse_endpoint)(const struct fwnode_handle *fwnode,
 				    struct fwnode_endpoint *endpoint);
+	int (*add_links)(const struct fwnode_handle *fwnode,
+			 struct device *dev);
 };
 
 #define fwnode_has_op(fwnode, op)				\
@@ -125,5 +166,6 @@
 		if (fwnode_has_op(fwnode, op))				\
 			(fwnode)->ops->op(fwnode, ## __VA_ARGS__);	\
 	} while (false)
+#define get_dev_from_fwnode(fwnode)	get_device((fwnode)->dev)
 
 #endif
diff --git a/include/linux/init.h b/include/linux/init.h
index 2538d17..586dd18 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -47,7 +47,7 @@
 
 /* These are for everybody (although not all archs will actually
    discard it in modules) */
-#define __init		__section(.init.text) __cold  __latent_entropy __noinitretpoline
+#define __init		__section(.init.text) __cold  __latent_entropy __noinitretpoline __nocfi
 #define __initdata	__section(.init.data)
 #define __initconst	__section(.init.rodata)
 #define __exitdata	__section(.exit.data)
@@ -191,10 +191,32 @@
 	    ".long	" #fn " - .			\n"	\
 	    ".previous					\n");
 #else
-#define ___define_initcall(fn, id, __sec) \
+#ifdef CONFIG_LTO_CLANG
+  /*
+   * With LTO, the compiler doesn't necessarily obey link order for
+   * initcalls, and the initcall variable needs to be globally unique
+   * to avoid naming collisions.  In order to preserve the correct
+   * order, we add each variable into its own section and generate a
+   * linker script (in scripts/link-vmlinux.sh) to ensure the order
+   * remains correct.  We also add a __COUNTER__ prefix to the name,
+   * so we can retain the order of initcalls within each compilation
+   * unit, and __LINE__ to make the names more unique.
+   */
+  #define ___lto_initcall(c, l, fn, id, __sec) \
+	static initcall_t __initcall_##c##_##l##_##fn##id __used \
+		__attribute__((__section__( #__sec \
+			__stringify(.init..##c##_##l##_##fn)))) = fn;
+  #define __lto_initcall(c, l, fn, id, __sec) \
+	___lto_initcall(c, l, fn, id, __sec)
+
+  #define ___define_initcall(fn, id, __sec) \
+	__lto_initcall(__COUNTER__, __LINE__, fn, id, __sec)
+#else
+  #define ___define_initcall(fn, id, __sec) \
 	static initcall_t __initcall_##fn##id __used \
 		__attribute__((__section__(#__sec ".init"))) = fn;
 #endif
+#endif
 
 #define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
 
@@ -235,8 +257,8 @@
 #define __exitcall(fn)						\
 	static exitcall_t __exitcall_##fn __exit_call = fn
 
-#define console_initcall(fn)	___define_initcall(fn,, .con_initcall)
-#define security_initcall(fn)	___define_initcall(fn,, .security_initcall)
+#define console_initcall(fn)	___define_initcall(fn, con, .con_initcall)
+#define security_initcall(fn)	___define_initcall(fn, security, .security_initcall)
 
 struct obs_kernel_param {
 	const char *str;
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
index 8415bf1..4a0fc3b 100644
--- a/include/linux/ipv6.h
+++ b/include/linux/ipv6.h
@@ -42,6 +42,7 @@
 	__s32		accept_ra_rt_info_max_plen;
 #endif
 #endif
+	__s32		accept_ra_rt_table;
 	__s32		proxy_ndp;
 	__s32		accept_source_route;
 	__s32		accept_ra_from_local;
diff --git a/include/linux/kasan-checks.h b/include/linux/kasan-checks.h
index d314150..a61dc07 100644
--- a/include/linux/kasan-checks.h
+++ b/include/linux/kasan-checks.h
@@ -2,7 +2,7 @@
 #ifndef _LINUX_KASAN_CHECKS_H
 #define _LINUX_KASAN_CHECKS_H
 
-#ifdef CONFIG_KASAN
+#if defined(__SANITIZE_ADDRESS__) || defined(__KASAN_INTERNAL)
 void kasan_check_read(const volatile void *p, unsigned int size);
 void kasan_check_write(const volatile void *p, unsigned int size);
 #else
diff --git a/include/linux/kasan.h b/include/linux/kasan.h
index 46aae12..b40ea10 100644
--- a/include/linux/kasan.h
+++ b/include/linux/kasan.h
@@ -14,13 +14,13 @@
 #include <asm/kasan.h>
 #include <asm/pgtable.h>
 
-extern unsigned char kasan_zero_page[PAGE_SIZE];
-extern pte_t kasan_zero_pte[PTRS_PER_PTE];
-extern pmd_t kasan_zero_pmd[PTRS_PER_PMD];
-extern pud_t kasan_zero_pud[PTRS_PER_PUD];
-extern p4d_t kasan_zero_p4d[MAX_PTRS_PER_P4D];
+extern unsigned char kasan_early_shadow_page[PAGE_SIZE];
+extern pte_t kasan_early_shadow_pte[PTRS_PER_PTE];
+extern pmd_t kasan_early_shadow_pmd[PTRS_PER_PMD];
+extern pud_t kasan_early_shadow_pud[PTRS_PER_PUD];
+extern p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D];
 
-int kasan_populate_zero_shadow(const void *shadow_start,
+int kasan_populate_early_shadow(const void *shadow_start,
 				const void *shadow_end);
 
 static inline void *kasan_mem_to_shadow(const void *addr)
@@ -45,22 +45,24 @@
 
 void kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
 			slab_flags_t *flags);
-void kasan_cache_shrink(struct kmem_cache *cache);
-void kasan_cache_shutdown(struct kmem_cache *cache);
 
 void kasan_poison_slab(struct page *page);
 void kasan_unpoison_object_data(struct kmem_cache *cache, void *object);
 void kasan_poison_object_data(struct kmem_cache *cache, void *object);
-void kasan_init_slab_obj(struct kmem_cache *cache, const void *object);
+void * __must_check kasan_init_slab_obj(struct kmem_cache *cache,
+					const void *object);
 
-void kasan_kmalloc_large(const void *ptr, size_t size, gfp_t flags);
+void * __must_check kasan_kmalloc_large(const void *ptr, size_t size,
+						gfp_t flags);
 void kasan_kfree_large(void *ptr, unsigned long ip);
 void kasan_poison_kfree(void *ptr, unsigned long ip);
-void kasan_kmalloc(struct kmem_cache *s, const void *object, size_t size,
-		  gfp_t flags);
-void kasan_krealloc(const void *object, size_t new_size, gfp_t flags);
+void * __must_check kasan_kmalloc(struct kmem_cache *s, const void *object,
+					size_t size, gfp_t flags);
+void * __must_check kasan_krealloc(const void *object, size_t new_size,
+					gfp_t flags);
 
-void kasan_slab_alloc(struct kmem_cache *s, void *object, gfp_t flags);
+void * __must_check kasan_slab_alloc(struct kmem_cache *s, void *object,
+					gfp_t flags);
 bool kasan_slab_free(struct kmem_cache *s, void *object, unsigned long ip);
 
 struct kasan_cache {
@@ -97,27 +99,40 @@
 static inline void kasan_cache_create(struct kmem_cache *cache,
 				      unsigned int *size,
 				      slab_flags_t *flags) {}
-static inline void kasan_cache_shrink(struct kmem_cache *cache) {}
-static inline void kasan_cache_shutdown(struct kmem_cache *cache) {}
 
 static inline void kasan_poison_slab(struct page *page) {}
 static inline void kasan_unpoison_object_data(struct kmem_cache *cache,
 					void *object) {}
 static inline void kasan_poison_object_data(struct kmem_cache *cache,
 					void *object) {}
-static inline void kasan_init_slab_obj(struct kmem_cache *cache,
-				const void *object) {}
+static inline void *kasan_init_slab_obj(struct kmem_cache *cache,
+				const void *object)
+{
+	return (void *)object;
+}
 
-static inline void kasan_kmalloc_large(void *ptr, size_t size, gfp_t flags) {}
+static inline void *kasan_kmalloc_large(void *ptr, size_t size, gfp_t flags)
+{
+	return ptr;
+}
 static inline void kasan_kfree_large(void *ptr, unsigned long ip) {}
 static inline void kasan_poison_kfree(void *ptr, unsigned long ip) {}
-static inline void kasan_kmalloc(struct kmem_cache *s, const void *object,
-				size_t size, gfp_t flags) {}
-static inline void kasan_krealloc(const void *object, size_t new_size,
-				 gfp_t flags) {}
+static inline void *kasan_kmalloc(struct kmem_cache *s, const void *object,
+				size_t size, gfp_t flags)
+{
+	return (void *)object;
+}
+static inline void *kasan_krealloc(const void *object, size_t new_size,
+				 gfp_t flags)
+{
+	return (void *)object;
+}
 
-static inline void kasan_slab_alloc(struct kmem_cache *s, void *object,
-				   gfp_t flags) {}
+static inline void *kasan_slab_alloc(struct kmem_cache *s, void *object,
+				   gfp_t flags)
+{
+	return object;
+}
 static inline bool kasan_slab_free(struct kmem_cache *s, void *object,
 				   unsigned long ip)
 {
@@ -140,4 +155,40 @@
 
 #endif /* CONFIG_KASAN */
 
+#ifdef CONFIG_KASAN_GENERIC
+
+#define KASAN_SHADOW_INIT 0
+
+void kasan_cache_shrink(struct kmem_cache *cache);
+void kasan_cache_shutdown(struct kmem_cache *cache);
+
+#else /* CONFIG_KASAN_GENERIC */
+
+static inline void kasan_cache_shrink(struct kmem_cache *cache) {}
+static inline void kasan_cache_shutdown(struct kmem_cache *cache) {}
+
+#endif /* CONFIG_KASAN_GENERIC */
+
+#ifdef CONFIG_KASAN_SW_TAGS
+
+#define KASAN_SHADOW_INIT 0xFF
+
+void kasan_init_tags(void);
+
+void *kasan_reset_tag(const void *addr);
+
+void kasan_report(unsigned long addr, size_t size,
+		bool is_write, unsigned long ip);
+
+#else /* CONFIG_KASAN_SW_TAGS */
+
+static inline void kasan_init_tags(void) { }
+
+static inline void *kasan_reset_tag(const void *addr)
+{
+	return (void *)addr;
+}
+
+#endif /* CONFIG_KASAN_SW_TAGS */
+
 #endif /* LINUX_KASAN_H */
diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h
index 84e9358..b85cc8e 100644
--- a/include/linux/kernfs.h
+++ b/include/linux/kernfs.h
@@ -25,6 +25,7 @@
 struct vm_area_struct;
 struct super_block;
 struct file_system_type;
+struct poll_table_struct;
 
 struct kernfs_open_node;
 struct kernfs_iattrs;
@@ -262,6 +263,9 @@
 	ssize_t (*write)(struct kernfs_open_file *of, char *buf, size_t bytes,
 			 loff_t off);
 
+	__poll_t (*poll)(struct kernfs_open_file *of,
+			 struct poll_table_struct *pt);
+
 	int (*mmap)(struct kernfs_open_file *of, struct vm_area_struct *vma);
 
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
@@ -351,6 +355,8 @@
 int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
 		     const char *new_name, const void *new_ns);
 int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
+__poll_t kernfs_generic_poll(struct kernfs_open_file *of,
+			     struct poll_table_struct *pt);
 void kernfs_notify(struct kernfs_node *kn);
 
 const void *kernfs_super_ns(struct super_block *sb);
diff --git a/include/linux/keyslot-manager.h b/include/linux/keyslot-manager.h
new file mode 100644
index 0000000..0777ade
--- /dev/null
+++ b/include/linux/keyslot-manager.h
@@ -0,0 +1,98 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright 2019 Google LLC
+ */
+
+#include <linux/bio.h>
+
+#ifdef CONFIG_BLOCK
+
+#ifndef __LINUX_KEYSLOT_MANAGER_H
+#define __LINUX_KEYSLOT_MANAGER_H
+
+/**
+ * struct keyslot_mgmt_ll_ops - functions to manage keyslots in hardware
+ * @keyslot_program:	Program the specified key and algorithm into the
+ *			specified slot in the inline encryption hardware.
+ * @keyslot_evict:	Evict key from the specified keyslot in the hardware.
+ *			The key, crypto_mode and data_unit_size are also passed
+ *			down so that e.g. dm layers can evict keys from
+ *			the devices that they map over.
+ *			Returns 0 on success, -errno otherwise.
+ * @crypto_mode_supported:	Check whether a crypto_mode and data_unit_size
+ *				combo is supported.
+ * @keyslot_find:	Returns the slot number that matches the key,
+ *			or -ENOKEY if no match found, or -errno on
+ *			error.
+ *
+ * This structure should be provided by storage device drivers when they set up
+ * a keyslot manager - this structure holds the function ptrs that the keyslot
+ * manager will use to manipulate keyslots in the hardware.
+ */
+struct keyslot_mgmt_ll_ops {
+	int (*keyslot_program)(void *ll_priv_data, const u8 *key,
+			       enum blk_crypto_mode_num crypto_mode,
+			       unsigned int data_unit_size,
+			       unsigned int slot);
+	int (*keyslot_evict)(void *ll_priv_data, const u8 *key,
+			     enum blk_crypto_mode_num crypto_mode,
+			     unsigned int data_unit_size,
+			     unsigned int slot);
+	bool (*crypto_mode_supported)(void *ll_priv_data,
+				      enum blk_crypto_mode_num crypto_mode,
+				      unsigned int data_unit_size);
+	int (*keyslot_find)(void *ll_priv_data, const u8 *key,
+			    enum blk_crypto_mode_num crypto_mode,
+			    unsigned int data_unit_size);
+};
+
+#ifdef CONFIG_BLK_INLINE_ENCRYPTION
+struct keyslot_manager;
+
+extern struct keyslot_manager *keyslot_manager_create(unsigned int num_slots,
+				const struct keyslot_mgmt_ll_ops *ksm_ops,
+				void *ll_priv_data);
+
+extern int
+keyslot_manager_get_slot_for_key(struct keyslot_manager *ksm,
+				 const u8 *key,
+				 enum blk_crypto_mode_num crypto_mode,
+				 unsigned int data_unit_size);
+
+extern void keyslot_manager_get_slot(struct keyslot_manager *ksm,
+				     unsigned int slot);
+
+extern void keyslot_manager_put_slot(struct keyslot_manager *ksm,
+				     unsigned int slot);
+
+extern bool
+keyslot_manager_crypto_mode_supported(struct keyslot_manager *ksm,
+				      enum blk_crypto_mode_num crypto_mode,
+				      unsigned int data_unit_size);
+
+extern bool
+keyslot_manager_rq_crypto_mode_supported(struct request_queue *q,
+					 enum blk_crypto_mode_num crypto_mode,
+					 unsigned int data_unit_size);
+
+extern int keyslot_manager_evict_key(struct keyslot_manager *ksm,
+				     const u8 *key,
+				     enum blk_crypto_mode_num crypto_mode,
+				     unsigned int data_unit_size);
+
+extern void keyslot_manager_destroy(struct keyslot_manager *ksm);
+
+#else /* CONFIG_BLK_INLINE_ENCRYPTION */
+
+static inline bool
+keyslot_manager_rq_crypto_mode_supported(struct request_queue *q,
+					 enum blk_crypto_mode_num crypto_mode,
+					 unsigned int data_unit_size)
+{
+	return false;
+}
+#endif /* CONFIG_BLK_INLINE_ENCRYPTION */
+
+#endif /* __LINUX_KEYSLOT_MANAGER_H */
+
+#endif /* CONFIG_BLOCK */
diff --git a/include/linux/kthread.h b/include/linux/kthread.h
index c196176..edf8f86 100644
--- a/include/linux/kthread.h
+++ b/include/linux/kthread.h
@@ -4,7 +4,6 @@
 /* Simple interface for creating and stopping kernel threads without mess. */
 #include <linux/err.h>
 #include <linux/sched.h>
-#include <linux/cgroup.h>
 
 __printf(4, 5)
 struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),
@@ -198,6 +197,8 @@
 
 void kthread_destroy_worker(struct kthread_worker *worker);
 
+struct cgroup_subsys_state;
+
 #ifdef CONFIG_BLK_CGROUP
 void kthread_associate_blkcg(struct cgroup_subsys_state *css);
 struct cgroup_subsys_state *kthread_blkcg(void);
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 5169205..a154655 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -342,6 +342,7 @@
 /* Flags for memblock_alloc_base() amd __memblock_alloc_base() */
 #define MEMBLOCK_ALLOC_ANYWHERE	(~(phys_addr_t)0)
 #define MEMBLOCK_ALLOC_ACCESSIBLE	0
+#define MEMBLOCK_ALLOC_KASAN		1
 
 phys_addr_t __init memblock_alloc_range(phys_addr_t size, phys_addr_t align,
 					phys_addr_t start, phys_addr_t end,
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 45f10f5..a3ece90 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -73,6 +73,17 @@
 #include <asm/pgtable.h>
 #include <asm/processor.h>
 
+/*
+ * Architectures that support memory tagging (assigning tags to memory regions,
+ * embedding these tags into addresses that point to these memory regions, and
+ * checking that the memory and the pointer tags match on memory accesses)
+ * redefine this macro to strip tags from pointers.
+ * It's defined as noop for arcitectures that don't support memory tagging.
+ */
+#ifndef untagged_addr
+#define untagged_addr(addr) (addr)
+#endif
+
 #ifndef __pa_symbol
 #define __pa_symbol(x)  __pa(RELOC_HIDE((unsigned long)(x), 0))
 #endif
@@ -799,6 +810,7 @@
 #define NODES_PGOFF		(SECTIONS_PGOFF - NODES_WIDTH)
 #define ZONES_PGOFF		(NODES_PGOFF - ZONES_WIDTH)
 #define LAST_CPUPID_PGOFF	(ZONES_PGOFF - LAST_CPUPID_WIDTH)
+#define KASAN_TAG_PGOFF		(LAST_CPUPID_PGOFF - KASAN_TAG_WIDTH)
 
 /*
  * Define the bit shifts to access each section.  For non-existent
@@ -809,6 +821,7 @@
 #define NODES_PGSHIFT		(NODES_PGOFF * (NODES_WIDTH != 0))
 #define ZONES_PGSHIFT		(ZONES_PGOFF * (ZONES_WIDTH != 0))
 #define LAST_CPUPID_PGSHIFT	(LAST_CPUPID_PGOFF * (LAST_CPUPID_WIDTH != 0))
+#define KASAN_TAG_PGSHIFT	(KASAN_TAG_PGOFF * (KASAN_TAG_WIDTH != 0))
 
 /* NODE:ZONE or SECTION:ZONE is used to ID a zone for the buddy allocator */
 #ifdef NODE_NOT_IN_PAGE_FLAGS
@@ -831,6 +844,7 @@
 #define NODES_MASK		((1UL << NODES_WIDTH) - 1)
 #define SECTIONS_MASK		((1UL << SECTIONS_WIDTH) - 1)
 #define LAST_CPUPID_MASK	((1UL << LAST_CPUPID_SHIFT) - 1)
+#define KASAN_TAG_MASK		((1UL << KASAN_TAG_WIDTH) - 1)
 #define ZONEID_MASK		((1UL << ZONEID_SHIFT) - 1)
 
 static inline enum zone_type page_zonenum(const struct page *page)
@@ -1089,6 +1103,32 @@
 }
 #endif /* CONFIG_NUMA_BALANCING */
 
+#ifdef CONFIG_KASAN_SW_TAGS
+static inline u8 page_kasan_tag(const struct page *page)
+{
+	return (page->flags >> KASAN_TAG_PGSHIFT) & KASAN_TAG_MASK;
+}
+
+static inline void page_kasan_tag_set(struct page *page, u8 tag)
+{
+	page->flags &= ~(KASAN_TAG_MASK << KASAN_TAG_PGSHIFT);
+	page->flags |= (tag & KASAN_TAG_MASK) << KASAN_TAG_PGSHIFT;
+}
+
+static inline void page_kasan_tag_reset(struct page *page)
+{
+	page_kasan_tag_set(page, 0xff);
+}
+#else
+static inline u8 page_kasan_tag(const struct page *page)
+{
+	return 0xff;
+}
+
+static inline void page_kasan_tag_set(struct page *page, u8 tag) { }
+static inline void page_kasan_tag_reset(struct page *page) { }
+#endif
+
 static inline struct zone *page_zone(const struct page *page)
 {
 	return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)];
@@ -1606,19 +1646,28 @@
 	return (unsigned long)val;
 }
 
+void mm_trace_rss_stat(struct mm_struct *mm, int member, long count,
+		       long value);
+
 static inline void add_mm_counter(struct mm_struct *mm, int member, long value)
 {
-	atomic_long_add(value, &mm->rss_stat.count[member]);
+	long count = atomic_long_add_return(value, &mm->rss_stat.count[member]);
+
+	mm_trace_rss_stat(mm, member, count, value);
 }
 
 static inline void inc_mm_counter(struct mm_struct *mm, int member)
 {
-	atomic_long_inc(&mm->rss_stat.count[member]);
+	long count = atomic_long_inc_return(&mm->rss_stat.count[member]);
+
+	mm_trace_rss_stat(mm, member, count, 1);
 }
 
 static inline void dec_mm_counter(struct mm_struct *mm, int member)
 {
-	atomic_long_dec(&mm->rss_stat.count[member]);
+	long count = atomic_long_dec_return(&mm->rss_stat.count[member]);
+
+	mm_trace_rss_stat(mm, member, count, -1);
 }
 
 /* Optimized variant when page is already known not to be PageAnon */
@@ -2243,7 +2292,7 @@
 extern struct vm_area_struct *vma_merge(struct mm_struct *,
 	struct vm_area_struct *prev, unsigned long addr, unsigned long end,
 	unsigned long vm_flags, struct anon_vma *, struct file *, pgoff_t,
-	struct mempolicy *, struct vm_userfaultfd_ctx);
+	struct mempolicy *, struct vm_userfaultfd_ctx, const char __user *);
 extern struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *);
 extern int __split_vma(struct mm_struct *, struct vm_area_struct *,
 	unsigned long addr, int new_below);
@@ -2611,6 +2660,30 @@
 					int enable) { }
 #endif
 
+#ifdef CONFIG_INIT_ON_ALLOC_DEFAULT_ON
+DECLARE_STATIC_KEY_TRUE(init_on_alloc);
+#else
+DECLARE_STATIC_KEY_FALSE(init_on_alloc);
+#endif
+static inline bool want_init_on_alloc(gfp_t flags)
+{
+	if (static_branch_unlikely(&init_on_alloc) &&
+	    !page_poisoning_enabled())
+		return true;
+	return flags & __GFP_ZERO;
+}
+
+#ifdef CONFIG_INIT_ON_FREE_DEFAULT_ON
+DECLARE_STATIC_KEY_TRUE(init_on_free);
+#else
+DECLARE_STATIC_KEY_FALSE(init_on_free);
+#endif
+static inline bool want_init_on_free(void)
+{
+	return static_branch_unlikely(&init_on_free) &&
+	       !page_poisoning_enabled();
+}
+
 #ifdef CONFIG_DEBUG_PAGEALLOC
 extern bool _debug_pagealloc_enabled;
 extern void __kernel_map_pages(struct page *page, int numpages, int enable);
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 3a9a996..3f6ab00 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -295,11 +295,18 @@
 	/*
 	 * For areas with an address space and backing store,
 	 * linkage into the address_space->i_mmap interval tree.
+	 *
+	 * For private anonymous mappings, a pointer to a null terminated string
+	 * in the user process containing the name given to the vma, or NULL
+	 * if unnamed.
 	 */
-	struct {
-		struct rb_node rb;
-		unsigned long rb_subtree_last;
-	} shared;
+	union {
+		struct {
+			struct rb_node rb;
+			unsigned long rb_subtree_last;
+		} shared;
+		const char __user *anon_name;
+	};
 
 	/*
 	 * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma
@@ -654,4 +661,13 @@
 	unsigned long val;
 } swp_entry_t;
 
+/* Return the name for an anonymous mapping or NULL for a file-backed mapping */
+static inline const char __user *vma_get_anon_name(struct vm_area_struct *vma)
+{
+	if (vma->vm_file)
+		return NULL;
+
+	return vma->anon_name;
+}
+
 #endif /* _LINUX_MM_TYPES_H */
diff --git a/include/linux/mmc/pm.h b/include/linux/mmc/pm.h
index 4a13920..6e2d6a1 100644
--- a/include/linux/mmc/pm.h
+++ b/include/linux/mmc/pm.h
@@ -26,5 +26,6 @@
 
 #define MMC_PM_KEEP_POWER	(1 << 0)	/* preserve card power during suspend */
 #define MMC_PM_WAKE_SDIO_IRQ	(1 << 1)	/* wake up host system on SDIO IRQ assertion */
+#define MMC_PM_IGNORE_PM_NOTIFY	(1 << 2)	/* ignore mmc pm notify */
 
 #endif /* LINUX_MMC_PM_H */
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index d4b0c79..45c1c31 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -142,6 +142,9 @@
 	NR_MLOCK,		/* mlock()ed pages found and moved off LRU */
 	NR_PAGETABLE,		/* used for pagetables */
 	NR_KERNEL_STACK_KB,	/* measured in KiB */
+#if IS_ENABLED(CONFIG_SHADOW_CALL_STACK)
+	NR_KERNEL_SCS_BYTES,	/* measured in bytes */
+#endif
 	/* Second 128 byte cacheline */
 	NR_BOUNCE,
 #if IS_ENABLED(CONFIG_ZSMALLOC)
@@ -163,6 +166,7 @@
 	NR_ISOLATED_FILE,	/* Temporary isolated pages from file lru */
 	WORKINGSET_REFAULT,
 	WORKINGSET_ACTIVATE,
+	WORKINGSET_RESTORE,
 	WORKINGSET_NODERECLAIM,
 	NR_ANON_MAPPED,	/* Mapped anonymous pages */
 	NR_FILE_MAPPED,	/* pagecache pages mapped into pagetables.
@@ -180,7 +184,7 @@
 	NR_VMSCAN_IMMEDIATE,	/* Prioritise for reclaim when writeback ends */
 	NR_DIRTIED,		/* page dirtyings since bootup */
 	NR_WRITTEN,		/* page writings since bootup */
-	NR_INDIRECTLY_RECLAIMABLE_BYTES, /* measured in bytes */
+	NR_KERNEL_MISC_RECLAIMABLE,	/* reclaimable non-slab kernel pages */
 	NR_VM_NODE_STAT_ITEMS
 };
 
diff --git a/include/linux/module.h b/include/linux/module.h
index 9915397..1c513ae 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -21,6 +21,7 @@
 #include <linux/rbtree_latch.h>
 #include <linux/error-injection.h>
 #include <linux/tracepoint-defs.h>
+#include <linux/cfi.h>
 
 #include <linux/percpu.h>
 #include <asm/module.h>
@@ -348,6 +349,10 @@
 	const s32 *crcs;
 	unsigned int num_syms;
 
+#ifdef CONFIG_CFI_CLANG
+	cfi_check_fn cfi_check;
+#endif
+
 	/* Kernel parameters. */
 #ifdef CONFIG_SYSFS
 	struct mutex param_lock;
@@ -372,10 +377,12 @@
 	const s32 *unused_gpl_crcs;
 #endif
 
-#ifdef CONFIG_MODULE_SIG
-	/* Signature was verified. */
+	/*
+	 * Signature was verified. Unconditionally compiled in Android to
+	 * preserve ABI compatibility between kernels without module
+	 * signing enabled and signed modules.
+	 */
 	bool sig_ok;
-#endif
 
 	bool async_probe_requested;
 
@@ -683,6 +690,23 @@
 	return false;
 }
 
+static inline bool within_module_core(unsigned long addr,
+				      const struct module *mod)
+{
+	return false;
+}
+
+static inline bool within_module_init(unsigned long addr,
+				      const struct module *mod)
+{
+	return false;
+}
+
+static inline bool within_module(unsigned long addr, const struct module *mod)
+{
+	return false;
+}
+
 /* Get/put a kernel symbol (calls should be symmetric) */
 #define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); })
 #define symbol_put(x) do { } while (0)
diff --git a/include/linux/mount.h b/include/linux/mount.h
index 4b0db44..6645650 100644
--- a/include/linux/mount.h
+++ b/include/linux/mount.h
@@ -68,6 +68,7 @@
 	struct dentry *mnt_root;	/* root of the mounted tree */
 	struct super_block *mnt_sb;	/* pointer to superblock */
 	int mnt_flags;
+	void *data;
 } __randomize_layout;
 
 struct file; /* forward dec */
diff --git a/include/linux/namei.h b/include/linux/namei.h
index a78606e..e53a912 100644
--- a/include/linux/namei.h
+++ b/include/linux/namei.h
@@ -79,10 +79,13 @@
 extern struct dentry *user_path_create(int, const char __user *, struct path *, unsigned int);
 extern void done_path_create(struct path *, struct dentry *);
 extern struct dentry *kern_path_locked(const char *, struct path *);
+extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
+			   const char *, unsigned int, struct path *);
 extern int kern_path_mountpoint(int, const char *, struct path *, unsigned int);
 
 extern struct dentry *try_lookup_one_len(const char *, struct dentry *, int);
 extern struct dentry *lookup_one_len(const char *, struct dentry *, int);
+extern struct dentry *lookup_one_len2(const char *, struct vfsmount *mnt, struct dentry *, int);
 extern struct dentry *lookup_one_len_unlocked(const char *, struct dentry *, int);
 
 extern int follow_down_one(struct path *);
diff --git a/include/linux/netfilter/xt_quota2.h b/include/linux/netfilter/xt_quota2.h
new file mode 100644
index 0000000..eadc69033
--- /dev/null
+++ b/include/linux/netfilter/xt_quota2.h
@@ -0,0 +1,25 @@
+#ifndef _XT_QUOTA_H
+#define _XT_QUOTA_H
+
+enum xt_quota_flags {
+	XT_QUOTA_INVERT    = 1 << 0,
+	XT_QUOTA_GROW      = 1 << 1,
+	XT_QUOTA_PACKET    = 1 << 2,
+	XT_QUOTA_NO_CHANGE = 1 << 3,
+	XT_QUOTA_MASK      = 0x0F,
+};
+
+struct xt_quota_counter;
+
+struct xt_quota_mtinfo2 {
+	char name[15];
+	u_int8_t flags;
+
+	/* Comparison-invariant */
+	aligned_u64 quota;
+
+	/* Used internally by the kernel */
+	struct xt_quota_counter *master __attribute__((aligned(8)));
+};
+
+#endif /* _XT_QUOTA_H */
diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h
index b9cd9eb..587c147 100644
--- a/include/linux/of_fdt.h
+++ b/include/linux/of_fdt.h
@@ -69,6 +69,27 @@
 extern int of_get_flat_dt_size(void);
 extern uint32_t of_get_flat_dt_phandle(unsigned long node);
 
+/*
+ * early_init_dt_scan_chosen - scan the device tree for ramdisk and bootargs
+ *
+ * The boot arguments will be placed into the memory pointed to by @data.
+ * That memory should be COMMAND_LINE_SIZE big and initialized to be a valid
+ * (possibly empty) string.  Logic for what will be in @data after this
+ * function finishes:
+ *
+ * - CONFIG_CMDLINE_FORCE=true
+ *     CONFIG_CMDLINE
+ * - CONFIG_CMDLINE_EXTEND=true, @data is non-empty string
+ *     @data + dt bootargs (even if dt bootargs are empty)
+ * - CONFIG_CMDLINE_EXTEND=true, @data is empty string
+ *     CONFIG_CMDLINE + dt bootargs (even if dt bootargs are empty)
+ * - CMDLINE_FROM_BOOTLOADER=true, dt bootargs=non-empty:
+ *     dt bootargs
+ * - CMDLINE_FROM_BOOTLOADER=true, dt bootargs=empty, @data is non-empty string
+ *     @data is left unchanged
+ * - CMDLINE_FROM_BOOTLOADER=true, dt bootargs=empty, @data is empty string
+ *     CONFIG_CMDLINE (or "" if that's not defined)
+ */
 extern int early_init_dt_scan_chosen(unsigned long node, const char *uname,
 				     int depth, void *data);
 extern int early_init_dt_scan_memory(unsigned long node, const char *uname,
diff --git a/include/linux/page-flags-layout.h b/include/linux/page-flags-layout.h
index 7ec86bf..1dda318 100644
--- a/include/linux/page-flags-layout.h
+++ b/include/linux/page-flags-layout.h
@@ -82,6 +82,16 @@
 #define LAST_CPUPID_WIDTH 0
 #endif
 
+#ifdef CONFIG_KASAN_SW_TAGS
+#define KASAN_TAG_WIDTH 8
+#if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH+LAST_CPUPID_WIDTH+KASAN_TAG_WIDTH \
+	> BITS_PER_LONG - NR_PAGEFLAGS
+#error "KASAN: not enough bits in page flags for tag"
+#endif
+#else
+#define KASAN_TAG_WIDTH 0
+#endif
+
 /*
  * We are going to use the flags for the page to node mapping if its in
  * there.  This includes the case where there is no node, so it is implicit.
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index 3f066ce..c0e5c79 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -69,13 +69,14 @@
  */
 enum pageflags {
 	PG_locked,		/* Page is locked. Don't touch. */
-	PG_error,
 	PG_referenced,
 	PG_uptodate,
 	PG_dirty,
 	PG_lru,
 	PG_active,
+	PG_workingset,
 	PG_waiters,		/* Page has waiters, check its waitqueue. Must be bit #7 and in the same byte as "PG_locked" */
+	PG_error,
 	PG_slab,
 	PG_owner_priv_1,	/* Owner use. If pagecache, fs may use*/
 	PG_arch_1,
@@ -280,6 +281,8 @@
 PAGEFLAG(LRU, lru, PF_HEAD) __CLEARPAGEFLAG(LRU, lru, PF_HEAD)
 PAGEFLAG(Active, active, PF_HEAD) __CLEARPAGEFLAG(Active, active, PF_HEAD)
 	TESTCLEARFLAG(Active, active, PF_HEAD)
+PAGEFLAG(Workingset, workingset, PF_HEAD)
+	TESTCLEARFLAG(Workingset, workingset, PF_HEAD)
 __PAGEFLAG(Slab, slab, PF_NO_TAIL)
 __PAGEFLAG(SlobFree, slob_free, PF_NO_TAIL)
 PAGEFLAG(Checked, checked, PF_NO_COMPOUND)	   /* Used by some filesystems */
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index b1bd218..78cac3f 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -252,6 +252,7 @@
 #define FGP_WRITE		0x00000008
 #define FGP_NOFS		0x00000010
 #define FGP_NOWAIT		0x00000020
+#define FGP_FOR_MMAP		0x00000040
 
 struct page *pagecache_get_page(struct address_space *mapping, pgoff_t offset,
 		int fgp_flags, gfp_t cache_gfp_mask);
@@ -398,8 +399,7 @@
 static inline struct page *read_mapping_page(struct address_space *mapping,
 				pgoff_t index, void *data)
 {
-	filler_t *filler = (filler_t *)mapping->a_ops->readpage;
-	return read_cache_page(mapping, index, filler, data);
+	return read_cache_page(mapping, index, NULL, data);
 }
 
 /*
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index b22bc81..205c794 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -494,6 +494,11 @@
 	unsigned int		nr_file_filters;
 };
 
+struct perf_addr_filter_range {
+	unsigned long		start;
+	unsigned long		size;
+};
+
 /**
  * enum perf_event_state - the states of an event:
  */
@@ -670,7 +675,7 @@
 	/* address range filters */
 	struct perf_addr_filters_head	addr_filters;
 	/* vma address array for file-based filders */
-	unsigned long			*addr_filters_offs;
+	struct perf_addr_filter_range	*addr_filter_ranges;
 	unsigned long			addr_filters_gen;
 
 	void (*destroy)(struct perf_event *);
@@ -1189,6 +1194,11 @@
 int perf_event_max_stack_handler(struct ctl_table *table, int write,
 				 void __user *buffer, size_t *lenp, loff_t *ppos);
 
+static inline bool perf_paranoid_any(void)
+{
+	return sysctl_perf_event_paranoid > 2;
+}
+
 static inline bool perf_paranoid_tracepoint_raw(void)
 {
 	return sysctl_perf_event_paranoid > -1;
diff --git a/include/linux/pid.h b/include/linux/pid.h
index 14a9a39..a82d2f7 100644
--- a/include/linux/pid.h
+++ b/include/linux/pid.h
@@ -3,6 +3,7 @@
 #define _LINUX_PID_H
 
 #include <linux/rculist.h>
+#include <linux/wait.h>
 
 enum pid_type
 {
@@ -60,12 +61,16 @@
 	unsigned int level;
 	/* lists of tasks that use this pid */
 	struct hlist_head tasks[PIDTYPE_MAX];
+	/* wait queue for pidfd notifications */
+	wait_queue_head_t wait_pidfd;
 	struct rcu_head rcu;
 	struct upid numbers[1];
 };
 
 extern struct pid init_struct_pid;
 
+extern const struct file_operations pidfd_fops;
+
 static inline struct pid *get_pid(struct pid *pid)
 {
 	if (pid)
diff --git a/include/linux/pm.h b/include/linux/pm.h
index e723b78..e573f95 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -591,6 +591,7 @@
 	bool			is_suspended:1;	/* Ditto */
 	bool			is_noirq_suspended:1;
 	bool			is_late_suspended:1;
+	bool			no_pm:1;
 	bool			early_init:1;	/* Owned by the PM core */
 	bool			direct_complete:1;	/* Owned by the PM core */
 	u32			driver_flags;
diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
index 099b319..11dbffc 100644
--- a/include/linux/pm_opp.h
+++ b/include/linux/pm_opp.h
@@ -301,6 +301,7 @@
 struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
 struct dev_pm_opp *of_dev_pm_opp_find_required_opp(struct device *dev, struct device_node *np);
 struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp);
+int of_dev_pm_opp_get_cpu_power(unsigned long *mW, unsigned long *KHz, int cpu);
 #else
 static inline int dev_pm_opp_of_add_table(struct device *dev)
 {
@@ -343,6 +344,10 @@
 {
 	return NULL;
 }
+static inline int of_dev_pm_opp_get_cpu_power(unsigned long *mW, unsigned long *KHz, int cpu)
+{
+	return -ENOTSUPP;
+}
 #endif
 
 #endif		/* __LINUX_OPP_H__ */
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h
index 4238dde..4e5f86e 100644
--- a/include/linux/pm_wakeup.h
+++ b/include/linux/pm_wakeup.h
@@ -34,6 +34,7 @@
  * struct wakeup_source - Representation of wakeup sources
  *
  * @name: Name of the wakeup source
+ * @id: Wakeup source id
  * @entry: Wakeup source list entry
  * @lock: Wakeup source lock
  * @wakeirq: Optional device specific wakeirq
@@ -48,11 +49,13 @@
  * @relax_count: Number of times the wakeup source was deactivated.
  * @expire_count: Number of times the wakeup source's timeout has expired.
  * @wakeup_count: Number of times the wakeup source might abort suspend.
+ * @dev: Struct device for sysfs statistics about the wakeup source.
  * @active: Status of the wakeup source.
  * @has_timeout: The wakeup source has been activated with a timeout.
  */
 struct wakeup_source {
 	const char 		*name;
+	int			id;
 	struct list_head	entry;
 	spinlock_t		lock;
 	struct wake_irq		*wakeirq;
@@ -68,6 +71,7 @@
 	unsigned long		relax_count;
 	unsigned long		expire_count;
 	unsigned long		wakeup_count;
+	struct device		*dev;
 	bool			active:1;
 	bool			autosleep_enabled:1;
 };
@@ -94,13 +98,12 @@
 }
 
 /* drivers/base/power/wakeup.c */
-extern void wakeup_source_prepare(struct wakeup_source *ws, const char *name);
 extern struct wakeup_source *wakeup_source_create(const char *name);
-extern void wakeup_source_drop(struct wakeup_source *ws);
 extern void wakeup_source_destroy(struct wakeup_source *ws);
 extern void wakeup_source_add(struct wakeup_source *ws);
 extern void wakeup_source_remove(struct wakeup_source *ws);
-extern struct wakeup_source *wakeup_source_register(const char *name);
+extern struct wakeup_source *wakeup_source_register(struct device *dev,
+						    const char *name);
 extern void wakeup_source_unregister(struct wakeup_source *ws);
 extern int device_wakeup_enable(struct device *dev);
 extern int device_wakeup_disable(struct device *dev);
@@ -126,23 +129,19 @@
 	return dev->power.can_wakeup;
 }
 
-static inline void wakeup_source_prepare(struct wakeup_source *ws,
-					 const char *name) {}
-
 static inline struct wakeup_source *wakeup_source_create(const char *name)
 {
 	return NULL;
 }
 
-static inline void wakeup_source_drop(struct wakeup_source *ws) {}
-
 static inline void wakeup_source_destroy(struct wakeup_source *ws) {}
 
 static inline void wakeup_source_add(struct wakeup_source *ws) {}
 
 static inline void wakeup_source_remove(struct wakeup_source *ws) {}
 
-static inline struct wakeup_source *wakeup_source_register(const char *name)
+static inline struct wakeup_source *wakeup_source_register(struct device *dev,
+							   const char *name)
 {
 	return NULL;
 }
@@ -197,19 +196,6 @@
 
 #endif /* !CONFIG_PM_SLEEP */
 
-static inline void wakeup_source_init(struct wakeup_source *ws,
-				      const char *name)
-{
-	wakeup_source_prepare(ws, name);
-	wakeup_source_add(ws);
-}
-
-static inline void wakeup_source_trash(struct wakeup_source *ws)
-{
-	wakeup_source_remove(ws);
-	wakeup_source_drop(ws);
-}
-
 static inline void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec)
 {
 	return pm_wakeup_ws_event(ws, msec, false);
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
index d0e1f15..0853d72 100644
--- a/include/linux/proc_fs.h
+++ b/include/linux/proc_fs.h
@@ -73,6 +73,7 @@
 						    int (*show)(struct seq_file *, void *),
 						    proc_write_t write,
 						    void *data);
+extern struct pid *tgid_pidfd_to_pid(const struct file *file);
 
 #else /* CONFIG_PROC_FS */
 
@@ -114,8 +115,19 @@
 #define proc_create_net(name, mode, parent, state_size, ops) ({NULL;})
 #define proc_create_net_single(name, mode, parent, show, data) ({NULL;})
 
+static inline struct pid *tgid_pidfd_to_pid(const struct file *file)
+{
+	return ERR_PTR(-EBADF);
+}
+
 #endif /* CONFIG_PROC_FS */
 
+#ifdef CONFIG_PROC_UID
+extern void proc_register_uid(kuid_t uid);
+#else
+static inline void proc_register_uid(kuid_t uid) {}
+#endif
+
 struct net;
 
 static inline struct proc_dir_entry *proc_net_mkdir(
diff --git a/include/linux/psi.h b/include/linux/psi.h
new file mode 100644
index 0000000..af892c2
--- /dev/null
+++ b/include/linux/psi.h
@@ -0,0 +1,62 @@
+#ifndef _LINUX_PSI_H
+#define _LINUX_PSI_H
+
+#include <linux/jump_label.h>
+#include <linux/psi_types.h>
+#include <linux/sched.h>
+#include <linux/poll.h>
+
+struct seq_file;
+struct css_set;
+
+#ifdef CONFIG_PSI
+
+extern struct static_key_false psi_disabled;
+
+void psi_init(void);
+
+void psi_task_change(struct task_struct *task, int clear, int set);
+
+void psi_memstall_tick(struct task_struct *task, int cpu);
+void psi_memstall_enter(unsigned long *flags);
+void psi_memstall_leave(unsigned long *flags);
+
+int psi_show(struct seq_file *s, struct psi_group *group, enum psi_res res);
+
+#ifdef CONFIG_CGROUPS
+int psi_cgroup_alloc(struct cgroup *cgrp);
+void psi_cgroup_free(struct cgroup *cgrp);
+void cgroup_move_task(struct task_struct *p, struct css_set *to);
+
+struct psi_trigger *psi_trigger_create(struct psi_group *group,
+			char *buf, size_t nbytes, enum psi_res res);
+void psi_trigger_replace(void **trigger_ptr, struct psi_trigger *t);
+
+__poll_t psi_trigger_poll(void **trigger_ptr, struct file *file,
+			poll_table *wait);
+#endif
+
+#else /* CONFIG_PSI */
+
+static inline void psi_init(void) {}
+
+static inline void psi_memstall_enter(unsigned long *flags) {}
+static inline void psi_memstall_leave(unsigned long *flags) {}
+
+#ifdef CONFIG_CGROUPS
+static inline int psi_cgroup_alloc(struct cgroup *cgrp)
+{
+	return 0;
+}
+static inline void psi_cgroup_free(struct cgroup *cgrp)
+{
+}
+static inline void cgroup_move_task(struct task_struct *p, struct css_set *to)
+{
+	rcu_assign_pointer(p->cgroups, to);
+}
+#endif
+
+#endif /* CONFIG_PSI */
+
+#endif /* _LINUX_PSI_H */
diff --git a/include/linux/psi_types.h b/include/linux/psi_types.h
new file mode 100644
index 0000000..07aaf9b
--- /dev/null
+++ b/include/linux/psi_types.h
@@ -0,0 +1,173 @@
+#ifndef _LINUX_PSI_TYPES_H
+#define _LINUX_PSI_TYPES_H
+
+#include <linux/kthread.h>
+#include <linux/seqlock.h>
+#include <linux/types.h>
+#include <linux/kref.h>
+#include <linux/wait.h>
+
+#ifdef CONFIG_PSI
+
+/* Tracked task states */
+enum psi_task_count {
+	NR_IOWAIT,
+	NR_MEMSTALL,
+	NR_RUNNING,
+	NR_PSI_TASK_COUNTS = 3,
+};
+
+/* Task state bitmasks */
+#define TSK_IOWAIT	(1 << NR_IOWAIT)
+#define TSK_MEMSTALL	(1 << NR_MEMSTALL)
+#define TSK_RUNNING	(1 << NR_RUNNING)
+
+/* Resources that workloads could be stalled on */
+enum psi_res {
+	PSI_IO,
+	PSI_MEM,
+	PSI_CPU,
+	NR_PSI_RESOURCES = 3,
+};
+
+/*
+ * Pressure states for each resource:
+ *
+ * SOME: Stalled tasks & working tasks
+ * FULL: Stalled tasks & no working tasks
+ */
+enum psi_states {
+	PSI_IO_SOME,
+	PSI_IO_FULL,
+	PSI_MEM_SOME,
+	PSI_MEM_FULL,
+	PSI_CPU_SOME,
+	/* Only per-CPU, to weigh the CPU in the global average: */
+	PSI_NONIDLE,
+	NR_PSI_STATES = 6,
+};
+
+enum psi_aggregators {
+	PSI_AVGS = 0,
+	PSI_POLL,
+	NR_PSI_AGGREGATORS,
+};
+
+struct psi_group_cpu {
+	/* 1st cacheline updated by the scheduler */
+
+	/* Aggregator needs to know of concurrent changes */
+	seqcount_t seq ____cacheline_aligned_in_smp;
+
+	/* States of the tasks belonging to this group */
+	unsigned int tasks[NR_PSI_TASK_COUNTS];
+
+	/* Aggregate pressure state derived from the tasks */
+	u32 state_mask;
+
+	/* Period time sampling buckets for each state of interest (ns) */
+	u32 times[NR_PSI_STATES];
+
+	/* Time of last task change in this group (rq_clock) */
+	u64 state_start;
+
+	/* 2nd cacheline updated by the aggregator */
+
+	/* Delta detection against the sampling buckets */
+	u32 times_prev[NR_PSI_AGGREGATORS][NR_PSI_STATES]
+			____cacheline_aligned_in_smp;
+};
+
+/* PSI growth tracking window */
+struct psi_window {
+	/* Window size in ns */
+	u64 size;
+
+	/* Start time of the current window in ns */
+	u64 start_time;
+
+	/* Value at the start of the window */
+	u64 start_value;
+
+	/* Value growth in the previous window */
+	u64 prev_growth;
+};
+
+struct psi_trigger {
+	/* PSI state being monitored by the trigger */
+	enum psi_states state;
+
+	/* User-spacified threshold in ns */
+	u64 threshold;
+
+	/* List node inside triggers list */
+	struct list_head node;
+
+	/* Backpointer needed during trigger destruction */
+	struct psi_group *group;
+
+	/* Wait queue for polling */
+	wait_queue_head_t event_wait;
+
+	/* Pending event flag */
+	int event;
+
+	/* Tracking window */
+	struct psi_window win;
+
+	/*
+	 * Time last event was generated. Used for rate-limiting
+	 * events to one per window
+	 */
+	u64 last_event_time;
+
+	/* Refcounting to prevent premature destruction */
+	struct kref refcount;
+};
+
+struct psi_group {
+	/* Protects data used by the aggregator */
+	struct mutex avgs_lock;
+
+	/* Per-cpu task state & time tracking */
+	struct psi_group_cpu __percpu *pcpu;
+
+	/* Running pressure averages */
+	u64 avg_total[NR_PSI_STATES - 1];
+	u64 avg_last_update;
+	u64 avg_next_update;
+
+	/* Aggregator work control */
+	struct delayed_work avgs_work;
+
+	/* Total stall times and sampled pressure averages */
+	u64 total[NR_PSI_AGGREGATORS][NR_PSI_STATES - 1];
+	unsigned long avg[NR_PSI_STATES - 1][3];
+
+	/* Monitor work control */
+	atomic_t poll_scheduled;
+	struct kthread_worker __rcu *poll_kworker;
+	struct kthread_delayed_work poll_work;
+
+	/* Protects data used by the monitor */
+	struct mutex trigger_lock;
+
+	/* Configured polling triggers */
+	struct list_head triggers;
+	u32 nr_triggers[NR_PSI_STATES - 1];
+	u32 poll_states;
+	u64 poll_min_period;
+
+	/* Total stall times at the start of monitor activation */
+	u64 polling_total[NR_PSI_STATES - 1];
+	u64 polling_next_update;
+	u64 polling_until;
+};
+
+#else /* CONFIG_PSI */
+
+struct psi_group { };
+
+#endif /* CONFIG_PSI */
+
+#endif /* _LINUX_PSI_TYPES_H */
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 20f5ba2..abfaea6 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -355,12 +355,6 @@
  * For cfs_rq, it is the aggregated load_avg of all runnable and
  * blocked sched_entities.
  *
- * load_avg may also take frequency scaling into account:
- *
- *   load_avg = runnable% * scale_load_down(load) * freq%
- *
- * where freq% is the CPU frequency normalized to the highest frequency.
- *
  * [util_avg definition]
  *
  *   util_avg = running% * SCHED_CAPACITY_SCALE
@@ -369,17 +363,14 @@
  * a CPU. For cfs_rq, it is the aggregated util_avg of all runnable
  * and blocked sched_entities.
  *
- * util_avg may also factor frequency scaling and CPU capacity scaling:
+ * load_avg and util_avg don't direcly factor frequency scaling and CPU
+ * capacity scaling. The scaling is done through the rq_clock_pelt that
+ * is used for computing those signals (see update_rq_clock_pelt())
  *
- *   util_avg = running% * SCHED_CAPACITY_SCALE * freq% * capacity%
- *
- * where freq% is the same as above, and capacity% is the CPU capacity
- * normalized to the greatest capacity (due to uarch differences, etc).
- *
- * N.B., the above ratios (runnable%, running%, freq%, and capacity%)
- * themselves are in the range of [0, 1]. To do fixed point arithmetics,
- * we therefore scale them to as large a range as necessary. This is for
- * example reflected by util_avg's SCHED_CAPACITY_SCALE.
+ * N.B., the above ratios (runnable% and running%) themselves are in the
+ * range of [0, 1]. To do fixed point arithmetics, we therefore scale them
+ * to as large a range as necessary. This is for example reflected by
+ * util_avg's SCHED_CAPACITY_SCALE.
  *
  * [Overflow issue]
  *
@@ -710,6 +701,10 @@
 	unsigned			sched_contributes_to_load:1;
 	unsigned			sched_migrated:1;
 	unsigned			sched_remote_wakeup:1;
+#ifdef CONFIG_PSI
+	unsigned			sched_psi_wake_requeue:1;
+#endif
+
 	/* Force alignment to the next boundary: */
 	unsigned			:0;
 
@@ -799,6 +794,10 @@
 	u64				stimescaled;
 #endif
 	u64				gtime;
+#ifdef CONFIG_CPU_FREQ_TIMES
+	u64				*time_in_state;
+	unsigned int			max_state;
+#endif
 	struct prev_cputime		prev_cputime;
 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
 	struct vtime			vtime;
@@ -963,6 +962,10 @@
 	siginfo_t			*last_siginfo;
 
 	struct task_io_accounting	ioac;
+#ifdef CONFIG_PSI
+	/* Pressure stall state */
+	unsigned int			psi_flags;
+#endif
 #ifdef CONFIG_TASK_XACCT
 	/* Accumulated RSS usage: */
 	u64				acct_rss_mem1;
@@ -1398,6 +1401,7 @@
 #define PF_KTHREAD		0x00200000	/* I am a kernel thread */
 #define PF_RANDOMIZE		0x00400000	/* Randomize virtual address space */
 #define PF_SWAPWRITE		0x00800000	/* Allowed to write to swap */
+#define PF_MEMSTALL		0x01000000	/* Stalled due to lack of memory */
 #define PF_NO_SETAFFINITY	0x04000000	/* Userland is not allowed to meddle with cpus_allowed */
 #define PF_MCE_EARLY		0x08000000      /* Early kill for mce process policy */
 #define PF_MUTEX_TESTER		0x20000000	/* Thread belongs to the rt mutex tester */
diff --git a/include/linux/sched/cpufreq.h b/include/linux/sched/cpufreq.h
index a4530d7..cc6bcc1 100644
--- a/include/linux/sched/cpufreq.h
+++ b/include/linux/sched/cpufreq.h
@@ -23,6 +23,12 @@
 				    unsigned int flags));
 void cpufreq_remove_update_util_hook(int cpu);
 bool cpufreq_this_cpu_can_update(struct cpufreq_policy *policy);
+
+static inline unsigned long map_util_freq(unsigned long util,
+					unsigned long freq, unsigned long cap)
+{
+	return (freq + (freq >> 2)) * util / cap;
+}
 #endif /* CONFIG_CPU_FREQ */
 
 #endif /* _LINUX_SCHED_CPUFREQ_H */
diff --git a/include/linux/sched/loadavg.h b/include/linux/sched/loadavg.h
index 80bc84b..4859bea 100644
--- a/include/linux/sched/loadavg.h
+++ b/include/linux/sched/loadavg.h
@@ -22,10 +22,26 @@
 #define EXP_5		2014		/* 1/exp(5sec/5min) */
 #define EXP_15		2037		/* 1/exp(5sec/15min) */
 
-#define CALC_LOAD(load,exp,n) \
-	load *= exp; \
-	load += n*(FIXED_1-exp); \
-	load >>= FSHIFT;
+/*
+ * a1 = a0 * e + a * (1 - e)
+ */
+static inline unsigned long
+calc_load(unsigned long load, unsigned long exp, unsigned long active)
+{
+	unsigned long newload;
+
+	newload = load * exp + active * (FIXED_1 - exp);
+	if (active >= load)
+		newload += FIXED_1-1;
+
+	return newload / FIXED_1;
+}
+
+extern unsigned long calc_load_n(unsigned long load, unsigned long exp,
+				 unsigned long active, unsigned int n);
+
+#define LOAD_INT(x) ((x) >> FSHIFT)
+#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
 
 extern void calc_global_load(unsigned long ticks);
 
diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h
index a9c32da..77e9fa3 100644
--- a/include/linux/sched/sysctl.h
+++ b/include/linux/sched/sysctl.h
@@ -22,6 +22,8 @@
 
 extern unsigned int sysctl_sched_latency;
 extern unsigned int sysctl_sched_min_granularity;
+extern unsigned int sysctl_sched_sync_hint_enable;
+extern unsigned int sysctl_sched_cstate_aware;
 extern unsigned int sysctl_sched_wakeup_granularity;
 extern unsigned int sysctl_sched_child_runs_first;
 
diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h
index 15f3f61..beffd85 100644
--- a/include/linux/sched/topology.h
+++ b/include/linux/sched/topology.h
@@ -23,10 +23,10 @@
 #define SD_BALANCE_FORK		0x0008	/* Balance on fork, clone */
 #define SD_BALANCE_WAKE		0x0010  /* Balance on wakeup */
 #define SD_WAKE_AFFINE		0x0020	/* Wake task to waking CPU */
-#define SD_ASYM_CPUCAPACITY	0x0040  /* Groups have different max cpu capacities */
-#define SD_SHARE_CPUCAPACITY	0x0080	/* Domain members share cpu capacity */
+#define SD_ASYM_CPUCAPACITY	0x0040  /* Domain members have different CPU capacities */
+#define SD_SHARE_CPUCAPACITY	0x0080	/* Domain members share CPU capacity */
 #define SD_SHARE_POWERDOMAIN	0x0100	/* Domain members share power domain */
-#define SD_SHARE_PKG_RESOURCES	0x0200	/* Domain members share cpu pkg resources */
+#define SD_SHARE_PKG_RESOURCES	0x0200	/* Domain members share CPU pkg resources */
 #define SD_SERIALIZE		0x0400	/* Only a single load balancing instance */
 #define SD_ASYM_PACKING		0x0800  /* Place busy groups earlier in the domain */
 #define SD_PREFER_SIBLING	0x1000	/* Prefer to place tasks in a sibling domain */
@@ -202,6 +202,17 @@
 # define SD_INIT_NAME(type)
 #endif
 
+#ifndef arch_scale_cpu_capacity
+static __always_inline
+unsigned long arch_scale_cpu_capacity(struct sched_domain *sd, int cpu)
+{
+	if (sd && (sd->flags & SD_SHARE_CPUCAPACITY) && (sd->span_weight > 1))
+		return sd->smt_gain / sd->span_weight;
+
+	return SCHED_CAPACITY_SCALE;
+}
+#endif
+
 #else /* CONFIG_SMP */
 
 struct sched_domain_attr;
@@ -217,6 +228,14 @@
 	return true;
 }
 
+#ifndef arch_scale_cpu_capacity
+static __always_inline
+unsigned long arch_scale_cpu_capacity(void __always_unused *sd, int cpu)
+{
+	return SCHED_CAPACITY_SCALE;
+}
+#endif
+
 #endif	/* !CONFIG_SMP */
 
 static inline int task_node(const struct task_struct *p)
diff --git a/include/linux/sched/wake_q.h b/include/linux/sched/wake_q.h
index 10b19a1..a3661e9 100644
--- a/include/linux/sched/wake_q.h
+++ b/include/linux/sched/wake_q.h
@@ -34,6 +34,7 @@
 struct wake_q_head {
 	struct wake_q_node *first;
 	struct wake_q_node **lastp;
+	int count;
 };
 
 #define WAKE_Q_TAIL ((struct wake_q_node *) 0x01)
@@ -45,6 +46,7 @@
 {
 	head->first = WAKE_Q_TAIL;
 	head->lastp = &head->first;
+	head->count = 0;
 }
 
 extern void wake_q_add(struct wake_q_head *head,
diff --git a/include/linux/sched/xacct.h b/include/linux/sched/xacct.h
index c078f0a..9544c9d 100644
--- a/include/linux/sched/xacct.h
+++ b/include/linux/sched/xacct.h
@@ -28,6 +28,11 @@
 {
 	tsk->ioac.syscw++;
 }
+
+static inline void inc_syscfs(struct task_struct *tsk)
+{
+	tsk->ioac.syscfs++;
+}
 #else
 static inline void add_rchar(struct task_struct *tsk, ssize_t amt)
 {
@@ -44,6 +49,10 @@
 static inline void inc_syscw(struct task_struct *tsk)
 {
 }
+
+static inline void inc_syscfs(struct task_struct *tsk)
+{
+}
 #endif
 
 #endif /* _LINUX_SCHED_XACCT_H */
diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h
index f4c9fc0..3105055 100644
--- a/include/linux/scmi_protocol.h
+++ b/include/linux/scmi_protocol.h
@@ -91,6 +91,8 @@
  *	to sustained performance level mapping
  * @freq_get: gets the frequency for a given device using sustained frequency
  *	to sustained performance level mapping
+ * @est_power_get: gets the estimated power cost for a given performance domain
+ *	at a given frequency
  */
 struct scmi_perf_ops {
 	int (*limits_set)(const struct scmi_handle *handle, u32 domain,
@@ -110,6 +112,8 @@
 			unsigned long rate, bool poll);
 	int (*freq_get)(const struct scmi_handle *handle, u32 domain,
 			unsigned long *rate, bool poll);
+	int (*est_power_get)(const struct scmi_handle *handle, u32 domain,
+			     unsigned long *rate, unsigned long *power);
 };
 
 /**
diff --git a/include/linux/scs.h b/include/linux/scs.h
new file mode 100644
index 0000000..c5572fd
--- /dev/null
+++ b/include/linux/scs.h
@@ -0,0 +1,57 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Shadow Call Stack support.
+ *
+ * Copyright (C) 2019 Google LLC
+ */
+
+#ifndef _LINUX_SCS_H
+#define _LINUX_SCS_H
+
+#include <linux/gfp.h>
+#include <linux/sched.h>
+#include <asm/page.h>
+
+#ifdef CONFIG_SHADOW_CALL_STACK
+
+/*
+ * In testing, 1 KiB shadow stack size (i.e. 128 stack frames on a 64-bit
+ * architecture) provided ~40% safety margin on stack usage while keeping
+ * memory allocation overhead reasonable.
+ */
+#define SCS_SIZE	1024UL
+#define GFP_SCS		(GFP_KERNEL | __GFP_ZERO)
+
+/*
+ * A random number outside the kernel's virtual address space to mark the
+ * end of the shadow stack.
+ */
+#define SCS_END_MAGIC	0xaf0194819b1635f6UL
+
+#define task_scs(tsk)	(task_thread_info(tsk)->shadow_call_stack)
+
+static inline void task_set_scs(struct task_struct *tsk, void *s)
+{
+	task_scs(tsk) = s;
+}
+
+extern void scs_init(void);
+extern void scs_task_reset(struct task_struct *tsk);
+extern int scs_prepare(struct task_struct *tsk, int node);
+extern bool scs_corrupted(struct task_struct *tsk);
+extern void scs_release(struct task_struct *tsk);
+
+#else /* CONFIG_SHADOW_CALL_STACK */
+
+#define task_scs(tsk)	NULL
+
+static inline void task_set_scs(struct task_struct *tsk, void *s) {}
+static inline void scs_init(void) {}
+static inline void scs_task_reset(struct task_struct *tsk) {}
+static inline int scs_prepare(struct task_struct *tsk, int node) { return 0; }
+static inline bool scs_corrupted(struct task_struct *tsk) { return false; }
+static inline void scs_release(struct task_struct *tsk) {}
+
+#endif /* CONFIG_SHADOW_CALL_STACK */
+
+#endif /* _LINUX_SCS_H */
diff --git a/include/linux/slab.h b/include/linux/slab.h
index d639341..1409fae 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -297,11 +297,42 @@
 #define SLAB_OBJ_MIN_SIZE      (KMALLOC_MIN_SIZE < 16 ? \
                                (KMALLOC_MIN_SIZE) : 16)
 
-#ifndef CONFIG_SLOB
-extern struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH + 1];
+/*
+ * Whenever changing this, take care of that kmalloc_type() and
+ * create_kmalloc_caches() still work as intended.
+ */
+enum kmalloc_cache_type {
+	KMALLOC_NORMAL = 0,
+	KMALLOC_RECLAIM,
 #ifdef CONFIG_ZONE_DMA
-extern struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH + 1];
+	KMALLOC_DMA,
 #endif
+	NR_KMALLOC_TYPES
+};
+
+#ifndef CONFIG_SLOB
+extern struct kmem_cache *
+kmalloc_caches[NR_KMALLOC_TYPES][KMALLOC_SHIFT_HIGH + 1];
+
+static __always_inline enum kmalloc_cache_type kmalloc_type(gfp_t flags)
+{
+#ifdef CONFIG_ZONE_DMA
+	/*
+	 * The most common case is KMALLOC_NORMAL, so test for it
+	 * with a single branch for both flags.
+	 */
+	if (likely((flags & (__GFP_DMA | __GFP_RECLAIMABLE)) == 0))
+		return KMALLOC_NORMAL;
+
+	/*
+	 * At least one of the flags has to be set. If both are, __GFP_DMA
+	 * is more important.
+	 */
+	return flags & __GFP_DMA ? KMALLOC_DMA : KMALLOC_RECLAIM;
+#else
+	return flags & __GFP_RECLAIMABLE ? KMALLOC_RECLAIM : KMALLOC_NORMAL;
+#endif
+}
 
 /*
  * Figure out which kmalloc slab an allocation of a certain size
@@ -415,7 +446,7 @@
 {
 	void *ret = kmem_cache_alloc(s, flags);
 
-	kasan_kmalloc(s, ret, size, flags);
+	ret = kasan_kmalloc(s, ret, size, flags);
 	return ret;
 }
 
@@ -426,7 +457,7 @@
 {
 	void *ret = kmem_cache_alloc_node(s, gfpflags, node);
 
-	kasan_kmalloc(s, ret, size, gfpflags);
+	ret = kasan_kmalloc(s, ret, size, gfpflags);
 	return ret;
 }
 #endif /* CONFIG_TRACING */
@@ -503,18 +534,20 @@
 static __always_inline void *kmalloc(size_t size, gfp_t flags)
 {
 	if (__builtin_constant_p(size)) {
+#ifndef CONFIG_SLOB
+		unsigned int index;
+#endif
 		if (size > KMALLOC_MAX_CACHE_SIZE)
 			return kmalloc_large(size, flags);
 #ifndef CONFIG_SLOB
-		if (!(flags & GFP_DMA)) {
-			unsigned int index = kmalloc_index(size);
+		index = kmalloc_index(size);
 
-			if (!index)
-				return ZERO_SIZE_PTR;
+		if (!index)
+			return ZERO_SIZE_PTR;
 
-			return kmem_cache_alloc_trace(kmalloc_caches[index],
-					flags, size);
-		}
+		return kmem_cache_alloc_trace(
+				kmalloc_caches[kmalloc_type(flags)][index],
+				flags, size);
 #endif
 	}
 	return __kmalloc(size, flags);
@@ -544,13 +577,14 @@
 {
 #ifndef CONFIG_SLOB
 	if (__builtin_constant_p(size) &&
-		size <= KMALLOC_MAX_CACHE_SIZE && !(flags & GFP_DMA)) {
+		size <= KMALLOC_MAX_CACHE_SIZE) {
 		unsigned int i = kmalloc_index(size);
 
 		if (!i)
 			return ZERO_SIZE_PTR;
 
-		return kmem_cache_alloc_node_trace(kmalloc_caches[i],
+		return kmem_cache_alloc_node_trace(
+				kmalloc_caches[kmalloc_type(flags)][i],
 						flags, node, size);
 	}
 #endif
diff --git a/include/linux/slab_def.h b/include/linux/slab_def.h
index 3485c58..9a5eafb 100644
--- a/include/linux/slab_def.h
+++ b/include/linux/slab_def.h
@@ -104,4 +104,17 @@
 		return object;
 }
 
+/*
+ * We want to avoid an expensive divide : (offset / cache->size)
+ *   Using the fact that size is a constant for a particular cache,
+ *   we can replace (offset / cache->size) by
+ *   reciprocal_divide(offset, cache->reciprocal_buffer_size)
+ */
+static inline unsigned int obj_to_index(const struct kmem_cache *cache,
+					const struct page *page, void *obj)
+{
+	u32 offset = (obj - page->s_mem);
+	return reciprocal_divide(offset, cache->reciprocal_buffer_size);
+}
+
 #endif	/* _LINUX_SLAB_DEF_H */
diff --git a/include/linux/string.h b/include/linux/string.h
index f58e1ef..3c32b2f 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -205,6 +205,8 @@
 extern ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos,
 				       const void *from, size_t available);
 
+int ptr_to_hashval(const void *ptr, unsigned long *hashval_out);
+
 /**
  * strstarts - does @str start with @prefix?
  * @str: string to examine
diff --git a/include/linux/suspend.h b/include/linux/suspend.h
index 3f529ad..71c6110 100644
--- a/include/linux/suspend.h
+++ b/include/linux/suspend.h
@@ -446,6 +446,7 @@
 extern bool pm_save_wakeup_count(unsigned int count);
 extern void pm_wakep_autosleep_enabled(bool set);
 extern void pm_print_active_wakeup_sources(void);
+extern void pm_get_active_wakeup_sources(char *pending_sources, size_t max);
 
 extern void lock_system_sleep(void);
 extern void unlock_system_sleep(void);
diff --git a/include/linux/swap.h b/include/linux/swap.h
index ee8f9f55..4569127 100644
--- a/include/linux/swap.h
+++ b/include/linux/swap.h
@@ -305,7 +305,7 @@
 
 /* linux/mm/workingset.c */
 void *workingset_eviction(struct address_space *mapping, struct page *page);
-bool workingset_refault(void *shadow);
+void workingset_refault(struct page *page, void *shadow);
 void workingset_activation(struct page *page);
 
 /* Do not use directly, use workingset_lookup_update */
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 2ff814c..8e5b2c6d 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -850,6 +850,7 @@
 				struct timex __user *tx);
 asmlinkage long sys_syncfs(int fd);
 asmlinkage long sys_setns(int fd, int nstype);
+asmlinkage long sys_pidfd_open(pid_t pid, unsigned int flags);
 asmlinkage long sys_sendmmsg(int fd, struct mmsghdr __user *msg,
 			     unsigned int vlen, unsigned flags);
 asmlinkage long sys_process_vm_readv(pid_t pid,
@@ -906,6 +907,9 @@
 			  unsigned mask, struct statx __user *buffer);
 asmlinkage long sys_rseq(struct rseq __user *rseq, uint32_t rseq_len,
 			 int flags, uint32_t sig);
+asmlinkage long sys_pidfd_send_signal(int pidfd, int sig,
+				       siginfo_t __user *info,
+				       unsigned int flags);
 
 /*
  * Architecture-specific system calls
diff --git a/include/linux/task_io_accounting.h b/include/linux/task_io_accounting.h
index 6f6acce..bb26108 100644
--- a/include/linux/task_io_accounting.h
+++ b/include/linux/task_io_accounting.h
@@ -19,6 +19,8 @@
 	u64 syscr;
 	/* # of write syscalls */
 	u64 syscw;
+	/* # of fsync syscalls */
+	u64 syscfs;
 #endif /* CONFIG_TASK_XACCT */
 
 #ifdef CONFIG_TASK_IO_ACCOUNTING
diff --git a/include/linux/task_io_accounting_ops.h b/include/linux/task_io_accounting_ops.h
index bb5498b..733ab62 100644
--- a/include/linux/task_io_accounting_ops.h
+++ b/include/linux/task_io_accounting_ops.h
@@ -97,6 +97,7 @@
 	dst->wchar += src->wchar;
 	dst->syscr += src->syscr;
 	dst->syscw += src->syscw;
+	dst->syscfs += src->syscfs;
 }
 #else
 static inline void task_chr_io_accounting_add(struct task_io_accounting *dst,
diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h
index efe79c1..249ceef 100644
--- a/include/linux/uaccess.h
+++ b/include/linux/uaccess.h
@@ -267,10 +267,12 @@
 	probe_kernel_read(&retval, addr, sizeof(retval))
 
 #ifndef user_access_begin
-#define user_access_begin() do { } while (0)
+#define user_access_begin(type, ptr, len) access_ok(type, ptr, len)
 #define user_access_end() do { } while (0)
 #define unsafe_get_user(x, ptr, err) do { if (unlikely(__get_user(x, ptr))) goto err; } while (0)
 #define unsafe_put_user(x, ptr, err) do { if (unlikely(__put_user(x, ptr))) goto err; } while (0)
+static inline unsigned long user_access_save(void) { return 0UL; }
+static inline void user_access_restore(unsigned long flags) { }
 #endif
 
 #ifdef CONFIG_HARDENED_USERCOPY
diff --git a/include/linux/unicode.h b/include/linux/unicode.h
new file mode 100644
index 0000000..990aa97
--- /dev/null
+++ b/include/linux/unicode.h
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_UNICODE_H
+#define _LINUX_UNICODE_H
+
+#include <linux/init.h>
+#include <linux/dcache.h>
+
+struct unicode_map {
+	const char *charset;
+	int version;
+};
+
+int utf8_validate(const struct unicode_map *um, const struct qstr *str);
+
+int utf8_strncmp(const struct unicode_map *um,
+		 const struct qstr *s1, const struct qstr *s2);
+
+int utf8_strncasecmp(const struct unicode_map *um,
+		 const struct qstr *s1, const struct qstr *s2);
+int utf8_strncasecmp_folded(const struct unicode_map *um,
+			    const struct qstr *cf,
+			    const struct qstr *s1);
+
+int utf8_normalize(const struct unicode_map *um, const struct qstr *str,
+		   unsigned char *dest, size_t dlen);
+
+int utf8_casefold(const struct unicode_map *um, const struct qstr *str,
+		  unsigned char *dest, size_t dlen);
+
+struct unicode_map *utf8_load(const char *version);
+void utf8_unload(struct unicode_map *um);
+
+#endif /* _LINUX_UNICODE_H */
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h
index 8675e14..af4396c 100644
--- a/include/linux/usb/composite.h
+++ b/include/linux/usb/composite.h
@@ -587,6 +587,7 @@
 	struct config_group group;
 	struct list_head cfs_list;
 	struct usb_function_driver *fd;
+	struct usb_function *f;
 	int (*set_inst_name)(struct usb_function_instance *inst,
 			      const char *name);
 	void (*free_func_inst)(struct usb_function_instance *inst);
diff --git a/include/linux/usb/f_accessory.h b/include/linux/usb/f_accessory.h
new file mode 100644
index 0000000..ebe3c4d
--- /dev/null
+++ b/include/linux/usb/f_accessory.h
@@ -0,0 +1,23 @@
+/*
+ * Gadget Function Driver for Android USB accessories
+ *
+ * Copyright (C) 2011 Google, Inc.
+ * Author: Mike Lockwood <lockwood@android.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ *
+ */
+
+#ifndef __LINUX_USB_F_ACCESSORY_H
+#define __LINUX_USB_F_ACCESSORY_H
+
+#include <uapi/linux/usb/f_accessory.h>
+
+#endif /* __LINUX_USB_F_ACCESSORY_H */
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h
index 398e9c9..0b49740 100644
--- a/include/linux/vmalloc.h
+++ b/include/linux/vmalloc.h
@@ -63,10 +63,12 @@
 
 #ifdef CONFIG_MMU
 extern void __init vmalloc_init(void);
+extern unsigned long vmalloc_nr_pages(void);
 #else
 static inline void vmalloc_init(void)
 {
 }
+static inline unsigned long vmalloc_nr_pages(void) { return 0; }
 #endif
 
 extern void *vmalloc(unsigned long size);
diff --git a/include/linux/wakeup_reason.h b/include/linux/wakeup_reason.h
new file mode 100644
index 0000000..9fbe209
--- /dev/null
+++ b/include/linux/wakeup_reason.h
@@ -0,0 +1,30 @@
+/*
+ * include/linux/wakeup_reason.h
+ *
+ * Logs the reason which caused the kernel to resume
+ * from the suspend mode.
+ *
+ * Copyright (C) 2014 Google, Inc.
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ */
+
+#ifndef _LINUX_WAKEUP_REASON_H
+#define _LINUX_WAKEUP_REASON_H
+
+#define MAX_SUSPEND_ABORT_LEN 256
+
+void log_wakeup_reason(int irq);
+#ifdef CONFIG_SUSPEND
+void log_suspend_abort_reason(const char *fmt, ...);
+#else
+static inline void log_suspend_abort_reason(const char *fmt, ...) { }
+#endif
+
+#endif /* _LINUX_WAKEUP_REASON_H */
diff --git a/include/linux/xattr.h b/include/linux/xattr.h
index 6dad031..30f25e1 100644
--- a/include/linux/xattr.h
+++ b/include/linux/xattr.h
@@ -30,10 +30,13 @@
 	const char *prefix;
 	int flags;      /* fs private flags */
 	bool (*list)(struct dentry *dentry);
-	int (*get)(const struct xattr_handler *, struct dentry *dentry,
+	int (*get)(const struct xattr_handler *handler, struct dentry *dentry,
 		   struct inode *inode, const char *name, void *buffer,
 		   size_t size);
-	int (*set)(const struct xattr_handler *, struct dentry *dentry,
+	int (*__get)(const struct xattr_handler *handler, struct dentry *dentry,
+		     struct inode *inode, const char *name, void *buffer,
+		     size_t size);
+	int (*set)(const struct xattr_handler *handler, struct dentry *dentry,
 		   struct inode *inode, const char *name, const void *buffer,
 		   size_t size, int flags);
 };
diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index 6def035..d803aa7 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -296,6 +296,18 @@
 void addrconf_prefix_rcv(struct net_device *dev,
 			 u8 *opt, int len, bool sllao);
 
+/* Determines into what table to put autoconf PIO/RIO/default routes
+ * learned on this device.
+ *
+ * - If 0, use the same table for every device. This puts routes into
+ *   one of RT_TABLE_{PREFIX,INFO,DFLT} depending on the type of route
+ *   (but note that these three are currently all equal to
+ *   RT6_TABLE_MAIN).
+ * - If > 0, use the specified table.
+ * - If < 0, put routes into table dev->ifindex + (-rt_table).
+ */
+u32 addrconf_rt_table(const struct net_device *dev, u32 default_table);
+
 /*
  *	anycast prototypes (anycast.c)
  */
diff --git a/include/net/ndisc.h b/include/net/ndisc.h
index ddfbb59..d2a016e 100644
--- a/include/net/ndisc.h
+++ b/include/net/ndisc.h
@@ -38,6 +38,7 @@
 	ND_OPT_RDNSS = 25,		/* RFC5006 */
 	ND_OPT_DNSSL = 31,		/* RFC6106 */
 	ND_OPT_6CO = 34,		/* RFC6775 */
+	ND_OPT_CAPTIVE_PORTAL = 37,	/* RFC7710 */
 	__ND_OPT_MAX
 };
 
diff --git a/include/net/virt_wifi.h b/include/net/virt_wifi.h
new file mode 100644
index 0000000..343e739
--- /dev/null
+++ b/include/net/virt_wifi.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* include/net/virt_wifi.h
+ *
+ * Define the extension interface for the network data simulation
+ *
+ * Copyright (C) 2019 Google, Inc.
+ *
+ * Author: lesl@google.com
+ */
+#ifndef __VIRT_WIFI_H
+#define __VIRT_WIFI_H
+
+struct virt_wifi_network_simulation {
+	void (*notify_device_open)(struct net_device *dev);
+	void (*notify_device_stop)(struct net_device *dev);
+	void (*notify_scan_trigger)(struct wiphy *wiphy,
+				    struct cfg80211_scan_request *request);
+	int (*generate_virt_scan_result)(struct wiphy *wiphy);
+};
+
+int virt_wifi_register_network_simulation(
+	    struct virt_wifi_network_simulation *ops);
+int virt_wifi_unregister_network_simulation(void);
+#endif
+
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index 202f4d6..039e289 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -199,7 +199,8 @@
 	unsigned broken_fua:1;		/* Don't set FUA bit */
 	unsigned lun_in_cdb:1;		/* Store LUN bits in CDB[1] */
 	unsigned unmap_limit_for_ws:1;	/* Use the UNMAP limit for WRITE SAME */
-
+	unsigned rpm_autosuspend:1;	/* Enable runtime autosuspend at device
+					 * creation time */
 	atomic_t disk_events_disable_depth; /* disable depth for disk events */
 
 	DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index 5ea06d3..1462a3c 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -484,6 +484,9 @@
 	 */
 	unsigned int cmd_size;
 	struct scsi_host_cmd_pool *cmd_pool;
+
+	/* Delay for runtime autosuspend */
+	int rpm_autosuspend_delay;
 };
 
 /*
diff --git a/include/sound/pcm.h b/include/sound/pcm.h
index d6bd3ca..568f636 100644
--- a/include/sound/pcm.h
+++ b/include/sound/pcm.h
@@ -131,6 +131,8 @@
 #define SNDRV_PCM_RATE_96000		(1<<10)		/* 96000Hz */
 #define SNDRV_PCM_RATE_176400		(1<<11)		/* 176400Hz */
 #define SNDRV_PCM_RATE_192000		(1<<12)		/* 192000Hz */
+#define SNDRV_PCM_RATE_352800		(1<<13)		/* 352800Hz */
+#define SNDRV_PCM_RATE_384000		(1<<14)		/* 384000Hz */
 
 #define SNDRV_PCM_RATE_CONTINUOUS	(1<<30)		/* continuous range */
 #define SNDRV_PCM_RATE_KNOT		(1<<31)		/* supports more non-continuos rates */
@@ -143,6 +145,9 @@
 					 SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)
 #define SNDRV_PCM_RATE_8000_192000	(SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\
 					 SNDRV_PCM_RATE_192000)
+#define SNDRV_PCM_RATE_8000_384000	(SNDRV_PCM_RATE_8000_192000|\
+					 SNDRV_PCM_RATE_352800|\
+					 SNDRV_PCM_RATE_384000)
 #define _SNDRV_PCM_FMTBIT(fmt)		(1ULL << (__force int)SNDRV_PCM_FORMAT_##fmt)
 #define SNDRV_PCM_FMTBIT_S8		_SNDRV_PCM_FMTBIT(S8)
 #define SNDRV_PCM_FMTBIT_U8		_SNDRV_PCM_FMTBIT(U8)
diff --git a/include/trace/events/android_fs.h b/include/trace/events/android_fs.h
new file mode 100644
index 0000000..0ee4a07
--- /dev/null
+++ b/include/trace/events/android_fs.h
@@ -0,0 +1,74 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM android_fs
+
+#if !defined(_TRACE_ANDROID_FS_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_ANDROID_FS_H
+
+#include <linux/tracepoint.h>
+#include <trace/events/android_fs_template.h>
+
+DEFINE_EVENT(android_fs_data_start_template, android_fs_dataread_start,
+	TP_PROTO(struct inode *inode, loff_t offset, int bytes,
+		 pid_t pid, char *pathname, char *command),
+	TP_ARGS(inode, offset, bytes, pid, pathname, command));
+
+DEFINE_EVENT(android_fs_data_end_template, android_fs_dataread_end,
+	TP_PROTO(struct inode *inode, loff_t offset, int bytes),
+	TP_ARGS(inode, offset, bytes));
+
+DEFINE_EVENT(android_fs_data_start_template, android_fs_datawrite_start,
+	TP_PROTO(struct inode *inode, loff_t offset, int bytes,
+		 pid_t pid, char *pathname, char *command),
+	TP_ARGS(inode, offset, bytes, pid, pathname, command));
+
+DEFINE_EVENT(android_fs_data_end_template, android_fs_datawrite_end,
+	TP_PROTO(struct inode *inode, loff_t offset, int bytes),
+	     TP_ARGS(inode, offset, bytes));
+
+DEFINE_EVENT(android_fs_fsync_start_template, android_fs_fsync_start,
+	TP_PROTO(struct inode *inode,
+		 pid_t pid, char *pathname, char *command),
+	TP_ARGS(inode, pid, pathname, command));
+
+DEFINE_EVENT(android_fs_data_end_template, android_fs_fsync_end,
+	TP_PROTO(struct inode *inode, loff_t offset, int bytes),
+	     TP_ARGS(inode, offset, bytes));
+
+#endif /* _TRACE_ANDROID_FS_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
+
+#ifndef ANDROID_FSTRACE_GET_PATHNAME
+#define ANDROID_FSTRACE_GET_PATHNAME
+
+/* Sizes an on-stack array, so careful if sizing this up ! */
+#define MAX_TRACE_PATHBUF_LEN	256
+
+static inline char *
+android_fstrace_get_pathname(char *buf, int buflen, struct inode *inode)
+{
+	char *path;
+	struct dentry *d;
+
+	/*
+	 * d_obtain_alias() will either iput() if it locates an existing
+	 * dentry or transfer the reference to the new dentry created.
+	 * So get an extra reference here.
+	 */
+	ihold(inode);
+	d = d_obtain_alias(inode);
+	if (likely(!IS_ERR(d))) {
+		path = dentry_path_raw(d, buf, buflen);
+		if (unlikely(IS_ERR(path))) {
+			strcpy(buf, "ERROR");
+			path = buf;
+		}
+		dput(d);
+	} else {
+		strcpy(buf, "ERROR");
+		path = buf;
+	}
+	return path;
+}
+#endif
diff --git a/include/trace/events/android_fs_template.h b/include/trace/events/android_fs_template.h
new file mode 100644
index 0000000..0832c26
--- /dev/null
+++ b/include/trace/events/android_fs_template.h
@@ -0,0 +1,98 @@
+#if !defined(_TRACE_ANDROID_FS_TEMPLATE_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_ANDROID_FS_TEMPLATE_H
+
+#include <linux/tracepoint.h>
+
+DECLARE_EVENT_CLASS(android_fs_data_start_template,
+	TP_PROTO(struct inode *inode, loff_t offset, int bytes,
+		 pid_t pid, char *pathname, char *command),
+	TP_ARGS(inode, offset, bytes, pid, pathname, command),
+	TP_STRUCT__entry(
+		__string(pathbuf, pathname);
+		__field(loff_t,	offset);
+		__field(int,	bytes);
+		__field(loff_t,	i_size);
+		__string(cmdline, command);
+		__field(pid_t,	pid);
+		__field(ino_t,	ino);
+	),
+	TP_fast_assign(
+		{
+			/*
+			 * Replace the spaces in filenames and cmdlines
+			 * because this screws up the tooling that parses
+			 * the traces.
+			 */
+			__assign_str(pathbuf, pathname);
+			(void)strreplace(__get_str(pathbuf), ' ', '_');
+			__entry->offset		= offset;
+			__entry->bytes		= bytes;
+			__entry->i_size		= i_size_read(inode);
+			__assign_str(cmdline, command);
+			(void)strreplace(__get_str(cmdline), ' ', '_');
+			__entry->pid		= pid;
+			__entry->ino		= inode->i_ino;
+		}
+	),
+	TP_printk("entry_name %s, offset %llu, bytes %d, cmdline %s,"
+		  " pid %d, i_size %llu, ino %lu",
+		  __get_str(pathbuf), __entry->offset, __entry->bytes,
+		  __get_str(cmdline), __entry->pid, __entry->i_size,
+		  (unsigned long) __entry->ino)
+);
+
+DECLARE_EVENT_CLASS(android_fs_data_end_template,
+	TP_PROTO(struct inode *inode, loff_t offset, int bytes),
+	TP_ARGS(inode, offset, bytes),
+	TP_STRUCT__entry(
+		__field(ino_t,	ino);
+		__field(loff_t,	offset);
+		__field(int,	bytes);
+	),
+	TP_fast_assign(
+		{
+			__entry->ino		= inode->i_ino;
+			__entry->offset		= offset;
+			__entry->bytes		= bytes;
+		}
+	),
+	TP_printk("ino %lu, offset %llu, bytes %d",
+		  (unsigned long) __entry->ino,
+		  __entry->offset, __entry->bytes)
+);
+
+DECLARE_EVENT_CLASS(android_fs_fsync_start_template,
+	TP_PROTO(struct inode *inode,
+		 pid_t pid, char *pathname, char *command),
+	TP_ARGS(inode, pid, pathname, command),
+	TP_STRUCT__entry(
+		__string(pathbuf, pathname);
+		__field(loff_t,	i_size);
+		__string(cmdline, command);
+		__field(pid_t,	pid);
+		__field(ino_t,	ino);
+	),
+	TP_fast_assign(
+		{
+			/*
+			 * Replace the spaces in filenames and cmdlines
+			 * because this screws up the tooling that parses
+			 * the traces.
+			 */
+			__assign_str(pathbuf, pathname);
+			(void)strreplace(__get_str(pathbuf), ' ', '_');
+			__entry->i_size		= i_size_read(inode);
+			__assign_str(cmdline, command);
+			(void)strreplace(__get_str(cmdline), ' ', '_');
+			__entry->pid		= pid;
+			__entry->ino		= inode->i_ino;
+		}
+	),
+	TP_printk("entry_name %s, cmdline %s,"
+		  " pid %d, i_size %llu, ino %lu",
+		  __get_str(pathbuf),
+		  __get_str(cmdline), __entry->pid, __entry->i_size,
+		  (unsigned long) __entry->ino)
+);
+
+#endif /* _TRACE_ANDROID_FS_TEMPLATE_H */
diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
index 7956989..bcd512b 100644
--- a/include/trace/events/f2fs.h
+++ b/include/trace/events/f2fs.h
@@ -150,6 +150,17 @@
 		{ CP_SPEC_LOG_NUM,	"log type is 2" },		\
 		{ CP_RECOVER_DIR,	"dir needs recovery" })
 
+#define show_shutdown_mode(type)					\
+	__print_symbolic(type,						\
+		{ F2FS_GOING_DOWN_FULLSYNC,	"full sync" },		\
+		{ F2FS_GOING_DOWN_METASYNC,	"meta sync" },		\
+		{ F2FS_GOING_DOWN_NOSYNC,	"no sync" },		\
+		{ F2FS_GOING_DOWN_METAFLUSH,	"meta flush" },		\
+		{ F2FS_GOING_DOWN_NEED_FSCK,	"need fsck" })
+
+struct f2fs_sb_info;
+struct f2fs_io_info;
+struct extent_info;
 struct victim_sel_policy;
 struct f2fs_map_blocks;
 
@@ -523,6 +534,37 @@
 		__entry->err)
 );
 
+TRACE_EVENT(f2fs_file_write_iter,
+
+	TP_PROTO(struct inode *inode, unsigned long offset,
+		unsigned long length, int ret),
+
+	TP_ARGS(inode, offset, length, ret),
+
+	TP_STRUCT__entry(
+		__field(dev_t,	dev)
+		__field(ino_t,	ino)
+		__field(unsigned long, offset)
+		__field(unsigned long, length)
+		__field(int,	ret)
+	),
+
+	TP_fast_assign(
+		__entry->dev	= inode->i_sb->s_dev;
+		__entry->ino	= inode->i_ino;
+		__entry->offset	= offset;
+		__entry->length	= length;
+		__entry->ret	= ret;
+	),
+
+	TP_printk("dev = (%d,%d), ino = %lu, "
+		"offset = %lu, length = %lu, written(err) = %d",
+		show_dev_ino(__entry),
+		__entry->offset,
+		__entry->length,
+		__entry->ret)
+);
+
 TRACE_EVENT(f2fs_map_blocks,
 	TP_PROTO(struct inode *inode, struct f2fs_map_blocks *map, int ret),
 
@@ -534,6 +576,9 @@
 		__field(block_t,	m_lblk)
 		__field(block_t,	m_pblk)
 		__field(unsigned int,	m_len)
+		__field(unsigned int,	m_flags)
+		__field(int,	m_seg_type)
+		__field(bool,	m_may_create)
 		__field(int,	ret)
 	),
 
@@ -543,15 +588,22 @@
 		__entry->m_lblk		= map->m_lblk;
 		__entry->m_pblk		= map->m_pblk;
 		__entry->m_len		= map->m_len;
+		__entry->m_flags	= map->m_flags;
+		__entry->m_seg_type	= map->m_seg_type;
+		__entry->m_may_create	= map->m_may_create;
 		__entry->ret		= ret;
 	),
 
 	TP_printk("dev = (%d,%d), ino = %lu, file offset = %llu, "
-		"start blkaddr = 0x%llx, len = 0x%llx, err = %d",
+		"start blkaddr = 0x%llx, len = 0x%llx, flags = %u,"
+		"seg_type = %d, may_create = %d, err = %d",
 		show_dev_ino(__entry),
 		(unsigned long long)__entry->m_lblk,
 		(unsigned long long)__entry->m_pblk,
 		(unsigned long long)__entry->m_len,
+		__entry->m_flags,
+		__entry->m_seg_type,
+		__entry->m_may_create,
 		__entry->ret)
 );
 
@@ -977,8 +1029,8 @@
 	),
 
 	TP_fast_assign(
-		__entry->dev		= page->mapping->host->i_sb->s_dev;
-		__entry->ino		= page->mapping->host->i_ino;
+		__entry->dev		= page_file_mapping(page)->host->i_sb->s_dev;
+		__entry->ino		= page_file_mapping(page)->host->i_ino;
 		__entry->index		= page->index;
 		__entry->old_blkaddr	= fio->old_blkaddr;
 		__entry->new_blkaddr	= fio->new_blkaddr;
@@ -1165,10 +1217,11 @@
 	),
 
 	TP_fast_assign(
-		__entry->dev	= page->mapping->host->i_sb->s_dev;
-		__entry->ino	= page->mapping->host->i_ino;
+		__entry->dev	= page_file_mapping(page)->host->i_sb->s_dev;
+		__entry->ino	= page_file_mapping(page)->host->i_ino;
 		__entry->type	= type;
-		__entry->dir	= S_ISDIR(page->mapping->host->i_mode);
+		__entry->dir	=
+			S_ISDIR(page_file_mapping(page)->host->i_mode);
 		__entry->index	= page->index;
 		__entry->dirty	= PageDirty(page);
 		__entry->uptodate = PageUptodate(page);
@@ -1233,6 +1286,32 @@
 	TP_ARGS(page, type)
 );
 
+TRACE_EVENT(f2fs_filemap_fault,
+
+	TP_PROTO(struct inode *inode, pgoff_t index, unsigned long ret),
+
+	TP_ARGS(inode, index, ret),
+
+	TP_STRUCT__entry(
+		__field(dev_t,	dev)
+		__field(ino_t,	ino)
+		__field(pgoff_t, index)
+		__field(unsigned long, ret)
+	),
+
+	TP_fast_assign(
+		__entry->dev	= inode->i_sb->s_dev;
+		__entry->ino	= inode->i_ino;
+		__entry->index	= index;
+		__entry->ret	= ret;
+	),
+
+	TP_printk("dev = (%d,%d), ino = %lu, index = %lu, ret = %lx",
+		show_dev_ino(__entry),
+		(unsigned long)__entry->index,
+		__entry->ret)
+);
+
 TRACE_EVENT(f2fs_writepages,
 
 	TP_PROTO(struct inode *inode, struct writeback_control *wbc, int type),
@@ -1617,6 +1696,30 @@
 	TP_ARGS(sb, type, count)
 );
 
+TRACE_EVENT(f2fs_shutdown,
+
+	TP_PROTO(struct f2fs_sb_info *sbi, unsigned int mode, int ret),
+
+	TP_ARGS(sbi, mode, ret),
+
+	TP_STRUCT__entry(
+		__field(dev_t,	dev)
+		__field(unsigned int, mode)
+		__field(int, ret)
+	),
+
+	TP_fast_assign(
+		__entry->dev = sbi->sb->s_dev;
+		__entry->mode = mode;
+		__entry->ret = ret;
+	),
+
+	TP_printk("dev = (%d,%d), mode: %s, ret:%d",
+		show_dev(__entry->dev),
+		show_shutdown_mode(__entry->mode),
+		__entry->ret)
+);
+
 #endif /* _TRACE_F2FS_H */
 
  /* This part must be outside protection */
diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h
index eb57e30..ec8f586 100644
--- a/include/trace/events/kmem.h
+++ b/include/trace/events/kmem.h
@@ -315,6 +315,53 @@
 		__entry->change_ownership)
 );
 
+/*
+ * Required for uniquely and securely identifying mm in rss_stat tracepoint.
+ */
+#ifndef __PTR_TO_HASHVAL
+static unsigned int __maybe_unused mm_ptr_to_hash(const void *ptr)
+{
+	int ret;
+	unsigned long hashval;
+
+	ret = ptr_to_hashval(ptr, &hashval);
+	if (ret)
+		return 0;
+
+	/* The hashed value is only 32-bit */
+	return (unsigned int)hashval;
+}
+#define __PTR_TO_HASHVAL
+#endif
+
+TRACE_EVENT(rss_stat,
+
+	TP_PROTO(struct mm_struct *mm,
+		int member,
+		long count),
+
+	TP_ARGS(mm, member, count),
+
+	TP_STRUCT__entry(
+		__field(unsigned int, mm_id)
+		__field(unsigned int, curr)
+		__field(int, member)
+		__field(long, size)
+	),
+
+	TP_fast_assign(
+		__entry->mm_id = mm_ptr_to_hash(mm);
+		__entry->curr = !!(current->mm == mm);
+		__entry->member = member;
+		__entry->size = (count << PAGE_SHIFT);
+	),
+
+	TP_printk("mm_id=%u curr=%d member=%d size=%ldB",
+		__entry->mm_id,
+		__entry->curr,
+		__entry->member,
+		__entry->size)
+	);
 #endif /* _TRACE_KMEM_H */
 
 /* This part must be outside protection */
diff --git a/include/trace/events/mmflags.h b/include/trace/events/mmflags.h
index a81cffb..a1675d4 100644
--- a/include/trace/events/mmflags.h
+++ b/include/trace/events/mmflags.h
@@ -88,6 +88,7 @@
 	{1UL << PG_dirty,		"dirty"		},		\
 	{1UL << PG_lru,			"lru"		},		\
 	{1UL << PG_active,		"active"	},		\
+	{1UL << PG_workingset,		"workingset"	},		\
 	{1UL << PG_slab,		"slab"		},		\
 	{1UL << PG_owner_priv_1,	"owner_priv_1"	},		\
 	{1UL << PG_arch_1,		"arch_1"	},		\
diff --git a/include/trace/events/namei.h b/include/trace/events/namei.h
new file mode 100644
index 0000000..e8c3e21
--- /dev/null
+++ b/include/trace/events/namei.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM namei
+
+#if !defined(_TRACE_INODEPATH_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_INODEPATH_H
+
+#include <linux/types.h>
+#include <linux/tracepoint.h>
+#include <linux/mm.h>
+#include <linux/memcontrol.h>
+#include <linux/device.h>
+#include <linux/kdev_t.h>
+
+TRACE_EVENT(inodepath,
+		TP_PROTO(struct inode *inode, char *path),
+
+		TP_ARGS(inode, path),
+
+		TP_STRUCT__entry(
+			/* dev_t and ino_t are arch dependent bit width
+			 * so just use 64-bit
+			 */
+			__field(unsigned long, ino)
+			__field(unsigned long, dev)
+			__string(path, path)
+		),
+
+		TP_fast_assign(
+			__entry->ino = inode->i_ino;
+			__entry->dev = inode->i_sb->s_dev;
+			__assign_str(path, path);
+		),
+
+		TP_printk("dev %d:%d ino=%lu path=%s",
+			MAJOR(__entry->dev), MINOR(__entry->dev),
+			__entry->ino, __get_str(path))
+);
+#endif /* _TRACE_INODEPATH_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h
index 9a4bdfa..14efeb2 100644
--- a/include/trace/events/sched.h
+++ b/include/trace/events/sched.h
@@ -396,6 +396,30 @@
 	     TP_ARGS(tsk, delay));
 
 /*
+ * Tracepoint for recording the cause of uninterruptible sleep.
+ */
+TRACE_EVENT(sched_blocked_reason,
+
+	TP_PROTO(struct task_struct *tsk),
+
+	TP_ARGS(tsk),
+
+	TP_STRUCT__entry(
+		__field( pid_t,	pid	)
+		__field( void*, caller	)
+		__field( bool, io_wait	)
+	),
+
+	TP_fast_assign(
+		__entry->pid	= tsk->pid;
+		__entry->caller = (void*)get_wchan(tsk);
+		__entry->io_wait = tsk->in_iowait;
+	),
+
+	TP_printk("pid=%d iowait=%d caller=%pS", __entry->pid, __entry->io_wait, __entry->caller)
+);
+
+/*
  * Tracepoint for accounting runtime (time the task is executing
  * on a CPU).
  */
@@ -587,6 +611,424 @@
 
 	TP_printk("cpu=%d", __entry->cpu)
 );
+
+#ifdef CONFIG_SMP
+#ifdef CREATE_TRACE_POINTS
+static inline
+int __trace_sched_cpu(struct cfs_rq *cfs_rq, struct sched_entity *se)
+{
+#ifdef CONFIG_FAIR_GROUP_SCHED
+	struct rq *rq = cfs_rq ? cfs_rq->rq : NULL;
+#else
+	struct rq *rq = cfs_rq ? container_of(cfs_rq, struct rq, cfs) : NULL;
+#endif
+	return rq ? cpu_of(rq)
+		  : task_cpu((container_of(se, struct task_struct, se)));
+}
+
+static inline
+int __trace_sched_path(struct cfs_rq *cfs_rq, char *path, int len)
+{
+#ifdef CONFIG_FAIR_GROUP_SCHED
+	int l = path ? len : 0;
+
+	if (cfs_rq && task_group_is_autogroup(cfs_rq->tg))
+		return autogroup_path(cfs_rq->tg, path, l) + 1;
+	else if (cfs_rq && cfs_rq->tg->css.cgroup)
+		return cgroup_path(cfs_rq->tg->css.cgroup, path, l) + 1;
+#endif
+	if (path)
+		strcpy(path, "(null)");
+
+	return strlen("(null)");
+}
+
+static inline
+struct cfs_rq *__trace_sched_group_cfs_rq(struct sched_entity *se)
+{
+#ifdef CONFIG_FAIR_GROUP_SCHED
+	return se->my_q;
+#else
+	return NULL;
+#endif
+}
+#endif /* CREATE_TRACE_POINTS */
+
+/*
+ * Tracepoint for cfs_rq load tracking:
+ */
+TRACE_EVENT(sched_load_cfs_rq,
+
+	TP_PROTO(struct cfs_rq *cfs_rq),
+
+	TP_ARGS(cfs_rq),
+
+	TP_STRUCT__entry(
+		__field(	int,		cpu			)
+		__dynamic_array(char,		path,
+				__trace_sched_path(cfs_rq, NULL, 0)	)
+		__field(	unsigned long,	load			)
+		__field(	unsigned long,	rbl_load		)
+		__field(	unsigned long,	util			)
+	),
+
+	TP_fast_assign(
+		__entry->cpu		= __trace_sched_cpu(cfs_rq, NULL);
+		__trace_sched_path(cfs_rq, __get_dynamic_array(path),
+				   __get_dynamic_array_len(path));
+		__entry->load		= cfs_rq->avg.load_avg;
+		__entry->rbl_load 	= cfs_rq->avg.runnable_load_avg;
+		__entry->util		= cfs_rq->avg.util_avg;
+	),
+
+	TP_printk("cpu=%d path=%s load=%lu rbl_load=%lu util=%lu",
+		  __entry->cpu, __get_str(path), __entry->load,
+		  __entry->rbl_load,__entry->util)
+);
+
+/*
+ * Tracepoint for rt_rq load tracking:
+ */
+struct rq;
+TRACE_EVENT(sched_load_rt_rq,
+
+	TP_PROTO(struct rq *rq),
+
+	TP_ARGS(rq),
+
+	TP_STRUCT__entry(
+		__field(	int,		cpu			)
+		__field(	unsigned long,	util			)
+	),
+
+	TP_fast_assign(
+		__entry->cpu	= rq->cpu;
+		__entry->util	= rq->avg_rt.util_avg;
+	),
+
+	TP_printk("cpu=%d util=%lu", __entry->cpu,
+		  __entry->util)
+);
+
+/*
+ * Tracepoint for sched_entity load tracking:
+ */
+TRACE_EVENT(sched_load_se,
+
+	TP_PROTO(struct sched_entity *se),
+
+	TP_ARGS(se),
+
+	TP_STRUCT__entry(
+		__field(	int,		cpu			      )
+		__dynamic_array(char,		path,
+		  __trace_sched_path(__trace_sched_group_cfs_rq(se), NULL, 0) )
+		__array(	char,		comm,	TASK_COMM_LEN	      )
+		__field(	pid_t,		pid			      )
+		__field(	unsigned long,	load			      )
+		__field(	unsigned long,	rbl_load		      )
+		__field(	unsigned long,	util			      )
+	),
+
+	TP_fast_assign(
+		struct cfs_rq *gcfs_rq = __trace_sched_group_cfs_rq(se);
+		struct task_struct *p = gcfs_rq ? NULL
+				    : container_of(se, struct task_struct, se);
+
+		__entry->cpu		= __trace_sched_cpu(gcfs_rq, se);
+		__trace_sched_path(gcfs_rq, __get_dynamic_array(path),
+				   __get_dynamic_array_len(path));
+		memcpy(__entry->comm, p ? p->comm : "(null)",
+				      p ? TASK_COMM_LEN : sizeof("(null)"));
+		__entry->pid = p ? p->pid : -1;
+		__entry->load = se->avg.load_avg;
+		__entry->rbl_load = se->avg.runnable_load_avg;
+		__entry->util = se->avg.util_avg;
+	),
+
+	TP_printk("cpu=%d path=%s comm=%s pid=%d load=%lu rbl_load=%lu util=%lu",
+		  __entry->cpu, __get_str(path), __entry->comm, __entry->pid,
+		  __entry->load, __entry->rbl_load, __entry->util)
+);
+
+/*
+ * Tracepoint for task_group load tracking:
+ */
+#ifdef CONFIG_FAIR_GROUP_SCHED
+TRACE_EVENT(sched_load_tg,
+
+	TP_PROTO(struct cfs_rq *cfs_rq),
+
+	TP_ARGS(cfs_rq),
+
+	TP_STRUCT__entry(
+		__field(	int,	cpu				)
+		__dynamic_array(char,	path,
+				__trace_sched_path(cfs_rq, NULL, 0)	)
+		__field(	long,	load				)
+	),
+
+	TP_fast_assign(
+		__entry->cpu	= cfs_rq->rq->cpu;
+		__trace_sched_path(cfs_rq, __get_dynamic_array(path),
+				   __get_dynamic_array_len(path));
+		__entry->load	= atomic_long_read(&cfs_rq->tg->load_avg);
+	),
+
+	TP_printk("cpu=%d path=%s load=%ld", __entry->cpu, __get_str(path),
+		  __entry->load)
+);
+#endif /* CONFIG_FAIR_GROUP_SCHED */
+
+/*
+ * Tracepoint for tasks' estimated utilization.
+ */
+TRACE_EVENT(sched_util_est_task,
+
+	TP_PROTO(struct task_struct *tsk, struct sched_avg *avg),
+
+	TP_ARGS(tsk, avg),
+
+	TP_STRUCT__entry(
+		__array( char,	comm,	TASK_COMM_LEN		)
+		__field( pid_t,		pid			)
+		__field( int,		cpu			)
+		__field( unsigned int,	util_avg		)
+		__field( unsigned int,	est_enqueued		)
+		__field( unsigned int,	est_ewma		)
+
+	),
+
+	TP_fast_assign(
+		memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
+		__entry->pid			= tsk->pid;
+		__entry->cpu			= task_cpu(tsk);
+		__entry->util_avg		= avg->util_avg;
+		__entry->est_enqueued		= avg->util_est.enqueued;
+		__entry->est_ewma		= avg->util_est.ewma;
+	),
+
+	TP_printk("comm=%s pid=%d cpu=%d util_avg=%u util_est_ewma=%u util_est_enqueued=%u",
+		  __entry->comm,
+		  __entry->pid,
+		  __entry->cpu,
+		  __entry->util_avg,
+		  __entry->est_ewma,
+		  __entry->est_enqueued)
+);
+
+/*
+ * Tracepoint for root cfs_rq's estimated utilization.
+ */
+TRACE_EVENT(sched_util_est_cpu,
+
+	TP_PROTO(int cpu, struct cfs_rq *cfs_rq),
+
+	TP_ARGS(cpu, cfs_rq),
+
+	TP_STRUCT__entry(
+		__field( int,		cpu			)
+		__field( unsigned int,	util_avg		)
+		__field( unsigned int,	util_est_enqueued	)
+	),
+
+	TP_fast_assign(
+		__entry->cpu			= cpu;
+		__entry->util_avg		= cfs_rq->avg.util_avg;
+		__entry->util_est_enqueued	= cfs_rq->avg.util_est.enqueued;
+	),
+
+	TP_printk("cpu=%d util_avg=%u util_est_enqueued=%u",
+		  __entry->cpu,
+		  __entry->util_avg,
+		  __entry->util_est_enqueued)
+);
+
+/*
+ * Tracepoint for find_best_target
+ */
+TRACE_EVENT(sched_find_best_target,
+
+	TP_PROTO(struct task_struct *tsk, bool prefer_idle,
+		 unsigned long min_util, int best_idle, int best_active,
+		 int target, int backup),
+
+	TP_ARGS(tsk, prefer_idle, min_util, best_idle,
+		best_active, target, backup),
+
+	TP_STRUCT__entry(
+		__array( char,  comm,   TASK_COMM_LEN   )
+		__field( pid_t, pid                     )
+		__field( unsigned long, min_util        )
+		__field( bool,  prefer_idle             )
+		__field( int,   best_idle               )
+		__field( int,   best_active             )
+		__field( int,   target                  )
+		__field( int,   backup                  )
+		),
+
+	TP_fast_assign(
+		memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
+		__entry->pid            = tsk->pid;
+		__entry->min_util       = min_util;
+		__entry->prefer_idle    = prefer_idle;
+		__entry->best_idle      = best_idle;
+		__entry->best_active    = best_active;
+		__entry->target         = target;
+		__entry->backup         = backup;
+		),
+
+	TP_printk("pid=%d comm=%s prefer_idle=%d "
+		  "best_idle=%d best_active=%d target=%d backup=%d",
+		  __entry->pid, __entry->comm, __entry->prefer_idle,
+		  __entry->best_idle, __entry->best_active,
+		  __entry->target, __entry->backup)
+);
+
+/*
+ * Tracepoint for accounting CPU  boosted utilization
+ */
+TRACE_EVENT(sched_boost_cpu,
+
+	TP_PROTO(int cpu, unsigned long util, long margin),
+
+	TP_ARGS(cpu, util, margin),
+
+	TP_STRUCT__entry(
+		__field( int,           cpu	)
+		__field( unsigned long, util	)
+		__field(long,           margin	)
+	),
+
+	TP_fast_assign(
+		__entry->cpu    = cpu;
+		__entry->util   = util;
+		__entry->margin = margin;
+	),
+
+	TP_printk("cpu=%d util=%lu margin=%ld",
+		__entry->cpu,
+		__entry->util,
+		__entry->margin)
+);
+
+/*
+ * Tracepoint for schedtune_tasks_update
+ */
+TRACE_EVENT(sched_tune_tasks_update,
+
+	TP_PROTO(struct task_struct *tsk, int cpu, int tasks, int idx,
+		int boost, int max_boost, u64 group_ts),
+
+	TP_ARGS(tsk, cpu, tasks, idx, boost, max_boost, group_ts),
+
+	TP_STRUCT__entry(
+		__array( char,  comm,   TASK_COMM_LEN   )
+		__field( pid_t,         pid             )
+		__field( int,           cpu             )
+		__field( int,           tasks           )
+		__field( int,           idx             )
+		__field( int,           boost           )
+		__field( int,           max_boost       )
+		__field( u64,		group_ts	)
+	),
+
+	TP_fast_assign(
+		memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
+		__entry->pid            = tsk->pid;
+		__entry->cpu            = cpu;
+		__entry->tasks          = tasks;
+		__entry->idx            = idx;
+		__entry->boost          = boost;
+		__entry->max_boost      = max_boost;
+		__entry->group_ts	= group_ts;
+	),
+
+	TP_printk("pid=%d comm=%s "
+		"cpu=%d tasks=%d idx=%d boost=%d max_boost=%d timeout=%llu",
+		__entry->pid, __entry->comm,
+		__entry->cpu, __entry->tasks, __entry->idx,
+		__entry->boost, __entry->max_boost,
+		__entry->group_ts)
+);
+
+/*
+ * Tracepoint for schedtune_boostgroup_update
+ */
+TRACE_EVENT(sched_tune_boostgroup_update,
+
+	TP_PROTO(int cpu, int variation, int max_boost),
+
+	TP_ARGS(cpu, variation, max_boost),
+
+	TP_STRUCT__entry(
+		__field( int,   cpu		)
+		__field( int,   variation	)
+		__field( int,   max_boost	)
+	),
+
+	TP_fast_assign(
+		__entry->cpu            = cpu;
+		__entry->variation      = variation;
+		__entry->max_boost      = max_boost;
+	),
+
+	TP_printk("cpu=%d variation=%d max_boost=%d",
+		__entry->cpu, __entry->variation, __entry->max_boost)
+);
+
+/*
+ * Tracepoint for accounting task boosted utilization
+ */
+TRACE_EVENT(sched_boost_task,
+
+	TP_PROTO(struct task_struct *tsk, unsigned long util, long margin),
+
+	TP_ARGS(tsk, util, margin),
+
+	TP_STRUCT__entry(
+		__array( char,  comm,   TASK_COMM_LEN	)
+		__field( pid_t,         pid		)
+		__field( unsigned long, util		)
+		__field( long,          margin		)
+
+	),
+
+	TP_fast_assign(
+		memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
+		__entry->pid    = tsk->pid;
+		__entry->util   = util;
+		__entry->margin = margin;
+	),
+
+	TP_printk("comm=%s pid=%d util=%lu margin=%ld",
+		__entry->comm, __entry->pid,
+		__entry->util,
+		__entry->margin)
+);
+
+/*
+ * Tracepoint for system overutilized flag
+*/
+TRACE_EVENT(sched_overutilized,
+
+	TP_PROTO(int overutilized),
+
+	TP_ARGS(overutilized),
+
+	TP_STRUCT__entry(
+		__field( int,  overutilized    )
+	),
+
+	TP_fast_assign(
+		__entry->overutilized   = overutilized;
+	),
+
+	TP_printk("overutilized=%d",
+		__entry->overutilized)
+);
+
+#endif /* CONFIG_SMP */
 #endif /* _TRACE_SCHED_H */
 
 /* This part must be outside protection */
diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h
index df4bedb..be311b9 100644
--- a/include/uapi/asm-generic/unistd.h
+++ b/include/uapi/asm-generic/unistd.h
@@ -736,9 +736,13 @@
 __SC_COMP(__NR_io_pgetevents, sys_io_pgetevents, compat_sys_io_pgetevents)
 #define __NR_rseq 293
 __SYSCALL(__NR_rseq, sys_rseq)
+#define __NR_pidfd_send_signal 424
+__SYSCALL(__NR_pidfd_send_signal, sys_pidfd_send_signal)
+#define __NR_pidfd_open 434
+__SYSCALL(__NR_pidfd_open, sys_pidfd_open)
 
 #undef __NR_syscalls
-#define __NR_syscalls 294
+#define __NR_syscalls 435
 
 /*
  * 32 bit systems traditionally used different
diff --git a/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/virtgpu_drm.h
index 9a781f0..f06a789 100644
--- a/include/uapi/drm/virtgpu_drm.h
+++ b/include/uapi/drm/virtgpu_drm.h
@@ -47,6 +47,13 @@
 #define DRM_VIRTGPU_WAIT     0x08
 #define DRM_VIRTGPU_GET_CAPS  0x09
 
+#define VIRTGPU_EXECBUF_FENCE_FD_IN	0x01
+#define VIRTGPU_EXECBUF_FENCE_FD_OUT	0x02
+#define VIRTGPU_EXECBUF_FLAGS  (\
+		VIRTGPU_EXECBUF_FENCE_FD_IN |\
+		VIRTGPU_EXECBUF_FENCE_FD_OUT |\
+		0)
+
 struct drm_virtgpu_map {
 	__u64 offset; /* use for mmap system call */
 	__u32 handle;
@@ -54,12 +61,12 @@
 };
 
 struct drm_virtgpu_execbuffer {
-	__u32		flags;		/* for future use */
+	__u32 flags;
 	__u32 size;
 	__u64 command; /* void* */
 	__u64 bo_handles;
 	__u32 num_bo_handles;
-	__u32 pad;
+	__s32 fence_fd; /* in/out fence fd (see VIRTGPU_EXECBUF_FENCE_FD_IN/OUT) */
 };
 
 #define VIRTGPU_PARAM_3D_FEATURES 1 /* do we have 3D features in the hw */
@@ -137,7 +144,7 @@
 	DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_MAP, struct drm_virtgpu_map)
 
 #define DRM_IOCTL_VIRTGPU_EXECBUFFER \
-	DRM_IOW(DRM_COMMAND_BASE + DRM_VIRTGPU_EXECBUFFER,\
+	DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_EXECBUFFER,\
 		struct drm_virtgpu_execbuffer)
 
 #define DRM_IOCTL_VIRTGPU_GETPARAM \
diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/android/binder.h
index bfaec69..36a53fd 100644
--- a/include/uapi/linux/android/binder.h
+++ b/include/uapi/linux/android/binder.h
@@ -38,9 +38,64 @@
 	BINDER_TYPE_PTR		= B_PACK_CHARS('p', 't', '*', B_TYPE_LARGE),
 };
 
-enum {
+/**
+ * enum flat_binder_object_shifts: shift values for flat_binder_object_flags
+ * @FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT: shift for getting scheduler policy.
+ *
+ */
+enum flat_binder_object_shifts {
+	FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT = 9,
+};
+
+/**
+ * enum flat_binder_object_flags - flags for use in flat_binder_object.flags
+ */
+enum flat_binder_object_flags {
+	/**
+	 * @FLAT_BINDER_FLAG_PRIORITY_MASK: bit-mask for min scheduler priority
+	 *
+	 * These bits can be used to set the minimum scheduler priority
+	 * at which transactions into this node should run. Valid values
+	 * in these bits depend on the scheduler policy encoded in
+	 * @FLAT_BINDER_FLAG_SCHED_POLICY_MASK.
+	 *
+	 * For SCHED_NORMAL/SCHED_BATCH, the valid range is between [-20..19]
+	 * For SCHED_FIFO/SCHED_RR, the value can run between [1..99]
+	 */
 	FLAT_BINDER_FLAG_PRIORITY_MASK = 0xff,
+	/**
+	 * @FLAT_BINDER_FLAG_ACCEPTS_FDS: whether the node accepts fds.
+	 */
 	FLAT_BINDER_FLAG_ACCEPTS_FDS = 0x100,
+	/**
+	 * @FLAT_BINDER_FLAG_SCHED_POLICY_MASK: bit-mask for scheduling policy
+	 *
+	 * These two bits can be used to set the min scheduling policy at which
+	 * transactions on this node should run. These match the UAPI
+	 * scheduler policy values, eg:
+	 * 00b: SCHED_NORMAL
+	 * 01b: SCHED_FIFO
+	 * 10b: SCHED_RR
+	 * 11b: SCHED_BATCH
+	 */
+	FLAT_BINDER_FLAG_SCHED_POLICY_MASK =
+		3U << FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT,
+
+	/**
+	 * @FLAT_BINDER_FLAG_INHERIT_RT: whether the node inherits RT policy
+	 *
+	 * Only when set, calls into this node will inherit a real-time
+	 * scheduling policy from the caller (for synchronous transactions).
+	 */
+	FLAT_BINDER_FLAG_INHERIT_RT = 0x800,
+
+	/**
+	 * @FLAT_BINDER_FLAG_TXN_SECURITY_CTX: request security contexts
+	 *
+	 * Only when set, causes senders to include their security
+	 * context
+	 */
+	FLAT_BINDER_FLAG_TXN_SECURITY_CTX = 0x1000,
 };
 
 #ifdef BINDER_IPC_32BIT
@@ -200,6 +255,15 @@
 	__u32            has_weak_ref;
 };
 
+struct binder_node_info_for_ref {
+	__u32            handle;
+	__u32            strong_count;
+	__u32            weak_count;
+	__u32            reserved1;
+	__u32            reserved2;
+	__u32            reserved3;
+};
+
 #define BINDER_WRITE_READ		_IOWR('b', 1, struct binder_write_read)
 #define BINDER_SET_IDLE_TIMEOUT		_IOW('b', 3, __s64)
 #define BINDER_SET_MAX_THREADS		_IOW('b', 5, __u32)
@@ -208,6 +272,8 @@
 #define BINDER_THREAD_EXIT		_IOW('b', 8, __s32)
 #define BINDER_VERSION			_IOWR('b', 9, struct binder_version)
 #define BINDER_GET_NODE_DEBUG_INFO	_IOWR('b', 11, struct binder_node_debug_info)
+#define BINDER_GET_NODE_INFO_FOR_REF	_IOWR('b', 12, struct binder_node_info_for_ref)
+#define BINDER_SET_CONTEXT_MGR_EXT	_IOW('b', 13, struct flat_binder_object)
 
 /*
  * NOTE: Two special error codes you should check for when calling
@@ -266,6 +332,11 @@
 	} data;
 };
 
+struct binder_transaction_data_secctx {
+	struct binder_transaction_data transaction_data;
+	binder_uintptr_t secctx;
+};
+
 struct binder_transaction_data_sg {
 	struct binder_transaction_data transaction_data;
 	binder_size_t buffers_size;
@@ -301,6 +372,11 @@
 	BR_OK = _IO('r', 1),
 	/* No parameters! */
 
+	BR_TRANSACTION_SEC_CTX = _IOR('r', 2,
+				      struct binder_transaction_data_secctx),
+	/*
+	 * binder_transaction_data_secctx: the received command.
+	 */
 	BR_TRANSACTION = _IOR('r', 2, struct binder_transaction_data),
 	BR_REPLY = _IOR('r', 3, struct binder_transaction_data),
 	/*
diff --git a/include/uapi/linux/android/binderfs.h b/include/uapi/linux/android/binderfs.h
new file mode 100644
index 0000000..65b2efd
--- /dev/null
+++ b/include/uapi/linux/android/binderfs.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ * Copyright (C) 2018 Canonical Ltd.
+ *
+ */
+
+#ifndef _UAPI_LINUX_BINDER_CTL_H
+#define _UAPI_LINUX_BINDER_CTL_H
+
+#include <linux/android/binder.h>
+#include <linux/types.h>
+#include <linux/ioctl.h>
+
+#define BINDERFS_MAX_NAME 255
+
+/**
+ * struct binderfs_device - retrieve information about a new binder device
+ * @name:   the name to use for the new binderfs binder device
+ * @major:  major number allocated for binderfs binder devices
+ * @minor:  minor number allocated for the new binderfs binder device
+ *
+ */
+struct binderfs_device {
+	char name[BINDERFS_MAX_NAME + 1];
+	__u8 major;
+	__u8 minor;
+};
+
+/**
+ * Allocate a new binder device.
+ */
+#define BINDER_CTL_ADD _IOWR('b', 1, struct binderfs_device)
+
+#endif /* _UAPI_LINUX_BINDER_CTL_H */
+
diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h
index d75df52..dbc7092 100644
--- a/include/uapi/linux/dma-buf.h
+++ b/include/uapi/linux/dma-buf.h
@@ -35,7 +35,10 @@
 #define DMA_BUF_SYNC_VALID_FLAGS_MASK \
 	(DMA_BUF_SYNC_RW | DMA_BUF_SYNC_END)
 
+#define DMA_BUF_NAME_LEN	32
+
 #define DMA_BUF_BASE		'b'
 #define DMA_BUF_IOCTL_SYNC	_IOW(DMA_BUF_BASE, 0, struct dma_buf_sync)
+#define DMA_BUF_SET_NAME	_IOW(DMA_BUF_BASE, 1, const char *)
 
 #endif
diff --git a/include/uapi/linux/fcntl.h b/include/uapi/linux/fcntl.h
index 6448cdd..a2f8658 100644
--- a/include/uapi/linux/fcntl.h
+++ b/include/uapi/linux/fcntl.h
@@ -41,6 +41,7 @@
 #define F_SEAL_SHRINK	0x0002	/* prevent file from shrinking */
 #define F_SEAL_GROW	0x0004	/* prevent file from growing */
 #define F_SEAL_WRITE	0x0008	/* prevent writes */
+#define F_SEAL_FUTURE_WRITE	0x0010  /* prevent future writes while mapped */
 /* (1U << 31) is reserved for signed error codes */
 
 /*
diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h
index a441ea1..463117c 100644
--- a/include/uapi/linux/fs.h
+++ b/include/uapi/linux/fs.h
@@ -13,6 +13,9 @@
 #include <linux/limits.h>
 #include <linux/ioctl.h>
 #include <linux/types.h>
+#ifndef __KERNEL__
+#include <linux/fscrypt.h>
+#endif
 
 /*
  * It's silly to have NR_OPEN bigger than NR_FILE, but you can change
@@ -259,55 +262,6 @@
 #define FS_IOC_SETFSLABEL		_IOW(0x94, 50, char[FSLABEL_MAX])
 
 /*
- * File system encryption support
- */
-/* Policy provided via an ioctl on the topmost directory */
-#define FS_KEY_DESCRIPTOR_SIZE	8
-
-#define FS_POLICY_FLAGS_PAD_4		0x00
-#define FS_POLICY_FLAGS_PAD_8		0x01
-#define FS_POLICY_FLAGS_PAD_16		0x02
-#define FS_POLICY_FLAGS_PAD_32		0x03
-#define FS_POLICY_FLAGS_PAD_MASK	0x03
-#define FS_POLICY_FLAGS_VALID		0x03
-
-/* Encryption algorithms */
-#define FS_ENCRYPTION_MODE_INVALID		0
-#define FS_ENCRYPTION_MODE_AES_256_XTS		1
-#define FS_ENCRYPTION_MODE_AES_256_GCM		2
-#define FS_ENCRYPTION_MODE_AES_256_CBC		3
-#define FS_ENCRYPTION_MODE_AES_256_CTS		4
-#define FS_ENCRYPTION_MODE_AES_128_CBC		5
-#define FS_ENCRYPTION_MODE_AES_128_CTS		6
-#define FS_ENCRYPTION_MODE_SPECK128_256_XTS	7 /* Removed, do not use. */
-#define FS_ENCRYPTION_MODE_SPECK128_256_CTS	8 /* Removed, do not use. */
-
-struct fscrypt_policy {
-	__u8 version;
-	__u8 contents_encryption_mode;
-	__u8 filenames_encryption_mode;
-	__u8 flags;
-	__u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
-};
-
-#define FS_IOC_SET_ENCRYPTION_POLICY	_IOR('f', 19, struct fscrypt_policy)
-#define FS_IOC_GET_ENCRYPTION_PWSALT	_IOW('f', 20, __u8[16])
-#define FS_IOC_GET_ENCRYPTION_POLICY	_IOW('f', 21, struct fscrypt_policy)
-
-/* Parameters for passing an encryption key into the kernel keyring */
-#define FS_KEY_DESC_PREFIX		"fscrypt:"
-#define FS_KEY_DESC_PREFIX_SIZE		8
-
-/* Structure that userspace passes to the kernel keyring */
-#define FS_MAX_KEY_SIZE			64
-
-struct fscrypt_key {
-	__u32 mode;
-	__u8 raw[FS_MAX_KEY_SIZE];
-	__u32 size;
-};
-
-/*
  * Inode flags (FS_IOC_GETFLAGS / FS_IOC_SETFLAGS)
  *
  * Note: for historical reasons, these flags were originally used and
@@ -350,11 +304,13 @@
 #define FS_TOPDIR_FL			0x00020000 /* Top of directory hierarchies*/
 #define FS_HUGE_FILE_FL			0x00040000 /* Reserved for ext4 */
 #define FS_EXTENT_FL			0x00080000 /* Extents */
+#define FS_VERITY_FL			0x00100000 /* Verity protected inode */
 #define FS_EA_INODE_FL			0x00200000 /* Inode used for large EA */
 #define FS_EOFBLOCKS_FL			0x00400000 /* Reserved for ext4 */
 #define FS_NOCOW_FL			0x00800000 /* Do not cow file */
 #define FS_INLINE_DATA_FL		0x10000000 /* Reserved for ext4 */
 #define FS_PROJINHERIT_FL		0x20000000 /* Create with parents projid */
+#define FS_CASEFOLD_FL			0x40000000 /* Folder is case insensitive */
 #define FS_RESERVED_FL			0x80000000 /* reserved for ext2 lib */
 
 #define FS_FL_USER_VISIBLE		0x0003DFFF /* User visible flags */
diff --git a/include/uapi/linux/fscrypt.h b/include/uapi/linux/fscrypt.h
new file mode 100644
index 0000000..1beb174
--- /dev/null
+++ b/include/uapi/linux/fscrypt.h
@@ -0,0 +1,182 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ * fscrypt user API
+ *
+ * These ioctls can be used on filesystems that support fscrypt.  See the
+ * "User API" section of Documentation/filesystems/fscrypt.rst.
+ */
+#ifndef _UAPI_LINUX_FSCRYPT_H
+#define _UAPI_LINUX_FSCRYPT_H
+
+#include <linux/types.h>
+
+/* Encryption policy flags */
+#define FSCRYPT_POLICY_FLAGS_PAD_4		0x00
+#define FSCRYPT_POLICY_FLAGS_PAD_8		0x01
+#define FSCRYPT_POLICY_FLAGS_PAD_16		0x02
+#define FSCRYPT_POLICY_FLAGS_PAD_32		0x03
+#define FSCRYPT_POLICY_FLAGS_PAD_MASK		0x03
+#define FSCRYPT_POLICY_FLAG_DIRECT_KEY		0x04
+#define FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64	0x08
+#define FSCRYPT_POLICY_FLAGS_VALID		0x0F
+
+/* Encryption algorithms */
+#define FSCRYPT_MODE_AES_256_XTS		1
+#define FSCRYPT_MODE_AES_256_CTS		4
+#define FSCRYPT_MODE_AES_128_CBC		5
+#define FSCRYPT_MODE_AES_128_CTS		6
+#define FSCRYPT_MODE_ADIANTUM			9
+#define __FSCRYPT_MODE_MAX			9
+
+/*
+ * Legacy policy version; ad-hoc KDF and no key verification.
+ * For new encrypted directories, use fscrypt_policy_v2 instead.
+ *
+ * Careful: the .version field for this is actually 0, not 1.
+ */
+#define FSCRYPT_POLICY_V1		0
+#define FSCRYPT_KEY_DESCRIPTOR_SIZE	8
+struct fscrypt_policy_v1 {
+	__u8 version;
+	__u8 contents_encryption_mode;
+	__u8 filenames_encryption_mode;
+	__u8 flags;
+	__u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
+};
+#define fscrypt_policy	fscrypt_policy_v1
+
+/*
+ * Process-subscribed "logon" key description prefix and payload format.
+ * Deprecated; prefer FS_IOC_ADD_ENCRYPTION_KEY instead.
+ */
+#define FSCRYPT_KEY_DESC_PREFIX		"fscrypt:"
+#define FSCRYPT_KEY_DESC_PREFIX_SIZE	8
+#define FSCRYPT_MAX_KEY_SIZE		64
+struct fscrypt_key {
+	__u32 mode;
+	__u8 raw[FSCRYPT_MAX_KEY_SIZE];
+	__u32 size;
+};
+
+/*
+ * New policy version with HKDF and key verification (recommended).
+ */
+#define FSCRYPT_POLICY_V2		2
+#define FSCRYPT_KEY_IDENTIFIER_SIZE	16
+struct fscrypt_policy_v2 {
+	__u8 version;
+	__u8 contents_encryption_mode;
+	__u8 filenames_encryption_mode;
+	__u8 flags;
+	__u8 __reserved[4];
+	__u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
+};
+
+/* Struct passed to FS_IOC_GET_ENCRYPTION_POLICY_EX */
+struct fscrypt_get_policy_ex_arg {
+	__u64 policy_size; /* input/output */
+	union {
+		__u8 version;
+		struct fscrypt_policy_v1 v1;
+		struct fscrypt_policy_v2 v2;
+	} policy; /* output */
+};
+
+/*
+ * v1 policy keys are specified by an arbitrary 8-byte key "descriptor",
+ * matching fscrypt_policy_v1::master_key_descriptor.
+ */
+#define FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR	1
+
+/*
+ * v2 policy keys are specified by a 16-byte key "identifier" which the kernel
+ * calculates as a cryptographic hash of the key itself,
+ * matching fscrypt_policy_v2::master_key_identifier.
+ */
+#define FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER	2
+
+/*
+ * Specifies a key, either for v1 or v2 policies.  This doesn't contain the
+ * actual key itself; this is just the "name" of the key.
+ */
+struct fscrypt_key_specifier {
+	__u32 type;	/* one of FSCRYPT_KEY_SPEC_TYPE_* */
+	__u32 __reserved;
+	union {
+		__u8 __reserved[32]; /* reserve some extra space */
+		__u8 descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
+		__u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
+	} u;
+};
+
+/* Struct passed to FS_IOC_ADD_ENCRYPTION_KEY */
+struct fscrypt_add_key_arg {
+	struct fscrypt_key_specifier key_spec;
+	__u32 raw_size;
+	__u32 __reserved[9];
+	__u8 raw[];
+};
+
+/* Struct passed to FS_IOC_REMOVE_ENCRYPTION_KEY */
+struct fscrypt_remove_key_arg {
+	struct fscrypt_key_specifier key_spec;
+#define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY	0x00000001
+#define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS	0x00000002
+	__u32 removal_status_flags;	/* output */
+	__u32 __reserved[5];
+};
+
+/* Struct passed to FS_IOC_GET_ENCRYPTION_KEY_STATUS */
+struct fscrypt_get_key_status_arg {
+	/* input */
+	struct fscrypt_key_specifier key_spec;
+	__u32 __reserved[6];
+
+	/* output */
+#define FSCRYPT_KEY_STATUS_ABSENT		1
+#define FSCRYPT_KEY_STATUS_PRESENT		2
+#define FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED	3
+	__u32 status;
+#define FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF   0x00000001
+	__u32 status_flags;
+	__u32 user_count;
+	__u32 __out_reserved[13];
+};
+
+#define FS_IOC_SET_ENCRYPTION_POLICY		_IOR('f', 19, struct fscrypt_policy)
+#define FS_IOC_GET_ENCRYPTION_PWSALT		_IOW('f', 20, __u8[16])
+#define FS_IOC_GET_ENCRYPTION_POLICY		_IOW('f', 21, struct fscrypt_policy)
+#define FS_IOC_GET_ENCRYPTION_POLICY_EX		_IOWR('f', 22, __u8[9]) /* size + version */
+#define FS_IOC_ADD_ENCRYPTION_KEY		_IOWR('f', 23, struct fscrypt_add_key_arg)
+#define FS_IOC_REMOVE_ENCRYPTION_KEY		_IOWR('f', 24, struct fscrypt_remove_key_arg)
+#define FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS	_IOWR('f', 25, struct fscrypt_remove_key_arg)
+#define FS_IOC_GET_ENCRYPTION_KEY_STATUS	_IOWR('f', 26, struct fscrypt_get_key_status_arg)
+
+/**********************************************************************/
+
+/* old names; don't add anything new here! */
+#ifndef __KERNEL__
+#define FS_KEY_DESCRIPTOR_SIZE		FSCRYPT_KEY_DESCRIPTOR_SIZE
+#define FS_POLICY_FLAGS_PAD_4		FSCRYPT_POLICY_FLAGS_PAD_4
+#define FS_POLICY_FLAGS_PAD_8		FSCRYPT_POLICY_FLAGS_PAD_8
+#define FS_POLICY_FLAGS_PAD_16		FSCRYPT_POLICY_FLAGS_PAD_16
+#define FS_POLICY_FLAGS_PAD_32		FSCRYPT_POLICY_FLAGS_PAD_32
+#define FS_POLICY_FLAGS_PAD_MASK	FSCRYPT_POLICY_FLAGS_PAD_MASK
+#define FS_POLICY_FLAG_DIRECT_KEY	FSCRYPT_POLICY_FLAG_DIRECT_KEY
+#define FS_POLICY_FLAGS_VALID		FSCRYPT_POLICY_FLAGS_VALID
+#define FS_ENCRYPTION_MODE_INVALID	0	/* never used */
+#define FS_ENCRYPTION_MODE_AES_256_XTS	FSCRYPT_MODE_AES_256_XTS
+#define FS_ENCRYPTION_MODE_AES_256_GCM	2	/* never used */
+#define FS_ENCRYPTION_MODE_AES_256_CBC	3	/* never used */
+#define FS_ENCRYPTION_MODE_AES_256_CTS	FSCRYPT_MODE_AES_256_CTS
+#define FS_ENCRYPTION_MODE_AES_128_CBC	FSCRYPT_MODE_AES_128_CBC
+#define FS_ENCRYPTION_MODE_AES_128_CTS	FSCRYPT_MODE_AES_128_CTS
+#define FS_ENCRYPTION_MODE_SPECK128_256_XTS	7	/* removed */
+#define FS_ENCRYPTION_MODE_SPECK128_256_CTS	8	/* removed */
+#define FS_ENCRYPTION_MODE_ADIANTUM	FSCRYPT_MODE_ADIANTUM
+#define FS_KEY_DESC_PREFIX		FSCRYPT_KEY_DESC_PREFIX
+#define FS_KEY_DESC_PREFIX_SIZE		FSCRYPT_KEY_DESC_PREFIX_SIZE
+#define FS_MAX_KEY_SIZE			FSCRYPT_MAX_KEY_SIZE
+#endif /* !__KERNEL__ */
+
+#endif /* _UAPI_LINUX_FSCRYPT_H */
diff --git a/include/uapi/linux/fsverity.h b/include/uapi/linux/fsverity.h
new file mode 100644
index 0000000..da0daf6
--- /dev/null
+++ b/include/uapi/linux/fsverity.h
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ * fs-verity user API
+ *
+ * These ioctls can be used on filesystems that support fs-verity.  See the
+ * "User API" section of Documentation/filesystems/fsverity.rst.
+ *
+ * Copyright 2019 Google LLC
+ */
+#ifndef _UAPI_LINUX_FSVERITY_H
+#define _UAPI_LINUX_FSVERITY_H
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+
+#define FS_VERITY_HASH_ALG_SHA256	1
+#define FS_VERITY_HASH_ALG_SHA512	2
+
+struct fsverity_enable_arg {
+	__u32 version;
+	__u32 hash_algorithm;
+	__u32 block_size;
+	__u32 salt_size;
+	__u64 salt_ptr;
+	__u32 sig_size;
+	__u32 __reserved1;
+	__u64 sig_ptr;
+	__u64 __reserved2[11];
+};
+
+struct fsverity_digest {
+	__u16 digest_algorithm;
+	__u16 digest_size; /* input/output */
+	__u8 digest[];
+};
+
+#define FS_IOC_ENABLE_VERITY	_IOW('f', 133, struct fsverity_enable_arg)
+#define FS_IOC_MEASURE_VERITY	_IOWR('f', 134, struct fsverity_digest)
+
+#endif /* _UAPI_LINUX_FSVERITY_H */
diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h
index 1a6fee9..291f3f4 100644
--- a/include/uapi/linux/magic.h
+++ b/include/uapi/linux/magic.h
@@ -56,6 +56,8 @@
 #define REISER2FS_SUPER_MAGIC_STRING	"ReIsEr2Fs"
 #define REISER2FS_JR_SUPER_MAGIC_STRING	"ReIsEr3Fs"
 
+#define SDCARDFS_SUPER_MAGIC	0x5dca2df5
+
 #define SMB_SUPER_MAGIC		0x517B
 #define CGROUP_SUPER_MAGIC	0x27e0eb
 #define CGROUP2_SUPER_MAGIC	0x63677270
@@ -72,6 +74,7 @@
 #define DAXFS_MAGIC             0x64646178
 #define BINFMTFS_MAGIC          0x42494e4d
 #define DEVPTS_SUPER_MAGIC	0x1cd1
+#define BINDERFS_SUPER_MAGIC	0x6c6f6f70
 #define FUTEXFS_SUPER_MAGIC	0xBAD1DEA
 #define PIPEFS_MAGIC            0x50495045
 #define PROC_SUPER_MAGIC	0x9fa0
@@ -89,5 +92,6 @@
 #define UDF_SUPER_MAGIC		0x15013346
 #define BALLOON_KVM_MAGIC	0x13661366
 #define ZSMALLOC_MAGIC		0x58295829
+#define DMA_BUF_MAGIC		0x444d4142	/* "DMAB" */
 
 #endif /* __LINUX_MAGIC_H__ */
diff --git a/include/uapi/linux/netfilter/xt_IDLETIMER.h b/include/uapi/linux/netfilter/xt_IDLETIMER.h
index 3c586a1..c82a1c1 100644
--- a/include/uapi/linux/netfilter/xt_IDLETIMER.h
+++ b/include/uapi/linux/netfilter/xt_IDLETIMER.h
@@ -5,6 +5,7 @@
  * Header file for Xtables timer target module.
  *
  * Copyright (C) 2004, 2010 Nokia Corporation
+ *
  * Written by Timo Teras <ext-timo.teras@nokia.com>
  *
  * Converted to x_tables and forward-ported to 2.6.34
@@ -33,12 +34,19 @@
 #include <linux/types.h>
 
 #define MAX_IDLETIMER_LABEL_SIZE 28
+#define NLMSG_MAX_SIZE 64
+
+#define NL_EVENT_TYPE_INACTIVE 0
+#define NL_EVENT_TYPE_ACTIVE 1
 
 struct idletimer_tg_info {
 	__u32 timeout;
 
 	char label[MAX_IDLETIMER_LABEL_SIZE];
 
+	/* Use netlink messages for notification in addition to sysfs */
+	__u8 send_nl_msg;
+
 	/* for kernel module internal use only */
 	struct idletimer_tg *timer __attribute__((aligned(8)));
 };
diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h
index b17201e..9d34a52 100644
--- a/include/uapi/linux/prctl.h
+++ b/include/uapi/linux/prctl.h
@@ -220,4 +220,12 @@
 # define PR_SPEC_DISABLE		(1UL << 2)
 # define PR_SPEC_FORCE_DISABLE		(1UL << 3)
 
+#define PR_SET_VMA		0x53564d41
+# define PR_SET_VMA_ANON_NAME		0
+
+/* Tagged user address controls for arm64 */
+#define PR_SET_TAGGED_ADDR_CTRL		55
+#define PR_GET_TAGGED_ADDR_CTRL		56
+# define PR_TAGGED_ADDR_ENABLE		(1UL << 0)
+
 #endif /* _LINUX_PRCTL_H */
diff --git a/include/uapi/linux/sched.h b/include/uapi/linux/sched.h
index 22627f8..ed4ee17 100644
--- a/include/uapi/linux/sched.h
+++ b/include/uapi/linux/sched.h
@@ -10,6 +10,7 @@
 #define CLONE_FS	0x00000200	/* set if fs info shared between processes */
 #define CLONE_FILES	0x00000400	/* set if open files shared between processes */
 #define CLONE_SIGHAND	0x00000800	/* set if signal handlers and blocked signals shared */
+#define CLONE_PIDFD	0x00001000	/* set if a pidfd should be placed in parent */
 #define CLONE_PTRACE	0x00002000	/* set if we want to let tracing continue on the child too */
 #define CLONE_VFORK	0x00004000	/* set if the parent wants the child to wake it up on mm_release */
 #define CLONE_PARENT	0x00008000	/* set if we want to have the same parent as the cloner */
diff --git a/include/uapi/linux/taskstats.h b/include/uapi/linux/taskstats.h
index b7aa7bb..5e8ca16 100644
--- a/include/uapi/linux/taskstats.h
+++ b/include/uapi/linux/taskstats.h
@@ -34,7 +34,7 @@
  */
 
 
-#define TASKSTATS_VERSION	8
+#define TASKSTATS_VERSION	9
 #define TS_COMM_LEN		32	/* should be >= TASK_COMM_LEN
 					 * in linux/sched.h */
 
@@ -164,6 +164,10 @@
 	/* Delay waiting for memory reclaim */
 	__u64	freepages_count;
 	__u64	freepages_delay_total;
+
+	/* Delay waiting for thrashing page */
+	__u64	thrashing_count;
+	__u64	thrashing_delay_total;
 };
 
 
diff --git a/include/uapi/linux/usb/f_accessory.h b/include/uapi/linux/usb/f_accessory.h
new file mode 100644
index 0000000..0baeb7d
--- /dev/null
+++ b/include/uapi/linux/usb/f_accessory.h
@@ -0,0 +1,146 @@
+/*
+ * Gadget Function Driver for Android USB accessories
+ *
+ * Copyright (C) 2011 Google, Inc.
+ * Author: Mike Lockwood <lockwood@android.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ *
+ */
+
+#ifndef _UAPI_LINUX_USB_F_ACCESSORY_H
+#define _UAPI_LINUX_USB_F_ACCESSORY_H
+
+/* Use Google Vendor ID when in accessory mode */
+#define USB_ACCESSORY_VENDOR_ID 0x18D1
+
+
+/* Product ID to use when in accessory mode */
+#define USB_ACCESSORY_PRODUCT_ID 0x2D00
+
+/* Product ID to use when in accessory mode and adb is enabled */
+#define USB_ACCESSORY_ADB_PRODUCT_ID 0x2D01
+
+/* Indexes for strings sent by the host via ACCESSORY_SEND_STRING */
+#define ACCESSORY_STRING_MANUFACTURER   0
+#define ACCESSORY_STRING_MODEL          1
+#define ACCESSORY_STRING_DESCRIPTION    2
+#define ACCESSORY_STRING_VERSION        3
+#define ACCESSORY_STRING_URI            4
+#define ACCESSORY_STRING_SERIAL         5
+
+/* Control request for retrieving device's protocol version
+ *
+ *	requestType:    USB_DIR_IN | USB_TYPE_VENDOR
+ *	request:        ACCESSORY_GET_PROTOCOL
+ *	value:          0
+ *	index:          0
+ *	data            version number (16 bits little endian)
+ *                     1 for original accessory support
+ *                     2 adds HID and device to host audio support
+ */
+#define ACCESSORY_GET_PROTOCOL  51
+
+/* Control request for host to send a string to the device
+ *
+ *	requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
+ *	request:        ACCESSORY_SEND_STRING
+ *	value:          0
+ *	index:          string ID
+ *	data            zero terminated UTF8 string
+ *
+ *  The device can later retrieve these strings via the
+ *  ACCESSORY_GET_STRING_* ioctls
+ */
+#define ACCESSORY_SEND_STRING   52
+
+/* Control request for starting device in accessory mode.
+ * The host sends this after setting all its strings to the device.
+ *
+ *	requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
+ *	request:        ACCESSORY_START
+ *	value:          0
+ *	index:          0
+ *	data            none
+ */
+#define ACCESSORY_START         53
+
+/* Control request for registering a HID device.
+ * Upon registering, a unique ID is sent by the accessory in the
+ * value parameter. This ID will be used for future commands for
+ * the device
+ *
+ *	requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
+ *	request:        ACCESSORY_REGISTER_HID_DEVICE
+ *	value:          Accessory assigned ID for the HID device
+ *	index:          total length of the HID report descriptor
+ *	data            none
+ */
+#define ACCESSORY_REGISTER_HID         54
+
+/* Control request for unregistering a HID device.
+ *
+ *	requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
+ *	request:        ACCESSORY_REGISTER_HID
+ *	value:          Accessory assigned ID for the HID device
+ *	index:          0
+ *	data            none
+ */
+#define ACCESSORY_UNREGISTER_HID         55
+
+/* Control request for sending the HID report descriptor.
+ * If the HID descriptor is longer than the endpoint zero max packet size,
+ * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC
+ * commands. The data for the descriptor must be sent sequentially
+ * if multiple packets are needed.
+ *
+ *	requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
+ *	request:        ACCESSORY_SET_HID_REPORT_DESC
+ *	value:          Accessory assigned ID for the HID device
+ *	index:          offset of data in descriptor
+ *                      (needed when HID descriptor is too big for one packet)
+ *	data            the HID report descriptor
+ */
+#define ACCESSORY_SET_HID_REPORT_DESC         56
+
+/* Control request for sending HID events.
+ *
+ *	requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
+ *	request:        ACCESSORY_SEND_HID_EVENT
+ *	value:          Accessory assigned ID for the HID device
+ *	index:          0
+ *	data            the HID report for the event
+ */
+#define ACCESSORY_SEND_HID_EVENT         57
+
+/* Control request for setting the audio mode.
+ *
+ *	requestType:	USB_DIR_OUT | USB_TYPE_VENDOR
+ *	request:        ACCESSORY_SET_AUDIO_MODE
+ *	value:          0 - no audio
+ *                     1 - device to host, 44100 16-bit stereo PCM
+ *	index:          0
+ *	data            none
+ */
+#define ACCESSORY_SET_AUDIO_MODE         58
+
+/* ioctls for retrieving strings set by the host */
+#define ACCESSORY_GET_STRING_MANUFACTURER   _IOW('M', 1, char[256])
+#define ACCESSORY_GET_STRING_MODEL          _IOW('M', 2, char[256])
+#define ACCESSORY_GET_STRING_DESCRIPTION    _IOW('M', 3, char[256])
+#define ACCESSORY_GET_STRING_VERSION        _IOW('M', 4, char[256])
+#define ACCESSORY_GET_STRING_URI            _IOW('M', 5, char[256])
+#define ACCESSORY_GET_STRING_SERIAL         _IOW('M', 6, char[256])
+/* returns 1 if there is a start request pending */
+#define ACCESSORY_IS_START_REQUESTED        _IO('M', 7)
+/* returns audio mode (set via the ACCESSORY_SET_AUDIO_MODE control request) */
+#define ACCESSORY_GET_AUDIO_MODE            _IO('M', 8)
+
+#endif /* _UAPI_LINUX_USB_F_ACCESSORY_H */
diff --git a/include/uapi/linux/virtio_gpu.h b/include/uapi/linux/virtio_gpu.h
index f43c3c6..8e88eba 100644
--- a/include/uapi/linux/virtio_gpu.h
+++ b/include/uapi/linux/virtio_gpu.h
@@ -41,6 +41,7 @@
 #include <linux/types.h>
 
 #define VIRTIO_GPU_F_VIRGL 0
+#define VIRTIO_GPU_F_EDID  1
 
 enum virtio_gpu_ctrl_type {
 	VIRTIO_GPU_UNDEFINED = 0,
@@ -56,6 +57,7 @@
 	VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING,
 	VIRTIO_GPU_CMD_GET_CAPSET_INFO,
 	VIRTIO_GPU_CMD_GET_CAPSET,
+	VIRTIO_GPU_CMD_GET_EDID,
 
 	/* 3d commands */
 	VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
@@ -76,6 +78,7 @@
 	VIRTIO_GPU_RESP_OK_DISPLAY_INFO,
 	VIRTIO_GPU_RESP_OK_CAPSET_INFO,
 	VIRTIO_GPU_RESP_OK_CAPSET,
+	VIRTIO_GPU_RESP_OK_EDID,
 
 	/* error responses */
 	VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
@@ -291,6 +294,21 @@
 	__u8 capset_data[];
 };
 
+/* VIRTIO_GPU_CMD_GET_EDID */
+struct virtio_gpu_cmd_get_edid {
+	struct virtio_gpu_ctrl_hdr hdr;
+	__le32 scanout;
+	__le32 padding;
+};
+
+/* VIRTIO_GPU_RESP_OK_EDID */
+struct virtio_gpu_resp_edid {
+	struct virtio_gpu_ctrl_hdr hdr;
+	__le32 size;
+	__le32 padding;
+	__u8 edid[1024];
+};
+
 #define VIRTIO_GPU_EVENT_DISPLAY (1 << 0)
 
 struct virtio_gpu_config {
diff --git a/init/Kconfig b/init/Kconfig
index 47035b5..096d684 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -19,6 +19,9 @@
 config CC_IS_CLANG
 	def_bool $(success,$(CC) --version | head -n 1 | grep -q clang)
 
+config LD_IS_LLD
+	def_bool $(success,$(LD) -v | head -n 1 | grep -q LLD)
+
 config CLANG_VERSION
 	int
 	default $(shell,$(srctree)/scripts/clang-version.sh $(CC))
@@ -26,6 +29,9 @@
 config CC_HAS_ASM_GOTO
 	def_bool $(success,$(srctree)/scripts/gcc-goto.sh $(CC))
 
+config TOOLS_SUPPORT_RELR
+	def_bool $(success,env "CC=$(CC)" "LD=$(LD)" "NM=$(NM)" "OBJCOPY=$(OBJCOPY)" $(srctree)/scripts/tools-support-relr.sh)
+
 config CONSTRUCTORS
 	bool
 	depends on !UML
@@ -493,6 +499,45 @@
 
 	  Say N if unsure.
 
+config PSI
+	bool "Pressure stall information tracking"
+	help
+	  Collect metrics that indicate how overcommitted the CPU, memory,
+	  and IO capacity are in the system.
+
+	  If you say Y here, the kernel will create /proc/pressure/ with the
+	  pressure statistics files cpu, memory, and io. These will indicate
+	  the share of walltime in which some or all tasks in the system are
+	  delayed due to contention of the respective resource.
+
+	  In kernels with cgroup support, cgroups (cgroup2 only) will
+	  have cpu.pressure, memory.pressure, and io.pressure files,
+	  which aggregate pressure stalls for the grouped tasks only.
+
+	  For more details see Documentation/accounting/psi.txt.
+
+	  Say N if unsure.
+
+config PSI_DEFAULT_DISABLED
+	bool "Require boot parameter to enable pressure stall information tracking"
+	default n
+	depends on PSI
+	help
+	  If set, pressure stall information tracking will be disabled
+	  per default but can be enabled through passing psi=1 on the
+	  kernel commandline during boot.
+
+	  This feature adds some code to the task wakeup and sleep
+	  paths of the scheduler. The overhead is too low to affect
+	  common scheduling-intense workloads in practice (such as
+	  webservers, memcache), but it does show up in artificial
+	  scheduler stress tests, such as hackbench.
+
+	  If you are paranoid and not sure what the kernel will be
+	  used for, say Y.
+
+	  Say N if unsure.
+
 endmenu # "CPU/Task time and stats accounting"
 
 config CPU_ISOLATION
@@ -533,6 +578,15 @@
 	  This option enables access to the kernel configuration file
 	  through /proc/config.gz.
 
+config IKHEADERS
+	tristate "Enable kernel headers through /sys/kernel/kheaders.tar.xz"
+	depends on SYSFS
+	help
+	  This option enables access to the in-kernel headers that are generated during
+	  the build process. These can be used to build eBPF tracing programs,
+	  or similar programs.  If you build the headers as a module, a module called
+	  kheaders.ko is built which can be loaded on-demand to get access to headers.
+
 config LOG_BUF_SHIFT
 	int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
 	range 12 25
@@ -999,6 +1053,29 @@
 	  desktop applications.  Task group autogeneration is currently based
 	  upon task session.
 
+config SCHED_TUNE
+	bool "Boosting for CFS tasks (EXPERIMENTAL)"
+	depends on SMP
+	help
+	  This option enables support for task classification using a new
+	  cgroup controller, schedtune. Schedtune allows tasks to be given
+	  a boost value and marked as latency-sensitive or not. This option
+	  provides the "schedtune" controller.
+
+	  This new controller:
+	  1. allows only a two layers hierarchy, where the root defines the
+	     system-wide boost value and its direct childrens define each one a
+	     different "class of tasks" to be boosted with a different value
+	  2. supports up to 16 different task classes, each one which could be
+	     configured with a different boost value
+
+	  Latency-sensitive tasks are not subject to energy-aware wakeup
+	  task placement. The boost value assigned to tasks is used to
+	  influence task placement and CPU frequency selection (if
+	  utilization-driven frequency selection is in use).
+
+	  If unsure, say N.
+
 config SYSFS_DEPRECATED
 	bool "Enable deprecated sysfs features to support old userspace tools"
 	depends on SYSFS
@@ -1123,9 +1200,6 @@
 config SYSCTL
 	bool
 
-config ANON_INODES
-	bool
-
 config HAVE_UID16
 	bool
 
@@ -1330,14 +1404,12 @@
 config EPOLL
 	bool "Enable eventpoll support" if EXPERT
 	default y
-	select ANON_INODES
 	help
 	  Disabling this option will cause the kernel to be built without
 	  support for epoll family of system calls.
 
 config SIGNALFD
 	bool "Enable signalfd() system call" if EXPERT
-	select ANON_INODES
 	default y
 	help
 	  Enable the signalfd() system call that allows to receive signals
@@ -1347,7 +1419,6 @@
 
 config TIMERFD
 	bool "Enable timerfd() system call" if EXPERT
-	select ANON_INODES
 	default y
 	help
 	  Enable the timerfd() system call that allows to receive timer
@@ -1357,7 +1428,6 @@
 
 config EVENTFD
 	bool "Enable eventfd() system call" if EXPERT
-	select ANON_INODES
 	default y
 	help
 	  Enable the eventfd() system call that allows to receive both
@@ -1459,7 +1529,6 @@
 # syscall, maps, verifier
 config BPF_SYSCALL
 	bool "Enable bpf() system call"
-	select ANON_INODES
 	select BPF
 	select IRQ_WORK
 	default n
@@ -1476,7 +1545,6 @@
 
 config USERFAULTFD
 	bool "Enable userfaultfd() system call"
-	select ANON_INODES
 	depends on MMU
 	help
 	  Enable the userfaultfd() system call that allows to intercept and
@@ -1543,7 +1611,6 @@
 	bool "Kernel performance events and counters"
 	default y if PROFILING
 	depends on HAVE_PERF_EVENTS
-	select ANON_INODES
 	select IRQ_WORK
 	select SRCU
 	help
@@ -1981,7 +2048,7 @@
 
 config MODULES_TREE_LOOKUP
 	def_bool y
-	depends on PERF_EVENTS || TRACING
+	depends on PERF_EVENTS || TRACING || CFI_CLANG
 
 config INIT_ALL_POSSIBLE
 	bool
@@ -2023,3 +2090,5 @@
 # <asm/syscall_wrapper.h>.
 config ARCH_HAS_SYSCALL_WRAPPER
 	def_bool n
+
+source "init/Kconfig.gki"
diff --git a/init/Kconfig.gki b/init/Kconfig.gki
new file mode 100644
index 0000000..7bd91be
--- /dev/null
+++ b/init/Kconfig.gki
@@ -0,0 +1,76 @@
+config GKI_HIDDEN_DRM_CONFIGS
+	bool "Hidden DRM configs needed for GKI"
+	select DRM_KMS_HELPER if (HAS_IOMEM && DRM)
+	select DRM_GEM_CMA_HELPER
+	select DRM_KMS_CMA_HELPER
+	select DRM_MIPI_DSI
+	select VIDEOMODE_HELPERS
+	help
+	  Dummy config option used to enable hidden DRM configs.
+	  These are normally selected implicitely when including a
+	  DRM module, but for GKI, the modules are built out-of-tree.
+
+config GKI_HIDDEN_REGMAP_CONFIGS
+	bool "Hidden Regmap configs needed for GKI"
+	select REGMAP_IRQ
+	help
+	  Dummy config option used to enable hidden regmap configs.
+	  These are normally selected implicitely when a module
+	  that relies on it is configured.
+
+config GKI_HIDDEN_SND_SOC_CONFIGS
+	bool "Hidden SND_SOC configs needed for GKI"
+	select SND_SOC_GENERIC_DMAENGINE_PCM if (SND_SOC && SND)
+	help
+	  Dummy config option used to enable hidden SND_SOC configs.
+	  These are normally selected implicitely when a module
+	  that relies on it is configured.
+
+config GKI_HIDDEN_GPIO_CONFIGS
+	bool "Hidden GPIO configs needed for GKI"
+	select PINCTRL_SINGLE if (PINCTRL && OF && HAS_IOMEM)
+	select GPIO_PL061 if (HAS_IOMEM && ARM_AMBA && GPIOLIB)
+	help
+	  Dummy config option used to enable hidden GPIO configs.
+	  These are normally selected implicitely when a module
+	  that relies on it is configured.
+
+# LEGACY_WEXT_ALLCONFIG Discussed upstream, soundly rejected as a unique
+# problem for GKI to solve.  It should be noted that these extensions are
+# in-effect deprecated and generally unsupported and we should pressure
+# the SOC vendors to drop any modules that require these extensions.
+config GKI_LEGACY_WEXT_ALLCONFIG
+	bool "Hidden wireless extension configs needed for GKI"
+	select WIRELESS_EXT
+	select WEXT_CORE
+	select WEXT_PROC
+	select WEXT_SPY
+	select WEXT_PRIV
+	help
+	  Dummy config option used to enable all the hidden legacy wireless
+	  extensions to the core wireless network functionality used by
+	  add-in modules.
+
+	  If you are not building a kernel to be used for a variety of
+	  out-of-kernel built wireless modules, say N here.
+
+# Atrocities needed for
+# a) building GKI modules in separate tree, or
+# b) building drivers that are not modularizable
+#
+# All of these should be reworked into an upstream solution
+# if possible.
+#
+config GKI_HACKS_TO_FIX
+	bool "GKI Dummy config options"
+	select GKI_HIDDEN_DRM_CONFIGS
+	select GKI_HIDDEN_REGMAP_CONFIGS
+	select GKI_HIDDEN_SND_SOC_CONFIGS
+	select GKI_HIDDEN_GPIO_CONFIGS
+	select GKI_LEGACY_WEXT_ALLCONFIG
+	help
+	  Dummy config option used to enable core functionality used by
+	  modules that may not be selectable in this config.
+
+	  Unless you are building a GKI kernel to be used with modules
+	  built from a different config, say N here.
diff --git a/init/init_task.c b/init/init_task.c
index 5aebe3b..7b57e01 100644
--- a/init/init_task.c
+++ b/init/init_task.c
@@ -10,6 +10,7 @@
 #include <linux/fs.h>
 #include <linux/mm.h>
 #include <linux/audit.h>
+#include <linux/scs.h>
 
 #include <asm/pgtable.h>
 #include <linux/uaccess.h>
@@ -182,6 +183,13 @@
 };
 EXPORT_SYMBOL(init_task);
 
+#ifdef CONFIG_SHADOW_CALL_STACK
+unsigned long init_shadow_call_stack[SCS_SIZE / sizeof(long)] __init_task_data
+		__aligned(SCS_SIZE) = {
+	[(SCS_SIZE / sizeof(long)) - 1] = SCS_END_MAGIC
+};
+#endif
+
 /*
  * Initial thread structure. Alignment of this is handled by a special
  * linker map entry.
diff --git a/init/main.c b/init/main.c
index 38a603f..bc440bb 100644
--- a/init/main.c
+++ b/init/main.c
@@ -506,6 +506,29 @@
 }
 #endif
 
+/* Report memory auto-initialization states for this boot. */
+static void __init report_meminit(void)
+{
+	const char *stack;
+
+	if (IS_ENABLED(CONFIG_INIT_STACK_ALL))
+		stack = "all";
+	else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL))
+		stack = "byref_all";
+	else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF))
+		stack = "byref";
+	else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_USER))
+		stack = "__user";
+	else
+		stack = "off";
+
+	pr_info("mem auto-init: stack:%s, heap alloc:%s, heap free:%s\n",
+		stack, want_init_on_alloc(GFP_KERNEL) ? "on" : "off",
+		want_init_on_free() ? "on" : "off");
+	if (want_init_on_free())
+		pr_info("mem auto-init: clearing system memory may take some time...\n");
+}
+
 /*
  * Set up kernel memory allocators
  */
@@ -516,6 +539,7 @@
 	 * bigger than MAX_ORDER unless SPARSEMEM.
 	 */
 	page_ext_init_flatmem();
+	report_meminit();
 	mem_init();
 	kmem_cache_init();
 	pgtable_init();
diff --git a/ipc/mqueue.c b/ipc/mqueue.c
index de4070d..8763ee7 100644
--- a/ipc/mqueue.c
+++ b/ipc/mqueue.c
@@ -721,7 +721,7 @@
 	info->notify_user_ns = NULL;
 }
 
-static int prepare_open(struct dentry *dentry, int oflag, int ro,
+static int prepare_open(struct vfsmount *mnt, struct dentry *dentry, int oflag, int ro,
 			umode_t mode, struct filename *name,
 			struct mq_attr *attr)
 {
@@ -735,7 +735,7 @@
 		if (ro)
 			return ro;
 		audit_inode_parent_hidden(name, dentry->d_parent);
-		return vfs_mkobj(dentry, mode & ~current_umask(),
+		return vfs_mkobj2(mnt, dentry, mode & ~current_umask(),
 				  mqueue_create_attr, attr);
 	}
 	/* it already existed */
@@ -745,7 +745,7 @@
 	if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY))
 		return -EINVAL;
 	acc = oflag2acc[oflag & O_ACCMODE];
-	return inode_permission(d_inode(dentry), acc);
+	return inode_permission2(mnt, d_inode(dentry), acc);
 }
 
 static int do_mq_open(const char __user *u_name, int oflag, umode_t mode,
@@ -769,13 +769,13 @@
 
 	ro = mnt_want_write(mnt);	/* we'll drop it in any case */
 	inode_lock(d_inode(root));
-	path.dentry = lookup_one_len(name->name, root, strlen(name->name));
+	path.dentry = lookup_one_len2(name->name, mnt, root, strlen(name->name));
 	if (IS_ERR(path.dentry)) {
 		error = PTR_ERR(path.dentry);
 		goto out_putfd;
 	}
 	path.mnt = mntget(mnt);
-	error = prepare_open(path.dentry, oflag, ro, mode, name, attr);
+	error = prepare_open(path.mnt, path.dentry, oflag, ro, mode, name, attr);
 	if (!error) {
 		struct file *file = dentry_open(&path, oflag, current_cred());
 		if (!IS_ERR(file))
@@ -825,7 +825,7 @@
 	if (err)
 		goto out_name;
 	inode_lock_nested(d_inode(mnt->mnt_root), I_MUTEX_PARENT);
-	dentry = lookup_one_len(name->name, mnt->mnt_root,
+	dentry = lookup_one_len2(name->name, mnt, mnt->mnt_root,
 				strlen(name->name));
 	if (IS_ERR(dentry)) {
 		err = PTR_ERR(dentry);
@@ -837,7 +837,7 @@
 		err = -ENOENT;
 	} else {
 		ihold(inode);
-		err = vfs_unlink(d_inode(dentry->d_parent), dentry, NULL);
+		err = vfs_unlink2(mnt, d_inode(dentry->d_parent), dentry, NULL);
 	}
 	dput(dentry);
 
diff --git a/kernel/.gitignore b/kernel/.gitignore
index b3097bd..084572a 100644
--- a/kernel/.gitignore
+++ b/kernel/.gitignore
@@ -3,5 +3,6 @@
 #
 config_data.h
 config_data.gz
+kheaders.md5
 timeconst.h
 hz.bc
diff --git a/kernel/Makefile b/kernel/Makefile
index ad4b324..278153b 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -32,8 +32,13 @@
 KASAN_SANITIZE_kcov.o := n
 CFLAGS_kcov.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
 
-# cond_syscall is currently not LTO compatible
+ifndef CONFIG_CFI_CLANG
+# cond_syscall is currently not gcc LTO compatible
 CFLAGS_sys_ni.o = $(DISABLE_LTO)
+endif
+
+# Don't instrument error handlers
+CFLAGS_cfi.o = $(DISABLE_CFI_CLANG)
 
 obj-y += sched/
 obj-y += locking/
@@ -71,6 +76,7 @@
 obj-$(CONFIG_USER_NS) += user_namespace.o
 obj-$(CONFIG_PID_NS) += pid_namespace.o
 obj-$(CONFIG_IKCONFIG) += configs.o
+obj-$(CONFIG_IKHEADERS) += kheaders.o
 obj-$(CONFIG_SMP) += stop_machine.o
 obj-$(CONFIG_KPROBES_SANITY_TEST) += test_kprobes.o
 obj-$(CONFIG_AUDIT) += audit.o auditfilter.o
@@ -101,6 +107,8 @@
 obj-$(CONFIG_IRQ_WORK) += irq_work.o
 obj-$(CONFIG_CPU_PM) += cpu_pm.o
 obj-$(CONFIG_BPF) += bpf/
+obj-$(CONFIG_CFI_CLANG) += cfi.o
+obj-$(CONFIG_SHADOW_CALL_STACK) += scs.o
 
 obj-$(CONFIG_PERF_EVENTS) += events/
 
@@ -125,3 +133,12 @@
 targets += config_data.h
 $(obj)/config_data.h: $(obj)/config_data.gz FORCE
 	$(call filechk,ikconfiggz)
+
+$(obj)/kheaders.o: $(obj)/kheaders_data.tar.xz
+
+quiet_cmd_genikh = CHK     $(obj)/kheaders_data.tar.xz
+cmd_genikh = $(CONFIG_SHELL) $(srctree)/kernel/gen_kheaders.sh $@
+$(obj)/kheaders_data.tar.xz: FORCE
+	$(call cmd,genikh)
+
+clean-files := kheaders_data.tar.xz kheaders.md5
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 36be400..afee05e 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -621,6 +621,14 @@
 	atomic_long_sub(pages, &bpf_jit_current);
 }
 
+#if IS_ENABLED(CONFIG_BPF_JIT) && IS_ENABLED(CONFIG_CFI_CLANG)
+bool __weak arch_bpf_jit_check_func(const struct bpf_prog *prog)
+{
+	return true;
+}
+EXPORT_SYMBOL(arch_bpf_jit_check_func);
+#endif
+
 struct bpf_binary_header *
 bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr,
 		     unsigned int alignment,
@@ -647,6 +655,7 @@
 	/* Fill space with illegal/arch-dep instructions. */
 	bpf_fill_ill_insns(hdr, size);
 
+	bpf_jit_set_header_magic(hdr);
 	hdr->pages = pages;
 	hole = min_t(unsigned int, size - (proglen + sizeof(*hdr)),
 		     PAGE_SIZE - sizeof(*hdr));
diff --git a/kernel/cfi.c b/kernel/cfi.c
new file mode 100644
index 0000000..9e99922
--- /dev/null
+++ b/kernel/cfi.c
@@ -0,0 +1,306 @@
+/*
+ * CFI (Control Flow Integrity) error and slowpath handling
+ *
+ * Copyright (C) 2017 Google, Inc.
+ */
+
+#include <linux/gfp.h>
+#include <linux/module.h>
+#include <linux/printk.h>
+#include <linux/ratelimit.h>
+#include <linux/rcupdate.h>
+#include <linux/spinlock.h>
+#include <asm/bug.h>
+#include <asm/cacheflush.h>
+#include <asm/set_memory.h>
+
+/* Compiler-defined handler names */
+#ifdef CONFIG_CFI_PERMISSIVE
+#define cfi_failure_handler	__ubsan_handle_cfi_check_fail
+#define cfi_slowpath_handler	__cfi_slowpath_diag
+#else /* enforcing */
+#define cfi_failure_handler	__ubsan_handle_cfi_check_fail_abort
+#define cfi_slowpath_handler	__cfi_slowpath
+#endif /* CONFIG_CFI_PERMISSIVE */
+
+static inline void handle_cfi_failure(void *ptr)
+{
+#ifdef CONFIG_CFI_PERMISSIVE
+	WARN_RATELIMIT(1, "CFI failure (target: %pF):\n", ptr);
+#else
+	pr_err("CFI failure (target: %pF):\n", ptr);
+	BUG();
+#endif
+}
+
+#ifdef CONFIG_MODULES
+#ifdef CONFIG_CFI_CLANG_SHADOW
+struct shadow_range {
+	/* Module address range */
+	unsigned long mod_min_addr;
+	unsigned long mod_max_addr;
+	/* Module page range */
+	unsigned long min_page;
+	unsigned long max_page;
+};
+
+#define SHADOW_ORDER	1
+#define SHADOW_PAGES	(1 << SHADOW_ORDER)
+#define SHADOW_SIZE \
+	((SHADOW_PAGES * PAGE_SIZE - sizeof(struct shadow_range)) / sizeof(u16))
+#define SHADOW_INVALID	0xFFFF
+
+struct cfi_shadow {
+	/* Page range covered by the shadow */
+	struct shadow_range r;
+	/* Page offsets to __cfi_check functions in modules */
+	u16 shadow[SHADOW_SIZE];
+};
+
+static DEFINE_SPINLOCK(shadow_update_lock);
+static struct cfi_shadow __rcu *cfi_shadow __read_mostly = NULL;
+
+static inline int ptr_to_shadow(const struct cfi_shadow *s, unsigned long ptr)
+{
+	unsigned long index;
+	unsigned long page = ptr >> PAGE_SHIFT;
+
+	if (unlikely(page < s->r.min_page))
+		return -1; /* Outside of module area */
+
+	index = page - s->r.min_page;
+
+	if (index >= SHADOW_SIZE)
+		return -1; /* Cannot be addressed with shadow */
+
+	return (int)index;
+}
+
+static inline unsigned long shadow_to_ptr(const struct cfi_shadow *s,
+	int index)
+{
+	BUG_ON(index < 0 || index >= SHADOW_SIZE);
+
+	if (unlikely(s->shadow[index] == SHADOW_INVALID))
+		return 0;
+
+	return (s->r.min_page + s->shadow[index]) << PAGE_SHIFT;
+}
+
+static inline unsigned long shadow_to_page(const struct cfi_shadow *s,
+	int index)
+{
+	BUG_ON(index < 0 || index >= SHADOW_SIZE);
+
+	return (s->r.min_page + index) << PAGE_SHIFT;
+}
+
+static void prepare_next_shadow(const struct cfi_shadow __rcu *prev,
+		struct cfi_shadow *next)
+{
+	int i, index, check;
+
+	/* Mark everything invalid */
+	memset(next->shadow, 0xFF, sizeof(next->shadow));
+
+	if (!prev)
+		return; /* No previous shadow */
+
+	/* If the base address didn't change, update is not needed */
+	if (prev->r.min_page == next->r.min_page) {
+		memcpy(next->shadow, prev->shadow, sizeof(next->shadow));
+		return;
+	}
+
+	/* Convert the previous shadow to the new address range */
+	for (i = 0; i < SHADOW_SIZE; ++i) {
+		if (prev->shadow[i] == SHADOW_INVALID)
+			continue;
+
+		index = ptr_to_shadow(next, shadow_to_page(prev, i));
+		if (index < 0)
+			continue;
+
+		check = ptr_to_shadow(next,
+				shadow_to_ptr(prev, prev->shadow[i]));
+		if (check < 0)
+			continue;
+
+		next->shadow[index] = (u16)check;
+	}
+}
+
+static void add_module_to_shadow(struct cfi_shadow *s, struct module *mod)
+{
+	unsigned long ptr;
+	unsigned long min_page_addr;
+	unsigned long max_page_addr;
+	unsigned long check = (unsigned long)mod->cfi_check;
+	int check_index = ptr_to_shadow(s, check);
+
+	BUG_ON((check & PAGE_MASK) != check); /* Must be page aligned */
+
+	if (check_index < 0)
+		return; /* Module not addressable with shadow */
+
+	min_page_addr = (unsigned long)mod->core_layout.base & PAGE_MASK;
+	max_page_addr = (unsigned long)mod->core_layout.base +
+				       mod->core_layout.text_size;
+	max_page_addr &= PAGE_MASK;
+
+	/* For each page, store the check function index in the shadow */
+	for (ptr = min_page_addr; ptr <= max_page_addr; ptr += PAGE_SIZE) {
+		int index = ptr_to_shadow(s, ptr);
+		if (index >= 0) {
+			/* Assume a page only contains code for one module */
+			BUG_ON(s->shadow[index] != SHADOW_INVALID);
+			s->shadow[index] = (u16)check_index;
+		}
+	}
+}
+
+static void remove_module_from_shadow(struct cfi_shadow *s, struct module *mod)
+{
+	unsigned long ptr;
+	unsigned long min_page_addr;
+	unsigned long max_page_addr;
+
+	min_page_addr = (unsigned long)mod->core_layout.base & PAGE_MASK;
+	max_page_addr = (unsigned long)mod->core_layout.base +
+				       mod->core_layout.text_size;
+	max_page_addr &= PAGE_MASK;
+
+	for (ptr = min_page_addr; ptr <= max_page_addr; ptr += PAGE_SIZE) {
+		int index = ptr_to_shadow(s, ptr);
+		if (index >= 0)
+			s->shadow[index] = SHADOW_INVALID;
+	}
+}
+
+typedef void (*update_shadow_fn)(struct cfi_shadow *, struct module *);
+
+static void update_shadow(struct module *mod, unsigned long min_addr,
+	unsigned long max_addr, update_shadow_fn fn)
+{
+	struct cfi_shadow *prev;
+	struct cfi_shadow *next = (struct cfi_shadow *)
+		__get_free_pages(GFP_KERNEL, SHADOW_ORDER);
+
+	BUG_ON(!next);
+
+	next->r.mod_min_addr = min_addr;
+	next->r.mod_max_addr = max_addr;
+	next->r.min_page = min_addr >> PAGE_SHIFT;
+	next->r.max_page = max_addr >> PAGE_SHIFT;
+
+	spin_lock(&shadow_update_lock);
+	prev = rcu_dereference_protected(cfi_shadow, 1);
+	prepare_next_shadow(prev, next);
+
+	fn(next, mod);
+	set_memory_ro((unsigned long)next, SHADOW_PAGES);
+	rcu_assign_pointer(cfi_shadow, next);
+
+	spin_unlock(&shadow_update_lock);
+	synchronize_rcu();
+
+	if (prev) {
+		set_memory_rw((unsigned long)prev, SHADOW_PAGES);
+		free_pages((unsigned long)prev, SHADOW_ORDER);
+	}
+}
+
+void cfi_module_add(struct module *mod, unsigned long min_addr,
+	unsigned long max_addr)
+{
+	update_shadow(mod, min_addr, max_addr, add_module_to_shadow);
+}
+EXPORT_SYMBOL(cfi_module_add);
+
+void cfi_module_remove(struct module *mod, unsigned long min_addr,
+	unsigned long max_addr)
+{
+	update_shadow(mod, min_addr, max_addr, remove_module_from_shadow);
+}
+EXPORT_SYMBOL(cfi_module_remove);
+
+static inline cfi_check_fn ptr_to_check_fn(const struct cfi_shadow __rcu *s,
+	unsigned long ptr)
+{
+	int index;
+
+	if (unlikely(!s))
+		return NULL; /* No shadow available */
+
+	if (ptr < s->r.mod_min_addr || ptr > s->r.mod_max_addr)
+		return NULL; /* Not in a mapped module */
+
+	index = ptr_to_shadow(s, ptr);
+	if (index < 0)
+		return NULL; /* Cannot be addressed with shadow */
+
+	return (cfi_check_fn)shadow_to_ptr(s, index);
+}
+#endif /* CONFIG_CFI_CLANG_SHADOW */
+
+static inline cfi_check_fn find_module_cfi_check(void *ptr)
+{
+	struct module *mod;
+
+	preempt_disable();
+	mod = __module_address((unsigned long)ptr);
+	preempt_enable();
+
+	if (mod)
+		return mod->cfi_check;
+
+	return CFI_CHECK_FN;
+}
+
+static inline cfi_check_fn find_cfi_check(void *ptr)
+{
+#ifdef CONFIG_CFI_CLANG_SHADOW
+	cfi_check_fn f;
+
+	if (!rcu_access_pointer(cfi_shadow))
+		return CFI_CHECK_FN; /* No loaded modules */
+
+	/* Look up the __cfi_check function to use */
+	rcu_read_lock();
+	f = ptr_to_check_fn(rcu_dereference(cfi_shadow), (unsigned long)ptr);
+	rcu_read_unlock();
+
+	if (f)
+		return f;
+
+	/*
+	 * Fall back to find_module_cfi_check, which works also for a larger
+	 * module address space, but is slower.
+	 */
+#endif /* CONFIG_CFI_CLANG_SHADOW */
+
+	return find_module_cfi_check(ptr);
+}
+
+void cfi_slowpath_handler(uint64_t id, void *ptr, void *diag)
+{
+	cfi_check_fn check = find_cfi_check(ptr);
+
+	if (likely(check))
+		check(id, ptr, diag);
+	else /* Don't allow unchecked modules */
+		handle_cfi_failure(ptr);
+}
+EXPORT_SYMBOL(cfi_slowpath_handler);
+#endif /* CONFIG_MODULES */
+
+void cfi_failure_handler(void *data, void *ptr, void *vtable)
+{
+	handle_cfi_failure(ptr);
+}
+EXPORT_SYMBOL(cfi_failure_handler);
+
+void __cfi_check_fail(void *data, void *ptr)
+{
+	handle_cfi_failure(ptr);
+}
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
index 51063e7..0a39b26 100644
--- a/kernel/cgroup/cgroup-v1.c
+++ b/kernel/cgroup/cgroup-v1.c
@@ -541,7 +541,8 @@
 	tcred = get_task_cred(task);
 	if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) &&
 	    !uid_eq(cred->euid, tcred->uid) &&
-	    !uid_eq(cred->euid, tcred->suid))
+	    !uid_eq(cred->euid, tcred->suid) &&
+	    !ns_capable(tcred->user_ns, CAP_SYS_NICE))
 		ret = -EACCES;
 	put_cred(tcred);
 	if (ret)
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 78ef274..8e91dd0 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -55,6 +55,7 @@
 #include <linux/nsproxy.h>
 #include <linux/file.h>
 #include <linux/sched/cputime.h>
+#include <linux/psi.h>
 #include <net/sock.h>
 
 #define CREATE_TRACE_POINTS
@@ -836,7 +837,7 @@
 		 */
 		WARN_ON_ONCE(task->flags & PF_EXITING);
 
-		rcu_assign_pointer(task->cgroups, to_cset);
+		cgroup_move_task(task, to_cset);
 		list_add_tail(&task->cg_list, use_mg_tasks ? &to_cset->mg_tasks :
 							     &to_cset->tasks);
 	}
@@ -3424,6 +3425,79 @@
 	return ret;
 }
 
+#ifdef CONFIG_PSI
+static int cgroup_io_pressure_show(struct seq_file *seq, void *v)
+{
+	return psi_show(seq, &seq_css(seq)->cgroup->psi, PSI_IO);
+}
+static int cgroup_memory_pressure_show(struct seq_file *seq, void *v)
+{
+	return psi_show(seq, &seq_css(seq)->cgroup->psi, PSI_MEM);
+}
+static int cgroup_cpu_pressure_show(struct seq_file *seq, void *v)
+{
+	return psi_show(seq, &seq_css(seq)->cgroup->psi, PSI_CPU);
+}
+
+static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
+					  size_t nbytes, enum psi_res res)
+{
+	struct psi_trigger *new;
+	struct cgroup *cgrp;
+
+	cgrp = cgroup_kn_lock_live(of->kn, false);
+	if (!cgrp)
+		return -ENODEV;
+
+	cgroup_get(cgrp);
+	cgroup_kn_unlock(of->kn);
+
+	new = psi_trigger_create(&cgrp->psi, buf, nbytes, res);
+	if (IS_ERR(new)) {
+		cgroup_put(cgrp);
+		return PTR_ERR(new);
+	}
+
+	psi_trigger_replace(&of->priv, new);
+
+	cgroup_put(cgrp);
+
+	return nbytes;
+}
+
+static ssize_t cgroup_io_pressure_write(struct kernfs_open_file *of,
+					  char *buf, size_t nbytes,
+					  loff_t off)
+{
+	return cgroup_pressure_write(of, buf, nbytes, PSI_IO);
+}
+
+static ssize_t cgroup_memory_pressure_write(struct kernfs_open_file *of,
+					  char *buf, size_t nbytes,
+					  loff_t off)
+{
+	return cgroup_pressure_write(of, buf, nbytes, PSI_MEM);
+}
+
+static ssize_t cgroup_cpu_pressure_write(struct kernfs_open_file *of,
+					  char *buf, size_t nbytes,
+					  loff_t off)
+{
+	return cgroup_pressure_write(of, buf, nbytes, PSI_CPU);
+}
+
+static __poll_t cgroup_pressure_poll(struct kernfs_open_file *of,
+					  poll_table *pt)
+{
+	return psi_trigger_poll(&of->priv, of->file, pt);
+}
+
+static void cgroup_pressure_release(struct kernfs_open_file *of)
+{
+	psi_trigger_replace(&of->priv, NULL);
+}
+#endif /* CONFIG_PSI */
+
 static int cgroup_file_open(struct kernfs_open_file *of)
 {
 	struct cftype *cft = of->kn->priv;
@@ -3491,6 +3565,16 @@
 	return ret ?: nbytes;
 }
 
+static __poll_t cgroup_file_poll(struct kernfs_open_file *of, poll_table *pt)
+{
+	struct cftype *cft = of->kn->priv;
+
+	if (cft->poll)
+		return cft->poll(of, pt);
+
+	return kernfs_generic_poll(of, pt);
+}
+
 static void *cgroup_seqfile_start(struct seq_file *seq, loff_t *ppos)
 {
 	return seq_cft(seq)->seq_start(seq, ppos);
@@ -3529,6 +3613,7 @@
 	.open			= cgroup_file_open,
 	.release		= cgroup_file_release,
 	.write			= cgroup_file_write,
+	.poll			= cgroup_file_poll,
 	.seq_show		= cgroup_seqfile_show,
 };
 
@@ -3537,6 +3622,7 @@
 	.open			= cgroup_file_open,
 	.release		= cgroup_file_release,
 	.write			= cgroup_file_write,
+	.poll			= cgroup_file_poll,
 	.seq_start		= cgroup_seqfile_start,
 	.seq_next		= cgroup_seqfile_next,
 	.seq_stop		= cgroup_seqfile_stop,
@@ -4592,6 +4678,32 @@
 		.flags = CFTYPE_NOT_ON_ROOT,
 		.seq_show = cpu_stat_show,
 	},
+#ifdef CONFIG_PSI
+	{
+		.name = "io.pressure",
+		.flags = CFTYPE_NOT_ON_ROOT,
+		.seq_show = cgroup_io_pressure_show,
+		.write = cgroup_io_pressure_write,
+		.poll = cgroup_pressure_poll,
+		.release = cgroup_pressure_release,
+	},
+	{
+		.name = "memory.pressure",
+		.flags = CFTYPE_NOT_ON_ROOT,
+		.seq_show = cgroup_memory_pressure_show,
+		.write = cgroup_memory_pressure_write,
+		.poll = cgroup_pressure_poll,
+		.release = cgroup_pressure_release,
+	},
+	{
+		.name = "cpu.pressure",
+		.flags = CFTYPE_NOT_ON_ROOT,
+		.seq_show = cgroup_cpu_pressure_show,
+		.write = cgroup_cpu_pressure_write,
+		.poll = cgroup_pressure_poll,
+		.release = cgroup_pressure_release,
+	},
+#endif /* CONFIG_PSI */
 	{ }	/* terminate */
 };
 
@@ -4652,6 +4764,7 @@
 			 */
 			cgroup_put(cgroup_parent(cgrp));
 			kernfs_put(cgrp->kn);
+			psi_cgroup_free(cgrp);
 			if (cgroup_on_dfl(cgrp))
 				cgroup_rstat_exit(cgrp);
 			kfree(cgrp);
@@ -4910,10 +5023,15 @@
 	cgrp->self.parent = &parent->self;
 	cgrp->root = root;
 	cgrp->level = level;
-	ret = cgroup_bpf_inherit(cgrp);
+
+	ret = psi_cgroup_alloc(cgrp);
 	if (ret)
 		goto out_idr_free;
 
+	ret = cgroup_bpf_inherit(cgrp);
+	if (ret)
+		goto out_psi_free;
+
 	spin_lock_irq(&css_set_lock);
 	for (tcgrp = cgrp; tcgrp; tcgrp = cgroup_parent(tcgrp)) {
 		cgrp->ancestor_ids[tcgrp->level] = tcgrp->id;
@@ -4953,6 +5071,8 @@
 
 	return cgrp;
 
+out_psi_free:
+	psi_cgroup_free(cgrp);
 out_idr_free:
 	cgroup_idr_remove(&root->cgroup_idr, cgrp->id);
 out_stat_exit:
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index ff956cc..d50a89c 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -103,6 +103,7 @@
 
 	/* user-configured CPUs and Memory Nodes allow to tasks */
 	cpumask_var_t cpus_allowed;
+	cpumask_var_t cpus_requested;
 	nodemask_t mems_allowed;
 
 	/* effective CPUs and Memory Nodes allow to tasks */
@@ -412,7 +413,7 @@
 
 static int is_cpuset_subset(const struct cpuset *p, const struct cpuset *q)
 {
-	return	cpumask_subset(p->cpus_allowed, q->cpus_allowed) &&
+	return	cpumask_subset(p->cpus_requested, q->cpus_requested) &&
 		nodes_subset(p->mems_allowed, q->mems_allowed) &&
 		is_cpu_exclusive(p) <= is_cpu_exclusive(q) &&
 		is_mem_exclusive(p) <= is_mem_exclusive(q);
@@ -432,14 +433,19 @@
 
 	if (!alloc_cpumask_var(&trial->cpus_allowed, GFP_KERNEL))
 		goto free_cs;
+	if (!alloc_cpumask_var(&trial->cpus_requested, GFP_KERNEL))
+		goto free_allowed;
 	if (!alloc_cpumask_var(&trial->effective_cpus, GFP_KERNEL))
 		goto free_cpus;
 
 	cpumask_copy(trial->cpus_allowed, cs->cpus_allowed);
+	cpumask_copy(trial->cpus_requested, cs->cpus_requested);
 	cpumask_copy(trial->effective_cpus, cs->effective_cpus);
 	return trial;
 
 free_cpus:
+	free_cpumask_var(trial->cpus_requested);
+free_allowed:
 	free_cpumask_var(trial->cpus_allowed);
 free_cs:
 	kfree(trial);
@@ -453,6 +459,7 @@
 static void free_trial_cpuset(struct cpuset *trial)
 {
 	free_cpumask_var(trial->effective_cpus);
+	free_cpumask_var(trial->cpus_requested);
 	free_cpumask_var(trial->cpus_allowed);
 	kfree(trial);
 }
@@ -511,7 +518,7 @@
 	cpuset_for_each_child(c, css, par) {
 		if ((is_cpu_exclusive(trial) || is_cpu_exclusive(c)) &&
 		    c != cur &&
-		    cpumask_intersects(trial->cpus_allowed, c->cpus_allowed))
+		    cpumask_intersects(trial->cpus_requested, c->cpus_requested))
 			goto out;
 		if ((is_mem_exclusive(trial) || is_mem_exclusive(c)) &&
 		    c != cur &&
@@ -964,25 +971,26 @@
 		return -EACCES;
 
 	/*
-	 * An empty cpus_allowed is ok only if the cpuset has no tasks.
+	 * An empty cpus_requested is ok only if the cpuset has no tasks.
 	 * Since cpulist_parse() fails on an empty mask, we special case
 	 * that parsing.  The validate_change() call ensures that cpusets
 	 * with tasks have cpus.
 	 */
 	if (!*buf) {
-		cpumask_clear(trialcs->cpus_allowed);
+		cpumask_clear(trialcs->cpus_requested);
 	} else {
-		retval = cpulist_parse(buf, trialcs->cpus_allowed);
+		retval = cpulist_parse(buf, trialcs->cpus_requested);
 		if (retval < 0)
 			return retval;
-
-		if (!cpumask_subset(trialcs->cpus_allowed,
-				    top_cpuset.cpus_allowed))
-			return -EINVAL;
 	}
 
+	if (!cpumask_subset(trialcs->cpus_requested, cpu_present_mask))
+		return -EINVAL;
+
+	cpumask_and(trialcs->cpus_allowed, trialcs->cpus_requested, cpu_active_mask);
+
 	/* Nothing to do if the cpus didn't change */
-	if (cpumask_equal(cs->cpus_allowed, trialcs->cpus_allowed))
+	if (cpumask_equal(cs->cpus_requested, trialcs->cpus_requested))
 		return 0;
 
 	retval = validate_change(cs, trialcs);
@@ -991,6 +999,7 @@
 
 	spin_lock_irq(&callback_lock);
 	cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed);
+	cpumask_copy(cs->cpus_requested, trialcs->cpus_requested);
 	spin_unlock_irq(&callback_lock);
 
 	/* use trialcs->cpus_allowed as a temp variable */
@@ -1759,7 +1768,7 @@
 
 	switch (type) {
 	case FILE_CPULIST:
-		seq_printf(sf, "%*pbl\n", cpumask_pr_args(cs->cpus_allowed));
+		seq_printf(sf, "%*pbl\n", cpumask_pr_args(cs->cpus_requested));
 		break;
 	case FILE_MEMLIST:
 		seq_printf(sf, "%*pbl\n", nodemask_pr_args(&cs->mems_allowed));
@@ -1949,11 +1958,14 @@
 		return ERR_PTR(-ENOMEM);
 	if (!alloc_cpumask_var(&cs->cpus_allowed, GFP_KERNEL))
 		goto free_cs;
+	if (!alloc_cpumask_var(&cs->cpus_requested, GFP_KERNEL))
+		goto free_allowed;
 	if (!alloc_cpumask_var(&cs->effective_cpus, GFP_KERNEL))
-		goto free_cpus;
+		goto free_requested;
 
 	set_bit(CS_SCHED_LOAD_BALANCE, &cs->flags);
 	cpumask_clear(cs->cpus_allowed);
+	cpumask_clear(cs->cpus_requested);
 	nodes_clear(cs->mems_allowed);
 	cpumask_clear(cs->effective_cpus);
 	nodes_clear(cs->effective_mems);
@@ -1962,7 +1974,9 @@
 
 	return &cs->css;
 
-free_cpus:
+free_requested:
+	free_cpumask_var(cs->cpus_requested);
+free_allowed:
 	free_cpumask_var(cs->cpus_allowed);
 free_cs:
 	kfree(cs);
@@ -2025,6 +2039,7 @@
 	cs->mems_allowed = parent->mems_allowed;
 	cs->effective_mems = parent->mems_allowed;
 	cpumask_copy(cs->cpus_allowed, parent->cpus_allowed);
+	cpumask_copy(cs->cpus_requested, parent->cpus_requested);
 	cpumask_copy(cs->effective_cpus, parent->cpus_allowed);
 	spin_unlock_irq(&callback_lock);
 out_unlock:
@@ -2059,6 +2074,7 @@
 
 	free_cpumask_var(cs->effective_cpus);
 	free_cpumask_var(cs->cpus_allowed);
+	free_cpumask_var(cs->cpus_requested);
 	kfree(cs);
 }
 
@@ -2121,8 +2137,10 @@
 
 	BUG_ON(!alloc_cpumask_var(&top_cpuset.cpus_allowed, GFP_KERNEL));
 	BUG_ON(!alloc_cpumask_var(&top_cpuset.effective_cpus, GFP_KERNEL));
+	BUG_ON(!alloc_cpumask_var(&top_cpuset.cpus_requested, GFP_KERNEL));
 
 	cpumask_setall(top_cpuset.cpus_allowed);
+	cpumask_setall(top_cpuset.cpus_requested);
 	nodes_setall(top_cpuset.mems_allowed);
 	cpumask_setall(top_cpuset.effective_cpus);
 	nodes_setall(top_cpuset.effective_mems);
@@ -2255,7 +2273,7 @@
 		goto retry;
 	}
 
-	cpumask_and(&new_cpus, cs->cpus_allowed, parent_cs(cs)->effective_cpus);
+	cpumask_and(&new_cpus, cs->cpus_requested, parent_cs(cs)->effective_cpus);
 	nodes_and(new_mems, cs->mems_allowed, parent_cs(cs)->effective_mems);
 
 	cpus_updated = !cpumask_equal(&new_cpus, cs->effective_cpus);
diff --git a/kernel/compat.c b/kernel/compat.c
index 8e40efc..e4548a9 100644
--- a/kernel/compat.c
+++ b/kernel/compat.c
@@ -354,10 +354,9 @@
 	bitmap_size = ALIGN(bitmap_size, BITS_PER_COMPAT_LONG);
 	nr_compat_longs = BITS_TO_COMPAT_LONGS(bitmap_size);
 
-	if (!access_ok(VERIFY_READ, umask, bitmap_size / 8))
+	if (!user_access_begin(VERIFY_READ, umask, bitmap_size / 8))
 		return -EFAULT;
 
-	user_access_begin();
 	while (nr_compat_longs > 1) {
 		compat_ulong_t l1, l2;
 		unsafe_get_user(l1, umask++, Efault);
@@ -384,10 +383,9 @@
 	bitmap_size = ALIGN(bitmap_size, BITS_PER_COMPAT_LONG);
 	nr_compat_longs = BITS_TO_COMPAT_LONGS(bitmap_size);
 
-	if (!access_ok(VERIFY_WRITE, umask, bitmap_size / 8))
+	if (!user_access_begin(VERIFY_WRITE, umask, bitmap_size / 8))
 		return -EFAULT;
 
-	user_access_begin();
 	while (nr_compat_longs > 1) {
 		unsigned long m = *mask++;
 		unsafe_put_user((compat_ulong_t)m, umask++, Efault);
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 8d6b8b5..12a46bb 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -1221,6 +1221,7 @@
 void enable_nonboot_cpus(void)
 {
 	int cpu, error;
+	struct device *cpu_device;
 
 	/* Allow everyone to use the CPU hotplug again */
 	cpu_maps_update_begin();
@@ -1238,6 +1239,12 @@
 		trace_suspend_resume(TPS("CPU_ON"), cpu, false);
 		if (!error) {
 			pr_info("CPU%d is up\n", cpu);
+			cpu_device = get_cpu_device(cpu);
+			if (!cpu_device)
+				pr_err("%s: failed to get cpu%d device\n",
+				       __func__, cpu);
+			else
+				kobject_uevent(&cpu_device->kobj, KOBJ_ONLINE);
 			continue;
 		}
 		pr_warn("Error taking CPU%d up: %d\n", cpu, error);
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index f338d23..9592420 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -2556,16 +2556,11 @@
 	}
 	kdb_printf("%02ld:%02ld\n", val.uptime/(60*60), (val.uptime/60)%60);
 
-	/* lifted from fs/proc/proc_misc.c::loadavg_read_proc() */
-
-#define LOAD_INT(x) ((x) >> FSHIFT)
-#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
 	kdb_printf("load avg   %ld.%02ld %ld.%02ld %ld.%02ld\n",
 		LOAD_INT(val.loads[0]), LOAD_FRAC(val.loads[0]),
 		LOAD_INT(val.loads[1]), LOAD_FRAC(val.loads[1]),
 		LOAD_INT(val.loads[2]), LOAD_FRAC(val.loads[2]));
-#undef LOAD_INT
-#undef LOAD_FRAC
+
 	/* Display in kilobytes */
 #define K(x) ((x) << (PAGE_SHIFT - 10))
 	kdb_printf("\nMemTotal:       %8lu kB\nMemFree:        %8lu kB\n"
diff --git a/kernel/delayacct.c b/kernel/delayacct.c
index ca8ac28..2a12b98 100644
--- a/kernel/delayacct.c
+++ b/kernel/delayacct.c
@@ -135,9 +135,12 @@
 	d->swapin_delay_total = (tmp < d->swapin_delay_total) ? 0 : tmp;
 	tmp = d->freepages_delay_total + tsk->delays->freepages_delay;
 	d->freepages_delay_total = (tmp < d->freepages_delay_total) ? 0 : tmp;
+	tmp = d->thrashing_delay_total + tsk->delays->thrashing_delay;
+	d->thrashing_delay_total = (tmp < d->thrashing_delay_total) ? 0 : tmp;
 	d->blkio_count += tsk->delays->blkio_count;
 	d->swapin_count += tsk->delays->swapin_count;
 	d->freepages_count += tsk->delays->freepages_count;
+	d->thrashing_count += tsk->delays->thrashing_count;
 	raw_spin_unlock_irqrestore(&tsk->delays->lock, flags);
 
 	return 0;
@@ -169,3 +172,15 @@
 		&current->delays->freepages_count);
 }
 
+void __delayacct_thrashing_start(void)
+{
+	current->delays->thrashing_start = ktime_get_ns();
+}
+
+void __delayacct_thrashing_end(void)
+{
+	delayacct_end(&current->delays->lock,
+		      &current->delays->thrashing_start,
+		      &current->delays->thrashing_delay,
+		      &current->delays->thrashing_count);
+}
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 460d5fd..69e6c77 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -397,8 +397,13 @@
  *   0 - disallow raw tracepoint access for unpriv
  *   1 - disallow cpu events for unpriv
  *   2 - disallow kernel profiling for unpriv
+ *   3 - disallow all unpriv perf event use
  */
+#ifdef CONFIG_SECURITY_PERF_EVENTS_RESTRICT
+int sysctl_perf_event_paranoid __read_mostly = 3;
+#else
 int sysctl_perf_event_paranoid __read_mostly = 2;
+#endif
 
 /* Minimum for 512 kiB + 1 user control page */
 int sysctl_perf_event_mlock __read_mostly = 512 + (PAGE_SIZE / 1024); /* 'free' kiB per user */
@@ -1254,6 +1259,7 @@
  *	      perf_event_context::lock
  *	    perf_event::mmap_mutex
  *	    mmap_sem
+ *	      perf_addr_filters_head::lock
  *
  *    cpu_hotplug_lock
  *      pmus_lock
@@ -2803,7 +2809,7 @@
  *
  * (p1) when userspace mappings change as a result of (1) or (2) or (3) below,
  *      we update the addresses of corresponding vmas in
- *	event::addr_filters_offs array and bump the event::addr_filters_gen;
+ *	event::addr_filter_ranges array and bump the event::addr_filters_gen;
  * (p2) when an event is scheduled in (pmu::add), it calls
  *      perf_event_addr_filters_sync() which calls pmu::addr_filters_sync()
  *      if the generation has changed since the previous call.
@@ -4447,7 +4453,7 @@
 
 	perf_event_free_bpf_prog(event);
 	perf_addr_filters_splice(event, NULL);
-	kfree(event->addr_filters_offs);
+	kfree(event->addr_filter_ranges);
 
 	if (event->destroy)
 		event->destroy(event);
@@ -6742,7 +6748,8 @@
 	raw_spin_lock_irqsave(&ifh->lock, flags);
 	list_for_each_entry(filter, &ifh->list, entry) {
 		if (filter->path.dentry) {
-			event->addr_filters_offs[count] = 0;
+			event->addr_filter_ranges[count].start = 0;
+			event->addr_filter_ranges[count].size = 0;
 			restart++;
 		}
 
@@ -7424,28 +7431,47 @@
 	return true;
 }
 
+static bool perf_addr_filter_vma_adjust(struct perf_addr_filter *filter,
+					struct vm_area_struct *vma,
+					struct perf_addr_filter_range *fr)
+{
+	unsigned long vma_size = vma->vm_end - vma->vm_start;
+	unsigned long off = vma->vm_pgoff << PAGE_SHIFT;
+	struct file *file = vma->vm_file;
+
+	if (!perf_addr_filter_match(filter, file, off, vma_size))
+		return false;
+
+	if (filter->offset < off) {
+		fr->start = vma->vm_start;
+		fr->size = min(vma_size, filter->size - (off - filter->offset));
+	} else {
+		fr->start = vma->vm_start + filter->offset - off;
+		fr->size = min(vma->vm_end - fr->start, filter->size);
+	}
+
+	return true;
+}
+
 static void __perf_addr_filters_adjust(struct perf_event *event, void *data)
 {
 	struct perf_addr_filters_head *ifh = perf_event_addr_filters(event);
 	struct vm_area_struct *vma = data;
-	unsigned long off = vma->vm_pgoff << PAGE_SHIFT, flags;
-	struct file *file = vma->vm_file;
 	struct perf_addr_filter *filter;
 	unsigned int restart = 0, count = 0;
+	unsigned long flags;
 
 	if (!has_addr_filter(event))
 		return;
 
-	if (!file)
+	if (!vma->vm_file)
 		return;
 
 	raw_spin_lock_irqsave(&ifh->lock, flags);
 	list_for_each_entry(filter, &ifh->list, entry) {
-		if (perf_addr_filter_match(filter, file, off,
-					     vma->vm_end - vma->vm_start)) {
-			event->addr_filters_offs[count] = vma->vm_start;
+		if (perf_addr_filter_vma_adjust(filter, vma,
+						&event->addr_filter_ranges[count]))
 			restart++;
-		}
 
 		count++;
 	}
@@ -8805,26 +8831,19 @@
  * @filter; if so, adjust filter's address range.
  * Called with mm::mmap_sem down for reading.
  */
-static unsigned long perf_addr_filter_apply(struct perf_addr_filter *filter,
-					    struct mm_struct *mm)
+static void perf_addr_filter_apply(struct perf_addr_filter *filter,
+				   struct mm_struct *mm,
+				   struct perf_addr_filter_range *fr)
 {
 	struct vm_area_struct *vma;
 
 	for (vma = mm->mmap; vma; vma = vma->vm_next) {
-		struct file *file = vma->vm_file;
-		unsigned long off = vma->vm_pgoff << PAGE_SHIFT;
-		unsigned long vma_size = vma->vm_end - vma->vm_start;
-
-		if (!file)
+		if (!vma->vm_file)
 			continue;
 
-		if (!perf_addr_filter_match(filter, file, off, vma_size))
-			continue;
-
-		return vma->vm_start;
+		if (perf_addr_filter_vma_adjust(filter, vma, fr))
+			return;
 	}
-
-	return 0;
 }
 
 /*
@@ -8847,26 +8866,29 @@
 	if (task == TASK_TOMBSTONE)
 		return;
 
-	if (!ifh->nr_file_filters)
-		return;
+	if (ifh->nr_file_filters) {
+		mm = get_task_mm(event->ctx->task);
+		if (!mm)
+			goto restart;
 
-	mm = get_task_mm(event->ctx->task);
-	if (!mm)
-		goto restart;
-
-	down_read(&mm->mmap_sem);
+		down_read(&mm->mmap_sem);
+	}
 
 	raw_spin_lock_irqsave(&ifh->lock, flags);
 	list_for_each_entry(filter, &ifh->list, entry) {
-		event->addr_filters_offs[count] = 0;
+		if (filter->path.dentry) {
+			/*
+			 * Adjust base offset if the filter is associated to a
+			 * binary that needs to be mapped:
+			 */
+			event->addr_filter_ranges[count].start = 0;
+			event->addr_filter_ranges[count].size = 0;
 
-		/*
-		 * Adjust base offset if the filter is associated to a binary
-		 * that needs to be mapped:
-		 */
-		if (filter->path.dentry)
-			event->addr_filters_offs[count] =
-				perf_addr_filter_apply(filter, mm);
+			perf_addr_filter_apply(filter, mm, &event->addr_filter_ranges[count]);
+		} else {
+			event->addr_filter_ranges[count].start = filter->offset;
+			event->addr_filter_ranges[count].size  = filter->size;
+		}
 
 		count++;
 	}
@@ -8874,9 +8896,11 @@
 	event->addr_filters_gen++;
 	raw_spin_unlock_irqrestore(&ifh->lock, flags);
 
-	up_read(&mm->mmap_sem);
+	if (ifh->nr_file_filters) {
+		up_read(&mm->mmap_sem);
 
-	mmput(mm);
+		mmput(mm);
+	}
 
 restart:
 	perf_event_stop(event, 1);
@@ -10128,14 +10152,28 @@
 		goto err_pmu;
 
 	if (has_addr_filter(event)) {
-		event->addr_filters_offs = kcalloc(pmu->nr_addr_filters,
-						   sizeof(unsigned long),
-						   GFP_KERNEL);
-		if (!event->addr_filters_offs) {
+		event->addr_filter_ranges = kcalloc(pmu->nr_addr_filters,
+						    sizeof(struct perf_addr_filter_range),
+						    GFP_KERNEL);
+		if (!event->addr_filter_ranges) {
 			err = -ENOMEM;
 			goto err_per_task;
 		}
 
+		/*
+		 * Clone the parent's vma offsets: they are valid until exec()
+		 * even if the mm is not shared with the parent.
+		 */
+		if (event->parent) {
+			struct perf_addr_filters_head *ifh = perf_event_addr_filters(event);
+
+			raw_spin_lock_irq(&ifh->lock);
+			memcpy(event->addr_filter_ranges,
+			       event->parent->addr_filter_ranges,
+			       pmu->nr_addr_filters * sizeof(struct perf_addr_filter_range));
+			raw_spin_unlock_irq(&ifh->lock);
+		}
+
 		/* force hw sync on the address filters */
 		event->addr_filters_gen = 1;
 	}
@@ -10154,7 +10192,7 @@
 	return event;
 
 err_addr_filters:
-	kfree(event->addr_filters_offs);
+	kfree(event->addr_filter_ranges);
 
 err_per_task:
 	exclusive_event_destroy(event);
@@ -10485,6 +10523,9 @@
 	if (flags & ~PERF_FLAG_ALL)
 		return -EINVAL;
 
+	if (perf_paranoid_any() && !capable(CAP_SYS_ADMIN))
+		return -EACCES;
+
 	err = perf_copy_attr(attr_uptr, &attr);
 	if (err)
 		return err;
diff --git a/kernel/exit.c b/kernel/exit.c
index e10de98..213ba45 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -719,6 +719,7 @@
 	if (group_dead)
 		kill_orphaned_pgrp(tsk->group_leader, NULL);
 
+	tsk->exit_state = EXIT_ZOMBIE;
 	if (unlikely(tsk->ptrace)) {
 		int sig = thread_group_leader(tsk) &&
 				thread_group_empty(tsk) &&
@@ -1613,10 +1614,9 @@
 	if (!infop)
 		return err;
 
-	if (!access_ok(VERIFY_WRITE, infop, sizeof(*infop)))
+	if (!user_access_begin(VERIFY_WRITE, infop, sizeof(*infop)))
 		return -EFAULT;
 
-	user_access_begin();
 	unsafe_put_user(signo, &infop->si_signo, Efault);
 	unsafe_put_user(0, &infop->si_errno, Efault);
 	unsafe_put_user(info.cause, &infop->si_code, Efault);
@@ -1741,10 +1741,9 @@
 	if (!infop)
 		return err;
 
-	if (!access_ok(VERIFY_WRITE, infop, sizeof(*infop)))
+	if (!user_access_begin(VERIFY_WRITE, infop, sizeof(*infop)))
 		return -EFAULT;
 
-	user_access_begin();
 	unsafe_put_user(signo, &infop->si_signo, Efault);
 	unsafe_put_user(0, &infop->si_errno, Efault);
 	unsafe_put_user(info.cause, &infop->si_code, Efault);
diff --git a/kernel/fork.c b/kernel/fork.c
index 8cb5cd7..f6ba9ba 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -11,6 +11,7 @@
  * management can be a bitch. See 'mm/memory.c': 'copy_page_range()'
  */
 
+#include <linux/anon_inodes.h>
 #include <linux/slab.h>
 #include <linux/sched/autogroup.h>
 #include <linux/sched/mm.h>
@@ -21,6 +22,7 @@
 #include <linux/sched/task.h>
 #include <linux/sched/task_stack.h>
 #include <linux/sched/cputime.h>
+#include <linux/seq_file.h>
 #include <linux/rtmutex.h>
 #include <linux/init.h>
 #include <linux/unistd.h>
@@ -91,6 +93,8 @@
 #include <linux/kcov.h>
 #include <linux/livepatch.h>
 #include <linux/thread_info.h>
+#include <linux/cpufreq_times.h>
+#include <linux/scs.h>
 
 #include <asm/pgtable.h>
 #include <asm/pgalloc.h>
@@ -389,6 +393,9 @@
 
 void free_task(struct task_struct *tsk)
 {
+	cpufreq_task_times_exit(tsk);
+	scs_release(tsk);
+
 #ifndef CONFIG_THREAD_INFO_IN_TASK
 	/*
 	 * The task is finally done with both the stack and thread_info,
@@ -767,6 +774,8 @@
 			  NULL, free_vm_stack_cache);
 #endif
 
+	scs_init();
+
 	lockdep_init_task(&init_task);
 }
 
@@ -822,6 +831,10 @@
 	if (err)
 		goto free_stack;
 
+	err = scs_prepare(tsk, node);
+	if (err)
+		goto free_stack;
+
 #ifdef CONFIG_SECCOMP
 	/*
 	 * We must handle setting up seccomp filters once we're under
@@ -1637,6 +1650,84 @@
 		free_task(tsk);
 }
 
+static int pidfd_release(struct inode *inode, struct file *file)
+{
+	struct pid *pid = file->private_data;
+
+	file->private_data = NULL;
+	put_pid(pid);
+	return 0;
+}
+
+#ifdef CONFIG_PROC_FS
+static void pidfd_show_fdinfo(struct seq_file *m, struct file *f)
+{
+	struct pid_namespace *ns = proc_pid_ns(file_inode(m->file));
+	struct pid *pid = f->private_data;
+
+	seq_put_decimal_ull(m, "Pid:\t", pid_nr_ns(pid, ns));
+	seq_putc(m, '\n');
+}
+#endif
+
+/*
+ * Poll support for process exit notification.
+ */
+static unsigned int pidfd_poll(struct file *file, struct poll_table_struct *pts)
+{
+	struct task_struct *task;
+	struct pid *pid = file->private_data;
+	int poll_flags = 0;
+
+	poll_wait(file, &pid->wait_pidfd, pts);
+
+	rcu_read_lock();
+	task = pid_task(pid, PIDTYPE_PID);
+	/*
+	 * Inform pollers only when the whole thread group exits.
+	 * If the thread group leader exits before all other threads in the
+	 * group, then poll(2) should block, similar to the wait(2) family.
+	 */
+	if (!task || (task->exit_state && thread_group_empty(task)))
+		poll_flags = POLLIN | POLLRDNORM;
+	rcu_read_unlock();
+
+	return poll_flags;
+}
+
+const struct file_operations pidfd_fops = {
+	.release = pidfd_release,
+	.poll = pidfd_poll,
+#ifdef CONFIG_PROC_FS
+	.show_fdinfo = pidfd_show_fdinfo,
+#endif
+};
+
+/**
+ * pidfd_create() - Create a new pid file descriptor.
+ *
+ * @pid:  struct pid that the pidfd will reference
+ *
+ * This creates a new pid file descriptor with the O_CLOEXEC flag set.
+ *
+ * Note, that this function can only be called after the fd table has
+ * been unshared to avoid leaking the pidfd to the new process.
+ *
+ * Return: On success, a cloexec pidfd is returned.
+ *         On error, a negative errno number will be returned.
+ */
+static int pidfd_create(struct pid *pid)
+{
+	int fd;
+
+	fd = anon_inode_getfd("[pidfd]", &pidfd_fops, get_pid(pid),
+			      O_RDWR | O_CLOEXEC);
+	if (fd < 0)
+		put_pid(pid);
+
+	return fd;
+}
+
 /*
  * This creates a new process as a copy of the old one,
  * but does not actually start it yet.
@@ -1649,13 +1740,14 @@
 					unsigned long clone_flags,
 					unsigned long stack_start,
 					unsigned long stack_size,
+					int __user *parent_tidptr,
 					int __user *child_tidptr,
 					struct pid *pid,
 					int trace,
 					unsigned long tls,
 					int node)
 {
-	int retval;
+	int pidfd = -1, retval;
 	struct task_struct *p;
 	struct multiprocess_signals delayed;
 
@@ -1705,6 +1797,31 @@
 			return ERR_PTR(-EINVAL);
 	}
 
+	if (clone_flags & CLONE_PIDFD) {
+		int reserved;
+
+		/*
+		 * - CLONE_PARENT_SETTID is useless for pidfds and also
+		 *   parent_tidptr is used to return pidfds.
+		 * - CLONE_DETACHED is blocked so that we can potentially
+		 *   reuse it later for CLONE_PIDFD.
+		 * - CLONE_THREAD is blocked until someone really needs it.
+		 */
+		if (clone_flags &
+		    (CLONE_DETACHED | CLONE_PARENT_SETTID | CLONE_THREAD))
+			return ERR_PTR(-EINVAL);
+
+		/*
+		 * Verify that parent_tidptr is sane so we can potentially
+		 * reuse it later.
+		 */
+		if (get_user(reserved, parent_tidptr))
+			return ERR_PTR(-EFAULT);
+
+		if (reserved != 0)
+			return ERR_PTR(-EINVAL);
+	}
+
 	/*
 	 * Force any signals received before this point to be delivered
 	 * before the fork happens.  Collect up signals sent to multiple
@@ -1728,6 +1845,8 @@
 	if (!p)
 		goto fork_out;
 
+	cpufreq_task_times_init(p);
+
 	/*
 	 * This _must_ happen before we call free_task(), i.e. before we jump
 	 * to any of the bad_fork_* labels. This is to avoid freeing
@@ -1799,6 +1918,10 @@
 
 	p->default_timer_slack_ns = current->timer_slack_ns;
 
+#ifdef CONFIG_PSI
+	p->psi_flags = 0;
+#endif
+
 	task_io_accounting_init(&p->ioac);
 	acct_clear_integrals(p);
 
@@ -1905,6 +2028,22 @@
 		}
 	}
 
+	/*
+	 * This has to happen after we've potentially unshared the file
+	 * descriptor table (so that the pidfd doesn't leak into the child
+	 * if the fd table isn't shared).
+	 */
+	if (clone_flags & CLONE_PIDFD) {
+		retval = pidfd_create(pid);
+		if (retval < 0)
+			goto bad_fork_free_pid;
+
+		pidfd = retval;
+		retval = put_user(pidfd, parent_tidptr);
+		if (retval)
+			goto bad_fork_put_pidfd;
+	}
+
 #ifdef CONFIG_BLOCK
 	p->plug = NULL;
 #endif
@@ -1965,7 +2104,7 @@
 	 */
 	retval = cgroup_can_fork(p);
 	if (retval)
-		goto bad_fork_free_pid;
+		goto bad_fork_cgroup_threadgroup_change_end;
 
 	/*
 	 * From this point on we must avoid any synchronous user-space
@@ -2080,8 +2219,12 @@
 	spin_unlock(&current->sighand->siglock);
 	write_unlock_irq(&tasklist_lock);
 	cgroup_cancel_fork(p);
-bad_fork_free_pid:
+bad_fork_cgroup_threadgroup_change_end:
 	cgroup_threadgroup_change_end(current);
+bad_fork_put_pidfd:
+	if (clone_flags & CLONE_PIDFD)
+		ksys_close(pidfd);
+bad_fork_free_pid:
 	if (pid != &init_struct_pid)
 		free_pid(pid);
 bad_fork_cleanup_thread:
@@ -2147,7 +2290,7 @@
 struct task_struct *fork_idle(int cpu)
 {
 	struct task_struct *task;
-	task = copy_process(CLONE_VM, 0, 0, NULL, &init_struct_pid, 0, 0,
+	task = copy_process(CLONE_VM, 0, 0, NULL, NULL, &init_struct_pid, 0, 0,
 			    cpu_to_node(cpu));
 	if (!IS_ERR(task)) {
 		init_idle_pids(task);
@@ -2194,13 +2337,15 @@
 			trace = 0;
 	}
 
-	p = copy_process(clone_flags, stack_start, stack_size,
+	p = copy_process(clone_flags, stack_start, stack_size, parent_tidptr,
 			 child_tidptr, NULL, trace, tls, NUMA_NO_NODE);
 	add_latent_entropy();
 
 	if (IS_ERR(p))
 		return PTR_ERR(p);
 
+	cpufreq_task_times_alloc(p);
+
 	/*
 	 * Do this prior waking up the new thread - the thread pointer
 	 * might get invalid after that point, if the thread exits quickly.
diff --git a/kernel/gcov/Kconfig b/kernel/gcov/Kconfig
index 1e3823f..f71c1ad 100644
--- a/kernel/gcov/Kconfig
+++ b/kernel/gcov/Kconfig
@@ -53,6 +53,7 @@
 choice
 	prompt "Specify GCOV format"
 	depends on GCOV_KERNEL
+	depends on CC_IS_GCC
 	---help---
 	The gcov format is usually determined by the GCC version, and the
 	default is chosen according to your GCC version. However, there are
@@ -62,7 +63,7 @@
 
 config GCOV_FORMAT_3_4
 	bool "GCC 3.4 format"
-	depends on CC_IS_GCC && GCC_VERSION < 40700
+	depends on GCC_VERSION < 40700
 	---help---
 	Select this option to use the format defined by GCC 3.4.
 
diff --git a/kernel/gcov/Makefile b/kernel/gcov/Makefile
index ff06d64..d66a74b 100644
--- a/kernel/gcov/Makefile
+++ b/kernel/gcov/Makefile
@@ -2,5 +2,6 @@
 ccflags-y := -DSRCTREE='"$(srctree)"' -DOBJTREE='"$(objtree)"'
 
 obj-y := base.o fs.o
-obj-$(CONFIG_GCOV_FORMAT_3_4) += gcc_3_4.o
-obj-$(CONFIG_GCOV_FORMAT_4_7) += gcc_4_7.o
+obj-$(CONFIG_GCOV_FORMAT_3_4) += gcc_base.o gcc_3_4.o
+obj-$(CONFIG_GCOV_FORMAT_4_7) += gcc_base.o gcc_4_7.o
+obj-$(CONFIG_CC_IS_CLANG) += clang.o
diff --git a/kernel/gcov/base.c b/kernel/gcov/base.c
index 9c7c8d5..0ffe9f1 100644
--- a/kernel/gcov/base.c
+++ b/kernel/gcov/base.c
@@ -22,88 +22,8 @@
 #include <linux/sched.h>
 #include "gcov.h"
 
-static int gcov_events_enabled;
-static DEFINE_MUTEX(gcov_lock);
-
-/*
- * __gcov_init is called by gcc-generated constructor code for each object
- * file compiled with -fprofile-arcs.
- */
-void __gcov_init(struct gcov_info *info)
-{
-	static unsigned int gcov_version;
-
-	mutex_lock(&gcov_lock);
-	if (gcov_version == 0) {
-		gcov_version = gcov_info_version(info);
-		/*
-		 * Printing gcc's version magic may prove useful for debugging
-		 * incompatibility reports.
-		 */
-		pr_info("version magic: 0x%x\n", gcov_version);
-	}
-	/*
-	 * Add new profiling data structure to list and inform event
-	 * listener.
-	 */
-	gcov_info_link(info);
-	if (gcov_events_enabled)
-		gcov_event(GCOV_ADD, info);
-	mutex_unlock(&gcov_lock);
-}
-EXPORT_SYMBOL(__gcov_init);
-
-/*
- * These functions may be referenced by gcc-generated profiling code but serve
- * no function for kernel profiling.
- */
-void __gcov_flush(void)
-{
-	/* Unused. */
-}
-EXPORT_SYMBOL(__gcov_flush);
-
-void __gcov_merge_add(gcov_type *counters, unsigned int n_counters)
-{
-	/* Unused. */
-}
-EXPORT_SYMBOL(__gcov_merge_add);
-
-void __gcov_merge_single(gcov_type *counters, unsigned int n_counters)
-{
-	/* Unused. */
-}
-EXPORT_SYMBOL(__gcov_merge_single);
-
-void __gcov_merge_delta(gcov_type *counters, unsigned int n_counters)
-{
-	/* Unused. */
-}
-EXPORT_SYMBOL(__gcov_merge_delta);
-
-void __gcov_merge_ior(gcov_type *counters, unsigned int n_counters)
-{
-	/* Unused. */
-}
-EXPORT_SYMBOL(__gcov_merge_ior);
-
-void __gcov_merge_time_profile(gcov_type *counters, unsigned int n_counters)
-{
-	/* Unused. */
-}
-EXPORT_SYMBOL(__gcov_merge_time_profile);
-
-void __gcov_merge_icall_topn(gcov_type *counters, unsigned int n_counters)
-{
-	/* Unused. */
-}
-EXPORT_SYMBOL(__gcov_merge_icall_topn);
-
-void __gcov_exit(void)
-{
-	/* Unused. */
-}
-EXPORT_SYMBOL(__gcov_exit);
+int gcov_events_enabled;
+DEFINE_MUTEX(gcov_lock);
 
 /**
  * gcov_enable_events - enable event reporting through gcov_event()
@@ -144,7 +64,7 @@
 
 	/* Remove entries located in module from linked list. */
 	while ((info = gcov_info_next(info))) {
-		if (within_module((unsigned long)info, mod)) {
+		if (gcov_info_within_module(info, mod)) {
 			gcov_info_unlink(prev, info);
 			if (gcov_events_enabled)
 				gcov_event(GCOV_REMOVE, info);
diff --git a/kernel/gcov/clang.c b/kernel/gcov/clang.c
new file mode 100644
index 0000000..c94b820
--- /dev/null
+++ b/kernel/gcov/clang.c
@@ -0,0 +1,581 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Google, Inc.
+ * modified from kernel/gcov/gcc_4_7.c
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ *
+ *
+ * LLVM uses profiling data that's deliberately similar to GCC, but has a
+ * very different way of exporting that data.  LLVM calls llvm_gcov_init() once
+ * per module, and provides a couple of callbacks that we can use to ask for
+ * more data.
+ *
+ * We care about the "writeout" callback, which in turn calls back into
+ * compiler-rt/this module to dump all the gathered coverage data to disk:
+ *
+ *    llvm_gcda_start_file()
+ *      llvm_gcda_emit_function()
+ *      llvm_gcda_emit_arcs()
+ *      llvm_gcda_emit_function()
+ *      llvm_gcda_emit_arcs()
+ *      [... repeats for each function ...]
+ *    llvm_gcda_summary_info()
+ *    llvm_gcda_end_file()
+ *
+ * This design is much more stateless and unstructured than gcc's, and is
+ * intended to run at process exit.  This forces us to keep some local state
+ * about which module we're dealing with at the moment.  On the other hand, it
+ * also means we don't depend as much on how LLVM represents profiling data
+ * internally.
+ *
+ * See LLVM's lib/Transforms/Instrumentation/GCOVProfiling.cpp for more
+ * details on how this works, particularly GCOVProfiler::emitProfileArcs(),
+ * GCOVProfiler::insertCounterWriteout(), and
+ * GCOVProfiler::insertFlush().
+ */
+
+#define pr_fmt(fmt)	"gcov: " fmt
+
+#include <linux/kernel.h>
+#include <linux/list.h>
+#include <linux/printk.h>
+#include <linux/ratelimit.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include "gcov.h"
+
+typedef void (*llvm_gcov_callback)(void);
+
+struct gcov_info {
+	struct list_head head;
+
+	const char *filename;
+	unsigned int version;
+	u32 checksum;
+
+	struct list_head functions;
+};
+
+struct gcov_fn_info {
+	struct list_head head;
+
+	u32 ident;
+	u32 checksum;
+	u8 use_extra_checksum;
+	u32 cfg_checksum;
+
+	u32 num_counters;
+	u64 *counters;
+	const char *function_name;
+};
+
+static struct gcov_info *current_info;
+
+static LIST_HEAD(clang_gcov_list);
+
+void llvm_gcov_init(llvm_gcov_callback writeout, llvm_gcov_callback flush)
+{
+	struct gcov_info *info = kzalloc(sizeof(*info), GFP_KERNEL);
+
+	if (!info)
+		return;
+
+	INIT_LIST_HEAD(&info->head);
+	INIT_LIST_HEAD(&info->functions);
+
+	mutex_lock(&gcov_lock);
+
+	list_add_tail(&info->head, &clang_gcov_list);
+	current_info = info;
+	writeout();
+	current_info = NULL;
+	if (gcov_events_enabled)
+		gcov_event(GCOV_ADD, info);
+
+	mutex_unlock(&gcov_lock);
+}
+EXPORT_SYMBOL(llvm_gcov_init);
+
+void llvm_gcda_start_file(const char *orig_filename, const char version[4],
+		u32 checksum)
+{
+	current_info->filename = orig_filename;
+	memcpy(&current_info->version, version, sizeof(current_info->version));
+	current_info->checksum = checksum;
+}
+EXPORT_SYMBOL(llvm_gcda_start_file);
+
+void llvm_gcda_emit_function(u32 ident, const char *function_name,
+		u32 func_checksum, u8 use_extra_checksum, u32 cfg_checksum)
+{
+	struct gcov_fn_info *info = kzalloc(sizeof(*info), GFP_KERNEL);
+
+	if (!info)
+		return;
+
+	INIT_LIST_HEAD(&info->head);
+	info->ident = ident;
+	info->checksum = func_checksum;
+	info->use_extra_checksum = use_extra_checksum;
+	info->cfg_checksum = cfg_checksum;
+	if (function_name)
+		info->function_name = kstrdup(function_name, GFP_KERNEL);
+
+	list_add_tail(&info->head, &current_info->functions);
+}
+EXPORT_SYMBOL(llvm_gcda_emit_function);
+
+void llvm_gcda_emit_arcs(u32 num_counters, u64 *counters)
+{
+	struct gcov_fn_info *info = list_last_entry(&current_info->functions,
+			struct gcov_fn_info, head);
+
+	info->num_counters = num_counters;
+	info->counters = counters;
+}
+EXPORT_SYMBOL(llvm_gcda_emit_arcs);
+
+void llvm_gcda_summary_info(void)
+{
+}
+EXPORT_SYMBOL(llvm_gcda_summary_info);
+
+void llvm_gcda_end_file(void)
+{
+}
+EXPORT_SYMBOL(llvm_gcda_end_file);
+
+/**
+ * gcov_info_filename - return info filename
+ * @info: profiling data set
+ */
+const char *gcov_info_filename(struct gcov_info *info)
+{
+	return info->filename;
+}
+
+/**
+ * gcov_info_version - return info version
+ * @info: profiling data set
+ */
+unsigned int gcov_info_version(struct gcov_info *info)
+{
+	return info->version;
+}
+
+/**
+ * gcov_info_next - return next profiling data set
+ * @info: profiling data set
+ *
+ * Returns next gcov_info following @info or first gcov_info in the chain if
+ * @info is %NULL.
+ */
+struct gcov_info *gcov_info_next(struct gcov_info *info)
+{
+	if (!info)
+		return list_first_entry_or_null(&clang_gcov_list,
+				struct gcov_info, head);
+	if (list_is_last(&info->head, &clang_gcov_list))
+		return NULL;
+	return list_next_entry(info, head);
+}
+
+/**
+ * gcov_info_link - link/add profiling data set to the list
+ * @info: profiling data set
+ */
+void gcov_info_link(struct gcov_info *info)
+{
+	list_add_tail(&info->head, &clang_gcov_list);
+}
+
+/**
+ * gcov_info_unlink - unlink/remove profiling data set from the list
+ * @prev: previous profiling data set
+ * @info: profiling data set
+ */
+void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info)
+{
+	/* Generic code unlinks while iterating. */
+	__list_del_entry(&info->head);
+}
+
+/**
+ * gcov_info_within_module - check if a profiling data set belongs to a module
+ * @info: profiling data set
+ * @mod: module
+ *
+ * Returns true if profiling data belongs module, false otherwise.
+ */
+bool gcov_info_within_module(struct gcov_info *info, struct module *mod)
+{
+	return within_module((unsigned long)info->filename, mod);
+}
+
+/* Symbolic links to be created for each profiling data file. */
+const struct gcov_link gcov_link[] = {
+	{ OBJ_TREE, "gcno" },	/* Link to .gcno file in $(objtree). */
+	{ 0, NULL},
+};
+
+/**
+ * gcov_info_reset - reset profiling data to zero
+ * @info: profiling data set
+ */
+void gcov_info_reset(struct gcov_info *info)
+{
+	struct gcov_fn_info *fn;
+
+	list_for_each_entry(fn, &info->functions, head)
+		memset(fn->counters, 0,
+				sizeof(fn->counters[0]) * fn->num_counters);
+}
+
+/**
+ * gcov_info_is_compatible - check if profiling data can be added
+ * @info1: first profiling data set
+ * @info2: second profiling data set
+ *
+ * Returns non-zero if profiling data can be added, zero otherwise.
+ */
+int gcov_info_is_compatible(struct gcov_info *info1, struct gcov_info *info2)
+{
+	struct gcov_fn_info *fn_ptr1 = list_first_entry_or_null(
+			&info1->functions, struct gcov_fn_info, head);
+	struct gcov_fn_info *fn_ptr2 = list_first_entry_or_null(
+			&info2->functions, struct gcov_fn_info, head);
+
+	if (info1->checksum != info2->checksum)
+		return false;
+	if (!fn_ptr1)
+		return fn_ptr1 == fn_ptr2;
+	while (!list_is_last(&fn_ptr1->head, &info1->functions) &&
+		!list_is_last(&fn_ptr2->head, &info2->functions)) {
+		if (fn_ptr1->checksum != fn_ptr2->checksum)
+			return false;
+		if (fn_ptr1->use_extra_checksum != fn_ptr2->use_extra_checksum)
+			return false;
+		if (fn_ptr1->use_extra_checksum &&
+			fn_ptr1->cfg_checksum != fn_ptr2->cfg_checksum)
+			return false;
+		fn_ptr1 = list_next_entry(fn_ptr1, head);
+		fn_ptr2 = list_next_entry(fn_ptr2, head);
+	}
+	return list_is_last(&fn_ptr1->head, &info1->functions) &&
+		list_is_last(&fn_ptr2->head, &info2->functions);
+}
+
+/**
+ * gcov_info_add - add up profiling data
+ * @dest: profiling data set to which data is added
+ * @source: profiling data set which is added
+ *
+ * Adds profiling counts of @source to @dest.
+ */
+void gcov_info_add(struct gcov_info *dst, struct gcov_info *src)
+{
+	struct gcov_fn_info *dfn_ptr;
+	struct gcov_fn_info *sfn_ptr = list_first_entry_or_null(&src->functions,
+			struct gcov_fn_info, head);
+
+	list_for_each_entry(dfn_ptr, &dst->functions, head) {
+		u32 i;
+
+		for (i = 0; i < sfn_ptr->num_counters; i++)
+			dfn_ptr->counters[i] += sfn_ptr->counters[i];
+	}
+}
+
+static struct gcov_fn_info *gcov_fn_info_dup(struct gcov_fn_info *fn)
+{
+	size_t cv_size; /* counter values size */
+	struct gcov_fn_info *fn_dup = kmemdup(fn, sizeof(*fn),
+			GFP_KERNEL);
+	if (!fn_dup)
+		return NULL;
+	INIT_LIST_HEAD(&fn_dup->head);
+
+	fn_dup->function_name = kstrdup(fn->function_name, GFP_KERNEL);
+	if (!fn_dup->function_name)
+		goto err_name;
+
+	cv_size = fn->num_counters * sizeof(fn->counters[0]);
+	fn_dup->counters = vmalloc(cv_size);
+	if (!fn_dup->counters)
+		goto err_counters;
+	memcpy(fn_dup->counters, fn->counters, cv_size);
+
+	return fn_dup;
+
+err_counters:
+	kfree(fn_dup->function_name);
+err_name:
+	kfree(fn_dup);
+	return NULL;
+}
+
+/**
+ * gcov_info_dup - duplicate profiling data set
+ * @info: profiling data set to duplicate
+ *
+ * Return newly allocated duplicate on success, %NULL on error.
+ */
+struct gcov_info *gcov_info_dup(struct gcov_info *info)
+{
+	struct gcov_info *dup;
+	struct gcov_fn_info *fn;
+
+	dup = kmemdup(info, sizeof(*dup), GFP_KERNEL);
+	if (!dup)
+		return NULL;
+	INIT_LIST_HEAD(&dup->head);
+	INIT_LIST_HEAD(&dup->functions);
+	dup->filename = kstrdup(info->filename, GFP_KERNEL);
+	if (!dup->filename)
+		goto err;
+
+	list_for_each_entry(fn, &info->functions, head) {
+		struct gcov_fn_info *fn_dup = gcov_fn_info_dup(fn);
+
+		if (!fn_dup)
+			goto err;
+		list_add_tail(&fn_dup->head, &dup->functions);
+	}
+
+	return dup;
+
+err:
+	gcov_info_free(dup);
+	return NULL;
+}
+
+/**
+ * gcov_info_free - release memory for profiling data set duplicate
+ * @info: profiling data set duplicate to free
+ */
+void gcov_info_free(struct gcov_info *info)
+{
+	struct gcov_fn_info *fn, *tmp;
+
+	list_for_each_entry_safe(fn, tmp, &info->functions, head) {
+		kfree(fn->function_name);
+		vfree(fn->counters);
+		list_del(&fn->head);
+		kfree(fn);
+	}
+	kfree(info->filename);
+	kfree(info);
+}
+
+#define ITER_STRIDE	PAGE_SIZE
+
+/**
+ * struct gcov_iterator - specifies current file position in logical records
+ * @info: associated profiling data
+ * @buffer: buffer containing file data
+ * @size: size of buffer
+ * @pos: current position in file
+ */
+struct gcov_iterator {
+	struct gcov_info *info;
+	void *buffer;
+	size_t size;
+	loff_t pos;
+};
+
+/**
+ * store_gcov_u32 - store 32 bit number in gcov format to buffer
+ * @buffer: target buffer or NULL
+ * @off: offset into the buffer
+ * @v: value to be stored
+ *
+ * Number format defined by gcc: numbers are recorded in the 32 bit
+ * unsigned binary form of the endianness of the machine generating the
+ * file. Returns the number of bytes stored. If @buffer is %NULL, doesn't
+ * store anything.
+ */
+static size_t store_gcov_u32(void *buffer, size_t off, u32 v)
+{
+	u32 *data;
+
+	if (buffer) {
+		data = buffer + off;
+		*data = v;
+	}
+
+	return sizeof(*data);
+}
+
+/**
+ * store_gcov_u64 - store 64 bit number in gcov format to buffer
+ * @buffer: target buffer or NULL
+ * @off: offset into the buffer
+ * @v: value to be stored
+ *
+ * Number format defined by gcc: numbers are recorded in the 32 bit
+ * unsigned binary form of the endianness of the machine generating the
+ * file. 64 bit numbers are stored as two 32 bit numbers, the low part
+ * first. Returns the number of bytes stored. If @buffer is %NULL, doesn't store
+ * anything.
+ */
+static size_t store_gcov_u64(void *buffer, size_t off, u64 v)
+{
+	u32 *data;
+
+	if (buffer) {
+		data = buffer + off;
+
+		data[0] = (v & 0xffffffffUL);
+		data[1] = (v >> 32);
+	}
+
+	return sizeof(*data) * 2;
+}
+
+/**
+ * convert_to_gcda - convert profiling data set to gcda file format
+ * @buffer: the buffer to store file data or %NULL if no data should be stored
+ * @info: profiling data set to be converted
+ *
+ * Returns the number of bytes that were/would have been stored into the buffer.
+ */
+static size_t convert_to_gcda(char *buffer, struct gcov_info *info)
+{
+	struct gcov_fn_info *fi_ptr;
+	size_t pos = 0;
+
+	/* File header. */
+	pos += store_gcov_u32(buffer, pos, GCOV_DATA_MAGIC);
+	pos += store_gcov_u32(buffer, pos, info->version);
+	pos += store_gcov_u32(buffer, pos, info->checksum);
+
+	list_for_each_entry(fi_ptr, &info->functions, head) {
+		u32 i;
+		u32 len = 2;
+
+		if (fi_ptr->use_extra_checksum)
+			len++;
+
+		pos += store_gcov_u32(buffer, pos, GCOV_TAG_FUNCTION);
+		pos += store_gcov_u32(buffer, pos, len);
+		pos += store_gcov_u32(buffer, pos, fi_ptr->ident);
+		pos += store_gcov_u32(buffer, pos, fi_ptr->checksum);
+		if (fi_ptr->use_extra_checksum)
+			pos += store_gcov_u32(buffer, pos, fi_ptr->cfg_checksum);
+
+		pos += store_gcov_u32(buffer, pos, GCOV_TAG_COUNTER_BASE);
+		pos += store_gcov_u32(buffer, pos, fi_ptr->num_counters * 2);
+		for (i = 0; i < fi_ptr->num_counters; i++)
+			pos += store_gcov_u64(buffer, pos, fi_ptr->counters[i]);
+	}
+
+	return pos;
+}
+
+/**
+ * gcov_iter_new - allocate and initialize profiling data iterator
+ * @info: profiling data set to be iterated
+ *
+ * Return file iterator on success, %NULL otherwise.
+ */
+struct gcov_iterator *gcov_iter_new(struct gcov_info *info)
+{
+	struct gcov_iterator *iter;
+
+	iter = kzalloc(sizeof(struct gcov_iterator), GFP_KERNEL);
+	if (!iter)
+		goto err_free;
+
+	iter->info = info;
+	/* Dry-run to get the actual buffer size. */
+	iter->size = convert_to_gcda(NULL, info);
+	iter->buffer = vmalloc(iter->size);
+	if (!iter->buffer)
+		goto err_free;
+
+	convert_to_gcda(iter->buffer, info);
+
+	return iter;
+
+err_free:
+	kfree(iter);
+	return NULL;
+}
+
+
+/**
+ * gcov_iter_get_info - return profiling data set for given file iterator
+ * @iter: file iterator
+ */
+void gcov_iter_free(struct gcov_iterator *iter)
+{
+	vfree(iter->buffer);
+	kfree(iter);
+}
+
+/**
+ * gcov_iter_get_info - return profiling data set for given file iterator
+ * @iter: file iterator
+ */
+struct gcov_info *gcov_iter_get_info(struct gcov_iterator *iter)
+{
+	return iter->info;
+}
+
+/**
+ * gcov_iter_start - reset file iterator to starting position
+ * @iter: file iterator
+ */
+void gcov_iter_start(struct gcov_iterator *iter)
+{
+	iter->pos = 0;
+}
+
+/**
+ * gcov_iter_next - advance file iterator to next logical record
+ * @iter: file iterator
+ *
+ * Return zero if new position is valid, non-zero if iterator has reached end.
+ */
+int gcov_iter_next(struct gcov_iterator *iter)
+{
+	if (iter->pos < iter->size)
+		iter->pos += ITER_STRIDE;
+
+	if (iter->pos >= iter->size)
+		return -EINVAL;
+
+	return 0;
+}
+
+/**
+ * gcov_iter_write - write data for current pos to seq_file
+ * @iter: file iterator
+ * @seq: seq_file handle
+ *
+ * Return zero on success, non-zero otherwise.
+ */
+int gcov_iter_write(struct gcov_iterator *iter, struct seq_file *seq)
+{
+	size_t len;
+
+	if (iter->pos >= iter->size)
+		return -EINVAL;
+
+	len = ITER_STRIDE;
+	if (iter->pos + len > iter->size)
+		len = iter->size - iter->pos;
+
+	seq_write(seq, iter->buffer + iter->pos, len);
+
+	return 0;
+}
diff --git a/kernel/gcov/gcc_3_4.c b/kernel/gcov/gcc_3_4.c
index 1e32e66..64d2dd9 100644
--- a/kernel/gcov/gcc_3_4.c
+++ b/kernel/gcov/gcc_3_4.c
@@ -137,6 +137,18 @@
 		gcov_info_head = info->next;
 }
 
+/**
+ * gcov_info_within_module - check if a profiling data set belongs to a module
+ * @info: profiling data set
+ * @mod: module
+ *
+ * Returns true if profiling data belongs module, false otherwise.
+ */
+bool gcov_info_within_module(struct gcov_info *info, struct module *mod)
+{
+	return within_module((unsigned long)info, mod);
+}
+
 /* Symbolic links to be created for each profiling data file. */
 const struct gcov_link gcov_link[] = {
 	{ OBJ_TREE, "gcno" },	/* Link to .gcno file in $(objtree). */
diff --git a/kernel/gcov/gcc_4_7.c b/kernel/gcov/gcc_4_7.c
index ca5e5c0..ec37563 100644
--- a/kernel/gcov/gcc_4_7.c
+++ b/kernel/gcov/gcc_4_7.c
@@ -150,6 +150,18 @@
 		gcov_info_head = info->next;
 }
 
+/**
+ * gcov_info_within_module - check if a profiling data set belongs to a module
+ * @info: profiling data set
+ * @mod: module
+ *
+ * Returns true if profiling data belongs module, false otherwise.
+ */
+bool gcov_info_within_module(struct gcov_info *info, struct module *mod)
+{
+	return within_module((unsigned long)info, mod);
+}
+
 /* Symbolic links to be created for each profiling data file. */
 const struct gcov_link gcov_link[] = {
 	{ OBJ_TREE, "gcno" },	/* Link to .gcno file in $(objtree). */
diff --git a/kernel/gcov/gcc_base.c b/kernel/gcov/gcc_base.c
new file mode 100644
index 0000000..3cf736b
--- /dev/null
+++ b/kernel/gcov/gcc_base.c
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/export.h>
+#include <linux/kernel.h>
+#include <linux/mutex.h>
+#include "gcov.h"
+
+/*
+ * __gcov_init is called by gcc-generated constructor code for each object
+ * file compiled with -fprofile-arcs.
+ */
+void __gcov_init(struct gcov_info *info)
+{
+	static unsigned int gcov_version;
+
+	mutex_lock(&gcov_lock);
+	if (gcov_version == 0) {
+		gcov_version = gcov_info_version(info);
+		/*
+		 * Printing gcc's version magic may prove useful for debugging
+		 * incompatibility reports.
+		 */
+		pr_info("version magic: 0x%x\n", gcov_version);
+	}
+	/*
+	 * Add new profiling data structure to list and inform event
+	 * listener.
+	 */
+	gcov_info_link(info);
+	if (gcov_events_enabled)
+		gcov_event(GCOV_ADD, info);
+	mutex_unlock(&gcov_lock);
+}
+EXPORT_SYMBOL(__gcov_init);
+
+/*
+ * These functions may be referenced by gcc-generated profiling code but serve
+ * no function for kernel profiling.
+ */
+void __gcov_flush(void)
+{
+	/* Unused. */
+}
+EXPORT_SYMBOL(__gcov_flush);
+
+void __gcov_merge_add(gcov_type *counters, unsigned int n_counters)
+{
+	/* Unused. */
+}
+EXPORT_SYMBOL(__gcov_merge_add);
+
+void __gcov_merge_single(gcov_type *counters, unsigned int n_counters)
+{
+	/* Unused. */
+}
+EXPORT_SYMBOL(__gcov_merge_single);
+
+void __gcov_merge_delta(gcov_type *counters, unsigned int n_counters)
+{
+	/* Unused. */
+}
+EXPORT_SYMBOL(__gcov_merge_delta);
+
+void __gcov_merge_ior(gcov_type *counters, unsigned int n_counters)
+{
+	/* Unused. */
+}
+EXPORT_SYMBOL(__gcov_merge_ior);
+
+void __gcov_merge_time_profile(gcov_type *counters, unsigned int n_counters)
+{
+	/* Unused. */
+}
+EXPORT_SYMBOL(__gcov_merge_time_profile);
+
+void __gcov_merge_icall_topn(gcov_type *counters, unsigned int n_counters)
+{
+	/* Unused. */
+}
+EXPORT_SYMBOL(__gcov_merge_icall_topn);
+
+void __gcov_exit(void)
+{
+	/* Unused. */
+}
+EXPORT_SYMBOL(__gcov_exit);
diff --git a/kernel/gcov/gcov.h b/kernel/gcov/gcov.h
index de118ad..6ab2c18 100644
--- a/kernel/gcov/gcov.h
+++ b/kernel/gcov/gcov.h
@@ -15,6 +15,7 @@
 #ifndef GCOV_H
 #define GCOV_H GCOV_H
 
+#include <linux/module.h>
 #include <linux/types.h>
 
 /*
@@ -46,6 +47,7 @@
 struct gcov_info *gcov_info_next(struct gcov_info *info);
 void gcov_info_link(struct gcov_info *info);
 void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info);
+bool gcov_info_within_module(struct gcov_info *info, struct module *mod);
 
 /* Base interface. */
 enum gcov_action {
@@ -83,4 +85,7 @@
 };
 extern const struct gcov_link gcov_link[];
 
+extern int gcov_events_enabled;
+extern struct mutex gcov_lock;
+
 #endif /* GCOV_H */
diff --git a/kernel/gen_kheaders.sh b/kernel/gen_kheaders.sh
new file mode 100755
index 0000000..9a34e1d
--- /dev/null
+++ b/kernel/gen_kheaders.sh
@@ -0,0 +1,96 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+# This script generates an archive consisting of kernel headers
+# for CONFIG_IKHEADERS.
+set -e
+spath="$(dirname "$(readlink -f "$0")")"
+kroot="$spath/.."
+outdir="$(pwd)"
+tarfile=$1
+cpio_dir=$outdir/$tarfile.tmp
+
+# Script filename relative to the kernel source root
+# We add it to the archive because it is small and any changes
+# to this script will also cause a rebuild of the archive.
+sfile="$(realpath --relative-to $kroot "$(readlink -f "$0")")"
+
+src_file_list="
+include/
+arch/$SRCARCH/include/
+$sfile
+"
+
+obj_file_list="
+include/
+arch/$SRCARCH/include/
+"
+
+# Support incremental builds by skipping archive generation
+# if timestamps of files being archived are not changed.
+
+# This block is useful for debugging the incremental builds.
+# Uncomment it for debugging.
+# if [ ! -f /tmp/iter ]; then iter=1; echo 1 > /tmp/iter;
+# else iter=$(($(cat /tmp/iter) + 1)); echo $iter > /tmp/iter; fi
+# find $src_file_list -type f | xargs ls -lR > /tmp/src-ls-$iter
+# find $obj_file_list -type f | xargs ls -lR > /tmp/obj-ls-$iter
+
+# include/generated/compile.h is ignored because it is touched even when none
+# of the source files changed. This causes pointless regeneration, so let us
+# ignore them for md5 calculation.
+pushd $kroot > /dev/null
+src_files_md5="$(find $src_file_list -type f                       |
+		grep -v "include/generated/compile.h"		   |
+		grep -v "include/generated/autoconf.h"		   |
+		grep -v "include/config/auto.conf"		   |
+		grep -v "include/config/auto.conf.cmd"		   |
+		grep -v "include/config/tristate.conf"		   |
+		xargs ls -lR | md5sum | cut -d ' ' -f1)"
+popd > /dev/null
+obj_files_md5="$(find $obj_file_list -type f                       |
+		grep -v "include/generated/compile.h"		   |
+		grep -v "include/generated/autoconf.h"		   |
+		grep -v "include/config/auto.conf"                 |
+		grep -v "include/config/auto.conf.cmd"		   |
+		grep -v "include/config/tristate.conf"		   |
+		xargs ls -lR | md5sum | cut -d ' ' -f1)"
+
+if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi
+if [ -f kernel/kheaders.md5 ] &&
+	[ "$(cat kernel/kheaders.md5|head -1)" == "$src_files_md5" ] &&
+	[ "$(cat kernel/kheaders.md5|head -2|tail -1)" == "$obj_files_md5" ] &&
+	[ "$(cat kernel/kheaders.md5|tail -1)" == "$tarfile_md5" ]; then
+		exit
+fi
+
+if [ "${quiet}" != "silent_" ]; then
+       echo "  GEN     $tarfile"
+fi
+
+rm -rf $cpio_dir
+mkdir $cpio_dir
+
+pushd $kroot > /dev/null
+for f in $src_file_list;
+	do find "$f" ! -name "*.cmd" ! -name ".*";
+done | cpio --quiet -pd $cpio_dir
+popd > /dev/null
+
+# The second CPIO can complain if files already exist which can
+# happen with out of tree builds. Just silence CPIO for now.
+for f in $obj_file_list;
+	do find "$f" ! -name "*.cmd" ! -name ".*";
+done | cpio --quiet -pd $cpio_dir >/dev/null 2>&1
+
+# Remove comments except SDPX lines
+find $cpio_dir -type f -print0 |
+	xargs -0 -P8 -n1 perl -pi -e 'BEGIN {undef $/;}; s/\/\*((?!SPDX).)*?\*\///smg;'
+
+tar -Jcf $tarfile -C $cpio_dir/ . > /dev/null
+
+echo "$src_files_md5" >  kernel/kheaders.md5
+echo "$obj_files_md5" >> kernel/kheaders.md5
+echo "$(md5sum $tarfile | cut -d ' ' -f1)" >> kernel/kheaders.md5
+
+rm -rf $cpio_dir
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index ed87dac..181db01 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -270,6 +270,24 @@
 	       !!__bpf_address_lookup(addr, symbolsize, offset, namebuf);
 }
 
+#ifdef CONFIG_CFI_CLANG
+/*
+ * LLVM appends .cfi to function names when CONFIG_CFI_CLANG is enabled,
+ * which causes confusion and potentially breaks user space tools, so we
+ * will strip the postfix from expanded symbol names.
+ */
+static inline void cleanup_symbol_name(char *s)
+{
+	char *res;
+
+	res = strrchr(s, '.');
+	if (res && !strcmp(res, ".cfi"))
+		*res = '\0';
+}
+#else
+static inline void cleanup_symbol_name(char *s) {}
+#endif
+
 /*
  * Lookup an address
  * - modname is set to NULL if it's in the kernel.
@@ -296,7 +314,9 @@
 				       namebuf, KSYM_NAME_LEN);
 		if (modname)
 			*modname = NULL;
-		return namebuf;
+
+		ret = namebuf;
+		goto found;
 	}
 
 	/* See if it's in a module or a BPF JITed image. */
@@ -309,11 +329,16 @@
 	if (!ret)
 		ret = ftrace_mod_address_lookup(addr, symbolsize,
 						offset, modname, namebuf);
+
+found:
+	cleanup_symbol_name(namebuf);
 	return ret;
 }
 
 int lookup_symbol_name(unsigned long addr, char *symname)
 {
+	int res;
+
 	symname[0] = '\0';
 	symname[KSYM_NAME_LEN - 1] = '\0';
 
@@ -324,15 +349,23 @@
 		/* Grab name */
 		kallsyms_expand_symbol(get_symbol_offset(pos),
 				       symname, KSYM_NAME_LEN);
-		return 0;
+		goto found;
 	}
 	/* See if it's in a module. */
-	return lookup_module_symbol_name(addr, symname);
+	res = lookup_module_symbol_name(addr, symname);
+	if (res)
+		return res;
+
+found:
+	cleanup_symbol_name(symname);
+	return 0;
 }
 
 int lookup_symbol_attrs(unsigned long addr, unsigned long *size,
 			unsigned long *offset, char *modname, char *name)
 {
+	int res;
+
 	name[0] = '\0';
 	name[KSYM_NAME_LEN - 1] = '\0';
 
@@ -344,10 +377,16 @@
 		kallsyms_expand_symbol(get_symbol_offset(pos),
 				       name, KSYM_NAME_LEN);
 		modname[0] = '\0';
-		return 0;
+		goto found;
 	}
 	/* See if it's in a module. */
-	return lookup_module_symbol_attrs(addr, size, offset, modname, name);
+	res = lookup_module_symbol_attrs(addr, size, offset, modname, name);
+	if (res)
+		return res;
+
+found:
+	cleanup_symbol_name(name);
+	return 0;
 }
 
 /* Look up a kernel symbol and return it in a text buffer. */
diff --git a/kernel/kheaders.c b/kernel/kheaders.c
new file mode 100644
index 0000000..8f69772
--- /dev/null
+++ b/kernel/kheaders.c
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Provide kernel headers useful to build tracing programs
+ * such as for running eBPF tracing tools.
+ *
+ * (Borrowed code from kernel/configs.c)
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/kobject.h>
+#include <linux/init.h>
+
+/*
+ * Define kernel_headers_data and kernel_headers_data_end, within which the
+ * compressed kernel headers are stored. The file is first compressed with xz.
+ */
+
+asm (
+"	.pushsection .rodata, \"a\"		\n"
+"	.global kernel_headers_data		\n"
+"kernel_headers_data:				\n"
+"	.incbin \"kernel/kheaders_data.tar.xz\"	\n"
+"	.global kernel_headers_data_end		\n"
+"kernel_headers_data_end:			\n"
+"	.popsection				\n"
+);
+
+extern char kernel_headers_data;
+extern char kernel_headers_data_end;
+
+static ssize_t
+ikheaders_read(struct file *file,  struct kobject *kobj,
+	       struct bin_attribute *bin_attr,
+	       char *buf, loff_t off, size_t len)
+{
+	memcpy(buf, &kernel_headers_data + off, len);
+	return len;
+}
+
+static struct bin_attribute kheaders_attr __ro_after_init = {
+	.attr = {
+		.name = "kheaders.tar.xz",
+		.mode = 0444,
+	},
+	.read = &ikheaders_read,
+};
+
+static int __init ikheaders_init(void)
+{
+	kheaders_attr.size = (&kernel_headers_data_end -
+			      &kernel_headers_data);
+	return sysfs_create_bin_file(kernel_kobj, &kheaders_attr);
+}
+
+static void __exit ikheaders_cleanup(void)
+{
+	sysfs_remove_bin_file(kernel_kobj, &kheaders_attr);
+}
+
+module_init(ikheaders_init);
+module_exit(ikheaders_cleanup);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Joel Fernandes");
+MODULE_DESCRIPTION("Echo the kernel header artifacts used to build the kernel");
diff --git a/kernel/kthread.c b/kernel/kthread.c
index 087d18d..e3dfad2 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -11,6 +11,7 @@
 #include <linux/kthread.h>
 #include <linux/completion.h>
 #include <linux/err.h>
+#include <linux/cgroup.h>
 #include <linux/cpuset.h>
 #include <linux/unistd.h>
 #include <linux/file.h>
diff --git a/kernel/module.c b/kernel/module.c
index d3aaec6..0c9494d 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -2148,6 +2148,8 @@
 {
 }
 
+static void cfi_cleanup(struct module *mod);
+
 /* Free a module, remove from lists, etc. */
 static void free_module(struct module *mod)
 {
@@ -2189,6 +2191,10 @@
 
 	/* This may be empty, but that's OK */
 	disable_ro_nx(&mod->init_layout);
+
+	/* Clean up CFI for the module. */
+	cfi_cleanup(mod);
+
 	module_arch_freeing_init(mod);
 	module_memfree(mod->init_layout.base);
 	kfree(mod->args);
@@ -3376,6 +3382,8 @@
 	return 0;
 }
 
+static void cfi_init(struct module *mod);
+
 static int post_relocation(struct module *mod, const struct load_info *info)
 {
 	/* Sort exception table now relocations are done. */
@@ -3388,6 +3396,9 @@
 	/* Setup kallsyms-specific fields. */
 	add_kallsyms(mod, info);
 
+	/* Setup CFI for the module. */
+	cfi_init(mod);
+
 	/* Arch-specific module finalizing. */
 	return module_finalize(info->hdr, info->sechdrs, mod);
 }
@@ -4156,6 +4167,22 @@
 }
 #endif /* CONFIG_KALLSYMS */
 
+static void cfi_init(struct module *mod)
+{
+#ifdef CONFIG_CFI_CLANG
+	mod->cfi_check =
+		(cfi_check_fn)mod_find_symname(mod, CFI_CHECK_FN_NAME);
+	cfi_module_add(mod, module_addr_min, module_addr_max);
+#endif
+}
+
+static void cfi_cleanup(struct module *mod)
+{
+#ifdef CONFIG_CFI_CLANG
+	cfi_module_remove(mod, module_addr_min, module_addr_max);
+#endif
+}
+
 /* Maximum number of characters written by module_flags() */
 #define MODULE_FLAGS_BUF_SIZE (TAINT_FLAGS_COUNT + 4)
 
diff --git a/kernel/pid.c b/kernel/pid.c
index b88fe5e..e602858 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -38,6 +38,8 @@
 #include <linux/syscalls.h>
 #include <linux/proc_ns.h>
 #include <linux/proc_fs.h>
+#include <linux/anon_inodes.h>
+#include <linux/sched/signal.h>
 #include <linux/sched/task.h>
 #include <linux/idr.h>
 
@@ -214,6 +216,8 @@
 	for (type = 0; type < PIDTYPE_MAX; ++type)
 		INIT_HLIST_HEAD(&pid->tasks[type]);
 
+	init_waitqueue_head(&pid->wait_pidfd);
+
 	upid = pid->numbers + ns->level;
 	spin_lock_irq(&pidmap_lock);
 	if (!(ns->pid_allocated & PIDNS_ADDING))
@@ -451,6 +455,73 @@
 	return idr_get_next(&ns->idr, &nr);
 }
 
+/**
+ * pidfd_create() - Create a new pid file descriptor.
+ *
+ * @pid:  struct pid that the pidfd will reference
+ *
+ * This creates a new pid file descriptor with the O_CLOEXEC flag set.
+ *
+ * Note, that this function can only be called after the fd table has
+ * been unshared to avoid leaking the pidfd to the new process.
+ *
+ * Return: On success, a cloexec pidfd is returned.
+ *         On error, a negative errno number will be returned.
+ */
+static int pidfd_create(struct pid *pid)
+{
+	int fd;
+
+	fd = anon_inode_getfd("[pidfd]", &pidfd_fops, get_pid(pid),
+			      O_RDWR | O_CLOEXEC);
+	if (fd < 0)
+		put_pid(pid);
+
+	return fd;
+}
+
+/**
+ * pidfd_open() - Open new pid file descriptor.
+ *
+ * @pid:   pid for which to retrieve a pidfd
+ * @flags: flags to pass
+ *
+ * This creates a new pid file descriptor with the O_CLOEXEC flag set for
+ * the process identified by @pid. Currently, the process identified by
+ * @pid must be a thread-group leader. This restriction currently exists
+ * for all aspects of pidfds including pidfd creation (CLONE_PIDFD cannot
+ * be used with CLONE_THREAD) and pidfd polling (only supports thread group
+ * leaders).
+ *
+ * Return: On success, a cloexec pidfd is returned.
+ *         On error, a negative errno number will be returned.
+ */
+SYSCALL_DEFINE2(pidfd_open, pid_t, pid, unsigned int, flags)
+{
+	int fd, ret;
+	struct pid *p;
+
+	if (flags)
+		return -EINVAL;
+
+	if (pid <= 0)
+		return -EINVAL;
+
+	p = find_get_pid(pid);
+	if (!p)
+		return -ESRCH;
+
+	ret = 0;
+	rcu_read_lock();
+	if (!pid_task(p, PIDTYPE_TGID))
+		ret = -EINVAL;
+	rcu_read_unlock();
+
+	fd = ret ?: pidfd_create(p);
+	put_pid(p);
+	return fd;
+}
+
 void __init pid_idr_init(void)
 {
 	/* Verify no one has done anything silly: */
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
index 3a6c2f8..f8fe57d 100644
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -298,3 +298,18 @@
 
 config CPU_PM
 	bool
+
+config ENERGY_MODEL
+	bool "Energy Model for CPUs"
+	depends on SMP
+	depends on CPU_FREQ
+	default n
+	help
+	  Several subsystems (thermal and/or the task scheduler for example)
+	  can leverage information about the energy consumed by CPUs to make
+	  smarter decisions. This config option enables the framework from
+	  which subsystems can access the energy models.
+
+	  The exact usage of the energy model is subsystem-dependent.
+
+	  If in doubt, say N.
diff --git a/kernel/power/Makefile b/kernel/power/Makefile
index a3f79f0e..bbf0676 100644
--- a/kernel/power/Makefile
+++ b/kernel/power/Makefile
@@ -15,3 +15,6 @@
 obj-$(CONFIG_PM_WAKELOCKS)	+= wakelock.o
 
 obj-$(CONFIG_MAGIC_SYSRQ)	+= poweroff.o
+
+obj-$(CONFIG_ENERGY_MODEL)	+= energy_model.o
+obj-$(CONFIG_SUSPEND)		+= wakeup_reason.o
diff --git a/kernel/power/autosleep.c b/kernel/power/autosleep.c
index 41e83a7..9af5a50 100644
--- a/kernel/power/autosleep.c
+++ b/kernel/power/autosleep.c
@@ -116,7 +116,7 @@
 
 int __init pm_autosleep_init(void)
 {
-	autosleep_ws = wakeup_source_register("autosleep");
+	autosleep_ws = wakeup_source_register(NULL, "autosleep");
 	if (!autosleep_ws)
 		return -ENOMEM;
 
diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c
new file mode 100644
index 0000000..7d66ee6
--- /dev/null
+++ b/kernel/power/energy_model.c
@@ -0,0 +1,258 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Energy Model of CPUs
+ *
+ * Copyright (c) 2018, Arm ltd.
+ * Written by: Quentin Perret, Arm ltd.
+ */
+
+#define pr_fmt(fmt) "energy_model: " fmt
+
+#include <linux/cpu.h>
+#include <linux/cpumask.h>
+#include <linux/debugfs.h>
+#include <linux/energy_model.h>
+#include <linux/sched/topology.h>
+#include <linux/slab.h>
+
+/* Mapping of each CPU to the performance domain to which it belongs. */
+static DEFINE_PER_CPU(struct em_perf_domain *, em_data);
+
+/*
+ * Mutex serializing the registrations of performance domains and letting
+ * callbacks defined by drivers sleep.
+ */
+static DEFINE_MUTEX(em_pd_mutex);
+
+#ifdef CONFIG_DEBUG_FS
+static struct dentry *rootdir;
+
+static void em_debug_create_cs(struct em_cap_state *cs, struct dentry *pd)
+{
+	struct dentry *d;
+	char name[24];
+
+	snprintf(name, sizeof(name), "cs:%lu", cs->frequency);
+
+	/* Create per-cs directory */
+	d = debugfs_create_dir(name, pd);
+	debugfs_create_ulong("frequency", 0444, d, &cs->frequency);
+	debugfs_create_ulong("power", 0444, d, &cs->power);
+	debugfs_create_ulong("cost", 0444, d, &cs->cost);
+}
+
+static int em_debug_cpus_show(struct seq_file *s, void *unused)
+{
+	seq_printf(s, "%*pbl\n", cpumask_pr_args(to_cpumask(s->private)));
+
+	return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(em_debug_cpus);
+
+static void em_debug_create_pd(struct em_perf_domain *pd, int cpu)
+{
+	struct dentry *d;
+	char name[8];
+	int i;
+
+	snprintf(name, sizeof(name), "pd%d", cpu);
+
+	/* Create the directory of the performance domain */
+	d = debugfs_create_dir(name, rootdir);
+
+	debugfs_create_file("cpus", 0444, d, pd->cpus, &em_debug_cpus_fops);
+
+	/* Create a sub-directory for each capacity state */
+	for (i = 0; i < pd->nr_cap_states; i++)
+		em_debug_create_cs(&pd->table[i], d);
+}
+
+static int __init em_debug_init(void)
+{
+	/* Create /sys/kernel/debug/energy_model directory */
+	rootdir = debugfs_create_dir("energy_model", NULL);
+
+	return 0;
+}
+core_initcall(em_debug_init);
+#else /* CONFIG_DEBUG_FS */
+static void em_debug_create_pd(struct em_perf_domain *pd, int cpu) {}
+#endif
+static struct em_perf_domain *em_create_pd(cpumask_t *span, int nr_states,
+						struct em_data_callback *cb)
+{
+	unsigned long opp_eff, prev_opp_eff = ULONG_MAX;
+	unsigned long power, freq, prev_freq = 0;
+	int i, ret, cpu = cpumask_first(span);
+	struct em_cap_state *table;
+	struct em_perf_domain *pd;
+	u64 fmax;
+
+	if (!cb->active_power)
+		return NULL;
+
+	pd = kzalloc(sizeof(*pd) + cpumask_size(), GFP_KERNEL);
+	if (!pd)
+		return NULL;
+
+	table = kcalloc(nr_states, sizeof(*table), GFP_KERNEL);
+	if (!table)
+		goto free_pd;
+
+	/* Build the list of capacity states for this performance domain */
+	for (i = 0, freq = 0; i < nr_states; i++, freq++) {
+		/*
+		 * active_power() is a driver callback which ceils 'freq' to
+		 * lowest capacity state of 'cpu' above 'freq' and updates
+		 * 'power' and 'freq' accordingly.
+		 */
+		ret = cb->active_power(&power, &freq, cpu);
+		if (ret) {
+			pr_err("pd%d: invalid cap. state: %d\n", cpu, ret);
+			goto free_cs_table;
+		}
+
+		/*
+		 * We expect the driver callback to increase the frequency for
+		 * higher capacity states.
+		 */
+		if (freq <= prev_freq) {
+			pr_err("pd%d: non-increasing freq: %lu\n", cpu, freq);
+			goto free_cs_table;
+		}
+
+		/*
+		 * The power returned by active_state() is expected to be
+		 * positive, in milli-watts and to fit into 16 bits.
+		 */
+		if (!power || power > EM_CPU_MAX_POWER) {
+			pr_err("pd%d: invalid power: %lu\n", cpu, power);
+			goto free_cs_table;
+		}
+
+		table[i].power = power;
+		table[i].frequency = prev_freq = freq;
+
+		/*
+		 * The hertz/watts efficiency ratio should decrease as the
+		 * frequency grows on sane platforms. But this isn't always
+		 * true in practice so warn the user if a higher OPP is more
+		 * power efficient than a lower one.
+		 */
+		opp_eff = freq / power;
+		if (opp_eff >= prev_opp_eff)
+			pr_warn("pd%d: hertz/watts ratio non-monotonically decreasing: em_cap_state %d >= em_cap_state%d\n",
+					cpu, i, i - 1);
+		prev_opp_eff = opp_eff;
+	}
+
+	/* Compute the cost of each capacity_state. */
+	fmax = (u64) table[nr_states - 1].frequency;
+	for (i = 0; i < nr_states; i++) {
+		table[i].cost = div64_u64(fmax * table[i].power,
+					  table[i].frequency);
+	}
+
+	pd->table = table;
+	pd->nr_cap_states = nr_states;
+	cpumask_copy(to_cpumask(pd->cpus), span);
+
+	em_debug_create_pd(pd, cpu);
+
+	return pd;
+
+free_cs_table:
+	kfree(table);
+free_pd:
+	kfree(pd);
+
+	return NULL;
+}
+
+/**
+ * em_cpu_get() - Return the performance domain for a CPU
+ * @cpu : CPU to find the performance domain for
+ *
+ * Return: the performance domain to which 'cpu' belongs, or NULL if it doesn't
+ * exist.
+ */
+struct em_perf_domain *em_cpu_get(int cpu)
+{
+	return READ_ONCE(per_cpu(em_data, cpu));
+}
+EXPORT_SYMBOL_GPL(em_cpu_get);
+
+/**
+ * em_register_perf_domain() - Register the Energy Model of a performance domain
+ * @span	: Mask of CPUs in the performance domain
+ * @nr_states	: Number of capacity states to register
+ * @cb		: Callback functions providing the data of the Energy Model
+ *
+ * Create Energy Model tables for a performance domain using the callbacks
+ * defined in cb.
+ *
+ * If multiple clients register the same performance domain, all but the first
+ * registration will be ignored.
+ *
+ * Return 0 on success
+ */
+int em_register_perf_domain(cpumask_t *span, unsigned int nr_states,
+						struct em_data_callback *cb)
+{
+	unsigned long cap, prev_cap = 0;
+	struct em_perf_domain *pd;
+	int cpu, ret = 0;
+
+	if (!span || !nr_states || !cb)
+		return -EINVAL;
+
+	/*
+	 * Use a mutex to serialize the registration of performance domains and
+	 * let the driver-defined callback functions sleep.
+	 */
+	mutex_lock(&em_pd_mutex);
+
+	for_each_cpu(cpu, span) {
+		/* Make sure we don't register again an existing domain. */
+		if (READ_ONCE(per_cpu(em_data, cpu))) {
+			ret = -EEXIST;
+			goto unlock;
+		}
+
+		/*
+		 * All CPUs of a domain must have the same micro-architecture
+		 * since they all share the same table.
+		 */
+		cap = arch_scale_cpu_capacity(NULL, cpu);
+		if (prev_cap && prev_cap != cap) {
+			pr_err("CPUs of %*pbl must have the same capacity\n",
+							cpumask_pr_args(span));
+			ret = -EINVAL;
+			goto unlock;
+		}
+		prev_cap = cap;
+	}
+
+	/* Create the performance domain and add it to the Energy Model. */
+	pd = em_create_pd(span, nr_states, cb);
+	if (!pd) {
+		ret = -EINVAL;
+		goto unlock;
+	}
+
+	for_each_cpu(cpu, span) {
+		/*
+		 * The per-cpu array can be read concurrently from em_cpu_get().
+		 * The barrier enforces the ordering needed to make sure readers
+		 * can only access well formed em_perf_domain structs.
+		 */
+		smp_store_release(per_cpu_ptr(&em_data, cpu), pd);
+	}
+
+	pr_debug("Created perf domain %*pbl\n", cpumask_pr_args(span));
+unlock:
+	mutex_unlock(&em_pd_mutex);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(em_register_perf_domain);
diff --git a/kernel/power/main.c b/kernel/power/main.c
index 35b5082..6bcb47d3 100644
--- a/kernel/power/main.c
+++ b/kernel/power/main.c
@@ -242,7 +242,6 @@
 power_attr(pm_test);
 #endif /* CONFIG_PM_SLEEP_DEBUG */
 
-#ifdef CONFIG_DEBUG_FS
 static char *suspend_step_name(enum suspend_stat_step step)
 {
 	switch (step) {
@@ -263,6 +262,92 @@
 	}
 }
 
+#define suspend_attr(_name)					\
+static ssize_t _name##_show(struct kobject *kobj,		\
+		struct kobj_attribute *attr, char *buf)		\
+{								\
+	return sprintf(buf, "%d\n", suspend_stats._name);	\
+}								\
+static struct kobj_attribute _name = __ATTR_RO(_name)
+
+suspend_attr(success);
+suspend_attr(fail);
+suspend_attr(failed_freeze);
+suspend_attr(failed_prepare);
+suspend_attr(failed_suspend);
+suspend_attr(failed_suspend_late);
+suspend_attr(failed_suspend_noirq);
+suspend_attr(failed_resume);
+suspend_attr(failed_resume_early);
+suspend_attr(failed_resume_noirq);
+
+static ssize_t last_failed_dev_show(struct kobject *kobj,
+		struct kobj_attribute *attr, char *buf)
+{
+	int index;
+	char *last_failed_dev = NULL;
+
+	index = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
+	index %= REC_FAILED_NUM;
+	last_failed_dev = suspend_stats.failed_devs[index];
+
+	return sprintf(buf, "%s\n", last_failed_dev);
+}
+static struct kobj_attribute last_failed_dev = __ATTR_RO(last_failed_dev);
+
+static ssize_t last_failed_errno_show(struct kobject *kobj,
+		struct kobj_attribute *attr, char *buf)
+{
+	int index;
+	int last_failed_errno;
+
+	index = suspend_stats.last_failed_errno + REC_FAILED_NUM - 1;
+	index %= REC_FAILED_NUM;
+	last_failed_errno = suspend_stats.errno[index];
+
+	return sprintf(buf, "%d\n", last_failed_errno);
+}
+static struct kobj_attribute last_failed_errno = __ATTR_RO(last_failed_errno);
+
+static ssize_t last_failed_step_show(struct kobject *kobj,
+		struct kobj_attribute *attr, char *buf)
+{
+	int index;
+	enum suspend_stat_step step;
+	char *last_failed_step = NULL;
+
+	index = suspend_stats.last_failed_step + REC_FAILED_NUM - 1;
+	index %= REC_FAILED_NUM;
+	step = suspend_stats.failed_steps[index];
+	last_failed_step = suspend_step_name(step);
+
+	return sprintf(buf, "%s\n", last_failed_step);
+}
+static struct kobj_attribute last_failed_step = __ATTR_RO(last_failed_step);
+
+static struct attribute *suspend_attrs[] = {
+	&success.attr,
+	&fail.attr,
+	&failed_freeze.attr,
+	&failed_prepare.attr,
+	&failed_suspend.attr,
+	&failed_suspend_late.attr,
+	&failed_suspend_noirq.attr,
+	&failed_resume.attr,
+	&failed_resume_early.attr,
+	&failed_resume_noirq.attr,
+	&last_failed_dev.attr,
+	&last_failed_errno.attr,
+	&last_failed_step.attr,
+	NULL,
+};
+
+static struct attribute_group suspend_attr_group = {
+	.name = "suspend_stats",
+	.attrs = suspend_attrs,
+};
+
+#ifdef CONFIG_DEBUG_FS
 static int suspend_stats_show(struct seq_file *s, void *unused)
 {
 	int i, index, last_dev, last_errno, last_step;
@@ -793,6 +878,14 @@
 	.attrs = g,
 };
 
+static const struct attribute_group *attr_groups[] = {
+	&attr_group,
+#ifdef CONFIG_PM_SLEEP
+	&suspend_attr_group,
+#endif
+	NULL,
+};
+
 struct workqueue_struct *pm_wq;
 EXPORT_SYMBOL_GPL(pm_wq);
 
@@ -814,7 +907,7 @@
 	power_kobj = kobject_create_and_add("power", NULL);
 	if (!power_kobj)
 		return -ENOMEM;
-	error = sysfs_create_group(power_kobj, &attr_group);
+	error = sysfs_create_groups(power_kobj, attr_groups);
 	if (error)
 		return error;
 	pm_print_times_init();
diff --git a/kernel/power/process.c b/kernel/power/process.c
index 7381d49..c366e3d 100644
--- a/kernel/power/process.c
+++ b/kernel/power/process.c
@@ -22,6 +22,7 @@
 #include <linux/kmod.h>
 #include <trace/events/power.h>
 #include <linux/cpuset.h>
+#include <linux/wakeup_reason.h>
 
 /*
  * Timeout for stopping processes
@@ -38,6 +39,9 @@
 	unsigned int elapsed_msecs;
 	bool wakeup = false;
 	int sleep_usecs = USEC_PER_MSEC;
+#ifdef CONFIG_PM_SLEEP
+	char suspend_abort[MAX_SUSPEND_ABORT_LEN];
+#endif
 
 	start = ktime_get_boottime();
 
@@ -67,6 +71,11 @@
 			break;
 
 		if (pm_wakeup_pending()) {
+#ifdef CONFIG_PM_SLEEP
+			pm_get_active_wakeup_sources(suspend_abort,
+				MAX_SUSPEND_ABORT_LEN);
+			log_suspend_abort_reason(suspend_abort);
+#endif
 			wakeup = true;
 			break;
 		}
@@ -85,26 +94,27 @@
 	elapsed = ktime_sub(end, start);
 	elapsed_msecs = ktime_to_ms(elapsed);
 
-	if (todo) {
+	if (wakeup) {
 		pr_cont("\n");
-		pr_err("Freezing of tasks %s after %d.%03d seconds "
-		       "(%d tasks refusing to freeze, wq_busy=%d):\n",
-		       wakeup ? "aborted" : "failed",
+		pr_err("Freezing of tasks aborted after %d.%03d seconds",
+		       elapsed_msecs / 1000, elapsed_msecs % 1000);
+	} else if (todo) {
+		pr_cont("\n");
+		pr_err("Freezing of tasks failed after %d.%03d seconds"
+		       " (%d tasks refusing to freeze, wq_busy=%d):\n",
 		       elapsed_msecs / 1000, elapsed_msecs % 1000,
 		       todo - wq_busy, wq_busy);
 
 		if (wq_busy)
 			show_workqueue_state();
 
-		if (!wakeup) {
-			read_lock(&tasklist_lock);
-			for_each_process_thread(g, p) {
-				if (p != current && !freezer_should_skip(p)
-				    && freezing(p) && !frozen(p))
-					sched_show_task(p);
-			}
-			read_unlock(&tasklist_lock);
+		read_lock(&tasklist_lock);
+		for_each_process_thread(g, p) {
+			if (p != current && !freezer_should_skip(p)
+			    && freezing(p) && !frozen(p))
+				sched_show_task(p);
 		}
+		read_unlock(&tasklist_lock);
 	} else {
 		pr_cont("(elapsed %d.%03d seconds) ", elapsed_msecs / 1000,
 			elapsed_msecs % 1000);
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
index 0bd595a..3ef2c53 100644
--- a/kernel/power/suspend.c
+++ b/kernel/power/suspend.c
@@ -32,6 +32,7 @@
 #include <trace/events/power.h>
 #include <linux/compiler.h>
 #include <linux/moduleparam.h>
+#include <linux/wakeup_reason.h>
 
 #include "power.h"
 
@@ -396,7 +397,8 @@
  */
 static int suspend_enter(suspend_state_t state, bool *wakeup)
 {
-	int error;
+	char suspend_abort[MAX_SUSPEND_ABORT_LEN];
+	int error, last_dev;
 
 	error = platform_suspend_prepare(state);
 	if (error)
@@ -404,7 +406,11 @@
 
 	error = dpm_suspend_late(PMSG_SUSPEND);
 	if (error) {
+		last_dev = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
+		last_dev %= REC_FAILED_NUM;
 		pr_err("late suspend of devices failed\n");
+		log_suspend_abort_reason("%s device failed to power down",
+			suspend_stats.failed_devs[last_dev]);
 		goto Platform_finish;
 	}
 	error = platform_suspend_prepare_late(state);
@@ -418,7 +424,11 @@
 
 	error = dpm_suspend_noirq(PMSG_SUSPEND);
 	if (error) {
+		last_dev = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
+		last_dev %= REC_FAILED_NUM;
 		pr_err("noirq suspend of devices failed\n");
+		log_suspend_abort_reason("noirq suspend of %s device failed",
+			suspend_stats.failed_devs[last_dev]);
 		goto Platform_early_resume;
 	}
 	error = platform_suspend_prepare_noirq(state);
@@ -429,8 +439,10 @@
 		goto Platform_wake;
 
 	error = disable_nonboot_cpus();
-	if (error || suspend_test(TEST_CPUS))
+	if (error || suspend_test(TEST_CPUS)) {
+		log_suspend_abort_reason("Disabling non-boot cpus failed");
 		goto Enable_cpus;
+	}
 
 	arch_suspend_disable_irqs();
 	BUG_ON(!irqs_disabled());
@@ -447,6 +459,9 @@
 			trace_suspend_resume(TPS("machine_suspend"),
 				state, false);
 		} else if (*wakeup) {
+			pm_get_active_wakeup_sources(suspend_abort,
+				MAX_SUSPEND_ABORT_LEN);
+			log_suspend_abort_reason(suspend_abort);
 			error = -EBUSY;
 		}
 		syscore_resume();
@@ -481,7 +496,7 @@
  */
 int suspend_devices_and_enter(suspend_state_t state)
 {
-	int error;
+	int error, last_dev;
 	bool wakeup = false;
 
 	if (!sleep_state_supported(state))
@@ -497,7 +512,11 @@
 	suspend_test_start();
 	error = dpm_suspend_start(PMSG_SUSPEND);
 	if (error) {
+		last_dev = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
+		last_dev %= REC_FAILED_NUM;
 		pr_err("Some devices failed to suspend, or early wake event detected\n");
+		log_suspend_abort_reason("%s device failed to suspend, or early wake event detected",
+			suspend_stats.failed_devs[last_dev]);
 		goto Recover_platform;
 	}
 	suspend_test_finish("suspend devices");
diff --git a/kernel/power/wakelock.c b/kernel/power/wakelock.c
index 4210152..105df4d 100644
--- a/kernel/power/wakelock.c
+++ b/kernel/power/wakelock.c
@@ -27,7 +27,7 @@
 struct wakelock {
 	char			*name;
 	struct rb_node		node;
-	struct wakeup_source	ws;
+	struct wakeup_source	*ws;
 #ifdef CONFIG_PM_WAKELOCKS_GC
 	struct list_head	lru;
 #endif
@@ -46,7 +46,7 @@
 
 	for (node = rb_first(&wakelocks_tree); node; node = rb_next(node)) {
 		wl = rb_entry(node, struct wakelock, node);
-		if (wl->ws.active == show_active)
+		if (wl->ws->active == show_active)
 			str += scnprintf(str, end - str, "%s ", wl->name);
 	}
 	if (str > buf)
@@ -112,16 +112,16 @@
 		u64 idle_time_ns;
 		bool active;
 
-		spin_lock_irq(&wl->ws.lock);
-		idle_time_ns = ktime_to_ns(ktime_sub(now, wl->ws.last_time));
-		active = wl->ws.active;
-		spin_unlock_irq(&wl->ws.lock);
+		spin_lock_irq(&wl->ws->lock);
+		idle_time_ns = ktime_to_ns(ktime_sub(now, wl->ws->last_time));
+		active = wl->ws->active;
+		spin_unlock_irq(&wl->ws->lock);
 
 		if (idle_time_ns < ((u64)WL_GC_TIME_SEC * NSEC_PER_SEC))
 			break;
 
 		if (!active) {
-			wakeup_source_remove(&wl->ws);
+			wakeup_source_unregister(wl->ws);
 			rb_erase(&wl->node, &wakelocks_tree);
 			list_del(&wl->lru);
 			kfree(wl->name);
@@ -187,9 +187,15 @@
 		kfree(wl);
 		return ERR_PTR(-ENOMEM);
 	}
-	wl->ws.name = wl->name;
-	wl->ws.last_time = ktime_get();
-	wakeup_source_add(&wl->ws);
+
+	wl->ws = wakeup_source_register(NULL, wl->name);
+	if (!wl->ws) {
+		kfree(wl->name);
+		kfree(wl);
+		return ERR_PTR(-ENOMEM);
+	}
+	wl->ws->last_time = ktime_get();
+
 	rb_link_node(&wl->node, parent, node);
 	rb_insert_color(&wl->node, &wakelocks_tree);
 	wakelocks_lru_add(wl);
@@ -233,9 +239,9 @@
 		u64 timeout_ms = timeout_ns + NSEC_PER_MSEC - 1;
 
 		do_div(timeout_ms, NSEC_PER_MSEC);
-		__pm_wakeup_event(&wl->ws, timeout_ms);
+		__pm_wakeup_event(wl->ws, timeout_ms);
 	} else {
-		__pm_stay_awake(&wl->ws);
+		__pm_stay_awake(wl->ws);
 	}
 
 	wakelocks_lru_most_recent(wl);
@@ -271,7 +277,7 @@
 		ret = PTR_ERR(wl);
 		goto out;
 	}
-	__pm_relax(&wl->ws);
+	__pm_relax(wl->ws);
 
 	wakelocks_lru_most_recent(wl);
 	wakelocks_gc();
diff --git a/kernel/power/wakeup_reason.c b/kernel/power/wakeup_reason.c
new file mode 100644
index 0000000..b7e3e55
--- /dev/null
+++ b/kernel/power/wakeup_reason.c
@@ -0,0 +1,214 @@
+/*
+ * kernel/power/wakeup_reason.c
+ *
+ * Logs the reasons which caused the kernel to resume from
+ * the suspend mode.
+ *
+ * Copyright (C) 2014 Google, Inc.
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ */
+
+#include <linux/wakeup_reason.h>
+#include <linux/kernel.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/kobject.h>
+#include <linux/sysfs.h>
+#include <linux/init.h>
+#include <linux/spinlock.h>
+#include <linux/notifier.h>
+#include <linux/suspend.h>
+
+
+#define MAX_WAKEUP_REASON_IRQS 32
+static int irq_list[MAX_WAKEUP_REASON_IRQS];
+static int irqcount;
+static bool suspend_abort;
+static char abort_reason[MAX_SUSPEND_ABORT_LEN];
+static struct kobject *wakeup_reason;
+static spinlock_t resume_reason_lock;
+
+static ktime_t last_monotime; /* monotonic time before last suspend */
+static ktime_t curr_monotime; /* monotonic time after last suspend */
+static ktime_t last_stime; /* monotonic boottime offset before last suspend */
+static ktime_t curr_stime; /* monotonic boottime offset after last suspend */
+
+static ssize_t last_resume_reason_show(struct kobject *kobj, struct kobj_attribute *attr,
+		char *buf)
+{
+	int irq_no, buf_offset = 0;
+	struct irq_desc *desc;
+	unsigned long flags;
+	spin_lock_irqsave(&resume_reason_lock, flags);
+	if (suspend_abort) {
+		buf_offset = sprintf(buf, "Abort: %s", abort_reason);
+	} else {
+		for (irq_no = 0; irq_no < irqcount; irq_no++) {
+			desc = irq_to_desc(irq_list[irq_no]);
+			if (desc && desc->action && desc->action->name)
+				buf_offset += sprintf(buf + buf_offset, "%d %s\n",
+						irq_list[irq_no], desc->action->name);
+			else
+				buf_offset += sprintf(buf + buf_offset, "%d\n",
+						irq_list[irq_no]);
+		}
+	}
+	spin_unlock_irqrestore(&resume_reason_lock, flags);
+	return buf_offset;
+}
+
+static ssize_t last_suspend_time_show(struct kobject *kobj,
+			struct kobj_attribute *attr, char *buf)
+{
+	struct timespec sleep_time;
+	struct timespec total_time;
+	struct timespec suspend_resume_time;
+
+	/*
+	 * total_time is calculated from monotonic bootoffsets because
+	 * unlike CLOCK_MONOTONIC it include the time spent in suspend state.
+	 */
+	total_time = ktime_to_timespec(ktime_sub(curr_stime, last_stime));
+
+	/*
+	 * suspend_resume_time is calculated as monotonic (CLOCK_MONOTONIC)
+	 * time interval before entering suspend and post suspend.
+	 */
+	suspend_resume_time = ktime_to_timespec(ktime_sub(curr_monotime, last_monotime));
+
+	/* sleep_time = total_time - suspend_resume_time */
+	sleep_time = timespec_sub(total_time, suspend_resume_time);
+
+	/* Export suspend_resume_time and sleep_time in pair here. */
+	return sprintf(buf, "%lu.%09lu %lu.%09lu\n",
+				suspend_resume_time.tv_sec, suspend_resume_time.tv_nsec,
+				sleep_time.tv_sec, sleep_time.tv_nsec);
+}
+
+static struct kobj_attribute resume_reason = __ATTR_RO(last_resume_reason);
+static struct kobj_attribute suspend_time = __ATTR_RO(last_suspend_time);
+
+static struct attribute *attrs[] = {
+	&resume_reason.attr,
+	&suspend_time.attr,
+	NULL,
+};
+static struct attribute_group attr_group = {
+	.attrs = attrs,
+};
+
+/*
+ * logs all the wake up reasons to the kernel
+ * stores the irqs to expose them to the userspace via sysfs
+ */
+void log_wakeup_reason(int irq)
+{
+	struct irq_desc *desc;
+	unsigned long flags;
+	desc = irq_to_desc(irq);
+	if (desc && desc->action && desc->action->name)
+		printk(KERN_INFO "Resume caused by IRQ %d, %s\n", irq,
+				desc->action->name);
+	else
+		printk(KERN_INFO "Resume caused by IRQ %d\n", irq);
+
+	spin_lock_irqsave(&resume_reason_lock, flags);
+	if (irqcount == MAX_WAKEUP_REASON_IRQS) {
+		spin_unlock_irqrestore(&resume_reason_lock, flags);
+		printk(KERN_WARNING "Resume caused by more than %d IRQs\n",
+				MAX_WAKEUP_REASON_IRQS);
+		return;
+	}
+
+	irq_list[irqcount++] = irq;
+	spin_unlock_irqrestore(&resume_reason_lock, flags);
+}
+
+void log_suspend_abort_reason(const char *fmt, ...)
+{
+	unsigned long flags;
+	va_list args;
+
+	spin_lock_irqsave(&resume_reason_lock, flags);
+
+	//Suspend abort reason has already been logged.
+	if (suspend_abort) {
+		spin_unlock_irqrestore(&resume_reason_lock, flags);
+		return;
+	}
+
+	suspend_abort = true;
+	va_start(args, fmt);
+	vsnprintf(abort_reason, MAX_SUSPEND_ABORT_LEN, fmt, args);
+	va_end(args);
+	spin_unlock_irqrestore(&resume_reason_lock, flags);
+}
+
+/* Detects a suspend and clears all the previous wake up reasons*/
+static int wakeup_reason_pm_event(struct notifier_block *notifier,
+		unsigned long pm_event, void *unused)
+{
+	unsigned long flags;
+	switch (pm_event) {
+	case PM_SUSPEND_PREPARE:
+		spin_lock_irqsave(&resume_reason_lock, flags);
+		irqcount = 0;
+		suspend_abort = false;
+		spin_unlock_irqrestore(&resume_reason_lock, flags);
+		/* monotonic time since boot */
+		last_monotime = ktime_get();
+		/* monotonic time since boot including the time spent in suspend */
+		last_stime = ktime_get_boottime();
+		break;
+	case PM_POST_SUSPEND:
+		/* monotonic time since boot */
+		curr_monotime = ktime_get();
+		/* monotonic time since boot including the time spent in suspend */
+		curr_stime = ktime_get_boottime();
+		break;
+	default:
+		break;
+	}
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block wakeup_reason_pm_notifier_block = {
+	.notifier_call = wakeup_reason_pm_event,
+};
+
+/* Initializes the sysfs parameter
+ * registers the pm_event notifier
+ */
+int __init wakeup_reason_init(void)
+{
+	int retval;
+	spin_lock_init(&resume_reason_lock);
+	retval = register_pm_notifier(&wakeup_reason_pm_notifier_block);
+	if (retval)
+		printk(KERN_WARNING "[%s] failed to register PM notifier %d\n",
+				__func__, retval);
+
+	wakeup_reason = kobject_create_and_add("wakeup_reasons", kernel_kobj);
+	if (!wakeup_reason) {
+		printk(KERN_WARNING "[%s] failed to create a sysfs kobject\n",
+				__func__);
+		return 1;
+	}
+	retval = sysfs_create_group(wakeup_reason, &attr_group);
+	if (retval) {
+		kobject_put(wakeup_reason);
+		printk(KERN_WARNING "[%s] failed to create a sysfs group %d\n",
+				__func__, retval);
+	}
+	return 0;
+}
+
+late_initcall(wakeup_reason_init);
diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile
index 7fe1834..daa5bca 100644
--- a/kernel/sched/Makefile
+++ b/kernel/sched/Makefile
@@ -24,8 +24,10 @@
 obj-$(CONFIG_SCHED_AUTOGROUP) += autogroup.o
 obj-$(CONFIG_SCHEDSTATS) += stats.o
 obj-$(CONFIG_SCHED_DEBUG) += debug.o
+obj-$(CONFIG_SCHED_TUNE) += tune.o
 obj-$(CONFIG_CGROUP_CPUACCT) += cpuacct.o
 obj-$(CONFIG_CPU_FREQ) += cpufreq.o
 obj-$(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) += cpufreq_schedutil.o
 obj-$(CONFIG_MEMBARRIER) += membarrier.o
 obj-$(CONFIG_CPU_ISOLATION) += isolation.o
+obj-$(CONFIG_PSI) += psi.o
diff --git a/kernel/sched/autogroup.c b/kernel/sched/autogroup.c
index 2d4ff53..2067080 100644
--- a/kernel/sched/autogroup.c
+++ b/kernel/sched/autogroup.c
@@ -259,7 +259,6 @@
 }
 #endif /* CONFIG_PROC_FS */
 
-#ifdef CONFIG_SCHED_DEBUG
 int autogroup_path(struct task_group *tg, char *buf, int buflen)
 {
 	if (!task_group_is_autogroup(tg))
@@ -267,4 +266,3 @@
 
 	return snprintf(buf, buflen, "%s-%ld", "/autogroup", tg->autogroup->id);
 }
-#endif
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 2befd2c..41a90ce 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -10,6 +10,7 @@
 #include <linux/nospec.h>
 
 #include <linux/kcov.h>
+#include <linux/scs.h>
 
 #include <asm/switch_to.h>
 #include <asm/tlb.h>
@@ -181,6 +182,7 @@
 	if ((irq_delta + steal) && sched_feat(NONTASK_CAPACITY))
 		update_irq_load_avg(rq, irq_delta + steal);
 #endif
+	update_rq_clock_pelt(rq, delta);
 }
 
 void update_rq_clock(struct rq *rq)
@@ -413,6 +415,8 @@
 	if (cmpxchg_relaxed(&node->next, NULL, WAKE_Q_TAIL))
 		return;
 
+	head->count++;
+
 	get_task_struct(task);
 
 	/*
@@ -422,6 +426,10 @@
 	head->lastp = &node->next;
 }
 
+static int
+try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags,
+	       int sibling_count_hint);
+
 void wake_up_q(struct wake_q_head *head)
 {
 	struct wake_q_node *node = head->first;
@@ -436,10 +444,10 @@
 		task->wake_q.next = NULL;
 
 		/*
-		 * wake_up_process() executes a full barrier, which pairs with
+		 * try_to_wake_up() executes a full barrier, which pairs with
 		 * the queueing in wake_q_add() so as not to miss wakeups.
 		 */
-		wake_up_process(task);
+		try_to_wake_up(task, TASK_NORMAL, 0, head->count);
 		put_task_struct(task);
 	}
 }
@@ -702,6 +710,7 @@
 	if (idle_policy(p->policy)) {
 		load->weight = scale_load(WEIGHT_IDLEPRIO);
 		load->inv_weight = WMULT_IDLEPRIO;
+		p->se.runnable_weight = load->weight;
 		return;
 	}
 
@@ -714,6 +723,7 @@
 	} else {
 		load->weight = scale_load(sched_prio_to_weight[prio]);
 		load->inv_weight = sched_prio_to_wmult[prio];
+		p->se.runnable_weight = load->weight;
 	}
 }
 
@@ -722,8 +732,10 @@
 	if (!(flags & ENQUEUE_NOCLOCK))
 		update_rq_clock(rq);
 
-	if (!(flags & ENQUEUE_RESTORE))
+	if (!(flags & ENQUEUE_RESTORE)) {
 		sched_info_queued(rq, p);
+		psi_enqueue(p, flags & ENQUEUE_WAKEUP);
+	}
 
 	p->sched_class->enqueue_task(rq, p, flags);
 }
@@ -733,8 +745,10 @@
 	if (!(flags & DEQUEUE_NOCLOCK))
 		update_rq_clock(rq);
 
-	if (!(flags & DEQUEUE_SAVE))
+	if (!(flags & DEQUEUE_SAVE)) {
 		sched_info_dequeued(rq, p);
+		psi_dequeue(p, flags & DEQUEUE_SLEEP);
+	}
 
 	p->sched_class->dequeue_task(rq, p, flags);
 }
@@ -1524,12 +1538,14 @@
  * The caller (fork, wakeup) owns p->pi_lock, ->cpus_allowed is stable.
  */
 static inline
-int select_task_rq(struct task_struct *p, int cpu, int sd_flags, int wake_flags)
+int select_task_rq(struct task_struct *p, int cpu, int sd_flags, int wake_flags,
+		   int sibling_count_hint)
 {
 	lockdep_assert_held(&p->pi_lock);
 
 	if (p->nr_cpus_allowed > 1)
-		cpu = p->sched_class->select_task_rq(p, cpu, sd_flags, wake_flags);
+		cpu = p->sched_class->select_task_rq(p, cpu, sd_flags, wake_flags,
+						     sibling_count_hint);
 	else
 		cpu = cpumask_any(&p->cpus_allowed);
 
@@ -1932,6 +1948,8 @@
  * @p: the thread to be awakened
  * @state: the mask of task states that can be woken
  * @wake_flags: wake modifier flags (WF_*)
+ * @sibling_count_hint: A hint at the number of threads that are being woken up
+ *                      in this event.
  *
  * If (@state & @p->state) @p->state = TASK_RUNNING.
  *
@@ -1947,7 +1965,8 @@
  *	   %false otherwise.
  */
 static int
-try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
+try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags,
+	       int sibling_count_hint)
 {
 	unsigned long flags;
 	int cpu, success = 0;
@@ -2034,9 +2053,11 @@
 		atomic_dec(&task_rq(p)->nr_iowait);
 	}
 
-	cpu = select_task_rq(p, p->wake_cpu, SD_BALANCE_WAKE, wake_flags);
+	cpu = select_task_rq(p, p->wake_cpu, SD_BALANCE_WAKE, wake_flags,
+			     sibling_count_hint);
 	if (task_cpu(p) != cpu) {
 		wake_flags |= WF_MIGRATED;
+		psi_ttwu_dequeue(p);
 		set_task_cpu(p, cpu);
 	}
 
@@ -2121,13 +2142,13 @@
  */
 int wake_up_process(struct task_struct *p)
 {
-	return try_to_wake_up(p, TASK_NORMAL, 0);
+	return try_to_wake_up(p, TASK_NORMAL, 0, 1);
 }
 EXPORT_SYMBOL(wake_up_process);
 
 int wake_up_state(struct task_struct *p, unsigned int state)
 {
-	return try_to_wake_up(p, state, 0);
+	return try_to_wake_up(p, state, 0, 1);
 }
 
 /*
@@ -2409,7 +2430,7 @@
 	 * as we're not fully set-up yet.
 	 */
 	p->recent_used_cpu = task_cpu(p);
-	__set_task_cpu(p, select_task_rq(p, task_cpu(p), SD_BALANCE_FORK, 0));
+	__set_task_cpu(p, select_task_rq(p, task_cpu(p), SD_BALANCE_FORK, 0, 1));
 #endif
 	rq = __task_rq_lock(p, &rf);
 	update_rq_clock(rq);
@@ -2948,7 +2969,7 @@
 	int dest_cpu;
 
 	raw_spin_lock_irqsave(&p->pi_lock, flags);
-	dest_cpu = p->sched_class->select_task_rq(p, task_cpu(p), SD_BALANCE_EXEC, 0);
+	dest_cpu = p->sched_class->select_task_rq(p, task_cpu(p), SD_BALANCE_EXEC, 0, 1);
 	if (dest_cpu == smp_processor_id())
 		goto unlock;
 
@@ -3051,6 +3072,7 @@
 	curr->sched_class->task_tick(rq, curr, 0);
 	cpu_load_update_active(rq);
 	calc_global_load_tick(rq);
+	psi_task_tick(rq);
 
 	rq_unlock(rq, &rf);
 
@@ -3750,7 +3772,7 @@
 int default_wake_function(wait_queue_entry_t *curr, unsigned mode, int wake_flags,
 			  void *key)
 {
-	return try_to_wake_up(curr->private, mode, wake_flags);
+	return try_to_wake_up(curr->private, mode, wake_flags, 1);
 }
 EXPORT_SYMBOL(default_wake_function);
 
@@ -4974,9 +4996,7 @@
 	struct rq_flags rf;
 	struct rq *rq;
 
-	local_irq_disable();
-	rq = this_rq();
-	rq_lock(rq, &rf);
+	rq = this_rq_lock_irq(&rf);
 
 	schedstat_inc(rq->yld_count);
 	current->sched_class->yield_task(rq);
@@ -5422,6 +5442,7 @@
 	idle->se.exec_start = sched_clock();
 	idle->flags |= PF_IDLE;
 
+	scs_task_reset(idle);
 	kasan_unpoison_task_stack(idle);
 
 #ifdef CONFIG_SMP
@@ -6117,6 +6138,8 @@
 
 	init_schedstats();
 
+	psi_init();
+
 	scheduler_running = 1;
 }
 
diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
index 1b7ec82..4a00ea9 100644
--- a/kernel/sched/cpufreq_schedutil.c
+++ b/kernel/sched/cpufreq_schedutil.c
@@ -13,11 +13,13 @@
 
 #include "sched.h"
 
+#include <linux/sched/cpufreq.h>
 #include <trace/events/power.h>
 
 struct sugov_tunables {
 	struct gov_attr_set	attr_set;
-	unsigned int		rate_limit_us;
+	unsigned int		up_rate_limit_us;
+	unsigned int		down_rate_limit_us;
 };
 
 struct sugov_policy {
@@ -28,7 +30,9 @@
 
 	raw_spinlock_t		update_lock;	/* For shared policies */
 	u64			last_freq_update_time;
-	s64			freq_update_delay_ns;
+	s64			min_rate_limit_ns;
+	s64			up_rate_delay_ns;
+	s64			down_rate_delay_ns;
 	unsigned int		next_freq;
 	unsigned int		cached_raw_freq;
 
@@ -95,9 +99,32 @@
 		return true;
 	}
 
+	/* No need to recalculate next freq for min_rate_limit_us
+	 * at least. However we might still decide to further rate
+	 * limit once frequency change direction is decided, according
+	 * to the separate rate limits.
+	 */
+
+	delta_ns = time - sg_policy->last_freq_update_time;
+	return delta_ns >= sg_policy->min_rate_limit_ns;
+}
+
+static bool sugov_up_down_rate_limit(struct sugov_policy *sg_policy, u64 time,
+				     unsigned int next_freq)
+{
+	s64 delta_ns;
+
 	delta_ns = time - sg_policy->last_freq_update_time;
 
-	return delta_ns >= sg_policy->freq_update_delay_ns;
+	if (next_freq > sg_policy->next_freq &&
+	    delta_ns < sg_policy->up_rate_delay_ns)
+			return true;
+
+	if (next_freq < sg_policy->next_freq &&
+	    delta_ns < sg_policy->down_rate_delay_ns)
+			return true;
+
+	return false;
 }
 
 static bool sugov_update_next_freq(struct sugov_policy *sg_policy, u64 time,
@@ -106,6 +133,9 @@
 	if (sg_policy->next_freq == next_freq)
 		return false;
 
+	if (sugov_up_down_rate_limit(sg_policy, time, next_freq))
+		return false;
+
 	sg_policy->next_freq = next_freq;
 	sg_policy->last_freq_update_time = time;
 
@@ -174,7 +204,7 @@
 	unsigned int freq = arch_scale_freq_invariant() ?
 				policy->cpuinfo.max_freq : policy->cur;
 
-	freq = (freq + (freq >> 2)) * util / max;
+	freq = map_util_freq(util, freq, max);
 
 	if (freq == sg_policy->cached_raw_freq && !sg_policy->need_freq_update)
 		return sg_policy->next_freq;
@@ -196,6 +226,9 @@
  * Where the cfs,rt and dl util numbers are tracked with the same metric and
  * synchronized windows and are thus directly comparable.
  *
+ * The @util parameter passed to this function is assumed to be the aggregation
+ * of RT and CFS util numbers. The cases of DL and IRQ are managed here.
+ *
  * The cfs,rt,dl utilization are the running times measured with rq->clock_task
  * which excludes things like IRQ and steal-time. These latter are then accrued
  * in the irq utilization.
@@ -204,15 +237,14 @@
  * based on the task model parameters and gives the minimal utilization
  * required to meet deadlines.
  */
-static unsigned long sugov_get_util(struct sugov_cpu *sg_cpu)
+unsigned long schedutil_freq_util(int cpu, unsigned long util,
+				  unsigned long max, enum schedutil_type type)
 {
-	struct rq *rq = cpu_rq(sg_cpu->cpu);
-	unsigned long util, irq, max;
+	unsigned long dl_util, irq;
+	struct rq *rq = cpu_rq(cpu);
 
-	sg_cpu->max = max = arch_scale_cpu_capacity(NULL, sg_cpu->cpu);
-	sg_cpu->bw_dl = cpu_bw_dl(rq);
-
-	if (rt_rq_is_runnable(&rq->rt))
+	if (sched_feat(SUGOV_RT_MAX_FREQ) && type == FREQUENCY_UTIL &&
+						rt_rq_is_runnable(&rq->rt))
 		return max;
 
 	/*
@@ -225,27 +257,33 @@
 		return max;
 
 	/*
-	 * Because the time spend on RT/DL tasks is visible as 'lost' time to
-	 * CFS tasks and we use the same metric to track the effective
-	 * utilization (PELT windows are synchronized) we can directly add them
-	 * to obtain the CPU's actual utilization.
+	 * The function is called with @util defined as the aggregation (the
+	 * sum) of RT and CFS signals, hence leaving the special case of DL
+	 * to be delt with. The exact way of doing things depend on the calling
+	 * context.
 	 */
-	util = cpu_util_cfs(rq);
-	util += cpu_util_rt(rq);
+	dl_util = cpu_util_dl(rq);
 
 	/*
-	 * We do not make cpu_util_dl() a permanent part of this sum because we
-	 * want to use cpu_bw_dl() later on, but we need to check if the
-	 * CFS+RT+DL sum is saturated (ie. no idle time) such that we select
-	 * f_max when there is no idle time.
+	 * For frequency selection we do not make cpu_util_dl() a permanent part
+	 * of this sum because we want to use cpu_bw_dl() later on, but we need
+	 * to check if the CFS+RT+DL sum is saturated (ie. no idle time) such
+	 * that we select f_max when there is no idle time.
 	 *
 	 * NOTE: numerical errors or stop class might cause us to not quite hit
 	 * saturation when we should -- something for later.
 	 */
-	if ((util + cpu_util_dl(rq)) >= max)
+	if (util + dl_util >= max)
 		return max;
 
 	/*
+	 * OTOH, for energy computation we need the estimated running time, so
+	 * include util_dl and ignore dl_bw.
+	 */
+	if (type == ENERGY_UTIL)
+		util += dl_util;
+
+	/*
 	 * There is still idle time; further improve the number by using the
 	 * irq metric. Because IRQ/steal time is hidden from the task clock we
 	 * need to scale the task numbers:
@@ -267,7 +305,22 @@
 	 * bw_dl as requested freq. However, cpufreq is not yet ready for such
 	 * an interface. So, we only do the latter for now.
 	 */
-	return min(max, util + sg_cpu->bw_dl);
+	if (type == FREQUENCY_UTIL)
+		util += cpu_bw_dl(rq);
+
+	return min(max, util);
+}
+
+static unsigned long sugov_get_util(struct sugov_cpu *sg_cpu)
+{
+	struct rq *rq = cpu_rq(sg_cpu->cpu);
+	unsigned long util = boosted_cpu_util(sg_cpu->cpu, cpu_util_rt(rq));
+	unsigned long max = arch_scale_cpu_capacity(NULL, sg_cpu->cpu);
+
+	sg_cpu->max = max;
+	sg_cpu->bw_dl = cpu_bw_dl(rq);
+
+	return schedutil_freq_util(sg_cpu->cpu, util, max, FREQUENCY_UTIL);
 }
 
 /**
@@ -559,15 +612,32 @@
 	return container_of(attr_set, struct sugov_tunables, attr_set);
 }
 
-static ssize_t rate_limit_us_show(struct gov_attr_set *attr_set, char *buf)
+static DEFINE_MUTEX(min_rate_lock);
+
+static void update_min_rate_limit_ns(struct sugov_policy *sg_policy)
+{
+	mutex_lock(&min_rate_lock);
+	sg_policy->min_rate_limit_ns = min(sg_policy->up_rate_delay_ns,
+					   sg_policy->down_rate_delay_ns);
+	mutex_unlock(&min_rate_lock);
+}
+
+static ssize_t up_rate_limit_us_show(struct gov_attr_set *attr_set, char *buf)
 {
 	struct sugov_tunables *tunables = to_sugov_tunables(attr_set);
 
-	return sprintf(buf, "%u\n", tunables->rate_limit_us);
+	return sprintf(buf, "%u\n", tunables->up_rate_limit_us);
 }
 
-static ssize_t
-rate_limit_us_store(struct gov_attr_set *attr_set, const char *buf, size_t count)
+static ssize_t down_rate_limit_us_show(struct gov_attr_set *attr_set, char *buf)
+{
+	struct sugov_tunables *tunables = to_sugov_tunables(attr_set);
+
+	return sprintf(buf, "%u\n", tunables->down_rate_limit_us);
+}
+
+static ssize_t up_rate_limit_us_store(struct gov_attr_set *attr_set,
+				      const char *buf, size_t count)
 {
 	struct sugov_tunables *tunables = to_sugov_tunables(attr_set);
 	struct sugov_policy *sg_policy;
@@ -576,18 +646,42 @@
 	if (kstrtouint(buf, 10, &rate_limit_us))
 		return -EINVAL;
 
-	tunables->rate_limit_us = rate_limit_us;
+	tunables->up_rate_limit_us = rate_limit_us;
 
-	list_for_each_entry(sg_policy, &attr_set->policy_list, tunables_hook)
-		sg_policy->freq_update_delay_ns = rate_limit_us * NSEC_PER_USEC;
+	list_for_each_entry(sg_policy, &attr_set->policy_list, tunables_hook) {
+		sg_policy->up_rate_delay_ns = rate_limit_us * NSEC_PER_USEC;
+		update_min_rate_limit_ns(sg_policy);
+	}
 
 	return count;
 }
 
-static struct governor_attr rate_limit_us = __ATTR_RW(rate_limit_us);
+static ssize_t down_rate_limit_us_store(struct gov_attr_set *attr_set,
+					const char *buf, size_t count)
+{
+	struct sugov_tunables *tunables = to_sugov_tunables(attr_set);
+	struct sugov_policy *sg_policy;
+	unsigned int rate_limit_us;
+
+	if (kstrtouint(buf, 10, &rate_limit_us))
+		return -EINVAL;
+
+	tunables->down_rate_limit_us = rate_limit_us;
+
+	list_for_each_entry(sg_policy, &attr_set->policy_list, tunables_hook) {
+		sg_policy->down_rate_delay_ns = rate_limit_us * NSEC_PER_USEC;
+		update_min_rate_limit_ns(sg_policy);
+	}
+
+	return count;
+}
+
+static struct governor_attr up_rate_limit_us = __ATTR_RW(up_rate_limit_us);
+static struct governor_attr down_rate_limit_us = __ATTR_RW(down_rate_limit_us);
 
 static struct attribute *sugov_attributes[] = {
-	&rate_limit_us.attr,
+	&up_rate_limit_us.attr,
+	&down_rate_limit_us.attr,
 	NULL
 };
 
@@ -598,7 +692,7 @@
 
 /********************** cpufreq governor interface *********************/
 
-static struct cpufreq_governor schedutil_gov;
+struct cpufreq_governor schedutil_gov;
 
 static struct sugov_policy *sugov_policy_alloc(struct cpufreq_policy *policy)
 {
@@ -743,7 +837,8 @@
 		goto stop_kthread;
 	}
 
-	tunables->rate_limit_us = cpufreq_policy_transition_delay_us(policy);
+	tunables->up_rate_limit_us = cpufreq_policy_transition_delay_us(policy);
+	tunables->down_rate_limit_us = cpufreq_policy_transition_delay_us(policy);
 
 	policy->governor_data = sg_policy;
 	sg_policy->tunables = tunables;
@@ -802,7 +897,11 @@
 	struct sugov_policy *sg_policy = policy->governor_data;
 	unsigned int cpu;
 
-	sg_policy->freq_update_delay_ns	= sg_policy->tunables->rate_limit_us * NSEC_PER_USEC;
+	sg_policy->up_rate_delay_ns =
+		sg_policy->tunables->up_rate_limit_us * NSEC_PER_USEC;
+	sg_policy->down_rate_delay_ns =
+		sg_policy->tunables->down_rate_limit_us * NSEC_PER_USEC;
+	update_min_rate_limit_ns(sg_policy);
 	sg_policy->last_freq_update_time	= 0;
 	sg_policy->next_freq			= 0;
 	sg_policy->work_in_progress		= false;
@@ -861,7 +960,7 @@
 	sg_policy->limits_changed = true;
 }
 
-static struct cpufreq_governor schedutil_gov = {
+struct cpufreq_governor schedutil_gov = {
 	.name			= "schedutil",
 	.owner			= THIS_MODULE,
 	.dynamic_switching	= true,
@@ -884,3 +983,36 @@
 	return cpufreq_register_governor(&schedutil_gov);
 }
 fs_initcall(sugov_register);
+
+#ifdef CONFIG_ENERGY_MODEL
+extern bool sched_energy_update;
+extern struct mutex sched_energy_mutex;
+
+static void rebuild_sd_workfn(struct work_struct *work)
+{
+	mutex_lock(&sched_energy_mutex);
+	sched_energy_update = true;
+	rebuild_sched_domains();
+	sched_energy_update = false;
+	mutex_unlock(&sched_energy_mutex);
+}
+static DECLARE_WORK(rebuild_sd_work, rebuild_sd_workfn);
+
+/*
+ * EAS shouldn't be attempted without sugov, so rebuild the sched_domains
+ * on governor changes to make sure the scheduler knows about it.
+ */
+void sched_cpufreq_governor_change(struct cpufreq_policy *policy,
+				  struct cpufreq_governor *old_gov)
+{
+	if (old_gov == &schedutil_gov || policy->governor == &schedutil_gov) {
+		/*
+		 * When called from the cpufreq_register_driver() path, the
+		 * cpu_hotplug_lock is already held, so use a work item to
+		 * avoid nested locking in rebuild_sched_domains().
+		 */
+		schedule_work(&rebuild_sd_work);
+	}
+
+}
+#endif
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
index 54eb945..2d1b04f 100644
--- a/kernel/sched/cputime.c
+++ b/kernel/sched/cputime.c
@@ -1,6 +1,7 @@
 /*
  * Simple CPU accounting cgroup controller
  */
+#include <linux/cpufreq_times.h>
 #include "sched.h"
 
 #ifdef CONFIG_IRQ_TIME_ACCOUNTING
@@ -128,6 +129,9 @@
 
 	/* Account for user time used */
 	acct_account_cputime(p);
+
+	/* Account power usage for user time */
+	cpufreq_acct_update_power(p, cputime);
 }
 
 /*
@@ -172,6 +176,9 @@
 
 	/* Account for system time used */
 	acct_account_cputime(p);
+
+	/* Account power usage for system time */
+	cpufreq_acct_update_power(p, cputime);
 }
 
 /*
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index ebec37c..84cfedc 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -1599,7 +1599,8 @@
 static int find_later_rq(struct task_struct *task);
 
 static int
-select_task_rq_dl(struct task_struct *p, int cpu, int sd_flag, int flags)
+select_task_rq_dl(struct task_struct *p, int cpu, int sd_flag, int flags,
+		  int sibling_count_hint)
 {
 	struct task_struct *curr;
 	struct rq *rq;
@@ -1793,7 +1794,7 @@
 	deadline_queue_push_tasks(rq);
 
 	if (rq->curr->sched_class != &dl_sched_class)
-		update_dl_rq_load_avg(rq_clock_task(rq), rq, 0);
+		update_dl_rq_load_avg(rq_clock_pelt(rq), rq, 0);
 
 	return p;
 }
@@ -1802,7 +1803,7 @@
 {
 	update_curr_dl(rq);
 
-	update_dl_rq_load_avg(rq_clock_task(rq), rq, 1);
+	update_dl_rq_load_avg(rq_clock_pelt(rq), rq, 1);
 	if (on_dl_rq(&p->dl) && p->nr_cpus_allowed > 1)
 		enqueue_pushable_dl_task(rq, p);
 }
@@ -1819,7 +1820,7 @@
 {
 	update_curr_dl(rq);
 
-	update_dl_rq_load_avg(rq_clock_task(rq), rq, 1);
+	update_dl_rq_load_avg(rq_clock_pelt(rq), rq, 1);
 	/*
 	 * Even when we have runtime, update_curr_dl() might have resulted in us
 	 * not being the leftmost task anymore. In that case NEED_RESCHED will
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index f0abb8f..00b9fbf 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -41,6 +41,16 @@
 unsigned int normalized_sysctl_sched_latency		= 6000000ULL;
 
 /*
+ * Enable/disable honoring sync flag in energy-aware wakeups.
+ */
+unsigned int sysctl_sched_sync_hint_enable = 1;
+
+/*
+ * Enable/disable using cstate knowledge in idle sibling selection
+ */
+unsigned int sysctl_sched_cstate_aware = 1;
+
+/*
  * The initial- and re-scaling of tunables is configurable
  *
  * Options are:
@@ -248,13 +258,6 @@
  */
 
 #ifdef CONFIG_FAIR_GROUP_SCHED
-
-/* cpu runqueue to which this cfs_rq is attached */
-static inline struct rq *rq_of(struct cfs_rq *cfs_rq)
-{
-	return cfs_rq->rq;
-}
-
 static inline struct task_struct *task_of(struct sched_entity *se)
 {
 	SCHED_WARN_ON(!entity_is_task(se));
@@ -410,12 +413,6 @@
 	return container_of(se, struct task_struct, se);
 }
 
-static inline struct rq *rq_of(struct cfs_rq *cfs_rq)
-{
-	return container_of(cfs_rq, struct rq, cfs);
-}
-
-
 #define for_each_sched_entity(se) \
 		for (; se; se = NULL)
 
@@ -686,12 +683,12 @@
 	return calc_delta_fair(sched_slice(cfs_rq, se), se);
 }
 
-#ifdef CONFIG_SMP
 #include "pelt.h"
-#include "sched-pelt.h"
+#ifdef CONFIG_SMP
 
 static int select_idle_sibling(struct task_struct *p, int prev_cpu, int cpu);
 static unsigned long task_h_load(struct task_struct *p);
+static unsigned long capacity_of(int cpu);
 
 /* Give new sched_entity start runnable values to heavy its load in infant time */
 void init_entity_runnable_average(struct sched_entity *se)
@@ -775,7 +772,7 @@
 			 * such that the next switched_to_fair() has the
 			 * expected state.
 			 */
-			se->avg.last_update_time = cfs_rq_clock_task(cfs_rq);
+			se->avg.last_update_time = cfs_rq_clock_pelt(cfs_rq);
 			return;
 		}
 	}
@@ -940,6 +937,7 @@
 			}
 
 			trace_sched_stat_blocked(tsk, delta);
+			trace_sched_blocked_reason(tsk);
 
 			/*
 			 * Blocking time is in units of nanosecs, so shift by
@@ -1486,7 +1484,6 @@
 static unsigned long weighted_cpuload(struct rq *rq);
 static unsigned long source_load(int cpu, int type);
 static unsigned long target_load(int cpu, int type);
-static unsigned long capacity_of(int cpu);
 
 /* Cached statistics for all CPUs within a node */
 struct numa_stats {
@@ -3143,6 +3140,8 @@
 	if (force || abs(delta) > cfs_rq->tg_load_avg_contrib / 64) {
 		atomic_long_add(delta, &cfs_rq->tg->load_avg);
 		cfs_rq->tg_load_avg_contrib = cfs_rq->avg.load_avg;
+
+		trace_sched_load_tg(cfs_rq);
 	}
 }
 
@@ -3191,7 +3190,7 @@
 	p_last_update_time = prev->avg.last_update_time;
 	n_last_update_time = next->avg.last_update_time;
 #endif
-	__update_load_avg_blocked_se(p_last_update_time, cpu_of(rq_of(prev)), se);
+	__update_load_avg_blocked_se(p_last_update_time, se);
 	se->avg.last_update_time = n_last_update_time;
 }
 
@@ -3326,11 +3325,11 @@
 
 	/*
 	 * runnable_sum can't be lower than running_sum
-	 * As running sum is scale with CPU capacity wehreas the runnable sum
-	 * is not we rescale running_sum 1st
+	 * Rescale running sum to be in the same range as runnable sum
+	 * running_sum is in [0 : LOAD_AVG_MAX <<  SCHED_CAPACITY_SHIFT]
+	 * runnable_sum is in [0 : LOAD_AVG_MAX]
 	 */
-	running_sum = se->avg.util_sum /
-		arch_scale_cpu_capacity(NULL, cpu_of(rq_of(cfs_rq)));
+	running_sum = se->avg.util_sum >> SCHED_CAPACITY_SHIFT;
 	runnable_sum = max(runnable_sum, running_sum);
 
 	load_sum = (s64)se_weight(se) * runnable_sum;
@@ -3385,6 +3384,9 @@
 	update_tg_cfs_util(cfs_rq, se, gcfs_rq);
 	update_tg_cfs_runnable(cfs_rq, se, gcfs_rq);
 
+	trace_sched_load_cfs_rq(cfs_rq);
+	trace_sched_load_se(se);
+
 	return 1;
 }
 
@@ -3433,7 +3435,7 @@
 
 /**
  * update_cfs_rq_load_avg - update the cfs_rq's load/util averages
- * @now: current time, as per cfs_rq_clock_task()
+ * @now: current time, as per cfs_rq_clock_pelt()
  * @cfs_rq: cfs_rq to update
  *
  * The cfs_rq avg is the direct sum of all its entities (blocked and runnable)
@@ -3478,7 +3480,7 @@
 		decayed = 1;
 	}
 
-	decayed |= __update_load_avg_cfs_rq(now, cpu_of(rq_of(cfs_rq)), cfs_rq);
+	decayed |= __update_load_avg_cfs_rq(now, cfs_rq);
 
 #ifndef CONFIG_64BIT
 	smp_wmb();
@@ -3537,6 +3539,8 @@
 	add_tg_cfs_propagate(cfs_rq, se->avg.load_sum);
 
 	cfs_rq_util_change(cfs_rq, flags);
+
+	trace_sched_load_cfs_rq(cfs_rq);
 }
 
 /**
@@ -3556,6 +3560,8 @@
 	add_tg_cfs_propagate(cfs_rq, -se->avg.load_sum);
 
 	cfs_rq_util_change(cfs_rq, 0);
+
+	trace_sched_load_cfs_rq(cfs_rq);
 }
 
 /*
@@ -3568,9 +3574,7 @@
 /* Update task and its cfs_rq load average */
 static inline void update_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
 {
-	u64 now = cfs_rq_clock_task(cfs_rq);
-	struct rq *rq = rq_of(cfs_rq);
-	int cpu = cpu_of(rq);
+	u64 now = cfs_rq_clock_pelt(cfs_rq);
 	int decayed;
 
 	/*
@@ -3578,7 +3582,7 @@
 	 * track group sched_entity load average for task_h_load calc in migration
 	 */
 	if (se->avg.last_update_time && !(flags & SKIP_AGE_LOAD))
-		__update_load_avg_se(now, cpu, cfs_rq, se);
+		__update_load_avg_se(now, cfs_rq, se);
 
 	decayed  = update_cfs_rq_load_avg(now, cfs_rq);
 	decayed |= propagate_entity_load_avg(se);
@@ -3630,7 +3634,7 @@
 	u64 last_update_time;
 
 	last_update_time = cfs_rq_last_update_time(cfs_rq);
-	__update_load_avg_blocked_se(last_update_time, cpu_of(rq_of(cfs_rq)), se);
+	__update_load_avg_blocked_se(last_update_time, se);
 }
 
 /*
@@ -3703,6 +3707,10 @@
 	enqueued  = cfs_rq->avg.util_est.enqueued;
 	enqueued += (_task_util_est(p) | UTIL_AVG_UNCHANGED);
 	WRITE_ONCE(cfs_rq->avg.util_est.enqueued, enqueued);
+
+	/* Update plots for Task and CPU estimated utilization */
+	trace_sched_util_est_task(p, &p->se.avg);
+	trace_sched_util_est_cpu(cpu_of(rq_of(cfs_rq)), cfs_rq);
 }
 
 /*
@@ -3723,6 +3731,7 @@
 {
 	long last_ewma_diff;
 	struct util_est ue;
+	int cpu;
 
 	if (!sched_feat(UTIL_EST))
 		return;
@@ -3733,6 +3742,9 @@
 			     (_task_util_est(p) | UTIL_AVG_UNCHANGED));
 	WRITE_ONCE(cfs_rq->avg.util_est.enqueued, ue.enqueued);
 
+	/* Update plots for CPU's estimated utilization */
+	trace_sched_util_est_cpu(cpu_of(rq_of(cfs_rq)), cfs_rq);
+
 	/*
 	 * Skip update of task's estimated utilization when the task has not
 	 * yet completed an activation, e.g. being migrated.
@@ -3758,6 +3770,14 @@
 		return;
 
 	/*
+	 * To avoid overestimation of actual task utilization, skip updates if
+	 * we cannot grant there is idle time in this CPU.
+	 */
+	cpu = cpu_of(rq_of(cfs_rq));
+	if (task_util(p) > capacity_orig_of(cpu))
+		return;
+
+	/*
 	 * Update Task's estimated utilization
 	 *
 	 * When *p completes an activation we can consolidate another sample
@@ -3778,6 +3798,32 @@
 	ue.ewma  += last_ewma_diff;
 	ue.ewma >>= UTIL_EST_WEIGHT_SHIFT;
 	WRITE_ONCE(p->se.avg.util_est, ue);
+
+	/* Update plots for Task's estimated utilization */
+	trace_sched_util_est_task(p, &p->se.avg);
+}
+
+static inline int task_fits_capacity(struct task_struct *p, long capacity)
+{
+	return capacity * 1024 > task_util_est(p) * capacity_margin;
+}
+
+static inline void update_misfit_status(struct task_struct *p, struct rq *rq)
+{
+	if (!static_branch_unlikely(&sched_asym_cpucapacity))
+		return;
+
+	if (!p) {
+		rq->misfit_task_load = 0;
+		return;
+	}
+
+	if (task_fits_capacity(p, capacity_of(cpu_of(rq)))) {
+		rq->misfit_task_load = 0;
+		return;
+	}
+
+	rq->misfit_task_load = task_h_load(p);
 }
 
 #else /* CONFIG_SMP */
@@ -3809,6 +3855,7 @@
 static inline void
 util_est_dequeue(struct cfs_rq *cfs_rq, struct task_struct *p,
 		 bool task_sleep) {}
+static inline void update_misfit_status(struct task_struct *p, struct rq *rq) {}
 
 #endif /* CONFIG_SMP */
 
@@ -5100,6 +5147,26 @@
 }
 #endif
 
+#ifdef CONFIG_SMP
+static inline unsigned long cpu_util(int cpu);
+static unsigned long capacity_of(int cpu);
+
+static inline bool cpu_overutilized(int cpu)
+{
+	return (capacity_of(cpu) * 1024) < (cpu_util(cpu) * capacity_margin);
+}
+
+static inline void update_overutilized_status(struct rq *rq)
+{
+	if (!READ_ONCE(rq->rd->overutilized) && cpu_overutilized(rq->cpu)) {
+		WRITE_ONCE(rq->rd->overutilized, SG_OVERUTILIZED);
+		trace_sched_overutilized(1);
+	}
+}
+#else
+static inline void update_overutilized_status(struct rq *rq) { }
+#endif
+
 /*
  * The enqueue_task method is called before nr_running is
  * increased. Here we update the fair scheduling stats and
@@ -5120,6 +5187,24 @@
 	util_est_enqueue(&rq->cfs, p);
 
 	/*
+	 * The code below (indirectly) updates schedutil which looks at
+	 * the cfs_rq utilization to select a frequency.
+	 * Let's update schedtune here to ensure the boost value of the
+	 * current task is accounted for in the selection of the OPP.
+	 *
+	 * We do it also in the case where we enqueue a throttled task;
+	 * we could argue that a throttled task should not boost a CPU,
+	 * however:
+	 * a) properly implementing CPU boosting considering throttled
+	 *    tasks will increase a lot the complexity of the solution
+	 * b) it's not easy to quantify the benefits introduced by
+	 *    such a more complex solution.
+	 * Thus, for the time being we go for the simple solution and boost
+	 * also for throttled RQs.
+	 */
+	schedtune_enqueue_task(p, cpu_of(rq));
+
+	/*
 	 * If in_iowait is set, the code below may not trigger any cpufreq
 	 * utilization updates, so do it here explicitly with the IOWAIT flag
 	 * passed.
@@ -5157,8 +5242,26 @@
 		update_cfs_group(se);
 	}
 
-	if (!se)
+	if (!se) {
 		add_nr_running(rq, 1);
+		/*
+		 * Since new tasks are assigned an initial util_avg equal to
+		 * half of the spare capacity of their CPU, tiny tasks have the
+		 * ability to cross the overutilized threshold, which will
+		 * result in the load balancer ruining all the task placement
+		 * done by EAS. As a way to mitigate that effect, do not account
+		 * for the first enqueue operation of new tasks during the
+		 * overutilized flag detection.
+		 *
+		 * A better way of solving this problem would be to wait for
+		 * the PELT signals of tasks to converge before taking them
+		 * into account, but that is not straightforward to implement,
+		 * and the following generally works well enough in practice.
+		 */
+		if (flags & ENQUEUE_WAKEUP)
+			update_overutilized_status(rq);
+
+	}
 
 	hrtick_update(rq);
 }
@@ -5176,6 +5279,14 @@
 	struct sched_entity *se = &p->se;
 	int task_sleep = flags & DEQUEUE_SLEEP;
 
+	/*
+	 * The code below (indirectly) updates schedutil which looks at
+	 * the cfs_rq utilization to select a frequency.
+	 * Let's update schedtune here to ensure the boost value of the
+	 * current task is not more accounted for in the selection of the OPP.
+	 */
+	schedtune_dequeue_task(p, cpu_of(rq));
+
 	for_each_sched_entity(se) {
 		cfs_rq = cfs_rq_of(se);
 		dequeue_entity(cfs_rq, se, flags);
@@ -5539,11 +5650,6 @@
 	return cpu_rq(cpu)->cpu_capacity;
 }
 
-static unsigned long capacity_orig_of(int cpu)
-{
-	return cpu_rq(cpu)->cpu_capacity_orig;
-}
-
 static unsigned long cpu_avg_load_per_task(int cpu)
 {
 	struct rq *rq = cpu_rq(cpu);
@@ -5590,15 +5696,18 @@
  * whatever is irrelevant, spread criteria is apparent partner count exceeds
  * socket size.
  */
-static int wake_wide(struct task_struct *p)
+static int wake_wide(struct task_struct *p, int sibling_count_hint)
 {
 	unsigned int master = current->wakee_flips;
 	unsigned int slave = p->wakee_flips;
-	int factor = this_cpu_read(sd_llc_size);
+	int llc_size = this_cpu_read(sd_llc_size);
+
+	if (sibling_count_hint >= llc_size)
+		return 1;
 
 	if (master < slave)
 		swap(master, slave);
-	if (slave < factor || master < slave * factor)
+	if (slave < llc_size || master < slave * llc_size)
 		return 0;
 	return 1;
 }
@@ -5702,6 +5811,101 @@
 	return target;
 }
 
+#ifdef CONFIG_SCHED_TUNE
+struct reciprocal_value schedtune_spc_rdiv;
+
+static long
+schedtune_margin(unsigned long signal, long boost)
+{
+	long long margin = 0;
+
+	/*
+	 * Signal proportional compensation (SPC)
+	 *
+	 * The Boost (B) value is used to compute a Margin (M) which is
+	 * proportional to the complement of the original Signal (S):
+	 *   M = B * (SCHED_CAPACITY_SCALE - S)
+	 * The obtained M could be used by the caller to "boost" S.
+	 */
+	if (boost >= 0) {
+		margin  = SCHED_CAPACITY_SCALE - signal;
+		margin *= boost;
+	} else
+		margin = -signal * boost;
+
+	margin  = reciprocal_divide(margin, schedtune_spc_rdiv);
+
+	if (boost < 0)
+		margin *= -1;
+	return margin;
+}
+
+static inline int
+schedtune_cpu_margin(unsigned long util, int cpu)
+{
+	int boost = schedtune_cpu_boost(cpu);
+
+	if (boost == 0)
+		return 0;
+
+	return schedtune_margin(util, boost);
+}
+
+static inline long
+schedtune_task_margin(struct task_struct *task)
+{
+	int boost = schedtune_task_boost(task);
+	unsigned long util;
+	long margin;
+
+	if (boost == 0)
+		return 0;
+
+	util = task_util_est(task);
+	margin = schedtune_margin(util, boost);
+
+	return margin;
+}
+
+unsigned long
+boosted_cpu_util(int cpu, unsigned long other_util)
+{
+	unsigned long util = min_t(unsigned long, SCHED_CAPACITY_SCALE,
+				   cpu_util_cfs(cpu_rq(cpu)) + other_util);
+	long margin = schedtune_cpu_margin(util, cpu);
+
+	trace_sched_boost_cpu(cpu, util, margin);
+
+	return util + margin;
+}
+
+#else /* CONFIG_SCHED_TUNE */
+
+static inline int
+schedtune_cpu_margin(unsigned long util, int cpu)
+{
+	return 0;
+}
+
+static inline int
+schedtune_task_margin(struct task_struct *task)
+{
+	return 0;
+}
+
+#endif /* CONFIG_SCHED_TUNE */
+
+static inline unsigned long
+boosted_task_util(struct task_struct *task)
+{
+	unsigned long util = task_util_est(task);
+	long margin = schedtune_task_margin(task);
+
+	trace_sched_boost_task(task, util, margin);
+
+	return util + margin;
+}
+
 static unsigned long cpu_util_without(int cpu, struct task_struct *p);
 
 static unsigned long capacity_spare_without(int cpu, struct task_struct *p)
@@ -6335,6 +6539,321 @@
 }
 
 /*
+ * Returns the current capacity of cpu after applying both
+ * cpu and freq scaling.
+ */
+unsigned long capacity_curr_of(int cpu)
+{
+	unsigned long max_cap = cpu_rq(cpu)->cpu_capacity_orig;
+	unsigned long scale_freq = arch_scale_freq_capacity(cpu);
+
+	return cap_scale(max_cap, scale_freq);
+}
+
+static void find_best_target(struct sched_domain *sd, cpumask_t *cpus,
+							struct task_struct *p)
+{
+	unsigned long min_util = boosted_task_util(p);
+	unsigned long target_capacity = ULONG_MAX;
+	unsigned long min_wake_util = ULONG_MAX;
+	unsigned long target_max_spare_cap = 0;
+	unsigned long target_util = ULONG_MAX;
+	bool prefer_idle = schedtune_prefer_idle(p);
+	bool boosted = schedtune_task_boost(p) > 0;
+	/* Initialise with deepest possible cstate (INT_MAX) */
+	int shallowest_idle_cstate = INT_MAX;
+	struct sched_group *sg;
+	int best_active_cpu = -1;
+	int best_idle_cpu = -1;
+	int target_cpu = -1;
+	int backup_cpu = -1;
+	int i;
+
+	/*
+	 * In most cases, target_capacity tracks capacity_orig of the most
+	 * energy efficient CPU candidate, thus requiring to minimise
+	 * target_capacity. For these cases target_capacity is already
+	 * initialized to ULONG_MAX.
+	 * However, for prefer_idle and boosted tasks we look for a high
+	 * performance CPU, thus requiring to maximise target_capacity. In this
+	 * case we initialise target_capacity to 0.
+	 */
+	if (prefer_idle && boosted)
+		target_capacity = 0;
+
+	/* Scan CPUs in all SDs */
+	sg = sd->groups;
+	do {
+		for_each_cpu_and(i, &p->cpus_allowed, sched_group_span(sg)) {
+			unsigned long capacity_curr = capacity_curr_of(i);
+			unsigned long capacity_orig = capacity_orig_of(i);
+			unsigned long wake_util, new_util;
+			long spare_cap;
+			int idle_idx = INT_MAX;
+
+			if (!cpu_online(i))
+				continue;
+
+			/*
+			 * p's blocked utilization is still accounted for on prev_cpu
+			 * so prev_cpu will receive a negative bias due to the double
+			 * accounting. However, the blocked utilization may be zero.
+			 */
+			wake_util = cpu_util_without(i, p);
+			new_util = wake_util + task_util_est(p);
+
+			/*
+			 * Ensure minimum capacity to grant the required boost.
+			 * The target CPU can be already at a capacity level higher
+			 * than the one required to boost the task.
+			 */
+			new_util = max(min_util, new_util);
+			if (new_util > capacity_orig)
+				continue;
+
+			/*
+			 * Pre-compute the maximum possible capacity we expect
+			 * to have available on this CPU once the task is
+			 * enqueued here.
+			 */
+			spare_cap = capacity_orig - new_util;
+
+			if (idle_cpu(i))
+				idle_idx = idle_get_state_idx(cpu_rq(i));
+
+
+			/*
+			 * Case A) Latency sensitive tasks
+			 *
+			 * Unconditionally favoring tasks that prefer idle CPU to
+			 * improve latency.
+			 *
+			 * Looking for:
+			 * - an idle CPU, whatever its idle_state is, since
+			 *   the first CPUs we explore are more likely to be
+			 *   reserved for latency sensitive tasks.
+			 * - a non idle CPU where the task fits in its current
+			 *   capacity and has the maximum spare capacity.
+			 * - a non idle CPU with lower contention from other
+			 *   tasks and running at the lowest possible OPP.
+			 *
+			 * The last two goals tries to favor a non idle CPU
+			 * where the task can run as if it is "almost alone".
+			 * A maximum spare capacity CPU is favoured since
+			 * the task already fits into that CPU's capacity
+			 * without waiting for an OPP chance.
+			 *
+			 * The following code path is the only one in the CPUs
+			 * exploration loop which is always used by
+			 * prefer_idle tasks. It exits the loop with wither a
+			 * best_active_cpu or a target_cpu which should
+			 * represent an optimal choice for latency sensitive
+			 * tasks.
+			 */
+			if (prefer_idle) {
+
+				/*
+				 * Case A.1: IDLE CPU
+				 * Return the best IDLE CPU we find:
+				 * - for boosted tasks: the CPU with the highest
+				 * performance (i.e. biggest capacity_orig)
+				 * - for !boosted tasks: the most energy
+				 * efficient CPU (i.e. smallest capacity_orig)
+				 */
+				if (idle_cpu(i)) {
+					if (boosted &&
+					    capacity_orig < target_capacity)
+						continue;
+					if (!boosted &&
+					    capacity_orig > target_capacity)
+						continue;
+					/*
+					 * Minimise value of idle state: skip
+					 * deeper idle states and pick the
+					 * shallowest.
+					 */
+					if (capacity_orig == target_capacity &&
+					    sysctl_sched_cstate_aware &&
+					    idle_idx >= shallowest_idle_cstate)
+						continue;
+
+					target_capacity = capacity_orig;
+					shallowest_idle_cstate = idle_idx;
+					best_idle_cpu = i;
+					continue;
+				}
+				if (best_idle_cpu != -1)
+					continue;
+
+				/*
+				 * Case A.2: Target ACTIVE CPU
+				 * Favor CPUs with max spare capacity.
+				 */
+				if (capacity_curr > new_util &&
+				    spare_cap > target_max_spare_cap) {
+					target_max_spare_cap = spare_cap;
+					target_cpu = i;
+					continue;
+				}
+				if (target_cpu != -1)
+					continue;
+
+
+				/*
+				 * Case A.3: Backup ACTIVE CPU
+				 * Favor CPUs with:
+				 * - lower utilization due to other tasks
+				 * - lower utilization with the task in
+				 */
+				if (wake_util > min_wake_util)
+					continue;
+				min_wake_util = wake_util;
+				best_active_cpu = i;
+				continue;
+			}
+
+			/*
+			 * Enforce EAS mode
+			 *
+			 * For non latency sensitive tasks, skip CPUs that
+			 * will be overutilized by moving the task there.
+			 *
+			 * The goal here is to remain in EAS mode as long as
+			 * possible at least for !prefer_idle tasks.
+			 */
+			if ((new_util * capacity_margin) >
+			    (capacity_orig * SCHED_CAPACITY_SCALE))
+				continue;
+
+			/*
+			 * Favor CPUs with smaller capacity for non latency
+			 * sensitive tasks.
+			 */
+			if (capacity_orig > target_capacity)
+				continue;
+
+			/*
+			 * Case B) Non latency sensitive tasks on IDLE CPUs.
+			 *
+			 * Find an optimal backup IDLE CPU for non latency
+			 * sensitive tasks.
+			 *
+			 * Looking for:
+			 * - minimizing the capacity_orig,
+			 *   i.e. preferring LITTLE CPUs
+			 * - favoring shallowest idle states
+			 *   i.e. avoid to wakeup deep-idle CPUs
+			 *
+			 * The following code path is used by non latency
+			 * sensitive tasks if IDLE CPUs are available. If at
+			 * least one of such CPUs are available it sets the
+			 * best_idle_cpu to the most suitable idle CPU to be
+			 * selected.
+			 *
+			 * If idle CPUs are available, favour these CPUs to
+			 * improve performances by spreading tasks.
+			 * Indeed, the energy_diff() computed by the caller
+			 * will take care to ensure the minimization of energy
+			 * consumptions without affecting performance.
+			 */
+			if (idle_cpu(i)) {
+				/*
+				 * Skip CPUs in deeper idle state, but only
+				 * if they are also less energy efficient.
+				 * IOW, prefer a deep IDLE LITTLE CPU vs a
+				 * shallow idle big CPU.
+				 */
+				if (capacity_orig == target_capacity &&
+				    sysctl_sched_cstate_aware &&
+				    idle_idx >= shallowest_idle_cstate)
+					continue;
+
+				target_capacity = capacity_orig;
+				shallowest_idle_cstate = idle_idx;
+				best_idle_cpu = i;
+				continue;
+			}
+
+			/*
+			 * Case C) Non latency sensitive tasks on ACTIVE CPUs.
+			 *
+			 * Pack tasks in the most energy efficient capacities.
+			 *
+			 * This task packing strategy prefers more energy
+			 * efficient CPUs (i.e. pack on smaller maximum
+			 * capacity CPUs) while also trying to spread tasks to
+			 * run them all at the lower OPP.
+			 *
+			 * This assumes for example that it's more energy
+			 * efficient to run two tasks on two CPUs at a lower
+			 * OPP than packing both on a single CPU but running
+			 * that CPU at an higher OPP.
+			 *
+			 * Thus, this case keep track of the CPU with the
+			 * smallest maximum capacity and highest spare maximum
+			 * capacity.
+			 */
+
+			/* Favor CPUs with maximum spare capacity */
+			if (capacity_orig == target_capacity &&
+			    spare_cap < target_max_spare_cap)
+				continue;
+
+			target_max_spare_cap = spare_cap;
+			target_capacity = capacity_orig;
+			target_util = new_util;
+			target_cpu = i;
+		}
+
+	} while (sg = sg->next, sg != sd->groups);
+
+	/*
+	 * For non latency sensitive tasks, cases B and C in the previous loop,
+	 * we pick the best IDLE CPU only if we was not able to find a target
+	 * ACTIVE CPU.
+	 *
+	 * Policies priorities:
+	 *
+	 * - prefer_idle tasks:
+	 *
+	 *   a) IDLE CPU available: best_idle_cpu
+	 *   b) ACTIVE CPU where task fits and has the bigger maximum spare
+	 *      capacity (i.e. target_cpu)
+	 *   c) ACTIVE CPU with less contention due to other tasks
+	 *      (i.e. best_active_cpu)
+	 *
+	 * - NON prefer_idle tasks:
+	 *
+	 *   a) ACTIVE CPU: target_cpu
+	 *   b) IDLE CPU: best_idle_cpu
+	 */
+
+	if (prefer_idle && (best_idle_cpu != -1)) {
+		target_cpu = best_idle_cpu;
+		goto target;
+	}
+
+	if (target_cpu == -1)
+		target_cpu = prefer_idle
+			? best_active_cpu
+			: best_idle_cpu;
+	else
+		backup_cpu = prefer_idle
+		? best_active_cpu
+		: best_idle_cpu;
+
+	if (backup_cpu >= 0)
+		cpumask_set_cpu(backup_cpu, cpus);
+	if (target_cpu >= 0) {
+target:
+		cpumask_set_cpu(target_cpu, cpus);
+	}
+
+	trace_sched_find_best_target(p, prefer_idle, min_util, best_idle_cpu,
+			             best_active_cpu, target_cpu, backup_cpu);
+}
+
+/*
  * Disable WAKE_AFFINE in the case where task @p doesn't fit in the
  * capacity of either the waking CPU @cpu or the previous CPU @prev_cpu.
  *
@@ -6345,8 +6864,11 @@
 {
 	long min_cap, max_cap;
 
+	if (!static_branch_unlikely(&sched_asym_cpucapacity))
+		return 0;
+
 	min_cap = min(capacity_orig_of(prev_cpu), capacity_orig_of(cpu));
-	max_cap = cpu_rq(cpu)->rd->max_cpu_capacity;
+	max_cap = cpu_rq(cpu)->rd->max_cpu_capacity.val;
 
 	/* Minimum capacity is close to max, no need to abort wake_affine */
 	if (max_cap - min_cap < max_cap >> 3)
@@ -6355,7 +6877,293 @@
 	/* Bring task utilization in sync with prev_cpu */
 	sync_entity_load_avg(&p->se);
 
-	return min_cap * 1024 < task_util(p) * capacity_margin;
+	return !task_fits_capacity(p, min_cap);
+}
+
+/*
+ * Predicts what cpu_util(@cpu) would return if @p was migrated (and enqueued)
+ * to @dst_cpu.
+ */
+static unsigned long cpu_util_next(int cpu, struct task_struct *p, int dst_cpu)
+{
+	struct cfs_rq *cfs_rq = &cpu_rq(cpu)->cfs;
+	unsigned long util_est, util = READ_ONCE(cfs_rq->avg.util_avg);
+
+	/*
+	 * If @p migrates from @cpu to another, remove its contribution. Or,
+	 * if @p migrates from another CPU to @cpu, add its contribution. In
+	 * the other cases, @cpu is not impacted by the migration, so the
+	 * util_avg should already be correct.
+	 */
+	if (task_cpu(p) == cpu && dst_cpu != cpu)
+		sub_positive(&util, task_util(p));
+	else if (task_cpu(p) != cpu && dst_cpu == cpu)
+		util += task_util(p);
+
+	if (sched_feat(UTIL_EST)) {
+		util_est = READ_ONCE(cfs_rq->avg.util_est.enqueued);
+
+		/*
+		 * During wake-up, the task isn't enqueued yet and doesn't
+		 * appear in the cfs_rq->avg.util_est.enqueued of any rq,
+		 * so just add it (if needed) to "simulate" what will be
+		 * cpu_util() after the task has been enqueued.
+		 */
+		if (dst_cpu == cpu)
+			util_est += _task_util_est(p);
+
+		util = max(util, util_est);
+	}
+
+	return min(util, capacity_orig_of(cpu));
+}
+
+/*
+ * compute_energy(): Estimates the energy that would be consumed if @p was
+ * migrated to @dst_cpu. compute_energy() predicts what will be the utilization
+ * landscape of the * CPUs after the task migration, and uses the Energy Model
+ * to compute what would be the energy if we decided to actually migrate that
+ * task.
+ */
+static long
+compute_energy(struct task_struct *p, int dst_cpu, struct perf_domain *pd)
+{
+	long util, max_util, sum_util, energy = 0;
+	int cpu;
+
+	for (; pd; pd = pd->next) {
+		max_util = sum_util = 0;
+		/*
+		 * The capacity state of CPUs of the current rd can be driven by
+		 * CPUs of another rd if they belong to the same performance
+		 * domain. So, account for the utilization of these CPUs too
+		 * by masking pd with cpu_online_mask instead of the rd span.
+		 *
+		 * If an entire performance domain is outside of the current rd,
+		 * it will not appear in its pd list and will not be accounted
+		 * by compute_energy().
+		 */
+		for_each_cpu_and(cpu, perf_domain_span(pd), cpu_online_mask) {
+			util = cpu_util_next(cpu, p, dst_cpu);
+			util += cpu_util_rt(cpu_rq(cpu));
+			util = schedutil_energy_util(cpu, util);
+			max_util = max(util, max_util);
+			sum_util += util;
+		}
+
+		energy += em_pd_energy(pd->em_pd, max_util, sum_util);
+	}
+
+	return energy;
+}
+
+static void select_cpu_candidates(struct sched_domain *sd, cpumask_t *cpus,
+		struct perf_domain *pd, struct task_struct *p, int prev_cpu)
+{
+	int highest_spare_cap_cpu = prev_cpu, best_idle_cpu = -1;
+	unsigned long spare_cap, max_spare_cap, util, cpu_cap;
+	bool prefer_idle = schedtune_prefer_idle(p);
+	bool boosted = schedtune_task_boost(p) > 0;
+	unsigned long target_cap = boosted ? 0 : ULONG_MAX;
+	unsigned long highest_spare_cap = 0;
+	unsigned int min_exit_lat = UINT_MAX;
+	int cpu, max_spare_cap_cpu;
+	struct cpuidle_state *idle;
+
+	for (; pd; pd = pd->next) {
+		max_spare_cap_cpu = -1;
+		max_spare_cap = 0;
+
+		for_each_cpu_and(cpu, perf_domain_span(pd), sched_domain_span(sd)) {
+			if (!cpumask_test_cpu(cpu, &p->cpus_allowed))
+				continue;
+
+			/* Skip CPUs that will be overutilized. */
+			util = cpu_util_next(cpu, p, cpu);
+			cpu_cap = capacity_of(cpu);
+			if (cpu_cap * 1024 < util * capacity_margin)
+				continue;
+
+			/*
+			 * Find the CPU with the maximum spare capacity in
+			 * the performance domain
+			 */
+			spare_cap = cpu_cap - util;
+			if (spare_cap > max_spare_cap) {
+				max_spare_cap = spare_cap;
+				max_spare_cap_cpu = cpu;
+			}
+
+			if (!prefer_idle)
+				continue;
+
+			if (idle_cpu(cpu)) {
+				cpu_cap = capacity_orig_of(cpu);
+				if (boosted && cpu_cap < target_cap)
+					continue;
+				if (!boosted && cpu_cap > target_cap)
+					continue;
+				idle = idle_get_state(cpu_rq(cpu));
+				if (idle && idle->exit_latency > min_exit_lat &&
+						cpu_cap == target_cap)
+					continue;
+
+				if (idle)
+					min_exit_lat = idle->exit_latency;
+				target_cap = cpu_cap;
+				best_idle_cpu = cpu;
+			} else if (spare_cap > highest_spare_cap) {
+				highest_spare_cap = spare_cap;
+				highest_spare_cap_cpu = cpu;
+			}
+		}
+
+		if (!prefer_idle && max_spare_cap_cpu >= 0)
+			cpumask_set_cpu(max_spare_cap_cpu, cpus);
+	}
+
+	if (!prefer_idle)
+		return;
+
+	if (best_idle_cpu >= 0)
+		cpumask_set_cpu(best_idle_cpu, cpus);
+	else
+		cpumask_set_cpu(highest_spare_cap_cpu, cpus);
+}
+
+static DEFINE_PER_CPU(cpumask_t, energy_cpus);
+
+/*
+ * find_energy_efficient_cpu(): Find most energy-efficient target CPU for the
+ * waking task. find_energy_efficient_cpu() looks for the CPU with maximum
+ * spare capacity in each performance domain and uses it as a potential
+ * candidate to execute the task. Then, it uses the Energy Model to figure
+ * out which of the CPU candidates is the most energy-efficient.
+ *
+ * The rationale for this heuristic is as follows. In a performance domain,
+ * all the most energy efficient CPU candidates (according to the Energy
+ * Model) are those for which we'll request a low frequency. When there are
+ * several CPUs for which the frequency request will be the same, we don't
+ * have enough data to break the tie between them, because the Energy Model
+ * only includes active power costs. With this model, if we assume that
+ * frequency requests follow utilization (e.g. using schedutil), the CPU with
+ * the maximum spare capacity in a performance domain is guaranteed to be among
+ * the best candidates of the performance domain.
+ *
+ * In practice, it could be preferable from an energy standpoint to pack
+ * small tasks on a CPU in order to let other CPUs go in deeper idle states,
+ * but that could also hurt our chances to go cluster idle, and we have no
+ * ways to tell with the current Energy Model if this is actually a good
+ * idea or not. So, find_energy_efficient_cpu() basically favors
+ * cluster-packing, and spreading inside a cluster. That should at least be
+ * a good thing for latency, and this is consistent with the idea that most
+ * of the energy savings of EAS come from the asymmetry of the system, and
+ * not so much from breaking the tie between identical CPUs. That's also the
+ * reason why EAS is enabled in the topology code only for systems where
+ * SD_ASYM_CPUCAPACITY is set.
+ *
+ * NOTE: Forkees are not accepted in the energy-aware wake-up path because
+ * they don't have any useful utilization data yet and it's not possible to
+ * forecast their impact on energy consumption. Consequently, they will be
+ * placed by find_idlest_cpu() on the least loaded CPU, which might turn out
+ * to be energy-inefficient in some use-cases. The alternative would be to
+ * bias new tasks towards specific types of CPUs first, or to try to infer
+ * their util_avg from the parent task, but those heuristics could hurt
+ * other use-cases too. So, until someone finds a better way to solve this,
+ * let's keep things simple by re-using the existing slow path.
+ */
+
+static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu, int sync)
+{
+	unsigned long prev_energy = ULONG_MAX, best_energy = ULONG_MAX;
+	struct root_domain *rd = cpu_rq(smp_processor_id())->rd;
+	int weight, cpu, best_energy_cpu = prev_cpu;
+	unsigned long cur_energy;
+	struct perf_domain *pd;
+	struct sched_domain *sd;
+	cpumask_t *candidates;
+
+	if (sysctl_sched_sync_hint_enable && sync) {
+		cpu = smp_processor_id();
+		if (cpumask_test_cpu(cpu, &p->cpus_allowed))
+			return cpu;
+	}
+
+	rcu_read_lock();
+	pd = rcu_dereference(rd->pd);
+	if (!pd || READ_ONCE(rd->overutilized))
+		goto fail;
+
+	/*
+	 * Energy-aware wake-up happens on the lowest sched_domain starting
+	 * from sd_asym_cpucapacity spanning over this_cpu and prev_cpu.
+	 */
+	sd = rcu_dereference(*this_cpu_ptr(&sd_asym_cpucapacity));
+	while (sd && !cpumask_test_cpu(prev_cpu, sched_domain_span(sd)))
+		sd = sd->parent;
+	if (!sd)
+		goto fail;
+
+	sync_entity_load_avg(&p->se);
+	if (!task_util_est(p))
+		goto unlock;
+
+	/* Pre-select a set of candidate CPUs. */
+	candidates = this_cpu_ptr(&energy_cpus);
+	cpumask_clear(candidates);
+
+	if (sched_feat(FIND_BEST_TARGET))
+		find_best_target(sd, candidates, p);
+	else
+		select_cpu_candidates(sd, candidates, pd, p, prev_cpu);
+
+	/* Bail out if no candidate was found. */
+	weight = cpumask_weight(candidates);
+	if (!weight)
+		goto unlock;
+
+	/* If there is only one sensible candidate, select it now. */
+	cpu = cpumask_first(candidates);
+	if (weight == 1 && ((schedtune_prefer_idle(p) && idle_cpu(cpu)) ||
+			    (cpu == prev_cpu))) {
+		best_energy_cpu = cpu;
+		goto unlock;
+	}
+
+	if (cpumask_test_cpu(prev_cpu, &p->cpus_allowed))
+		prev_energy = best_energy = compute_energy(p, prev_cpu, pd);
+	else
+		prev_energy = best_energy = ULONG_MAX;
+
+	/* Select the best candidate energy-wise. */
+	for_each_cpu(cpu, candidates) {
+		if (cpu == prev_cpu)
+			continue;
+		cur_energy = compute_energy(p, cpu, pd);
+		if (cur_energy < best_energy) {
+			best_energy = cur_energy;
+			best_energy_cpu = cpu;
+		}
+	}
+unlock:
+	rcu_read_unlock();
+
+	/*
+	 * Pick the best CPU if prev_cpu cannot be used, or if it saves at
+	 * least 6% of the energy used by prev_cpu.
+	 */
+	if (prev_energy == ULONG_MAX)
+		return best_energy_cpu;
+
+	if ((prev_energy - best_energy) > (prev_energy >> 4))
+		return best_energy_cpu;
+
+	return prev_cpu;
+
+fail:
+	rcu_read_unlock();
+
+	return -1;
 }
 
 /*
@@ -6371,7 +7179,8 @@
  * preempt must be disabled.
  */
 static int
-select_task_rq_fair(struct task_struct *p, int prev_cpu, int sd_flag, int wake_flags)
+select_task_rq_fair(struct task_struct *p, int prev_cpu, int sd_flag, int wake_flags,
+		    int sibling_count_hint)
 {
 	struct sched_domain *tmp, *sd = NULL;
 	int cpu = smp_processor_id();
@@ -6381,10 +7190,23 @@
 
 	if (sd_flag & SD_BALANCE_WAKE) {
 		record_wakee(p);
-		want_affine = !wake_wide(p) && !wake_cap(p, cpu, prev_cpu)
-			      && cpumask_test_cpu(cpu, &p->cpus_allowed);
+
+		if (static_branch_unlikely(&sched_energy_present)) {
+			if (schedtune_prefer_idle(p) && !sched_feat(EAS_PREFER_IDLE) && !sync)
+				goto sd_loop;
+
+			new_cpu = find_energy_efficient_cpu(p, prev_cpu, sync);
+			if (new_cpu >= 0)
+				return new_cpu;
+			new_cpu = prev_cpu;
+		}
+
+		want_affine = !wake_wide(p, sibling_count_hint) &&
+			      !wake_cap(p, cpu, prev_cpu) &&
+			      cpumask_test_cpu(cpu, &p->cpus_allowed);
 	}
 
+sd_loop:
 	rcu_read_lock();
 	for_each_domain(cpu, tmp) {
 		if (!(tmp->flags & SD_LOAD_BALANCE))
@@ -6774,9 +7596,12 @@
 	if (hrtick_enabled(rq))
 		hrtick_start_fair(rq, p);
 
+	update_misfit_status(p, rq);
+
 	return p;
 
 idle:
+	update_misfit_status(NULL, rq);
 	new_tasks = idle_balance(rq, rf);
 
 	/*
@@ -6790,6 +7615,12 @@
 	if (new_tasks > 0)
 		goto again;
 
+	/*
+	 * rq is about to be idle, check if we need to update the
+	 * lost_idle_time of clock_pelt
+	 */
+	update_idle_rq_clock_pelt(rq);
+
 	return NULL;
 }
 
@@ -6982,6 +7813,13 @@
 
 enum fbq_type { regular, remote, all };
 
+enum group_type {
+	group_other = 0,
+	group_misfit_task,
+	group_imbalanced,
+	group_overloaded,
+};
+
 #define LBF_ALL_PINNED	0x01
 #define LBF_NEED_BREAK	0x02
 #define LBF_DST_PINNED  0x04
@@ -7002,6 +7840,7 @@
 	int			new_dst_cpu;
 	enum cpu_idle_type	idle;
 	long			imbalance;
+	unsigned int		src_grp_nr_running;
 	/* The set of CPUs under consideration for load-balancing */
 	struct cpumask		*cpus;
 
@@ -7012,6 +7851,7 @@
 	unsigned int		loop_max;
 
 	enum fbq_type		fbq_type;
+	enum group_type		src_grp_type;
 	struct list_head	tasks;
 };
 
@@ -7424,7 +8264,7 @@
 		if (throttled_hierarchy(cfs_rq))
 			continue;
 
-		if (update_cfs_rq_load_avg(cfs_rq_clock_task(cfs_rq), cfs_rq))
+		if (update_cfs_rq_load_avg(cfs_rq_clock_pelt(cfs_rq), cfs_rq))
 			update_tg_load_avg(cfs_rq, 0);
 
 		/* Propagate pending load changes to the parent, if any: */
@@ -7438,8 +8278,8 @@
 	}
 
 	curr_class = rq->curr->sched_class;
-	update_rt_rq_load_avg(rq_clock_task(rq), rq, curr_class == &rt_sched_class);
-	update_dl_rq_load_avg(rq_clock_task(rq), rq, curr_class == &dl_sched_class);
+	update_rt_rq_load_avg(rq_clock_pelt(rq), rq, curr_class == &rt_sched_class);
+	update_dl_rq_load_avg(rq_clock_pelt(rq), rq, curr_class == &dl_sched_class);
 	update_irq_load_avg(rq, 0);
 	/* Don't need periodic decay once load/util_avg are null */
 	if (others_have_blocked(rq))
@@ -7509,11 +8349,11 @@
 
 	rq_lock_irqsave(rq, &rf);
 	update_rq_clock(rq);
-	update_cfs_rq_load_avg(cfs_rq_clock_task(cfs_rq), cfs_rq);
+	update_cfs_rq_load_avg(cfs_rq_clock_pelt(cfs_rq), cfs_rq);
 
 	curr_class = rq->curr->sched_class;
-	update_rt_rq_load_avg(rq_clock_task(rq), rq, curr_class == &rt_sched_class);
-	update_dl_rq_load_avg(rq_clock_task(rq), rq, curr_class == &dl_sched_class);
+	update_rt_rq_load_avg(rq_clock_pelt(rq), rq, curr_class == &rt_sched_class);
+	update_dl_rq_load_avg(rq_clock_pelt(rq), rq, curr_class == &dl_sched_class);
 	update_irq_load_avg(rq, 0);
 #ifdef CONFIG_NO_HZ_COMMON
 	rq->last_blocked_load_update_tick = jiffies;
@@ -7531,12 +8371,6 @@
 
 /********** Helpers for find_busiest_group ************************/
 
-enum group_type {
-	group_other = 0,
-	group_imbalanced,
-	group_overloaded,
-};
-
 /*
  * sg_lb_stats - stats of a sched_group required for load_balancing
  */
@@ -7552,6 +8386,7 @@
 	unsigned int group_weight;
 	enum group_type group_type;
 	int group_no_capacity;
+	unsigned long group_misfit_task_load; /* A CPU has a task too big for its capacity */
 #ifdef CONFIG_NUMA_BALANCING
 	unsigned int nr_numa_running;
 	unsigned int nr_preferred_running;
@@ -7624,10 +8459,9 @@
 	return load_idx;
 }
 
-static unsigned long scale_rt_capacity(struct sched_domain *sd, int cpu)
+static unsigned long scale_rt_capacity(int cpu, unsigned long max)
 {
 	struct rq *rq = cpu_rq(cpu);
-	unsigned long max = arch_scale_cpu_capacity(sd, cpu);
 	unsigned long used, free;
 	unsigned long irq;
 
@@ -7647,12 +8481,47 @@
 	return scale_irq_capacity(free, irq, max);
 }
 
+void init_max_cpu_capacity(struct max_cpu_capacity *mcc) {
+	raw_spin_lock_init(&mcc->lock);
+	mcc->val = 0;
+	mcc->cpu = -1;
+}
+
 static void update_cpu_capacity(struct sched_domain *sd, int cpu)
 {
-	unsigned long capacity = scale_rt_capacity(sd, cpu);
+	unsigned long capacity = arch_scale_cpu_capacity(sd, cpu);
 	struct sched_group *sdg = sd->groups;
+	struct max_cpu_capacity *mcc;
+	unsigned long max_capacity;
+	int max_cap_cpu;
+	unsigned long flags;
 
-	cpu_rq(cpu)->cpu_capacity_orig = arch_scale_cpu_capacity(sd, cpu);
+	cpu_rq(cpu)->cpu_capacity_orig = capacity;
+
+	capacity *= arch_scale_max_freq_capacity(sd, cpu);
+	capacity >>= SCHED_CAPACITY_SHIFT;
+
+	mcc = &cpu_rq(cpu)->rd->max_cpu_capacity;
+
+	raw_spin_lock_irqsave(&mcc->lock, flags);
+	max_capacity = mcc->val;
+	max_cap_cpu = mcc->cpu;
+
+	if ((max_capacity > capacity && max_cap_cpu == cpu) ||
+	    (max_capacity < capacity)) {
+		mcc->val = capacity;
+		mcc->cpu = cpu;
+#ifdef CONFIG_SCHED_DEBUG
+		raw_spin_unlock_irqrestore(&mcc->lock, flags);
+		printk_deferred(KERN_INFO "CPU%d: update max cpu_capacity %lu\n",
+				cpu, capacity);
+		goto skip_unlock;
+#endif
+	}
+	raw_spin_unlock_irqrestore(&mcc->lock, flags);
+
+skip_unlock: __attribute__ ((unused));
+	capacity = scale_rt_capacity(cpu, capacity);
 
 	if (!capacity)
 		capacity = 1;
@@ -7660,13 +8529,14 @@
 	cpu_rq(cpu)->cpu_capacity = capacity;
 	sdg->sgc->capacity = capacity;
 	sdg->sgc->min_capacity = capacity;
+	sdg->sgc->max_capacity = capacity;
 }
 
 void update_group_capacity(struct sched_domain *sd, int cpu)
 {
 	struct sched_domain *child = sd->child;
 	struct sched_group *group, *sdg = sd->groups;
-	unsigned long capacity, min_capacity;
+	unsigned long capacity, min_capacity, max_capacity;
 	unsigned long interval;
 
 	interval = msecs_to_jiffies(sd->balance_interval);
@@ -7680,6 +8550,7 @@
 
 	capacity = 0;
 	min_capacity = ULONG_MAX;
+	max_capacity = 0;
 
 	if (child->flags & SD_OVERLAP) {
 		/*
@@ -7710,6 +8581,7 @@
 			}
 
 			min_capacity = min(capacity, min_capacity);
+			max_capacity = max(capacity, max_capacity);
 		}
 	} else  {
 		/*
@@ -7723,12 +8595,14 @@
 
 			capacity += sgc->capacity;
 			min_capacity = min(sgc->min_capacity, min_capacity);
+			max_capacity = max(sgc->max_capacity, max_capacity);
 			group = group->next;
 		} while (group != child->groups);
 	}
 
 	sdg->sgc->capacity = capacity;
 	sdg->sgc->min_capacity = min_capacity;
+	sdg->sgc->max_capacity = max_capacity;
 }
 
 /*
@@ -7824,16 +8698,27 @@
 }
 
 /*
- * group_smaller_cpu_capacity: Returns true if sched_group sg has smaller
+ * group_smaller_min_cpu_capacity: Returns true if sched_group sg has smaller
  * per-CPU capacity than sched_group ref.
  */
 static inline bool
-group_smaller_cpu_capacity(struct sched_group *sg, struct sched_group *ref)
+group_smaller_min_cpu_capacity(struct sched_group *sg, struct sched_group *ref)
 {
 	return sg->sgc->min_capacity * capacity_margin <
 						ref->sgc->min_capacity * 1024;
 }
 
+/*
+ * group_smaller_max_cpu_capacity: Returns true if sched_group sg has smaller
+ * per-CPU capacity_orig than sched_group ref.
+ */
+static inline bool
+group_smaller_max_cpu_capacity(struct sched_group *sg, struct sched_group *ref)
+{
+	return sg->sgc->max_capacity * capacity_margin <
+						ref->sgc->max_capacity * 1024;
+}
+
 static inline enum
 group_type group_classify(struct sched_group *group,
 			  struct sg_lb_stats *sgs)
@@ -7844,6 +8729,9 @@
 	if (sg_imbalanced(group))
 		return group_imbalanced;
 
+	if (sgs->group_misfit_task_load)
+		return group_misfit_task;
+
 	return group_other;
 }
 
@@ -7873,16 +8761,16 @@
  * update_sg_lb_stats - Update sched_group's statistics for load balancing.
  * @env: The load balancing environment.
  * @group: sched_group whose statistics are to be updated.
- * @load_idx: Load index of sched_domain of this_cpu for load calc.
- * @local_group: Does group contain this_cpu.
  * @sgs: variable to hold the statistics for this group.
- * @overload: Indicate more than one runnable task for any CPU.
+ * @sg_status: Holds flag indicating the status of the sched_group
  */
 static inline void update_sg_lb_stats(struct lb_env *env,
-			struct sched_group *group, int load_idx,
-			int local_group, struct sg_lb_stats *sgs,
-			bool *overload)
+				      struct sched_group *group,
+				      struct sg_lb_stats *sgs,
+				      int *sg_status)
 {
+	int local_group = cpumask_test_cpu(env->dst_cpu, sched_group_span(group));
+	int load_idx = get_sd_load_idx(env->sd, env->idle);
 	unsigned long load;
 	int i, nr_running;
 
@@ -7906,7 +8794,10 @@
 
 		nr_running = rq->nr_running;
 		if (nr_running > 1)
-			*overload = true;
+			*sg_status |= SG_OVERLOAD;
+
+		if (cpu_overutilized(i))
+			*sg_status |= SG_OVERUTILIZED;
 
 #ifdef CONFIG_NUMA_BALANCING
 		sgs->nr_numa_running += rq->nr_numa_running;
@@ -7918,6 +8809,12 @@
 		 */
 		if (!nr_running && idle_cpu(i))
 			sgs->idle_cpus++;
+
+		if (env->sd->flags & SD_ASYM_CPUCAPACITY &&
+		    sgs->group_misfit_task_load < rq->misfit_task_load) {
+			sgs->group_misfit_task_load = rq->misfit_task_load;
+			*sg_status |= SG_OVERLOAD;
+		}
 	}
 
 	/* Adjust by relative CPU capacity of the group */
@@ -7953,6 +8850,17 @@
 {
 	struct sg_lb_stats *busiest = &sds->busiest_stat;
 
+	/*
+	 * Don't try to pull misfit tasks we can't help.
+	 * We can use max_capacity here as reduction in capacity on some
+	 * CPUs in the group should either be possible to resolve
+	 * internally or be covered by avg_load imbalance (eventually).
+	 */
+	if (sgs->group_type == group_misfit_task &&
+	    (!group_smaller_max_cpu_capacity(sg, sds->local) ||
+	     !group_has_capacity(env, &sds->local_stat)))
+		return false;
+
 	if (sgs->group_type > busiest->group_type)
 		return true;
 
@@ -7972,7 +8880,14 @@
 	 * power/energy consequences are not considered.
 	 */
 	if (sgs->sum_nr_running <= sgs->group_weight &&
-	    group_smaller_cpu_capacity(sds->local, sg))
+	    group_smaller_min_cpu_capacity(sds->local, sg))
+		return false;
+
+	/*
+	 * If we have more than one misfit sg go with the biggest misfit.
+	 */
+	if (sgs->group_type == group_misfit_task &&
+	    sgs->group_misfit_task_load < busiest->group_misfit_task_load)
 		return false;
 
 asym_packing:
@@ -8043,19 +8958,14 @@
 	struct sched_group *sg = env->sd->groups;
 	struct sg_lb_stats *local = &sds->local_stat;
 	struct sg_lb_stats tmp_sgs;
-	int load_idx, prefer_sibling = 0;
-	bool overload = false;
-
-	if (child && child->flags & SD_PREFER_SIBLING)
-		prefer_sibling = 1;
+	bool prefer_sibling = child && child->flags & SD_PREFER_SIBLING;
+	int sg_status = 0;
 
 #ifdef CONFIG_NO_HZ_COMMON
 	if (env->idle == CPU_NEWLY_IDLE && READ_ONCE(nohz.has_blocked))
 		env->flags |= LBF_NOHZ_STATS;
 #endif
 
-	load_idx = get_sd_load_idx(env->sd, env->idle);
-
 	do {
 		struct sg_lb_stats *sgs = &tmp_sgs;
 		int local_group;
@@ -8070,8 +8980,7 @@
 				update_group_capacity(env->sd, env->dst_cpu);
 		}
 
-		update_sg_lb_stats(env, sg, load_idx, local_group, sgs,
-						&overload);
+		update_sg_lb_stats(env, sg, sgs, &sg_status);
 
 		if (local_group)
 			goto next_group;
@@ -8119,11 +9028,22 @@
 	if (env->sd->flags & SD_NUMA)
 		env->fbq_type = fbq_classify_group(&sds->busiest_stat);
 
+	env->src_grp_nr_running = sds->busiest_stat.sum_nr_running;
+
 	if (!env->sd->parent) {
+		struct root_domain *rd = env->dst_rq->rd;
+
 		/* update overload indicator if we are at root domain */
-		if (env->dst_rq->rd->overload != overload)
-			env->dst_rq->rd->overload = overload;
+		WRITE_ONCE(rd->overload, sg_status & SG_OVERLOAD);
+
+		/* Update over-utilization (tipping point, U >= 0) indicator */
+		WRITE_ONCE(rd->overutilized, sg_status & SG_OVERUTILIZED);
+		trace_sched_overutilized(!!(sg_status & SG_OVERUTILIZED));
+	} else if (sg_status & SG_OVERUTILIZED) {
+		WRITE_ONCE(env->dst_rq->rd->overutilized, SG_OVERUTILIZED);
+		trace_sched_overutilized(1);
 	}
+
 }
 
 /**
@@ -8239,7 +9159,22 @@
 	capa_move /= SCHED_CAPACITY_SCALE;
 
 	/* Move if we gain throughput */
-	if (capa_move > capa_now)
+	if (capa_move > capa_now) {
+		env->imbalance = busiest->load_per_task;
+		return;
+	}
+
+	/* We can't see throughput improvement with the load-based
+	 * method, but it is possible depending upon group size and
+	 * capacity range that there might still be an underutilized
+	 * cpu available in an asymmetric capacity system. Do one last
+	 * check just in case.
+	 */
+	if (env->sd->flags & SD_ASYM_CPUCAPACITY &&
+		busiest->group_type == group_overloaded &&
+		busiest->sum_nr_running > busiest->group_weight &&
+		local->sum_nr_running < local->group_weight &&
+		local->group_capacity < busiest->group_capacity)
 		env->imbalance = busiest->load_per_task;
 }
 
@@ -8272,8 +9207,9 @@
 	 * factors in sg capacity and sgs with smaller group_type are
 	 * skipped when updating the busiest sg:
 	 */
-	if (busiest->avg_load <= sds->avg_load ||
-	    local->avg_load >= sds->avg_load) {
+	if (busiest->group_type != group_misfit_task &&
+	    (busiest->avg_load <= sds->avg_load ||
+	     local->avg_load >= sds->avg_load)) {
 		env->imbalance = 0;
 		return fix_small_imbalance(env, sds);
 	}
@@ -8307,6 +9243,22 @@
 		(sds->avg_load - local->avg_load) * local->group_capacity
 	) / SCHED_CAPACITY_SCALE;
 
+	/* Boost imbalance to allow misfit task to be balanced.
+	 * Always do this if we are doing a NEWLY_IDLE balance
+	 * on the assumption that any tasks we have must not be
+	 * long-running (and hence we cannot rely upon load).
+	 * However if we are not idle, we should assume the tasks
+	 * we have are longer running and not override load-based
+	 * calculations above unless we are sure that the local
+	 * group is underutilized.
+	 */
+	if (busiest->group_type == group_misfit_task &&
+		(env->idle == CPU_NEWLY_IDLE ||
+		local->sum_nr_running < local->group_weight)) {
+		env->imbalance = max_t(long, env->imbalance,
+				       busiest->group_misfit_task_load);
+	}
+
 	/*
 	 * if *imbalance is less than the average load per runnable task
 	 * there is no guarantee that any tasks will be moved so we'll have
@@ -8342,6 +9294,14 @@
 	 * this level.
 	 */
 	update_sd_lb_stats(env, &sds);
+
+	if (static_branch_unlikely(&sched_energy_present)) {
+		struct root_domain *rd = env->dst_rq->rd;
+
+		if (rcu_dereference(rd->pd) && !READ_ONCE(rd->overutilized))
+			goto out_balanced;
+	}
+
 	local = &sds.local_stat;
 	busiest = &sds.busiest_stat;
 
@@ -8373,6 +9333,10 @@
 	    busiest->group_no_capacity)
 		goto force_balance;
 
+	/* Misfit tasks should be dealt with regardless of the avg load */
+	if (busiest->group_type == group_misfit_task)
+		goto force_balance;
+
 	/*
 	 * If the local group is busier than the selected busiest group
 	 * don't try and pull any tasks.
@@ -8410,6 +9374,7 @@
 
 force_balance:
 	/* Looks like there is an imbalance. Compute it */
+	env->src_grp_type = busiest->group_type;
 	calculate_imbalance(env, &sds);
 	return env->imbalance ? sds.busiest : NULL;
 
@@ -8457,8 +9422,32 @@
 		if (rt > env->fbq_type)
 			continue;
 
+		/*
+		 * For ASYM_CPUCAPACITY domains with misfit tasks we simply
+		 * seek the "biggest" misfit task.
+		 */
+		if (env->src_grp_type == group_misfit_task) {
+			if (rq->misfit_task_load > busiest_load) {
+				busiest_load = rq->misfit_task_load;
+				busiest = rq;
+			}
+
+			continue;
+		}
+
 		capacity = capacity_of(i);
 
+		/*
+		 * For ASYM_CPUCAPACITY domains, don't pick a CPU that could
+		 * eventually lead to active_balancing high->low capacity.
+		 * Higher per-CPU capacity is considered better than balancing
+		 * average load.
+		 */
+		if (env->sd->flags & SD_ASYM_CPUCAPACITY &&
+		    capacity_of(env->dst_cpu) < capacity &&
+		    rq->nr_running == 1)
+			continue;
+
 		wl = weighted_cpuload(rq);
 
 		/*
@@ -8526,6 +9515,20 @@
 			return 1;
 	}
 
+	if (env->src_grp_type == group_misfit_task)
+		return 1;
+
+	if ((capacity_of(env->src_cpu) < capacity_of(env->dst_cpu)) &&
+				env->src_rq->cfs.h_nr_running == 1 &&
+				cpu_overutilized(env->src_cpu) &&
+				!cpu_overutilized(env->dst_cpu)) {
+		return 1;
+	}
+
+	if (env->src_grp_type == group_overloaded && env->src_rq->misfit_task_load)
+		return 1;
+
+
 	return unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2);
 }
 
@@ -8744,7 +9747,8 @@
 		 * excessive cache_hot migrations and active balances.
 		 */
 		if (idle != CPU_NEWLY_IDLE)
-			sd->nr_balance_failed++;
+			if (env.src_grp_nr_running > 1)
+				sd->nr_balance_failed++;
 
 		if (need_active_balance(&env)) {
 			unsigned long flags;
@@ -9182,7 +10186,7 @@
 	if (time_before(now, nohz.next_balance))
 		goto out;
 
-	if (rq->nr_running >= 2) {
+	if (rq->nr_running >= 2 || rq->misfit_task_load) {
 		flags = NOHZ_KICK_MASK;
 		goto out;
 	}
@@ -9211,7 +10215,7 @@
 		}
 	}
 
-	sd = rcu_dereference(per_cpu(sd_asym, cpu));
+	sd = rcu_dereference(per_cpu(sd_asym_packing, cpu));
 	if (sd) {
 		for_each_cpu(i, sched_domain_span(sd)) {
 			if (i == cpu ||
@@ -9551,7 +10555,7 @@
 	rq_unpin_lock(this_rq, rf);
 
 	if (this_rq->avg_idle < sysctl_sched_migration_cost ||
-	    !this_rq->rd->overload) {
+	    !READ_ONCE(this_rq->rd->overload)) {
 
 		rcu_read_lock();
 		sd = rcu_dereference_check_sched_domain(this_rq->sd);
@@ -9713,6 +10717,9 @@
 
 	if (static_branch_unlikely(&sched_numa_balancing))
 		task_tick_numa(rq, curr);
+
+	update_misfit_status(curr, rq);
+	update_overutilized_status(task_rq(curr));
 }
 
 /*
diff --git a/kernel/sched/features.h b/kernel/sched/features.h
index 85ae848..6660d53 100644
--- a/kernel/sched/features.h
+++ b/kernel/sched/features.h
@@ -90,3 +90,33 @@
  * UtilEstimation. Use estimated CPU utilization.
  */
 SCHED_FEAT(UTIL_EST, true)
+
+/*
+ * Fast pre-selection of CPU candidates for EAS.
+ */
+SCHED_FEAT(FIND_BEST_TARGET, false)
+
+/*
+ * Energy aware scheduling algorithm choices:
+ * EAS_PREFER_IDLE
+ *   Direct tasks in a schedtune.prefer_idle=1 group through
+ *   the EAS path for wakeup task placement. Otherwise, put
+ *   those tasks through the mainline slow path.
+ */
+SCHED_FEAT(EAS_PREFER_IDLE, true)
+
+/*
+ * Request max frequency from schedutil whenever a RT task is running.
+ */
+SCHED_FEAT(SUGOV_RT_MAX_FREQ, false)
+
+/*
+ * Apply schedtune boost hold to tasks of all sched classes.
+ * If enabled, schedtune will hold the boost applied to a CPU
+ * for 50ms regardless of task activation - if the task is
+ * still running 50ms later, the boost hold expires and schedtune
+ * boost will expire immediately the task stops.
+ * If disabled, this behaviour will only apply to tasks of the
+ * RT class.
+ */
+SCHED_FEAT(SCHEDTUNE_BOOST_HOLD_ALL, false)
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
index 44a1736..8a88061 100644
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@ -16,9 +16,10 @@
  * sched_idle_set_state - Record idle state for the current CPU.
  * @idle_state: State to record.
  */
-void sched_idle_set_state(struct cpuidle_state *idle_state)
+void sched_idle_set_state(struct cpuidle_state *idle_state, int index)
 {
 	idle_set_state(this_rq(), idle_state);
+	idle_set_state_idx(this_rq(), index);
 }
 
 static int __read_mostly cpu_idle_force_poll;
@@ -375,7 +376,8 @@
 
 #ifdef CONFIG_SMP
 static int
-select_task_rq_idle(struct task_struct *p, int cpu, int sd_flag, int flags)
+select_task_rq_idle(struct task_struct *p, int cpu, int sd_flag, int flags,
+		    int sibling_count_hint)
 {
 	return task_cpu(p); /* IDLE tasks as never migrated */
 }
diff --git a/kernel/sched/loadavg.c b/kernel/sched/loadavg.c
index a171c12..28a5165 100644
--- a/kernel/sched/loadavg.c
+++ b/kernel/sched/loadavg.c
@@ -91,19 +91,73 @@
 	return delta;
 }
 
-/*
- * a1 = a0 * e + a * (1 - e)
+/**
+ * fixed_power_int - compute: x^n, in O(log n) time
+ *
+ * @x:         base of the power
+ * @frac_bits: fractional bits of @x
+ * @n:         power to raise @x to.
+ *
+ * By exploiting the relation between the definition of the natural power
+ * function: x^n := x*x*...*x (x multiplied by itself for n times), and
+ * the binary encoding of numbers used by computers: n := \Sum n_i * 2^i,
+ * (where: n_i \elem {0, 1}, the binary vector representing n),
+ * we find: x^n := x^(\Sum n_i * 2^i) := \Prod x^(n_i * 2^i), which is
+ * of course trivially computable in O(log_2 n), the length of our binary
+ * vector.
  */
 static unsigned long
-calc_load(unsigned long load, unsigned long exp, unsigned long active)
+fixed_power_int(unsigned long x, unsigned int frac_bits, unsigned int n)
 {
-	unsigned long newload;
+	unsigned long result = 1UL << frac_bits;
 
-	newload = load * exp + active * (FIXED_1 - exp);
-	if (active >= load)
-		newload += FIXED_1-1;
+	if (n) {
+		for (;;) {
+			if (n & 1) {
+				result *= x;
+				result += 1UL << (frac_bits - 1);
+				result >>= frac_bits;
+			}
+			n >>= 1;
+			if (!n)
+				break;
+			x *= x;
+			x += 1UL << (frac_bits - 1);
+			x >>= frac_bits;
+		}
+	}
 
-	return newload / FIXED_1;
+	return result;
+}
+
+/*
+ * a1 = a0 * e + a * (1 - e)
+ *
+ * a2 = a1 * e + a * (1 - e)
+ *    = (a0 * e + a * (1 - e)) * e + a * (1 - e)
+ *    = a0 * e^2 + a * (1 - e) * (1 + e)
+ *
+ * a3 = a2 * e + a * (1 - e)
+ *    = (a0 * e^2 + a * (1 - e) * (1 + e)) * e + a * (1 - e)
+ *    = a0 * e^3 + a * (1 - e) * (1 + e + e^2)
+ *
+ *  ...
+ *
+ * an = a0 * e^n + a * (1 - e) * (1 + e + ... + e^n-1) [1]
+ *    = a0 * e^n + a * (1 - e) * (1 - e^n)/(1 - e)
+ *    = a0 * e^n + a * (1 - e^n)
+ *
+ * [1] application of the geometric series:
+ *
+ *              n         1 - x^(n+1)
+ *     S_n := \Sum x^i = -------------
+ *             i=0          1 - x
+ */
+unsigned long
+calc_load_n(unsigned long load, unsigned long exp,
+	    unsigned long active, unsigned int n)
+{
+	return calc_load(load, fixed_power_int(exp, FSHIFT, n), active);
 }
 
 #ifdef CONFIG_NO_HZ_COMMON
@@ -225,75 +279,6 @@
 	return delta;
 }
 
-/**
- * fixed_power_int - compute: x^n, in O(log n) time
- *
- * @x:         base of the power
- * @frac_bits: fractional bits of @x
- * @n:         power to raise @x to.
- *
- * By exploiting the relation between the definition of the natural power
- * function: x^n := x*x*...*x (x multiplied by itself for n times), and
- * the binary encoding of numbers used by computers: n := \Sum n_i * 2^i,
- * (where: n_i \elem {0, 1}, the binary vector representing n),
- * we find: x^n := x^(\Sum n_i * 2^i) := \Prod x^(n_i * 2^i), which is
- * of course trivially computable in O(log_2 n), the length of our binary
- * vector.
- */
-static unsigned long
-fixed_power_int(unsigned long x, unsigned int frac_bits, unsigned int n)
-{
-	unsigned long result = 1UL << frac_bits;
-
-	if (n) {
-		for (;;) {
-			if (n & 1) {
-				result *= x;
-				result += 1UL << (frac_bits - 1);
-				result >>= frac_bits;
-			}
-			n >>= 1;
-			if (!n)
-				break;
-			x *= x;
-			x += 1UL << (frac_bits - 1);
-			x >>= frac_bits;
-		}
-	}
-
-	return result;
-}
-
-/*
- * a1 = a0 * e + a * (1 - e)
- *
- * a2 = a1 * e + a * (1 - e)
- *    = (a0 * e + a * (1 - e)) * e + a * (1 - e)
- *    = a0 * e^2 + a * (1 - e) * (1 + e)
- *
- * a3 = a2 * e + a * (1 - e)
- *    = (a0 * e^2 + a * (1 - e) * (1 + e)) * e + a * (1 - e)
- *    = a0 * e^3 + a * (1 - e) * (1 + e + e^2)
- *
- *  ...
- *
- * an = a0 * e^n + a * (1 - e) * (1 + e + ... + e^n-1) [1]
- *    = a0 * e^n + a * (1 - e) * (1 - e^n)/(1 - e)
- *    = a0 * e^n + a * (1 - e^n)
- *
- * [1] application of the geometric series:
- *
- *              n         1 - x^(n+1)
- *     S_n := \Sum x^i = -------------
- *             i=0          1 - x
- */
-static unsigned long
-calc_load_n(unsigned long load, unsigned long exp,
-	    unsigned long active, unsigned int n)
-{
-	return calc_load(load, fixed_power_int(exp, FSHIFT, n), active);
-}
-
 /*
  * NO_HZ can leave us missing all per-CPU ticks calling
  * calc_load_fold_active(), but since a NO_HZ CPU folds its delta into
diff --git a/kernel/sched/pelt.c b/kernel/sched/pelt.c
index 48a1264..19ba404 100644
--- a/kernel/sched/pelt.c
+++ b/kernel/sched/pelt.c
@@ -26,9 +26,10 @@
 
 #include <linux/sched.h>
 #include "sched.h"
-#include "sched-pelt.h"
 #include "pelt.h"
 
+#include <trace/events/sched.h>
+
 /*
  * Approximate:
  *   val * y^n,    where y^32 ~= 0.5 (~1 scheduling period)
@@ -106,16 +107,12 @@
  *                     n=1
  */
 static __always_inline u32
-accumulate_sum(u64 delta, int cpu, struct sched_avg *sa,
+accumulate_sum(u64 delta, struct sched_avg *sa,
 	       unsigned long load, unsigned long runnable, int running)
 {
-	unsigned long scale_freq, scale_cpu;
 	u32 contrib = (u32)delta; /* p == 0 -> delta < 1024 */
 	u64 periods;
 
-	scale_freq = arch_scale_freq_capacity(cpu);
-	scale_cpu = arch_scale_cpu_capacity(NULL, cpu);
-
 	delta += sa->period_contrib;
 	periods = delta / 1024; /* A period is 1024us (~1ms) */
 
@@ -137,13 +134,12 @@
 	}
 	sa->period_contrib = delta;
 
-	contrib = cap_scale(contrib, scale_freq);
 	if (load)
 		sa->load_sum += load * contrib;
 	if (runnable)
 		sa->runnable_load_sum += runnable * contrib;
 	if (running)
-		sa->util_sum += contrib * scale_cpu;
+		sa->util_sum += contrib << SCHED_CAPACITY_SHIFT;
 
 	return periods;
 }
@@ -177,7 +173,7 @@
  *            = u_0 + u_1*y + u_2*y^2 + ... [re-labeling u_i --> u_{i+1}]
  */
 static __always_inline int
-___update_load_sum(u64 now, int cpu, struct sched_avg *sa,
+___update_load_sum(u64 now, struct sched_avg *sa,
 		  unsigned long load, unsigned long runnable, int running)
 {
 	u64 delta;
@@ -221,7 +217,7 @@
 	 * Step 1: accumulate *_sum since last_update_time. If we haven't
 	 * crossed period boundaries, finish.
 	 */
-	if (!accumulate_sum(delta, cpu, sa, load, runnable, running))
+	if (!accumulate_sum(delta, sa, load, runnable, running))
 		return 0;
 
 	return 1;
@@ -267,43 +263,46 @@
  *   runnable_load_avg = \Sum se->avg.runable_load_avg
  */
 
-int __update_load_avg_blocked_se(u64 now, int cpu, struct sched_entity *se)
+int __update_load_avg_blocked_se(u64 now, struct sched_entity *se)
 {
-	if (entity_is_task(se))
-		se->runnable_weight = se->load.weight;
-
-	if (___update_load_sum(now, cpu, &se->avg, 0, 0, 0)) {
+	if (___update_load_sum(now, &se->avg, 0, 0, 0)) {
 		___update_load_avg(&se->avg, se_weight(se), se_runnable(se));
+
+		trace_sched_load_se(se);
+
 		return 1;
 	}
 
 	return 0;
 }
 
-int __update_load_avg_se(u64 now, int cpu, struct cfs_rq *cfs_rq, struct sched_entity *se)
+int __update_load_avg_se(u64 now, struct cfs_rq *cfs_rq, struct sched_entity *se)
 {
-	if (entity_is_task(se))
-		se->runnable_weight = se->load.weight;
-
-	if (___update_load_sum(now, cpu, &se->avg, !!se->on_rq, !!se->on_rq,
+	if (___update_load_sum(now, &se->avg, !!se->on_rq, !!se->on_rq,
 				cfs_rq->curr == se)) {
 
 		___update_load_avg(&se->avg, se_weight(se), se_runnable(se));
 		cfs_se_util_change(&se->avg);
+
+		trace_sched_load_se(se);
+
 		return 1;
 	}
 
 	return 0;
 }
 
-int __update_load_avg_cfs_rq(u64 now, int cpu, struct cfs_rq *cfs_rq)
+int __update_load_avg_cfs_rq(u64 now, struct cfs_rq *cfs_rq)
 {
-	if (___update_load_sum(now, cpu, &cfs_rq->avg,
+	if (___update_load_sum(now, &cfs_rq->avg,
 				scale_load_down(cfs_rq->load.weight),
 				scale_load_down(cfs_rq->runnable_weight),
 				cfs_rq->curr != NULL)) {
 
 		___update_load_avg(&cfs_rq->avg, 1, 1);
+
+		trace_sched_load_cfs_rq(cfs_rq);
+
 		return 1;
 	}
 
@@ -323,12 +322,15 @@
 
 int update_rt_rq_load_avg(u64 now, struct rq *rq, int running)
 {
-	if (___update_load_sum(now, rq->cpu, &rq->avg_rt,
+	if (___update_load_sum(now, &rq->avg_rt,
 				running,
 				running,
 				running)) {
 
 		___update_load_avg(&rq->avg_rt, 1, 1);
+
+		trace_sched_load_rt_rq(rq);
+
 		return 1;
 	}
 
@@ -346,7 +348,7 @@
 
 int update_dl_rq_load_avg(u64 now, struct rq *rq, int running)
 {
-	if (___update_load_sum(now, rq->cpu, &rq->avg_dl,
+	if (___update_load_sum(now, &rq->avg_dl,
 				running,
 				running,
 				running)) {
@@ -371,22 +373,31 @@
 int update_irq_load_avg(struct rq *rq, u64 running)
 {
 	int ret = 0;
+
+	/*
+	 * We can't use clock_pelt because irq time is not accounted in
+	 * clock_task. Instead we directly scale the running time to
+	 * reflect the real amount of computation
+	 */
+	running = cap_scale(running, arch_scale_freq_capacity(cpu_of(rq)));
+	running = cap_scale(running, arch_scale_cpu_capacity(NULL, cpu_of(rq)));
+
 	/*
 	 * We know the time that has been used by interrupt since last update
 	 * but we don't when. Let be pessimistic and assume that interrupt has
 	 * happened just before the update. This is not so far from reality
 	 * because interrupt will most probably wake up task and trig an update
-	 * of rq clock during which the metric si updated.
+	 * of rq clock during which the metric is updated.
 	 * We start to decay with normal context time and then we add the
 	 * interrupt context time.
 	 * We can safely remove running from rq->clock because
 	 * rq->clock += delta with delta >= running
 	 */
-	ret = ___update_load_sum(rq->clock - running, rq->cpu, &rq->avg_irq,
+	ret = ___update_load_sum(rq->clock - running, &rq->avg_irq,
 				0,
 				0,
 				0);
-	ret += ___update_load_sum(rq->clock, rq->cpu, &rq->avg_irq,
+	ret += ___update_load_sum(rq->clock, &rq->avg_irq,
 				1,
 				1,
 				1);
diff --git a/kernel/sched/pelt.h b/kernel/sched/pelt.h
index 7e56b48..7489d5f 100644
--- a/kernel/sched/pelt.h
+++ b/kernel/sched/pelt.h
@@ -1,8 +1,9 @@
 #ifdef CONFIG_SMP
+#include "sched-pelt.h"
 
-int __update_load_avg_blocked_se(u64 now, int cpu, struct sched_entity *se);
-int __update_load_avg_se(u64 now, int cpu, struct cfs_rq *cfs_rq, struct sched_entity *se);
-int __update_load_avg_cfs_rq(u64 now, int cpu, struct cfs_rq *cfs_rq);
+int __update_load_avg_blocked_se(u64 now, struct sched_entity *se);
+int __update_load_avg_se(u64 now, struct cfs_rq *cfs_rq, struct sched_entity *se);
+int __update_load_avg_cfs_rq(u64 now, struct cfs_rq *cfs_rq);
 int update_rt_rq_load_avg(u64 now, struct rq *rq, int running);
 int update_dl_rq_load_avg(u64 now, struct rq *rq, int running);
 
@@ -42,6 +43,101 @@
 	WRITE_ONCE(avg->util_est.enqueued, enqueued);
 }
 
+/*
+ * The clock_pelt scales the time to reflect the effective amount of
+ * computation done during the running delta time but then sync back to
+ * clock_task when rq is idle.
+ *
+ *
+ * absolute time   | 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16
+ * @ max capacity  ------******---------------******---------------
+ * @ half capacity ------************---------************---------
+ * clock pelt      | 1| 2|    3|    4| 7| 8| 9|   10|   11|14|15|16
+ *
+ */
+static inline void update_rq_clock_pelt(struct rq *rq, s64 delta)
+{
+	if (unlikely(is_idle_task(rq->curr))) {
+		/* The rq is idle, we can sync to clock_task */
+		rq->clock_pelt  = rq_clock_task(rq);
+		return;
+	}
+
+	/*
+	 * When a rq runs at a lower compute capacity, it will need
+	 * more time to do the same amount of work than at max
+	 * capacity. In order to be invariant, we scale the delta to
+	 * reflect how much work has been really done.
+	 * Running longer results in stealing idle time that will
+	 * disturb the load signal compared to max capacity. This
+	 * stolen idle time will be automatically reflected when the
+	 * rq will be idle and the clock will be synced with
+	 * rq_clock_task.
+	 */
+
+	/*
+	 * Scale the elapsed time to reflect the real amount of
+	 * computation
+	 */
+	delta = cap_scale(delta, arch_scale_cpu_capacity(NULL, cpu_of(rq)));
+	delta = cap_scale(delta, arch_scale_freq_capacity(cpu_of(rq)));
+
+	rq->clock_pelt += delta;
+}
+
+/*
+ * When rq becomes idle, we have to check if it has lost idle time
+ * because it was fully busy. A rq is fully used when the /Sum util_sum
+ * is greater or equal to:
+ * (LOAD_AVG_MAX - 1024 + rq->cfs.avg.period_contrib) << SCHED_CAPACITY_SHIFT;
+ * For optimization and computing rounding purpose, we don't take into account
+ * the position in the current window (period_contrib) and we use the higher
+ * bound of util_sum to decide.
+ */
+static inline void update_idle_rq_clock_pelt(struct rq *rq)
+{
+	u32 divider = ((LOAD_AVG_MAX - 1024) << SCHED_CAPACITY_SHIFT) - LOAD_AVG_MAX;
+	u32 util_sum = rq->cfs.avg.util_sum;
+	util_sum += rq->avg_rt.util_sum;
+	util_sum += rq->avg_dl.util_sum;
+
+	/*
+	 * Reflecting stolen time makes sense only if the idle
+	 * phase would be present at max capacity. As soon as the
+	 * utilization of a rq has reached the maximum value, it is
+	 * considered as an always runnig rq without idle time to
+	 * steal. This potential idle time is considered as lost in
+	 * this case. We keep track of this lost idle time compare to
+	 * rq's clock_task.
+	 */
+	if (util_sum >= divider)
+		rq->lost_idle_time += rq_clock_task(rq) - rq->clock_pelt;
+}
+
+static inline u64 rq_clock_pelt(struct rq *rq)
+{
+	lockdep_assert_held(&rq->lock);
+	assert_clock_updated(rq);
+
+	return rq->clock_pelt - rq->lost_idle_time;
+}
+
+#ifdef CONFIG_CFS_BANDWIDTH
+/* rq->task_clock normalized against any time this cfs_rq has spent throttled */
+static inline u64 cfs_rq_clock_pelt(struct cfs_rq *cfs_rq)
+{
+	if (unlikely(cfs_rq->throttle_count))
+		return cfs_rq->throttled_clock_task - cfs_rq->throttled_clock_task_time;
+
+	return rq_clock_pelt(rq_of(cfs_rq)) - cfs_rq->throttled_clock_task_time;
+}
+#else
+static inline u64 cfs_rq_clock_pelt(struct cfs_rq *cfs_rq)
+{
+	return rq_clock_pelt(rq_of(cfs_rq));
+}
+#endif
+
 #else
 
 static inline int
@@ -67,6 +163,18 @@
 {
 	return 0;
 }
+
+static inline u64 rq_clock_pelt(struct rq *rq)
+{
+	return rq_clock_task(rq);
+}
+
+static inline void
+update_rq_clock_pelt(struct rq *rq, s64 delta) { }
+
+static inline void
+update_idle_rq_clock_pelt(struct rq *rq) { }
+
 #endif
 
 
diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c
new file mode 100644
index 0000000..c09e8b27
--- /dev/null
+++ b/kernel/sched/psi.c
@@ -0,0 +1,1288 @@
+/*
+ * Pressure stall information for CPU, memory and IO
+ *
+ * Copyright (c) 2018 Facebook, Inc.
+ * Author: Johannes Weiner <hannes@cmpxchg.org>
+ *
+ * Polling support by Suren Baghdasaryan <surenb@google.com>
+ * Copyright (c) 2018 Google, Inc.
+ *
+ * When CPU, memory and IO are contended, tasks experience delays that
+ * reduce throughput and introduce latencies into the workload. Memory
+ * and IO contention, in addition, can cause a full loss of forward
+ * progress in which the CPU goes idle.
+ *
+ * This code aggregates individual task delays into resource pressure
+ * metrics that indicate problems with both workload health and
+ * resource utilization.
+ *
+ *			Model
+ *
+ * The time in which a task can execute on a CPU is our baseline for
+ * productivity. Pressure expresses the amount of time in which this
+ * potential cannot be realized due to resource contention.
+ *
+ * This concept of productivity has two components: the workload and
+ * the CPU. To measure the impact of pressure on both, we define two
+ * contention states for a resource: SOME and FULL.
+ *
+ * In the SOME state of a given resource, one or more tasks are
+ * delayed on that resource. This affects the workload's ability to
+ * perform work, but the CPU may still be executing other tasks.
+ *
+ * In the FULL state of a given resource, all non-idle tasks are
+ * delayed on that resource such that nobody is advancing and the CPU
+ * goes idle. This leaves both workload and CPU unproductive.
+ *
+ * (Naturally, the FULL state doesn't exist for the CPU resource.)
+ *
+ *	SOME = nr_delayed_tasks != 0
+ *	FULL = nr_delayed_tasks != 0 && nr_running_tasks == 0
+ *
+ * The percentage of wallclock time spent in those compound stall
+ * states gives pressure numbers between 0 and 100 for each resource,
+ * where the SOME percentage indicates workload slowdowns and the FULL
+ * percentage indicates reduced CPU utilization:
+ *
+ *	%SOME = time(SOME) / period
+ *	%FULL = time(FULL) / period
+ *
+ *			Multiple CPUs
+ *
+ * The more tasks and available CPUs there are, the more work can be
+ * performed concurrently. This means that the potential that can go
+ * unrealized due to resource contention *also* scales with non-idle
+ * tasks and CPUs.
+ *
+ * Consider a scenario where 257 number crunching tasks are trying to
+ * run concurrently on 256 CPUs. If we simply aggregated the task
+ * states, we would have to conclude a CPU SOME pressure number of
+ * 100%, since *somebody* is waiting on a runqueue at all
+ * times. However, that is clearly not the amount of contention the
+ * workload is experiencing: only one out of 256 possible exceution
+ * threads will be contended at any given time, or about 0.4%.
+ *
+ * Conversely, consider a scenario of 4 tasks and 4 CPUs where at any
+ * given time *one* of the tasks is delayed due to a lack of memory.
+ * Again, looking purely at the task state would yield a memory FULL
+ * pressure number of 0%, since *somebody* is always making forward
+ * progress. But again this wouldn't capture the amount of execution
+ * potential lost, which is 1 out of 4 CPUs, or 25%.
+ *
+ * To calculate wasted potential (pressure) with multiple processors,
+ * we have to base our calculation on the number of non-idle tasks in
+ * conjunction with the number of available CPUs, which is the number
+ * of potential execution threads. SOME becomes then the proportion of
+ * delayed tasks to possibe threads, and FULL is the share of possible
+ * threads that are unproductive due to delays:
+ *
+ *	threads = min(nr_nonidle_tasks, nr_cpus)
+ *	   SOME = min(nr_delayed_tasks / threads, 1)
+ *	   FULL = (threads - min(nr_running_tasks, threads)) / threads
+ *
+ * For the 257 number crunchers on 256 CPUs, this yields:
+ *
+ *	threads = min(257, 256)
+ *	   SOME = min(1 / 256, 1)             = 0.4%
+ *	   FULL = (256 - min(257, 256)) / 256 = 0%
+ *
+ * For the 1 out of 4 memory-delayed tasks, this yields:
+ *
+ *	threads = min(4, 4)
+ *	   SOME = min(1 / 4, 1)               = 25%
+ *	   FULL = (4 - min(3, 4)) / 4         = 25%
+ *
+ * [ Substitute nr_cpus with 1, and you can see that it's a natural
+ *   extension of the single-CPU model. ]
+ *
+ *			Implementation
+ *
+ * To assess the precise time spent in each such state, we would have
+ * to freeze the system on task changes and start/stop the state
+ * clocks accordingly. Obviously that doesn't scale in practice.
+ *
+ * Because the scheduler aims to distribute the compute load evenly
+ * among the available CPUs, we can track task state locally to each
+ * CPU and, at much lower frequency, extrapolate the global state for
+ * the cumulative stall times and the running averages.
+ *
+ * For each runqueue, we track:
+ *
+ *	   tSOME[cpu] = time(nr_delayed_tasks[cpu] != 0)
+ *	   tFULL[cpu] = time(nr_delayed_tasks[cpu] && !nr_running_tasks[cpu])
+ *	tNONIDLE[cpu] = time(nr_nonidle_tasks[cpu] != 0)
+ *
+ * and then periodically aggregate:
+ *
+ *	tNONIDLE = sum(tNONIDLE[i])
+ *
+ *	   tSOME = sum(tSOME[i] * tNONIDLE[i]) / tNONIDLE
+ *	   tFULL = sum(tFULL[i] * tNONIDLE[i]) / tNONIDLE
+ *
+ *	   %SOME = tSOME / period
+ *	   %FULL = tFULL / period
+ *
+ * This gives us an approximation of pressure that is practical
+ * cost-wise, yet way more sensitive and accurate than periodic
+ * sampling of the aggregate task states would be.
+ */
+
+#include "../workqueue_internal.h"
+#include <linux/sched/loadavg.h>
+#include <linux/seq_file.h>
+#include <linux/proc_fs.h>
+#include <linux/seqlock.h>
+#include <linux/uaccess.h>
+#include <linux/cgroup.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/ctype.h>
+#include <linux/file.h>
+#include <linux/poll.h>
+#include <linux/psi.h>
+#include "sched.h"
+
+static int psi_bug __read_mostly;
+
+DEFINE_STATIC_KEY_FALSE(psi_disabled);
+
+#ifdef CONFIG_PSI_DEFAULT_DISABLED
+static bool psi_enable;
+#else
+static bool psi_enable = true;
+#endif
+static int __init setup_psi(char *str)
+{
+	return kstrtobool(str, &psi_enable) == 0;
+}
+__setup("psi=", setup_psi);
+
+/* Running averages - we need to be higher-res than loadavg */
+#define PSI_FREQ	(2*HZ+1)	/* 2 sec intervals */
+#define EXP_10s		1677		/* 1/exp(2s/10s) as fixed-point */
+#define EXP_60s		1981		/* 1/exp(2s/60s) */
+#define EXP_300s	2034		/* 1/exp(2s/300s) */
+
+/* PSI trigger definitions */
+#define WINDOW_MIN_US 500000	/* Min window size is 500ms */
+#define WINDOW_MAX_US 10000000	/* Max window size is 10s */
+#define UPDATES_PER_WINDOW 10	/* 10 updates per window */
+
+/* Sampling frequency in nanoseconds */
+static u64 psi_period __read_mostly;
+
+/* System-level pressure and stall tracking */
+static DEFINE_PER_CPU(struct psi_group_cpu, system_group_pcpu);
+static struct psi_group psi_system = {
+	.pcpu = &system_group_pcpu,
+};
+
+static void psi_avgs_work(struct work_struct *work);
+
+static void group_init(struct psi_group *group)
+{
+	int cpu;
+
+	for_each_possible_cpu(cpu)
+		seqcount_init(&per_cpu_ptr(group->pcpu, cpu)->seq);
+	group->avg_next_update = sched_clock() + psi_period;
+	INIT_DELAYED_WORK(&group->avgs_work, psi_avgs_work);
+	mutex_init(&group->avgs_lock);
+	/* Init trigger-related members */
+	atomic_set(&group->poll_scheduled, 0);
+	mutex_init(&group->trigger_lock);
+	INIT_LIST_HEAD(&group->triggers);
+	memset(group->nr_triggers, 0, sizeof(group->nr_triggers));
+	group->poll_states = 0;
+	group->poll_min_period = U32_MAX;
+	memset(group->polling_total, 0, sizeof(group->polling_total));
+	group->polling_next_update = ULLONG_MAX;
+	group->polling_until = 0;
+	rcu_assign_pointer(group->poll_kworker, NULL);
+}
+
+void __init psi_init(void)
+{
+	if (!psi_enable) {
+		static_branch_enable(&psi_disabled);
+		return;
+	}
+
+	psi_period = jiffies_to_nsecs(PSI_FREQ);
+	group_init(&psi_system);
+}
+
+static bool test_state(unsigned int *tasks, enum psi_states state)
+{
+	switch (state) {
+	case PSI_IO_SOME:
+		return tasks[NR_IOWAIT];
+	case PSI_IO_FULL:
+		return tasks[NR_IOWAIT] && !tasks[NR_RUNNING];
+	case PSI_MEM_SOME:
+		return tasks[NR_MEMSTALL];
+	case PSI_MEM_FULL:
+		return tasks[NR_MEMSTALL] && !tasks[NR_RUNNING];
+	case PSI_CPU_SOME:
+		return tasks[NR_RUNNING] > 1;
+	case PSI_NONIDLE:
+		return tasks[NR_IOWAIT] || tasks[NR_MEMSTALL] ||
+			tasks[NR_RUNNING];
+	default:
+		return false;
+	}
+}
+
+static void get_recent_times(struct psi_group *group, int cpu,
+			     enum psi_aggregators aggregator, u32 *times,
+			     u32 *pchanged_states)
+{
+	struct psi_group_cpu *groupc = per_cpu_ptr(group->pcpu, cpu);
+	u64 now, state_start;
+	enum psi_states s;
+	unsigned int seq;
+	u32 state_mask;
+
+	*pchanged_states = 0;
+
+	/* Snapshot a coherent view of the CPU state */
+	do {
+		seq = read_seqcount_begin(&groupc->seq);
+		now = cpu_clock(cpu);
+		memcpy(times, groupc->times, sizeof(groupc->times));
+		state_mask = groupc->state_mask;
+		state_start = groupc->state_start;
+	} while (read_seqcount_retry(&groupc->seq, seq));
+
+	/* Calculate state time deltas against the previous snapshot */
+	for (s = 0; s < NR_PSI_STATES; s++) {
+		u32 delta;
+		/*
+		 * In addition to already concluded states, we also
+		 * incorporate currently active states on the CPU,
+		 * since states may last for many sampling periods.
+		 *
+		 * This way we keep our delta sampling buckets small
+		 * (u32) and our reported pressure close to what's
+		 * actually happening.
+		 */
+		if (state_mask & (1 << s))
+			times[s] += now - state_start;
+
+		delta = times[s] - groupc->times_prev[aggregator][s];
+		groupc->times_prev[aggregator][s] = times[s];
+
+		times[s] = delta;
+		if (delta)
+			*pchanged_states |= (1 << s);
+	}
+}
+
+static void calc_avgs(unsigned long avg[3], int missed_periods,
+		      u64 time, u64 period)
+{
+	unsigned long pct;
+
+	/* Fill in zeroes for periods of no activity */
+	if (missed_periods) {
+		avg[0] = calc_load_n(avg[0], EXP_10s, 0, missed_periods);
+		avg[1] = calc_load_n(avg[1], EXP_60s, 0, missed_periods);
+		avg[2] = calc_load_n(avg[2], EXP_300s, 0, missed_periods);
+	}
+
+	/* Sample the most recent active period */
+	pct = div_u64(time * 100, period);
+	pct *= FIXED_1;
+	avg[0] = calc_load(avg[0], EXP_10s, pct);
+	avg[1] = calc_load(avg[1], EXP_60s, pct);
+	avg[2] = calc_load(avg[2], EXP_300s, pct);
+}
+
+static void collect_percpu_times(struct psi_group *group,
+				 enum psi_aggregators aggregator,
+				 u32 *pchanged_states)
+{
+	u64 deltas[NR_PSI_STATES - 1] = { 0, };
+	unsigned long nonidle_total = 0;
+	u32 changed_states = 0;
+	int cpu;
+	int s;
+
+	/*
+	 * Collect the per-cpu time buckets and average them into a
+	 * single time sample that is normalized to wallclock time.
+	 *
+	 * For averaging, each CPU is weighted by its non-idle time in
+	 * the sampling period. This eliminates artifacts from uneven
+	 * loading, or even entirely idle CPUs.
+	 */
+	for_each_possible_cpu(cpu) {
+		u32 times[NR_PSI_STATES];
+		u32 nonidle;
+		u32 cpu_changed_states;
+
+		get_recent_times(group, cpu, aggregator, times,
+				&cpu_changed_states);
+		changed_states |= cpu_changed_states;
+
+		nonidle = nsecs_to_jiffies(times[PSI_NONIDLE]);
+		nonidle_total += nonidle;
+
+		for (s = 0; s < PSI_NONIDLE; s++)
+			deltas[s] += (u64)times[s] * nonidle;
+	}
+
+	/*
+	 * Integrate the sample into the running statistics that are
+	 * reported to userspace: the cumulative stall times and the
+	 * decaying averages.
+	 *
+	 * Pressure percentages are sampled at PSI_FREQ. We might be
+	 * called more often when the user polls more frequently than
+	 * that; we might be called less often when there is no task
+	 * activity, thus no data, and clock ticks are sporadic. The
+	 * below handles both.
+	 */
+
+	/* total= */
+	for (s = 0; s < NR_PSI_STATES - 1; s++)
+		group->total[aggregator][s] +=
+				div_u64(deltas[s], max(nonidle_total, 1UL));
+
+	if (pchanged_states)
+		*pchanged_states = changed_states;
+}
+
+static u64 update_averages(struct psi_group *group, u64 now)
+{
+	unsigned long missed_periods = 0;
+	u64 expires, period;
+	u64 avg_next_update;
+	int s;
+
+	/* avgX= */
+	expires = group->avg_next_update;
+	if (now - expires >= psi_period)
+		missed_periods = div_u64(now - expires, psi_period);
+
+	/*
+	 * The periodic clock tick can get delayed for various
+	 * reasons, especially on loaded systems. To avoid clock
+	 * drift, we schedule the clock in fixed psi_period intervals.
+	 * But the deltas we sample out of the per-cpu buckets above
+	 * are based on the actual time elapsing between clock ticks.
+	 */
+	avg_next_update = expires + ((1 + missed_periods) * psi_period);
+	period = now - (group->avg_last_update + (missed_periods * psi_period));
+	group->avg_last_update = now;
+
+	for (s = 0; s < NR_PSI_STATES - 1; s++) {
+		u32 sample;
+
+		sample = group->total[PSI_AVGS][s] - group->avg_total[s];
+		/*
+		 * Due to the lockless sampling of the time buckets,
+		 * recorded time deltas can slip into the next period,
+		 * which under full pressure can result in samples in
+		 * excess of the period length.
+		 *
+		 * We don't want to report non-sensical pressures in
+		 * excess of 100%, nor do we want to drop such events
+		 * on the floor. Instead we punt any overage into the
+		 * future until pressure subsides. By doing this we
+		 * don't underreport the occurring pressure curve, we
+		 * just report it delayed by one period length.
+		 *
+		 * The error isn't cumulative. As soon as another
+		 * delta slips from a period P to P+1, by definition
+		 * it frees up its time T in P.
+		 */
+		if (sample > period)
+			sample = period;
+		group->avg_total[s] += sample;
+		calc_avgs(group->avg[s], missed_periods, sample, period);
+	}
+
+	return avg_next_update;
+}
+
+static void psi_avgs_work(struct work_struct *work)
+{
+	struct delayed_work *dwork;
+	struct psi_group *group;
+	u32 changed_states;
+	bool nonidle;
+	u64 now;
+
+	dwork = to_delayed_work(work);
+	group = container_of(dwork, struct psi_group, avgs_work);
+
+	mutex_lock(&group->avgs_lock);
+
+	now = sched_clock();
+
+	collect_percpu_times(group, PSI_AVGS, &changed_states);
+	nonidle = changed_states & (1 << PSI_NONIDLE);
+	/*
+	 * If there is task activity, periodically fold the per-cpu
+	 * times and feed samples into the running averages. If things
+	 * are idle and there is no data to process, stop the clock.
+	 * Once restarted, we'll catch up the running averages in one
+	 * go - see calc_avgs() and missed_periods.
+	 */
+	if (now >= group->avg_next_update)
+		group->avg_next_update = update_averages(group, now);
+
+	if (nonidle) {
+		schedule_delayed_work(dwork, nsecs_to_jiffies(
+				group->avg_next_update - now) + 1);
+	}
+
+	mutex_unlock(&group->avgs_lock);
+}
+
+/* Trigger tracking window manupulations */
+static void window_reset(struct psi_window *win, u64 now, u64 value,
+			 u64 prev_growth)
+{
+	win->start_time = now;
+	win->start_value = value;
+	win->prev_growth = prev_growth;
+}
+
+/*
+ * PSI growth tracking window update and growth calculation routine.
+ *
+ * This approximates a sliding tracking window by interpolating
+ * partially elapsed windows using historical growth data from the
+ * previous intervals. This minimizes memory requirements (by not storing
+ * all the intermediate values in the previous window) and simplifies
+ * the calculations. It works well because PSI signal changes only in
+ * positive direction and over relatively small window sizes the growth
+ * is close to linear.
+ */
+static u64 window_update(struct psi_window *win, u64 now, u64 value)
+{
+	u64 elapsed;
+	u64 growth;
+
+	elapsed = now - win->start_time;
+	growth = value - win->start_value;
+	/*
+	 * After each tracking window passes win->start_value and
+	 * win->start_time get reset and win->prev_growth stores
+	 * the average per-window growth of the previous window.
+	 * win->prev_growth is then used to interpolate additional
+	 * growth from the previous window assuming it was linear.
+	 */
+	if (elapsed > win->size)
+		window_reset(win, now, value, growth);
+	else {
+		u32 remaining;
+
+		remaining = win->size - elapsed;
+		growth += div_u64(win->prev_growth * remaining, win->size);
+	}
+
+	return growth;
+}
+
+static void init_triggers(struct psi_group *group, u64 now)
+{
+	struct psi_trigger *t;
+
+	list_for_each_entry(t, &group->triggers, node)
+		window_reset(&t->win, now,
+				group->total[PSI_POLL][t->state], 0);
+	memcpy(group->polling_total, group->total[PSI_POLL],
+		   sizeof(group->polling_total));
+	group->polling_next_update = now + group->poll_min_period;
+}
+
+static u64 update_triggers(struct psi_group *group, u64 now)
+{
+	struct psi_trigger *t;
+	bool new_stall = false;
+	u64 *total = group->total[PSI_POLL];
+
+	/*
+	 * On subsequent updates, calculate growth deltas and let
+	 * watchers know when their specified thresholds are exceeded.
+	 */
+	list_for_each_entry(t, &group->triggers, node) {
+		u64 growth;
+
+		/* Check for stall activity */
+		if (group->polling_total[t->state] == total[t->state])
+			continue;
+
+		/*
+		 * Multiple triggers might be looking at the same state,
+		 * remember to update group->polling_total[] once we've
+		 * been through all of them. Also remember to extend the
+		 * polling time if we see new stall activity.
+		 */
+		new_stall = true;
+
+		/* Calculate growth since last update */
+		growth = window_update(&t->win, now, total[t->state]);
+		if (growth < t->threshold)
+			continue;
+
+		/* Limit event signaling to once per window */
+		if (now < t->last_event_time + t->win.size)
+			continue;
+
+		/* Generate an event */
+		if (cmpxchg(&t->event, 0, 1) == 0)
+			wake_up_interruptible(&t->event_wait);
+		t->last_event_time = now;
+	}
+
+	if (new_stall)
+		memcpy(group->polling_total, total,
+				sizeof(group->polling_total));
+
+	return now + group->poll_min_period;
+}
+
+/*
+ * Schedule polling if it's not already scheduled. It's safe to call even from
+ * hotpath because even though kthread_queue_delayed_work takes worker->lock
+ * spinlock that spinlock is never contended due to poll_scheduled atomic
+ * preventing such competition.
+ */
+static void psi_schedule_poll_work(struct psi_group *group, unsigned long delay)
+{
+	struct kthread_worker *kworker;
+
+	/* Do not reschedule if already scheduled */
+	if (atomic_cmpxchg(&group->poll_scheduled, 0, 1) != 0)
+		return;
+
+	rcu_read_lock();
+
+	kworker = rcu_dereference(group->poll_kworker);
+	/*
+	 * kworker might be NULL in case psi_trigger_destroy races with
+	 * psi_task_change (hotpath) which can't use locks
+	 */
+	if (likely(kworker))
+		kthread_queue_delayed_work(kworker, &group->poll_work, delay);
+	else
+		atomic_set(&group->poll_scheduled, 0);
+
+	rcu_read_unlock();
+}
+
+static void psi_poll_work(struct kthread_work *work)
+{
+	struct kthread_delayed_work *dwork;
+	struct psi_group *group;
+	u32 changed_states;
+	u64 now;
+
+	dwork = container_of(work, struct kthread_delayed_work, work);
+	group = container_of(dwork, struct psi_group, poll_work);
+
+	atomic_set(&group->poll_scheduled, 0);
+
+	mutex_lock(&group->trigger_lock);
+
+	now = sched_clock();
+
+	collect_percpu_times(group, PSI_POLL, &changed_states);
+
+	if (changed_states & group->poll_states) {
+		/* Initialize trigger windows when entering polling mode */
+		if (now > group->polling_until)
+			init_triggers(group, now);
+
+		/*
+		 * Keep the monitor active for at least the duration of the
+		 * minimum tracking window as long as monitor states are
+		 * changing.
+		 */
+		group->polling_until = now +
+			group->poll_min_period * UPDATES_PER_WINDOW;
+	}
+
+	if (now > group->polling_until) {
+		group->polling_next_update = ULLONG_MAX;
+		goto out;
+	}
+
+	if (now >= group->polling_next_update)
+		group->polling_next_update = update_triggers(group, now);
+
+	psi_schedule_poll_work(group,
+		nsecs_to_jiffies(group->polling_next_update - now) + 1);
+
+out:
+	mutex_unlock(&group->trigger_lock);
+}
+
+static void record_times(struct psi_group_cpu *groupc, int cpu,
+			 bool memstall_tick)
+{
+	u32 delta;
+	u64 now;
+
+	now = cpu_clock(cpu);
+	delta = now - groupc->state_start;
+	groupc->state_start = now;
+
+	if (groupc->state_mask & (1 << PSI_IO_SOME)) {
+		groupc->times[PSI_IO_SOME] += delta;
+		if (groupc->state_mask & (1 << PSI_IO_FULL))
+			groupc->times[PSI_IO_FULL] += delta;
+	}
+
+	if (groupc->state_mask & (1 << PSI_MEM_SOME)) {
+		groupc->times[PSI_MEM_SOME] += delta;
+		if (groupc->state_mask & (1 << PSI_MEM_FULL))
+			groupc->times[PSI_MEM_FULL] += delta;
+		else if (memstall_tick) {
+			u32 sample;
+			/*
+			 * Since we care about lost potential, a
+			 * memstall is FULL when there are no other
+			 * working tasks, but also when the CPU is
+			 * actively reclaiming and nothing productive
+			 * could run even if it were runnable.
+			 *
+			 * When the timer tick sees a reclaiming CPU,
+			 * regardless of runnable tasks, sample a FULL
+			 * tick (or less if it hasn't been a full tick
+			 * since the last state change).
+			 */
+			sample = min(delta, (u32)jiffies_to_nsecs(1));
+			groupc->times[PSI_MEM_FULL] += sample;
+		}
+	}
+
+	if (groupc->state_mask & (1 << PSI_CPU_SOME))
+		groupc->times[PSI_CPU_SOME] += delta;
+
+	if (groupc->state_mask & (1 << PSI_NONIDLE))
+		groupc->times[PSI_NONIDLE] += delta;
+}
+
+static u32 psi_group_change(struct psi_group *group, int cpu,
+			    unsigned int clear, unsigned int set)
+{
+	struct psi_group_cpu *groupc;
+	unsigned int t, m;
+	enum psi_states s;
+	u32 state_mask = 0;
+
+	groupc = per_cpu_ptr(group->pcpu, cpu);
+
+	/*
+	 * First we assess the aggregate resource states this CPU's
+	 * tasks have been in since the last change, and account any
+	 * SOME and FULL time these may have resulted in.
+	 *
+	 * Then we update the task counts according to the state
+	 * change requested through the @clear and @set bits.
+	 */
+	write_seqcount_begin(&groupc->seq);
+
+	record_times(groupc, cpu, false);
+
+	for (t = 0, m = clear; m; m &= ~(1 << t), t++) {
+		if (!(m & (1 << t)))
+			continue;
+		if (groupc->tasks[t] == 0 && !psi_bug) {
+			printk_deferred(KERN_ERR "psi: task underflow! cpu=%d t=%d tasks=[%u %u %u] clear=%x set=%x\n",
+					cpu, t, groupc->tasks[0],
+					groupc->tasks[1], groupc->tasks[2],
+					clear, set);
+			psi_bug = 1;
+		}
+		groupc->tasks[t]--;
+	}
+
+	for (t = 0; set; set &= ~(1 << t), t++)
+		if (set & (1 << t))
+			groupc->tasks[t]++;
+
+	/* Calculate state mask representing active states */
+	for (s = 0; s < NR_PSI_STATES; s++) {
+		if (test_state(groupc->tasks, s))
+			state_mask |= (1 << s);
+	}
+	groupc->state_mask = state_mask;
+
+	write_seqcount_end(&groupc->seq);
+
+	return state_mask;
+}
+
+static struct psi_group *iterate_groups(struct task_struct *task, void **iter)
+{
+#ifdef CONFIG_CGROUPS
+	struct cgroup *cgroup = NULL;
+
+	if (!*iter)
+		cgroup = task->cgroups->dfl_cgrp;
+	else if (*iter == &psi_system)
+		return NULL;
+	else
+		cgroup = cgroup_parent(*iter);
+
+	if (cgroup && cgroup_parent(cgroup)) {
+		*iter = cgroup;
+		return cgroup_psi(cgroup);
+	}
+#else
+	if (*iter)
+		return NULL;
+#endif
+	*iter = &psi_system;
+	return &psi_system;
+}
+
+void psi_task_change(struct task_struct *task, int clear, int set)
+{
+	int cpu = task_cpu(task);
+	struct psi_group *group;
+	bool wake_clock = true;
+	void *iter = NULL;
+
+	if (!task->pid)
+		return;
+
+	if (((task->psi_flags & set) ||
+	     (task->psi_flags & clear) != clear) &&
+	    !psi_bug) {
+		printk_deferred(KERN_ERR "psi: inconsistent task state! task=%d:%s cpu=%d psi_flags=%x clear=%x set=%x\n",
+				task->pid, task->comm, cpu,
+				task->psi_flags, clear, set);
+		psi_bug = 1;
+	}
+
+	task->psi_flags &= ~clear;
+	task->psi_flags |= set;
+
+	/*
+	 * Periodic aggregation shuts off if there is a period of no
+	 * task changes, so we wake it back up if necessary. However,
+	 * don't do this if the task change is the aggregation worker
+	 * itself going to sleep, or we'll ping-pong forever.
+	 */
+	if (unlikely((clear & TSK_RUNNING) &&
+		     (task->flags & PF_WQ_WORKER) &&
+		     wq_worker_last_func(task) == psi_avgs_work))
+		wake_clock = false;
+
+	while ((group = iterate_groups(task, &iter))) {
+		u32 state_mask = psi_group_change(group, cpu, clear, set);
+
+		if (state_mask & group->poll_states)
+			psi_schedule_poll_work(group, 1);
+
+		if (wake_clock && !delayed_work_pending(&group->avgs_work))
+			schedule_delayed_work(&group->avgs_work, PSI_FREQ);
+	}
+}
+
+void psi_memstall_tick(struct task_struct *task, int cpu)
+{
+	struct psi_group *group;
+	void *iter = NULL;
+
+	while ((group = iterate_groups(task, &iter))) {
+		struct psi_group_cpu *groupc;
+
+		groupc = per_cpu_ptr(group->pcpu, cpu);
+		write_seqcount_begin(&groupc->seq);
+		record_times(groupc, cpu, true);
+		write_seqcount_end(&groupc->seq);
+	}
+}
+
+/**
+ * psi_memstall_enter - mark the beginning of a memory stall section
+ * @flags: flags to handle nested sections
+ *
+ * Marks the calling task as being stalled due to a lack of memory,
+ * such as waiting for a refault or performing reclaim.
+ */
+void psi_memstall_enter(unsigned long *flags)
+{
+	struct rq_flags rf;
+	struct rq *rq;
+
+	if (static_branch_likely(&psi_disabled))
+		return;
+
+	*flags = current->flags & PF_MEMSTALL;
+	if (*flags)
+		return;
+	/*
+	 * PF_MEMSTALL setting & accounting needs to be atomic wrt
+	 * changes to the task's scheduling state, otherwise we can
+	 * race with CPU migration.
+	 */
+	rq = this_rq_lock_irq(&rf);
+
+	current->flags |= PF_MEMSTALL;
+	psi_task_change(current, 0, TSK_MEMSTALL);
+
+	rq_unlock_irq(rq, &rf);
+}
+
+/**
+ * psi_memstall_leave - mark the end of an memory stall section
+ * @flags: flags to handle nested memdelay sections
+ *
+ * Marks the calling task as no longer stalled due to lack of memory.
+ */
+void psi_memstall_leave(unsigned long *flags)
+{
+	struct rq_flags rf;
+	struct rq *rq;
+
+	if (static_branch_likely(&psi_disabled))
+		return;
+
+	if (*flags)
+		return;
+	/*
+	 * PF_MEMSTALL clearing & accounting needs to be atomic wrt
+	 * changes to the task's scheduling state, otherwise we could
+	 * race with CPU migration.
+	 */
+	rq = this_rq_lock_irq(&rf);
+
+	current->flags &= ~PF_MEMSTALL;
+	psi_task_change(current, TSK_MEMSTALL, 0);
+
+	rq_unlock_irq(rq, &rf);
+}
+
+#ifdef CONFIG_CGROUPS
+int psi_cgroup_alloc(struct cgroup *cgroup)
+{
+	if (static_branch_likely(&psi_disabled))
+		return 0;
+
+	cgroup->psi.pcpu = alloc_percpu(struct psi_group_cpu);
+	if (!cgroup->psi.pcpu)
+		return -ENOMEM;
+	group_init(&cgroup->psi);
+	return 0;
+}
+
+void psi_cgroup_free(struct cgroup *cgroup)
+{
+	if (static_branch_likely(&psi_disabled))
+		return;
+
+	cancel_delayed_work_sync(&cgroup->psi.avgs_work);
+	free_percpu(cgroup->psi.pcpu);
+	/* All triggers must be removed by now */
+	WARN_ONCE(cgroup->psi.poll_states, "psi: trigger leak\n");
+}
+
+/**
+ * cgroup_move_task - move task to a different cgroup
+ * @task: the task
+ * @to: the target css_set
+ *
+ * Move task to a new cgroup and safely migrate its associated stall
+ * state between the different groups.
+ *
+ * This function acquires the task's rq lock to lock out concurrent
+ * changes to the task's scheduling state and - in case the task is
+ * running - concurrent changes to its stall state.
+ */
+void cgroup_move_task(struct task_struct *task, struct css_set *to)
+{
+	unsigned int task_flags = 0;
+	struct rq_flags rf;
+	struct rq *rq;
+
+	if (static_branch_likely(&psi_disabled)) {
+		/*
+		 * Lame to do this here, but the scheduler cannot be locked
+		 * from the outside, so we move cgroups from inside sched/.
+		 */
+		rcu_assign_pointer(task->cgroups, to);
+		return;
+	}
+
+	rq = task_rq_lock(task, &rf);
+
+	if (task_on_rq_queued(task))
+		task_flags = TSK_RUNNING;
+	else if (task->in_iowait)
+		task_flags = TSK_IOWAIT;
+
+	if (task->flags & PF_MEMSTALL)
+		task_flags |= TSK_MEMSTALL;
+
+	if (task_flags)
+		psi_task_change(task, task_flags, 0);
+
+	/* See comment above */
+	rcu_assign_pointer(task->cgroups, to);
+
+	if (task_flags)
+		psi_task_change(task, 0, task_flags);
+
+	task_rq_unlock(rq, task, &rf);
+}
+#endif /* CONFIG_CGROUPS */
+
+int psi_show(struct seq_file *m, struct psi_group *group, enum psi_res res)
+{
+	int full;
+	u64 now;
+
+	if (static_branch_likely(&psi_disabled))
+		return -EOPNOTSUPP;
+
+	/* Update averages before reporting them */
+	mutex_lock(&group->avgs_lock);
+	now = sched_clock();
+	collect_percpu_times(group, PSI_AVGS, NULL);
+	if (now >= group->avg_next_update)
+		group->avg_next_update = update_averages(group, now);
+	mutex_unlock(&group->avgs_lock);
+
+	for (full = 0; full < 2 - (res == PSI_CPU); full++) {
+		unsigned long avg[3];
+		u64 total;
+		int w;
+
+		for (w = 0; w < 3; w++)
+			avg[w] = group->avg[res * 2 + full][w];
+		total = div_u64(group->total[PSI_AVGS][res * 2 + full],
+				NSEC_PER_USEC);
+
+		seq_printf(m, "%s avg10=%lu.%02lu avg60=%lu.%02lu avg300=%lu.%02lu total=%llu\n",
+			   full ? "full" : "some",
+			   LOAD_INT(avg[0]), LOAD_FRAC(avg[0]),
+			   LOAD_INT(avg[1]), LOAD_FRAC(avg[1]),
+			   LOAD_INT(avg[2]), LOAD_FRAC(avg[2]),
+			   total);
+	}
+
+	return 0;
+}
+
+static int psi_io_show(struct seq_file *m, void *v)
+{
+	return psi_show(m, &psi_system, PSI_IO);
+}
+
+static int psi_memory_show(struct seq_file *m, void *v)
+{
+	return psi_show(m, &psi_system, PSI_MEM);
+}
+
+static int psi_cpu_show(struct seq_file *m, void *v)
+{
+	return psi_show(m, &psi_system, PSI_CPU);
+}
+
+static int psi_io_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, psi_io_show, NULL);
+}
+
+static int psi_memory_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, psi_memory_show, NULL);
+}
+
+static int psi_cpu_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, psi_cpu_show, NULL);
+}
+
+struct psi_trigger *psi_trigger_create(struct psi_group *group,
+			char *buf, size_t nbytes, enum psi_res res)
+{
+	struct psi_trigger *t;
+	enum psi_states state;
+	u32 threshold_us;
+	u32 window_us;
+
+	if (static_branch_likely(&psi_disabled))
+		return ERR_PTR(-EOPNOTSUPP);
+
+	if (sscanf(buf, "some %u %u", &threshold_us, &window_us) == 2)
+		state = PSI_IO_SOME + res * 2;
+	else if (sscanf(buf, "full %u %u", &threshold_us, &window_us) == 2)
+		state = PSI_IO_FULL + res * 2;
+	else
+		return ERR_PTR(-EINVAL);
+
+	if (state >= PSI_NONIDLE)
+		return ERR_PTR(-EINVAL);
+
+	if (window_us < WINDOW_MIN_US ||
+		window_us > WINDOW_MAX_US)
+		return ERR_PTR(-EINVAL);
+
+	/* Check threshold */
+	if (threshold_us == 0 || threshold_us > window_us)
+		return ERR_PTR(-EINVAL);
+
+	t = kmalloc(sizeof(*t), GFP_KERNEL);
+	if (!t)
+		return ERR_PTR(-ENOMEM);
+
+	t->group = group;
+	t->state = state;
+	t->threshold = threshold_us * NSEC_PER_USEC;
+	t->win.size = window_us * NSEC_PER_USEC;
+	window_reset(&t->win, 0, 0, 0);
+
+	t->event = 0;
+	t->last_event_time = 0;
+	init_waitqueue_head(&t->event_wait);
+	kref_init(&t->refcount);
+
+	mutex_lock(&group->trigger_lock);
+
+	if (!rcu_access_pointer(group->poll_kworker)) {
+		struct sched_param param = {
+			.sched_priority = 1,
+		};
+		struct kthread_worker *kworker;
+
+		kworker = kthread_create_worker(0, "psimon");
+		if (IS_ERR(kworker)) {
+			kfree(t);
+			mutex_unlock(&group->trigger_lock);
+			return ERR_CAST(kworker);
+		}
+		sched_setscheduler_nocheck(kworker->task, SCHED_FIFO, &param);
+		kthread_init_delayed_work(&group->poll_work,
+				psi_poll_work);
+		rcu_assign_pointer(group->poll_kworker, kworker);
+	}
+
+	list_add(&t->node, &group->triggers);
+	group->poll_min_period = min(group->poll_min_period,
+		div_u64(t->win.size, UPDATES_PER_WINDOW));
+	group->nr_triggers[t->state]++;
+	group->poll_states |= (1 << t->state);
+
+	mutex_unlock(&group->trigger_lock);
+
+	return t;
+}
+
+static void psi_trigger_destroy(struct kref *ref)
+{
+	struct psi_trigger *t = container_of(ref, struct psi_trigger, refcount);
+	struct psi_group *group = t->group;
+	struct kthread_worker *kworker_to_destroy = NULL;
+
+	if (static_branch_likely(&psi_disabled))
+		return;
+
+	/*
+	 * Wakeup waiters to stop polling. Can happen if cgroup is deleted
+	 * from under a polling process.
+	 */
+	wake_up_interruptible(&t->event_wait);
+
+	mutex_lock(&group->trigger_lock);
+
+	if (!list_empty(&t->node)) {
+		struct psi_trigger *tmp;
+		u64 period = ULLONG_MAX;
+
+		list_del(&t->node);
+		group->nr_triggers[t->state]--;
+		if (!group->nr_triggers[t->state])
+			group->poll_states &= ~(1 << t->state);
+		/* reset min update period for the remaining triggers */
+		list_for_each_entry(tmp, &group->triggers, node)
+			period = min(period, div_u64(tmp->win.size,
+					UPDATES_PER_WINDOW));
+		group->poll_min_period = period;
+		/* Destroy poll_kworker when the last trigger is destroyed */
+		if (group->poll_states == 0) {
+			group->polling_until = 0;
+			kworker_to_destroy = rcu_dereference_protected(
+					group->poll_kworker,
+					lockdep_is_held(&group->trigger_lock));
+			rcu_assign_pointer(group->poll_kworker, NULL);
+		}
+	}
+
+	mutex_unlock(&group->trigger_lock);
+
+	/*
+	 * Wait for both *trigger_ptr from psi_trigger_replace and
+	 * poll_kworker RCUs to complete their read-side critical sections
+	 * before destroying the trigger and optionally the poll_kworker
+	 */
+	synchronize_rcu();
+	/*
+	 * Destroy the kworker after releasing trigger_lock to prevent a
+	 * deadlock while waiting for psi_poll_work to acquire trigger_lock
+	 */
+	if (kworker_to_destroy) {
+		/*
+		 * After the RCU grace period has expired, the worker
+		 * can no longer be found through group->poll_kworker.
+		 * But it might have been already scheduled before
+		 * that - deschedule it cleanly before destroying it.
+		 */
+		kthread_cancel_delayed_work_sync(&group->poll_work);
+		atomic_set(&group->poll_scheduled, 0);
+
+		kthread_destroy_worker(kworker_to_destroy);
+	}
+	kfree(t);
+}
+
+void psi_trigger_replace(void **trigger_ptr, struct psi_trigger *new)
+{
+	struct psi_trigger *old = *trigger_ptr;
+
+	if (static_branch_likely(&psi_disabled))
+		return;
+
+	rcu_assign_pointer(*trigger_ptr, new);
+	if (old)
+		kref_put(&old->refcount, psi_trigger_destroy);
+}
+
+__poll_t psi_trigger_poll(void **trigger_ptr,
+				struct file *file, poll_table *wait)
+{
+	__poll_t ret = DEFAULT_POLLMASK;
+	struct psi_trigger *t;
+
+	if (static_branch_likely(&psi_disabled))
+		return DEFAULT_POLLMASK | EPOLLERR | EPOLLPRI;
+
+	rcu_read_lock();
+
+	t = rcu_dereference(*(void __rcu __force **)trigger_ptr);
+	if (!t) {
+		rcu_read_unlock();
+		return DEFAULT_POLLMASK | EPOLLERR | EPOLLPRI;
+	}
+	kref_get(&t->refcount);
+
+	rcu_read_unlock();
+
+	poll_wait(file, &t->event_wait, wait);
+
+	if (cmpxchg(&t->event, 1, 0) == 1)
+		ret |= EPOLLPRI;
+
+	kref_put(&t->refcount, psi_trigger_destroy);
+
+	return ret;
+}
+
+static ssize_t psi_write(struct file *file, const char __user *user_buf,
+			 size_t nbytes, enum psi_res res)
+{
+	char buf[32];
+	size_t buf_size;
+	struct seq_file *seq;
+	struct psi_trigger *new;
+
+	if (static_branch_likely(&psi_disabled))
+		return -EOPNOTSUPP;
+
+	buf_size = min(nbytes, (sizeof(buf) - 1));
+	if (copy_from_user(buf, user_buf, buf_size))
+		return -EFAULT;
+
+	buf[buf_size - 1] = '\0';
+
+	new = psi_trigger_create(&psi_system, buf, nbytes, res);
+	if (IS_ERR(new))
+		return PTR_ERR(new);
+
+	seq = file->private_data;
+	/* Take seq->lock to protect seq->private from concurrent writes */
+	mutex_lock(&seq->lock);
+	psi_trigger_replace(&seq->private, new);
+	mutex_unlock(&seq->lock);
+
+	return nbytes;
+}
+
+static ssize_t psi_io_write(struct file *file, const char __user *user_buf,
+			    size_t nbytes, loff_t *ppos)
+{
+	return psi_write(file, user_buf, nbytes, PSI_IO);
+}
+
+static ssize_t psi_memory_write(struct file *file, const char __user *user_buf,
+				size_t nbytes, loff_t *ppos)
+{
+	return psi_write(file, user_buf, nbytes, PSI_MEM);
+}
+
+static ssize_t psi_cpu_write(struct file *file, const char __user *user_buf,
+			     size_t nbytes, loff_t *ppos)
+{
+	return psi_write(file, user_buf, nbytes, PSI_CPU);
+}
+
+static __poll_t psi_fop_poll(struct file *file, poll_table *wait)
+{
+	struct seq_file *seq = file->private_data;
+
+	return psi_trigger_poll(&seq->private, file, wait);
+}
+
+static int psi_fop_release(struct inode *inode, struct file *file)
+{
+	struct seq_file *seq = file->private_data;
+
+	psi_trigger_replace(&seq->private, NULL);
+	return single_release(inode, file);
+}
+
+static const struct file_operations psi_io_fops = {
+	.open           = psi_io_open,
+	.read           = seq_read,
+	.llseek         = seq_lseek,
+	.write          = psi_io_write,
+	.poll           = psi_fop_poll,
+	.release        = psi_fop_release,
+};
+
+static const struct file_operations psi_memory_fops = {
+	.open           = psi_memory_open,
+	.read           = seq_read,
+	.llseek         = seq_lseek,
+	.write          = psi_memory_write,
+	.poll           = psi_fop_poll,
+	.release        = psi_fop_release,
+};
+
+static const struct file_operations psi_cpu_fops = {
+	.open           = psi_cpu_open,
+	.read           = seq_read,
+	.llseek         = seq_lseek,
+	.write          = psi_cpu_write,
+	.poll           = psi_fop_poll,
+	.release        = psi_fop_release,
+};
+
+static int __init psi_proc_init(void)
+{
+	proc_mkdir("pressure", NULL);
+	proc_create("pressure/io", 0, NULL, &psi_io_fops);
+	proc_create("pressure/memory", 0, NULL, &psi_memory_fops);
+	proc_create("pressure/cpu", 0, NULL, &psi_cpu_fops);
+	return 0;
+}
+module_init(psi_proc_init);
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index b980cc9..150cde3 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -1329,6 +1329,8 @@
 {
 	struct sched_rt_entity *rt_se = &p->rt;
 
+	schedtune_enqueue_task(p, cpu_of(rq));
+
 	if (flags & ENQUEUE_WAKEUP)
 		rt_se->timeout = 0;
 
@@ -1342,6 +1344,8 @@
 {
 	struct sched_rt_entity *rt_se = &p->rt;
 
+	schedtune_dequeue_task(p, cpu_of(rq));
+
 	update_curr_rt(rq);
 	dequeue_rt_entity(rt_se, flags);
 
@@ -1386,7 +1390,8 @@
 static int find_lowest_rq(struct task_struct *task);
 
 static int
-select_task_rq_rt(struct task_struct *p, int cpu, int sd_flag, int flags)
+select_task_rq_rt(struct task_struct *p, int cpu, int sd_flag, int flags,
+		  int sibling_count_hint)
 {
 	struct task_struct *curr;
 	struct rq *rq;
@@ -1584,7 +1589,7 @@
 	 * rt task
 	 */
 	if (rq->curr->sched_class != &rt_sched_class)
-		update_rt_rq_load_avg(rq_clock_task(rq), rq, 0);
+		update_rt_rq_load_avg(rq_clock_pelt(rq), rq, 0);
 
 	return p;
 }
@@ -1593,7 +1598,7 @@
 {
 	update_curr_rt(rq);
 
-	update_rt_rq_load_avg(rq_clock_task(rq), rq, 1);
+	update_rt_rq_load_avg(rq_clock_pelt(rq), rq, 1);
 
 	/*
 	 * The previous task needs to be made eligible for pushing
@@ -2324,7 +2329,7 @@
 	struct sched_rt_entity *rt_se = &p->rt;
 
 	update_curr_rt(rq);
-	update_rt_rq_load_avg(rq_clock_task(rq), rq, 1);
+	update_rt_rq_load_avg(rq_clock_pelt(rq), rq, 1);
 
 	watchdog(rq, p);
 
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 94bec97..1bd30bb 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -45,6 +45,7 @@
 #include <linux/ctype.h>
 #include <linux/debugfs.h>
 #include <linux/delayacct.h>
+#include <linux/energy_model.h>
 #include <linux/init_task.h>
 #include <linux/kprobes.h>
 #include <linux/kthread.h>
@@ -55,6 +56,7 @@
 #include <linux/proc_fs.h>
 #include <linux/prefetch.h>
 #include <linux/profile.h>
+#include <linux/psi.h>
 #include <linux/rcupdate_wait.h>
 #include <linux/security.h>
 #include <linux/stackprotector.h>
@@ -80,6 +82,8 @@
 # define SCHED_WARN_ON(x)	({ (void)(x), 0; })
 #endif
 
+#include "tune.h"
+
 struct rq;
 struct cpuidle_state;
 
@@ -321,6 +325,7 @@
 #ifdef CONFIG_CGROUP_SCHED
 
 #include <linux/cgroup.h>
+#include <linux/psi.h>
 
 struct cfs_rq;
 struct rt_rq;
@@ -699,6 +704,22 @@
 	return arch_asym_cpu_priority(a) > arch_asym_cpu_priority(b);
 }
 
+struct perf_domain {
+	struct em_perf_domain *em_pd;
+	struct perf_domain *next;
+	struct rcu_head rcu;
+};
+
+struct max_cpu_capacity {
+	raw_spinlock_t lock;
+	unsigned long val;
+	int cpu;
+};
+
+/* Scheduling group status flags */
+#define SG_OVERLOAD		0x1 /* More than one runnable task on a CPU. */
+#define SG_OVERUTILIZED		0x2 /* One or more CPUs are over-utilized. */
+
 /*
  * We add the notion of a root-domain which will be used to define per-domain
  * variables. Each exclusive cpuset essentially defines an island domain by
@@ -714,8 +735,15 @@
 	cpumask_var_t		span;
 	cpumask_var_t		online;
 
-	/* Indicate more than one runnable task for any CPU */
-	bool			overload;
+	/*
+	 * Indicate pullable load on at least one CPU, e.g:
+	 * - More than one runnable task
+	 * - Running task is misfit
+	 */
+	int			overload;
+
+	/* Indicate one or more cpus over-utilized (tipping point) */
+	int			overutilized;
 
 	/*
 	 * The bit corresponding to a CPU gets set here if such CPU has more
@@ -746,13 +774,21 @@
 	cpumask_var_t		rto_mask;
 	struct cpupri		cpupri;
 
-	unsigned long		max_cpu_capacity;
+	/* Maximum cpu capacity in the system. */
+	struct max_cpu_capacity max_cpu_capacity;
+
+	/*
+	 * NULL-terminated list of performance domains intersecting with the
+	 * CPUs of the rd. Protected by RCU.
+	 */
+	struct perf_domain	*pd;
 };
 
 extern struct root_domain def_root_domain;
 extern struct mutex sched_domains_mutex;
 
 extern void init_defrootdomain(void);
+extern void init_max_cpu_capacity(struct max_cpu_capacity *mcc);
 extern int sched_init_domains(const struct cpumask *cpu_map);
 extern void rq_attach_root(struct rq *rq, struct root_domain *rd);
 extern void sched_get_rd(struct root_domain *rd);
@@ -827,7 +863,10 @@
 
 	unsigned int		clock_update_flags;
 	u64			clock;
-	u64			clock_task;
+	/* Ensure that all clocks are in the same cache line */
+	u64			clock_task ____cacheline_aligned;
+	u64			clock_pelt;
+	unsigned long		lost_idle_time;
 
 	atomic_t		nr_iowait;
 
@@ -842,6 +881,8 @@
 
 	unsigned char		idle_balance;
 
+	unsigned long		misfit_task_load;
+
 	/* For active balancing */
 	int			active_balance;
 	int			push_cpu;
@@ -912,9 +953,26 @@
 #ifdef CONFIG_CPU_IDLE
 	/* Must be inspected within a rcu lock section */
 	struct cpuidle_state	*idle_state;
+	int			idle_state_idx;
 #endif
 };
 
+#ifdef CONFIG_FAIR_GROUP_SCHED
+
+/* CPU runqueue to which this cfs_rq is attached */
+static inline struct rq *rq_of(struct cfs_rq *cfs_rq)
+{
+	return cfs_rq->rq;
+}
+
+#else
+
+static inline struct rq *rq_of(struct cfs_rq *cfs_rq)
+{
+	return container_of(cfs_rq, struct rq, cfs);
+}
+#endif
+
 static inline int cpu_of(struct rq *rq)
 {
 #ifdef CONFIG_SMP
@@ -946,6 +1004,8 @@
 #define cpu_curr(cpu)		(cpu_rq(cpu)->curr)
 #define raw_rq()		raw_cpu_ptr(&runqueues)
 
+extern void update_rq_clock(struct rq *rq);
+
 static inline u64 __rq_clock_broken(struct rq *rq)
 {
 	return READ_ONCE(rq->clock);
@@ -1064,6 +1124,98 @@
 #endif
 }
 
+struct rq *__task_rq_lock(struct task_struct *p, struct rq_flags *rf)
+	__acquires(rq->lock);
+
+struct rq *task_rq_lock(struct task_struct *p, struct rq_flags *rf)
+	__acquires(p->pi_lock)
+	__acquires(rq->lock);
+
+static inline void __task_rq_unlock(struct rq *rq, struct rq_flags *rf)
+	__releases(rq->lock)
+{
+	rq_unpin_lock(rq, rf);
+	raw_spin_unlock(&rq->lock);
+}
+
+static inline void
+task_rq_unlock(struct rq *rq, struct task_struct *p, struct rq_flags *rf)
+	__releases(rq->lock)
+	__releases(p->pi_lock)
+{
+	rq_unpin_lock(rq, rf);
+	raw_spin_unlock(&rq->lock);
+	raw_spin_unlock_irqrestore(&p->pi_lock, rf->flags);
+}
+
+static inline void
+rq_lock_irqsave(struct rq *rq, struct rq_flags *rf)
+	__acquires(rq->lock)
+{
+	raw_spin_lock_irqsave(&rq->lock, rf->flags);
+	rq_pin_lock(rq, rf);
+}
+
+static inline void
+rq_lock_irq(struct rq *rq, struct rq_flags *rf)
+	__acquires(rq->lock)
+{
+	raw_spin_lock_irq(&rq->lock);
+	rq_pin_lock(rq, rf);
+}
+
+static inline void
+rq_lock(struct rq *rq, struct rq_flags *rf)
+	__acquires(rq->lock)
+{
+	raw_spin_lock(&rq->lock);
+	rq_pin_lock(rq, rf);
+}
+
+static inline void
+rq_relock(struct rq *rq, struct rq_flags *rf)
+	__acquires(rq->lock)
+{
+	raw_spin_lock(&rq->lock);
+	rq_repin_lock(rq, rf);
+}
+
+static inline void
+rq_unlock_irqrestore(struct rq *rq, struct rq_flags *rf)
+	__releases(rq->lock)
+{
+	rq_unpin_lock(rq, rf);
+	raw_spin_unlock_irqrestore(&rq->lock, rf->flags);
+}
+
+static inline void
+rq_unlock_irq(struct rq *rq, struct rq_flags *rf)
+	__releases(rq->lock)
+{
+	rq_unpin_lock(rq, rf);
+	raw_spin_unlock_irq(&rq->lock);
+}
+
+static inline void
+rq_unlock(struct rq *rq, struct rq_flags *rf)
+	__releases(rq->lock)
+{
+	rq_unpin_lock(rq, rf);
+	raw_spin_unlock(&rq->lock);
+}
+
+static inline struct rq *
+this_rq_lock_irq(struct rq_flags *rf)
+	__acquires(rq->lock)
+{
+	struct rq *rq;
+
+	local_irq_disable();
+	rq = this_rq();
+	rq_lock(rq, rf);
+	return rq;
+}
+
 #ifdef CONFIG_NUMA
 enum numa_topology_type {
 	NUMA_DIRECT,
@@ -1180,7 +1332,9 @@
 DECLARE_PER_CPU(int, sd_llc_id);
 DECLARE_PER_CPU(struct sched_domain_shared *, sd_llc_shared);
 DECLARE_PER_CPU(struct sched_domain *, sd_numa);
-DECLARE_PER_CPU(struct sched_domain *, sd_asym);
+DECLARE_PER_CPU(struct sched_domain *, sd_asym_packing);
+DECLARE_PER_CPU(struct sched_domain *, sd_asym_cpucapacity);
+extern struct static_key_false sched_asym_cpucapacity;
 
 struct sched_group_capacity {
 	atomic_t		ref;
@@ -1190,6 +1344,7 @@
 	 */
 	unsigned long		capacity;
 	unsigned long		min_capacity;		/* Min per-CPU capacity in group */
+	unsigned long		max_capacity;		/* Max per-CPU capacity in group */
 	unsigned long		next_update;
 	int			imbalance;		/* XXX unrelated to capacity but shared group state */
 
@@ -1518,7 +1673,8 @@
 	void (*put_prev_task)(struct rq *rq, struct task_struct *p);
 
 #ifdef CONFIG_SMP
-	int  (*select_task_rq)(struct task_struct *p, int task_cpu, int sd_flag, int flags);
+	int  (*select_task_rq)(struct task_struct *p, int task_cpu, int sd_flag, int flags,
+			       int subling_count_hint);
 	void (*migrate_task_rq)(struct task_struct *p, int new_cpu);
 
 	void (*task_woken)(struct rq *this_rq, struct task_struct *task);
@@ -1606,6 +1762,17 @@
 
 	return rq->idle_state;
 }
+
+static inline void idle_set_state_idx(struct rq *rq, int idle_state_idx)
+{
+	rq->idle_state_idx = idle_state_idx;
+}
+
+static inline int idle_get_state_idx(struct rq *rq)
+{
+	WARN_ON(!rcu_read_lock_held());
+	return rq->idle_state_idx;
+}
 #else
 static inline void idle_set_state(struct rq *rq,
 				  struct cpuidle_state *idle_state)
@@ -1616,6 +1783,15 @@
 {
 	return NULL;
 }
+
+static inline void idle_set_state_idx(struct rq *rq, int idle_state_idx)
+{
+}
+
+static inline int idle_get_state_idx(struct rq *rq)
+{
+	return -1;
+}
 #endif
 
 extern void schedule_idle(void);
@@ -1689,8 +1865,8 @@
 
 	if (prev_nr < 2 && rq->nr_running >= 2) {
 #ifdef CONFIG_SMP
-		if (!rq->rd->overload)
-			rq->rd->overload = true;
+		if (!READ_ONCE(rq->rd->overload))
+			WRITE_ONCE(rq->rd->overload, 1);
 #endif
 	}
 
@@ -1704,8 +1880,6 @@
 	sched_update_tick_dependency(rq);
 }
 
-extern void update_rq_clock(struct rq *rq);
-
 extern void activate_task(struct rq *rq, struct task_struct *p, int flags);
 extern void deactivate_task(struct rq *rq, struct task_struct *p, int flags);
 
@@ -1749,106 +1923,14 @@
 }
 #endif
 
-#ifdef CONFIG_SMP
-#ifndef arch_scale_cpu_capacity
+#ifndef arch_scale_max_freq_capacity
+struct sched_domain;
 static __always_inline
-unsigned long arch_scale_cpu_capacity(struct sched_domain *sd, int cpu)
-{
-	if (sd && (sd->flags & SD_SHARE_CPUCAPACITY) && (sd->span_weight > 1))
-		return sd->smt_gain / sd->span_weight;
-
-	return SCHED_CAPACITY_SCALE;
-}
-#endif
-#else
-#ifndef arch_scale_cpu_capacity
-static __always_inline
-unsigned long arch_scale_cpu_capacity(void __always_unused *sd, int cpu)
+unsigned long arch_scale_max_freq_capacity(struct sched_domain *sd, int cpu)
 {
 	return SCHED_CAPACITY_SCALE;
 }
 #endif
-#endif
-
-struct rq *__task_rq_lock(struct task_struct *p, struct rq_flags *rf)
-	__acquires(rq->lock);
-
-struct rq *task_rq_lock(struct task_struct *p, struct rq_flags *rf)
-	__acquires(p->pi_lock)
-	__acquires(rq->lock);
-
-static inline void __task_rq_unlock(struct rq *rq, struct rq_flags *rf)
-	__releases(rq->lock)
-{
-	rq_unpin_lock(rq, rf);
-	raw_spin_unlock(&rq->lock);
-}
-
-static inline void
-task_rq_unlock(struct rq *rq, struct task_struct *p, struct rq_flags *rf)
-	__releases(rq->lock)
-	__releases(p->pi_lock)
-{
-	rq_unpin_lock(rq, rf);
-	raw_spin_unlock(&rq->lock);
-	raw_spin_unlock_irqrestore(&p->pi_lock, rf->flags);
-}
-
-static inline void
-rq_lock_irqsave(struct rq *rq, struct rq_flags *rf)
-	__acquires(rq->lock)
-{
-	raw_spin_lock_irqsave(&rq->lock, rf->flags);
-	rq_pin_lock(rq, rf);
-}
-
-static inline void
-rq_lock_irq(struct rq *rq, struct rq_flags *rf)
-	__acquires(rq->lock)
-{
-	raw_spin_lock_irq(&rq->lock);
-	rq_pin_lock(rq, rf);
-}
-
-static inline void
-rq_lock(struct rq *rq, struct rq_flags *rf)
-	__acquires(rq->lock)
-{
-	raw_spin_lock(&rq->lock);
-	rq_pin_lock(rq, rf);
-}
-
-static inline void
-rq_relock(struct rq *rq, struct rq_flags *rf)
-	__acquires(rq->lock)
-{
-	raw_spin_lock(&rq->lock);
-	rq_repin_lock(rq, rf);
-}
-
-static inline void
-rq_unlock_irqrestore(struct rq *rq, struct rq_flags *rf)
-	__releases(rq->lock)
-{
-	rq_unpin_lock(rq, rf);
-	raw_spin_unlock_irqrestore(&rq->lock, rf->flags);
-}
-
-static inline void
-rq_unlock_irq(struct rq *rq, struct rq_flags *rf)
-	__releases(rq->lock)
-{
-	rq_unpin_lock(rq, rf);
-	raw_spin_unlock_irq(&rq->lock);
-}
-
-static inline void
-rq_unlock(struct rq *rq, struct rq_flags *rf)
-	__releases(rq->lock)
-{
-	rq_unpin_lock(rq, rf);
-	raw_spin_unlock(&rq->lock);
-}
 
 #ifdef CONFIG_SMP
 #ifdef CONFIG_PREEMPT
@@ -2181,7 +2263,46 @@
 # define arch_scale_freq_invariant()	false
 #endif
 
+#ifdef CONFIG_SMP
+static inline unsigned long capacity_orig_of(int cpu)
+{
+	return cpu_rq(cpu)->cpu_capacity_orig;
+}
+#endif
+
 #ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL
+/**
+ * enum schedutil_type - CPU utilization type
+ * @FREQUENCY_UTIL:	Utilization used to select frequency
+ * @ENERGY_UTIL:	Utilization used during energy calculation
+ *
+ * The utilization signals of all scheduling classes (CFS/RT/DL) and IRQ time
+ * need to be aggregated differently depending on the usage made of them. This
+ * enum is used within schedutil_freq_util() to differentiate the types of
+ * utilization expected by the callers, and adjust the aggregation accordingly.
+ */
+enum schedutil_type {
+	FREQUENCY_UTIL,
+	ENERGY_UTIL,
+};
+
+unsigned long schedutil_freq_util(int cpu, unsigned long util,
+			          unsigned long max, enum schedutil_type type);
+
+static inline unsigned long schedutil_energy_util(int cpu, unsigned long util)
+{
+	unsigned long max = arch_scale_cpu_capacity(NULL, cpu);
+
+	return schedutil_freq_util(cpu, util, max, ENERGY_UTIL);
+}
+#else /* CONFIG_CPU_FREQ_GOV_SCHEDUTIL */
+static inline unsigned long schedutil_energy_util(int cpu, unsigned long util)
+{
+	return util;
+}
+#endif
+
+#ifdef CONFIG_SMP
 static inline unsigned long cpu_bw_dl(struct rq *rq)
 {
 	return (rq->dl.running_bw * SCHED_CAPACITY_SCALE) >> BW_SHIFT;
@@ -2237,3 +2358,13 @@
 	return util;
 }
 #endif
+
+#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
+#define perf_domain_span(pd) (to_cpumask(((pd)->em_pd->cpus)))
+#else
+#define perf_domain_span(pd) NULL
+#endif
+
+#ifdef CONFIG_SMP
+extern struct static_key_false sched_energy_present;
+#endif
diff --git a/kernel/sched/stats.h b/kernel/sched/stats.h
index 8aea199..aa0de24 100644
--- a/kernel/sched/stats.h
+++ b/kernel/sched/stats.h
@@ -55,6 +55,92 @@
 # define   schedstat_val_or_zero(var)	0
 #endif /* CONFIG_SCHEDSTATS */
 
+#ifdef CONFIG_PSI
+/*
+ * PSI tracks state that persists across sleeps, such as iowaits and
+ * memory stalls. As a result, it has to distinguish between sleeps,
+ * where a task's runnable state changes, and requeues, where a task
+ * and its state are being moved between CPUs and runqueues.
+ */
+static inline void psi_enqueue(struct task_struct *p, bool wakeup)
+{
+	int clear = 0, set = TSK_RUNNING;
+
+	if (static_branch_likely(&psi_disabled))
+		return;
+
+	if (!wakeup || p->sched_psi_wake_requeue) {
+		if (p->flags & PF_MEMSTALL)
+			set |= TSK_MEMSTALL;
+		if (p->sched_psi_wake_requeue)
+			p->sched_psi_wake_requeue = 0;
+	} else {
+		if (p->in_iowait)
+			clear |= TSK_IOWAIT;
+	}
+
+	psi_task_change(p, clear, set);
+}
+
+static inline void psi_dequeue(struct task_struct *p, bool sleep)
+{
+	int clear = TSK_RUNNING, set = 0;
+
+	if (static_branch_likely(&psi_disabled))
+		return;
+
+	if (!sleep) {
+		if (p->flags & PF_MEMSTALL)
+			clear |= TSK_MEMSTALL;
+	} else {
+		if (p->in_iowait)
+			set |= TSK_IOWAIT;
+	}
+
+	psi_task_change(p, clear, set);
+}
+
+static inline void psi_ttwu_dequeue(struct task_struct *p)
+{
+	if (static_branch_likely(&psi_disabled))
+		return;
+	/*
+	 * Is the task being migrated during a wakeup? Make sure to
+	 * deregister its sleep-persistent psi states from the old
+	 * queue, and let psi_enqueue() know it has to requeue.
+	 */
+	if (unlikely(p->in_iowait || (p->flags & PF_MEMSTALL))) {
+		struct rq_flags rf;
+		struct rq *rq;
+		int clear = 0;
+
+		if (p->in_iowait)
+			clear |= TSK_IOWAIT;
+		if (p->flags & PF_MEMSTALL)
+			clear |= TSK_MEMSTALL;
+
+		rq = __task_rq_lock(p, &rf);
+		psi_task_change(p, clear, 0);
+		p->sched_psi_wake_requeue = 1;
+		__task_rq_unlock(rq, &rf);
+	}
+}
+
+static inline void psi_task_tick(struct rq *rq)
+{
+	if (static_branch_likely(&psi_disabled))
+		return;
+
+	if (unlikely(rq->curr->flags & PF_MEMSTALL))
+		psi_memstall_tick(rq->curr, cpu_of(rq));
+}
+#else /* CONFIG_PSI */
+static inline void psi_enqueue(struct task_struct *p, bool wakeup) {}
+static inline void psi_dequeue(struct task_struct *p, bool sleep) {}
+static inline void psi_ttwu_dequeue(struct task_struct *p) {}
+static inline void psi_task_tick(struct rq *rq) {}
+#endif /* CONFIG_PSI */
+
 #ifdef CONFIG_SCHED_INFO
 static inline void sched_info_reset_dequeued(struct task_struct *t)
 {
diff --git a/kernel/sched/stop_task.c b/kernel/sched/stop_task.c
index c183b79..6446d61 100644
--- a/kernel/sched/stop_task.c
+++ b/kernel/sched/stop_task.c
@@ -11,7 +11,8 @@
 
 #ifdef CONFIG_SMP
 static int
-select_task_rq_stop(struct task_struct *p, int cpu, int sd_flag, int flags)
+select_task_rq_stop(struct task_struct *p, int cpu, int sd_flag, int flags,
+		    int sibling_count_hint)
 {
 	return task_cpu(p); /* stop tasks as never migrate */
 }
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 74b6943..7bc2cdd 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -201,6 +201,199 @@
 	return 1;
 }
 
+DEFINE_STATIC_KEY_FALSE(sched_energy_present);
+#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
+DEFINE_MUTEX(sched_energy_mutex);
+bool sched_energy_update;
+
+static void free_pd(struct perf_domain *pd)
+{
+	struct perf_domain *tmp;
+
+	while (pd) {
+		tmp = pd->next;
+		kfree(pd);
+		pd = tmp;
+	}
+}
+
+static struct perf_domain *find_pd(struct perf_domain *pd, int cpu)
+{
+	while (pd) {
+		if (cpumask_test_cpu(cpu, perf_domain_span(pd)))
+			return pd;
+		pd = pd->next;
+	}
+
+	return NULL;
+}
+
+static struct perf_domain *pd_init(int cpu)
+{
+	struct em_perf_domain *obj = em_cpu_get(cpu);
+	struct perf_domain *pd;
+
+	if (!obj) {
+		if (sched_debug())
+			pr_info("%s: no EM found for CPU%d\n", __func__, cpu);
+		return NULL;
+	}
+
+	pd = kzalloc(sizeof(*pd), GFP_KERNEL);
+	if (!pd)
+		return NULL;
+	pd->em_pd = obj;
+
+	return pd;
+}
+
+static void perf_domain_debug(const struct cpumask *cpu_map,
+						struct perf_domain *pd)
+{
+	if (!sched_debug() || !pd)
+		return;
+
+	printk(KERN_DEBUG "root_domain %*pbl:", cpumask_pr_args(cpu_map));
+
+	while (pd) {
+		printk(KERN_CONT " pd%d:{ cpus=%*pbl nr_cstate=%d }",
+				cpumask_first(perf_domain_span(pd)),
+				cpumask_pr_args(perf_domain_span(pd)),
+				em_pd_nr_cap_states(pd->em_pd));
+		pd = pd->next;
+	}
+
+	printk(KERN_CONT "\n");
+}
+
+static void destroy_perf_domain_rcu(struct rcu_head *rp)
+{
+	struct perf_domain *pd;
+
+	pd = container_of(rp, struct perf_domain, rcu);
+	free_pd(pd);
+}
+
+static void sched_energy_set(bool has_eas)
+{
+	if (!has_eas && static_branch_unlikely(&sched_energy_present)) {
+		if (sched_debug())
+			pr_info("%s: stopping EAS\n", __func__);
+		static_branch_disable_cpuslocked(&sched_energy_present);
+	} else if (has_eas && !static_branch_unlikely(&sched_energy_present)) {
+		if (sched_debug())
+			pr_info("%s: starting EAS\n", __func__);
+		static_branch_enable_cpuslocked(&sched_energy_present);
+	}
+}
+
+/*
+ * EAS can be used on a root domain if it meets all the following conditions:
+ *    1. an Energy Model (EM) is available;
+ *    2. the SD_ASYM_CPUCAPACITY flag is set in the sched_domain hierarchy.
+ *    3. the EM complexity is low enough to keep scheduling overheads low;
+ *    4. schedutil is driving the frequency of all CPUs of the rd;
+ *
+ * The complexity of the Energy Model is defined as:
+ *
+ *              C = nr_pd * (nr_cpus + nr_cs)
+ *
+ * with parameters defined as:
+ *  - nr_pd:    the number of performance domains
+ *  - nr_cpus:  the number of CPUs
+ *  - nr_cs:    the sum of the number of capacity states of all performance
+ *              domains (for example, on a system with 2 performance domains,
+ *              with 10 capacity states each, nr_cs = 2 * 10 = 20).
+ *
+ * It is generally not a good idea to use such a model in the wake-up path on
+ * very complex platforms because of the associated scheduling overheads. The
+ * arbitrary constraint below prevents that. It makes EAS usable up to 16 CPUs
+ * with per-CPU DVFS and less than 8 capacity states each, for example.
+ */
+#define EM_MAX_COMPLEXITY 2048
+
+extern struct cpufreq_governor schedutil_gov;
+static bool build_perf_domains(const struct cpumask *cpu_map)
+{
+	int i, nr_pd = 0, nr_cs = 0, nr_cpus = cpumask_weight(cpu_map);
+	struct perf_domain *pd = NULL, *tmp;
+	int cpu = cpumask_first(cpu_map);
+	struct root_domain *rd = cpu_rq(cpu)->rd;
+	struct cpufreq_policy *policy;
+	struct cpufreq_governor *gov;
+
+	/* EAS is enabled for asymmetric CPU capacity topologies. */
+	if (!per_cpu(sd_asym_cpucapacity, cpu)) {
+		if (sched_debug()) {
+			pr_info("rd %*pbl: CPUs do not have asymmetric capacities\n",
+					cpumask_pr_args(cpu_map));
+		}
+		goto free;
+	}
+
+	for_each_cpu(i, cpu_map) {
+		/* Skip already covered CPUs. */
+		if (find_pd(pd, i))
+			continue;
+
+		/* Do not attempt EAS if schedutil is not being used. */
+		policy = cpufreq_cpu_get(i);
+		if (!policy)
+			goto free;
+		gov = policy->governor;
+		cpufreq_cpu_put(policy);
+		if (gov != &schedutil_gov) {
+			if (rd->pd)
+				pr_warn("rd %*pbl: Disabling EAS, schedutil is mandatory\n",
+						cpumask_pr_args(cpu_map));
+			goto free;
+		}
+
+		/* Create the new pd and add it to the local list. */
+		tmp = pd_init(i);
+		if (!tmp)
+			goto free;
+		tmp->next = pd;
+		pd = tmp;
+
+		/*
+		 * Count performance domains and capacity states for the
+		 * complexity check.
+		 */
+		nr_pd++;
+		nr_cs += em_pd_nr_cap_states(pd->em_pd);
+	}
+
+	/* Bail out if the Energy Model complexity is too high. */
+	if (nr_pd * (nr_cs + nr_cpus) > EM_MAX_COMPLEXITY) {
+		WARN(1, "rd %*pbl: Failed to start EAS, EM complexity is too high\n",
+						cpumask_pr_args(cpu_map));
+		goto free;
+	}
+
+	perf_domain_debug(cpu_map, pd);
+
+	/* Attach the new list of performance domains to the root domain. */
+	tmp = rd->pd;
+	rcu_assign_pointer(rd->pd, pd);
+	if (tmp)
+		call_rcu(&tmp->rcu, destroy_perf_domain_rcu);
+
+	return !!pd;
+
+free:
+	free_pd(pd);
+	tmp = rd->pd;
+	rcu_assign_pointer(rd->pd, NULL);
+	if (tmp)
+		call_rcu(&tmp->rcu, destroy_perf_domain_rcu);
+
+	return false;
+}
+#else
+static void free_pd(struct perf_domain *pd) { }
+#endif /* CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL*/
+
 static void free_rootdomain(struct rcu_head *rcu)
 {
 	struct root_domain *rd = container_of(rcu, struct root_domain, rcu);
@@ -211,6 +404,7 @@
 	free_cpumask_var(rd->rto_mask);
 	free_cpumask_var(rd->online);
 	free_cpumask_var(rd->span);
+	free_pd(rd->pd);
 	kfree(rd);
 }
 
@@ -287,6 +481,9 @@
 
 	if (cpupri_init(&rd->cpupri) != 0)
 		goto free_cpudl;
+
+	init_max_cpu_capacity(&rd->max_cpu_capacity);
+
 	return 0;
 
 free_cpudl:
@@ -397,7 +594,9 @@
 DEFINE_PER_CPU(int, sd_llc_id);
 DEFINE_PER_CPU(struct sched_domain_shared *, sd_llc_shared);
 DEFINE_PER_CPU(struct sched_domain *, sd_numa);
-DEFINE_PER_CPU(struct sched_domain *, sd_asym);
+DEFINE_PER_CPU(struct sched_domain *, sd_asym_packing);
+DEFINE_PER_CPU(struct sched_domain *, sd_asym_cpucapacity);
+DEFINE_STATIC_KEY_FALSE(sched_asym_cpucapacity);
 
 static void update_top_cache_domain(int cpu)
 {
@@ -422,7 +621,10 @@
 	rcu_assign_pointer(per_cpu(sd_numa, cpu), sd);
 
 	sd = highest_flag_domain(cpu, SD_ASYM_PACKING);
-	rcu_assign_pointer(per_cpu(sd_asym, cpu), sd);
+	rcu_assign_pointer(per_cpu(sd_asym_packing, cpu), sd);
+
+	sd = lowest_flag_domain(cpu, SD_ASYM_CPUCAPACITY);
+	rcu_assign_pointer(per_cpu(sd_asym_cpucapacity, cpu), sd);
 }
 
 /*
@@ -692,6 +894,7 @@
 	sg_span = sched_group_span(sg);
 	sg->sgc->capacity = SCHED_CAPACITY_SCALE * cpumask_weight(sg_span);
 	sg->sgc->min_capacity = SCHED_CAPACITY_SCALE;
+	sg->sgc->max_capacity = SCHED_CAPACITY_SCALE;
 }
 
 static int
@@ -851,6 +1054,7 @@
 
 	sg->sgc->capacity = SCHED_CAPACITY_SCALE * cpumask_weight(sched_group_span(sg));
 	sg->sgc->min_capacity = SCHED_CAPACITY_SCALE;
+	sg->sgc->max_capacity = SCHED_CAPACITY_SCALE;
 
 	return sg;
 }
@@ -1061,7 +1265,6 @@
  *   SD_SHARE_PKG_RESOURCES - describes shared caches
  *   SD_NUMA                - describes NUMA topologies
  *   SD_SHARE_POWERDOMAIN   - describes shared power domain
- *   SD_ASYM_CPUCAPACITY    - describes mixed capacity topologies
  *
  * Odd one out, which beside describing the topology has a quirk also
  * prescribes the desired behaviour that goes along with it:
@@ -1073,13 +1276,12 @@
 	 SD_SHARE_PKG_RESOURCES |	\
 	 SD_NUMA		|	\
 	 SD_ASYM_PACKING	|	\
-	 SD_ASYM_CPUCAPACITY	|	\
 	 SD_SHARE_POWERDOMAIN)
 
 static struct sched_domain *
 sd_init(struct sched_domain_topology_level *tl,
 	const struct cpumask *cpu_map,
-	struct sched_domain *child, int cpu)
+	struct sched_domain *child, int dflags, int cpu)
 {
 	struct sd_data *sdd = &tl->data;
 	struct sched_domain *sd = *per_cpu_ptr(sdd->sd, cpu);
@@ -1100,6 +1302,9 @@
 			"wrong sd_flags in topology description\n"))
 		sd_flags &= ~TOPOLOGY_SD_FLAGS;
 
+	/* Apply detected topology flags */
+	sd_flags |= dflags;
+
 	*sd = (struct sched_domain){
 		.min_interval		= sd_weight,
 		.max_interval		= 2*sd_weight,
@@ -1122,7 +1327,7 @@
 					| 0*SD_SHARE_CPUCAPACITY
 					| 0*SD_SHARE_PKG_RESOURCES
 					| 0*SD_SERIALIZE
-					| 0*SD_PREFER_SIBLING
+					| 1*SD_PREFER_SIBLING
 					| 0*SD_NUMA
 					| sd_flags
 					,
@@ -1148,17 +1353,21 @@
 	if (sd->flags & SD_ASYM_CPUCAPACITY) {
 		struct sched_domain *t = sd;
 
+		/*
+		 * Don't attempt to spread across CPUs of different capacities.
+		 */
+		if (sd->child)
+			sd->child->flags &= ~SD_PREFER_SIBLING;
+
 		for_each_lower_domain(t)
 			t->flags |= SD_BALANCE_WAKE;
 	}
 
 	if (sd->flags & SD_SHARE_CPUCAPACITY) {
-		sd->flags |= SD_PREFER_SIBLING;
 		sd->imbalance_pct = 110;
 		sd->smt_gain = 1178; /* ~15% */
 
 	} else if (sd->flags & SD_SHARE_PKG_RESOURCES) {
-		sd->flags |= SD_PREFER_SIBLING;
 		sd->imbalance_pct = 117;
 		sd->cache_nice_tries = 1;
 		sd->busy_idx = 2;
@@ -1169,6 +1378,7 @@
 		sd->busy_idx = 3;
 		sd->idle_idx = 2;
 
+		sd->flags &= ~SD_PREFER_SIBLING;
 		sd->flags |= SD_SERIALIZE;
 		if (sched_domains_numa_distance[tl->numa_level] > RECLAIM_DISTANCE) {
 			sd->flags &= ~(SD_BALANCE_EXEC |
@@ -1178,7 +1388,6 @@
 
 #endif
 	} else {
-		sd->flags |= SD_PREFER_SIBLING;
 		sd->cache_nice_tries = 1;
 		sd->busy_idx = 2;
 		sd->idle_idx = 1;
@@ -1604,9 +1813,9 @@
 
 static struct sched_domain *build_sched_domain(struct sched_domain_topology_level *tl,
 		const struct cpumask *cpu_map, struct sched_domain_attr *attr,
-		struct sched_domain *child, int cpu)
+		struct sched_domain *child, int dflags, int cpu)
 {
-	struct sched_domain *sd = sd_init(tl, cpu_map, child, cpu);
+	struct sched_domain *sd = sd_init(tl, cpu_map, child, dflags, cpu);
 
 	if (child) {
 		sd->level = child->level + 1;
@@ -1633,6 +1842,65 @@
 }
 
 /*
+ * Find the sched_domain_topology_level where all CPU capacities are visible
+ * for all CPUs.
+ */
+static struct sched_domain_topology_level
+*asym_cpu_capacity_level(const struct cpumask *cpu_map)
+{
+	int i, j, asym_level = 0;
+	bool asym = false;
+	struct sched_domain_topology_level *tl, *asym_tl = NULL;
+	unsigned long cap;
+
+	/* Is there any asymmetry? */
+	cap = arch_scale_cpu_capacity(NULL, cpumask_first(cpu_map));
+
+	for_each_cpu(i, cpu_map) {
+		if (arch_scale_cpu_capacity(NULL, i) != cap) {
+			asym = true;
+			break;
+		}
+	}
+
+	if (!asym)
+		return NULL;
+
+	/*
+	 * Examine topology from all CPU's point of views to detect the lowest
+	 * sched_domain_topology_level where a highest capacity CPU is visible
+	 * to everyone.
+	 */
+	for_each_cpu(i, cpu_map) {
+		unsigned long max_capacity = arch_scale_cpu_capacity(NULL, i);
+		int tl_id = 0;
+
+		for_each_sd_topology(tl) {
+			if (tl_id < asym_level)
+				goto next_level;
+
+			for_each_cpu_and(j, tl->mask(i), cpu_map) {
+				unsigned long capacity;
+
+				capacity = arch_scale_cpu_capacity(NULL, j);
+
+				if (capacity <= max_capacity)
+					continue;
+
+				max_capacity = capacity;
+				asym_level = tl_id;
+				asym_tl = tl;
+			}
+next_level:
+			tl_id++;
+		}
+	}
+
+	return asym_tl;
+}
+
+
+/*
  * Build sched domains for a given set of CPUs and attach the sched domains
  * to the individual CPUs
  */
@@ -1642,20 +1910,31 @@
 	enum s_alloc alloc_state;
 	struct sched_domain *sd;
 	struct s_data d;
-	struct rq *rq = NULL;
 	int i, ret = -ENOMEM;
+	struct sched_domain_topology_level *tl_asym;
+	bool has_asym = false;
 
 	alloc_state = __visit_domain_allocation_hell(&d, cpu_map);
 	if (alloc_state != sa_rootdomain)
 		goto error;
 
+	tl_asym = asym_cpu_capacity_level(cpu_map);
+
 	/* Set up domains for CPUs specified by the cpu_map: */
 	for_each_cpu(i, cpu_map) {
 		struct sched_domain_topology_level *tl;
 
 		sd = NULL;
 		for_each_sd_topology(tl) {
-			sd = build_sched_domain(tl, cpu_map, attr, sd, i);
+			int dflags = 0;
+
+			if (tl == tl_asym) {
+				dflags |= SD_ASYM_CPUCAPACITY;
+				has_asym = true;
+			}
+
+			sd = build_sched_domain(tl, cpu_map, attr, sd, dflags, i);
+
 			if (tl == sched_domain_topology)
 				*per_cpu_ptr(d.sd, i) = sd;
 			if (tl->flags & SDTL_OVERLAP)
@@ -1693,21 +1972,13 @@
 	/* Attach the domains */
 	rcu_read_lock();
 	for_each_cpu(i, cpu_map) {
-		rq = cpu_rq(i);
 		sd = *per_cpu_ptr(d.sd, i);
-
-		/* Use READ_ONCE()/WRITE_ONCE() to avoid load/store tearing: */
-		if (rq->cpu_capacity_orig > READ_ONCE(d.rd->max_cpu_capacity))
-			WRITE_ONCE(d.rd->max_cpu_capacity, rq->cpu_capacity_orig);
-
 		cpu_attach_domain(sd, d.rd, i);
 	}
 	rcu_read_unlock();
 
-	if (rq && sched_debug_enabled) {
-		pr_info("root domain span: %*pbl (max cpu_capacity = %lu)\n",
-			cpumask_pr_args(cpu_map), rq->rd->max_cpu_capacity);
-	}
+	if (has_asym)
+		static_branch_enable_cpuslocked(&sched_asym_cpucapacity);
 
 	ret = 0;
 error:
@@ -1852,6 +2123,7 @@
 void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[],
 			     struct sched_domain_attr *dattr_new)
 {
+	bool __maybe_unused has_eas = false;
 	int i, j, n;
 	int new_topology;
 
@@ -1879,8 +2151,8 @@
 	/* Destroy deleted domains: */
 	for (i = 0; i < ndoms_cur; i++) {
 		for (j = 0; j < n && !new_topology; j++) {
-			if (cpumask_equal(doms_cur[i], doms_new[j])
-			    && dattrs_equal(dattr_cur, i, dattr_new, j))
+			if (cpumask_equal(doms_cur[i], doms_new[j]) &&
+			    dattrs_equal(dattr_cur, i, dattr_new, j))
 				goto match1;
 		}
 		/* No match - a current sched domain not in new doms_new[] */
@@ -1900,8 +2172,8 @@
 	/* Build new domains: */
 	for (i = 0; i < ndoms_new; i++) {
 		for (j = 0; j < n && !new_topology; j++) {
-			if (cpumask_equal(doms_new[i], doms_cur[j])
-			    && dattrs_equal(dattr_new, i, dattr_cur, j))
+			if (cpumask_equal(doms_new[i], doms_cur[j]) &&
+			    dattrs_equal(dattr_new, i, dattr_cur, j))
 				goto match2;
 		}
 		/* No match - add a new doms_new */
@@ -1910,6 +2182,24 @@
 		;
 	}
 
+#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
+	/* Build perf. domains: */
+	for (i = 0; i < ndoms_new; i++) {
+		for (j = 0; j < n && !sched_energy_update; j++) {
+			if (cpumask_equal(doms_new[i], doms_cur[j]) &&
+			    cpu_rq(cpumask_first(doms_cur[j]))->rd->pd) {
+				has_eas = true;
+				goto match3;
+			}
+		}
+		/* No match - add perf. domains for a new rd */
+		has_eas |= build_perf_domains(doms_new[i]);
+match3:
+		;
+	}
+	sched_energy_set(has_eas);
+#endif
+
 	/* Remember the new sched domains: */
 	if (doms_cur != &fallback_doms)
 		free_sched_domains(doms_cur, ndoms_cur);
diff --git a/kernel/sched/tune.c b/kernel/sched/tune.c
new file mode 100644
index 0000000..3b231c6
--- /dev/null
+++ b/kernel/sched/tune.c
@@ -0,0 +1,692 @@
+#include <linux/cgroup.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/percpu.h>
+#include <linux/printk.h>
+#include <linux/rcupdate.h>
+#include <linux/slab.h>
+
+#include <trace/events/sched.h>
+
+#include "sched.h"
+
+bool schedtune_initialized = false;
+extern struct reciprocal_value schedtune_spc_rdiv;
+
+/* We hold schedtune boost in effect for at least this long */
+#define SCHEDTUNE_BOOST_HOLD_NS 50000000ULL
+
+/*
+ * EAS scheduler tunables for task groups.
+ *
+ * When CGroup support is enabled, we have to synchronize two different
+ * paths:
+ *  - slow path: where CGroups are created/updated/removed
+ *  - fast path: where tasks in a CGroups are accounted
+ *
+ * The slow path tracks (a limited number of) CGroups and maps each on a
+ * "boost_group" index. The fastpath accounts tasks currently RUNNABLE on each
+ * "boost_group".
+ *
+ * Once a new CGroup is created, a boost group idx is assigned and the
+ * corresponding "boost_group" marked as valid on each CPU.
+ * Once a CGroup is release, the corresponding "boost_group" is marked as
+ * invalid on each CPU. The CPU boost value (boost_max) is aggregated by
+ * considering only valid boost_groups with a non null tasks counter.
+ *
+ * .:: Locking strategy
+ *
+ * The fast path uses a spin lock for each CPU boost_group which protects the
+ * tasks counter.
+ *
+ * The "valid" and "boost" values of each CPU boost_group is instead
+ * protected by the RCU lock provided by the CGroups callbacks. Thus, only the
+ * slow path can access and modify the boost_group attribtues of each CPU.
+ * The fast path will catch up the most updated values at the next scheduling
+ * event (i.e. enqueue/dequeue).
+ *
+ *                                                        |
+ *                                             SLOW PATH  |   FAST PATH
+ *                              CGroup add/update/remove  |   Scheduler enqueue/dequeue events
+ *                                                        |
+ *                                                        |
+ *                                                        |     DEFINE_PER_CPU(struct boost_groups)
+ *                                                        |     +--------------+----+---+----+----+
+ *                                                        |     |  idle        |    |   |    |    |
+ *                                                        |     |  boost_max   |    |   |    |    |
+ *                                                        |  +---->lock        |    |   |    |    |
+ *  struct schedtune                  allocated_groups    |  |  |  group[    ] |    |   |    |    |
+ *  +------------------------------+         +-------+    |  |  +--+---------+-+----+---+----+----+
+ *  | idx                          |         |       |    |  |     |  valid  |
+ *  | boots / prefer_idle          |         |       |    |  |     |  boost  |
+ *  | perf_{boost/constraints}_idx | <---------+(*)  |    |  |     |  tasks  | <------------+
+ *  | css                          |         +-------+    |  |     +---------+              |
+ *  +-+----------------------------+         |       |    |  |     |         |              |
+ *    ^                                      |       |    |  |     |         |              |
+ *    |                                      +-------+    |  |     +---------+              |
+ *    |                                      |       |    |  |     |         |              |
+ *    |                                      |       |    |  |     |         |              |
+ *    |                                      +-------+    |  |     +---------+              |
+ *    | zmalloc                              |       |    |  |     |         |              |
+ *    |                                      |       |    |  |     |         |              |
+ *    |                                      +-------+    |  |     +---------+              |
+ *    +                              BOOSTGROUPS_COUNT    |  |     BOOSTGROUPS_COUNT        |
+ *  schedtune_boostgroup_init()                           |  +                              |
+ *                                                        |  schedtune_{en,de}queue_task()  |
+ *                                                        |                                 +
+ *                                                        |          schedtune_tasks_update()
+ *                                                        |
+ */
+
+/* SchdTune tunables for a group of tasks */
+struct schedtune {
+	/* SchedTune CGroup subsystem */
+	struct cgroup_subsys_state css;
+
+	/* Boost group allocated ID */
+	int idx;
+
+	/* Boost value for tasks on that SchedTune CGroup */
+	int boost;
+
+	/* Hint to bias scheduling of tasks on that SchedTune CGroup
+	 * towards idle CPUs */
+	int prefer_idle;
+};
+
+static inline struct schedtune *css_st(struct cgroup_subsys_state *css)
+{
+	return css ? container_of(css, struct schedtune, css) : NULL;
+}
+
+static inline struct schedtune *task_schedtune(struct task_struct *tsk)
+{
+	return css_st(task_css(tsk, schedtune_cgrp_id));
+}
+
+static inline struct schedtune *parent_st(struct schedtune *st)
+{
+	return css_st(st->css.parent);
+}
+
+/*
+ * SchedTune root control group
+ * The root control group is used to defined a system-wide boosting tuning,
+ * which is applied to all tasks in the system.
+ * Task specific boost tuning could be specified by creating and
+ * configuring a child control group under the root one.
+ * By default, system-wide boosting is disabled, i.e. no boosting is applied
+ * to tasks which are not into a child control group.
+ */
+static struct schedtune
+root_schedtune = {
+	.boost	= 0,
+	.prefer_idle = 0,
+};
+
+/*
+ * Maximum number of boost groups to support
+ * When per-task boosting is used we still allow only limited number of
+ * boost groups for two main reasons:
+ * 1. on a real system we usually have only few classes of workloads which
+ *    make sense to boost with different values (e.g. background vs foreground
+ *    tasks, interactive vs low-priority tasks)
+ * 2. a limited number allows for a simpler and more memory/time efficient
+ *    implementation especially for the computation of the per-CPU boost
+ *    value
+ */
+#define BOOSTGROUPS_COUNT 5
+
+/* Array of configured boostgroups */
+static struct schedtune *allocated_group[BOOSTGROUPS_COUNT] = {
+	&root_schedtune,
+	NULL,
+};
+
+/* SchedTune boost groups
+ * Keep track of all the boost groups which impact on CPU, for example when a
+ * CPU has two RUNNABLE tasks belonging to two different boost groups and thus
+ * likely with different boost values.
+ * Since on each system we expect only a limited number of boost groups, here
+ * we use a simple array to keep track of the metrics required to compute the
+ * maximum per-CPU boosting value.
+ */
+struct boost_groups {
+	/* Maximum boost value for all RUNNABLE tasks on a CPU */
+	int boost_max;
+	u64 boost_ts;
+	struct {
+		/* True when this boost group maps an actual cgroup */
+		bool valid;
+		/* The boost for tasks on that boost group */
+		int boost;
+		/* Count of RUNNABLE tasks on that boost group */
+		unsigned tasks;
+		/* Timestamp of boost activation */
+		u64 ts;
+	} group[BOOSTGROUPS_COUNT];
+	/* CPU's boost group locking */
+	raw_spinlock_t lock;
+};
+
+/* Boost groups affecting each CPU in the system */
+DEFINE_PER_CPU(struct boost_groups, cpu_boost_groups);
+
+static inline bool schedtune_boost_timeout(u64 now, u64 ts)
+{
+	return ((now - ts) > SCHEDTUNE_BOOST_HOLD_NS);
+}
+
+static inline bool
+schedtune_boost_group_active(int idx, struct boost_groups* bg, u64 now)
+{
+	if (bg->group[idx].tasks)
+		return true;
+
+	return !schedtune_boost_timeout(now, bg->group[idx].ts);
+}
+
+static void
+schedtune_cpu_update(int cpu, u64 now)
+{
+	struct boost_groups *bg = &per_cpu(cpu_boost_groups, cpu);
+	int boost_max;
+	u64 boost_ts;
+	int idx;
+
+	/* The root boost group is always active */
+	boost_max = bg->group[0].boost;
+	boost_ts = now;
+	for (idx = 1; idx < BOOSTGROUPS_COUNT; ++idx) {
+
+		/* Ignore non boostgroups not mapping a cgroup */
+		if (!bg->group[idx].valid)
+			continue;
+
+		/*
+		 * A boost group affects a CPU only if it has
+		 * RUNNABLE tasks on that CPU or it has hold
+		 * in effect from a previous task.
+		 */
+		if (!schedtune_boost_group_active(idx, bg, now))
+			continue;
+
+		/* This boost group is active */
+		if (boost_max > bg->group[idx].boost)
+			continue;
+
+		boost_max = bg->group[idx].boost;
+		boost_ts =  bg->group[idx].ts;
+	}
+
+	/* Ensures boost_max is non-negative when all cgroup boost values
+	 * are neagtive. Avoids under-accounting of cpu capacity which may cause
+	 * task stacking and frequency spikes.*/
+	boost_max = max(boost_max, 0);
+	bg->boost_max = boost_max;
+	bg->boost_ts = boost_ts;
+}
+
+static int
+schedtune_boostgroup_update(int idx, int boost)
+{
+	struct boost_groups *bg;
+	int cur_boost_max;
+	int old_boost;
+	int cpu;
+	u64 now;
+
+	/* Update per CPU boost groups */
+	for_each_possible_cpu(cpu) {
+		bg = &per_cpu(cpu_boost_groups, cpu);
+
+		/* CGroups are never associated to non active cgroups */
+		BUG_ON(!bg->group[idx].valid);
+
+		/*
+		 * Keep track of current boost values to compute the per CPU
+		 * maximum only when it has been affected by the new value of
+		 * the updated boost group
+		 */
+		cur_boost_max = bg->boost_max;
+		old_boost = bg->group[idx].boost;
+
+		/* Update the boost value of this boost group */
+		bg->group[idx].boost = boost;
+
+		/* Check if this update increase current max */
+		now = sched_clock_cpu(cpu);
+		if (boost > cur_boost_max &&
+			schedtune_boost_group_active(idx, bg, now)) {
+			bg->boost_max = boost;
+			bg->boost_ts = bg->group[idx].ts;
+
+			trace_sched_tune_boostgroup_update(cpu, 1, bg->boost_max);
+			continue;
+		}
+
+		/* Check if this update has decreased current max */
+		if (cur_boost_max == old_boost && old_boost > boost) {
+			schedtune_cpu_update(cpu, now);
+			trace_sched_tune_boostgroup_update(cpu, -1, bg->boost_max);
+			continue;
+		}
+
+		trace_sched_tune_boostgroup_update(cpu, 0, bg->boost_max);
+	}
+
+	return 0;
+}
+
+#define ENQUEUE_TASK  1
+#define DEQUEUE_TASK -1
+
+static inline bool
+schedtune_update_timestamp(struct task_struct *p)
+{
+	if (sched_feat(SCHEDTUNE_BOOST_HOLD_ALL))
+		return true;
+
+	return task_has_rt_policy(p);
+}
+
+static inline void
+schedtune_tasks_update(struct task_struct *p, int cpu, int idx, int task_count)
+{
+	struct boost_groups *bg = &per_cpu(cpu_boost_groups, cpu);
+	int tasks = bg->group[idx].tasks + task_count;
+
+	/* Update boosted tasks count while avoiding to make it negative */
+	bg->group[idx].tasks = max(0, tasks);
+
+	/* Update timeout on enqueue */
+	if (task_count > 0) {
+		u64 now = sched_clock_cpu(cpu);
+
+		if (schedtune_update_timestamp(p))
+			bg->group[idx].ts = now;
+
+		/* Boost group activation or deactivation on that RQ */
+		if (bg->group[idx].tasks == 1)
+			schedtune_cpu_update(cpu, now);
+	}
+
+	trace_sched_tune_tasks_update(p, cpu, tasks, idx,
+			bg->group[idx].boost, bg->boost_max,
+			bg->group[idx].ts);
+}
+
+/*
+ * NOTE: This function must be called while holding the lock on the CPU RQ
+ */
+void schedtune_enqueue_task(struct task_struct *p, int cpu)
+{
+	struct boost_groups *bg = &per_cpu(cpu_boost_groups, cpu);
+	unsigned long irq_flags;
+	struct schedtune *st;
+	int idx;
+
+	if (unlikely(!schedtune_initialized))
+		return;
+
+	/*
+	 * Boost group accouting is protected by a per-cpu lock and requires
+	 * interrupt to be disabled to avoid race conditions for example on
+	 * do_exit()::cgroup_exit() and task migration.
+	 */
+	raw_spin_lock_irqsave(&bg->lock, irq_flags);
+	rcu_read_lock();
+
+	st = task_schedtune(p);
+	idx = st->idx;
+
+	schedtune_tasks_update(p, cpu, idx, ENQUEUE_TASK);
+
+	rcu_read_unlock();
+	raw_spin_unlock_irqrestore(&bg->lock, irq_flags);
+}
+
+int schedtune_can_attach(struct cgroup_taskset *tset)
+{
+	struct task_struct *task;
+	struct cgroup_subsys_state *css;
+	struct boost_groups *bg;
+	struct rq_flags rq_flags;
+	unsigned int cpu;
+	struct rq *rq;
+	int src_bg; /* Source boost group index */
+	int dst_bg; /* Destination boost group index */
+	int tasks;
+	u64 now;
+
+	if (unlikely(!schedtune_initialized))
+		return 0;
+
+
+	cgroup_taskset_for_each(task, css, tset) {
+
+		/*
+		 * Lock the CPU's RQ the task is enqueued to avoid race
+		 * conditions with migration code while the task is being
+		 * accounted
+		 */
+		rq = task_rq_lock(task, &rq_flags);
+
+		if (!task->on_rq) {
+			task_rq_unlock(rq, task, &rq_flags);
+			continue;
+		}
+
+		/*
+		 * Boost group accouting is protected by a per-cpu lock and requires
+		 * interrupt to be disabled to avoid race conditions on...
+		 */
+		cpu = cpu_of(rq);
+		bg = &per_cpu(cpu_boost_groups, cpu);
+		raw_spin_lock(&bg->lock);
+
+		dst_bg = css_st(css)->idx;
+		src_bg = task_schedtune(task)->idx;
+
+		/*
+		 * Current task is not changing boostgroup, which can
+		 * happen when the new hierarchy is in use.
+		 */
+		if (unlikely(dst_bg == src_bg)) {
+			raw_spin_unlock(&bg->lock);
+			task_rq_unlock(rq, task, &rq_flags);
+			continue;
+		}
+
+		/*
+		 * This is the case of a RUNNABLE task which is switching its
+		 * current boost group.
+		 */
+
+		/* Move task from src to dst boost group */
+		tasks = bg->group[src_bg].tasks - 1;
+		bg->group[src_bg].tasks = max(0, tasks);
+		bg->group[dst_bg].tasks += 1;
+
+		/* Update boost hold start for this group */
+		now = sched_clock_cpu(cpu);
+		bg->group[dst_bg].ts = now;
+
+		/* Force boost group re-evaluation at next boost check */
+		bg->boost_ts = now - SCHEDTUNE_BOOST_HOLD_NS;
+
+		raw_spin_unlock(&bg->lock);
+		task_rq_unlock(rq, task, &rq_flags);
+	}
+
+	return 0;
+}
+
+void schedtune_cancel_attach(struct cgroup_taskset *tset)
+{
+	/* This can happen only if SchedTune controller is mounted with
+	 * other hierarchies ane one of them fails. Since usually SchedTune is
+	 * mouted on its own hierarcy, for the time being we do not implement
+	 * a proper rollback mechanism */
+	WARN(1, "SchedTune cancel attach not implemented");
+}
+
+/*
+ * NOTE: This function must be called while holding the lock on the CPU RQ
+ */
+void schedtune_dequeue_task(struct task_struct *p, int cpu)
+{
+	struct boost_groups *bg = &per_cpu(cpu_boost_groups, cpu);
+	unsigned long irq_flags;
+	struct schedtune *st;
+	int idx;
+
+	if (unlikely(!schedtune_initialized))
+		return;
+
+	/*
+	 * Boost group accouting is protected by a per-cpu lock and requires
+	 * interrupt to be disabled to avoid race conditions on...
+	 */
+	raw_spin_lock_irqsave(&bg->lock, irq_flags);
+	rcu_read_lock();
+
+	st = task_schedtune(p);
+	idx = st->idx;
+
+	schedtune_tasks_update(p, cpu, idx, DEQUEUE_TASK);
+
+	rcu_read_unlock();
+	raw_spin_unlock_irqrestore(&bg->lock, irq_flags);
+}
+
+int schedtune_cpu_boost(int cpu)
+{
+	struct boost_groups *bg;
+	u64 now;
+
+	bg = &per_cpu(cpu_boost_groups, cpu);
+	now = sched_clock_cpu(cpu);
+
+	/* Check to see if we have a hold in effect */
+	if (schedtune_boost_timeout(now, bg->boost_ts))
+		schedtune_cpu_update(cpu, now);
+
+	return bg->boost_max;
+}
+
+int schedtune_task_boost(struct task_struct *p)
+{
+	struct schedtune *st;
+	int task_boost;
+
+	if (unlikely(!schedtune_initialized))
+		return 0;
+
+	/* Get task boost value */
+	rcu_read_lock();
+	st = task_schedtune(p);
+	task_boost = st->boost;
+	rcu_read_unlock();
+
+	return task_boost;
+}
+
+int schedtune_prefer_idle(struct task_struct *p)
+{
+	struct schedtune *st;
+	int prefer_idle;
+
+	if (unlikely(!schedtune_initialized))
+		return 0;
+
+	/* Get prefer_idle value */
+	rcu_read_lock();
+	st = task_schedtune(p);
+	prefer_idle = st->prefer_idle;
+	rcu_read_unlock();
+
+	return prefer_idle;
+}
+
+static u64
+prefer_idle_read(struct cgroup_subsys_state *css, struct cftype *cft)
+{
+	struct schedtune *st = css_st(css);
+
+	return st->prefer_idle;
+}
+
+static int
+prefer_idle_write(struct cgroup_subsys_state *css, struct cftype *cft,
+	    u64 prefer_idle)
+{
+	struct schedtune *st = css_st(css);
+	st->prefer_idle = !!prefer_idle;
+
+	return 0;
+}
+
+static s64
+boost_read(struct cgroup_subsys_state *css, struct cftype *cft)
+{
+	struct schedtune *st = css_st(css);
+
+	return st->boost;
+}
+
+static int
+boost_write(struct cgroup_subsys_state *css, struct cftype *cft,
+	    s64 boost)
+{
+	struct schedtune *st = css_st(css);
+
+	if (boost < 0 || boost > 100)
+		return -EINVAL;
+
+	st->boost = boost;
+
+	/* Update CPU boost */
+	schedtune_boostgroup_update(st->idx, st->boost);
+
+	return 0;
+}
+
+static struct cftype files[] = {
+	{
+		.name = "boost",
+		.read_s64 = boost_read,
+		.write_s64 = boost_write,
+	},
+	{
+		.name = "prefer_idle",
+		.read_u64 = prefer_idle_read,
+		.write_u64 = prefer_idle_write,
+	},
+	{ }	/* terminate */
+};
+
+static void
+schedtune_boostgroup_init(struct schedtune *st, int idx)
+{
+	struct boost_groups *bg;
+	int cpu;
+
+	/* Initialize per CPUs boost group support */
+	for_each_possible_cpu(cpu) {
+		bg = &per_cpu(cpu_boost_groups, cpu);
+		bg->group[idx].boost = 0;
+		bg->group[idx].valid = true;
+		bg->group[idx].ts = 0;
+	}
+
+	/* Keep track of allocated boost groups */
+	allocated_group[idx] = st;
+	st->idx = idx;
+}
+
+static struct cgroup_subsys_state *
+schedtune_css_alloc(struct cgroup_subsys_state *parent_css)
+{
+	struct schedtune *st;
+	int idx;
+
+	if (!parent_css)
+		return &root_schedtune.css;
+
+	/* Allow only single level hierachies */
+	if (parent_css != &root_schedtune.css) {
+		pr_err("Nested SchedTune boosting groups not allowed\n");
+		return ERR_PTR(-ENOMEM);
+	}
+
+	/* Allow only a limited number of boosting groups */
+	for (idx = 1; idx < BOOSTGROUPS_COUNT; ++idx)
+		if (!allocated_group[idx])
+			break;
+	if (idx == BOOSTGROUPS_COUNT) {
+		pr_err("Trying to create more than %d SchedTune boosting groups\n",
+		       BOOSTGROUPS_COUNT);
+		return ERR_PTR(-ENOSPC);
+	}
+
+	st = kzalloc(sizeof(*st), GFP_KERNEL);
+	if (!st)
+		goto out;
+
+	/* Initialize per CPUs boost group support */
+	schedtune_boostgroup_init(st, idx);
+
+	return &st->css;
+
+out:
+	return ERR_PTR(-ENOMEM);
+}
+
+static void
+schedtune_boostgroup_release(struct schedtune *st)
+{
+	struct boost_groups *bg;
+	int cpu;
+
+	/* Reset per CPUs boost group support */
+	for_each_possible_cpu(cpu) {
+		bg = &per_cpu(cpu_boost_groups, cpu);
+		bg->group[st->idx].valid = false;
+		bg->group[st->idx].boost = 0;
+	}
+
+	/* Keep track of allocated boost groups */
+	allocated_group[st->idx] = NULL;
+}
+
+static void
+schedtune_css_free(struct cgroup_subsys_state *css)
+{
+	struct schedtune *st = css_st(css);
+
+	/* Release per CPUs boost group support */
+	schedtune_boostgroup_release(st);
+	kfree(st);
+}
+
+struct cgroup_subsys schedtune_cgrp_subsys = {
+	.css_alloc	= schedtune_css_alloc,
+	.css_free	= schedtune_css_free,
+	.can_attach     = schedtune_can_attach,
+	.cancel_attach  = schedtune_cancel_attach,
+	.legacy_cftypes	= files,
+	.early_init	= 1,
+};
+
+static inline void
+schedtune_init_cgroups(void)
+{
+	struct boost_groups *bg;
+	int cpu;
+
+	/* Initialize the per CPU boost groups */
+	for_each_possible_cpu(cpu) {
+		bg = &per_cpu(cpu_boost_groups, cpu);
+		memset(bg, 0, sizeof(struct boost_groups));
+		bg->group[0].valid = true;
+		raw_spin_lock_init(&bg->lock);
+	}
+
+	pr_info("schedtune: configured to support %d boost groups\n",
+		BOOSTGROUPS_COUNT);
+
+	schedtune_initialized = true;
+}
+
+/*
+ * Initialize the cgroup structures
+ */
+static int
+schedtune_init(void)
+{
+	schedtune_spc_rdiv = reciprocal_value(100);
+	schedtune_init_cgroups();
+	return 0;
+}
+postcore_initcall(schedtune_init);
diff --git a/kernel/sched/tune.h b/kernel/sched/tune.h
new file mode 100644
index 0000000..821f026
--- /dev/null
+++ b/kernel/sched/tune.h
@@ -0,0 +1,37 @@
+
+#ifdef CONFIG_SCHED_TUNE
+
+#include <linux/reciprocal_div.h>
+
+/*
+ * System energy normalization constants
+ */
+struct target_nrg {
+	unsigned long min_power;
+	unsigned long max_power;
+	struct reciprocal_value rdiv;
+};
+
+int schedtune_cpu_boost(int cpu);
+int schedtune_task_boost(struct task_struct *tsk);
+
+int schedtune_prefer_idle(struct task_struct *tsk);
+
+void schedtune_enqueue_task(struct task_struct *p, int cpu);
+void schedtune_dequeue_task(struct task_struct *p, int cpu);
+
+unsigned long boosted_cpu_util(int cpu, unsigned long other_util);
+
+#else /* CONFIG_SCHED_TUNE */
+
+#define schedtune_cpu_boost(cpu)  0
+#define schedtune_task_boost(tsk) 0
+
+#define schedtune_prefer_idle(tsk) 0
+
+#define schedtune_enqueue_task(task, cpu) do { } while (0)
+#define schedtune_dequeue_task(task, cpu) do { } while (0)
+
+#define boosted_cpu_util(cpu, other_util) cpu_util_cfs(cpu_rq(cpu))
+
+#endif /* CONFIG_SCHED_TUNE */
diff --git a/kernel/scs.c b/kernel/scs.c
new file mode 100644
index 0000000..ad74d13
--- /dev/null
+++ b/kernel/scs.c
@@ -0,0 +1,246 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Shadow Call Stack support.
+ *
+ * Copyright (C) 2019 Google LLC
+ */
+
+#include <linux/cpuhotplug.h>
+#include <linux/kasan.h>
+#include <linux/mm.h>
+#include <linux/mmzone.h>
+#include <linux/scs.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/vmstat.h>
+#include <asm/scs.h>
+
+static inline void *__scs_base(struct task_struct *tsk)
+{
+	/*
+	 * To minimize risk the of exposure, architectures may clear a
+	 * task's thread_info::shadow_call_stack while that task is
+	 * running, and only save/restore the active shadow call stack
+	 * pointer when the usual register may be clobbered (e.g. across
+	 * context switches).
+	 *
+	 * The shadow call stack is aligned to SCS_SIZE, and grows
+	 * upwards, so we can mask out the low bits to extract the base
+	 * when the task is not running.
+	 */
+	return (void *)((unsigned long)task_scs(tsk) & ~(SCS_SIZE - 1));
+}
+
+static inline unsigned long *scs_magic(void *s)
+{
+	return (unsigned long *)(s + SCS_SIZE) - 1;
+}
+
+static inline void scs_set_magic(void *s)
+{
+	*scs_magic(s) = SCS_END_MAGIC;
+}
+
+#ifdef CONFIG_SHADOW_CALL_STACK_VMAP
+
+/* Matches NR_CACHED_STACKS for VMAP_STACK */
+#define NR_CACHED_SCS 2
+static DEFINE_PER_CPU(void *, scs_cache[NR_CACHED_SCS]);
+
+static void *scs_alloc(int node)
+{
+	int i;
+	void *s;
+
+	for (i = 0; i < NR_CACHED_SCS; i++) {
+		s = this_cpu_xchg(scs_cache[i], NULL);
+		if (s) {
+			memset(s, 0, SCS_SIZE);
+			goto out;
+		}
+	}
+
+	/*
+	 * We allocate a full page for the shadow stack, which should be
+	 * more than we need. Check the assumption nevertheless.
+	 */
+	BUILD_BUG_ON(SCS_SIZE > PAGE_SIZE);
+
+	s = __vmalloc_node_range(PAGE_SIZE, SCS_SIZE,
+				 VMALLOC_START, VMALLOC_END,
+				 GFP_SCS, PAGE_KERNEL, 0,
+				 node, __builtin_return_address(0));
+
+out:
+	if (s)
+		scs_set_magic(s);
+	/* TODO: poison for KASAN, unpoison in scs_free */
+
+	return s;
+}
+
+static void scs_free(void *s)
+{
+	int i;
+
+	for (i = 0; i < NR_CACHED_SCS; i++)
+		if (this_cpu_cmpxchg(scs_cache[i], 0, s) == NULL)
+			return;
+
+	vfree_atomic(s);
+}
+
+static struct page *__scs_page(struct task_struct *tsk)
+{
+	return vmalloc_to_page(__scs_base(tsk));
+}
+
+static int scs_cleanup(unsigned int cpu)
+{
+	int i;
+	void **cache = per_cpu_ptr(scs_cache, cpu);
+
+	for (i = 0; i < NR_CACHED_SCS; i++) {
+		vfree(cache[i]);
+		cache[i] = NULL;
+	}
+
+	return 0;
+}
+
+void __init scs_init(void)
+{
+	WARN_ON(cpuhp_setup_state(CPUHP_BP_PREPARE_DYN, "scs:scs_cache", NULL,
+			scs_cleanup) < 0);
+}
+
+#else /* !CONFIG_SHADOW_CALL_STACK_VMAP */
+
+static struct kmem_cache *scs_cache;
+
+static inline void *scs_alloc(int node)
+{
+	void *s;
+
+	s = kmem_cache_alloc_node(scs_cache, GFP_SCS, node);
+	if (s) {
+		scs_set_magic(s);
+		/*
+		 * Poison the allocation to catch unintentional accesses to
+		 * the shadow stack when KASAN is enabled.
+		 */
+		kasan_poison_object_data(scs_cache, s);
+	}
+
+	return s;
+}
+
+static inline void scs_free(void *s)
+{
+	kasan_unpoison_object_data(scs_cache, s);
+	kmem_cache_free(scs_cache, s);
+}
+
+static struct page *__scs_page(struct task_struct *tsk)
+{
+	return virt_to_page(__scs_base(tsk));
+}
+
+void __init scs_init(void)
+{
+	scs_cache = kmem_cache_create("scs_cache", SCS_SIZE, SCS_SIZE,
+				0, NULL);
+	WARN_ON(!scs_cache);
+}
+
+#endif /* CONFIG_SHADOW_CALL_STACK_VMAP */
+
+void scs_task_reset(struct task_struct *tsk)
+{
+	/*
+	 * Reset the shadow stack to the base address in case the task
+	 * is reused.
+	 */
+	task_set_scs(tsk, __scs_base(tsk));
+}
+
+static void scs_account(struct task_struct *tsk, int account)
+{
+	mod_zone_page_state(page_zone(__scs_page(tsk)), NR_KERNEL_SCS_BYTES,
+		account * SCS_SIZE);
+}
+
+int scs_prepare(struct task_struct *tsk, int node)
+{
+	void *s;
+
+	s = scs_alloc(node);
+	if (!s)
+		return -ENOMEM;
+
+	task_set_scs(tsk, s);
+	scs_account(tsk, 1);
+
+	return 0;
+}
+
+#ifdef CONFIG_DEBUG_STACK_USAGE
+static inline unsigned long scs_used(struct task_struct *tsk)
+{
+	unsigned long *p = __scs_base(tsk);
+	unsigned long *end = scs_magic(p);
+	unsigned long s = (unsigned long)p;
+
+	while (p < end && READ_ONCE_NOCHECK(*p))
+		p++;
+
+	return (unsigned long)p - s;
+}
+
+static void scs_check_usage(struct task_struct *tsk)
+{
+	static DEFINE_SPINLOCK(lock);
+	static unsigned long highest;
+	unsigned long used = scs_used(tsk);
+
+	if (used <= highest)
+		return;
+
+	spin_lock(&lock);
+
+	if (used > highest) {
+		pr_info("%s (%d): highest shadow stack usage: %lu bytes\n",
+			tsk->comm, task_pid_nr(tsk), used);
+		highest = used;
+	}
+
+	spin_unlock(&lock);
+}
+#else
+static inline void scs_check_usage(struct task_struct *tsk)
+{
+}
+#endif
+
+bool scs_corrupted(struct task_struct *tsk)
+{
+	unsigned long *magic = scs_magic(__scs_base(tsk));
+
+	return READ_ONCE_NOCHECK(*magic) != SCS_END_MAGIC;
+}
+
+void scs_release(struct task_struct *tsk)
+{
+	void *s;
+
+	s = __scs_base(tsk);
+	if (!s)
+		return;
+
+	WARN_ON(scs_corrupted(tsk));
+	scs_check_usage(tsk);
+
+	scs_account(tsk, -1);
+	task_set_scs(tsk, NULL);
+	scs_free(s);
+}
diff --git a/kernel/signal.c b/kernel/signal.c
index 7278302..898b8c3 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -19,7 +19,9 @@
 #include <linux/sched/task.h>
 #include <linux/sched/task_stack.h>
 #include <linux/sched/cputime.h>
+#include <linux/file.h>
 #include <linux/fs.h>
+#include <linux/proc_fs.h>
 #include <linux/tty.h>
 #include <linux/binfmts.h>
 #include <linux/coredump.h>
@@ -1799,6 +1801,14 @@
 	return ret;
 }
 
+static void do_notify_pidfd(struct task_struct *task)
+{
+	struct pid *pid;
+
+	pid = task_pid(task);
+	wake_up_all(&pid->wait_pidfd);
+}
+
 /*
  * Let a parent know about the death of a child.
  * For a stopped/continued status change, use do_notify_parent_cldstop instead.
@@ -1822,6 +1832,9 @@
 	BUG_ON(!tsk->ptrace &&
 	       (tsk->group_leader != tsk || !thread_group_empty(tsk)));
 
+	/* Wake up all pidfd waiters */
+	do_notify_pidfd(tsk);
+
 	if (sig != SIGCHLD) {
 		/*
 		 * This is only possible if parent == real_parent.
@@ -3267,6 +3280,16 @@
 }
 #endif
 
+static inline void prepare_kill_siginfo(int sig, struct siginfo *info)
+{
+	clear_siginfo(info);
+	info->si_signo = sig;
+	info->si_errno = 0;
+	info->si_code = SI_USER;
+	info->si_pid = task_tgid_vnr(current);
+	info->si_uid = from_kuid_munged(current_user_ns(), current_uid());
+}
+
 /**
  *  sys_kill - send a signal to a process
  *  @pid: the PID of the process
@@ -3276,16 +3299,125 @@
 {
 	struct siginfo info;
 
-	clear_siginfo(&info);
-	info.si_signo = sig;
-	info.si_errno = 0;
-	info.si_code = SI_USER;
-	info.si_pid = task_tgid_vnr(current);
-	info.si_uid = from_kuid_munged(current_user_ns(), current_uid());
+	prepare_kill_siginfo(sig, &info);
 
 	return kill_something_info(sig, &info, pid);
 }
 
+/*
+ * Verify that the signaler and signalee either are in the same pid namespace
+ * or that the signaler's pid namespace is an ancestor of the signalee's pid
+ * namespace.
+ */
+static bool access_pidfd_pidns(struct pid *pid)
+{
+	struct pid_namespace *active = task_active_pid_ns(current);
+	struct pid_namespace *p = ns_of_pid(pid);
+
+	for (;;) {
+		if (!p)
+			return false;
+		if (p == active)
+			break;
+		p = p->parent;
+	}
+
+	return true;
+}
+
+static int copy_siginfo_from_user_any(siginfo_t *kinfo, siginfo_t __user *info)
+{
+#ifdef CONFIG_COMPAT
+	/*
+	 * Avoid hooking up compat syscalls and instead handle necessary
+	 * conversions here. Note, this is a stop-gap measure and should not be
+	 * considered a generic solution.
+	 */
+	if (in_compat_syscall())
+		return copy_siginfo_from_user32(
+			kinfo, (struct compat_siginfo __user *)info);
+#endif
+	return copy_from_user(kinfo, info, sizeof(siginfo_t));
+}
+
+static struct pid *pidfd_to_pid(const struct file *file)
+{
+	if (file->f_op == &pidfd_fops)
+		return file->private_data;
+
+	return tgid_pidfd_to_pid(file);
+}
+
+/**
+ * sys_pidfd_send_signal - Signal a process through a pidfd
+ * @pidfd:  file descriptor of the process
+ * @sig:    signal to send
+ * @info:   signal info
+ * @flags:  future flags
+ *
+ * The syscall currently only signals via PIDTYPE_PID which covers
+ * kill(<positive-pid>, <signal>. It does not signal threads or process
+ * groups.
+ * In order to extend the syscall to threads and process groups the @flags
+ * argument should be used. In essence, the @flags argument will determine
+ * what is signaled and not the file descriptor itself. Put in other words,
+ * grouping is a property of the flags argument not a property of the file
+ * descriptor.
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+SYSCALL_DEFINE4(pidfd_send_signal, int, pidfd, int, sig,
+		siginfo_t __user *, info, unsigned int, flags)
+{
+	int ret;
+	struct fd f;
+	struct pid *pid;
+	siginfo_t kinfo;
+
+	/* Enforce flags be set to 0 until we add an extension. */
+	if (flags)
+		return -EINVAL;
+
+	f = fdget(pidfd);
+	if (!f.file)
+		return -EBADF;
+
+	/* Is this a pidfd? */
+	pid = pidfd_to_pid(f.file);
+	if (IS_ERR(pid)) {
+		ret = PTR_ERR(pid);
+		goto err;
+	}
+
+	ret = -EINVAL;
+	if (!access_pidfd_pidns(pid))
+		goto err;
+
+	if (info) {
+		ret = copy_siginfo_from_user_any(&kinfo, info);
+		if (unlikely(ret))
+			goto err;
+
+		ret = -EINVAL;
+		if (unlikely(sig != kinfo.si_signo))
+			goto err;
+
+		/* Only allow sending arbitrary signals to yourself. */
+		ret = -EPERM;
+		if ((task_pid(current) != pid) &&
+		    (kinfo.si_code >= 0 || kinfo.si_code == SI_TKILL))
+			goto err;
+	} else {
+		prepare_kill_siginfo(sig, &kinfo);
+	}
+
+	ret = kill_pid_info(sig, &kinfo, pid);
+
+err:
+	fdput(f);
+	return ret;
+}
+
 static int
 do_send_specific(pid_t tgid, pid_t pid, int sig, struct siginfo *info)
 {
diff --git a/kernel/sys.c b/kernel/sys.c
index 096932a..0a1cdee 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -42,6 +42,8 @@
 #include <linux/syscore_ops.h>
 #include <linux/version.h>
 #include <linux/ctype.h>
+#include <linux/mm.h>
+#include <linux/mempolicy.h>
 
 #include <linux/compat.h>
 #include <linux/syscalls.h>
@@ -121,6 +123,12 @@
 #ifndef SVE_GET_VL
 # define SVE_GET_VL()		(-EINVAL)
 #endif
+#ifndef SET_TAGGED_ADDR_CTRL
+# define SET_TAGGED_ADDR_CTRL(a)	(-EINVAL)
+#endif
+#ifndef GET_TAGGED_ADDR_CTRL
+# define GET_TAGGED_ADDR_CTRL()		(-EINVAL)
+#endif
 
 /*
  * this is where the system-wide overflow UID and GID are defined, for
@@ -2258,6 +2266,153 @@
 	return -EINVAL;
 }
 
+#ifdef CONFIG_MMU
+static int prctl_update_vma_anon_name(struct vm_area_struct *vma,
+		struct vm_area_struct **prev,
+		unsigned long start, unsigned long end,
+		const char __user *name_addr)
+{
+	struct mm_struct *mm = vma->vm_mm;
+	int error = 0;
+	pgoff_t pgoff;
+
+	if (name_addr == vma_get_anon_name(vma)) {
+		*prev = vma;
+		goto out;
+	}
+
+	pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);
+	*prev = vma_merge(mm, *prev, start, end, vma->vm_flags, vma->anon_vma,
+				vma->vm_file, pgoff, vma_policy(vma),
+				vma->vm_userfaultfd_ctx, name_addr);
+	if (*prev) {
+		vma = *prev;
+		goto success;
+	}
+
+	*prev = vma;
+
+	if (start != vma->vm_start) {
+		error = split_vma(mm, vma, start, 1);
+		if (error)
+			goto out;
+	}
+
+	if (end != vma->vm_end) {
+		error = split_vma(mm, vma, end, 0);
+		if (error)
+			goto out;
+	}
+
+success:
+	if (!vma->vm_file)
+		vma->anon_name = name_addr;
+
+out:
+	if (error == -ENOMEM)
+		error = -EAGAIN;
+	return error;
+}
+
+static int prctl_set_vma_anon_name(unsigned long start, unsigned long end,
+			unsigned long arg)
+{
+	unsigned long tmp;
+	struct vm_area_struct *vma, *prev;
+	int unmapped_error = 0;
+	int error = -EINVAL;
+
+	/*
+	 * If the interval [start,end) covers some unmapped address
+	 * ranges, just ignore them, but return -ENOMEM at the end.
+	 * - this matches the handling in madvise.
+	 */
+	vma = find_vma_prev(current->mm, start, &prev);
+	if (vma && start > vma->vm_start)
+		prev = vma;
+
+	for (;;) {
+		/* Still start < end. */
+		error = -ENOMEM;
+		if (!vma)
+			return error;
+
+		/* Here start < (end|vma->vm_end). */
+		if (start < vma->vm_start) {
+			unmapped_error = -ENOMEM;
+			start = vma->vm_start;
+			if (start >= end)
+				return error;
+		}
+
+		/* Here vma->vm_start <= start < (end|vma->vm_end) */
+		tmp = vma->vm_end;
+		if (end < tmp)
+			tmp = end;
+
+		/* Here vma->vm_start <= start < tmp <= (end|vma->vm_end). */
+		error = prctl_update_vma_anon_name(vma, &prev, start, tmp,
+				(const char __user *)arg);
+		if (error)
+			return error;
+		start = tmp;
+		if (prev && start < prev->vm_end)
+			start = prev->vm_end;
+		error = unmapped_error;
+		if (start >= end)
+			return error;
+		if (prev)
+			vma = prev->vm_next;
+		else	/* madvise_remove dropped mmap_sem */
+			vma = find_vma(current->mm, start);
+	}
+}
+
+static int prctl_set_vma(unsigned long opt, unsigned long start,
+		unsigned long len_in, unsigned long arg)
+{
+	struct mm_struct *mm = current->mm;
+	int error;
+	unsigned long len;
+	unsigned long end;
+
+	if (start & ~PAGE_MASK)
+		return -EINVAL;
+	len = (len_in + ~PAGE_MASK) & PAGE_MASK;
+
+	/* Check to see whether len was rounded up from small -ve to zero */
+	if (len_in && !len)
+		return -EINVAL;
+
+	end = start + len;
+	if (end < start)
+		return -EINVAL;
+
+	if (end == start)
+		return 0;
+
+	down_write(&mm->mmap_sem);
+
+	switch (opt) {
+	case PR_SET_VMA_ANON_NAME:
+		error = prctl_set_vma_anon_name(start, end, arg);
+		break;
+	default:
+		error = -EINVAL;
+	}
+
+	up_write(&mm->mmap_sem);
+
+	return error;
+}
+#else /* CONFIG_MMU */
+static int prctl_set_vma(unsigned long opt, unsigned long start,
+		unsigned long len_in, unsigned long arg)
+{
+	return -EINVAL;
+}
+#endif
+
 SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
 		unsigned long, arg4, unsigned long, arg5)
 {
@@ -2476,6 +2631,19 @@
 			return -EINVAL;
 		error = arch_prctl_spec_ctrl_set(me, arg2, arg3);
 		break;
+	case PR_SET_VMA:
+		error = prctl_set_vma(arg2, arg3, arg4, arg5);
+		break;
+	case PR_SET_TAGGED_ADDR_CTRL:
+		if (arg3 || arg4 || arg5)
+			return -EINVAL;
+		error = SET_TAGGED_ADDR_CTRL(arg2);
+		break;
+	case PR_GET_TAGGED_ADDR_CTRL:
+		if (arg2 || arg3 || arg4 || arg5)
+			return -EINVAL;
+		error = GET_TAGGED_ADDR_CTRL();
+		break;
 	default:
 		error = -EINVAL;
 		break;
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
index df55617..7042383 100644
--- a/kernel/sys_ni.c
+++ b/kernel/sys_ni.c
@@ -162,8 +162,6 @@
 
 /* kernel/sched/core.c */
 
-/* kernel/signal.c */
-
 /* kernel/sys.c */
 COND_SYSCALL(setregid);
 COND_SYSCALL(setgid);
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index f857650..33c64f3 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -106,6 +106,7 @@
 extern unsigned int core_pipe_limit;
 #endif
 extern int pid_max;
+extern int extra_free_kbytes;
 extern int pid_max_min, pid_max_max;
 extern int percpu_pagelist_fraction;
 extern int latencytop_enabled;
@@ -323,6 +324,13 @@
 	},
 #ifdef CONFIG_SCHED_DEBUG
 	{
+		.procname       = "sched_cstate_aware",
+		.data           = &sysctl_sched_cstate_aware,
+		.maxlen         = sizeof(unsigned int),
+		.mode           = 0644,
+		.proc_handler   = proc_dointvec,
+	},
+	{
 		.procname	= "sched_min_granularity_ns",
 		.data		= &sysctl_sched_min_granularity,
 		.maxlen		= sizeof(unsigned int),
@@ -341,6 +349,13 @@
 		.extra2		= &max_sched_granularity_ns,
 	},
 	{
+		.procname	= "sched_sync_hint_enable",
+		.data		= &sysctl_sched_sync_hint_enable,
+		.maxlen		= sizeof(unsigned int),
+		.mode		= 0644,
+		.proc_handler	= proc_dointvec,
+	},
+	{
 		.procname	= "sched_wakeup_granularity_ns",
 		.data		= &sysctl_sched_wakeup_granularity,
 		.maxlen		= sizeof(unsigned int),
@@ -1462,6 +1477,14 @@
 		.extra2		= &one_thousand,
 	},
 	{
+		.procname	= "extra_free_kbytes",
+		.data		= &extra_free_kbytes,
+		.maxlen		= sizeof(extra_free_kbytes),
+		.mode		= 0644,
+		.proc_handler	= min_free_kbytes_sysctl_handler,
+		.extra1		= &zero,
+	},
+	{
 		.procname	= "percpu_pagelist_fraction",
 		.data		= &percpu_pagelist_fraction,
 		.maxlen		= sizeof(percpu_pagelist_fraction),
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index f4255a6..6e244e1 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -100,7 +100,7 @@
 	if (!device_may_wakeup(rtc->dev.parent))
 		return -1;
 
-	__ws = wakeup_source_register("alarmtimer");
+	__ws = wakeup_source_register(dev, "alarmtimer");
 
 	spin_lock_irqsave(&rtcdev_lock, flags);
 	if (!rtcdev) {
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index b84eb96..b3ce6a9 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -124,8 +124,9 @@
 				 struct ftrace_ops *op, struct pt_regs *regs);
 #else
 /* See comment below, where ftrace_ops_list_func is defined */
-static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip);
-#define ftrace_ops_list_func ((ftrace_func_t)ftrace_ops_no_ops)
+static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip,
+			      struct ftrace_ops *op, struct pt_regs *regs);
+#define ftrace_ops_list_func ftrace_ops_no_ops
 #endif
 
 /*
@@ -5530,9 +5531,9 @@
 	return 0;
 }
 
-static int ftrace_process_locs(struct module *mod,
-			       unsigned long *start,
-			       unsigned long *end)
+static int __norecordmcount ftrace_process_locs(struct module *mod,
+						unsigned long *start,
+						unsigned long *end)
 {
 	struct ftrace_page *start_pg;
 	struct ftrace_page *pg;
@@ -6343,7 +6344,8 @@
 }
 NOKPROBE_SYMBOL(ftrace_ops_list_func);
 #else
-static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip)
+static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip,
+			      struct ftrace_ops *op, struct pt_regs *regs)
 {
 	__ftrace_ops_list_func(ip, parent_ip, NULL, NULL);
 }
@@ -6806,14 +6808,17 @@
 	fgraph_graph_time = enable;
 }
 
+void ftrace_graph_return_stub(struct ftrace_graph_ret *trace)
+{
+}
+
 int ftrace_graph_entry_stub(struct ftrace_graph_ent *trace)
 {
 	return 0;
 }
 
 /* The callbacks that hook a function */
-trace_func_graph_ret_t ftrace_graph_return =
-			(trace_func_graph_ret_t)ftrace_stub;
+trace_func_graph_ret_t ftrace_graph_return = ftrace_graph_return_stub;
 trace_func_graph_ent_t ftrace_graph_entry = ftrace_graph_entry_stub;
 static trace_func_graph_ent_t __ftrace_graph_entry = ftrace_graph_entry_stub;
 
@@ -7043,7 +7048,7 @@
 		goto out;
 
 	ftrace_graph_active--;
-	ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub;
+	ftrace_graph_return = ftrace_graph_return_stub;
 	ftrace_graph_entry = ftrace_graph_entry_stub;
 	__ftrace_graph_entry = ftrace_graph_entry_stub;
 	ftrace_shutdown(&graph_ops, FTRACE_STOP_FUNC_RET);
diff --git a/kernel/user.c b/kernel/user.c
index 0df9b16..7f74a8a 100644
--- a/kernel/user.c
+++ b/kernel/user.c
@@ -17,6 +17,7 @@
 #include <linux/interrupt.h>
 #include <linux/export.h>
 #include <linux/user_namespace.h>
+#include <linux/proc_fs.h>
 #include <linux/proc_ns.h>
 
 /*
@@ -208,6 +209,7 @@
 		}
 		spin_unlock_irq(&uidhash_lock);
 	}
+	proc_register_uid(uid);
 
 	return up;
 
@@ -229,6 +231,7 @@
 	spin_lock_irq(&uidhash_lock);
 	uid_hash_insert(&root_user, uidhashentry(GLOBAL_ROOT_UID));
 	spin_unlock_irq(&uidhash_lock);
+	proc_register_uid(GLOBAL_ROOT_UID);
 
 	return 0;
 }
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 4939084..924a2e8 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -910,6 +910,26 @@
 }
 
 /**
+ * wq_worker_last_func - retrieve worker's last work function
+ *
+ * Determine the last function a worker executed. This is called from
+ * the scheduler to get a worker's last known identity.
+ *
+ * CONTEXT:
+ * spin_lock_irq(rq->lock)
+ *
+ * Return:
+ * The last work function %current executed as a worker, NULL if it
+ * hasn't executed any work yet.
+ */
+work_func_t wq_worker_last_func(struct task_struct *task)
+{
+	struct worker *worker = kthread_data(task);
+
+	return worker->last_func;
+}
+
+/**
  * worker_set_flags - set worker flags and adjust nr_running accordingly
  * @worker: self
  * @flags: flags to set
@@ -2184,6 +2204,9 @@
 	if (unlikely(cpu_intensive))
 		worker_clr_flags(worker, WORKER_CPU_INTENSIVE);
 
+	/* tag the worker for identification in schedule() */
+	worker->last_func = worker->current_func;
+
 	/* we're done with it, release */
 	hash_del(&worker->hentry);
 	worker->current_work = NULL;
diff --git a/kernel/workqueue_internal.h b/kernel/workqueue_internal.h
index 66fbb5a..cb68b03 100644
--- a/kernel/workqueue_internal.h
+++ b/kernel/workqueue_internal.h
@@ -53,6 +53,9 @@
 
 	/* used only by rescuers to point to the target workqueue */
 	struct workqueue_struct	*rescue_wq;	/* I: the workqueue to rescue */
+
+	/* used by the scheduler to determine a worker's last known identity */
+	work_func_t		last_func;
 };
 
 /**
@@ -67,9 +70,10 @@
 
 /*
  * Scheduler hooks for concurrency managed workqueue.  Only to be used from
- * sched/core.c and workqueue.c.
+ * sched/ and workqueue.c.
  */
 void wq_worker_waking_up(struct task_struct *task, int cpu);
 struct task_struct *wq_worker_sleeping(struct task_struct *task);
+work_func_t wq_worker_last_func(struct task_struct *task);
 
 #endif /* _KERNEL_WORKQUEUE_INTERNAL_H */
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 46a910a..b9672df 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -222,7 +222,6 @@
 config FRAME_WARN
 	int "Warn for stack frames larger than (needs gcc 4.4)"
 	range 0 8192
-	default 3072 if KASAN_EXTRA
 	default 2048 if GCC_PLUGIN_LATENT_ENTROPY
 	default 1280 if (!64BIT && PARISC)
 	default 1024 if (!64BIT && !PARISC)
@@ -1966,6 +1965,14 @@
 
 	  If unsure, say N.
 
+config TEST_MEMINIT
+	tristate "Test heap/page initialization"
+	help
+	  Test if the kernel is zero-initializing heap and page allocations.
+	  This can be useful to test init_on_alloc and init_on_free features.
+
+	  If unsure, say N.
+
 endif # RUNTIME_TESTING_MENU
 
 config MEMTEST
diff --git a/lib/Kconfig.kasan b/lib/Kconfig.kasan
index befb127..9defbca 100644
--- a/lib/Kconfig.kasan
+++ b/lib/Kconfig.kasan
@@ -1,36 +1,82 @@
+# This config refers to the generic KASAN mode.
 config HAVE_ARCH_KASAN
 	bool
 
-if HAVE_ARCH_KASAN
+config HAVE_ARCH_KASAN_SW_TAGS
+	bool
+
+config CC_HAS_KASAN_GENERIC
+	def_bool $(cc-option, -fsanitize=kernel-address)
+
+config CC_HAS_KASAN_SW_TAGS
+	def_bool $(cc-option, -fsanitize=kernel-hwaddress)
 
 config KASAN
-	bool "KASan: runtime memory debugger"
+	bool "KASAN: runtime memory debugger"
+	depends on (HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC) || \
+		   (HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS)
+	depends on (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB)
+	help
+	  Enables KASAN (KernelAddressSANitizer) - runtime memory debugger,
+	  designed to find out-of-bounds accesses and use-after-free bugs.
+	  See Documentation/dev-tools/kasan.rst for details.
+
+choice
+	prompt "KASAN mode"
+	depends on KASAN
+	default KASAN_GENERIC
+	help
+	  KASAN has two modes: generic KASAN (similar to userspace ASan,
+	  x86_64/arm64/xtensa, enabled with CONFIG_KASAN_GENERIC) and
+	  software tag-based KASAN (a version based on software memory
+	  tagging, arm64 only, similar to userspace HWASan, enabled with
+	  CONFIG_KASAN_SW_TAGS).
+	  Both generic and tag-based KASAN are strictly debugging features.
+
+config KASAN_GENERIC
+	bool "Generic mode"
+	depends on HAVE_ARCH_KASAN && CC_HAS_KASAN_GENERIC
 	depends on (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB)
 	select SLUB_DEBUG if SLUB
 	select CONSTRUCTORS
 	select STACKDEPOT
 	help
-	  Enables kernel address sanitizer - runtime memory debugger,
-	  designed to find out-of-bounds accesses and use-after-free bugs.
-	  This is strictly a debugging feature and it requires a gcc version
-	  of 4.9.2 or later. Detection of out of bounds accesses to stack or
-	  global variables requires gcc 5.0 or later.
-	  This feature consumes about 1/8 of available memory and brings about
-	  ~x3 performance slowdown.
+	  Enables generic KASAN mode.
+	  Supported in both GCC and Clang. With GCC it requires version 4.9.2
+	  or later for basic support and version 5.0 or later for detection of
+	  out-of-bounds accesses for stack and global variables and for inline
+	  instrumentation mode (CONFIG_KASAN_INLINE). With Clang it requires
+	  version 3.7.0 or later and it doesn't support detection of
+	  out-of-bounds accesses for global variables yet.
+	  This mode consumes about 1/8th of available memory at kernel start
+	  and introduces an overhead of ~x1.5 for the rest of the allocations.
+	  The performance slowdown is ~x3.
 	  For better error detection enable CONFIG_STACKTRACE.
-	  Currently CONFIG_KASAN doesn't work with CONFIG_DEBUG_SLAB
+	  Currently CONFIG_KASAN_GENERIC doesn't work with CONFIG_DEBUG_SLAB
 	  (the resulting kernel does not boot).
 
-config KASAN_EXTRA
-	bool "KAsan: extra checks"
-	depends on KASAN && DEBUG_KERNEL && !COMPILE_TEST
+config KASAN_SW_TAGS
+	bool "Software tag-based mode"
+	depends on HAVE_ARCH_KASAN_SW_TAGS && CC_HAS_KASAN_SW_TAGS
+	depends on (SLUB && SYSFS) || (SLAB && !DEBUG_SLAB)
+	select SLUB_DEBUG if SLUB
+	select CONSTRUCTORS
+	select STACKDEPOT
 	help
-	  This enables further checks in the kernel address sanitizer, for now
-	  it only includes the address-use-after-scope check that can lead
-	  to excessive kernel stack usage, frame size warnings and longer
-	  compile time.
-	  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 has more
+	  Enables software tag-based KASAN mode.
+	  This mode requires Top Byte Ignore support by the CPU and therefore
+	  is only supported for arm64.
+	  This mode requires Clang version 7.0.0 or later.
+	  This mode consumes about 1/16th of available memory at kernel start
+	  and introduces an overhead of ~20% for the rest of the allocations.
+	  This mode may potentially introduce problems relating to pointer
+	  casting and comparison, as it embeds tags into the top byte of each
+	  pointer.
+	  For better error detection enable CONFIG_STACKTRACE.
+	  Currently CONFIG_KASAN_SW_TAGS doesn't work with CONFIG_DEBUG_SLAB
+	  (the resulting kernel does not boot).
 
+endchoice
 
 choice
 	prompt "Instrumentation type"
@@ -53,16 +99,36 @@
 	  memory accesses. This is faster than outline (in some workloads
 	  it gives about x2 boost over outline instrumentation), but
 	  make kernel's .text size much bigger.
-	  This requires a gcc version of 5.0 or later.
+	  For CONFIG_KASAN_GENERIC this requires GCC 5.0 or later.
 
 endchoice
 
+config KASAN_STACK_ENABLE
+	bool "Enable stack instrumentation (unsafe)" if CC_IS_CLANG && !COMPILE_TEST
+	default !(CLANG_VERSION < 90000)
+	depends on KASAN
+	help
+	  The LLVM stack address sanitizer has a know problem that
+	  causes excessive stack usage in a lot of functions, see
+	  https://bugs.llvm.org/show_bug.cgi?id=38809
+	  Disabling asan-stack makes it safe to run kernels build
+	  with clang-8 with KASAN enabled, though it loses some of
+	  the functionality.
+	  This feature is always disabled when compile-testing with clang-8
+	  or earlier to avoid cluttering the output in stack overflow
+	  warnings, but clang-8 users can still enable it for builds without
+	  CONFIG_COMPILE_TEST.  On gcc and later clang versions it is
+	  assumed to always be safe to use and enabled by default.
+
+config KASAN_STACK
+	int
+	default 1 if KASAN_STACK_ENABLE || CC_IS_GCC
+	default 0
+
 config TEST_KASAN
-	tristate "Module for testing kasan for bug detection"
+	tristate "Module for testing KASAN for bug detection"
 	depends on m && KASAN
 	help
 	  This is a test module doing various nasty things like
 	  out of bounds accesses, use after free. It is useful for testing
-	  kernel debugging features like kernel address sanitizer.
-
-endif
+	  kernel debugging features like KASAN.
diff --git a/lib/Makefile b/lib/Makefile
index 0ab8083..e8bc4e6 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,7 +31,7 @@
 lib-y := ctype.o string.o vsprintf.o cmdline.o \
 	 rbtree.o radix-tree.o timerqueue.o\
 	 idr.o int_sqrt.o extable.o \
-	 sha1.o chacha20.o irq_regs.o argv_split.o \
+	 sha1.o chacha.o irq_regs.o argv_split.o \
 	 flex_proportions.o ratelimit.o show_mem.o \
 	 is_single_threaded.o plist.o decompress.o kobject_uevent.o \
 	 earlycpio.o seq_buf.o siphash.o dec_and_lock.o \
@@ -82,6 +82,7 @@
 obj-$(CONFIG_TEST_PARMAN) += test_parman.o
 obj-$(CONFIG_TEST_KMOD) += test_kmod.o
 obj-$(CONFIG_TEST_DEBUG_VIRTUAL) += test_debug_virtual.o
+obj-$(CONFIG_TEST_MEMINIT) += test_meminit.o
 
 ifeq ($(CONFIG_DEBUG_KOBJECT),y)
 CFLAGS_kobject.o += -DDEBUG
diff --git a/lib/chacha.c b/lib/chacha.c
new file mode 100644
index 0000000..a46d283
--- /dev/null
+++ b/lib/chacha.c
@@ -0,0 +1,117 @@
+/*
+ * The "hash function" used as the core of the ChaCha stream cipher (RFC7539)
+ *
+ * Copyright (C) 2015 Martin Willi
+ *
+ * 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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/export.h>
+#include <linux/bitops.h>
+#include <linux/cryptohash.h>
+#include <asm/unaligned.h>
+#include <crypto/chacha.h>
+
+static void chacha_permute(u32 *x, int nrounds)
+{
+	int i;
+
+	/* whitelist the allowed round counts */
+	WARN_ON_ONCE(nrounds != 20 && nrounds != 12);
+
+	for (i = 0; i < nrounds; i += 2) {
+		x[0]  += x[4];    x[12] = rol32(x[12] ^ x[0],  16);
+		x[1]  += x[5];    x[13] = rol32(x[13] ^ x[1],  16);
+		x[2]  += x[6];    x[14] = rol32(x[14] ^ x[2],  16);
+		x[3]  += x[7];    x[15] = rol32(x[15] ^ x[3],  16);
+
+		x[8]  += x[12];   x[4]  = rol32(x[4]  ^ x[8],  12);
+		x[9]  += x[13];   x[5]  = rol32(x[5]  ^ x[9],  12);
+		x[10] += x[14];   x[6]  = rol32(x[6]  ^ x[10], 12);
+		x[11] += x[15];   x[7]  = rol32(x[7]  ^ x[11], 12);
+
+		x[0]  += x[4];    x[12] = rol32(x[12] ^ x[0],   8);
+		x[1]  += x[5];    x[13] = rol32(x[13] ^ x[1],   8);
+		x[2]  += x[6];    x[14] = rol32(x[14] ^ x[2],   8);
+		x[3]  += x[7];    x[15] = rol32(x[15] ^ x[3],   8);
+
+		x[8]  += x[12];   x[4]  = rol32(x[4]  ^ x[8],   7);
+		x[9]  += x[13];   x[5]  = rol32(x[5]  ^ x[9],   7);
+		x[10] += x[14];   x[6]  = rol32(x[6]  ^ x[10],  7);
+		x[11] += x[15];   x[7]  = rol32(x[7]  ^ x[11],  7);
+
+		x[0]  += x[5];    x[15] = rol32(x[15] ^ x[0],  16);
+		x[1]  += x[6];    x[12] = rol32(x[12] ^ x[1],  16);
+		x[2]  += x[7];    x[13] = rol32(x[13] ^ x[2],  16);
+		x[3]  += x[4];    x[14] = rol32(x[14] ^ x[3],  16);
+
+		x[10] += x[15];   x[5]  = rol32(x[5]  ^ x[10], 12);
+		x[11] += x[12];   x[6]  = rol32(x[6]  ^ x[11], 12);
+		x[8]  += x[13];   x[7]  = rol32(x[7]  ^ x[8],  12);
+		x[9]  += x[14];   x[4]  = rol32(x[4]  ^ x[9],  12);
+
+		x[0]  += x[5];    x[15] = rol32(x[15] ^ x[0],   8);
+		x[1]  += x[6];    x[12] = rol32(x[12] ^ x[1],   8);
+		x[2]  += x[7];    x[13] = rol32(x[13] ^ x[2],   8);
+		x[3]  += x[4];    x[14] = rol32(x[14] ^ x[3],   8);
+
+		x[10] += x[15];   x[5]  = rol32(x[5]  ^ x[10],  7);
+		x[11] += x[12];   x[6]  = rol32(x[6]  ^ x[11],  7);
+		x[8]  += x[13];   x[7]  = rol32(x[7]  ^ x[8],   7);
+		x[9]  += x[14];   x[4]  = rol32(x[4]  ^ x[9],   7);
+	}
+}
+
+/**
+ * chacha_block - generate one keystream block and increment block counter
+ * @state: input state matrix (16 32-bit words)
+ * @stream: output keystream block (64 bytes)
+ * @nrounds: number of rounds (20 or 12; 20 is recommended)
+ *
+ * This is the ChaCha core, a function from 64-byte strings to 64-byte strings.
+ * The caller has already converted the endianness of the input.  This function
+ * also handles incrementing the block counter in the input matrix.
+ */
+void chacha_block(u32 *state, u8 *stream, int nrounds)
+{
+	u32 x[16];
+	int i;
+
+	memcpy(x, state, 64);
+
+	chacha_permute(x, nrounds);
+
+	for (i = 0; i < ARRAY_SIZE(x); i++)
+		put_unaligned_le32(x[i] + state[i], &stream[i * sizeof(u32)]);
+
+	state[12]++;
+}
+EXPORT_SYMBOL(chacha_block);
+
+/**
+ * hchacha_block - abbreviated ChaCha core, for XChaCha
+ * @in: input state matrix (16 32-bit words)
+ * @out: output (8 32-bit words)
+ * @nrounds: number of rounds (20 or 12; 20 is recommended)
+ *
+ * HChaCha is the ChaCha equivalent of HSalsa and is an intermediate step
+ * towards XChaCha (see https://cr.yp.to/snuffle/xsalsa-20081128.pdf).  HChaCha
+ * skips the final addition of the initial state, and outputs only certain words
+ * of the state.  It should not be used for streaming directly.
+ */
+void hchacha_block(const u32 *in, u32 *out, int nrounds)
+{
+	u32 x[16];
+
+	memcpy(x, in, 64);
+
+	chacha_permute(x, nrounds);
+
+	memcpy(&out[0], &x[0], 16);
+	memcpy(&out[4], &x[12], 16);
+}
+EXPORT_SYMBOL(hchacha_block);
diff --git a/lib/chacha20.c b/lib/chacha20.c
deleted file mode 100644
index d907fec..0000000
--- a/lib/chacha20.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * ChaCha20 256-bit cipher algorithm, RFC7539
- *
- * Copyright (C) 2015 Martin Willi
- *
- * 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.
- */
-
-#include <linux/kernel.h>
-#include <linux/export.h>
-#include <linux/bitops.h>
-#include <linux/cryptohash.h>
-#include <asm/unaligned.h>
-#include <crypto/chacha20.h>
-
-void chacha20_block(u32 *state, u8 *stream)
-{
-	u32 x[16];
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(x); i++)
-		x[i] = state[i];
-
-	for (i = 0; i < 20; i += 2) {
-		x[0]  += x[4];    x[12] = rol32(x[12] ^ x[0],  16);
-		x[1]  += x[5];    x[13] = rol32(x[13] ^ x[1],  16);
-		x[2]  += x[6];    x[14] = rol32(x[14] ^ x[2],  16);
-		x[3]  += x[7];    x[15] = rol32(x[15] ^ x[3],  16);
-
-		x[8]  += x[12];   x[4]  = rol32(x[4]  ^ x[8],  12);
-		x[9]  += x[13];   x[5]  = rol32(x[5]  ^ x[9],  12);
-		x[10] += x[14];   x[6]  = rol32(x[6]  ^ x[10], 12);
-		x[11] += x[15];   x[7]  = rol32(x[7]  ^ x[11], 12);
-
-		x[0]  += x[4];    x[12] = rol32(x[12] ^ x[0],   8);
-		x[1]  += x[5];    x[13] = rol32(x[13] ^ x[1],   8);
-		x[2]  += x[6];    x[14] = rol32(x[14] ^ x[2],   8);
-		x[3]  += x[7];    x[15] = rol32(x[15] ^ x[3],   8);
-
-		x[8]  += x[12];   x[4]  = rol32(x[4]  ^ x[8],   7);
-		x[9]  += x[13];   x[5]  = rol32(x[5]  ^ x[9],   7);
-		x[10] += x[14];   x[6]  = rol32(x[6]  ^ x[10],  7);
-		x[11] += x[15];   x[7]  = rol32(x[7]  ^ x[11],  7);
-
-		x[0]  += x[5];    x[15] = rol32(x[15] ^ x[0],  16);
-		x[1]  += x[6];    x[12] = rol32(x[12] ^ x[1],  16);
-		x[2]  += x[7];    x[13] = rol32(x[13] ^ x[2],  16);
-		x[3]  += x[4];    x[14] = rol32(x[14] ^ x[3],  16);
-
-		x[10] += x[15];   x[5]  = rol32(x[5]  ^ x[10], 12);
-		x[11] += x[12];   x[6]  = rol32(x[6]  ^ x[11], 12);
-		x[8]  += x[13];   x[7]  = rol32(x[7]  ^ x[8],  12);
-		x[9]  += x[14];   x[4]  = rol32(x[4]  ^ x[9],  12);
-
-		x[0]  += x[5];    x[15] = rol32(x[15] ^ x[0],   8);
-		x[1]  += x[6];    x[12] = rol32(x[12] ^ x[1],   8);
-		x[2]  += x[7];    x[13] = rol32(x[13] ^ x[2],   8);
-		x[3]  += x[4];    x[14] = rol32(x[14] ^ x[3],   8);
-
-		x[10] += x[15];   x[5]  = rol32(x[5]  ^ x[10],  7);
-		x[11] += x[12];   x[6]  = rol32(x[6]  ^ x[11],  7);
-		x[8]  += x[13];   x[7]  = rol32(x[7]  ^ x[8],   7);
-		x[9]  += x[14];   x[4]  = rol32(x[4]  ^ x[9],   7);
-	}
-
-	for (i = 0; i < ARRAY_SIZE(x); i++)
-		put_unaligned_le32(x[i] + state[i], &stream[i * sizeof(u32)]);
-
-	state[12]++;
-}
-EXPORT_SYMBOL(chacha20_block);
diff --git a/lib/strncpy_from_user.c b/lib/strncpy_from_user.c
index e304b54..6cb80d4 100644
--- a/lib/strncpy_from_user.c
+++ b/lib/strncpy_from_user.c
@@ -6,6 +6,7 @@
 #include <linux/uaccess.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
+#include <linux/mm.h>
 
 #include <asm/byteorder.h>
 #include <asm/word-at-a-time.h>
@@ -108,17 +109,18 @@
 		return 0;
 
 	max_addr = user_addr_max();
-	src_addr = (unsigned long)src;
+	src_addr = (unsigned long)untagged_addr(src);
 	if (likely(src_addr < max_addr)) {
 		unsigned long max = max_addr - src_addr;
 		long retval;
 
 		kasan_check_write(dst, count);
 		check_object_size(dst, count, false);
-		user_access_begin();
-		retval = do_strncpy_from_user(dst, src, count, max);
-		user_access_end();
-		return retval;
+		if (user_access_begin(VERIFY_READ, src, max)) {
+			retval = do_strncpy_from_user(dst, src, count, max);
+			user_access_end();
+			return retval;
+		}
 	}
 	return -EFAULT;
 }
diff --git a/lib/strnlen_user.c b/lib/strnlen_user.c
index 184f80f..2764187 100644
--- a/lib/strnlen_user.c
+++ b/lib/strnlen_user.c
@@ -2,6 +2,7 @@
 #include <linux/kernel.h>
 #include <linux/export.h>
 #include <linux/uaccess.h>
+#include <linux/mm.h>
 
 #include <asm/word-at-a-time.h>
 
@@ -109,15 +110,16 @@
 		return 0;
 
 	max_addr = user_addr_max();
-	src_addr = (unsigned long)str;
+	src_addr = (unsigned long)untagged_addr(str);
 	if (likely(src_addr < max_addr)) {
 		unsigned long max = max_addr - src_addr;
 		long retval;
 
-		user_access_begin();
-		retval = do_strnlen_user(str, count, max);
-		user_access_end();
-		return retval;
+		if (user_access_begin(VERIFY_READ, str, max)) {
+			retval = do_strnlen_user(str, count, max);
+			user_access_end();
+			return retval;
+		}
 	}
 	return 0;
 }
diff --git a/lib/test_kasan.c b/lib/test_kasan.c
index ec65710..7de2702 100644
--- a/lib/test_kasan.c
+++ b/lib/test_kasan.c
@@ -480,29 +480,6 @@
 	kfree(kmem);
 }
 
-static noinline void __init use_after_scope_test(void)
-{
-	volatile char *volatile p;
-
-	pr_info("use-after-scope on int\n");
-	{
-		int local = 0;
-
-		p = (char *)&local;
-	}
-	p[0] = 1;
-	p[3] = 1;
-
-	pr_info("use-after-scope on array\n");
-	{
-		char local[1024] = {0};
-
-		p = local;
-	}
-	p[0] = 1;
-	p[1023] = 1;
-}
-
 static noinline void __init kasan_alloca_oob_left(void)
 {
 	volatile int i = 10;
@@ -579,6 +556,73 @@
 	kmem_cache_destroy(cache);
 }
 
+static noinline void __init kasan_memchr(void)
+{
+	char *ptr;
+	size_t size = 24;
+
+	pr_info("out-of-bounds in memchr\n");
+	ptr = kmalloc(size, GFP_KERNEL | __GFP_ZERO);
+	if (!ptr)
+		return;
+
+	memchr(ptr, '1', size + 1);
+	kfree(ptr);
+}
+
+static noinline void __init kasan_memcmp(void)
+{
+	char *ptr;
+	size_t size = 24;
+	int arr[9];
+
+	pr_info("out-of-bounds in memcmp\n");
+	ptr = kmalloc(size, GFP_KERNEL | __GFP_ZERO);
+	if (!ptr)
+		return;
+
+	memset(arr, 0, sizeof(arr));
+	memcmp(ptr, arr, size+1);
+	kfree(ptr);
+}
+
+static noinline void __init kasan_strings(void)
+{
+	char *ptr;
+	size_t size = 24;
+
+	pr_info("use-after-free in strchr\n");
+	ptr = kmalloc(size, GFP_KERNEL | __GFP_ZERO);
+	if (!ptr)
+		return;
+
+	kfree(ptr);
+
+	/*
+	 * Try to cause only 1 invalid access (less spam in dmesg).
+	 * For that we need ptr to point to zeroed byte.
+	 * Skip metadata that could be stored in freed object so ptr
+	 * will likely point to zeroed byte.
+	 */
+	ptr += 16;
+	strchr(ptr, '1');
+
+	pr_info("use-after-free in strrchr\n");
+	strrchr(ptr, '1');
+
+	pr_info("use-after-free in strcmp\n");
+	strcmp(ptr, "2");
+
+	pr_info("use-after-free in strncmp\n");
+	strncmp(ptr, "2", 1);
+
+	pr_info("use-after-free in strlen\n");
+	strlen(ptr);
+
+	pr_info("use-after-free in strnlen\n");
+	strnlen(ptr, 1);
+}
+
 static int __init kmalloc_tests_init(void)
 {
 	/*
@@ -615,9 +659,11 @@
 	kasan_alloca_oob_right();
 	ksize_unpoisons_memory();
 	copy_user_test();
-	use_after_scope_test();
 	kmem_cache_double_free();
 	kmem_cache_invalid_free();
+	kasan_memchr();
+	kasan_memcmp();
+	kasan_strings();
 
 	kasan_restore_multi_shot(multishot);
 
diff --git a/lib/test_meminit.c b/lib/test_meminit.c
new file mode 100644
index 0000000..9729f27
--- /dev/null
+++ b/lib/test_meminit.c
@@ -0,0 +1,364 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Test cases for SL[AOU]B/page initialization at alloc/free time.
+ */
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/vmalloc.h>
+
+#define GARBAGE_INT (0x09A7BA9E)
+#define GARBAGE_BYTE (0x9E)
+
+#define REPORT_FAILURES_IN_FN() \
+	do {	\
+		if (failures)	\
+			pr_info("%s failed %d out of %d times\n",	\
+				__func__, failures, num_tests);		\
+		else		\
+			pr_info("all %d tests in %s passed\n",		\
+				num_tests, __func__);			\
+	} while (0)
+
+/* Calculate the number of uninitialized bytes in the buffer. */
+static int __init count_nonzero_bytes(void *ptr, size_t size)
+{
+	int i, ret = 0;
+	unsigned char *p = (unsigned char *)ptr;
+
+	for (i = 0; i < size; i++)
+		if (p[i])
+			ret++;
+	return ret;
+}
+
+/* Fill a buffer with garbage, skipping |skip| first bytes. */
+static void __init fill_with_garbage_skip(void *ptr, int size, size_t skip)
+{
+	unsigned int *p = (unsigned int *)((char *)ptr + skip);
+	int i = 0;
+
+	WARN_ON(skip > size);
+	size -= skip;
+
+	while (size >= sizeof(*p)) {
+		p[i] = GARBAGE_INT;
+		i++;
+		size -= sizeof(*p);
+	}
+	if (size)
+		memset(&p[i], GARBAGE_BYTE, size);
+}
+
+static void __init fill_with_garbage(void *ptr, size_t size)
+{
+	fill_with_garbage_skip(ptr, size, 0);
+}
+
+static int __init do_alloc_pages_order(int order, int *total_failures)
+{
+	struct page *page;
+	void *buf;
+	size_t size = PAGE_SIZE << order;
+
+	page = alloc_pages(GFP_KERNEL, order);
+	buf = page_address(page);
+	fill_with_garbage(buf, size);
+	__free_pages(page, order);
+
+	page = alloc_pages(GFP_KERNEL, order);
+	buf = page_address(page);
+	if (count_nonzero_bytes(buf, size))
+		(*total_failures)++;
+	fill_with_garbage(buf, size);
+	__free_pages(page, order);
+	return 1;
+}
+
+/* Test the page allocator by calling alloc_pages with different orders. */
+static int __init test_pages(int *total_failures)
+{
+	int failures = 0, num_tests = 0;
+	int i;
+
+	for (i = 0; i < 10; i++)
+		num_tests += do_alloc_pages_order(i, &failures);
+
+	REPORT_FAILURES_IN_FN();
+	*total_failures += failures;
+	return num_tests;
+}
+
+/* Test kmalloc() with given parameters. */
+static int __init do_kmalloc_size(size_t size, int *total_failures)
+{
+	void *buf;
+
+	buf = kmalloc(size, GFP_KERNEL);
+	fill_with_garbage(buf, size);
+	kfree(buf);
+
+	buf = kmalloc(size, GFP_KERNEL);
+	if (count_nonzero_bytes(buf, size))
+		(*total_failures)++;
+	fill_with_garbage(buf, size);
+	kfree(buf);
+	return 1;
+}
+
+/* Test vmalloc() with given parameters. */
+static int __init do_vmalloc_size(size_t size, int *total_failures)
+{
+	void *buf;
+
+	buf = vmalloc(size);
+	fill_with_garbage(buf, size);
+	vfree(buf);
+
+	buf = vmalloc(size);
+	if (count_nonzero_bytes(buf, size))
+		(*total_failures)++;
+	fill_with_garbage(buf, size);
+	vfree(buf);
+	return 1;
+}
+
+/* Test kmalloc()/vmalloc() by allocating objects of different sizes. */
+static int __init test_kvmalloc(int *total_failures)
+{
+	int failures = 0, num_tests = 0;
+	int i, size;
+
+	for (i = 0; i < 20; i++) {
+		size = 1 << i;
+		num_tests += do_kmalloc_size(size, &failures);
+		num_tests += do_vmalloc_size(size, &failures);
+	}
+
+	REPORT_FAILURES_IN_FN();
+	*total_failures += failures;
+	return num_tests;
+}
+
+#define CTOR_BYTES (sizeof(unsigned int))
+#define CTOR_PATTERN (0x41414141)
+/* Initialize the first 4 bytes of the object. */
+static void test_ctor(void *obj)
+{
+	*(unsigned int *)obj = CTOR_PATTERN;
+}
+
+/*
+ * Check the invariants for the buffer allocated from a slab cache.
+ * If the cache has a test constructor, the first 4 bytes of the object must
+ * always remain equal to CTOR_PATTERN.
+ * If the cache isn't an RCU-typesafe one, or if the allocation is done with
+ * __GFP_ZERO, then the object contents must be zeroed after allocation.
+ * If the cache is an RCU-typesafe one, the object contents must never be
+ * zeroed after the first use. This is checked by memcmp() in
+ * do_kmem_cache_size().
+ */
+static bool __init check_buf(void *buf, int size, bool want_ctor,
+			     bool want_rcu, bool want_zero)
+{
+	int bytes;
+	bool fail = false;
+
+	bytes = count_nonzero_bytes(buf, size);
+	WARN_ON(want_ctor && want_zero);
+	if (want_zero)
+		return bytes;
+	if (want_ctor) {
+		if (*(unsigned int *)buf != CTOR_PATTERN)
+			fail = 1;
+	} else {
+		if (bytes)
+			fail = !want_rcu;
+	}
+	return fail;
+}
+
+/*
+ * Test kmem_cache with given parameters:
+ *  want_ctor - use a constructor;
+ *  want_rcu - use SLAB_TYPESAFE_BY_RCU;
+ *  want_zero - use __GFP_ZERO.
+ */
+static int __init do_kmem_cache_size(size_t size, bool want_ctor,
+				     bool want_rcu, bool want_zero,
+				     int *total_failures)
+{
+	struct kmem_cache *c;
+	int iter;
+	bool fail = false;
+	gfp_t alloc_mask = GFP_KERNEL | (want_zero ? __GFP_ZERO : 0);
+	void *buf, *buf_copy;
+
+	c = kmem_cache_create("test_cache", size, 1,
+			      want_rcu ? SLAB_TYPESAFE_BY_RCU : 0,
+			      want_ctor ? test_ctor : NULL);
+	for (iter = 0; iter < 10; iter++) {
+		buf = kmem_cache_alloc(c, alloc_mask);
+		/* Check that buf is zeroed, if it must be. */
+		fail = check_buf(buf, size, want_ctor, want_rcu, want_zero);
+		fill_with_garbage_skip(buf, size, want_ctor ? CTOR_BYTES : 0);
+
+		if (!want_rcu) {
+			kmem_cache_free(c, buf);
+			continue;
+		}
+
+		/*
+		 * If this is an RCU cache, use a critical section to ensure we
+		 * can touch objects after they're freed.
+		 */
+		rcu_read_lock();
+		/*
+		 * Copy the buffer to check that it's not wiped on
+		 * free().
+		 */
+		buf_copy = kmalloc(size, GFP_ATOMIC);
+		if (buf_copy)
+			memcpy(buf_copy, buf, size);
+
+		kmem_cache_free(c, buf);
+		/*
+		 * Check that |buf| is intact after kmem_cache_free().
+		 * |want_zero| is false, because we wrote garbage to
+		 * the buffer already.
+		 */
+		fail |= check_buf(buf, size, want_ctor, want_rcu,
+				  false);
+		if (buf_copy) {
+			fail |= (bool)memcmp(buf, buf_copy, size);
+			kfree(buf_copy);
+		}
+		rcu_read_unlock();
+	}
+	kmem_cache_destroy(c);
+
+	*total_failures += fail;
+	return 1;
+}
+
+/*
+ * Check that the data written to an RCU-allocated object survives
+ * reallocation.
+ */
+static int __init do_kmem_cache_rcu_persistent(int size, int *total_failures)
+{
+	struct kmem_cache *c;
+	void *buf, *buf_contents, *saved_ptr;
+	void **used_objects;
+	int i, iter, maxiter = 1024;
+	bool fail = false;
+
+	c = kmem_cache_create("test_cache", size, size, SLAB_TYPESAFE_BY_RCU,
+			      NULL);
+	buf = kmem_cache_alloc(c, GFP_KERNEL);
+	saved_ptr = buf;
+	fill_with_garbage(buf, size);
+	buf_contents = kmalloc(size, GFP_KERNEL);
+	if (!buf_contents)
+		goto out;
+	used_objects = kmalloc_array(maxiter, sizeof(void *), GFP_KERNEL);
+	if (!used_objects) {
+		kfree(buf_contents);
+		goto out;
+	}
+	memcpy(buf_contents, buf, size);
+	kmem_cache_free(c, buf);
+	/*
+	 * Run for a fixed number of iterations. If we never hit saved_ptr,
+	 * assume the test passes.
+	 */
+	for (iter = 0; iter < maxiter; iter++) {
+		buf = kmem_cache_alloc(c, GFP_KERNEL);
+		used_objects[iter] = buf;
+		if (buf == saved_ptr) {
+			fail = memcmp(buf_contents, buf, size);
+			for (i = 0; i <= iter; i++)
+				kmem_cache_free(c, used_objects[i]);
+			goto free_out;
+		}
+	}
+
+free_out:
+	kmem_cache_destroy(c);
+	kfree(buf_contents);
+	kfree(used_objects);
+out:
+	*total_failures += fail;
+	return 1;
+}
+
+/*
+ * Test kmem_cache allocation by creating caches of different sizes, with and
+ * without constructors, with and without SLAB_TYPESAFE_BY_RCU.
+ */
+static int __init test_kmemcache(int *total_failures)
+{
+	int failures = 0, num_tests = 0;
+	int i, flags, size;
+	bool ctor, rcu, zero;
+
+	for (i = 0; i < 10; i++) {
+		size = 8 << i;
+		for (flags = 0; flags < 8; flags++) {
+			ctor = flags & 1;
+			rcu = flags & 2;
+			zero = flags & 4;
+			if (ctor & zero)
+				continue;
+			num_tests += do_kmem_cache_size(size, ctor, rcu, zero,
+							&failures);
+		}
+	}
+	REPORT_FAILURES_IN_FN();
+	*total_failures += failures;
+	return num_tests;
+}
+
+/* Test the behavior of SLAB_TYPESAFE_BY_RCU caches of different sizes. */
+static int __init test_rcu_persistent(int *total_failures)
+{
+	int failures = 0, num_tests = 0;
+	int i, size;
+
+	for (i = 0; i < 10; i++) {
+		size = 8 << i;
+		num_tests += do_kmem_cache_rcu_persistent(size, &failures);
+	}
+	REPORT_FAILURES_IN_FN();
+	*total_failures += failures;
+	return num_tests;
+}
+
+/*
+ * Run the tests. Each test function returns the number of executed tests and
+ * updates |failures| with the number of failed tests.
+ */
+static int __init test_meminit_init(void)
+{
+	int failures = 0, num_tests = 0;
+
+	num_tests += test_pages(&failures);
+	num_tests += test_kvmalloc(&failures);
+	num_tests += test_kmemcache(&failures);
+	num_tests += test_rcu_persistent(&failures);
+
+	if (failures == 0)
+		pr_info("all %d tests passed!\n", num_tests);
+	else
+		pr_info("failures: %d out of %d\n", failures, num_tests);
+
+	return failures ? -EINVAL : 0;
+}
+module_init(test_meminit_init);
+
+MODULE_LICENSE("GPL");
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 812e59e..630d426 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -1708,23 +1708,12 @@
 }
 early_initcall(initialize_ptr_random);
 
-/* Maps a pointer to a 32 bit unique identifier. */
-static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec)
+static inline int __ptr_to_hashval(const void *ptr, unsigned long *hashval_out)
 {
-	const char *str = sizeof(ptr) == 8 ? "(____ptrval____)" : "(ptrval)";
 	unsigned long hashval;
 
-	/* When debugging early boot use non-cryptographically secure hash. */
-	if (unlikely(debug_boot_weak_hash)) {
-		hashval = hash_long((unsigned long)ptr, 32);
-		return pointer_string(buf, end, (const void *)hashval, spec);
-	}
-
-	if (static_branch_unlikely(&not_filled_random_ptr_key)) {
-		spec.field_width = 2 * sizeof(ptr);
-		/* string length must be less than default_width */
-		return string(buf, end, str, spec);
-	}
+	if (static_branch_unlikely(&not_filled_random_ptr_key))
+		return -EAGAIN;
 
 #ifdef CONFIG_64BIT
 	hashval = (unsigned long)siphash_1u64((u64)ptr, &ptr_key);
@@ -1736,6 +1725,35 @@
 #else
 	hashval = (unsigned long)siphash_1u32((u32)ptr, &ptr_key);
 #endif
+	*hashval_out = hashval;
+	return 0;
+}
+
+int ptr_to_hashval(const void *ptr, unsigned long *hashval_out)
+{
+	return __ptr_to_hashval(ptr, hashval_out);
+}
+
+/* Maps a pointer to a 32 bit unique identifier. */
+static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec)
+{
+	const char *str = sizeof(ptr) == 8 ? "(____ptrval____)" : "(ptrval)";
+	unsigned long hashval;
+	int ret;
+
+	/* When debugging early boot use non-cryptographically secure hash. */
+	if (unlikely(debug_boot_weak_hash)) {
+		hashval = hash_long((unsigned long)ptr, 32);
+		return pointer_string(buf, end, (const void *)hashval, spec);
+	}
+
+	ret = __ptr_to_hashval(ptr, &hashval);
+	if (ret) {
+		spec.field_width = 2 * sizeof(ptr);
+		/* string length must be less than default_width */
+		return string(buf, end, str, spec);
+	}
+
 	return pointer_string(buf, end, (const void *)hashval, spec);
 }
 
diff --git a/mm/cma.c b/mm/cma.c
index 4c28642..23a7d2c 100644
--- a/mm/cma.c
+++ b/mm/cma.c
@@ -427,6 +427,7 @@
 	unsigned long pfn = -1;
 	unsigned long start = 0;
 	unsigned long bitmap_maxno, bitmap_no, bitmap_count;
+	size_t i;
 	struct page *page = NULL;
 	int ret = -ENOMEM;
 
@@ -486,6 +487,16 @@
 
 	trace_cma_alloc(pfn, page, count, align);
 
+	/*
+	 * CMA can allocate multiple page blocks, which results in different
+	 * blocks being marked with different tags. Reset the tags to ignore
+	 * those page blocks.
+	 */
+	if (page) {
+		for (i = 0; i < count; i++)
+			page_kasan_tag_reset(page + i);
+	}
+
 	if (ret && !no_warn) {
 		pr_err("%s: alloc failed, req-size: %zu pages, ret: %d\n",
 			__func__, count, ret);
diff --git a/mm/compaction.c b/mm/compaction.c
index 5079ddb..120e555 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -22,6 +22,7 @@
 #include <linux/kthread.h>
 #include <linux/freezer.h>
 #include <linux/page_owner.h>
+#include <linux/psi.h>
 #include "internal.h"
 
 #ifdef CONFIG_COMPACTION
@@ -2059,11 +2060,15 @@
 	pgdat->kcompactd_classzone_idx = pgdat->nr_zones - 1;
 
 	while (!kthread_should_stop()) {
+		unsigned long pflags;
+
 		trace_mm_compaction_kcompactd_sleep(pgdat->node_id);
 		wait_event_freezable(pgdat->kcompactd_wait,
 				kcompactd_work_requested(pgdat));
 
+		psi_memstall_enter(&pflags);
 		kcompactd_do_work(pgdat);
+		psi_memstall_leave(&pflags);
 	}
 
 	return 0;
diff --git a/mm/dmapool.c b/mm/dmapool.c
index 6d4b97e..d46b14e 100644
--- a/mm/dmapool.c
+++ b/mm/dmapool.c
@@ -379,7 +379,7 @@
 #endif
 	spin_unlock_irqrestore(&pool->lock, flags);
 
-	if (mem_flags & __GFP_ZERO)
+	if (want_init_on_alloc(mem_flags))
 		memset(retval, 0, pool->size);
 
 	return retval;
@@ -429,6 +429,8 @@
 	}
 
 	offset = vaddr - page->vaddr;
+	if (want_init_on_free())
+		memset(vaddr, 0, pool->size);
 #ifdef	DMAPOOL_DEBUG
 	if ((dma - page->dma) != offset) {
 		spin_unlock_irqrestore(&pool->lock, flags);
diff --git a/mm/filemap.c b/mm/filemap.c
index 45f1c6d..b464f95 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -36,6 +36,8 @@
 #include <linux/cleancache.h>
 #include <linux/shmem_fs.h>
 #include <linux/rmap.h>
+#include <linux/delayacct.h>
+#include <linux/psi.h>
 #include "internal.h"
 
 #define CREATE_TRACE_POINTS
@@ -938,12 +940,9 @@
 		 * data from the working set, only to cache data that will
 		 * get overwritten with something else, is a waste of memory.
 		 */
-		if (!(gfp_mask & __GFP_WRITE) &&
-		    shadow && workingset_refault(shadow)) {
-			SetPageActive(page);
-			workingset_activation(page);
-		} else
-			ClearPageActive(page);
+		WARN_ON_ONCE(PageActive(page));
+		if (!(gfp_mask & __GFP_WRITE) && shadow)
+			workingset_refault(page, shadow);
 		lru_cache_add(page);
 	}
 	return ret;
@@ -1099,8 +1098,18 @@
 {
 	struct wait_page_queue wait_page;
 	wait_queue_entry_t *wait = &wait_page.wait;
+	bool thrashing = false;
+	unsigned long pflags;
 	int ret = 0;
 
+	if (bit_nr == PG_locked &&
+	    !PageUptodate(page) && PageWorkingset(page)) {
+		if (!PageSwapBacked(page))
+			delayacct_thrashing_start();
+		psi_memstall_enter(&pflags);
+		thrashing = true;
+	}
+
 	init_wait(wait);
 	wait->flags = lock ? WQ_FLAG_EXCLUSIVE : 0;
 	wait->func = wake_page_function;
@@ -1139,6 +1148,12 @@
 
 	finish_wait(q, wait);
 
+	if (thrashing) {
+		if (!PageSwapBacked(page))
+			delayacct_thrashing_end();
+		psi_memstall_leave(&pflags);
+	}
+
 	/*
 	 * A signal could leave PageWaiters set. Clearing it here if
 	 * !waitqueue_active would be possible (by open-coding finish_wait),
@@ -1548,7 +1563,10 @@
  * - FGP_CREAT: If page is not present then a new page is allocated using
  *   @gfp_mask and added to the page cache and the VM's LRU
  *   list. The page is returned locked and with an increased
- *   refcount. Otherwise, NULL is returned.
+ *   refcount.
+ * - FGP_FOR_MMAP: Similar to FGP_CREAT, only we want to allow the caller to do
+ *   its own locking dance if the page is already in cache, or unlock the page
+ *   before returning if we had to add the page to pagecache.
  *
  * If FGP_LOCK or FGP_CREAT are specified then the function may sleep even
  * if the GFP flags specified for FGP_CREAT are atomic.
@@ -1601,7 +1619,7 @@
 		if (!page)
 			return NULL;
 
-		if (WARN_ON_ONCE(!(fgp_flags & FGP_LOCK)))
+		if (WARN_ON_ONCE(!(fgp_flags & (FGP_LOCK | FGP_FOR_MMAP))))
 			fgp_flags |= FGP_LOCK;
 
 		/* Init accessed so avoid atomic mark_page_accessed later */
@@ -1615,6 +1633,13 @@
 			if (err == -EEXIST)
 				goto repeat;
 		}
+
+		/*
+		 * add_to_page_cache_lru locks the page, and for mmap we expect
+		 * an unlocked page.
+		 */
+		if (page && (fgp_flags & FGP_FOR_MMAP))
+			unlock_page(page);
 	}
 
 	return page;
@@ -2389,62 +2414,98 @@
 EXPORT_SYMBOL(generic_file_read_iter);
 
 #ifdef CONFIG_MMU
-/**
- * page_cache_read - adds requested page to the page cache if not already there
- * @file:	file to read
- * @offset:	page index
- * @gfp_mask:	memory allocation flags
- *
- * This adds the requested page to the page cache if it isn't already there,
- * and schedules an I/O to read in its contents from disk.
- */
-static int page_cache_read(struct file *file, pgoff_t offset, gfp_t gfp_mask)
+#define MMAP_LOTSAMISS  (100)
+static struct file *maybe_unlock_mmap_for_io(struct vm_fault *vmf,
+					     struct file *fpin)
 {
-	struct address_space *mapping = file->f_mapping;
-	struct page *page;
-	int ret;
+	int flags = vmf->flags;
 
-	do {
-		page = __page_cache_alloc(gfp_mask);
-		if (!page)
-			return -ENOMEM;
+	if (fpin)
+		return fpin;
 
-		ret = add_to_page_cache_lru(page, mapping, offset, gfp_mask);
-		if (ret == 0)
-			ret = mapping->a_ops->readpage(file, page);
-		else if (ret == -EEXIST)
-			ret = 0; /* losing race to add is OK */
-
-		put_page(page);
-
-	} while (ret == AOP_TRUNCATED_PAGE);
-
-	return ret;
+	/*
+	 * FAULT_FLAG_RETRY_NOWAIT means we don't want to wait on page locks or
+	 * anything, so we only pin the file and drop the mmap_sem if only
+	 * FAULT_FLAG_ALLOW_RETRY is set.
+	 */
+	if ((flags & (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_RETRY_NOWAIT)) ==
+	    FAULT_FLAG_ALLOW_RETRY) {
+		fpin = get_file(vmf->vma->vm_file);
+		up_read(&vmf->vma->vm_mm->mmap_sem);
+	}
+	return fpin;
 }
 
-#define MMAP_LOTSAMISS  (100)
+/*
+ * lock_page_maybe_drop_mmap - lock the page, possibly dropping the mmap_sem
+ * @vmf - the vm_fault for this fault.
+ * @page - the page to lock.
+ * @fpin - the pointer to the file we may pin (or is already pinned).
+ *
+ * This works similar to lock_page_or_retry in that it can drop the mmap_sem.
+ * It differs in that it actually returns the page locked if it returns 1 and 0
+ * if it couldn't lock the page.  If we did have to drop the mmap_sem then fpin
+ * will point to the pinned file and needs to be fput()'ed at a later point.
+ */
+static int lock_page_maybe_drop_mmap(struct vm_fault *vmf, struct page *page,
+				     struct file **fpin)
+{
+	if (trylock_page(page))
+		return 1;
+
+	/*
+	 * NOTE! This will make us return with VM_FAULT_RETRY, but with
+	 * the mmap_sem still held. That's how FAULT_FLAG_RETRY_NOWAIT
+	 * is supposed to work. We have way too many special cases..
+	 */
+	if (vmf->flags & FAULT_FLAG_RETRY_NOWAIT)
+		return 0;
+
+	*fpin = maybe_unlock_mmap_for_io(vmf, *fpin);
+	if (vmf->flags & FAULT_FLAG_KILLABLE) {
+		if (__lock_page_killable(page)) {
+			/*
+			 * We didn't have the right flags to drop the mmap_sem,
+			 * but all fault_handlers only check for fatal signals
+			 * if we return VM_FAULT_RETRY, so we need to drop the
+			 * mmap_sem here and return 0 if we don't have a fpin.
+			 */
+			if (*fpin == NULL)
+				up_read(&vmf->vma->vm_mm->mmap_sem);
+			return 0;
+		}
+	} else
+		__lock_page(page);
+	return 1;
+}
+
 
 /*
- * Synchronous readahead happens when we don't even find
- * a page in the page cache at all.
+ * Synchronous readahead happens when we don't even find a page in the page
+ * cache at all.  We don't want to perform IO under the mmap sem, so if we have
+ * to drop the mmap sem we return the file that was pinned in order for us to do
+ * that.  If we didn't pin a file then we return NULL.  The file that is
+ * returned needs to be fput()'ed when we're done with it.
  */
-static void do_sync_mmap_readahead(struct vm_area_struct *vma,
-				   struct file_ra_state *ra,
-				   struct file *file,
-				   pgoff_t offset)
+static struct file *do_sync_mmap_readahead(struct vm_fault *vmf)
 {
+	struct file *file = vmf->vma->vm_file;
+	struct file_ra_state *ra = &file->f_ra;
 	struct address_space *mapping = file->f_mapping;
+	struct file *fpin = NULL;
+	pgoff_t offset = vmf->pgoff;
 
 	/* If we don't want any read-ahead, don't bother */
-	if (vma->vm_flags & VM_RAND_READ)
-		return;
+	if (vmf->vma->vm_flags & VM_RAND_READ)
+		return fpin;
 	if (!ra->ra_pages)
-		return;
+		return fpin;
 
-	if (vma->vm_flags & VM_SEQ_READ) {
+	if (vmf->vma->vm_flags & VM_SEQ_READ) {
+		fpin = maybe_unlock_mmap_for_io(vmf, fpin);
 		page_cache_sync_readahead(mapping, ra, file, offset,
 					  ra->ra_pages);
-		return;
+		return fpin;
 	}
 
 	/* Avoid banging the cache line if not needed */
@@ -2456,37 +2517,44 @@
 	 * stop bothering with read-ahead. It will only hurt.
 	 */
 	if (ra->mmap_miss > MMAP_LOTSAMISS)
-		return;
+		return fpin;
 
 	/*
 	 * mmap read-around
 	 */
+	fpin = maybe_unlock_mmap_for_io(vmf, fpin);
 	ra->start = max_t(long, 0, offset - ra->ra_pages / 2);
 	ra->size = ra->ra_pages;
 	ra->async_size = ra->ra_pages / 4;
 	ra_submit(ra, mapping, file);
+	return fpin;
 }
 
 /*
  * Asynchronous readahead happens when we find the page and PG_readahead,
- * so we want to possibly extend the readahead further..
+ * so we want to possibly extend the readahead further.  We return the file that
+ * was pinned if we have to drop the mmap_sem in order to do IO.
  */
-static void do_async_mmap_readahead(struct vm_area_struct *vma,
-				    struct file_ra_state *ra,
-				    struct file *file,
-				    struct page *page,
-				    pgoff_t offset)
+static struct file *do_async_mmap_readahead(struct vm_fault *vmf,
+					    struct page *page)
 {
+	struct file *file = vmf->vma->vm_file;
+	struct file_ra_state *ra = &file->f_ra;
 	struct address_space *mapping = file->f_mapping;
+	struct file *fpin = NULL;
+	pgoff_t offset = vmf->pgoff;
 
 	/* If we don't want any read-ahead, don't bother */
-	if (vma->vm_flags & VM_RAND_READ)
-		return;
+	if (vmf->vma->vm_flags & VM_RAND_READ)
+		return fpin;
 	if (ra->mmap_miss > 0)
 		ra->mmap_miss--;
-	if (PageReadahead(page))
+	if (PageReadahead(page)) {
+		fpin = maybe_unlock_mmap_for_io(vmf, fpin);
 		page_cache_async_readahead(mapping, ra, file,
 					   page, offset, ra->ra_pages);
+	}
+	return fpin;
 }
 
 /**
@@ -2516,6 +2584,7 @@
 {
 	int error;
 	struct file *file = vmf->vma->vm_file;
+	struct file *fpin = NULL;
 	struct address_space *mapping = file->f_mapping;
 	struct file_ra_state *ra = &file->f_ra;
 	struct inode *inode = mapping->host;
@@ -2537,23 +2606,26 @@
 		 * We found the page, so try async readahead before
 		 * waiting for the lock.
 		 */
-		do_async_mmap_readahead(vmf->vma, ra, file, page, offset);
+		fpin = do_async_mmap_readahead(vmf, page);
 	} else if (!page) {
 		/* No page in the page cache at all */
-		do_sync_mmap_readahead(vmf->vma, ra, file, offset);
 		count_vm_event(PGMAJFAULT);
 		count_memcg_event_mm(vmf->vma->vm_mm, PGMAJFAULT);
 		ret = VM_FAULT_MAJOR;
+		fpin = do_sync_mmap_readahead(vmf);
 retry_find:
-		page = find_get_page(mapping, offset);
-		if (!page)
-			goto no_cached_page;
+		page = pagecache_get_page(mapping, offset,
+					  FGP_CREAT|FGP_FOR_MMAP,
+					  vmf->gfp_mask);
+		if (!page) {
+			if (fpin)
+				goto out_retry;
+			return VM_FAULT_OOM;
+		}
 	}
 
-	if (!lock_page_or_retry(page, vmf->vma->vm_mm, vmf->flags)) {
-		put_page(page);
-		return ret | VM_FAULT_RETRY;
-	}
+	if (!lock_page_maybe_drop_mmap(vmf, page, &fpin))
+		goto out_retry;
 
 	/* Did it get truncated? */
 	if (unlikely(page->mapping != mapping)) {
@@ -2571,6 +2643,16 @@
 		goto page_not_uptodate;
 
 	/*
+	 * We've made it this far and we had to drop our mmap_sem, now is the
+	 * time to return to the upper layer and have it re-find the vma and
+	 * redo the fault.
+	 */
+	if (fpin) {
+		unlock_page(page);
+		goto out_retry;
+	}
+
+	/*
 	 * Found the page and have a reference on it.
 	 * We must recheck i_size under page lock.
 	 */
@@ -2584,30 +2666,6 @@
 	vmf->page = page;
 	return ret | VM_FAULT_LOCKED;
 
-no_cached_page:
-	/*
-	 * We're only likely to ever get here if MADV_RANDOM is in
-	 * effect.
-	 */
-	error = page_cache_read(file, offset, vmf->gfp_mask);
-
-	/*
-	 * The page we want has now been added to the page cache.
-	 * In the unlikely event that someone removed it in the
-	 * meantime, we'll just come back here and read it again.
-	 */
-	if (error >= 0)
-		goto retry_find;
-
-	/*
-	 * An error return from page_cache_read can result if the
-	 * system is low on memory, or a problem occurs while trying
-	 * to schedule I/O.
-	 */
-	if (error == -ENOMEM)
-		return VM_FAULT_OOM;
-	return VM_FAULT_SIGBUS;
-
 page_not_uptodate:
 	/*
 	 * Umm, take care of errors if the page isn't up-to-date.
@@ -2616,12 +2674,15 @@
 	 * and we need to check for errors.
 	 */
 	ClearPageError(page);
+	fpin = maybe_unlock_mmap_for_io(vmf, fpin);
 	error = mapping->a_ops->readpage(file, page);
 	if (!error) {
 		wait_on_page_locked(page);
 		if (!PageUptodate(page))
 			error = -EIO;
 	}
+	if (fpin)
+		goto out_retry;
 	put_page(page);
 
 	if (!error || error == AOP_TRUNCATED_PAGE)
@@ -2630,6 +2691,18 @@
 	/* Things didn't work out. Return zero to tell the mm layer so. */
 	shrink_readahead_size_eio(file, ra);
 	return VM_FAULT_SIGBUS;
+
+out_retry:
+	/*
+	 * We dropped the mmap_sem, we need to return to the fault handler to
+	 * re-find the vma and come back and find our hopefully still populated
+	 * page.
+	 */
+	if (page)
+		put_page(page);
+	if (fpin)
+		fput(fpin);
+	return ret | VM_FAULT_RETRY;
 }
 EXPORT_SYMBOL(filemap_fault);
 
@@ -2825,7 +2898,11 @@
 		}
 
 filler:
-		err = filler(data, page);
+		if (filler)
+			err = filler(data, page);
+		else
+			err = mapping->a_ops->readpage(data, page);
+
 		if (err < 0) {
 			put_page(page);
 			return ERR_PTR(err);
@@ -2932,9 +3009,7 @@
 				pgoff_t index,
 				gfp_t gfp)
 {
-	filler_t *filler = (filler_t *)mapping->a_ops->readpage;
-
-	return do_read_cache_page(mapping, index, filler, NULL, gfp);
+	return do_read_cache_page(mapping, index, NULL, NULL, gfp);
 }
 EXPORT_SYMBOL(read_cache_page_gfp);
 
@@ -2952,6 +3027,9 @@
 	unsigned long limit = rlimit(RLIMIT_FSIZE);
 	loff_t pos;
 
+	if (IS_SWAPFILE(inode))
+		return -ETXTBSY;
+
 	if (!iov_iter_count(from))
 		return 0;
 
diff --git a/mm/frame_vector.c b/mm/frame_vector.c
index c64dca6..c431ca8 100644
--- a/mm/frame_vector.c
+++ b/mm/frame_vector.c
@@ -46,6 +46,8 @@
 	if (WARN_ON_ONCE(nr_frames > vec->nr_allocated))
 		nr_frames = vec->nr_allocated;
 
+	start = untagged_addr(start);
+
 	down_read(&mm->mmap_sem);
 	locked = 1;
 	vma = find_vma_intersection(mm, start, start + 1);
diff --git a/mm/gup.c b/mm/gup.c
index f3088d2..91c2caa 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -678,6 +678,8 @@
 	if (!nr_pages)
 		return 0;
 
+	start = untagged_addr(start);
+
 	VM_BUG_ON(!!pages != !!(gup_flags & FOLL_GET));
 
 	/*
@@ -832,6 +834,8 @@
 	struct vm_area_struct *vma;
 	vm_fault_t ret, major = 0;
 
+	address = untagged_addr(address);
+
 	if (unlocked)
 		fault_flags |= FAULT_FLAG_ALLOW_RETRY;
 
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 5a1771b..594cc65 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2422,6 +2422,7 @@
 			 (1L << PG_mlocked) |
 			 (1L << PG_uptodate) |
 			 (1L << PG_active) |
+			 (1L << PG_workingset) |
 			 (1L << PG_locked) |
 			 (1L << PG_unevictable) |
 			 (1L << PG_dirty)));
diff --git a/mm/kasan/Makefile b/mm/kasan/Makefile
index 3289db3..613dfe6 100644
--- a/mm/kasan/Makefile
+++ b/mm/kasan/Makefile
@@ -1,11 +1,24 @@
 # SPDX-License-Identifier: GPL-2.0
 KASAN_SANITIZE := n
-UBSAN_SANITIZE_kasan.o := n
+UBSAN_SANITIZE_common.o := n
+UBSAN_SANITIZE_generic.o := n
+UBSAN_SANITIZE_generic_report.o := n
+UBSAN_SANITIZE_tags.o := n
 KCOV_INSTRUMENT := n
 
-CFLAGS_REMOVE_kasan.o = -pg
+CFLAGS_REMOVE_common.o = -pg
+CFLAGS_REMOVE_generic.o = -pg
+CFLAGS_REMOVE_generic_report.o = -pg
+CFLAGS_REMOVE_tags.o = -pg
+
 # Function splitter causes unnecessary splits in __asan_load1/__asan_store1
 # see: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63533
-CFLAGS_kasan.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
 
-obj-y := kasan.o report.o kasan_init.o quarantine.o
+CFLAGS_common.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
+CFLAGS_generic.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
+CFLAGS_generic_report.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
+CFLAGS_tags.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
+
+obj-$(CONFIG_KASAN) := common.o init.o report.o
+obj-$(CONFIG_KASAN_GENERIC) += generic.o generic_report.o quarantine.o
+obj-$(CONFIG_KASAN_SW_TAGS) += tags.o tags_report.o
diff --git a/mm/kasan/common.c b/mm/kasan/common.c
new file mode 100644
index 0000000..ef1b30a
--- /dev/null
+++ b/mm/kasan/common.c
@@ -0,0 +1,741 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This file contains common generic and tag-based KASAN code.
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Author: Andrey Ryabinin <ryabinin.a.a@gmail.com>
+ *
+ * Some code borrowed from https://github.com/xairy/kasan-prototype by
+ *        Andrey Konovalov <andreyknvl@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#define __KASAN_INTERNAL
+
+#include <linux/export.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/kasan.h>
+#include <linux/kernel.h>
+#include <linux/kmemleak.h>
+#include <linux/linkage.h>
+#include <linux/memblock.h>
+#include <linux/memory.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/printk.h>
+#include <linux/sched.h>
+#include <linux/sched/task_stack.h>
+#include <linux/slab.h>
+#include <linux/stacktrace.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/vmalloc.h>
+#include <linux/bug.h>
+#include <linux/uaccess.h>
+
+#include "kasan.h"
+#include "../slab.h"
+
+static inline int in_irqentry_text(unsigned long ptr)
+{
+	return (ptr >= (unsigned long)&__irqentry_text_start &&
+		ptr < (unsigned long)&__irqentry_text_end) ||
+		(ptr >= (unsigned long)&__softirqentry_text_start &&
+		 ptr < (unsigned long)&__softirqentry_text_end);
+}
+
+static inline void filter_irq_stacks(struct stack_trace *trace)
+{
+	int i;
+
+	if (!trace->nr_entries)
+		return;
+	for (i = 0; i < trace->nr_entries; i++)
+		if (in_irqentry_text(trace->entries[i])) {
+			/* Include the irqentry function into the stack. */
+			trace->nr_entries = i + 1;
+			break;
+		}
+}
+
+static inline depot_stack_handle_t save_stack(gfp_t flags)
+{
+	unsigned long entries[KASAN_STACK_DEPTH];
+	struct stack_trace trace = {
+		.nr_entries = 0,
+		.entries = entries,
+		.max_entries = KASAN_STACK_DEPTH,
+		.skip = 0
+	};
+
+	save_stack_trace(&trace);
+	filter_irq_stacks(&trace);
+	if (trace.nr_entries != 0 &&
+	    trace.entries[trace.nr_entries-1] == ULONG_MAX)
+		trace.nr_entries--;
+
+	return depot_save_stack(&trace, flags);
+}
+
+static inline void set_track(struct kasan_track *track, gfp_t flags)
+{
+	track->pid = current->pid;
+	track->stack = save_stack(flags);
+}
+
+void kasan_enable_current(void)
+{
+	current->kasan_depth++;
+}
+
+void kasan_disable_current(void)
+{
+	current->kasan_depth--;
+}
+
+void kasan_check_read(const volatile void *p, unsigned int size)
+{
+	check_memory_region((unsigned long)p, size, false, _RET_IP_);
+}
+EXPORT_SYMBOL(kasan_check_read);
+
+void kasan_check_write(const volatile void *p, unsigned int size)
+{
+	check_memory_region((unsigned long)p, size, true, _RET_IP_);
+}
+EXPORT_SYMBOL(kasan_check_write);
+
+#undef memset
+void *memset(void *addr, int c, size_t len)
+{
+	check_memory_region((unsigned long)addr, len, true, _RET_IP_);
+
+	return __memset(addr, c, len);
+}
+
+#undef memmove
+void *memmove(void *dest, const void *src, size_t len)
+{
+	check_memory_region((unsigned long)src, len, false, _RET_IP_);
+	check_memory_region((unsigned long)dest, len, true, _RET_IP_);
+
+	return __memmove(dest, src, len);
+}
+
+#undef memcpy
+void *memcpy(void *dest, const void *src, size_t len)
+{
+	check_memory_region((unsigned long)src, len, false, _RET_IP_);
+	check_memory_region((unsigned long)dest, len, true, _RET_IP_);
+
+	return __memcpy(dest, src, len);
+}
+
+/*
+ * Poisons the shadow memory for 'size' bytes starting from 'addr'.
+ * Memory addresses should be aligned to KASAN_SHADOW_SCALE_SIZE.
+ */
+void kasan_poison_shadow(const void *address, size_t size, u8 value)
+{
+	void *shadow_start, *shadow_end;
+
+	/*
+	 * Perform shadow offset calculation based on untagged address, as
+	 * some of the callers (e.g. kasan_poison_object_data) pass tagged
+	 * addresses to this function.
+	 */
+	address = reset_tag(address);
+
+	shadow_start = kasan_mem_to_shadow(address);
+	shadow_end = kasan_mem_to_shadow(address + size);
+
+	__memset(shadow_start, value, shadow_end - shadow_start);
+}
+
+void kasan_unpoison_shadow(const void *address, size_t size)
+{
+	u8 tag = get_tag(address);
+
+	/*
+	 * Perform shadow offset calculation based on untagged address, as
+	 * some of the callers (e.g. kasan_unpoison_object_data) pass tagged
+	 * addresses to this function.
+	 */
+	address = reset_tag(address);
+
+	kasan_poison_shadow(address, size, tag);
+
+	if (size & KASAN_SHADOW_MASK) {
+		u8 *shadow = (u8 *)kasan_mem_to_shadow(address + size);
+
+		if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
+			*shadow = tag;
+		else
+			*shadow = size & KASAN_SHADOW_MASK;
+	}
+}
+
+static void __kasan_unpoison_stack(struct task_struct *task, const void *sp)
+{
+	void *base = task_stack_page(task);
+	size_t size = sp - base;
+
+	kasan_unpoison_shadow(base, size);
+}
+
+/* Unpoison the entire stack for a task. */
+void kasan_unpoison_task_stack(struct task_struct *task)
+{
+	__kasan_unpoison_stack(task, task_stack_page(task) + THREAD_SIZE);
+}
+
+/* Unpoison the stack for the current task beyond a watermark sp value. */
+asmlinkage void kasan_unpoison_task_stack_below(const void *watermark)
+{
+	/*
+	 * Calculate the task stack base address.  Avoid using 'current'
+	 * because this function is called by early resume code which hasn't
+	 * yet set up the percpu register (%gs).
+	 */
+	void *base = (void *)((unsigned long)watermark & ~(THREAD_SIZE - 1));
+
+	kasan_unpoison_shadow(base, watermark - base);
+}
+
+/*
+ * Clear all poison for the region between the current SP and a provided
+ * watermark value, as is sometimes required prior to hand-crafted asm function
+ * returns in the middle of functions.
+ */
+void kasan_unpoison_stack_above_sp_to(const void *watermark)
+{
+	const void *sp = __builtin_frame_address(0);
+	size_t size = watermark - sp;
+
+	if (WARN_ON(sp > watermark))
+		return;
+	kasan_unpoison_shadow(sp, size);
+}
+
+void kasan_alloc_pages(struct page *page, unsigned int order)
+{
+	u8 tag;
+	unsigned long i;
+
+	if (unlikely(PageHighMem(page)))
+		return;
+
+	tag = random_tag();
+	for (i = 0; i < (1 << order); i++)
+		page_kasan_tag_set(page + i, tag);
+	kasan_unpoison_shadow(page_address(page), PAGE_SIZE << order);
+}
+
+void kasan_free_pages(struct page *page, unsigned int order)
+{
+	if (likely(!PageHighMem(page)))
+		kasan_poison_shadow(page_address(page),
+				PAGE_SIZE << order,
+				KASAN_FREE_PAGE);
+}
+
+/*
+ * Adaptive redzone policy taken from the userspace AddressSanitizer runtime.
+ * For larger allocations larger redzones are used.
+ */
+static inline unsigned int optimal_redzone(unsigned int object_size)
+{
+	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
+		return 0;
+
+	return
+		object_size <= 64        - 16   ? 16 :
+		object_size <= 128       - 32   ? 32 :
+		object_size <= 512       - 64   ? 64 :
+		object_size <= 4096      - 128  ? 128 :
+		object_size <= (1 << 14) - 256  ? 256 :
+		object_size <= (1 << 15) - 512  ? 512 :
+		object_size <= (1 << 16) - 1024 ? 1024 : 2048;
+}
+
+void kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
+			slab_flags_t *flags)
+{
+	unsigned int orig_size = *size;
+	unsigned int redzone_size;
+	int redzone_adjust;
+
+	/* Add alloc meta. */
+	cache->kasan_info.alloc_meta_offset = *size;
+	*size += sizeof(struct kasan_alloc_meta);
+
+	/* Add free meta. */
+	if (IS_ENABLED(CONFIG_KASAN_GENERIC) &&
+	    (cache->flags & SLAB_TYPESAFE_BY_RCU || cache->ctor ||
+	     cache->object_size < sizeof(struct kasan_free_meta))) {
+		cache->kasan_info.free_meta_offset = *size;
+		*size += sizeof(struct kasan_free_meta);
+	}
+
+	redzone_size = optimal_redzone(cache->object_size);
+	redzone_adjust = redzone_size -	(*size - cache->object_size);
+	if (redzone_adjust > 0)
+		*size += redzone_adjust;
+
+	*size = min_t(unsigned int, KMALLOC_MAX_SIZE,
+			max(*size, cache->object_size + redzone_size));
+
+	/*
+	 * If the metadata doesn't fit, don't enable KASAN at all.
+	 */
+	if (*size <= cache->kasan_info.alloc_meta_offset ||
+			*size <= cache->kasan_info.free_meta_offset) {
+		cache->kasan_info.alloc_meta_offset = 0;
+		cache->kasan_info.free_meta_offset = 0;
+		*size = orig_size;
+		return;
+	}
+
+	*flags |= SLAB_KASAN;
+}
+
+size_t kasan_metadata_size(struct kmem_cache *cache)
+{
+	return (cache->kasan_info.alloc_meta_offset ?
+		sizeof(struct kasan_alloc_meta) : 0) +
+		(cache->kasan_info.free_meta_offset ?
+		sizeof(struct kasan_free_meta) : 0);
+}
+
+struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache,
+					const void *object)
+{
+	BUILD_BUG_ON(sizeof(struct kasan_alloc_meta) > 32);
+	return (void *)object + cache->kasan_info.alloc_meta_offset;
+}
+
+struct kasan_free_meta *get_free_info(struct kmem_cache *cache,
+				      const void *object)
+{
+	BUILD_BUG_ON(sizeof(struct kasan_free_meta) > 32);
+	return (void *)object + cache->kasan_info.free_meta_offset;
+}
+
+void kasan_poison_slab(struct page *page)
+{
+	unsigned long i;
+
+	for (i = 0; i < (1 << compound_order(page)); i++)
+		page_kasan_tag_reset(page + i);
+	kasan_poison_shadow(page_address(page),
+			PAGE_SIZE << compound_order(page),
+			KASAN_KMALLOC_REDZONE);
+}
+
+void kasan_unpoison_object_data(struct kmem_cache *cache, void *object)
+{
+	kasan_unpoison_shadow(object, cache->object_size);
+}
+
+void kasan_poison_object_data(struct kmem_cache *cache, void *object)
+{
+	kasan_poison_shadow(object,
+			round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE),
+			KASAN_KMALLOC_REDZONE);
+}
+
+/*
+ * This function assigns a tag to an object considering the following:
+ * 1. A cache might have a constructor, which might save a pointer to a slab
+ *    object somewhere (e.g. in the object itself). We preassign a tag for
+ *    each object in caches with constructors during slab creation and reuse
+ *    the same tag each time a particular object is allocated.
+ * 2. A cache might be SLAB_TYPESAFE_BY_RCU, which means objects can be
+ *    accessed after being freed. We preassign tags for objects in these
+ *    caches as well.
+ * 3. For SLAB allocator we can't preassign tags randomly since the freelist
+ *    is stored as an array of indexes instead of a linked list. Assign tags
+ *    based on objects indexes, so that objects that are next to each other
+ *    get different tags.
+ */
+static u8 assign_tag(struct kmem_cache *cache, const void *object,
+			bool init, bool keep_tag)
+{
+	/*
+	 * 1. When an object is kmalloc()'ed, two hooks are called:
+	 *    kasan_slab_alloc() and kasan_kmalloc(). We assign the
+	 *    tag only in the first one.
+	 * 2. We reuse the same tag for krealloc'ed objects.
+	 */
+	if (keep_tag)
+		return get_tag(object);
+
+	/*
+	 * If the cache neither has a constructor nor has SLAB_TYPESAFE_BY_RCU
+	 * set, assign a tag when the object is being allocated (init == false).
+	 */
+	if (!cache->ctor && !(cache->flags & SLAB_TYPESAFE_BY_RCU))
+		return init ? KASAN_TAG_KERNEL : random_tag();
+
+	/* For caches that either have a constructor or SLAB_TYPESAFE_BY_RCU: */
+#ifdef CONFIG_SLAB
+	/* For SLAB assign tags based on the object index in the freelist. */
+	return (u8)obj_to_index(cache, virt_to_page(object), (void *)object);
+#else
+	/*
+	 * For SLUB assign a random tag during slab creation, otherwise reuse
+	 * the already assigned tag.
+	 */
+	return init ? random_tag() : get_tag(object);
+#endif
+}
+
+void * __must_check kasan_init_slab_obj(struct kmem_cache *cache,
+						const void *object)
+{
+	struct kasan_alloc_meta *alloc_info;
+
+	if (!(cache->flags & SLAB_KASAN))
+		return (void *)object;
+
+	alloc_info = get_alloc_info(cache, object);
+	__memset(alloc_info, 0, sizeof(*alloc_info));
+
+	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
+		object = set_tag(object,
+				assign_tag(cache, object, true, false));
+
+	return (void *)object;
+}
+
+static inline bool shadow_invalid(u8 tag, s8 shadow_byte)
+{
+	if (IS_ENABLED(CONFIG_KASAN_GENERIC))
+		return shadow_byte < 0 ||
+			shadow_byte >= KASAN_SHADOW_SCALE_SIZE;
+
+	/* else CONFIG_KASAN_SW_TAGS: */
+	if ((u8)shadow_byte == KASAN_TAG_INVALID)
+		return true;
+	if ((tag != KASAN_TAG_KERNEL) && (tag != (u8)shadow_byte))
+		return true;
+
+	return false;
+}
+
+static bool __kasan_slab_free(struct kmem_cache *cache, void *object,
+			      unsigned long ip, bool quarantine)
+{
+	s8 shadow_byte;
+	u8 tag;
+	void *tagged_object;
+	unsigned long rounded_up_size;
+
+	tag = get_tag(object);
+	tagged_object = object;
+	object = reset_tag(object);
+
+	if (unlikely(nearest_obj(cache, virt_to_head_page(object), object) !=
+	    object)) {
+		kasan_report_invalid_free(tagged_object, ip);
+		return true;
+	}
+
+	/* RCU slabs could be legally used after free within the RCU period */
+	if (unlikely(cache->flags & SLAB_TYPESAFE_BY_RCU))
+		return false;
+
+	shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(object));
+	if (shadow_invalid(tag, shadow_byte)) {
+		kasan_report_invalid_free(tagged_object, ip);
+		return true;
+	}
+
+	rounded_up_size = round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE);
+	kasan_poison_shadow(object, rounded_up_size, KASAN_KMALLOC_FREE);
+
+	if ((IS_ENABLED(CONFIG_KASAN_GENERIC) && !quarantine) ||
+			unlikely(!(cache->flags & SLAB_KASAN)))
+		return false;
+
+	set_track(&get_alloc_info(cache, object)->free_track, GFP_NOWAIT);
+	quarantine_put(get_free_info(cache, object), cache);
+
+	return IS_ENABLED(CONFIG_KASAN_GENERIC);
+}
+
+bool kasan_slab_free(struct kmem_cache *cache, void *object, unsigned long ip)
+{
+	return __kasan_slab_free(cache, object, ip, true);
+}
+
+static void *__kasan_kmalloc(struct kmem_cache *cache, const void *object,
+				size_t size, gfp_t flags, bool keep_tag)
+{
+	unsigned long redzone_start;
+	unsigned long redzone_end;
+	u8 tag = 0xff;
+
+	if (gfpflags_allow_blocking(flags))
+		quarantine_reduce();
+
+	if (unlikely(object == NULL))
+		return NULL;
+
+	redzone_start = round_up((unsigned long)(object + size),
+				KASAN_SHADOW_SCALE_SIZE);
+	redzone_end = round_up((unsigned long)object + cache->object_size,
+				KASAN_SHADOW_SCALE_SIZE);
+
+	if (IS_ENABLED(CONFIG_KASAN_SW_TAGS))
+		tag = assign_tag(cache, object, false, keep_tag);
+
+	/* Tag is ignored in set_tag without CONFIG_KASAN_SW_TAGS */
+	kasan_unpoison_shadow(set_tag(object, tag), size);
+	kasan_poison_shadow((void *)redzone_start, redzone_end - redzone_start,
+		KASAN_KMALLOC_REDZONE);
+
+	if (cache->flags & SLAB_KASAN)
+		set_track(&get_alloc_info(cache, object)->alloc_track, flags);
+
+	return set_tag(object, tag);
+}
+
+void * __must_check kasan_slab_alloc(struct kmem_cache *cache, void *object,
+					gfp_t flags)
+{
+	return __kasan_kmalloc(cache, object, cache->object_size, flags, false);
+}
+
+void * __must_check kasan_kmalloc(struct kmem_cache *cache, const void *object,
+				size_t size, gfp_t flags)
+{
+	return __kasan_kmalloc(cache, object, size, flags, true);
+}
+EXPORT_SYMBOL(kasan_kmalloc);
+
+void * __must_check kasan_kmalloc_large(const void *ptr, size_t size,
+						gfp_t flags)
+{
+	struct page *page;
+	unsigned long redzone_start;
+	unsigned long redzone_end;
+
+	if (gfpflags_allow_blocking(flags))
+		quarantine_reduce();
+
+	if (unlikely(ptr == NULL))
+		return NULL;
+
+	page = virt_to_page(ptr);
+	redzone_start = round_up((unsigned long)(ptr + size),
+				KASAN_SHADOW_SCALE_SIZE);
+	redzone_end = (unsigned long)ptr + (PAGE_SIZE << compound_order(page));
+
+	kasan_unpoison_shadow(ptr, size);
+	kasan_poison_shadow((void *)redzone_start, redzone_end - redzone_start,
+		KASAN_PAGE_REDZONE);
+
+	return (void *)ptr;
+}
+
+void * __must_check kasan_krealloc(const void *object, size_t size, gfp_t flags)
+{
+	struct page *page;
+
+	if (unlikely(object == ZERO_SIZE_PTR))
+		return (void *)object;
+
+	page = virt_to_head_page(object);
+
+	if (unlikely(!PageSlab(page)))
+		return kasan_kmalloc_large(object, size, flags);
+	else
+		return __kasan_kmalloc(page->slab_cache, object, size,
+						flags, true);
+}
+
+void kasan_poison_kfree(void *ptr, unsigned long ip)
+{
+	struct page *page;
+
+	page = virt_to_head_page(ptr);
+
+	if (unlikely(!PageSlab(page))) {
+		if (ptr != page_address(page)) {
+			kasan_report_invalid_free(ptr, ip);
+			return;
+		}
+		kasan_poison_shadow(ptr, PAGE_SIZE << compound_order(page),
+				KASAN_FREE_PAGE);
+	} else {
+		__kasan_slab_free(page->slab_cache, ptr, ip, false);
+	}
+}
+
+void kasan_kfree_large(void *ptr, unsigned long ip)
+{
+	if (ptr != page_address(virt_to_head_page(ptr)))
+		kasan_report_invalid_free(ptr, ip);
+	/* The object will be poisoned by page_alloc. */
+}
+
+int kasan_module_alloc(void *addr, size_t size)
+{
+	void *ret;
+	size_t scaled_size;
+	size_t shadow_size;
+	unsigned long shadow_start;
+
+	shadow_start = (unsigned long)kasan_mem_to_shadow(addr);
+	scaled_size = (size + KASAN_SHADOW_MASK) >> KASAN_SHADOW_SCALE_SHIFT;
+	shadow_size = round_up(scaled_size, PAGE_SIZE);
+
+	if (WARN_ON(!PAGE_ALIGNED(shadow_start)))
+		return -EINVAL;
+
+	ret = __vmalloc_node_range(shadow_size, 1, shadow_start,
+			shadow_start + shadow_size,
+			GFP_KERNEL,
+			PAGE_KERNEL, VM_NO_GUARD, NUMA_NO_NODE,
+			__builtin_return_address(0));
+
+	if (ret) {
+		__memset(ret, KASAN_SHADOW_INIT, shadow_size);
+		find_vm_area(addr)->flags |= VM_KASAN;
+		kmemleak_ignore(ret);
+		return 0;
+	}
+
+	return -ENOMEM;
+}
+
+void kasan_free_shadow(const struct vm_struct *vm)
+{
+	if (vm->flags & VM_KASAN)
+		vfree(kasan_mem_to_shadow(vm->addr));
+}
+
+extern void __kasan_report(unsigned long addr, size_t size, bool is_write, unsigned long ip);
+
+void kasan_report(unsigned long addr, size_t size, bool is_write, unsigned long ip)
+{
+	unsigned long flags = user_access_save();
+	__kasan_report(addr, size, is_write, ip);
+	user_access_restore(flags);
+}
+
+#ifdef CONFIG_MEMORY_HOTPLUG
+static bool shadow_mapped(unsigned long addr)
+{
+	pgd_t *pgd = pgd_offset_k(addr);
+	p4d_t *p4d;
+	pud_t *pud;
+	pmd_t *pmd;
+	pte_t *pte;
+
+	if (pgd_none(*pgd))
+		return false;
+	p4d = p4d_offset(pgd, addr);
+	if (p4d_none(*p4d))
+		return false;
+	pud = pud_offset(p4d, addr);
+	if (pud_none(*pud))
+		return false;
+
+	/*
+	 * We can't use pud_large() or pud_huge(), the first one is
+	 * arch-specific, the last one depends on HUGETLB_PAGE.  So let's abuse
+	 * pud_bad(), if pud is bad then it's bad because it's huge.
+	 */
+	if (pud_bad(*pud))
+		return true;
+	pmd = pmd_offset(pud, addr);
+	if (pmd_none(*pmd))
+		return false;
+
+	if (pmd_bad(*pmd))
+		return true;
+	pte = pte_offset_kernel(pmd, addr);
+	return !pte_none(*pte);
+}
+
+static int __meminit kasan_mem_notifier(struct notifier_block *nb,
+			unsigned long action, void *data)
+{
+	struct memory_notify *mem_data = data;
+	unsigned long nr_shadow_pages, start_kaddr, shadow_start;
+	unsigned long shadow_end, shadow_size;
+
+	nr_shadow_pages = mem_data->nr_pages >> KASAN_SHADOW_SCALE_SHIFT;
+	start_kaddr = (unsigned long)pfn_to_kaddr(mem_data->start_pfn);
+	shadow_start = (unsigned long)kasan_mem_to_shadow((void *)start_kaddr);
+	shadow_size = nr_shadow_pages << PAGE_SHIFT;
+	shadow_end = shadow_start + shadow_size;
+
+	if (WARN_ON(mem_data->nr_pages % KASAN_SHADOW_SCALE_SIZE) ||
+		WARN_ON(start_kaddr % (KASAN_SHADOW_SCALE_SIZE << PAGE_SHIFT)))
+		return NOTIFY_BAD;
+
+	switch (action) {
+	case MEM_GOING_ONLINE: {
+		void *ret;
+
+		/*
+		 * If shadow is mapped already than it must have been mapped
+		 * during the boot. This could happen if we onlining previously
+		 * offlined memory.
+		 */
+		if (shadow_mapped(shadow_start))
+			return NOTIFY_OK;
+
+		ret = __vmalloc_node_range(shadow_size, PAGE_SIZE, shadow_start,
+					shadow_end, GFP_KERNEL,
+					PAGE_KERNEL, VM_NO_GUARD,
+					pfn_to_nid(mem_data->start_pfn),
+					__builtin_return_address(0));
+		if (!ret)
+			return NOTIFY_BAD;
+
+		kmemleak_ignore(ret);
+		return NOTIFY_OK;
+	}
+	case MEM_CANCEL_ONLINE:
+	case MEM_OFFLINE: {
+		struct vm_struct *vm;
+
+		/*
+		 * shadow_start was either mapped during boot by kasan_init()
+		 * or during memory online by __vmalloc_node_range().
+		 * In the latter case we can use vfree() to free shadow.
+		 * Non-NULL result of the find_vm_area() will tell us if
+		 * that was the second case.
+		 *
+		 * Currently it's not possible to free shadow mapped
+		 * during boot by kasan_init(). It's because the code
+		 * to do that hasn't been written yet. So we'll just
+		 * leak the memory.
+		 */
+		vm = find_vm_area((void *)shadow_start);
+		if (vm)
+			vfree((void *)shadow_start);
+	}
+	}
+
+	return NOTIFY_OK;
+}
+
+static int __init kasan_memhotplug_init(void)
+{
+	hotplug_memory_notifier(kasan_mem_notifier, 0);
+
+	return 0;
+}
+
+core_initcall(kasan_memhotplug_init);
+#endif
diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c
new file mode 100644
index 0000000..504c7936
--- /dev/null
+++ b/mm/kasan/generic.c
@@ -0,0 +1,325 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This file contains core generic KASAN code.
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Author: Andrey Ryabinin <ryabinin.a.a@gmail.com>
+ *
+ * Some code borrowed from https://github.com/xairy/kasan-prototype by
+ *        Andrey Konovalov <andreyknvl@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+#define DISABLE_BRANCH_PROFILING
+
+#include <linux/export.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/kasan.h>
+#include <linux/kernel.h>
+#include <linux/kmemleak.h>
+#include <linux/linkage.h>
+#include <linux/memblock.h>
+#include <linux/memory.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/printk.h>
+#include <linux/sched.h>
+#include <linux/sched/task_stack.h>
+#include <linux/slab.h>
+#include <linux/stacktrace.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/vmalloc.h>
+#include <linux/bug.h>
+
+#include "kasan.h"
+#include "../slab.h"
+
+/*
+ * All functions below always inlined so compiler could
+ * perform better optimizations in each of __asan_loadX/__assn_storeX
+ * depending on memory access size X.
+ */
+
+static __always_inline bool memory_is_poisoned_1(unsigned long addr)
+{
+	s8 shadow_value = *(s8 *)kasan_mem_to_shadow((void *)addr);
+
+	if (unlikely(shadow_value)) {
+		s8 last_accessible_byte = addr & KASAN_SHADOW_MASK;
+		return unlikely(last_accessible_byte >= shadow_value);
+	}
+
+	return false;
+}
+
+static __always_inline bool memory_is_poisoned_2_4_8(unsigned long addr,
+						unsigned long size)
+{
+	u8 *shadow_addr = (u8 *)kasan_mem_to_shadow((void *)addr);
+
+	/*
+	 * Access crosses 8(shadow size)-byte boundary. Such access maps
+	 * into 2 shadow bytes, so we need to check them both.
+	 */
+	if (unlikely(((addr + size - 1) & KASAN_SHADOW_MASK) < size - 1))
+		return *shadow_addr || memory_is_poisoned_1(addr + size - 1);
+
+	return memory_is_poisoned_1(addr + size - 1);
+}
+
+static __always_inline bool memory_is_poisoned_16(unsigned long addr)
+{
+	u16 *shadow_addr = (u16 *)kasan_mem_to_shadow((void *)addr);
+
+	/* Unaligned 16-bytes access maps into 3 shadow bytes. */
+	if (unlikely(!IS_ALIGNED(addr, KASAN_SHADOW_SCALE_SIZE)))
+		return *shadow_addr || memory_is_poisoned_1(addr + 15);
+
+	return *shadow_addr;
+}
+
+static __always_inline unsigned long bytes_is_nonzero(const u8 *start,
+					size_t size)
+{
+	while (size) {
+		if (unlikely(*start))
+			return (unsigned long)start;
+		start++;
+		size--;
+	}
+
+	return 0;
+}
+
+static __always_inline unsigned long memory_is_nonzero(const void *start,
+						const void *end)
+{
+	unsigned int words;
+	unsigned long ret;
+	unsigned int prefix = (unsigned long)start % 8;
+
+	if (end - start <= 16)
+		return bytes_is_nonzero(start, end - start);
+
+	if (prefix) {
+		prefix = 8 - prefix;
+		ret = bytes_is_nonzero(start, prefix);
+		if (unlikely(ret))
+			return ret;
+		start += prefix;
+	}
+
+	words = (end - start) / 8;
+	while (words) {
+		if (unlikely(*(u64 *)start))
+			return bytes_is_nonzero(start, 8);
+		start += 8;
+		words--;
+	}
+
+	return bytes_is_nonzero(start, (end - start) % 8);
+}
+
+static __always_inline bool memory_is_poisoned_n(unsigned long addr,
+						size_t size)
+{
+	unsigned long ret;
+
+	ret = memory_is_nonzero(kasan_mem_to_shadow((void *)addr),
+			kasan_mem_to_shadow((void *)addr + size - 1) + 1);
+
+	if (unlikely(ret)) {
+		unsigned long last_byte = addr + size - 1;
+		s8 *last_shadow = (s8 *)kasan_mem_to_shadow((void *)last_byte);
+
+		if (unlikely(ret != (unsigned long)last_shadow ||
+			((long)(last_byte & KASAN_SHADOW_MASK) >= *last_shadow)))
+			return true;
+	}
+	return false;
+}
+
+static __always_inline bool memory_is_poisoned(unsigned long addr, size_t size)
+{
+	if (__builtin_constant_p(size)) {
+		switch (size) {
+		case 1:
+			return memory_is_poisoned_1(addr);
+		case 2:
+		case 4:
+		case 8:
+			return memory_is_poisoned_2_4_8(addr, size);
+		case 16:
+			return memory_is_poisoned_16(addr);
+		default:
+			BUILD_BUG();
+		}
+	}
+
+	return memory_is_poisoned_n(addr, size);
+}
+
+static __always_inline void check_memory_region_inline(unsigned long addr,
+						size_t size, bool write,
+						unsigned long ret_ip)
+{
+	if (unlikely(size == 0))
+		return;
+
+	if (unlikely((void *)addr <
+		kasan_shadow_to_mem((void *)KASAN_SHADOW_START))) {
+		kasan_report(addr, size, write, ret_ip);
+		return;
+	}
+
+	if (likely(!memory_is_poisoned(addr, size)))
+		return;
+
+	kasan_report(addr, size, write, ret_ip);
+}
+
+void check_memory_region(unsigned long addr, size_t size, bool write,
+				unsigned long ret_ip)
+{
+	check_memory_region_inline(addr, size, write, ret_ip);
+}
+
+void kasan_cache_shrink(struct kmem_cache *cache)
+{
+	quarantine_remove_cache(cache);
+}
+
+void kasan_cache_shutdown(struct kmem_cache *cache)
+{
+	if (!__kmem_cache_empty(cache))
+		quarantine_remove_cache(cache);
+}
+
+static void register_global(struct kasan_global *global)
+{
+	size_t aligned_size = round_up(global->size, KASAN_SHADOW_SCALE_SIZE);
+
+	kasan_unpoison_shadow(global->beg, global->size);
+
+	kasan_poison_shadow(global->beg + aligned_size,
+		global->size_with_redzone - aligned_size,
+		KASAN_GLOBAL_REDZONE);
+}
+
+void __asan_register_globals(struct kasan_global *globals, size_t size)
+{
+	int i;
+
+	for (i = 0; i < size; i++)
+		register_global(&globals[i]);
+}
+EXPORT_SYMBOL(__asan_register_globals);
+
+void __asan_unregister_globals(struct kasan_global *globals, size_t size)
+{
+}
+EXPORT_SYMBOL(__asan_unregister_globals);
+
+#define DEFINE_ASAN_LOAD_STORE(size)					\
+	void __asan_load##size(unsigned long addr)			\
+	{								\
+		check_memory_region_inline(addr, size, false, _RET_IP_);\
+	}								\
+	EXPORT_SYMBOL(__asan_load##size);				\
+	__alias(__asan_load##size)					\
+	void __asan_load##size##_noabort(unsigned long);		\
+	EXPORT_SYMBOL(__asan_load##size##_noabort);			\
+	void __asan_store##size(unsigned long addr)			\
+	{								\
+		check_memory_region_inline(addr, size, true, _RET_IP_);	\
+	}								\
+	EXPORT_SYMBOL(__asan_store##size);				\
+	__alias(__asan_store##size)					\
+	void __asan_store##size##_noabort(unsigned long);		\
+	EXPORT_SYMBOL(__asan_store##size##_noabort)
+
+DEFINE_ASAN_LOAD_STORE(1);
+DEFINE_ASAN_LOAD_STORE(2);
+DEFINE_ASAN_LOAD_STORE(4);
+DEFINE_ASAN_LOAD_STORE(8);
+DEFINE_ASAN_LOAD_STORE(16);
+
+void __asan_loadN(unsigned long addr, size_t size)
+{
+	check_memory_region(addr, size, false, _RET_IP_);
+}
+EXPORT_SYMBOL(__asan_loadN);
+
+__alias(__asan_loadN)
+void __asan_loadN_noabort(unsigned long, size_t);
+EXPORT_SYMBOL(__asan_loadN_noabort);
+
+void __asan_storeN(unsigned long addr, size_t size)
+{
+	check_memory_region(addr, size, true, _RET_IP_);
+}
+EXPORT_SYMBOL(__asan_storeN);
+
+__alias(__asan_storeN)
+void __asan_storeN_noabort(unsigned long, size_t);
+EXPORT_SYMBOL(__asan_storeN_noabort);
+
+/* to shut up compiler complaints */
+void __asan_handle_no_return(void) {}
+EXPORT_SYMBOL(__asan_handle_no_return);
+
+/* Emitted by compiler to poison alloca()ed objects. */
+void __asan_alloca_poison(unsigned long addr, size_t size)
+{
+	size_t rounded_up_size = round_up(size, KASAN_SHADOW_SCALE_SIZE);
+	size_t padding_size = round_up(size, KASAN_ALLOCA_REDZONE_SIZE) -
+			rounded_up_size;
+	size_t rounded_down_size = round_down(size, KASAN_SHADOW_SCALE_SIZE);
+
+	const void *left_redzone = (const void *)(addr -
+			KASAN_ALLOCA_REDZONE_SIZE);
+	const void *right_redzone = (const void *)(addr + rounded_up_size);
+
+	WARN_ON(!IS_ALIGNED(addr, KASAN_ALLOCA_REDZONE_SIZE));
+
+	kasan_unpoison_shadow((const void *)(addr + rounded_down_size),
+			      size - rounded_down_size);
+	kasan_poison_shadow(left_redzone, KASAN_ALLOCA_REDZONE_SIZE,
+			KASAN_ALLOCA_LEFT);
+	kasan_poison_shadow(right_redzone,
+			padding_size + KASAN_ALLOCA_REDZONE_SIZE,
+			KASAN_ALLOCA_RIGHT);
+}
+EXPORT_SYMBOL(__asan_alloca_poison);
+
+/* Emitted by compiler to unpoison alloca()ed areas when the stack unwinds. */
+void __asan_allocas_unpoison(const void *stack_top, const void *stack_bottom)
+{
+	if (unlikely(!stack_top || stack_top > stack_bottom))
+		return;
+
+	kasan_unpoison_shadow(stack_top, stack_bottom - stack_top);
+}
+EXPORT_SYMBOL(__asan_allocas_unpoison);
+
+/* Emitted by the compiler to [un]poison local variables. */
+#define DEFINE_ASAN_SET_SHADOW(byte) \
+	void __asan_set_shadow_##byte(const void *addr, size_t size)	\
+	{								\
+		__memset((void *)addr, 0x##byte, size);			\
+	}								\
+	EXPORT_SYMBOL(__asan_set_shadow_##byte)
+
+DEFINE_ASAN_SET_SHADOW(00);
+DEFINE_ASAN_SET_SHADOW(f1);
+DEFINE_ASAN_SET_SHADOW(f2);
+DEFINE_ASAN_SET_SHADOW(f3);
+DEFINE_ASAN_SET_SHADOW(f5);
+DEFINE_ASAN_SET_SHADOW(f8);
diff --git a/mm/kasan/generic_report.c b/mm/kasan/generic_report.c
new file mode 100644
index 0000000..36c6459
--- /dev/null
+++ b/mm/kasan/generic_report.c
@@ -0,0 +1,150 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This file contains generic KASAN specific error reporting code.
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Author: Andrey Ryabinin <ryabinin.a.a@gmail.com>
+ *
+ * Some code borrowed from https://github.com/xairy/kasan-prototype by
+ *        Andrey Konovalov <andreyknvl@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/bitops.h>
+#include <linux/ftrace.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/printk.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/stackdepot.h>
+#include <linux/stacktrace.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/kasan.h>
+#include <linux/module.h>
+
+#include <asm/sections.h>
+
+#include "kasan.h"
+#include "../slab.h"
+
+void *find_first_bad_addr(void *addr, size_t size)
+{
+	void *p = addr;
+
+	while (p < addr + size && !(*(u8 *)kasan_mem_to_shadow(p)))
+		p += KASAN_SHADOW_SCALE_SIZE;
+	return p;
+}
+
+static const char *get_shadow_bug_type(struct kasan_access_info *info)
+{
+	const char *bug_type = "unknown-crash";
+	u8 *shadow_addr;
+
+	shadow_addr = (u8 *)kasan_mem_to_shadow(info->first_bad_addr);
+
+	/*
+	 * If shadow byte value is in [0, KASAN_SHADOW_SCALE_SIZE) we can look
+	 * at the next shadow byte to determine the type of the bad access.
+	 */
+	if (*shadow_addr > 0 && *shadow_addr <= KASAN_SHADOW_SCALE_SIZE - 1)
+		shadow_addr++;
+
+	switch (*shadow_addr) {
+	case 0 ... KASAN_SHADOW_SCALE_SIZE - 1:
+		/*
+		 * In theory it's still possible to see these shadow values
+		 * due to a data race in the kernel code.
+		 */
+		bug_type = "out-of-bounds";
+		break;
+	case KASAN_PAGE_REDZONE:
+	case KASAN_KMALLOC_REDZONE:
+		bug_type = "slab-out-of-bounds";
+		break;
+	case KASAN_GLOBAL_REDZONE:
+		bug_type = "global-out-of-bounds";
+		break;
+	case KASAN_STACK_LEFT:
+	case KASAN_STACK_MID:
+	case KASAN_STACK_RIGHT:
+	case KASAN_STACK_PARTIAL:
+		bug_type = "stack-out-of-bounds";
+		break;
+	case KASAN_FREE_PAGE:
+	case KASAN_KMALLOC_FREE:
+		bug_type = "use-after-free";
+		break;
+	case KASAN_ALLOCA_LEFT:
+	case KASAN_ALLOCA_RIGHT:
+		bug_type = "alloca-out-of-bounds";
+		break;
+	}
+
+	return bug_type;
+}
+
+static const char *get_wild_bug_type(struct kasan_access_info *info)
+{
+	const char *bug_type = "unknown-crash";
+
+	if ((unsigned long)info->access_addr < PAGE_SIZE)
+		bug_type = "null-ptr-deref";
+	else if ((unsigned long)info->access_addr < TASK_SIZE)
+		bug_type = "user-memory-access";
+	else
+		bug_type = "wild-memory-access";
+
+	return bug_type;
+}
+
+const char *get_bug_type(struct kasan_access_info *info)
+{
+	if (addr_has_shadow(info->access_addr))
+		return get_shadow_bug_type(info);
+	return get_wild_bug_type(info);
+}
+
+#define DEFINE_ASAN_REPORT_LOAD(size)                     \
+void __asan_report_load##size##_noabort(unsigned long addr) \
+{                                                         \
+	kasan_report(addr, size, false, _RET_IP_);	  \
+}                                                         \
+EXPORT_SYMBOL(__asan_report_load##size##_noabort)
+
+#define DEFINE_ASAN_REPORT_STORE(size)                     \
+void __asan_report_store##size##_noabort(unsigned long addr) \
+{                                                          \
+	kasan_report(addr, size, true, _RET_IP_);	   \
+}                                                          \
+EXPORT_SYMBOL(__asan_report_store##size##_noabort)
+
+DEFINE_ASAN_REPORT_LOAD(1);
+DEFINE_ASAN_REPORT_LOAD(2);
+DEFINE_ASAN_REPORT_LOAD(4);
+DEFINE_ASAN_REPORT_LOAD(8);
+DEFINE_ASAN_REPORT_LOAD(16);
+DEFINE_ASAN_REPORT_STORE(1);
+DEFINE_ASAN_REPORT_STORE(2);
+DEFINE_ASAN_REPORT_STORE(4);
+DEFINE_ASAN_REPORT_STORE(8);
+DEFINE_ASAN_REPORT_STORE(16);
+
+void __asan_report_load_n_noabort(unsigned long addr, size_t size)
+{
+	kasan_report(addr, size, false, _RET_IP_);
+}
+EXPORT_SYMBOL(__asan_report_load_n_noabort);
+
+void __asan_report_store_n_noabort(unsigned long addr, size_t size)
+{
+	kasan_report(addr, size, true, _RET_IP_);
+}
+EXPORT_SYMBOL(__asan_report_store_n_noabort);
diff --git a/mm/kasan/kasan_init.c b/mm/kasan/init.c
similarity index 82%
rename from mm/kasan/kasan_init.c
rename to mm/kasan/init.c
index 7a2a2f1..1f2d7d8 100644
--- a/mm/kasan/kasan_init.c
+++ b/mm/kasan/init.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * This file contains some kasan initialization code.
  *
@@ -31,54 +32,54 @@
  *   - Latter it reused it as zero shadow to cover large ranges of memory
  *     that allowed to access, but not handled by kasan (vmalloc/vmemmap ...).
  */
-unsigned char kasan_zero_page[PAGE_SIZE] __page_aligned_bss;
+unsigned char kasan_early_shadow_page[PAGE_SIZE] __page_aligned_bss;
 
 #if CONFIG_PGTABLE_LEVELS > 4
-p4d_t kasan_zero_p4d[MAX_PTRS_PER_P4D] __page_aligned_bss;
+p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D] __page_aligned_bss;
 static inline bool kasan_p4d_table(pgd_t pgd)
 {
-	return pgd_page(pgd) == virt_to_page(lm_alias(kasan_zero_p4d));
+	return pgd_page(pgd) == virt_to_page(lm_alias(kasan_early_shadow_p4d));
 }
 #else
 static inline bool kasan_p4d_table(pgd_t pgd)
 {
-	return 0;
+	return false;
 }
 #endif
 #if CONFIG_PGTABLE_LEVELS > 3
-pud_t kasan_zero_pud[PTRS_PER_PUD] __page_aligned_bss;
+pud_t kasan_early_shadow_pud[PTRS_PER_PUD] __page_aligned_bss;
 static inline bool kasan_pud_table(p4d_t p4d)
 {
-	return p4d_page(p4d) == virt_to_page(lm_alias(kasan_zero_pud));
+	return p4d_page(p4d) == virt_to_page(lm_alias(kasan_early_shadow_pud));
 }
 #else
 static inline bool kasan_pud_table(p4d_t p4d)
 {
-	return 0;
+	return false;
 }
 #endif
 #if CONFIG_PGTABLE_LEVELS > 2
-pmd_t kasan_zero_pmd[PTRS_PER_PMD] __page_aligned_bss;
+pmd_t kasan_early_shadow_pmd[PTRS_PER_PMD] __page_aligned_bss;
 static inline bool kasan_pmd_table(pud_t pud)
 {
-	return pud_page(pud) == virt_to_page(lm_alias(kasan_zero_pmd));
+	return pud_page(pud) == virt_to_page(lm_alias(kasan_early_shadow_pmd));
 }
 #else
 static inline bool kasan_pmd_table(pud_t pud)
 {
-	return 0;
+	return false;
 }
 #endif
-pte_t kasan_zero_pte[PTRS_PER_PTE] __page_aligned_bss;
+pte_t kasan_early_shadow_pte[PTRS_PER_PTE] __page_aligned_bss;
 
 static inline bool kasan_pte_table(pmd_t pmd)
 {
-	return pmd_page(pmd) == virt_to_page(lm_alias(kasan_zero_pte));
+	return pmd_page(pmd) == virt_to_page(lm_alias(kasan_early_shadow_pte));
 }
 
-static inline bool kasan_zero_page_entry(pte_t pte)
+static inline bool kasan_early_shadow_page_entry(pte_t pte)
 {
-	return pte_page(pte) == virt_to_page(lm_alias(kasan_zero_page));
+	return pte_page(pte) == virt_to_page(lm_alias(kasan_early_shadow_page));
 }
 
 static __init void *early_alloc(size_t size, int node)
@@ -93,7 +94,8 @@
 	pte_t *pte = pte_offset_kernel(pmd, addr);
 	pte_t zero_pte;
 
-	zero_pte = pfn_pte(PFN_DOWN(__pa_symbol(kasan_zero_page)), PAGE_KERNEL);
+	zero_pte = pfn_pte(PFN_DOWN(__pa_symbol(kasan_early_shadow_page)),
+				PAGE_KERNEL);
 	zero_pte = pte_wrprotect(zero_pte);
 
 	while (addr + PAGE_SIZE <= end) {
@@ -113,7 +115,8 @@
 		next = pmd_addr_end(addr, end);
 
 		if (IS_ALIGNED(addr, PMD_SIZE) && end - addr >= PMD_SIZE) {
-			pmd_populate_kernel(&init_mm, pmd, lm_alias(kasan_zero_pte));
+			pmd_populate_kernel(&init_mm, pmd,
+					lm_alias(kasan_early_shadow_pte));
 			continue;
 		}
 
@@ -146,9 +149,11 @@
 		if (IS_ALIGNED(addr, PUD_SIZE) && end - addr >= PUD_SIZE) {
 			pmd_t *pmd;
 
-			pud_populate(&init_mm, pud, lm_alias(kasan_zero_pmd));
+			pud_populate(&init_mm, pud,
+					lm_alias(kasan_early_shadow_pmd));
 			pmd = pmd_offset(pud, addr);
-			pmd_populate_kernel(&init_mm, pmd, lm_alias(kasan_zero_pte));
+			pmd_populate_kernel(&init_mm, pmd,
+					lm_alias(kasan_early_shadow_pte));
 			continue;
 		}
 
@@ -182,12 +187,14 @@
 			pud_t *pud;
 			pmd_t *pmd;
 
-			p4d_populate(&init_mm, p4d, lm_alias(kasan_zero_pud));
+			p4d_populate(&init_mm, p4d,
+					lm_alias(kasan_early_shadow_pud));
 			pud = pud_offset(p4d, addr);
-			pud_populate(&init_mm, pud, lm_alias(kasan_zero_pmd));
+			pud_populate(&init_mm, pud,
+					lm_alias(kasan_early_shadow_pmd));
 			pmd = pmd_offset(pud, addr);
 			pmd_populate_kernel(&init_mm, pmd,
-						lm_alias(kasan_zero_pte));
+					lm_alias(kasan_early_shadow_pte));
 			continue;
 		}
 
@@ -210,13 +217,13 @@
 }
 
 /**
- * kasan_populate_zero_shadow - populate shadow memory region with
- *                               kasan_zero_page
+ * kasan_populate_early_shadow - populate shadow memory region with
+ *                               kasan_early_shadow_page
  * @shadow_start - start of the memory range to populate
  * @shadow_end   - end of the memory range to populate
  */
-int __ref kasan_populate_zero_shadow(const void *shadow_start,
-				const void *shadow_end)
+int __ref kasan_populate_early_shadow(const void *shadow_start,
+					const void *shadow_end)
 {
 	unsigned long addr = (unsigned long)shadow_start;
 	unsigned long end = (unsigned long)shadow_end;
@@ -232,7 +239,7 @@
 			pmd_t *pmd;
 
 			/*
-			 * kasan_zero_pud should be populated with pmds
+			 * kasan_early_shadow_pud should be populated with pmds
 			 * at this moment.
 			 * [pud,pmd]_populate*() below needed only for
 			 * 3,2 - level page tables where we don't have
@@ -242,21 +249,25 @@
 			 * The ifndef is required to avoid build breakage.
 			 *
 			 * With 5level-fixup.h, pgd_populate() is not nop and
-			 * we reference kasan_zero_p4d. It's not defined
+			 * we reference kasan_early_shadow_p4d. It's not defined
 			 * unless 5-level paging enabled.
 			 *
 			 * The ifndef can be dropped once all KASAN-enabled
 			 * architectures will switch to pgtable-nop4d.h.
 			 */
 #ifndef __ARCH_HAS_5LEVEL_HACK
-			pgd_populate(&init_mm, pgd, lm_alias(kasan_zero_p4d));
+			pgd_populate(&init_mm, pgd,
+					lm_alias(kasan_early_shadow_p4d));
 #endif
 			p4d = p4d_offset(pgd, addr);
-			p4d_populate(&init_mm, p4d, lm_alias(kasan_zero_pud));
+			p4d_populate(&init_mm, p4d,
+					lm_alias(kasan_early_shadow_pud));
 			pud = pud_offset(p4d, addr);
-			pud_populate(&init_mm, pud, lm_alias(kasan_zero_pmd));
+			pud_populate(&init_mm, pud,
+					lm_alias(kasan_early_shadow_pmd));
 			pmd = pmd_offset(pud, addr);
-			pmd_populate_kernel(&init_mm, pmd, lm_alias(kasan_zero_pte));
+			pmd_populate_kernel(&init_mm, pmd,
+					lm_alias(kasan_early_shadow_pte));
 			continue;
 		}
 
@@ -351,7 +362,7 @@
 		if (!pte_present(*pte))
 			continue;
 
-		if (WARN_ON(!kasan_zero_page_entry(*pte)))
+		if (WARN_ON(!kasan_early_shadow_page_entry(*pte)))
 			continue;
 		pte_clear(&init_mm, addr, pte);
 	}
@@ -481,7 +492,7 @@
 	    WARN_ON(size % (KASAN_SHADOW_SCALE_SIZE * PAGE_SIZE)))
 		return -EINVAL;
 
-	ret = kasan_populate_zero_shadow(shadow_start, shadow_end);
+	ret = kasan_populate_early_shadow(shadow_start, shadow_end);
 	if (ret)
 		kasan_remove_zero_shadow(shadow_start,
 					size >> KASAN_SHADOW_SCALE_SHIFT);
diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c
deleted file mode 100644
index c3bd520..0000000
--- a/mm/kasan/kasan.c
+++ /dev/null
@@ -1,903 +0,0 @@
-/*
- * This file contains shadow memory manipulation code.
- *
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
- * Author: Andrey Ryabinin <ryabinin.a.a@gmail.com>
- *
- * Some code borrowed from https://github.com/xairy/kasan-prototype by
- *        Andrey Konovalov <andreyknvl@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-#define DISABLE_BRANCH_PROFILING
-
-#include <linux/export.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/kasan.h>
-#include <linux/kernel.h>
-#include <linux/kmemleak.h>
-#include <linux/linkage.h>
-#include <linux/memblock.h>
-#include <linux/memory.h>
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/printk.h>
-#include <linux/sched.h>
-#include <linux/sched/task_stack.h>
-#include <linux/slab.h>
-#include <linux/stacktrace.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/vmalloc.h>
-#include <linux/bug.h>
-
-#include "kasan.h"
-#include "../slab.h"
-
-void kasan_enable_current(void)
-{
-	current->kasan_depth++;
-}
-
-void kasan_disable_current(void)
-{
-	current->kasan_depth--;
-}
-
-/*
- * Poisons the shadow memory for 'size' bytes starting from 'addr'.
- * Memory addresses should be aligned to KASAN_SHADOW_SCALE_SIZE.
- */
-static void kasan_poison_shadow(const void *address, size_t size, u8 value)
-{
-	void *shadow_start, *shadow_end;
-
-	shadow_start = kasan_mem_to_shadow(address);
-	shadow_end = kasan_mem_to_shadow(address + size);
-
-	memset(shadow_start, value, shadow_end - shadow_start);
-}
-
-void kasan_unpoison_shadow(const void *address, size_t size)
-{
-	kasan_poison_shadow(address, size, 0);
-
-	if (size & KASAN_SHADOW_MASK) {
-		u8 *shadow = (u8 *)kasan_mem_to_shadow(address + size);
-		*shadow = size & KASAN_SHADOW_MASK;
-	}
-}
-
-static void __kasan_unpoison_stack(struct task_struct *task, const void *sp)
-{
-	void *base = task_stack_page(task);
-	size_t size = sp - base;
-
-	kasan_unpoison_shadow(base, size);
-}
-
-/* Unpoison the entire stack for a task. */
-void kasan_unpoison_task_stack(struct task_struct *task)
-{
-	__kasan_unpoison_stack(task, task_stack_page(task) + THREAD_SIZE);
-}
-
-/* Unpoison the stack for the current task beyond a watermark sp value. */
-asmlinkage void kasan_unpoison_task_stack_below(const void *watermark)
-{
-	/*
-	 * Calculate the task stack base address.  Avoid using 'current'
-	 * because this function is called by early resume code which hasn't
-	 * yet set up the percpu register (%gs).
-	 */
-	void *base = (void *)((unsigned long)watermark & ~(THREAD_SIZE - 1));
-
-	kasan_unpoison_shadow(base, watermark - base);
-}
-
-/*
- * Clear all poison for the region between the current SP and a provided
- * watermark value, as is sometimes required prior to hand-crafted asm function
- * returns in the middle of functions.
- */
-void kasan_unpoison_stack_above_sp_to(const void *watermark)
-{
-	const void *sp = __builtin_frame_address(0);
-	size_t size = watermark - sp;
-
-	if (WARN_ON(sp > watermark))
-		return;
-	kasan_unpoison_shadow(sp, size);
-}
-
-/*
- * All functions below always inlined so compiler could
- * perform better optimizations in each of __asan_loadX/__assn_storeX
- * depending on memory access size X.
- */
-
-static __always_inline bool memory_is_poisoned_1(unsigned long addr)
-{
-	s8 shadow_value = *(s8 *)kasan_mem_to_shadow((void *)addr);
-
-	if (unlikely(shadow_value)) {
-		s8 last_accessible_byte = addr & KASAN_SHADOW_MASK;
-		return unlikely(last_accessible_byte >= shadow_value);
-	}
-
-	return false;
-}
-
-static __always_inline bool memory_is_poisoned_2_4_8(unsigned long addr,
-						unsigned long size)
-{
-	u8 *shadow_addr = (u8 *)kasan_mem_to_shadow((void *)addr);
-
-	/*
-	 * Access crosses 8(shadow size)-byte boundary. Such access maps
-	 * into 2 shadow bytes, so we need to check them both.
-	 */
-	if (unlikely(((addr + size - 1) & KASAN_SHADOW_MASK) < size - 1))
-		return *shadow_addr || memory_is_poisoned_1(addr + size - 1);
-
-	return memory_is_poisoned_1(addr + size - 1);
-}
-
-static __always_inline bool memory_is_poisoned_16(unsigned long addr)
-{
-	u16 *shadow_addr = (u16 *)kasan_mem_to_shadow((void *)addr);
-
-	/* Unaligned 16-bytes access maps into 3 shadow bytes. */
-	if (unlikely(!IS_ALIGNED(addr, KASAN_SHADOW_SCALE_SIZE)))
-		return *shadow_addr || memory_is_poisoned_1(addr + 15);
-
-	return *shadow_addr;
-}
-
-static __always_inline unsigned long bytes_is_nonzero(const u8 *start,
-					size_t size)
-{
-	while (size) {
-		if (unlikely(*start))
-			return (unsigned long)start;
-		start++;
-		size--;
-	}
-
-	return 0;
-}
-
-static __always_inline unsigned long memory_is_nonzero(const void *start,
-						const void *end)
-{
-	unsigned int words;
-	unsigned long ret;
-	unsigned int prefix = (unsigned long)start % 8;
-
-	if (end - start <= 16)
-		return bytes_is_nonzero(start, end - start);
-
-	if (prefix) {
-		prefix = 8 - prefix;
-		ret = bytes_is_nonzero(start, prefix);
-		if (unlikely(ret))
-			return ret;
-		start += prefix;
-	}
-
-	words = (end - start) / 8;
-	while (words) {
-		if (unlikely(*(u64 *)start))
-			return bytes_is_nonzero(start, 8);
-		start += 8;
-		words--;
-	}
-
-	return bytes_is_nonzero(start, (end - start) % 8);
-}
-
-static __always_inline bool memory_is_poisoned_n(unsigned long addr,
-						size_t size)
-{
-	unsigned long ret;
-
-	ret = memory_is_nonzero(kasan_mem_to_shadow((void *)addr),
-			kasan_mem_to_shadow((void *)addr + size - 1) + 1);
-
-	if (unlikely(ret)) {
-		unsigned long last_byte = addr + size - 1;
-		s8 *last_shadow = (s8 *)kasan_mem_to_shadow((void *)last_byte);
-
-		if (unlikely(ret != (unsigned long)last_shadow ||
-			((long)(last_byte & KASAN_SHADOW_MASK) >= *last_shadow)))
-			return true;
-	}
-	return false;
-}
-
-static __always_inline bool memory_is_poisoned(unsigned long addr, size_t size)
-{
-	if (__builtin_constant_p(size)) {
-		switch (size) {
-		case 1:
-			return memory_is_poisoned_1(addr);
-		case 2:
-		case 4:
-		case 8:
-			return memory_is_poisoned_2_4_8(addr, size);
-		case 16:
-			return memory_is_poisoned_16(addr);
-		default:
-			BUILD_BUG();
-		}
-	}
-
-	return memory_is_poisoned_n(addr, size);
-}
-
-static __always_inline void check_memory_region_inline(unsigned long addr,
-						size_t size, bool write,
-						unsigned long ret_ip)
-{
-	if (unlikely(size == 0))
-		return;
-
-	if (unlikely((void *)addr <
-		kasan_shadow_to_mem((void *)KASAN_SHADOW_START))) {
-		kasan_report(addr, size, write, ret_ip);
-		return;
-	}
-
-	if (likely(!memory_is_poisoned(addr, size)))
-		return;
-
-	kasan_report(addr, size, write, ret_ip);
-}
-
-static void check_memory_region(unsigned long addr,
-				size_t size, bool write,
-				unsigned long ret_ip)
-{
-	check_memory_region_inline(addr, size, write, ret_ip);
-}
-
-void kasan_check_read(const volatile void *p, unsigned int size)
-{
-	check_memory_region((unsigned long)p, size, false, _RET_IP_);
-}
-EXPORT_SYMBOL(kasan_check_read);
-
-void kasan_check_write(const volatile void *p, unsigned int size)
-{
-	check_memory_region((unsigned long)p, size, true, _RET_IP_);
-}
-EXPORT_SYMBOL(kasan_check_write);
-
-#undef memset
-void *memset(void *addr, int c, size_t len)
-{
-	check_memory_region((unsigned long)addr, len, true, _RET_IP_);
-
-	return __memset(addr, c, len);
-}
-
-#undef memmove
-void *memmove(void *dest, const void *src, size_t len)
-{
-	check_memory_region((unsigned long)src, len, false, _RET_IP_);
-	check_memory_region((unsigned long)dest, len, true, _RET_IP_);
-
-	return __memmove(dest, src, len);
-}
-
-#undef memcpy
-void *memcpy(void *dest, const void *src, size_t len)
-{
-	check_memory_region((unsigned long)src, len, false, _RET_IP_);
-	check_memory_region((unsigned long)dest, len, true, _RET_IP_);
-
-	return __memcpy(dest, src, len);
-}
-
-void kasan_alloc_pages(struct page *page, unsigned int order)
-{
-	if (likely(!PageHighMem(page)))
-		kasan_unpoison_shadow(page_address(page), PAGE_SIZE << order);
-}
-
-void kasan_free_pages(struct page *page, unsigned int order)
-{
-	if (likely(!PageHighMem(page)))
-		kasan_poison_shadow(page_address(page),
-				PAGE_SIZE << order,
-				KASAN_FREE_PAGE);
-}
-
-/*
- * Adaptive redzone policy taken from the userspace AddressSanitizer runtime.
- * For larger allocations larger redzones are used.
- */
-static unsigned int optimal_redzone(unsigned int object_size)
-{
-	return
-		object_size <= 64        - 16   ? 16 :
-		object_size <= 128       - 32   ? 32 :
-		object_size <= 512       - 64   ? 64 :
-		object_size <= 4096      - 128  ? 128 :
-		object_size <= (1 << 14) - 256  ? 256 :
-		object_size <= (1 << 15) - 512  ? 512 :
-		object_size <= (1 << 16) - 1024 ? 1024 : 2048;
-}
-
-void kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
-			slab_flags_t *flags)
-{
-	unsigned int orig_size = *size;
-	int redzone_adjust;
-
-	/* Add alloc meta. */
-	cache->kasan_info.alloc_meta_offset = *size;
-	*size += sizeof(struct kasan_alloc_meta);
-
-	/* Add free meta. */
-	if (cache->flags & SLAB_TYPESAFE_BY_RCU || cache->ctor ||
-	    cache->object_size < sizeof(struct kasan_free_meta)) {
-		cache->kasan_info.free_meta_offset = *size;
-		*size += sizeof(struct kasan_free_meta);
-	}
-	redzone_adjust = optimal_redzone(cache->object_size) -
-		(*size - cache->object_size);
-
-	if (redzone_adjust > 0)
-		*size += redzone_adjust;
-
-	*size = min_t(unsigned int, KMALLOC_MAX_SIZE,
-			max(*size, cache->object_size +
-					optimal_redzone(cache->object_size)));
-
-	/*
-	 * If the metadata doesn't fit, don't enable KASAN at all.
-	 */
-	if (*size <= cache->kasan_info.alloc_meta_offset ||
-			*size <= cache->kasan_info.free_meta_offset) {
-		cache->kasan_info.alloc_meta_offset = 0;
-		cache->kasan_info.free_meta_offset = 0;
-		*size = orig_size;
-		return;
-	}
-
-	*flags |= SLAB_KASAN;
-}
-
-void kasan_cache_shrink(struct kmem_cache *cache)
-{
-	quarantine_remove_cache(cache);
-}
-
-void kasan_cache_shutdown(struct kmem_cache *cache)
-{
-	if (!__kmem_cache_empty(cache))
-		quarantine_remove_cache(cache);
-}
-
-size_t kasan_metadata_size(struct kmem_cache *cache)
-{
-	return (cache->kasan_info.alloc_meta_offset ?
-		sizeof(struct kasan_alloc_meta) : 0) +
-		(cache->kasan_info.free_meta_offset ?
-		sizeof(struct kasan_free_meta) : 0);
-}
-
-void kasan_poison_slab(struct page *page)
-{
-	kasan_poison_shadow(page_address(page),
-			PAGE_SIZE << compound_order(page),
-			KASAN_KMALLOC_REDZONE);
-}
-
-void kasan_unpoison_object_data(struct kmem_cache *cache, void *object)
-{
-	kasan_unpoison_shadow(object, cache->object_size);
-}
-
-void kasan_poison_object_data(struct kmem_cache *cache, void *object)
-{
-	kasan_poison_shadow(object,
-			round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE),
-			KASAN_KMALLOC_REDZONE);
-}
-
-static inline int in_irqentry_text(unsigned long ptr)
-{
-	return (ptr >= (unsigned long)&__irqentry_text_start &&
-		ptr < (unsigned long)&__irqentry_text_end) ||
-		(ptr >= (unsigned long)&__softirqentry_text_start &&
-		 ptr < (unsigned long)&__softirqentry_text_end);
-}
-
-static inline void filter_irq_stacks(struct stack_trace *trace)
-{
-	int i;
-
-	if (!trace->nr_entries)
-		return;
-	for (i = 0; i < trace->nr_entries; i++)
-		if (in_irqentry_text(trace->entries[i])) {
-			/* Include the irqentry function into the stack. */
-			trace->nr_entries = i + 1;
-			break;
-		}
-}
-
-static inline depot_stack_handle_t save_stack(gfp_t flags)
-{
-	unsigned long entries[KASAN_STACK_DEPTH];
-	struct stack_trace trace = {
-		.nr_entries = 0,
-		.entries = entries,
-		.max_entries = KASAN_STACK_DEPTH,
-		.skip = 0
-	};
-
-	save_stack_trace(&trace);
-	filter_irq_stacks(&trace);
-	if (trace.nr_entries != 0 &&
-	    trace.entries[trace.nr_entries-1] == ULONG_MAX)
-		trace.nr_entries--;
-
-	return depot_save_stack(&trace, flags);
-}
-
-static inline void set_track(struct kasan_track *track, gfp_t flags)
-{
-	track->pid = current->pid;
-	track->stack = save_stack(flags);
-}
-
-struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache,
-					const void *object)
-{
-	BUILD_BUG_ON(sizeof(struct kasan_alloc_meta) > 32);
-	return (void *)object + cache->kasan_info.alloc_meta_offset;
-}
-
-struct kasan_free_meta *get_free_info(struct kmem_cache *cache,
-				      const void *object)
-{
-	BUILD_BUG_ON(sizeof(struct kasan_free_meta) > 32);
-	return (void *)object + cache->kasan_info.free_meta_offset;
-}
-
-void kasan_init_slab_obj(struct kmem_cache *cache, const void *object)
-{
-	struct kasan_alloc_meta *alloc_info;
-
-	if (!(cache->flags & SLAB_KASAN))
-		return;
-
-	alloc_info = get_alloc_info(cache, object);
-	__memset(alloc_info, 0, sizeof(*alloc_info));
-}
-
-void kasan_slab_alloc(struct kmem_cache *cache, void *object, gfp_t flags)
-{
-	kasan_kmalloc(cache, object, cache->object_size, flags);
-}
-
-static bool __kasan_slab_free(struct kmem_cache *cache, void *object,
-			      unsigned long ip, bool quarantine)
-{
-	s8 shadow_byte;
-	unsigned long rounded_up_size;
-
-	if (unlikely(nearest_obj(cache, virt_to_head_page(object), object) !=
-	    object)) {
-		kasan_report_invalid_free(object, ip);
-		return true;
-	}
-
-	/* RCU slabs could be legally used after free within the RCU period */
-	if (unlikely(cache->flags & SLAB_TYPESAFE_BY_RCU))
-		return false;
-
-	shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(object));
-	if (shadow_byte < 0 || shadow_byte >= KASAN_SHADOW_SCALE_SIZE) {
-		kasan_report_invalid_free(object, ip);
-		return true;
-	}
-
-	rounded_up_size = round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE);
-	kasan_poison_shadow(object, rounded_up_size, KASAN_KMALLOC_FREE);
-
-	if (!quarantine || unlikely(!(cache->flags & SLAB_KASAN)))
-		return false;
-
-	set_track(&get_alloc_info(cache, object)->free_track, GFP_NOWAIT);
-	quarantine_put(get_free_info(cache, object), cache);
-	return true;
-}
-
-bool kasan_slab_free(struct kmem_cache *cache, void *object, unsigned long ip)
-{
-	return __kasan_slab_free(cache, object, ip, true);
-}
-
-void kasan_kmalloc(struct kmem_cache *cache, const void *object, size_t size,
-		   gfp_t flags)
-{
-	unsigned long redzone_start;
-	unsigned long redzone_end;
-
-	if (gfpflags_allow_blocking(flags))
-		quarantine_reduce();
-
-	if (unlikely(object == NULL))
-		return;
-
-	redzone_start = round_up((unsigned long)(object + size),
-				KASAN_SHADOW_SCALE_SIZE);
-	redzone_end = round_up((unsigned long)object + cache->object_size,
-				KASAN_SHADOW_SCALE_SIZE);
-
-	kasan_unpoison_shadow(object, size);
-	kasan_poison_shadow((void *)redzone_start, redzone_end - redzone_start,
-		KASAN_KMALLOC_REDZONE);
-
-	if (cache->flags & SLAB_KASAN)
-		set_track(&get_alloc_info(cache, object)->alloc_track, flags);
-}
-EXPORT_SYMBOL(kasan_kmalloc);
-
-void kasan_kmalloc_large(const void *ptr, size_t size, gfp_t flags)
-{
-	struct page *page;
-	unsigned long redzone_start;
-	unsigned long redzone_end;
-
-	if (gfpflags_allow_blocking(flags))
-		quarantine_reduce();
-
-	if (unlikely(ptr == NULL))
-		return;
-
-	page = virt_to_page(ptr);
-	redzone_start = round_up((unsigned long)(ptr + size),
-				KASAN_SHADOW_SCALE_SIZE);
-	redzone_end = (unsigned long)ptr + (PAGE_SIZE << compound_order(page));
-
-	kasan_unpoison_shadow(ptr, size);
-	kasan_poison_shadow((void *)redzone_start, redzone_end - redzone_start,
-		KASAN_PAGE_REDZONE);
-}
-
-void kasan_krealloc(const void *object, size_t size, gfp_t flags)
-{
-	struct page *page;
-
-	if (unlikely(object == ZERO_SIZE_PTR))
-		return;
-
-	page = virt_to_head_page(object);
-
-	if (unlikely(!PageSlab(page)))
-		kasan_kmalloc_large(object, size, flags);
-	else
-		kasan_kmalloc(page->slab_cache, object, size, flags);
-}
-
-void kasan_poison_kfree(void *ptr, unsigned long ip)
-{
-	struct page *page;
-
-	page = virt_to_head_page(ptr);
-
-	if (unlikely(!PageSlab(page))) {
-		if (ptr != page_address(page)) {
-			kasan_report_invalid_free(ptr, ip);
-			return;
-		}
-		kasan_poison_shadow(ptr, PAGE_SIZE << compound_order(page),
-				KASAN_FREE_PAGE);
-	} else {
-		__kasan_slab_free(page->slab_cache, ptr, ip, false);
-	}
-}
-
-void kasan_kfree_large(void *ptr, unsigned long ip)
-{
-	if (ptr != page_address(virt_to_head_page(ptr)))
-		kasan_report_invalid_free(ptr, ip);
-	/* The object will be poisoned by page_alloc. */
-}
-
-int kasan_module_alloc(void *addr, size_t size)
-{
-	void *ret;
-	size_t scaled_size;
-	size_t shadow_size;
-	unsigned long shadow_start;
-
-	shadow_start = (unsigned long)kasan_mem_to_shadow(addr);
-	scaled_size = (size + KASAN_SHADOW_MASK) >> KASAN_SHADOW_SCALE_SHIFT;
-	shadow_size = round_up(scaled_size, PAGE_SIZE);
-
-	if (WARN_ON(!PAGE_ALIGNED(shadow_start)))
-		return -EINVAL;
-
-	ret = __vmalloc_node_range(shadow_size, 1, shadow_start,
-			shadow_start + shadow_size,
-			GFP_KERNEL | __GFP_ZERO,
-			PAGE_KERNEL, VM_NO_GUARD, NUMA_NO_NODE,
-			__builtin_return_address(0));
-
-	if (ret) {
-		find_vm_area(addr)->flags |= VM_KASAN;
-		kmemleak_ignore(ret);
-		return 0;
-	}
-
-	return -ENOMEM;
-}
-
-void kasan_free_shadow(const struct vm_struct *vm)
-{
-	if (vm->flags & VM_KASAN)
-		vfree(kasan_mem_to_shadow(vm->addr));
-}
-
-static void register_global(struct kasan_global *global)
-{
-	size_t aligned_size = round_up(global->size, KASAN_SHADOW_SCALE_SIZE);
-
-	kasan_unpoison_shadow(global->beg, global->size);
-
-	kasan_poison_shadow(global->beg + aligned_size,
-		global->size_with_redzone - aligned_size,
-		KASAN_GLOBAL_REDZONE);
-}
-
-void __asan_register_globals(struct kasan_global *globals, size_t size)
-{
-	int i;
-
-	for (i = 0; i < size; i++)
-		register_global(&globals[i]);
-}
-EXPORT_SYMBOL(__asan_register_globals);
-
-void __asan_unregister_globals(struct kasan_global *globals, size_t size)
-{
-}
-EXPORT_SYMBOL(__asan_unregister_globals);
-
-#define DEFINE_ASAN_LOAD_STORE(size)					\
-	void __asan_load##size(unsigned long addr)			\
-	{								\
-		check_memory_region_inline(addr, size, false, _RET_IP_);\
-	}								\
-	EXPORT_SYMBOL(__asan_load##size);				\
-	__alias(__asan_load##size)					\
-	void __asan_load##size##_noabort(unsigned long);		\
-	EXPORT_SYMBOL(__asan_load##size##_noabort);			\
-	void __asan_store##size(unsigned long addr)			\
-	{								\
-		check_memory_region_inline(addr, size, true, _RET_IP_);	\
-	}								\
-	EXPORT_SYMBOL(__asan_store##size);				\
-	__alias(__asan_store##size)					\
-	void __asan_store##size##_noabort(unsigned long);		\
-	EXPORT_SYMBOL(__asan_store##size##_noabort)
-
-DEFINE_ASAN_LOAD_STORE(1);
-DEFINE_ASAN_LOAD_STORE(2);
-DEFINE_ASAN_LOAD_STORE(4);
-DEFINE_ASAN_LOAD_STORE(8);
-DEFINE_ASAN_LOAD_STORE(16);
-
-void __asan_loadN(unsigned long addr, size_t size)
-{
-	check_memory_region(addr, size, false, _RET_IP_);
-}
-EXPORT_SYMBOL(__asan_loadN);
-
-__alias(__asan_loadN)
-void __asan_loadN_noabort(unsigned long, size_t);
-EXPORT_SYMBOL(__asan_loadN_noabort);
-
-void __asan_storeN(unsigned long addr, size_t size)
-{
-	check_memory_region(addr, size, true, _RET_IP_);
-}
-EXPORT_SYMBOL(__asan_storeN);
-
-__alias(__asan_storeN)
-void __asan_storeN_noabort(unsigned long, size_t);
-EXPORT_SYMBOL(__asan_storeN_noabort);
-
-/* to shut up compiler complaints */
-void __asan_handle_no_return(void) {}
-EXPORT_SYMBOL(__asan_handle_no_return);
-
-/* Emitted by compiler to poison large objects when they go out of scope. */
-void __asan_poison_stack_memory(const void *addr, size_t size)
-{
-	/*
-	 * Addr is KASAN_SHADOW_SCALE_SIZE-aligned and the object is surrounded
-	 * by redzones, so we simply round up size to simplify logic.
-	 */
-	kasan_poison_shadow(addr, round_up(size, KASAN_SHADOW_SCALE_SIZE),
-			    KASAN_USE_AFTER_SCOPE);
-}
-EXPORT_SYMBOL(__asan_poison_stack_memory);
-
-/* Emitted by compiler to unpoison large objects when they go into scope. */
-void __asan_unpoison_stack_memory(const void *addr, size_t size)
-{
-	kasan_unpoison_shadow(addr, size);
-}
-EXPORT_SYMBOL(__asan_unpoison_stack_memory);
-
-/* Emitted by compiler to poison alloca()ed objects. */
-void __asan_alloca_poison(unsigned long addr, size_t size)
-{
-	size_t rounded_up_size = round_up(size, KASAN_SHADOW_SCALE_SIZE);
-	size_t padding_size = round_up(size, KASAN_ALLOCA_REDZONE_SIZE) -
-			rounded_up_size;
-	size_t rounded_down_size = round_down(size, KASAN_SHADOW_SCALE_SIZE);
-
-	const void *left_redzone = (const void *)(addr -
-			KASAN_ALLOCA_REDZONE_SIZE);
-	const void *right_redzone = (const void *)(addr + rounded_up_size);
-
-	WARN_ON(!IS_ALIGNED(addr, KASAN_ALLOCA_REDZONE_SIZE));
-
-	kasan_unpoison_shadow((const void *)(addr + rounded_down_size),
-			      size - rounded_down_size);
-	kasan_poison_shadow(left_redzone, KASAN_ALLOCA_REDZONE_SIZE,
-			KASAN_ALLOCA_LEFT);
-	kasan_poison_shadow(right_redzone,
-			padding_size + KASAN_ALLOCA_REDZONE_SIZE,
-			KASAN_ALLOCA_RIGHT);
-}
-EXPORT_SYMBOL(__asan_alloca_poison);
-
-/* Emitted by compiler to unpoison alloca()ed areas when the stack unwinds. */
-void __asan_allocas_unpoison(const void *stack_top, const void *stack_bottom)
-{
-	if (unlikely(!stack_top || stack_top > stack_bottom))
-		return;
-
-	kasan_unpoison_shadow(stack_top, stack_bottom - stack_top);
-}
-EXPORT_SYMBOL(__asan_allocas_unpoison);
-
-/* Emitted by the compiler to [un]poison local variables. */
-#define DEFINE_ASAN_SET_SHADOW(byte) \
-	void __asan_set_shadow_##byte(const void *addr, size_t size)	\
-	{								\
-		__memset((void *)addr, 0x##byte, size);			\
-	}								\
-	EXPORT_SYMBOL(__asan_set_shadow_##byte)
-
-DEFINE_ASAN_SET_SHADOW(00);
-DEFINE_ASAN_SET_SHADOW(f1);
-DEFINE_ASAN_SET_SHADOW(f2);
-DEFINE_ASAN_SET_SHADOW(f3);
-DEFINE_ASAN_SET_SHADOW(f5);
-DEFINE_ASAN_SET_SHADOW(f8);
-
-#ifdef CONFIG_MEMORY_HOTPLUG
-static bool shadow_mapped(unsigned long addr)
-{
-	pgd_t *pgd = pgd_offset_k(addr);
-	p4d_t *p4d;
-	pud_t *pud;
-	pmd_t *pmd;
-	pte_t *pte;
-
-	if (pgd_none(*pgd))
-		return false;
-	p4d = p4d_offset(pgd, addr);
-	if (p4d_none(*p4d))
-		return false;
-	pud = pud_offset(p4d, addr);
-	if (pud_none(*pud))
-		return false;
-
-	/*
-	 * We can't use pud_large() or pud_huge(), the first one is
-	 * arch-specific, the last one depends on HUGETLB_PAGE.  So let's abuse
-	 * pud_bad(), if pud is bad then it's bad because it's huge.
-	 */
-	if (pud_bad(*pud))
-		return true;
-	pmd = pmd_offset(pud, addr);
-	if (pmd_none(*pmd))
-		return false;
-
-	if (pmd_bad(*pmd))
-		return true;
-	pte = pte_offset_kernel(pmd, addr);
-	return !pte_none(*pte);
-}
-
-static int __meminit kasan_mem_notifier(struct notifier_block *nb,
-			unsigned long action, void *data)
-{
-	struct memory_notify *mem_data = data;
-	unsigned long nr_shadow_pages, start_kaddr, shadow_start;
-	unsigned long shadow_end, shadow_size;
-
-	nr_shadow_pages = mem_data->nr_pages >> KASAN_SHADOW_SCALE_SHIFT;
-	start_kaddr = (unsigned long)pfn_to_kaddr(mem_data->start_pfn);
-	shadow_start = (unsigned long)kasan_mem_to_shadow((void *)start_kaddr);
-	shadow_size = nr_shadow_pages << PAGE_SHIFT;
-	shadow_end = shadow_start + shadow_size;
-
-	if (WARN_ON(mem_data->nr_pages % KASAN_SHADOW_SCALE_SIZE) ||
-		WARN_ON(start_kaddr % (KASAN_SHADOW_SCALE_SIZE << PAGE_SHIFT)))
-		return NOTIFY_BAD;
-
-	switch (action) {
-	case MEM_GOING_ONLINE: {
-		void *ret;
-
-		/*
-		 * If shadow is mapped already than it must have been mapped
-		 * during the boot. This could happen if we onlining previously
-		 * offlined memory.
-		 */
-		if (shadow_mapped(shadow_start))
-			return NOTIFY_OK;
-
-		ret = __vmalloc_node_range(shadow_size, PAGE_SIZE, shadow_start,
-					shadow_end, GFP_KERNEL,
-					PAGE_KERNEL, VM_NO_GUARD,
-					pfn_to_nid(mem_data->start_pfn),
-					__builtin_return_address(0));
-		if (!ret)
-			return NOTIFY_BAD;
-
-		kmemleak_ignore(ret);
-		return NOTIFY_OK;
-	}
-	case MEM_CANCEL_ONLINE:
-	case MEM_OFFLINE: {
-		struct vm_struct *vm;
-
-		/*
-		 * shadow_start was either mapped during boot by kasan_init()
-		 * or during memory online by __vmalloc_node_range().
-		 * In the latter case we can use vfree() to free shadow.
-		 * Non-NULL result of the find_vm_area() will tell us if
-		 * that was the second case.
-		 *
-		 * Currently it's not possible to free shadow mapped
-		 * during boot by kasan_init(). It's because the code
-		 * to do that hasn't been written yet. So we'll just
-		 * leak the memory.
-		 */
-		vm = find_vm_area((void *)shadow_start);
-		if (vm)
-			vfree((void *)shadow_start);
-	}
-	}
-
-	return NOTIFY_OK;
-}
-
-static int __init kasan_memhotplug_init(void)
-{
-	hotplug_memory_notifier(kasan_mem_notifier, 0);
-
-	return 0;
-}
-
-core_initcall(kasan_memhotplug_init);
-#endif
diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h
index c12dcfd..3ce956e 100644
--- a/mm/kasan/kasan.h
+++ b/mm/kasan/kasan.h
@@ -8,10 +8,22 @@
 #define KASAN_SHADOW_SCALE_SIZE (1UL << KASAN_SHADOW_SCALE_SHIFT)
 #define KASAN_SHADOW_MASK       (KASAN_SHADOW_SCALE_SIZE - 1)
 
+#define KASAN_TAG_KERNEL	0xFF /* native kernel pointers tag */
+#define KASAN_TAG_INVALID	0xFE /* inaccessible memory tag */
+#define KASAN_TAG_MAX		0xFD /* maximum value for random tags */
+
+#ifdef CONFIG_KASAN_GENERIC
 #define KASAN_FREE_PAGE         0xFF  /* page was freed */
 #define KASAN_PAGE_REDZONE      0xFE  /* redzone for kmalloc_large allocations */
 #define KASAN_KMALLOC_REDZONE   0xFC  /* redzone inside slub object */
 #define KASAN_KMALLOC_FREE      0xFB  /* object was freed (kmem_cache_free/kfree) */
+#else
+#define KASAN_FREE_PAGE         KASAN_TAG_INVALID
+#define KASAN_PAGE_REDZONE      KASAN_TAG_INVALID
+#define KASAN_KMALLOC_REDZONE   KASAN_TAG_INVALID
+#define KASAN_KMALLOC_FREE      KASAN_TAG_INVALID
+#endif
+
 #define KASAN_GLOBAL_REDZONE    0xFA  /* redzone for global variable */
 
 /*
@@ -22,7 +34,6 @@
 #define KASAN_STACK_MID         0xF2
 #define KASAN_STACK_RIGHT       0xF3
 #define KASAN_STACK_PARTIAL     0xF4
-#define KASAN_USE_AFTER_SCOPE   0xF8
 
 /*
  * alloca redzone shadow values
@@ -105,11 +116,25 @@
 		<< KASAN_SHADOW_SCALE_SHIFT);
 }
 
+static inline bool addr_has_shadow(const void *addr)
+{
+	return (addr >= kasan_shadow_to_mem((void *)KASAN_SHADOW_START));
+}
+
+void kasan_poison_shadow(const void *address, size_t size, u8 value);
+
+void check_memory_region(unsigned long addr, size_t size, bool write,
+				unsigned long ret_ip);
+
+void *find_first_bad_addr(void *addr, size_t size);
+const char *get_bug_type(struct kasan_access_info *info);
+
 void kasan_report(unsigned long addr, size_t size,
 		bool is_write, unsigned long ip);
 void kasan_report_invalid_free(void *object, unsigned long ip);
 
-#if defined(CONFIG_SLAB) || defined(CONFIG_SLUB)
+#if defined(CONFIG_KASAN_GENERIC) && \
+	(defined(CONFIG_SLAB) || defined(CONFIG_SLUB))
 void quarantine_put(struct kasan_free_meta *info, struct kmem_cache *cache);
 void quarantine_reduce(void);
 void quarantine_remove_cache(struct kmem_cache *cache);
@@ -120,6 +145,40 @@
 static inline void quarantine_remove_cache(struct kmem_cache *cache) { }
 #endif
 
+#ifdef CONFIG_KASAN_SW_TAGS
+
+void print_tags(u8 addr_tag, const void *addr);
+
+u8 random_tag(void);
+
+#else
+
+static inline void print_tags(u8 addr_tag, const void *addr) { }
+
+static inline u8 random_tag(void)
+{
+	return 0;
+}
+
+#endif
+
+#ifndef arch_kasan_set_tag
+static inline const void *arch_kasan_set_tag(const void *addr, u8 tag)
+{
+	return addr;
+}
+#endif
+#ifndef arch_kasan_reset_tag
+#define arch_kasan_reset_tag(addr)	((void *)(addr))
+#endif
+#ifndef arch_kasan_get_tag
+#define arch_kasan_get_tag(addr)	0
+#endif
+
+#define set_tag(addr, tag)	((void *)arch_kasan_set_tag((addr), (tag)))
+#define reset_tag(addr)		((void *)arch_kasan_reset_tag(addr))
+#define get_tag(addr)		arch_kasan_get_tag(addr)
+
 /*
  * Exported functions for interfaces called from assembly or from generated
  * code. Declarations here to avoid warning about missing declarations.
@@ -130,8 +189,6 @@
 void __asan_loadN(unsigned long addr, size_t size);
 void __asan_storeN(unsigned long addr, size_t size);
 void __asan_handle_no_return(void);
-void __asan_poison_stack_memory(const void *addr, size_t size);
-void __asan_unpoison_stack_memory(const void *addr, size_t size);
 void __asan_alloca_poison(unsigned long addr, size_t size);
 void __asan_allocas_unpoison(const void *stack_top, const void *stack_bottom);
 
diff --git a/mm/kasan/quarantine.c b/mm/kasan/quarantine.c
index 3a8ddf8..57334ef 100644
--- a/mm/kasan/quarantine.c
+++ b/mm/kasan/quarantine.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * KASAN quarantine.
  *
@@ -103,7 +104,7 @@
 static int quarantine_tail;
 /* Total size of all objects in global_quarantine across all batches. */
 static unsigned long quarantine_size;
-static DEFINE_SPINLOCK(quarantine_lock);
+static DEFINE_RAW_SPINLOCK(quarantine_lock);
 DEFINE_STATIC_SRCU(remove_cache_srcu);
 
 /* Maximum size of the global queue. */
@@ -190,7 +191,7 @@
 	if (unlikely(q->bytes > QUARANTINE_PERCPU_SIZE)) {
 		qlist_move_all(q, &temp);
 
-		spin_lock(&quarantine_lock);
+		raw_spin_lock(&quarantine_lock);
 		WRITE_ONCE(quarantine_size, quarantine_size + temp.bytes);
 		qlist_move_all(&temp, &global_quarantine[quarantine_tail]);
 		if (global_quarantine[quarantine_tail].bytes >=
@@ -203,7 +204,7 @@
 			if (new_tail != quarantine_head)
 				quarantine_tail = new_tail;
 		}
-		spin_unlock(&quarantine_lock);
+		raw_spin_unlock(&quarantine_lock);
 	}
 
 	local_irq_restore(flags);
@@ -230,7 +231,7 @@
 	 * expected case).
 	 */
 	srcu_idx = srcu_read_lock(&remove_cache_srcu);
-	spin_lock_irqsave(&quarantine_lock, flags);
+	raw_spin_lock_irqsave(&quarantine_lock, flags);
 
 	/*
 	 * Update quarantine size in case of hotplug. Allocate a fraction of
@@ -254,7 +255,7 @@
 			quarantine_head = 0;
 	}
 
-	spin_unlock_irqrestore(&quarantine_lock, flags);
+	raw_spin_unlock_irqrestore(&quarantine_lock, flags);
 
 	qlist_free_all(&to_free, NULL);
 	srcu_read_unlock(&remove_cache_srcu, srcu_idx);
@@ -310,17 +311,17 @@
 	 */
 	on_each_cpu(per_cpu_remove_cache, cache, 1);
 
-	spin_lock_irqsave(&quarantine_lock, flags);
+	raw_spin_lock_irqsave(&quarantine_lock, flags);
 	for (i = 0; i < QUARANTINE_BATCHES; i++) {
 		if (qlist_empty(&global_quarantine[i]))
 			continue;
 		qlist_move_cache(&global_quarantine[i], &to_free, cache);
 		/* Scanning whole quarantine can take a while. */
-		spin_unlock_irqrestore(&quarantine_lock, flags);
+		raw_spin_unlock_irqrestore(&quarantine_lock, flags);
 		cond_resched();
-		spin_lock_irqsave(&quarantine_lock, flags);
+		raw_spin_lock_irqsave(&quarantine_lock, flags);
 	}
-	spin_unlock_irqrestore(&quarantine_lock, flags);
+	raw_spin_unlock_irqrestore(&quarantine_lock, flags);
 
 	qlist_free_all(&to_free, cache);
 
diff --git a/mm/kasan/report.c b/mm/kasan/report.c
index 5c169aa..0772820 100644
--- a/mm/kasan/report.c
+++ b/mm/kasan/report.c
@@ -1,5 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
- * This file contains error reporting code.
+ * This file contains common generic and tag-based KASAN error reporting code.
  *
  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  * Author: Andrey Ryabinin <ryabinin.a.a@gmail.com>
@@ -39,129 +40,43 @@
 #define SHADOW_BYTES_PER_ROW (SHADOW_BLOCKS_PER_ROW * SHADOW_BYTES_PER_BLOCK)
 #define SHADOW_ROWS_AROUND_ADDR 2
 
-static const void *find_first_bad_addr(const void *addr, size_t size)
+static unsigned long kasan_flags;
+
+#define KASAN_BIT_REPORTED	0
+#define KASAN_BIT_MULTI_SHOT	1
+
+bool kasan_save_enable_multi_shot(void)
 {
-	u8 shadow_val = *(u8 *)kasan_mem_to_shadow(addr);
-	const void *first_bad_addr = addr;
-
-	while (!shadow_val && first_bad_addr < addr + size) {
-		first_bad_addr += KASAN_SHADOW_SCALE_SIZE;
-		shadow_val = *(u8 *)kasan_mem_to_shadow(first_bad_addr);
-	}
-	return first_bad_addr;
+	return test_and_set_bit(KASAN_BIT_MULTI_SHOT, &kasan_flags);
 }
+EXPORT_SYMBOL_GPL(kasan_save_enable_multi_shot);
 
-static bool addr_has_shadow(struct kasan_access_info *info)
+void kasan_restore_multi_shot(bool enabled)
 {
-	return (info->access_addr >=
-		kasan_shadow_to_mem((void *)KASAN_SHADOW_START));
+	if (!enabled)
+		clear_bit(KASAN_BIT_MULTI_SHOT, &kasan_flags);
 }
+EXPORT_SYMBOL_GPL(kasan_restore_multi_shot);
 
-static const char *get_shadow_bug_type(struct kasan_access_info *info)
+static int __init kasan_set_multi_shot(char *str)
 {
-	const char *bug_type = "unknown-crash";
-	u8 *shadow_addr;
-
-	info->first_bad_addr = find_first_bad_addr(info->access_addr,
-						info->access_size);
-
-	shadow_addr = (u8 *)kasan_mem_to_shadow(info->first_bad_addr);
-
-	/*
-	 * If shadow byte value is in [0, KASAN_SHADOW_SCALE_SIZE) we can look
-	 * at the next shadow byte to determine the type of the bad access.
-	 */
-	if (*shadow_addr > 0 && *shadow_addr <= KASAN_SHADOW_SCALE_SIZE - 1)
-		shadow_addr++;
-
-	switch (*shadow_addr) {
-	case 0 ... KASAN_SHADOW_SCALE_SIZE - 1:
-		/*
-		 * In theory it's still possible to see these shadow values
-		 * due to a data race in the kernel code.
-		 */
-		bug_type = "out-of-bounds";
-		break;
-	case KASAN_PAGE_REDZONE:
-	case KASAN_KMALLOC_REDZONE:
-		bug_type = "slab-out-of-bounds";
-		break;
-	case KASAN_GLOBAL_REDZONE:
-		bug_type = "global-out-of-bounds";
-		break;
-	case KASAN_STACK_LEFT:
-	case KASAN_STACK_MID:
-	case KASAN_STACK_RIGHT:
-	case KASAN_STACK_PARTIAL:
-		bug_type = "stack-out-of-bounds";
-		break;
-	case KASAN_FREE_PAGE:
-	case KASAN_KMALLOC_FREE:
-		bug_type = "use-after-free";
-		break;
-	case KASAN_USE_AFTER_SCOPE:
-		bug_type = "use-after-scope";
-		break;
-	case KASAN_ALLOCA_LEFT:
-	case KASAN_ALLOCA_RIGHT:
-		bug_type = "alloca-out-of-bounds";
-		break;
-	}
-
-	return bug_type;
+	set_bit(KASAN_BIT_MULTI_SHOT, &kasan_flags);
+	return 1;
 }
-
-static const char *get_wild_bug_type(struct kasan_access_info *info)
-{
-	const char *bug_type = "unknown-crash";
-
-	if ((unsigned long)info->access_addr < PAGE_SIZE)
-		bug_type = "null-ptr-deref";
-	else if ((unsigned long)info->access_addr < TASK_SIZE)
-		bug_type = "user-memory-access";
-	else
-		bug_type = "wild-memory-access";
-
-	return bug_type;
-}
-
-static const char *get_bug_type(struct kasan_access_info *info)
-{
-	if (addr_has_shadow(info))
-		return get_shadow_bug_type(info);
-	return get_wild_bug_type(info);
-}
+__setup("kasan_multi_shot", kasan_set_multi_shot);
 
 static void print_error_description(struct kasan_access_info *info)
 {
-	const char *bug_type = get_bug_type(info);
-
 	pr_err("BUG: KASAN: %s in %pS\n",
-		bug_type, (void *)info->ip);
+		get_bug_type(info), (void *)info->ip);
 	pr_err("%s of size %zu at addr %px by task %s/%d\n",
 		info->is_write ? "Write" : "Read", info->access_size,
 		info->access_addr, current->comm, task_pid_nr(current));
 }
 
-static inline bool kernel_or_module_addr(const void *addr)
-{
-	if (addr >= (void *)_stext && addr < (void *)_end)
-		return true;
-	if (is_module_address((unsigned long)addr))
-		return true;
-	return false;
-}
-
-static inline bool init_task_stack_addr(const void *addr)
-{
-	return addr >= (void *)&init_thread_union.stack &&
-		(addr <= (void *)&init_thread_union.stack +
-			sizeof(init_thread_union.stack));
-}
-
 static DEFINE_SPINLOCK(report_lock);
 
-static void kasan_start_report(unsigned long *flags)
+static void start_report(unsigned long *flags)
 {
 	/*
 	 * Make sure we don't end up in loop.
@@ -171,7 +86,7 @@
 	pr_err("==================================================================\n");
 }
 
-static void kasan_end_report(unsigned long *flags)
+static void end_report(unsigned long *flags)
 {
 	pr_err("==================================================================\n");
 	add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
@@ -249,6 +164,22 @@
 	describe_object_addr(cache, object, addr);
 }
 
+static inline bool kernel_or_module_addr(const void *addr)
+{
+	if (addr >= (void *)_stext && addr < (void *)_end)
+		return true;
+	if (is_module_address((unsigned long)addr))
+		return true;
+	return false;
+}
+
+static inline bool init_task_stack_addr(const void *addr)
+{
+	return addr >= (void *)&init_thread_union.stack &&
+		(addr <= (void *)&init_thread_union.stack +
+			sizeof(init_thread_union.stack));
+}
+
 static void print_address_description(void *addr)
 {
 	struct page *page = addr_to_page(addr);
@@ -326,65 +257,7 @@
 	}
 }
 
-void kasan_report_invalid_free(void *object, unsigned long ip)
-{
-	unsigned long flags;
-
-	kasan_start_report(&flags);
-	pr_err("BUG: KASAN: double-free or invalid-free in %pS\n", (void *)ip);
-	pr_err("\n");
-	print_address_description(object);
-	pr_err("\n");
-	print_shadow_for_address(object);
-	kasan_end_report(&flags);
-}
-
-static void kasan_report_error(struct kasan_access_info *info)
-{
-	unsigned long flags;
-
-	kasan_start_report(&flags);
-
-	print_error_description(info);
-	pr_err("\n");
-
-	if (!addr_has_shadow(info)) {
-		dump_stack();
-	} else {
-		print_address_description((void *)info->access_addr);
-		pr_err("\n");
-		print_shadow_for_address(info->first_bad_addr);
-	}
-
-	kasan_end_report(&flags);
-}
-
-static unsigned long kasan_flags;
-
-#define KASAN_BIT_REPORTED	0
-#define KASAN_BIT_MULTI_SHOT	1
-
-bool kasan_save_enable_multi_shot(void)
-{
-	return test_and_set_bit(KASAN_BIT_MULTI_SHOT, &kasan_flags);
-}
-EXPORT_SYMBOL_GPL(kasan_save_enable_multi_shot);
-
-void kasan_restore_multi_shot(bool enabled)
-{
-	if (!enabled)
-		clear_bit(KASAN_BIT_MULTI_SHOT, &kasan_flags);
-}
-EXPORT_SYMBOL_GPL(kasan_restore_multi_shot);
-
-static int __init kasan_set_multi_shot(char *str)
-{
-	set_bit(KASAN_BIT_MULTI_SHOT, &kasan_flags);
-	return 1;
-}
-__setup("kasan_multi_shot", kasan_set_multi_shot);
-
-static inline bool kasan_report_enabled(void)
+static bool report_enabled(void)
 {
 	if (current->kasan_depth)
 		return false;
@@ -393,59 +266,59 @@
 	return !test_and_set_bit(KASAN_BIT_REPORTED, &kasan_flags);
 }
 
-void kasan_report(unsigned long addr, size_t size,
-		bool is_write, unsigned long ip)
+void kasan_report_invalid_free(void *object, unsigned long ip)
+{
+	unsigned long flags;
+
+	start_report(&flags);
+	pr_err("BUG: KASAN: double-free or invalid-free in %pS\n", (void *)ip);
+	print_tags(get_tag(object), reset_tag(object));
+	object = reset_tag(object);
+	pr_err("\n");
+	print_address_description(object);
+	pr_err("\n");
+	print_shadow_for_address(object);
+	end_report(&flags);
+}
+
+void __kasan_report(unsigned long addr, size_t size, bool is_write, unsigned long ip)
 {
 	struct kasan_access_info info;
+	void *tagged_addr;
+	void *untagged_addr;
+	unsigned long flags;
 
-	if (likely(!kasan_report_enabled()))
+	if (likely(!report_enabled()))
 		return;
 
 	disable_trace_on_warning();
 
-	info.access_addr = (void *)addr;
-	info.first_bad_addr = (void *)addr;
+	tagged_addr = (void *)addr;
+	untagged_addr = reset_tag(tagged_addr);
+
+	info.access_addr = tagged_addr;
+	if (addr_has_shadow(untagged_addr))
+		info.first_bad_addr = find_first_bad_addr(tagged_addr, size);
+	else
+		info.first_bad_addr = untagged_addr;
 	info.access_size = size;
 	info.is_write = is_write;
 	info.ip = ip;
 
-	kasan_report_error(&info);
+	start_report(&flags);
+
+	print_error_description(&info);
+	if (addr_has_shadow(untagged_addr))
+		print_tags(get_tag(tagged_addr), info.first_bad_addr);
+	pr_err("\n");
+
+	if (addr_has_shadow(untagged_addr)) {
+		print_address_description(untagged_addr);
+		pr_err("\n");
+		print_shadow_for_address(info.first_bad_addr);
+	} else {
+		dump_stack();
+	}
+
+	end_report(&flags);
 }
-
-
-#define DEFINE_ASAN_REPORT_LOAD(size)                     \
-void __asan_report_load##size##_noabort(unsigned long addr) \
-{                                                         \
-	kasan_report(addr, size, false, _RET_IP_);	  \
-}                                                         \
-EXPORT_SYMBOL(__asan_report_load##size##_noabort)
-
-#define DEFINE_ASAN_REPORT_STORE(size)                     \
-void __asan_report_store##size##_noabort(unsigned long addr) \
-{                                                          \
-	kasan_report(addr, size, true, _RET_IP_);	   \
-}                                                          \
-EXPORT_SYMBOL(__asan_report_store##size##_noabort)
-
-DEFINE_ASAN_REPORT_LOAD(1);
-DEFINE_ASAN_REPORT_LOAD(2);
-DEFINE_ASAN_REPORT_LOAD(4);
-DEFINE_ASAN_REPORT_LOAD(8);
-DEFINE_ASAN_REPORT_LOAD(16);
-DEFINE_ASAN_REPORT_STORE(1);
-DEFINE_ASAN_REPORT_STORE(2);
-DEFINE_ASAN_REPORT_STORE(4);
-DEFINE_ASAN_REPORT_STORE(8);
-DEFINE_ASAN_REPORT_STORE(16);
-
-void __asan_report_load_n_noabort(unsigned long addr, size_t size)
-{
-	kasan_report(addr, size, false, _RET_IP_);
-}
-EXPORT_SYMBOL(__asan_report_load_n_noabort);
-
-void __asan_report_store_n_noabort(unsigned long addr, size_t size)
-{
-	kasan_report(addr, size, true, _RET_IP_);
-}
-EXPORT_SYMBOL(__asan_report_store_n_noabort);
diff --git a/mm/kasan/tags.c b/mm/kasan/tags.c
new file mode 100644
index 0000000..63fca31
--- /dev/null
+++ b/mm/kasan/tags.c
@@ -0,0 +1,161 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This file contains core tag-based KASAN code.
+ *
+ * Copyright (c) 2018 Google, Inc.
+ * Author: Andrey Konovalov <andreyknvl@google.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+#define DISABLE_BRANCH_PROFILING
+
+#include <linux/export.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/kasan.h>
+#include <linux/kernel.h>
+#include <linux/kmemleak.h>
+#include <linux/linkage.h>
+#include <linux/memblock.h>
+#include <linux/memory.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/printk.h>
+#include <linux/random.h>
+#include <linux/sched.h>
+#include <linux/sched/task_stack.h>
+#include <linux/slab.h>
+#include <linux/stacktrace.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/vmalloc.h>
+#include <linux/bug.h>
+
+#include "kasan.h"
+#include "../slab.h"
+
+static DEFINE_PER_CPU(u32, prng_state);
+
+void kasan_init_tags(void)
+{
+	int cpu;
+
+	for_each_possible_cpu(cpu)
+		per_cpu(prng_state, cpu) = (u32)get_cycles();
+}
+
+/*
+ * If a preemption happens between this_cpu_read and this_cpu_write, the only
+ * side effect is that we'll give a few allocated in different contexts objects
+ * the same tag. Since tag-based KASAN is meant to be used a probabilistic
+ * bug-detection debug feature, this doesn't have significant negative impact.
+ *
+ * Ideally the tags use strong randomness to prevent any attempts to predict
+ * them during explicit exploit attempts. But strong randomness is expensive,
+ * and we did an intentional trade-off to use a PRNG. This non-atomic RMW
+ * sequence has in fact positive effect, since interrupts that randomly skew
+ * PRNG at unpredictable points do only good.
+ */
+u8 random_tag(void)
+{
+	u32 state = this_cpu_read(prng_state);
+
+	state = 1664525 * state + 1013904223;
+	this_cpu_write(prng_state, state);
+
+	return (u8)(state % (KASAN_TAG_MAX + 1));
+}
+
+void *kasan_reset_tag(const void *addr)
+{
+	return reset_tag(addr);
+}
+
+void check_memory_region(unsigned long addr, size_t size, bool write,
+				unsigned long ret_ip)
+{
+	u8 tag;
+	u8 *shadow_first, *shadow_last, *shadow;
+	void *untagged_addr;
+
+	if (unlikely(size == 0))
+		return;
+
+	tag = get_tag((const void *)addr);
+
+	/*
+	 * Ignore accesses for pointers tagged with 0xff (native kernel
+	 * pointer tag) to suppress false positives caused by kmap.
+	 *
+	 * Some kernel code was written to account for archs that don't keep
+	 * high memory mapped all the time, but rather map and unmap particular
+	 * pages when needed. Instead of storing a pointer to the kernel memory,
+	 * this code saves the address of the page structure and offset within
+	 * that page for later use. Those pages are then mapped and unmapped
+	 * with kmap/kunmap when necessary and virt_to_page is used to get the
+	 * virtual address of the page. For arm64 (that keeps the high memory
+	 * mapped all the time), kmap is turned into a page_address call.
+
+	 * The issue is that with use of the page_address + virt_to_page
+	 * sequence the top byte value of the original pointer gets lost (gets
+	 * set to KASAN_TAG_KERNEL (0xFF)).
+	 */
+	if (tag == KASAN_TAG_KERNEL)
+		return;
+
+	untagged_addr = reset_tag((const void *)addr);
+	if (unlikely(untagged_addr <
+			kasan_shadow_to_mem((void *)KASAN_SHADOW_START))) {
+		kasan_report(addr, size, write, ret_ip);
+		return;
+	}
+	shadow_first = kasan_mem_to_shadow(untagged_addr);
+	shadow_last = kasan_mem_to_shadow(untagged_addr + size - 1);
+	for (shadow = shadow_first; shadow <= shadow_last; shadow++) {
+		if (*shadow != tag) {
+			kasan_report(addr, size, write, ret_ip);
+			return;
+		}
+	}
+}
+
+#define DEFINE_HWASAN_LOAD_STORE(size)					\
+	void __hwasan_load##size##_noabort(unsigned long addr)		\
+	{								\
+		check_memory_region(addr, size, false, _RET_IP_);	\
+	}								\
+	EXPORT_SYMBOL(__hwasan_load##size##_noabort);			\
+	void __hwasan_store##size##_noabort(unsigned long addr)		\
+	{								\
+		check_memory_region(addr, size, true, _RET_IP_);	\
+	}								\
+	EXPORT_SYMBOL(__hwasan_store##size##_noabort)
+
+DEFINE_HWASAN_LOAD_STORE(1);
+DEFINE_HWASAN_LOAD_STORE(2);
+DEFINE_HWASAN_LOAD_STORE(4);
+DEFINE_HWASAN_LOAD_STORE(8);
+DEFINE_HWASAN_LOAD_STORE(16);
+
+void __hwasan_loadN_noabort(unsigned long addr, unsigned long size)
+{
+	check_memory_region(addr, size, false, _RET_IP_);
+}
+EXPORT_SYMBOL(__hwasan_loadN_noabort);
+
+void __hwasan_storeN_noabort(unsigned long addr, unsigned long size)
+{
+	check_memory_region(addr, size, true, _RET_IP_);
+}
+EXPORT_SYMBOL(__hwasan_storeN_noabort);
+
+void __hwasan_tag_memory(unsigned long addr, u8 tag, unsigned long size)
+{
+	kasan_poison_shadow((void *)addr, size, tag);
+}
+EXPORT_SYMBOL(__hwasan_tag_memory);
diff --git a/mm/kasan/tags_report.c b/mm/kasan/tags_report.c
new file mode 100644
index 0000000..8eaf5f7
--- /dev/null
+++ b/mm/kasan/tags_report.c
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * This file contains tag-based KASAN specific error reporting code.
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Author: Andrey Ryabinin <ryabinin.a.a@gmail.com>
+ *
+ * Some code borrowed from https://github.com/xairy/kasan-prototype by
+ *        Andrey Konovalov <andreyknvl@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/bitops.h>
+#include <linux/ftrace.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/printk.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/stackdepot.h>
+#include <linux/stacktrace.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/kasan.h>
+#include <linux/module.h>
+
+#include <asm/sections.h>
+
+#include "kasan.h"
+#include "../slab.h"
+
+const char *get_bug_type(struct kasan_access_info *info)
+{
+	return "invalid-access";
+}
+
+void *find_first_bad_addr(void *addr, size_t size)
+{
+	u8 tag = get_tag(addr);
+	void *p = reset_tag(addr);
+	void *end = p + size;
+
+	while (p < end && tag == *(u8 *)kasan_mem_to_shadow(p))
+		p += KASAN_SHADOW_SCALE_SIZE;
+	return p;
+}
+
+void print_tags(u8 addr_tag, const void *addr)
+{
+	u8 *shadow = (u8 *)kasan_mem_to_shadow(addr);
+
+	pr_err("Pointer tag: [%02x], memory tag: [%02x]\n", addr_tag, *shadow);
+}
diff --git a/mm/madvise.c b/mm/madvise.c
index 71d21df..68a9626 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -138,7 +138,7 @@
 	pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);
 	*prev = vma_merge(mm, *prev, start, end, new_flags, vma->anon_vma,
 			  vma->vm_file, pgoff, vma_policy(vma),
-			  vma->vm_userfaultfd_ctx);
+			  vma->vm_userfaultfd_ctx, vma_get_anon_name(vma));
 	if (*prev) {
 		vma = *prev;
 		goto success;
@@ -808,6 +808,8 @@
 	size_t len;
 	struct blk_plug plug;
 
+	start = untagged_addr(start);
+
 	if (!madvise_behavior_valid(behavior))
 		return error;
 
diff --git a/mm/memblock.c b/mm/memblock.c
index bb4e32c..258a4f9 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -253,7 +253,8 @@
 	phys_addr_t kernel_end, ret;
 
 	/* pump up @end */
-	if (end == MEMBLOCK_ALLOC_ACCESSIBLE)
+	if (end == MEMBLOCK_ALLOC_ACCESSIBLE ||
+	    end == MEMBLOCK_ALLOC_KASAN)
 		end = memblock.current_limit;
 
 	/* avoid allocating the first page */
@@ -1401,13 +1402,15 @@
 done:
 	ptr = phys_to_virt(alloc);
 
-	/*
-	 * The min_count is set to 0 so that bootmem allocated blocks
-	 * are never reported as leaks. This is because many of these blocks
-	 * are only referred via the physical address which is not
-	 * looked up by kmemleak.
-	 */
-	kmemleak_alloc(ptr, size, 0, 0);
+	/* Skip kmemleak for kasan_init() due to high volume. */
+	if (max_addr != MEMBLOCK_ALLOC_KASAN)
+		/*
+		 * The min_count is set to 0 so that bootmem allocated
+		 * blocks are never reported as leaks. This is because many
+		 * of these blocks are only referred via the physical
+		 * address which is not looked up by kmemleak.
+		 */
+		kmemleak_alloc(ptr, size, 0, 0);
 
 	return ptr;
 }
diff --git a/mm/memfd.c b/mm/memfd.c
index 9e68a43..bd4a596 100644
--- a/mm/memfd.c
+++ b/mm/memfd.c
@@ -152,7 +152,8 @@
 #define F_ALL_SEALS (F_SEAL_SEAL | \
 		     F_SEAL_SHRINK | \
 		     F_SEAL_GROW | \
-		     F_SEAL_WRITE)
+		     F_SEAL_WRITE | \
+		     F_SEAL_FUTURE_WRITE)
 
 static int memfd_add_seals(struct file *file, unsigned int seals)
 {
diff --git a/mm/memory.c b/mm/memory.c
index bbf0cc4..d219df5 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -70,6 +70,8 @@
 #include <linux/dax.h>
 #include <linux/oom.h>
 
+#include <trace/events/kmem.h>
+
 #include <asm/io.h>
 #include <asm/mmu_context.h>
 #include <asm/pgalloc.h>
@@ -138,6 +140,22 @@
 }
 core_initcall(init_zero_pfn);
 
+/*
+ * Only trace rss_stat when there is a 512kb cross over.
+ * Smaller changes may be lost unless every small change is
+ * crossing into or returning to a 512kb boundary.
+ */
+#define TRACE_MM_COUNTER_THRESHOLD 128
+
+void mm_trace_rss_stat(struct mm_struct *mm, int member, long count,
+		       long value)
+{
+	long thresh_mask = ~(TRACE_MM_COUNTER_THRESHOLD - 1);
+
+	/* Threshold roll-over, trace it */
+	if ((count & thresh_mask) != ((count - value) & thresh_mask))
+		trace_rss_stat(mm, member, count);
+}
 
 #if defined(SPLIT_RSS_COUNTING)
 
@@ -2391,6 +2409,10 @@
 
 	vmf->flags = FAULT_FLAG_WRITE|FAULT_FLAG_MKWRITE;
 
+	if (vmf->vma->vm_file &&
+	    IS_SWAPFILE(vmf->vma->vm_file->f_mapping->host))
+		return VM_FAULT_SIGBUS;
+
 	ret = vmf->vma->vm_ops->page_mkwrite(vmf);
 	/* Restore original flags so that caller is not surprised */
 	vmf->flags = old_flags;
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index a4a1cab..69f8d44 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -760,7 +760,8 @@
 			((vmstart - vma->vm_start) >> PAGE_SHIFT);
 		prev = vma_merge(mm, prev, vmstart, vmend, vma->vm_flags,
 				 vma->anon_vma, vma->vm_file, pgoff,
-				 new_pol, vma->vm_userfaultfd_ctx);
+				 new_pol, vma->vm_userfaultfd_ctx,
+				 vma_get_anon_name(vma));
 		if (prev) {
 			vma = prev;
 			next = vma->vm_next;
@@ -1396,6 +1397,7 @@
 	int err;
 	unsigned short mode_flags;
 
+	start = untagged_addr(start);
 	mode_flags = mode & MPOL_MODE_FLAGS;
 	mode &= ~MPOL_MODE_FLAGS;
 	if (mode >= MPOL_MAX)
@@ -1553,6 +1555,8 @@
 	int uninitialized_var(pval);
 	nodemask_t nodes;
 
+	addr = untagged_addr(addr);
+
 	if (nmask != NULL && maxnode < nr_node_ids)
 		return -EINVAL;
 
diff --git a/mm/migrate.c b/mm/migrate.c
index 4d3588c..eb4bb2d 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -683,6 +683,8 @@
 		SetPageActive(newpage);
 	} else if (TestClearPageUnevictable(page))
 		SetPageUnevictable(newpage);
+	if (PageWorkingset(page))
+		SetPageWorkingset(newpage);
 	if (PageChecked(page))
 		SetPageChecked(newpage);
 	if (PageMappedToDisk(page))
@@ -1604,7 +1606,7 @@
 			goto out_flush;
 		if (get_user(node, nodes + i))
 			goto out_flush;
-		addr = (unsigned long)p;
+		addr = (unsigned long)untagged_addr(p);
 
 		err = -ENODEV;
 		if (node < 0 || node >= MAX_NUMNODES)
diff --git a/mm/mincore.c b/mm/mincore.c
index 2732c8c..7eb1491 100644
--- a/mm/mincore.c
+++ b/mm/mincore.c
@@ -249,6 +249,8 @@
 	unsigned long pages;
 	unsigned char *tmp;
 
+	start = untagged_addr(start);
+
 	/* Check the start address: needs to be page-aligned.. */
 	if (start & ~PAGE_MASK)
 		return -EINVAL;
diff --git a/mm/mlock.c b/mm/mlock.c
index 0ab8250..ef2abaf 100644
--- a/mm/mlock.c
+++ b/mm/mlock.c
@@ -535,7 +535,7 @@
 	pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);
 	*prev = vma_merge(mm, *prev, start, end, newflags, vma->anon_vma,
 			  vma->vm_file, pgoff, vma_policy(vma),
-			  vma->vm_userfaultfd_ctx);
+			  vma->vm_userfaultfd_ctx, vma_get_anon_name(vma));
 	if (*prev) {
 		vma = *prev;
 		goto success;
@@ -674,6 +674,8 @@
 	unsigned long lock_limit;
 	int error = -ENOMEM;
 
+	start = untagged_addr(start);
+
 	if (!can_do_mlock())
 		return -EPERM;
 
@@ -735,6 +737,8 @@
 {
 	int ret;
 
+	start = untagged_addr(start);
+
 	len = PAGE_ALIGN(len + (offset_in_page(start)));
 	start &= PAGE_MASK;
 
diff --git a/mm/mmap.c b/mm/mmap.c
index 1480880..ce7e5e7 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -199,6 +199,8 @@
 	bool populate;
 	LIST_HEAD(uf);
 
+	brk = untagged_addr(brk);
+
 	if (down_write_killable(&mm->mmap_sem))
 		return -EINTR;
 
@@ -983,7 +985,8 @@
  */
 static inline int is_mergeable_vma(struct vm_area_struct *vma,
 				struct file *file, unsigned long vm_flags,
-				struct vm_userfaultfd_ctx vm_userfaultfd_ctx)
+				struct vm_userfaultfd_ctx vm_userfaultfd_ctx,
+				const char __user *anon_name)
 {
 	/*
 	 * VM_SOFTDIRTY should not prevent from VMA merging, if we
@@ -1001,6 +1004,8 @@
 		return 0;
 	if (!is_mergeable_vm_userfaultfd_ctx(vma, vm_userfaultfd_ctx))
 		return 0;
+	if (vma_get_anon_name(vma) != anon_name)
+		return 0;
 	return 1;
 }
 
@@ -1033,9 +1038,10 @@
 can_vma_merge_before(struct vm_area_struct *vma, unsigned long vm_flags,
 		     struct anon_vma *anon_vma, struct file *file,
 		     pgoff_t vm_pgoff,
-		     struct vm_userfaultfd_ctx vm_userfaultfd_ctx)
+		     struct vm_userfaultfd_ctx vm_userfaultfd_ctx,
+		     const char __user *anon_name)
 {
-	if (is_mergeable_vma(vma, file, vm_flags, vm_userfaultfd_ctx) &&
+	if (is_mergeable_vma(vma, file, vm_flags, vm_userfaultfd_ctx, anon_name) &&
 	    is_mergeable_anon_vma(anon_vma, vma->anon_vma, vma)) {
 		if (vma->vm_pgoff == vm_pgoff)
 			return 1;
@@ -1054,9 +1060,10 @@
 can_vma_merge_after(struct vm_area_struct *vma, unsigned long vm_flags,
 		    struct anon_vma *anon_vma, struct file *file,
 		    pgoff_t vm_pgoff,
-		    struct vm_userfaultfd_ctx vm_userfaultfd_ctx)
+		    struct vm_userfaultfd_ctx vm_userfaultfd_ctx,
+		    const char __user *anon_name)
 {
-	if (is_mergeable_vma(vma, file, vm_flags, vm_userfaultfd_ctx) &&
+	if (is_mergeable_vma(vma, file, vm_flags, vm_userfaultfd_ctx, anon_name) &&
 	    is_mergeable_anon_vma(anon_vma, vma->anon_vma, vma)) {
 		pgoff_t vm_pglen;
 		vm_pglen = vma_pages(vma);
@@ -1067,9 +1074,9 @@
 }
 
 /*
- * Given a mapping request (addr,end,vm_flags,file,pgoff), figure out
- * whether that can be merged with its predecessor or its successor.
- * Or both (it neatly fills a hole).
+ * Given a mapping request (addr,end,vm_flags,file,pgoff,anon_name),
+ * figure out whether that can be merged with its predecessor or its
+ * successor.  Or both (it neatly fills a hole).
  *
  * In most cases - when called for mmap, brk or mremap - [addr,end) is
  * certain not to be mapped by the time vma_merge is called; but when
@@ -1111,7 +1118,8 @@
 			unsigned long end, unsigned long vm_flags,
 			struct anon_vma *anon_vma, struct file *file,
 			pgoff_t pgoff, struct mempolicy *policy,
-			struct vm_userfaultfd_ctx vm_userfaultfd_ctx)
+			struct vm_userfaultfd_ctx vm_userfaultfd_ctx,
+			const char __user *anon_name)
 {
 	pgoff_t pglen = (end - addr) >> PAGE_SHIFT;
 	struct vm_area_struct *area, *next;
@@ -1144,7 +1152,8 @@
 			mpol_equal(vma_policy(prev), policy) &&
 			can_vma_merge_after(prev, vm_flags,
 					    anon_vma, file, pgoff,
-					    vm_userfaultfd_ctx)) {
+					    vm_userfaultfd_ctx,
+					    anon_name)) {
 		/*
 		 * OK, it can.  Can we now merge in the successor as well?
 		 */
@@ -1153,7 +1162,8 @@
 				can_vma_merge_before(next, vm_flags,
 						     anon_vma, file,
 						     pgoff+pglen,
-						     vm_userfaultfd_ctx) &&
+						     vm_userfaultfd_ctx,
+						     anon_name) &&
 				is_mergeable_anon_vma(prev->anon_vma,
 						      next->anon_vma, NULL)) {
 							/* cases 1, 6 */
@@ -1176,7 +1186,8 @@
 			mpol_equal(policy, vma_policy(next)) &&
 			can_vma_merge_before(next, vm_flags,
 					     anon_vma, file, pgoff+pglen,
-					     vm_userfaultfd_ctx)) {
+					     vm_userfaultfd_ctx,
+					     anon_name)) {
 		if (prev && addr < prev->vm_end)	/* case 4 */
 			err = __vma_adjust(prev, prev->vm_start,
 					 addr, prev->vm_pgoff, NULL, next);
@@ -1458,8 +1469,12 @@
 		case MAP_SHARED_VALIDATE:
 			if (flags & ~flags_mask)
 				return -EOPNOTSUPP;
-			if ((prot&PROT_WRITE) && !(file->f_mode&FMODE_WRITE))
-				return -EACCES;
+			if (prot & PROT_WRITE) {
+				if (!(file->f_mode & FMODE_WRITE))
+					return -EACCES;
+				if (IS_SWAPFILE(file->f_mapping->host))
+					return -ETXTBSY;
+			}
 
 			/*
 			 * Make sure we don't allow writing to an append-only
@@ -1548,6 +1563,8 @@
 	struct file *file = NULL;
 	unsigned long retval;
 
+	addr = untagged_addr(addr);
+
 	if (!(flags & MAP_ANONYMOUS)) {
 		audit_mmap_fd(fd, flags);
 		file = fget(fd);
@@ -1721,7 +1738,7 @@
 	 * Can we just expand an old mapping?
 	 */
 	vma = vma_merge(mm, prev, addr, addr + len, vm_flags,
-			NULL, file, pgoff, NULL, NULL_VM_UFFD_CTX);
+			NULL, file, pgoff, NULL, NULL_VM_UFFD_CTX, NULL);
 	if (vma)
 		goto out;
 
@@ -2810,6 +2827,7 @@
 
 SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
 {
+	addr = untagged_addr(addr);
 	profile_munmap(addr);
 	return vm_munmap(addr, len);
 }
@@ -2977,7 +2995,7 @@
 
 	/* Can we just expand an old private anonymous mapping? */
 	vma = vma_merge(mm, prev, addr, addr + len, flags,
-			NULL, NULL, pgoff, NULL, NULL_VM_UFFD_CTX);
+			NULL, NULL, pgoff, NULL, NULL_VM_UFFD_CTX, NULL);
 	if (vma)
 		goto out;
 
@@ -3175,7 +3193,7 @@
 		return NULL;	/* should never get here */
 	new_vma = vma_merge(mm, prev, addr, addr + len, vma->vm_flags,
 			    vma->anon_vma, vma->vm_file, pgoff, vma_policy(vma),
-			    vma->vm_userfaultfd_ctx);
+			    vma->vm_userfaultfd_ctx, vma_get_anon_name(vma));
 	if (new_vma) {
 		/*
 		 * Source vma may have been merged into new_vma
diff --git a/mm/mprotect.c b/mm/mprotect.c
index 6d33162..cb18995 100644
--- a/mm/mprotect.c
+++ b/mm/mprotect.c
@@ -398,7 +398,7 @@
 	pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);
 	*pprev = vma_merge(mm, *pprev, start, end, newflags,
 			   vma->anon_vma, vma->vm_file, pgoff, vma_policy(vma),
-			   vma->vm_userfaultfd_ctx);
+			   vma->vm_userfaultfd_ctx, vma_get_anon_name(vma));
 	if (*pprev) {
 		vma = *pprev;
 		VM_WARN_ON((vma->vm_flags ^ newflags) & ~VM_SOFTDIRTY);
@@ -463,6 +463,8 @@
 	const bool rier = (current->personality & READ_IMPLIES_EXEC) &&
 				(prot & PROT_READ);
 
+	start = untagged_addr(start);
+
 	prot &= ~(PROT_GROWSDOWN|PROT_GROWSUP);
 	if (grows == (PROT_GROWSDOWN|PROT_GROWSUP)) /* can't be both */
 		return -EINVAL;
diff --git a/mm/mremap.c b/mm/mremap.c
index a9617e7..3c0bcf6 100644
--- a/mm/mremap.c
+++ b/mm/mremap.c
@@ -525,6 +525,9 @@
 	LIST_HEAD(uf_unmap_early);
 	LIST_HEAD(uf_unmap);
 
+	addr = untagged_addr(addr);
+	new_addr = untagged_addr(new_addr);
+
 	if (flags & ~(MREMAP_FIXED | MREMAP_MAYMOVE))
 		return ret;
 
diff --git a/mm/msync.c b/mm/msync.c
index ef30a42..c3bd3e7 100644
--- a/mm/msync.c
+++ b/mm/msync.c
@@ -37,6 +37,8 @@
 	int unmapped_error = 0;
 	int error = -EINVAL;
 
+	start = untagged_addr(start);
+
 	if (flags & ~(MS_ASYNC | MS_INVALIDATE | MS_SYNC))
 		goto out;
 	if (offset_in_page(start))
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 74fb5c3..e1908ee 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -66,6 +66,7 @@
 #include <linux/ftrace.h>
 #include <linux/lockdep.h>
 #include <linux/nmi.h>
+#include <linux/psi.h>
 
 #include <asm/sections.h>
 #include <asm/tlbflush.h>
@@ -130,6 +131,55 @@
 
 int percpu_pagelist_fraction;
 gfp_t gfp_allowed_mask __read_mostly = GFP_BOOT_MASK;
+#ifdef CONFIG_INIT_ON_ALLOC_DEFAULT_ON
+DEFINE_STATIC_KEY_TRUE(init_on_alloc);
+#else
+DEFINE_STATIC_KEY_FALSE(init_on_alloc);
+#endif
+EXPORT_SYMBOL(init_on_alloc);
+
+#ifdef CONFIG_INIT_ON_FREE_DEFAULT_ON
+DEFINE_STATIC_KEY_TRUE(init_on_free);
+#else
+DEFINE_STATIC_KEY_FALSE(init_on_free);
+#endif
+EXPORT_SYMBOL(init_on_free);
+
+static int __init early_init_on_alloc(char *buf)
+{
+	int ret;
+	bool bool_result;
+
+	if (!buf)
+		return -EINVAL;
+	ret = kstrtobool(buf, &bool_result);
+	if (bool_result && page_poisoning_enabled())
+		pr_info("mem auto-init: CONFIG_PAGE_POISONING is on, will take precedence over init_on_alloc\n");
+	if (bool_result)
+		static_branch_enable(&init_on_alloc);
+	else
+		static_branch_disable(&init_on_alloc);
+	return ret;
+}
+early_param("init_on_alloc", early_init_on_alloc);
+
+static int __init early_init_on_free(char *buf)
+{
+	int ret;
+	bool bool_result;
+
+	if (!buf)
+		return -EINVAL;
+	ret = kstrtobool(buf, &bool_result);
+	if (bool_result && page_poisoning_enabled())
+		pr_info("mem auto-init: CONFIG_PAGE_POISONING is on, will take precedence over init_on_free\n");
+	if (bool_result)
+		static_branch_enable(&init_on_free);
+	else
+		static_branch_disable(&init_on_free);
+	return ret;
+}
+early_param("init_on_free", early_init_on_free);
 
 /*
  * A cached value of the page's pageblock's migratetype, used when the page is
@@ -261,10 +311,22 @@
 #endif
 };
 
+/*
+ * Try to keep at least this much lowmem free.  Do not allow normal
+ * allocations below this point, only high priority ones. Automatically
+ * tuned according to the amount of memory in the system.
+ */
 int min_free_kbytes = 1024;
 int user_min_free_kbytes = -1;
 int watermark_scale_factor = 10;
 
+/*
+ * Extra memory for the system to try freeing. Used to temporarily
+ * free memory, to make space for new workloads. Anyone can allocate
+ * down to the min watermarks controlled by min_free_kbytes above.
+ */
+int extra_free_kbytes = 0;
+
 static unsigned long nr_kernel_pages __meminitdata;
 static unsigned long nr_all_pages __meminitdata;
 static unsigned long dma_reserve __meminitdata;
@@ -1005,6 +1067,14 @@
 	return ret;
 }
 
+static void kernel_init_free_pages(struct page *page, int numpages)
+{
+	int i;
+
+	for (i = 0; i < numpages; i++)
+		clear_highpage(page + i);
+}
+
 static __always_inline bool free_pages_prepare(struct page *page,
 					unsigned int order, bool check_free)
 {
@@ -1056,6 +1126,9 @@
 					   PAGE_SIZE << order);
 	}
 	arch_free_page(page, order);
+	if (want_init_on_free())
+		kernel_init_free_pages(page, 1 << order);
+
 	kernel_poison_pages(page, 1 << order, 0);
 	kernel_map_pages(page, 1 << order, 0);
 	kasan_free_nondeferred_pages(page, order);
@@ -1204,6 +1277,7 @@
 	init_page_count(page);
 	page_mapcount_reset(page);
 	page_cpupid_reset_last(page);
+	page_kasan_tag_reset(page);
 
 	INIT_LIST_HEAD(&page->lru);
 #ifdef WANT_PAGE_VIRTUAL
@@ -1884,8 +1958,8 @@
 
 static inline bool free_pages_prezeroed(void)
 {
-	return IS_ENABLED(CONFIG_PAGE_POISONING_ZERO) &&
-		page_poisoning_enabled();
+	return (IS_ENABLED(CONFIG_PAGE_POISONING_ZERO) &&
+		page_poisoning_enabled()) || want_init_on_free();
 }
 
 #ifdef CONFIG_DEBUG_VM
@@ -1938,13 +2012,10 @@
 static void prep_new_page(struct page *page, unsigned int order, gfp_t gfp_flags,
 							unsigned int alloc_flags)
 {
-	int i;
-
 	post_alloc_hook(page, order, gfp_flags);
 
-	if (!free_pages_prezeroed() && (gfp_flags & __GFP_ZERO))
-		for (i = 0; i < (1 << order); i++)
-			clear_highpage(page + i);
+	if (!free_pages_prezeroed() && want_init_on_alloc(gfp_flags))
+		kernel_init_free_pages(page, 1 << order);
 
 	if (order && (gfp_flags & __GFP_COMP))
 		prep_compound_page(page, order);
@@ -3578,15 +3649,20 @@
 		enum compact_priority prio, enum compact_result *compact_result)
 {
 	struct page *page;
+	unsigned long pflags;
 	unsigned int noreclaim_flag;
 
 	if (!order)
 		return NULL;
 
+	psi_memstall_enter(&pflags);
 	noreclaim_flag = memalloc_noreclaim_save();
+
 	*compact_result = try_to_compact_pages(gfp_mask, order, alloc_flags, ac,
 									prio);
+
 	memalloc_noreclaim_restore(noreclaim_flag);
+	psi_memstall_leave(&pflags);
 
 	if (*compact_result <= COMPACT_INACTIVE)
 		return NULL;
@@ -3785,11 +3861,13 @@
 	struct reclaim_state reclaim_state;
 	int progress;
 	unsigned int noreclaim_flag;
+	unsigned long pflags;
 
 	cond_resched();
 
 	/* We now go into synchronous reclaim */
 	cpuset_memory_pressure_bump();
+	psi_memstall_enter(&pflags);
 	fs_reclaim_acquire(gfp_mask);
 	noreclaim_flag = memalloc_noreclaim_save();
 	reclaim_state.reclaimed_slab = 0;
@@ -3801,6 +3879,7 @@
 	current->reclaim_state = NULL;
 	memalloc_noreclaim_restore(noreclaim_flag);
 	fs_reclaim_release(gfp_mask);
+	psi_memstall_leave(&pflags);
 
 	cond_resched();
 
@@ -4725,6 +4804,7 @@
 	unsigned long pagecache;
 	unsigned long wmark_low = 0;
 	unsigned long pages[NR_LRU_LISTS];
+	unsigned long reclaimable;
 	struct zone *zone;
 	int lru;
 
@@ -4750,19 +4830,13 @@
 	available += pagecache;
 
 	/*
-	 * Part of the reclaimable slab consists of items that are in use,
-	 * and cannot be freed. Cap this estimate at the low watermark.
+	 * Part of the reclaimable slab and other kernel memory consists of
+	 * items that are in use, and cannot be freed. Cap this estimate at the
+	 * low watermark.
 	 */
-	available += global_node_page_state(NR_SLAB_RECLAIMABLE) -
-		     min(global_node_page_state(NR_SLAB_RECLAIMABLE) / 2,
-			 wmark_low);
-
-	/*
-	 * Part of the kernel memory, which can be released under memory
-	 * pressure.
-	 */
-	available += global_node_page_state(NR_INDIRECTLY_RECLAIMABLE_BYTES) >>
-		PAGE_SHIFT;
+	reclaimable = global_node_page_state(NR_SLAB_RECLAIMABLE) +
+			global_node_page_state(NR_KERNEL_MISC_RECLAIMABLE);
+	available += reclaimable - min(reclaimable / 2, wmark_low);
 
 	if (available < 0)
 		available = 0;
@@ -4991,6 +5065,9 @@
 			" managed:%lukB"
 			" mlocked:%lukB"
 			" kernel_stack:%lukB"
+#ifdef CONFIG_SHADOW_CALL_STACK
+			" shadow_call_stack:%lukB"
+#endif
 			" pagetables:%lukB"
 			" bounce:%lukB"
 			" free_pcp:%lukB"
@@ -5012,6 +5089,9 @@
 			K(zone->managed_pages),
 			K(zone_page_state(zone, NR_MLOCK)),
 			zone_page_state(zone, NR_KERNEL_STACK_KB),
+#ifdef CONFIG_SHADOW_CALL_STACK
+			zone_page_state(zone, NR_KERNEL_SCS_BYTES) / 1024,
+#endif
 			K(zone_page_state(zone, NR_PAGETABLE)),
 			K(zone_page_state(zone, NR_BOUNCE)),
 			K(free_pcp),
@@ -7242,6 +7322,7 @@
 static void __setup_per_zone_wmarks(void)
 {
 	unsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);
+	unsigned long pages_low = extra_free_kbytes >> (PAGE_SHIFT - 10);
 	unsigned long lowmem_pages = 0;
 	struct zone *zone;
 	unsigned long flags;
@@ -7253,11 +7334,14 @@
 	}
 
 	for_each_zone(zone) {
-		u64 tmp;
+		u64 min, low;
 
 		spin_lock_irqsave(&zone->lock, flags);
-		tmp = (u64)pages_min * zone->managed_pages;
-		do_div(tmp, lowmem_pages);
+		min = (u64)pages_min * zone->managed_pages;
+		do_div(min, lowmem_pages);
+		low = (u64)pages_low * zone->managed_pages;
+		do_div(low, vm_total_pages);
+
 		if (is_highmem(zone)) {
 			/*
 			 * __GFP_HIGH and PF_MEMALLOC allocations usually don't
@@ -7278,7 +7362,7 @@
 			 * If it's a lowmem zone, reserve a number of pages
 			 * proportionate to the zone's size.
 			 */
-			zone->watermark[WMARK_MIN] = tmp;
+			zone->watermark[WMARK_MIN] = min;
 		}
 
 		/*
@@ -7286,12 +7370,14 @@
 		 * scale factor in proportion to available memory, but
 		 * ensure a minimum size on small systems.
 		 */
-		tmp = max_t(u64, tmp >> 2,
+		min = max_t(u64, min >> 2,
 			    mult_frac(zone->managed_pages,
 				      watermark_scale_factor, 10000));
 
-		zone->watermark[WMARK_LOW]  = min_wmark_pages(zone) + tmp;
-		zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + tmp * 2;
+		zone->watermark[WMARK_LOW]  = min_wmark_pages(zone) +
+					low + min;
+		zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) +
+					low + min * 2;
 
 		spin_unlock_irqrestore(&zone->lock, flags);
 	}
@@ -7374,7 +7460,7 @@
 /*
  * min_free_kbytes_sysctl_handler - just a wrapper around proc_dointvec() so
  *	that we can call two helper functions whenever min_free_kbytes
- *	changes.
+ *	or extra_free_kbytes changes.
  */
 int min_free_kbytes_sysctl_handler(struct ctl_table *table, int write,
 	void __user *buffer, size_t *length, loff_t *ppos)
diff --git a/mm/page_poison.c b/mm/page_poison.c
index 6cfa8e7..1f362e6 100644
--- a/mm/page_poison.c
+++ b/mm/page_poison.c
@@ -18,6 +18,11 @@
 }
 early_param("page_poison", early_page_poison_param);
 
+/**
+ * page_poisoning_enabled - check if page poisoning is enabled
+ *
+ * Return true if page poisoning is enabled, or false if not.
+ */
 bool page_poisoning_enabled(void)
 {
 	/*
@@ -30,6 +35,7 @@
 		(!IS_ENABLED(CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC) &&
 		debug_pagealloc_enabled()));
 }
+EXPORT_SYMBOL_GPL(page_poisoning_enabled);
 
 static void poison_page(struct page *page)
 {
diff --git a/mm/shmem.c b/mm/shmem.c
index 650ef56..b1032d5 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2169,6 +2169,24 @@
 
 static int shmem_mmap(struct file *file, struct vm_area_struct *vma)
 {
+	struct shmem_inode_info *info = SHMEM_I(file_inode(file));
+
+	if (info->seals & F_SEAL_FUTURE_WRITE) {
+		/*
+		 * New PROT_WRITE and MAP_SHARED mmaps are not allowed when
+		 * "future write" seal active.
+		 */
+		if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_WRITE))
+			return -EPERM;
+
+		/*
+		 * Since the F_SEAL_FUTURE_WRITE seals allow for a MAP_SHARED
+		 * read-only mapping, take care to not allow mprotect to revert
+		 * protections.
+		 */
+		vma->vm_flags &= ~(VM_MAYWRITE);
+	}
+
 	file_accessed(file);
 	vma->vm_ops = &shmem_vm_ops;
 	if (IS_ENABLED(CONFIG_TRANSPARENT_HUGE_PAGECACHE) &&
@@ -2422,8 +2440,9 @@
 	pgoff_t index = pos >> PAGE_SHIFT;
 
 	/* i_mutex is held by caller */
-	if (unlikely(info->seals & (F_SEAL_WRITE | F_SEAL_GROW))) {
-		if (info->seals & F_SEAL_WRITE)
+	if (unlikely(info->seals & (F_SEAL_GROW |
+				   F_SEAL_WRITE | F_SEAL_FUTURE_WRITE))) {
+		if (info->seals & (F_SEAL_WRITE | F_SEAL_FUTURE_WRITE))
 			return -EPERM;
 		if ((info->seals & F_SEAL_GROW) && pos + len > inode->i_size)
 			return -EPERM;
@@ -2686,7 +2705,7 @@
 		DECLARE_WAIT_QUEUE_HEAD_ONSTACK(shmem_falloc_waitq);
 
 		/* protected by i_mutex */
-		if (info->seals & F_SEAL_WRITE) {
+		if (info->seals & (F_SEAL_WRITE | F_SEAL_FUTURE_WRITE)) {
 			error = -EPERM;
 			goto out;
 		}
diff --git a/mm/slab.c b/mm/slab.c
index 46f21e7..fa53bb0 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -406,19 +406,6 @@
 	return page->s_mem + cache->size * idx;
 }
 
-/*
- * We want to avoid an expensive divide : (offset / cache->size)
- *   Using the fact that size is a constant for a particular cache,
- *   we can replace (offset / cache->size) by
- *   reciprocal_divide(offset, cache->reciprocal_buffer_size)
- */
-static inline unsigned int obj_to_index(const struct kmem_cache *cache,
-					const struct page *page, void *obj)
-{
-	u32 offset = (obj - page->s_mem);
-	return reciprocal_divide(offset, cache->reciprocal_buffer_size);
-}
-
 #define BOOT_CPUCACHE_ENTRIES	1
 /* internal cache of cache description objs */
 static struct kmem_cache kmem_cache_boot = {
@@ -1291,7 +1278,7 @@
 	 * Initialize the caches that provide memory for the  kmem_cache_node
 	 * structures first.  Without this, further allocations will bug.
 	 */
-	kmalloc_caches[INDEX_NODE] = create_kmalloc_cache(
+	kmalloc_caches[KMALLOC_NORMAL][INDEX_NODE] = create_kmalloc_cache(
 				kmalloc_info[INDEX_NODE].name,
 				kmalloc_size(INDEX_NODE), ARCH_KMALLOC_FLAGS,
 				0, kmalloc_size(INDEX_NODE));
@@ -1307,7 +1294,7 @@
 		for_each_online_node(nid) {
 			init_list(kmem_cache, &init_kmem_cache_node[CACHE_CACHE + nid], nid);
 
-			init_list(kmalloc_caches[INDEX_NODE],
+			init_list(kmalloc_caches[KMALLOC_NORMAL][INDEX_NODE],
 					  &init_kmem_cache_node[SIZE_NODE + nid], nid);
 		}
 	}
@@ -1903,6 +1890,14 @@
 
 	cachep->num = 0;
 
+	/*
+	 * If slab auto-initialization on free is enabled, store the freelist
+	 * off-slab, so that its contents don't end up in one of the allocated
+	 * objects.
+	 */
+	if (unlikely(slab_want_init_on_free(cachep)))
+		return false;
+
 	if (cachep->ctor || flags & SLAB_TYPESAFE_BY_RCU)
 		return false;
 
@@ -2384,6 +2379,7 @@
 		/* Slab management obj is off-slab. */
 		freelist = kmem_cache_alloc_node(cachep->freelist_cache,
 					      local_flags, nodeid);
+		freelist = kasan_reset_tag(freelist);
 		if (!freelist)
 			return NULL;
 	} else {
@@ -2579,7 +2575,7 @@
 
 	for (i = 0; i < cachep->num; i++) {
 		objp = index_to_obj(cachep, page, i);
-		kasan_init_slab_obj(cachep, objp);
+		objp = kasan_init_slab_obj(cachep, objp);
 
 		/* constructor could break poison info */
 		if (DEBUG == 0 && cachep->ctor) {
@@ -2697,6 +2693,13 @@
 
 	offset *= cachep->colour_off;
 
+	/*
+	 * Call kasan_poison_slab() before calling alloc_slabmgmt(), so
+	 * page_address() in the latter returns a non-tagged pointer,
+	 * as it should be for slab pages.
+	 */
+	kasan_poison_slab(page);
+
 	/* Get slab management. */
 	freelist = alloc_slabmgmt(cachep, page, offset,
 			local_flags & ~GFP_CONSTRAINT_MASK, page_node);
@@ -2705,7 +2708,6 @@
 
 	slab_map_pages(cachep, page, freelist);
 
-	kasan_poison_slab(page);
 	cache_init_objs(cachep, page);
 
 	if (gfpflags_allow_blocking(local_flags))
@@ -3334,7 +3336,7 @@
 	local_irq_restore(save_flags);
 	ptr = cache_alloc_debugcheck_after(cachep, flags, ptr, caller);
 
-	if (unlikely(flags & __GFP_ZERO) && ptr)
+	if (unlikely(slab_want_init_on_alloc(flags, cachep)) && ptr)
 		memset(ptr, 0, cachep->object_size);
 
 	slab_post_alloc_hook(cachep, flags, 1, &ptr);
@@ -3391,7 +3393,7 @@
 	objp = cache_alloc_debugcheck_after(cachep, flags, objp, caller);
 	prefetchw(objp);
 
-	if (unlikely(flags & __GFP_ZERO) && objp)
+	if (unlikely(slab_want_init_on_alloc(flags, cachep)) && objp)
 		memset(objp, 0, cachep->object_size);
 
 	slab_post_alloc_hook(cachep, flags, 1, &objp);
@@ -3512,6 +3514,8 @@
 	struct array_cache *ac = cpu_cache_get(cachep);
 
 	check_irq_off();
+	if (unlikely(slab_want_init_on_free(cachep)))
+		memset(objp, 0, cachep->object_size);
 	kmemleak_free_recursive(objp, cachep->flags);
 	objp = cache_free_debugcheck(cachep, objp, caller);
 
@@ -3556,7 +3560,6 @@
 {
 	void *ret = slab_alloc(cachep, flags, _RET_IP_);
 
-	kasan_slab_alloc(cachep, ret, flags);
 	trace_kmem_cache_alloc(_RET_IP_, ret,
 			       cachep->object_size, cachep->size, flags);
 
@@ -3598,7 +3601,7 @@
 	cache_alloc_debugcheck_after_bulk(s, flags, size, p, _RET_IP_);
 
 	/* Clear memory outside IRQ disabled section */
-	if (unlikely(flags & __GFP_ZERO))
+	if (unlikely(slab_want_init_on_alloc(flags, s)))
 		for (i = 0; i < size; i++)
 			memset(p[i], 0, s->object_size);
 
@@ -3622,7 +3625,7 @@
 
 	ret = slab_alloc(cachep, flags, _RET_IP_);
 
-	kasan_kmalloc(cachep, ret, size, flags);
+	ret = kasan_kmalloc(cachep, ret, size, flags);
 	trace_kmalloc(_RET_IP_, ret,
 		      size, cachep->size, flags);
 	return ret;
@@ -3646,7 +3649,6 @@
 {
 	void *ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP_);
 
-	kasan_slab_alloc(cachep, ret, flags);
 	trace_kmem_cache_alloc_node(_RET_IP_, ret,
 				    cachep->object_size, cachep->size,
 				    flags, nodeid);
@@ -3665,7 +3667,7 @@
 
 	ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP_);
 
-	kasan_kmalloc(cachep, ret, size, flags);
+	ret = kasan_kmalloc(cachep, ret, size, flags);
 	trace_kmalloc_node(_RET_IP_, ret,
 			   size, cachep->size,
 			   flags, nodeid);
@@ -3686,7 +3688,7 @@
 	if (unlikely(ZERO_OR_NULL_PTR(cachep)))
 		return cachep;
 	ret = kmem_cache_alloc_node_trace(cachep, flags, node, size);
-	kasan_kmalloc(cachep, ret, size, flags);
+	ret = kasan_kmalloc(cachep, ret, size, flags);
 
 	return ret;
 }
@@ -3724,7 +3726,7 @@
 		return cachep;
 	ret = slab_alloc(cachep, flags, caller);
 
-	kasan_kmalloc(cachep, ret, size, flags);
+	ret = kasan_kmalloc(cachep, ret, size, flags);
 	trace_kmalloc(caller, ret,
 		      size, cachep->size, flags);
 
@@ -4429,6 +4431,8 @@
 	unsigned int objnr;
 	unsigned long offset;
 
+	ptr = kasan_reset_tag(ptr);
+
 	/* Find and validate object. */
 	cachep = page->slab_cache;
 	objnr = obj_to_index(cachep, page, (void *)ptr);
diff --git a/mm/slab.h b/mm/slab.h
index 9632772..803b124 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -438,11 +438,9 @@
 
 	flags &= gfp_allowed_mask;
 	for (i = 0; i < size; i++) {
-		void *object = p[i];
-
-		kmemleak_alloc_recursive(object, s->object_size, 1,
+		p[i] = kasan_slab_alloc(s, p[i], flags);
+		kmemleak_alloc_recursive(p[i], s->object_size, 1,
 					 s->flags, flags);
-		kasan_slab_alloc(s, object, flags);
 	}
 
 	if (memcg_kmem_enabled())
@@ -529,4 +527,24 @@
 static inline void cache_random_seq_destroy(struct kmem_cache *cachep) { }
 #endif /* CONFIG_SLAB_FREELIST_RANDOM */
 
+static inline bool slab_want_init_on_alloc(gfp_t flags, struct kmem_cache *c)
+{
+	if (static_branch_unlikely(&init_on_alloc)) {
+		if (c->ctor)
+			return false;
+		if (c->flags & (SLAB_TYPESAFE_BY_RCU | SLAB_POISON))
+			return flags & __GFP_ZERO;
+		return true;
+	}
+	return flags & __GFP_ZERO;
+}
+
+static inline bool slab_want_init_on_free(struct kmem_cache *c)
+{
+	if (static_branch_unlikely(&init_on_free))
+		return !(c->ctor ||
+			 (c->flags & (SLAB_TYPESAFE_BY_RCU | SLAB_POISON)));
+	return false;
+}
+
 #endif /* MM_SLAB_H */
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 4d3c2e7..c6dbda5 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -973,14 +973,10 @@
 	return s;
 }
 
-struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH + 1] __ro_after_init;
+struct kmem_cache *
+kmalloc_caches[NR_KMALLOC_TYPES][KMALLOC_SHIFT_HIGH + 1] __ro_after_init;
 EXPORT_SYMBOL(kmalloc_caches);
 
-#ifdef CONFIG_ZONE_DMA
-struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH + 1] __ro_after_init;
-EXPORT_SYMBOL(kmalloc_dma_caches);
-#endif
-
 /*
  * Conversion table for small slabs sizes / 8 to the index in the
  * kmalloc array. This is necessary for slabs < 192 since we have non power
@@ -1040,12 +1036,7 @@
 		index = fls(size - 1);
 	}
 
-#ifdef CONFIG_ZONE_DMA
-	if (unlikely((flags & GFP_DMA)))
-		return kmalloc_dma_caches[index];
-
-#endif
-	return kmalloc_caches[index];
+	return kmalloc_caches[kmalloc_type(flags)][index];
 }
 
 /*
@@ -1059,15 +1050,15 @@
 	{"kmalloc-16",             16},		{"kmalloc-32",             32},
 	{"kmalloc-64",             64},		{"kmalloc-128",           128},
 	{"kmalloc-256",           256},		{"kmalloc-512",           512},
-	{"kmalloc-1024",         1024},		{"kmalloc-2048",         2048},
-	{"kmalloc-4096",         4096},		{"kmalloc-8192",         8192},
-	{"kmalloc-16384",       16384},		{"kmalloc-32768",       32768},
-	{"kmalloc-65536",       65536},		{"kmalloc-131072",     131072},
-	{"kmalloc-262144",     262144},		{"kmalloc-524288",     524288},
-	{"kmalloc-1048576",   1048576},		{"kmalloc-2097152",   2097152},
-	{"kmalloc-4194304",   4194304},		{"kmalloc-8388608",   8388608},
-	{"kmalloc-16777216", 16777216},		{"kmalloc-33554432", 33554432},
-	{"kmalloc-67108864", 67108864}
+	{"kmalloc-1k",           1024},		{"kmalloc-2k",           2048},
+	{"kmalloc-4k",           4096},		{"kmalloc-8k",           8192},
+	{"kmalloc-16k",         16384},		{"kmalloc-32k",         32768},
+	{"kmalloc-64k",         65536},		{"kmalloc-128k",       131072},
+	{"kmalloc-256k",       262144},		{"kmalloc-512k",       524288},
+	{"kmalloc-1M",        1048576},		{"kmalloc-2M",        2097152},
+	{"kmalloc-4M",        4194304},		{"kmalloc-8M",        8388608},
+	{"kmalloc-16M",      16777216},		{"kmalloc-32M",      33554432},
+	{"kmalloc-64M",      67108864}
 };
 
 /*
@@ -1117,9 +1108,36 @@
 	}
 }
 
-static void __init new_kmalloc_cache(int idx, slab_flags_t flags)
+static const char *
+kmalloc_cache_name(const char *prefix, unsigned int size)
 {
-	kmalloc_caches[idx] = create_kmalloc_cache(kmalloc_info[idx].name,
+
+	static const char units[3] = "\0kM";
+	int idx = 0;
+
+	while (size >= 1024 && (size % 1024 == 0)) {
+		size /= 1024;
+		idx++;
+	}
+
+	return kasprintf(GFP_NOWAIT, "%s-%u%c", prefix, size, units[idx]);
+}
+
+static void __init
+new_kmalloc_cache(int idx, int type, slab_flags_t flags)
+{
+	const char *name;
+
+	if (type == KMALLOC_RECLAIM) {
+		flags |= SLAB_RECLAIM_ACCOUNT;
+		name = kmalloc_cache_name("kmalloc-rcl",
+						kmalloc_info[idx].size);
+		BUG_ON(!name);
+	} else {
+		name = kmalloc_info[idx].name;
+	}
+
+	kmalloc_caches[type][idx] = create_kmalloc_cache(name,
 					kmalloc_info[idx].size, flags, 0,
 					kmalloc_info[idx].size);
 }
@@ -1131,21 +1149,25 @@
  */
 void __init create_kmalloc_caches(slab_flags_t flags)
 {
-	int i;
+	int i, type;
 
-	for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) {
-		if (!kmalloc_caches[i])
-			new_kmalloc_cache(i, flags);
+	for (type = KMALLOC_NORMAL; type <= KMALLOC_RECLAIM; type++) {
+		for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) {
+			if (!kmalloc_caches[type][i])
+				new_kmalloc_cache(i, type, flags);
 
-		/*
-		 * Caches that are not of the two-to-the-power-of size.
-		 * These have to be created immediately after the
-		 * earlier power of two caches
-		 */
-		if (KMALLOC_MIN_SIZE <= 32 && !kmalloc_caches[1] && i == 6)
-			new_kmalloc_cache(1, flags);
-		if (KMALLOC_MIN_SIZE <= 64 && !kmalloc_caches[2] && i == 7)
-			new_kmalloc_cache(2, flags);
+			/*
+			 * Caches that are not of the two-to-the-power-of size.
+			 * These have to be created immediately after the
+			 * earlier power of two caches
+			 */
+			if (KMALLOC_MIN_SIZE <= 32 && i == 6 &&
+					!kmalloc_caches[type][1])
+				new_kmalloc_cache(1, type, flags);
+			if (KMALLOC_MIN_SIZE <= 64 && i == 7 &&
+					!kmalloc_caches[type][2])
+				new_kmalloc_cache(2, type, flags);
+		}
 	}
 
 	/* Kmalloc array is now usable */
@@ -1153,16 +1175,15 @@
 
 #ifdef CONFIG_ZONE_DMA
 	for (i = 0; i <= KMALLOC_SHIFT_HIGH; i++) {
-		struct kmem_cache *s = kmalloc_caches[i];
+		struct kmem_cache *s = kmalloc_caches[KMALLOC_NORMAL][i];
 
 		if (s) {
 			unsigned int size = kmalloc_size(i);
-			char *n = kasprintf(GFP_NOWAIT,
-				 "dma-kmalloc-%u", size);
+			const char *n = kmalloc_cache_name("dma-kmalloc", size);
 
 			BUG_ON(!n);
-			kmalloc_dma_caches[i] = create_kmalloc_cache(n,
-				size, SLAB_CACHE_DMA | flags, 0, 0);
+			kmalloc_caches[KMALLOC_DMA][i] = create_kmalloc_cache(
+				n, size, SLAB_CACHE_DMA | flags, 0, 0);
 		}
 	}
 #endif
@@ -1182,8 +1203,8 @@
 	flags |= __GFP_COMP;
 	page = alloc_pages(flags, order);
 	ret = page ? page_address(page) : NULL;
+	ret = kasan_kmalloc_large(ret, size, flags);
 	kmemleak_alloc(ret, size, 1, flags);
-	kasan_kmalloc_large(ret, size, flags);
 	return ret;
 }
 EXPORT_SYMBOL(kmalloc_order);
@@ -1461,7 +1482,7 @@
 		ks = ksize(p);
 
 	if (ks >= new_size) {
-		kasan_krealloc((void *)p, new_size, flags);
+		p = kasan_krealloc((void *)p, new_size, flags);
 		return (void *)p;
 	}
 
@@ -1513,7 +1534,7 @@
 	}
 
 	ret = __do_krealloc(p, new_size, flags);
-	if (ret && p != ret)
+	if (ret && kasan_reset_tag(p) != kasan_reset_tag(ret))
 		kfree(p);
 
 	return ret;
diff --git a/mm/slub.c b/mm/slub.c
index 9c3937c..126cc14 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -249,7 +249,18 @@
 				 unsigned long ptr_addr)
 {
 #ifdef CONFIG_SLAB_FREELIST_HARDENED
-	return (void *)((unsigned long)ptr ^ s->random ^ ptr_addr);
+	/*
+	 * When CONFIG_KASAN_SW_TAGS is enabled, ptr_addr might be tagged.
+	 * Normally, this doesn't cause any issues, as both set_freepointer()
+	 * and get_freepointer() are called with a pointer with the same tag.
+	 * However, there are some issues with CONFIG_SLUB_DEBUG code. For
+	 * example, when __free_slub() iterates over objects in a cache, it
+	 * passes untagged pointers to check_object(). check_object() in turns
+	 * calls get_freepointer() with an untagged pointer, which causes the
+	 * freepointer to be restored incorrectly.
+	 */
+	return (void *)((unsigned long)ptr ^ s->random ^
+			(unsigned long)kasan_reset_tag((void *)ptr_addr));
 #else
 	return ptr;
 #endif
@@ -303,15 +314,10 @@
 		__p < (__addr) + (__objects) * (__s)->size; \
 		__p += (__s)->size)
 
-#define for_each_object_idx(__p, __idx, __s, __addr, __objects) \
-	for (__p = fixup_red_left(__s, __addr), __idx = 1; \
-		__idx <= __objects; \
-		__p += (__s)->size, __idx++)
-
 /* Determine object index from a given position */
 static inline unsigned int slab_index(void *p, struct kmem_cache *s, void *addr)
 {
-	return (p - addr) / s->size;
+	return (kasan_reset_tag(p) - addr) / s->size;
 }
 
 static inline unsigned int order_objects(unsigned int order, unsigned int size)
@@ -507,6 +513,7 @@
 		return 1;
 
 	base = page_address(page);
+	object = kasan_reset_tag(object);
 	object = restore_red_left(s, object);
 	if (object < base || object >= base + page->objects * s->size ||
 		(object - base) % s->size) {
@@ -1075,6 +1082,16 @@
 	init_tracking(s, object);
 }
 
+static void setup_page_debug(struct kmem_cache *s, void *addr, int order)
+{
+	if (!(s->flags & SLAB_POISON))
+		return;
+
+	metadata_access_enable();
+	memset(addr, POISON_INUSE, PAGE_SIZE << order);
+	metadata_access_disable();
+}
+
 static inline int alloc_consistency_checks(struct kmem_cache *s,
 					struct page *page,
 					void *object, unsigned long addr)
@@ -1271,6 +1288,10 @@
 	if (*str == ',')
 		slub_debug_slabs = str + 1;
 out:
+	if ((static_branch_unlikely(&init_on_alloc) ||
+	     static_branch_unlikely(&init_on_free)) &&
+	    (slub_debug & SLAB_POISON))
+		pr_info("mem auto-init: SLAB_POISON will take precedence over init_on_alloc/init_on_free\n");
 	return 1;
 }
 
@@ -1292,6 +1313,8 @@
 #else /* !CONFIG_SLUB_DEBUG */
 static inline void setup_object_debug(struct kmem_cache *s,
 			struct page *page, void *object) {}
+static inline void setup_page_debug(struct kmem_cache *s,
+			void *addr, int order) {}
 
 static inline int alloc_debug_processing(struct kmem_cache *s,
 	struct page *page, void *object, unsigned long addr) { return 0; }
@@ -1334,10 +1357,11 @@
  * Hooks for other subsystems that check memory allocations. In a typical
  * production configuration these hooks all should produce no code at all.
  */
-static inline void kmalloc_large_node_hook(void *ptr, size_t size, gfp_t flags)
+static inline void *kmalloc_large_node_hook(void *ptr, size_t size, gfp_t flags)
 {
+	ptr = kasan_kmalloc_large(ptr, size, flags);
 	kmemleak_alloc(ptr, size, 1, flags);
-	kasan_kmalloc_large(ptr, size, flags);
+	return ptr;
 }
 
 static __always_inline void kfree_hook(void *x)
@@ -1374,18 +1398,11 @@
 static inline bool slab_free_freelist_hook(struct kmem_cache *s,
 					   void **head, void **tail)
 {
-/*
- * Compiler cannot detect this function can be removed if slab_free_hook()
- * evaluates to nothing.  Thus, catch all relevant config debug options here.
- */
-#if defined(CONFIG_LOCKDEP)	||		\
-	defined(CONFIG_DEBUG_KMEMLEAK) ||	\
-	defined(CONFIG_DEBUG_OBJECTS_FREE) ||	\
-	defined(CONFIG_KASAN)
 
 	void *object;
 	void *next = *head;
 	void *old_tail = *tail ? *tail : *head;
+	int rsize;
 
 	/* Head and tail of the reconstructed freelist */
 	*head = NULL;
@@ -1394,6 +1411,19 @@
 	do {
 		object = next;
 		next = get_freepointer(s, object);
+
+		if (slab_want_init_on_free(s)) {
+			/*
+			 * Clear the object and the metadata, but don't touch
+			 * the redzone.
+			 */
+			memset(object, 0, s->object_size);
+			rsize = (s->flags & SLAB_RED_ZONE) ? s->red_left_pad
+							   : 0;
+			memset((char *)object + s->inuse, 0,
+			       s->size - s->inuse - rsize);
+
+		}
 		/* If object's reuse doesn't have to be delayed */
 		if (!slab_free_hook(s, object)) {
 			/* Move object to the new freelist */
@@ -1408,21 +1438,19 @@
 		*tail = NULL;
 
 	return *head != NULL;
-#else
-	return true;
-#endif
 }
 
-static void setup_object(struct kmem_cache *s, struct page *page,
+static void *setup_object(struct kmem_cache *s, struct page *page,
 				void *object)
 {
 	setup_object_debug(s, page, object);
-	kasan_init_slab_obj(s, object);
+	object = kasan_init_slab_obj(s, object);
 	if (unlikely(s->ctor)) {
 		kasan_unpoison_object_data(s, object);
 		s->ctor(object);
 		kasan_poison_object_data(s, object);
 	}
+	return object;
 }
 
 /*
@@ -1530,16 +1558,16 @@
 	/* First entry is used as the base of the freelist */
 	cur = next_freelist_entry(s, page, &pos, start, page_limit,
 				freelist_count);
+	cur = setup_object(s, page, cur);
 	page->freelist = cur;
 
 	for (idx = 1; idx < page->objects; idx++) {
-		setup_object(s, page, cur);
 		next = next_freelist_entry(s, page, &pos, start, page_limit,
 			freelist_count);
+		next = setup_object(s, page, next);
 		set_freepointer(s, cur, next);
 		cur = next;
 	}
-	setup_object(s, page, cur);
 	set_freepointer(s, cur, NULL);
 
 	return true;
@@ -1561,7 +1589,7 @@
 	struct page *page;
 	struct kmem_cache_order_objects oo = s->oo;
 	gfp_t alloc_gfp;
-	void *start, *p;
+	void *start, *p, *next;
 	int idx, order;
 	bool shuffle;
 
@@ -1602,24 +1630,25 @@
 	if (page_is_pfmemalloc(page))
 		SetPageSlabPfmemalloc(page);
 
+	kasan_poison_slab(page);
+
 	start = page_address(page);
 
-	if (unlikely(s->flags & SLAB_POISON))
-		memset(start, POISON_INUSE, PAGE_SIZE << order);
-
-	kasan_poison_slab(page);
+	setup_page_debug(s, start, order);
 
 	shuffle = shuffle_freelist(s, page);
 
 	if (!shuffle) {
-		for_each_object_idx(p, idx, s, start, page->objects) {
-			setup_object(s, page, p);
-			if (likely(idx < page->objects))
-				set_freepointer(s, p, p + s->size);
-			else
-				set_freepointer(s, p, NULL);
+		start = fixup_red_left(s, start);
+		start = setup_object(s, page, start);
+		page->freelist = start;
+		for (idx = 0, p = start; idx < page->objects - 1; idx++) {
+			next = p + s->size;
+			next = setup_object(s, page, next);
+			set_freepointer(s, p, next);
+			p = next;
 		}
-		page->freelist = fixup_red_left(s, start);
+		set_freepointer(s, p, NULL);
 	}
 
 	page->inuse = page->objects;
@@ -2699,8 +2728,14 @@
 		prefetch_freepointer(s, next_object);
 		stat(s, ALLOC_FASTPATH);
 	}
+	/*
+	 * If the object has been wiped upon free, make sure it's fully
+	 * initialized by zeroing out freelist pointer.
+	 */
+	if (unlikely(slab_want_init_on_free(s)) && object)
+		memset(object + s->offset, 0, sizeof(void *));
 
-	if (unlikely(gfpflags & __GFP_ZERO) && object)
+	if (unlikely(slab_want_init_on_alloc(gfpflags, s)) && object)
 		memset(object, 0, s->object_size);
 
 	slab_post_alloc_hook(s, gfpflags, 1, &object);
@@ -2730,7 +2765,7 @@
 {
 	void *ret = slab_alloc(s, gfpflags, _RET_IP_);
 	trace_kmalloc(_RET_IP_, ret, size, s->size, gfpflags);
-	kasan_kmalloc(s, ret, size, gfpflags);
+	ret = kasan_kmalloc(s, ret, size, gfpflags);
 	return ret;
 }
 EXPORT_SYMBOL(kmem_cache_alloc_trace);
@@ -2758,7 +2793,7 @@
 	trace_kmalloc_node(_RET_IP_, ret,
 			   size, s->size, gfpflags, node);
 
-	kasan_kmalloc(s, ret, size, gfpflags);
+	ret = kasan_kmalloc(s, ret, size, gfpflags);
 	return ret;
 }
 EXPORT_SYMBOL(kmem_cache_alloc_node_trace);
@@ -2954,7 +2989,7 @@
 		do_slab_free(s, page, head, tail, cnt, addr);
 }
 
-#ifdef CONFIG_KASAN
+#ifdef CONFIG_KASAN_GENERIC
 void ___cache_free(struct kmem_cache *cache, void *x, unsigned long addr)
 {
 	do_slab_free(cache, virt_to_head_page(x), x, NULL, 1, addr);
@@ -3122,7 +3157,7 @@
 	local_irq_enable();
 
 	/* Clear memory outside IRQ disabled fastpath loop */
-	if (unlikely(flags & __GFP_ZERO)) {
+	if (unlikely(slab_want_init_on_alloc(flags, s))) {
 		int j;
 
 		for (j = 0; j < i; j++)
@@ -3326,16 +3361,16 @@
 
 	n = page->freelist;
 	BUG_ON(!n);
-	page->freelist = get_freepointer(kmem_cache_node, n);
-	page->inuse = 1;
-	page->frozen = 0;
-	kmem_cache_node->node[node] = n;
 #ifdef CONFIG_SLUB_DEBUG
 	init_object(kmem_cache_node, n, SLUB_RED_ACTIVE);
 	init_tracking(kmem_cache_node, n);
 #endif
-	kasan_kmalloc(kmem_cache_node, n, sizeof(struct kmem_cache_node),
+	n = kasan_kmalloc(kmem_cache_node, n, sizeof(struct kmem_cache_node),
 		      GFP_KERNEL);
+	page->freelist = get_freepointer(kmem_cache_node, n);
+	page->inuse = 1;
+	page->frozen = 0;
+	kmem_cache_node->node[node] = n;
 	init_kmem_cache_node(n);
 	inc_slabs_node(kmem_cache_node, node, page->objects);
 
@@ -3751,7 +3786,7 @@
 
 	trace_kmalloc(_RET_IP_, ret, size, s->size, flags);
 
-	kasan_kmalloc(s, ret, size, flags);
+	ret = kasan_kmalloc(s, ret, size, flags);
 
 	return ret;
 }
@@ -3768,8 +3803,7 @@
 	if (page)
 		ptr = page_address(page);
 
-	kmalloc_large_node_hook(ptr, size, flags);
-	return ptr;
+	return kmalloc_large_node_hook(ptr, size, flags);
 }
 
 void *__kmalloc_node(size_t size, gfp_t flags, int node)
@@ -3796,7 +3830,7 @@
 
 	trace_kmalloc_node(_RET_IP_, ret, size, s->size, flags, node);
 
-	kasan_kmalloc(s, ret, size, flags);
+	ret = kasan_kmalloc(s, ret, size, flags);
 
 	return ret;
 }
@@ -3819,6 +3853,8 @@
 	unsigned int offset;
 	size_t object_size;
 
+	ptr = kasan_reset_tag(ptr);
+
 	/* Find object and usable object size. */
 	s = page->slab_cache;
 
@@ -4660,6 +4696,7 @@
 static void __init resiliency_test(void)
 {
 	u8 *p;
+	int type = KMALLOC_NORMAL;
 
 	BUILD_BUG_ON(KMALLOC_MIN_SIZE > 16 || KMALLOC_SHIFT_HIGH < 10);
 
@@ -4672,7 +4709,7 @@
 	pr_err("\n1. kmalloc-16: Clobber Redzone/next pointer 0x12->0x%p\n\n",
 	       p + 16);
 
-	validate_slab_cache(kmalloc_caches[4]);
+	validate_slab_cache(kmalloc_caches[type][4]);
 
 	/* Hmmm... The next two are dangerous */
 	p = kzalloc(32, GFP_KERNEL);
@@ -4681,33 +4718,33 @@
 	       p);
 	pr_err("If allocated object is overwritten then not detectable\n\n");
 
-	validate_slab_cache(kmalloc_caches[5]);
+	validate_slab_cache(kmalloc_caches[type][5]);
 	p = kzalloc(64, GFP_KERNEL);
 	p += 64 + (get_cycles() & 0xff) * sizeof(void *);
 	*p = 0x56;
 	pr_err("\n3. kmalloc-64: corrupting random byte 0x56->0x%p\n",
 	       p);
 	pr_err("If allocated object is overwritten then not detectable\n\n");
-	validate_slab_cache(kmalloc_caches[6]);
+	validate_slab_cache(kmalloc_caches[type][6]);
 
 	pr_err("\nB. Corruption after free\n");
 	p = kzalloc(128, GFP_KERNEL);
 	kfree(p);
 	*p = 0x78;
 	pr_err("1. kmalloc-128: Clobber first word 0x78->0x%p\n\n", p);
-	validate_slab_cache(kmalloc_caches[7]);
+	validate_slab_cache(kmalloc_caches[type][7]);
 
 	p = kzalloc(256, GFP_KERNEL);
 	kfree(p);
 	p[50] = 0x9a;
 	pr_err("\n2. kmalloc-256: Clobber 50th byte 0x9a->0x%p\n\n", p);
-	validate_slab_cache(kmalloc_caches[8]);
+	validate_slab_cache(kmalloc_caches[type][8]);
 
 	p = kzalloc(512, GFP_KERNEL);
 	kfree(p);
 	p[512] = 0xab;
 	pr_err("\n3. kmalloc-512: Clobber redzone 0xab->0x%p\n\n", p);
-	validate_slab_cache(kmalloc_caches[9]);
+	validate_slab_cache(kmalloc_caches[type][9]);
 }
 #else
 #ifdef CONFIG_SYSFS
diff --git a/mm/swap_state.c b/mm/swap_state.c
index ecee9c6..0d6a7f2 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -448,6 +448,7 @@
 			/*
 			 * Initiate read into locked page and return.
 			 */
+			SetPageWorkingset(new_page);
 			lru_cache_add_anon(new_page);
 			*new_page_allocated = true;
 			return new_page;
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 0047dca..02ad17a 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -2397,9 +2397,8 @@
  * requirements, they are simply tossed out - we will never use those blocks
  * for swapping.
  *
- * For S_ISREG swapfiles we set S_SWAPFILE across the life of the swapon.  This
- * prevents root from shooting her foot off by ftruncating an in-use swapfile,
- * which will scribble on the fs.
+ * For all swap devices we set S_SWAPFILE across the life of the swapon.  This
+ * prevents users from writing to the swap device, which will corrupt memory.
  *
  * The amount of disk space which a single swap extent represents varies.
  * Typically it is in the 1-4 megabyte range.  So we can have hundreds of
@@ -2662,13 +2661,14 @@
 	inode = mapping->host;
 	if (S_ISBLK(inode->i_mode)) {
 		struct block_device *bdev = I_BDEV(inode);
+
 		set_blocksize(bdev, old_block_size);
 		blkdev_put(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL);
-	} else {
-		inode_lock(inode);
-		inode->i_flags &= ~S_SWAPFILE;
-		inode_unlock(inode);
 	}
+
+	inode_lock(inode);
+	inode->i_flags &= ~S_SWAPFILE;
+	inode_unlock(inode);
 	filp_close(swap_file, NULL);
 
 	/*
@@ -2892,11 +2892,11 @@
 		p->flags |= SWP_BLKDEV;
 	} else if (S_ISREG(inode->i_mode)) {
 		p->bdev = inode->i_sb->s_bdev;
-		inode_lock(inode);
-		if (IS_SWAPFILE(inode))
-			return -EBUSY;
-	} else
-		return -EINVAL;
+	}
+
+	inode_lock(inode);
+	if (IS_SWAPFILE(inode))
+		return -EBUSY;
 
 	return 0;
 }
@@ -3277,6 +3277,17 @@
 	if (error)
 		goto bad_swap;
 
+	/*
+	 * Flush any pending IO and dirty mappings before we start using this
+	 * swap device.
+	 */
+	inode->i_flags |= S_SWAPFILE;
+	error = inode_drain_writes(inode);
+	if (error) {
+		inode->i_flags &= ~S_SWAPFILE;
+		goto bad_swap;
+	}
+
 	mutex_lock(&swapon_mutex);
 	prio = -1;
 	if (swap_flags & SWAP_FLAG_PREFER)
@@ -3297,8 +3308,6 @@
 	atomic_inc(&proc_poll_event);
 	wake_up_interruptible(&proc_poll_wait);
 
-	if (S_ISREG(inode->i_mode))
-		inode->i_flags |= S_SWAPFILE;
 	error = 0;
 	goto out;
 bad_swap:
@@ -3320,7 +3329,7 @@
 	if (inced_nr_rotate_swap)
 		atomic_dec(&nr_rotate_swap);
 	if (swap_file) {
-		if (inode && S_ISREG(inode->i_mode)) {
+		if (inode) {
 			inode_unlock(inode);
 			inode = NULL;
 		}
@@ -3333,7 +3342,7 @@
 	}
 	if (name)
 		putname(name);
-	if (inode && S_ISREG(inode->i_mode))
+	if (inode)
 		inode_unlock(inode);
 	if (!error)
 		enable_swap_slots_cache();
diff --git a/mm/util.c b/mm/util.c
index 6a24a10..725bc7f 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -685,8 +685,7 @@
 		 * Part of the kernel memory, which can be released
 		 * under memory pressure.
 		 */
-		free += global_node_page_state(
-			NR_INDIRECTLY_RECLAIMABLE_BYTES) >> PAGE_SHIFT;
+		free += global_node_page_state(NR_KERNEL_MISC_RECLAIMABLE);
 
 		/*
 		 * Leave reserved pages. The pages are not for anonymous pages.
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index d8e8773..7423148 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -340,6 +340,13 @@
 
 static unsigned long vmap_area_pcpu_hole;
 
+static atomic_long_t nr_vmalloc_pages;
+
+unsigned long vmalloc_nr_pages(void)
+{
+	return atomic_long_read(&nr_vmalloc_pages);
+}
+
 static struct vmap_area *__find_vmap_area(unsigned long addr)
 {
 	struct rb_node *n = vmap_area_root.rb_node;
@@ -1529,6 +1536,7 @@
 			BUG_ON(!page);
 			__free_pages(page, 0);
 		}
+		atomic_long_sub(area->nr_pages, &nr_vmalloc_pages);
 
 		kvfree(area->pages);
 	}
@@ -1694,12 +1702,14 @@
 		if (unlikely(!page)) {
 			/* Successfully allocated i pages, free them in __vunmap() */
 			area->nr_pages = i;
+			atomic_long_add(area->nr_pages, &nr_vmalloc_pages);
 			goto fail;
 		}
 		area->pages[i] = page;
 		if (gfpflags_allow_blocking(gfp_mask|highmem_mask))
 			cond_resched();
 	}
+	atomic_long_add(area->nr_pages, &nr_vmalloc_pages);
 
 	if (map_vm_area(area, prot, pages))
 		goto fail;
diff --git a/mm/vmscan.c b/mm/vmscan.c
index b37610c..3e0f85a 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -49,6 +49,7 @@
 #include <linux/prefetch.h>
 #include <linux/printk.h>
 #include <linux/dax.h>
+#include <linux/psi.h>
 
 #include <asm/tlbflush.h>
 #include <asm/div64.h>
@@ -2142,6 +2143,7 @@
 		}
 
 		ClearPageActive(page);	/* we are de-activating */
+		SetPageWorkingset(page);
 		list_add(&page->lru, &l_inactive);
 	}
 
@@ -3290,6 +3292,7 @@
 {
 	struct zonelist *zonelist;
 	unsigned long nr_reclaimed;
+	unsigned long pflags;
 	int nid;
 	unsigned int noreclaim_flag;
 	struct scan_control sc = {
@@ -3318,9 +3321,13 @@
 					    sc.gfp_mask,
 					    sc.reclaim_idx);
 
+	psi_memstall_enter(&pflags);
 	noreclaim_flag = memalloc_noreclaim_save();
+
 	nr_reclaimed = do_try_to_free_pages(zonelist, &sc);
+
 	memalloc_noreclaim_restore(noreclaim_flag);
+	psi_memstall_leave(&pflags);
 
 	trace_mm_vmscan_memcg_reclaim_end(nr_reclaimed);
 
@@ -3485,6 +3492,7 @@
 	int i;
 	unsigned long nr_soft_reclaimed;
 	unsigned long nr_soft_scanned;
+	unsigned long pflags;
 	struct zone *zone;
 	struct scan_control sc = {
 		.gfp_mask = GFP_KERNEL,
@@ -3495,6 +3503,7 @@
 		.may_swap = 1,
 	};
 
+	psi_memstall_enter(&pflags);
 	__fs_reclaim_acquire();
 
 	count_vm_event(PAGEOUTRUN);
@@ -3596,6 +3605,7 @@
 out:
 	snapshot_refaults(NULL, pgdat);
 	__fs_reclaim_release();
+	psi_memstall_leave(&pflags);
 	/*
 	 * Return the order kswapd stopped reclaiming at as
 	 * prepare_kswapd_sleep() takes it into account. If another caller
diff --git a/mm/vmstat.c b/mm/vmstat.c
index ce81b0a..5bf5b90 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -1117,6 +1117,9 @@
 	"nr_mlock",
 	"nr_page_table_pages",
 	"nr_kernel_stack",
+#if IS_ENABLED(CONFIG_SHADOW_CALL_STACK)
+	"nr_shadow_call_stack_bytes",
+#endif
 	"nr_bounce",
 #if IS_ENABLED(CONFIG_ZSMALLOC)
 	"nr_zspages",
@@ -1145,6 +1148,7 @@
 	"nr_isolated_file",
 	"workingset_refault",
 	"workingset_activate",
+	"workingset_restore",
 	"workingset_nodereclaim",
 	"nr_anon_pages",
 	"nr_mapped",
@@ -1161,7 +1165,7 @@
 	"nr_vmscan_immediate_reclaim",
 	"nr_dirtied",
 	"nr_written",
-	"", /* nr_indirectly_reclaimable */
+	"nr_kernel_misc_reclaimable",
 
 	/* enum writeback_stat_item counters */
 	"nr_dirty_threshold",
@@ -1705,10 +1709,6 @@
 	unsigned long *l = arg;
 	unsigned long off = l - (unsigned long *)m->private;
 
-	/* Skip hidden vmstat items. */
-	if (*vmstat_text[off] == '\0')
-		return 0;
-
 	seq_puts(m, vmstat_text[off]);
 	seq_put_decimal_ull(m, " ", *l);
 	seq_putc(m, '\n');
diff --git a/mm/workingset.c b/mm/workingset.c
index 4516dd7..8abfd26 100644
--- a/mm/workingset.c
+++ b/mm/workingset.c
@@ -121,7 +121,7 @@
  * the only thing eating into inactive list space is active pages.
  *
  *
- *		Activating refaulting pages
+ *		Refaulting inactive pages
  *
  * All that is known about the active list is that the pages have been
  * accessed more than once in the past.  This means that at any given
@@ -134,6 +134,10 @@
  * used less frequently than the refaulting page - or even not used at
  * all anymore.
  *
+ * That means if inactive cache is refaulting with a suitable refault
+ * distance, we assume the cache workingset is transitioning and put
+ * pressure on the current active list.
+ *
  * If this is wrong and demotion kicks in, the pages which are truly
  * used more frequently will be reactivated while the less frequently
  * used once will be evicted from memory.
@@ -141,6 +145,14 @@
  * But if this is right, the stale pages will be pushed out of memory
  * and the used pages get to stay in cache.
  *
+ *		Refaulting active pages
+ *
+ * If on the other hand the refaulting pages have recently been
+ * deactivated, it means that the active list is no longer protecting
+ * actively used cache from reclaim. The cache is NOT transitioning to
+ * a different workingset; the existing workingset is thrashing in the
+ * space allocated to the page cache.
+ *
  *
  *		Implementation
  *
@@ -156,8 +168,7 @@
  */
 
 #define EVICTION_SHIFT	(RADIX_TREE_EXCEPTIONAL_ENTRY + \
-			 NODES_SHIFT +	\
-			 MEM_CGROUP_ID_SHIFT)
+			 1 + NODES_SHIFT + MEM_CGROUP_ID_SHIFT)
 #define EVICTION_MASK	(~0UL >> EVICTION_SHIFT)
 
 /*
@@ -170,23 +181,28 @@
  */
 static unsigned int bucket_order __read_mostly;
 
-static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction)
+static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction,
+			 bool workingset)
 {
 	eviction >>= bucket_order;
 	eviction = (eviction << MEM_CGROUP_ID_SHIFT) | memcgid;
 	eviction = (eviction << NODES_SHIFT) | pgdat->node_id;
+	eviction = (eviction << 1) | workingset;
 	eviction = (eviction << RADIX_TREE_EXCEPTIONAL_SHIFT);
 
 	return (void *)(eviction | RADIX_TREE_EXCEPTIONAL_ENTRY);
 }
 
 static void unpack_shadow(void *shadow, int *memcgidp, pg_data_t **pgdat,
-			  unsigned long *evictionp)
+			  unsigned long *evictionp, bool *workingsetp)
 {
 	unsigned long entry = (unsigned long)shadow;
 	int memcgid, nid;
+	bool workingset;
 
 	entry >>= RADIX_TREE_EXCEPTIONAL_SHIFT;
+	workingset = entry & 1;
+	entry >>= 1;
 	nid = entry & ((1UL << NODES_SHIFT) - 1);
 	entry >>= NODES_SHIFT;
 	memcgid = entry & ((1UL << MEM_CGROUP_ID_SHIFT) - 1);
@@ -195,6 +211,7 @@
 	*memcgidp = memcgid;
 	*pgdat = NODE_DATA(nid);
 	*evictionp = entry << bucket_order;
+	*workingsetp = workingset;
 }
 
 /**
@@ -207,8 +224,8 @@
  */
 void *workingset_eviction(struct address_space *mapping, struct page *page)
 {
-	struct mem_cgroup *memcg = page_memcg(page);
 	struct pglist_data *pgdat = page_pgdat(page);
+	struct mem_cgroup *memcg = page_memcg(page);
 	int memcgid = mem_cgroup_id(memcg);
 	unsigned long eviction;
 	struct lruvec *lruvec;
@@ -220,30 +237,30 @@
 
 	lruvec = mem_cgroup_lruvec(pgdat, memcg);
 	eviction = atomic_long_inc_return(&lruvec->inactive_age);
-	return pack_shadow(memcgid, pgdat, eviction);
+	return pack_shadow(memcgid, pgdat, eviction, PageWorkingset(page));
 }
 
 /**
  * workingset_refault - evaluate the refault of a previously evicted page
+ * @page: the freshly allocated replacement page
  * @shadow: shadow entry of the evicted page
  *
  * Calculates and evaluates the refault distance of the previously
  * evicted page in the context of the node it was allocated in.
- *
- * Returns %true if the page should be activated, %false otherwise.
  */
-bool workingset_refault(void *shadow)
+void workingset_refault(struct page *page, void *shadow)
 {
 	unsigned long refault_distance;
+	struct pglist_data *pgdat;
 	unsigned long active_file;
 	struct mem_cgroup *memcg;
 	unsigned long eviction;
 	struct lruvec *lruvec;
 	unsigned long refault;
-	struct pglist_data *pgdat;
+	bool workingset;
 	int memcgid;
 
-	unpack_shadow(shadow, &memcgid, &pgdat, &eviction);
+	unpack_shadow(shadow, &memcgid, &pgdat, &eviction, &workingset);
 
 	rcu_read_lock();
 	/*
@@ -263,41 +280,51 @@
 	 * configurations instead.
 	 */
 	memcg = mem_cgroup_from_id(memcgid);
-	if (!mem_cgroup_disabled() && !memcg) {
-		rcu_read_unlock();
-		return false;
-	}
+	if (!mem_cgroup_disabled() && !memcg)
+		goto out;
 	lruvec = mem_cgroup_lruvec(pgdat, memcg);
 	refault = atomic_long_read(&lruvec->inactive_age);
 	active_file = lruvec_lru_size(lruvec, LRU_ACTIVE_FILE, MAX_NR_ZONES);
 
 	/*
-	 * The unsigned subtraction here gives an accurate distance
-	 * across inactive_age overflows in most cases.
+	 * Calculate the refault distance
 	 *
-	 * There is a special case: usually, shadow entries have a
-	 * short lifetime and are either refaulted or reclaimed along
-	 * with the inode before they get too old.  But it is not
-	 * impossible for the inactive_age to lap a shadow entry in
-	 * the field, which can then can result in a false small
-	 * refault distance, leading to a false activation should this
-	 * old entry actually refault again.  However, earlier kernels
-	 * used to deactivate unconditionally with *every* reclaim
-	 * invocation for the longest time, so the occasional
-	 * inappropriate activation leading to pressure on the active
-	 * list is not a problem.
+	 * The unsigned subtraction here gives an accurate distance
+	 * across inactive_age overflows in most cases. There is a
+	 * special case: usually, shadow entries have a short lifetime
+	 * and are either refaulted or reclaimed along with the inode
+	 * before they get too old.  But it is not impossible for the
+	 * inactive_age to lap a shadow entry in the field, which can
+	 * then result in a false small refault distance, leading to a
+	 * false activation should this old entry actually refault
+	 * again.  However, earlier kernels used to deactivate
+	 * unconditionally with *every* reclaim invocation for the
+	 * longest time, so the occasional inappropriate activation
+	 * leading to pressure on the active list is not a problem.
 	 */
 	refault_distance = (refault - eviction) & EVICTION_MASK;
 
 	inc_lruvec_state(lruvec, WORKINGSET_REFAULT);
 
-	if (refault_distance <= active_file) {
-		inc_lruvec_state(lruvec, WORKINGSET_ACTIVATE);
-		rcu_read_unlock();
-		return true;
+	/*
+	 * Compare the distance to the existing workingset size. We
+	 * don't act on pages that couldn't stay resident even if all
+	 * the memory was available to the page cache.
+	 */
+	if (refault_distance > active_file)
+		goto out;
+
+	SetPageActive(page);
+	atomic_long_inc(&lruvec->inactive_age);
+	inc_lruvec_state(lruvec, WORKINGSET_ACTIVATE);
+
+	/* Page was active prior to eviction */
+	if (workingset) {
+		SetPageWorkingset(page);
+		inc_lruvec_state(lruvec, WORKINGSET_RESTORE);
 	}
+out:
 	rcu_read_unlock();
-	return false;
 }
 
 /**
diff --git a/net/core/sock.c b/net/core/sock.c
index bbde5f6..13ce20f 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1460,7 +1460,7 @@
 		sk = kmem_cache_alloc(slab, priority & ~__GFP_ZERO);
 		if (!sk)
 			return sk;
-		if (priority & __GFP_ZERO)
+		if (want_init_on_alloc(priority))
 			sk_prot_clear_nulls(sk, prot->obj_size);
 	} else
 		sk = kmalloc(prot->obj_size, priority);
diff --git a/net/ipv4/netfilter/nf_nat_l3proto_ipv4.c b/net/ipv4/netfilter/nf_nat_l3proto_ipv4.c
index 6115bf1..0fb3776 100644
--- a/net/ipv4/netfilter/nf_nat_l3proto_ipv4.c
+++ b/net/ipv4/netfilter/nf_nat_l3proto_ipv4.c
@@ -241,7 +241,7 @@
 }
 EXPORT_SYMBOL_GPL(nf_nat_icmp_reply_translation);
 
-static unsigned int
+unsigned int
 nf_nat_ipv4_fn(void *priv, struct sk_buff *skb,
 	       const struct nf_hook_state *state)
 {
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index ef309a2..62a408e 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -220,6 +220,7 @@
 	.accept_ra_rt_info_max_plen = 0,
 #endif
 #endif
+	.accept_ra_rt_table	= 0,
 	.proxy_ndp		= 0,
 	.accept_source_route	= 0,	/* we do not accept RH0 by default. */
 	.disable_ipv6		= 0,
@@ -274,6 +275,7 @@
 	.accept_ra_rt_info_max_plen = 0,
 #endif
 #endif
+	.accept_ra_rt_table	= 0,
 	.proxy_ndp		= 0,
 	.accept_source_route	= 0,	/* we do not accept RH0 by default. */
 	.disable_ipv6		= 0,
@@ -2312,6 +2314,26 @@
 		ipv6_regen_rndid(idev);
 }
 
+u32 addrconf_rt_table(const struct net_device *dev, u32 default_table)
+{
+	struct inet6_dev *idev = in6_dev_get(dev);
+	int sysctl;
+	u32 table;
+
+	if (!idev)
+		return default_table;
+	sysctl = idev->cnf.accept_ra_rt_table;
+	if (sysctl == 0) {
+		table = default_table;
+	} else if (sysctl > 0) {
+		table = (u32) sysctl;
+	} else {
+		table = (unsigned) dev->ifindex + (-sysctl);
+	}
+	in6_dev_put(idev);
+	return table;
+}
+
 /*
  *	Add prefix route.
  */
@@ -2322,7 +2344,7 @@
 		      u32 flags, gfp_t gfp_flags)
 {
 	struct fib6_config cfg = {
-		.fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_PREFIX,
+		.fc_table = l3mdev_fib_table(dev) ? : addrconf_rt_table(dev, RT6_TABLE_PREFIX),
 		.fc_metric = metric ? : IP6_RT_PRIO_ADDRCONF,
 		.fc_ifindex = dev->ifindex,
 		.fc_expires = expires,
@@ -2356,7 +2378,7 @@
 	struct fib6_node *fn;
 	struct fib6_info *rt = NULL;
 	struct fib6_table *table;
-	u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_PREFIX;
+	u32 tb_id = l3mdev_fib_table(dev) ? : addrconf_rt_table(dev, RT6_TABLE_PREFIX);
 
 	table = fib6_get_table(dev_net(dev), tb_id);
 	if (!table)
@@ -6363,6 +6385,13 @@
 #endif
 #endif
 	{
+		.procname	= "accept_ra_rt_table",
+		.data		= &ipv6_devconf.accept_ra_rt_table,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= proc_dointvec,
+	},
+	{
 		.procname	= "proxy_ndp",
 		.data		= &ipv6_devconf.proxy_ndp,
 		.maxlen		= sizeof(int),
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 673a4a9..45d8d08 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -197,6 +197,7 @@
 {
 	return opt->nd_opt_type == ND_OPT_RDNSS ||
 		opt->nd_opt_type == ND_OPT_DNSSL ||
+		opt->nd_opt_type == ND_OPT_CAPTIVE_PORTAL ||
 		ndisc_ops_is_useropt(dev, opt->nd_opt_type);
 }
 
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 076c21f..d76ff5d 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -3508,7 +3508,7 @@
 					   const struct in6_addr *gwaddr,
 					   struct net_device *dev)
 {
-	u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO;
+	u32 tb_id = l3mdev_fib_table(dev) ? : addrconf_rt_table(dev, RT6_TABLE_INFO);
 	int ifindex = dev->ifindex;
 	struct fib6_node *fn;
 	struct fib6_info *rt = NULL;
@@ -3558,7 +3558,7 @@
 		.fc_nlinfo.nl_net = net,
 	};
 
-	cfg.fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO,
+	cfg.fc_table = l3mdev_fib_table(dev) ? : addrconf_rt_table(dev, RT6_TABLE_INFO),
 	cfg.fc_dst = *prefix;
 	cfg.fc_gateway = *gwaddr;
 
@@ -3576,7 +3576,7 @@
 				     const struct in6_addr *addr,
 				     struct net_device *dev)
 {
-	u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT;
+	u32 tb_id = l3mdev_fib_table(dev) ? : addrconf_rt_table(dev, RT6_TABLE_DFLT);
 	struct fib6_info *rt;
 	struct fib6_table *table;
 
@@ -3603,7 +3603,7 @@
 				     unsigned int pref)
 {
 	struct fib6_config cfg = {
-		.fc_table	= l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT,
+		.fc_table	= l3mdev_fib_table(dev) ? : addrconf_rt_table(dev, RT6_TABLE_DFLT),
 		.fc_metric	= IP6_RT_PRIO_USER,
 		.fc_ifindex	= dev->ifindex,
 		.fc_flags	= RTF_GATEWAY | RTF_ADDRCONF | RTF_DEFAULT |
@@ -3628,47 +3628,24 @@
 	return rt6_get_dflt_router(net, gwaddr, dev);
 }
 
-static void __rt6_purge_dflt_routers(struct net *net,
-				     struct fib6_table *table)
+static int rt6_addrconf_purge(struct fib6_info *rt, void *arg)
 {
-	struct fib6_info *rt;
+	struct net_device *dev = fib6_info_nh_dev(rt);
+	struct inet6_dev *idev = dev ? __in6_dev_get(dev) : NULL;
 
-restart:
-	rcu_read_lock();
-	for_each_fib6_node_rt_rcu(&table->tb6_root) {
-		struct net_device *dev = fib6_info_nh_dev(rt);
-		struct inet6_dev *idev = dev ? __in6_dev_get(dev) : NULL;
-
-		if (rt->fib6_flags & (RTF_DEFAULT | RTF_ADDRCONF) &&
-		    (!idev || idev->cnf.accept_ra != 2) &&
-		    fib6_info_hold_safe(rt)) {
-			rcu_read_unlock();
-			ip6_del_rt(net, rt);
-			goto restart;
-		}
+	if (rt->fib6_flags & (RTF_DEFAULT | RTF_ADDRCONF) &&
+	    (!idev || idev->cnf.accept_ra != 2)) {
+		/* Delete this route. See fib6_clean_tree() */
+		return -1;
 	}
-	rcu_read_unlock();
 
-	table->flags &= ~RT6_TABLE_HAS_DFLT_ROUTER;
+	/* Continue walking */
+	return 0;
 }
 
 void rt6_purge_dflt_routers(struct net *net)
 {
-	struct fib6_table *table;
-	struct hlist_head *head;
-	unsigned int h;
-
-	rcu_read_lock();
-
-	for (h = 0; h < FIB6_TABLE_HASHSZ; h++) {
-		head = &net->ipv6.fib_table_hash[h];
-		hlist_for_each_entry_rcu(table, head, tb6_hlist) {
-			if (table->flags & RT6_TABLE_HAS_DFLT_ROUTER)
-				__rt6_purge_dflt_routers(net, table);
-		}
-	}
-
-	rcu_read_unlock();
+	fib6_clean_all(net, rt6_addrconf_purge, NULL);
 }
 
 static void rtmsg_to_fib6_config(struct net *net,
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
index b919db0..8cc0e5a 100644
--- a/net/kcm/kcmsock.c
+++ b/net/kcm/kcmsock.c
@@ -382,7 +382,7 @@
 	struct kcm_psock *psock = container_of(strp, struct kcm_psock, strp);
 	struct bpf_prog *prog = psock->bpf_prog;
 
-	return (*prog->bpf_func)(skb, prog->insnsi);
+	return BPF_PROG_RUN(prog, skb);
 }
 
 static int kcm_read_sock_done(struct strparser *strp, int err)
diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig
index e0fb56d..bc6983f 100644
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
@@ -1461,6 +1461,29 @@
 	  If you want to compile it as a module, say M here and read
 	  <file:Documentation/kbuild/modules.txt>.  If unsure, say `N'.
 
+config NETFILTER_XT_MATCH_QUOTA2
+	tristate '"quota2" match support'
+	depends on NETFILTER_ADVANCED
+	help
+	  This option adds a `quota2' match, which allows to match on a
+	  byte counter correctly and not per CPU.
+	  It allows naming the quotas.
+	  This is based on http://xtables-addons.git.sourceforge.net
+
+	  If you want to compile it as a module, say M here and read
+	  <file:Documentation/kbuild/modules.txt>.  If unsure, say `N'.
+
+config NETFILTER_XT_MATCH_QUOTA2_LOG
+	bool '"quota2" Netfilter LOG support'
+	depends on NETFILTER_XT_MATCH_QUOTA2
+	default n
+	help
+	  This option allows `quota2' to log ONCE when a quota limit
+	  is passed. It logs via NETLINK using the NETLINK_NFLOG family.
+	  It logs similarly to how ipt_ULOG would without data.
+
+	  If unsure, say `N'.
+
 config NETFILTER_XT_MATCH_RATEEST
 	tristate '"rateest" match support'
 	depends on NETFILTER_ADVANCED
diff --git a/net/netfilter/Makefile b/net/netfilter/Makefile
index 16895e0..9c87ed5 100644
--- a/net/netfilter/Makefile
+++ b/net/netfilter/Makefile
@@ -191,6 +191,7 @@
 obj-$(CONFIG_NETFILTER_XT_MATCH_PKTTYPE) += xt_pkttype.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_POLICY) += xt_policy.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_QUOTA) += xt_quota.o
+obj-$(CONFIG_NETFILTER_XT_MATCH_QUOTA2) += xt_quota2.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_RATEEST) += xt_rateest.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_REALM) += xt_realm.o
 obj-$(CONFIG_NETFILTER_XT_MATCH_RECENT) += xt_recent.o
diff --git a/net/netfilter/xt_IDLETIMER.c b/net/netfilter/xt_IDLETIMER.c
index 25453a1..f06a525 100644
--- a/net/netfilter/xt_IDLETIMER.c
+++ b/net/netfilter/xt_IDLETIMER.c
@@ -5,6 +5,7 @@
  * After timer expires a kevent will be sent.
  *
  * Copyright (C) 2004, 2010 Nokia Corporation
+ *
  * Written by Timo Teras <ext-timo.teras@nokia.com>
  *
  * Converted to x_tables and reworked for upstream inclusion
@@ -38,14 +39,17 @@
 #include <linux/netfilter/xt_IDLETIMER.h>
 #include <linux/kdev_t.h>
 #include <linux/kobject.h>
+#include <linux/skbuff.h>
 #include <linux/workqueue.h>
 #include <linux/sysfs.h>
-
-struct idletimer_tg_attr {
-	struct attribute attr;
-	ssize_t	(*show)(struct kobject *kobj,
-			struct attribute *attr, char *buf);
-};
+#include <linux/rtc.h>
+#include <linux/time.h>
+#include <linux/math64.h>
+#include <linux/suspend.h>
+#include <linux/notifier.h>
+#include <net/net_namespace.h>
+#include <net/sock.h>
+#include <net/inet_sock.h>
 
 struct idletimer_tg {
 	struct list_head entry;
@@ -53,16 +57,113 @@
 	struct work_struct work;
 
 	struct kobject *kobj;
-	struct idletimer_tg_attr attr;
+	struct device_attribute attr;
 
+	struct timespec delayed_timer_trigger;
+	struct timespec last_modified_timer;
+	struct timespec last_suspend_time;
+	struct notifier_block pm_nb;
+
+	int timeout;
 	unsigned int refcnt;
+	bool work_pending;
+	bool send_nl_msg;
+	bool active;
+	uid_t uid;
+	bool suspend_time_valid;
 };
 
 static LIST_HEAD(idletimer_tg_list);
 static DEFINE_MUTEX(list_mutex);
+static DEFINE_SPINLOCK(timestamp_lock);
 
 static struct kobject *idletimer_tg_kobj;
 
+static bool check_for_delayed_trigger(struct idletimer_tg *timer,
+		struct timespec *ts)
+{
+	bool state;
+	struct timespec temp;
+	spin_lock_bh(&timestamp_lock);
+	timer->work_pending = false;
+	if ((ts->tv_sec - timer->last_modified_timer.tv_sec) > timer->timeout ||
+			timer->delayed_timer_trigger.tv_sec != 0) {
+		state = false;
+		temp.tv_sec = timer->timeout;
+		temp.tv_nsec = 0;
+		if (timer->delayed_timer_trigger.tv_sec != 0) {
+			temp = timespec_add(timer->delayed_timer_trigger, temp);
+			ts->tv_sec = temp.tv_sec;
+			ts->tv_nsec = temp.tv_nsec;
+			timer->delayed_timer_trigger.tv_sec = 0;
+			timer->work_pending = true;
+			schedule_work(&timer->work);
+		} else {
+			temp = timespec_add(timer->last_modified_timer, temp);
+			ts->tv_sec = temp.tv_sec;
+			ts->tv_nsec = temp.tv_nsec;
+		}
+	} else {
+		state = timer->active;
+	}
+	spin_unlock_bh(&timestamp_lock);
+	return state;
+}
+
+static void notify_netlink_uevent(const char *iface, struct idletimer_tg *timer)
+{
+	char iface_msg[NLMSG_MAX_SIZE];
+	char state_msg[NLMSG_MAX_SIZE];
+	char timestamp_msg[NLMSG_MAX_SIZE];
+	char uid_msg[NLMSG_MAX_SIZE];
+	char *envp[] = { iface_msg, state_msg, timestamp_msg, uid_msg, NULL };
+	int res;
+	struct timespec ts;
+	uint64_t time_ns;
+	bool state;
+
+	res = snprintf(iface_msg, NLMSG_MAX_SIZE, "INTERFACE=%s",
+		       iface);
+	if (NLMSG_MAX_SIZE <= res) {
+		pr_err("message too long (%d)", res);
+		return;
+	}
+
+	get_monotonic_boottime(&ts);
+	state = check_for_delayed_trigger(timer, &ts);
+	res = snprintf(state_msg, NLMSG_MAX_SIZE, "STATE=%s",
+			state ? "active" : "inactive");
+
+	if (NLMSG_MAX_SIZE <= res) {
+		pr_err("message too long (%d)", res);
+		return;
+	}
+
+	if (state) {
+		res = snprintf(uid_msg, NLMSG_MAX_SIZE, "UID=%u", timer->uid);
+		if (NLMSG_MAX_SIZE <= res)
+			pr_err("message too long (%d)", res);
+	} else {
+		res = snprintf(uid_msg, NLMSG_MAX_SIZE, "UID=");
+		if (NLMSG_MAX_SIZE <= res)
+			pr_err("message too long (%d)", res);
+	}
+
+	time_ns = timespec_to_ns(&ts);
+	res = snprintf(timestamp_msg, NLMSG_MAX_SIZE, "TIME_NS=%llu", time_ns);
+	if (NLMSG_MAX_SIZE <= res) {
+		timestamp_msg[0] = '\0';
+		pr_err("message too long (%d)", res);
+	}
+
+	pr_debug("putting nlmsg: <%s> <%s> <%s> <%s>\n", iface_msg, state_msg,
+		 timestamp_msg, uid_msg);
+	kobject_uevent_env(idletimer_tg_kobj, KOBJ_CHANGE, envp);
+	return;
+
+
+}
+
 static
 struct idletimer_tg *__idletimer_tg_find_by_label(const char *label)
 {
@@ -78,25 +179,30 @@
 	return NULL;
 }
 
-static ssize_t idletimer_tg_show(struct kobject *kobj, struct attribute *attr,
-				 char *buf)
+static ssize_t idletimer_tg_show(struct device *dev,
+				 struct device_attribute *attr, char *buf)
 {
 	struct idletimer_tg *timer;
 	unsigned long expires = 0;
+	unsigned long now = jiffies;
 
 	mutex_lock(&list_mutex);
 
-	timer =	__idletimer_tg_find_by_label(attr->name);
+	timer =	__idletimer_tg_find_by_label(attr->attr.name);
 	if (timer)
 		expires = timer->timer.expires;
 
 	mutex_unlock(&list_mutex);
 
-	if (time_after(expires, jiffies))
+	if (time_after(expires, now))
 		return sprintf(buf, "%u\n",
-			       jiffies_to_msecs(expires - jiffies) / 1000);
+			       jiffies_to_msecs(expires - now) / 1000);
 
-	return sprintf(buf, "0\n");
+	if (timer->send_nl_msg)
+		return sprintf(buf, "0 %d\n",
+			jiffies_to_msecs(now - expires) / 1000);
+	else
+		return sprintf(buf, "0\n");
 }
 
 static void idletimer_tg_work(struct work_struct *work)
@@ -105,6 +211,9 @@
 						  work);
 
 	sysfs_notify(idletimer_tg_kobj, NULL, timer->attr.attr.name);
+
+	if (timer->send_nl_msg)
+		notify_netlink_uevent(timer->attr.attr.name, timer);
 }
 
 static void idletimer_tg_expired(struct timer_list *t)
@@ -112,8 +221,60 @@
 	struct idletimer_tg *timer = from_timer(timer, t, timer);
 
 	pr_debug("timer %s expired\n", timer->attr.attr.name);
-
+	spin_lock_bh(&timestamp_lock);
+	timer->active = false;
+	timer->work_pending = true;
 	schedule_work(&timer->work);
+	spin_unlock_bh(&timestamp_lock);
+}
+
+static int idletimer_resume(struct notifier_block *notifier,
+		unsigned long pm_event, void *unused)
+{
+	struct timespec ts;
+	unsigned long time_diff, now = jiffies;
+	struct idletimer_tg *timer = container_of(notifier,
+			struct idletimer_tg, pm_nb);
+	if (!timer)
+		return NOTIFY_DONE;
+	switch (pm_event) {
+	case PM_SUSPEND_PREPARE:
+		get_monotonic_boottime(&timer->last_suspend_time);
+		timer->suspend_time_valid = true;
+		break;
+	case PM_POST_SUSPEND:
+		if (!timer->suspend_time_valid)
+			break;
+		timer->suspend_time_valid = false;
+
+		spin_lock_bh(&timestamp_lock);
+		if (!timer->active) {
+			spin_unlock_bh(&timestamp_lock);
+			break;
+		}
+		/* since jiffies are not updated when suspended now represents
+		 * the time it would have suspended */
+		if (time_after(timer->timer.expires, now)) {
+			get_monotonic_boottime(&ts);
+			ts = timespec_sub(ts, timer->last_suspend_time);
+			time_diff = timespec_to_jiffies(&ts);
+			if (timer->timer.expires > (time_diff + now)) {
+				mod_timer_pending(&timer->timer,
+						(timer->timer.expires - time_diff));
+			} else {
+				del_timer(&timer->timer);
+				timer->timer.expires = 0;
+				timer->active = false;
+				timer->work_pending = true;
+				schedule_work(&timer->work);
+			}
+		}
+		spin_unlock_bh(&timestamp_lock);
+		break;
+	default:
+		break;
+	}
+	return NOTIFY_DONE;
 }
 
 static int idletimer_check_sysfs_name(const char *name, unsigned int size)
@@ -136,7 +297,7 @@
 {
 	int ret;
 
-	info->timer = kmalloc(sizeof(*info->timer), GFP_KERNEL);
+	info->timer = kzalloc(sizeof(*info->timer), GFP_KERNEL);
 	if (!info->timer) {
 		ret = -ENOMEM;
 		goto out;
@@ -165,6 +326,21 @@
 
 	timer_setup(&info->timer->timer, idletimer_tg_expired, 0);
 	info->timer->refcnt = 1;
+	info->timer->send_nl_msg = (info->send_nl_msg == 0) ? false : true;
+	info->timer->active = true;
+	info->timer->timeout = info->timeout;
+
+	info->timer->delayed_timer_trigger.tv_sec = 0;
+	info->timer->delayed_timer_trigger.tv_nsec = 0;
+	info->timer->work_pending = false;
+	info->timer->uid = 0;
+	get_monotonic_boottime(&info->timer->last_modified_timer);
+
+	info->timer->pm_nb.notifier_call = idletimer_resume;
+	ret = register_pm_notifier(&info->timer->pm_nb);
+	if (ret)
+		printk(KERN_WARNING "[%s] Failed to register pm notifier %d\n",
+				__func__, ret);
 
 	INIT_WORK(&info->timer->work, idletimer_tg_work);
 
@@ -181,6 +357,42 @@
 	return ret;
 }
 
+static void reset_timer(const struct idletimer_tg_info *info,
+			struct sk_buff *skb)
+{
+	unsigned long now = jiffies;
+	struct idletimer_tg *timer = info->timer;
+	bool timer_prev;
+
+	spin_lock_bh(&timestamp_lock);
+	timer_prev = timer->active;
+	timer->active = true;
+	/* timer_prev is used to guard overflow problem in time_before*/
+	if (!timer_prev || time_before(timer->timer.expires, now)) {
+		pr_debug("Starting Checkentry timer (Expired, Jiffies): %lu, %lu\n",
+				timer->timer.expires, now);
+
+		/* Stores the uid resposible for waking up the radio */
+		if (skb && (skb->sk)) {
+			timer->uid = from_kuid_munged(current_user_ns(),
+					sock_i_uid(skb_to_full_sk(skb)));
+		}
+
+		/* checks if there is a pending inactive notification*/
+		if (timer->work_pending)
+			timer->delayed_timer_trigger = timer->last_modified_timer;
+		else {
+			timer->work_pending = true;
+			schedule_work(&timer->work);
+		}
+	}
+
+	get_monotonic_boottime(&timer->last_modified_timer);
+	mod_timer(&timer->timer,
+			msecs_to_jiffies(info->timeout * 1000) + now);
+	spin_unlock_bh(&timestamp_lock);
+}
+
 /*
  * The actual xt_tables plugin.
  */
@@ -188,15 +400,23 @@
 					 const struct xt_action_param *par)
 {
 	const struct idletimer_tg_info *info = par->targinfo;
+	unsigned long now = jiffies;
 
 	pr_debug("resetting timer %s, timeout period %u\n",
 		 info->label, info->timeout);
 
 	BUG_ON(!info->timer);
 
-	mod_timer(&info->timer->timer,
-		  msecs_to_jiffies(info->timeout * 1000) + jiffies);
+	info->timer->active = true;
 
+	if (time_before(info->timer->timer.expires, now)) {
+		schedule_work(&info->timer->work);
+		pr_debug("Starting timer %s (Expired, Jiffies): %lu, %lu\n",
+			 info->label, info->timer->timer.expires, now);
+	}
+
+	/* TODO: Avoid modifying timers on each packet */
+	reset_timer(info, skb);
 	return XT_CONTINUE;
 }
 
@@ -205,7 +425,7 @@
 	struct idletimer_tg_info *info = par->targinfo;
 	int ret;
 
-	pr_debug("checkentry targinfo%s\n", info->label);
+	pr_debug("checkentry targinfo %s\n", info->label);
 
 	if (info->timeout == 0) {
 		pr_debug("timeout value is zero\n");
@@ -227,9 +447,7 @@
 	info->timer = __idletimer_tg_find_by_label(info->label);
 	if (info->timer) {
 		info->timer->refcnt++;
-		mod_timer(&info->timer->timer,
-			  msecs_to_jiffies(info->timeout * 1000) + jiffies);
-
+		reset_timer(info, NULL);
 		pr_debug("increased refcnt of timer %s to %u\n",
 			 info->label, info->timer->refcnt);
 	} else {
@@ -242,6 +460,7 @@
 	}
 
 	mutex_unlock(&list_mutex);
+
 	return 0;
 }
 
@@ -258,13 +477,14 @@
 
 		list_del(&info->timer->entry);
 		del_timer_sync(&info->timer->timer);
-		cancel_work_sync(&info->timer->work);
 		sysfs_remove_file(idletimer_tg_kobj, &info->timer->attr.attr);
+		unregister_pm_notifier(&info->timer->pm_nb);
+		cancel_work_sync(&info->timer->work);
 		kfree(info->timer->attr.attr.name);
 		kfree(info->timer);
 	} else {
 		pr_debug("decreased refcnt of timer %s to %u\n",
-			 info->label, info->timer->refcnt);
+		info->label, info->timer->refcnt);
 	}
 
 	mutex_unlock(&list_mutex);
@@ -272,6 +492,7 @@
 
 static struct xt_target idletimer_tg __read_mostly = {
 	.name		= "IDLETIMER",
+	.revision	= 1,
 	.family		= NFPROTO_UNSPEC,
 	.target		= idletimer_tg_target,
 	.targetsize     = sizeof(struct idletimer_tg_info),
@@ -338,3 +559,4 @@
 MODULE_LICENSE("GPL v2");
 MODULE_ALIAS("ipt_IDLETIMER");
 MODULE_ALIAS("ip6t_IDLETIMER");
+MODULE_ALIAS("arpt_IDLETIMER");
diff --git a/net/netfilter/xt_quota2.c b/net/netfilter/xt_quota2.c
new file mode 100644
index 0000000..c427244
--- /dev/null
+++ b/net/netfilter/xt_quota2.c
@@ -0,0 +1,401 @@
+/*
+ * xt_quota2 - enhanced xt_quota that can count upwards and in packets
+ * as a minimal accounting match.
+ * by Jan Engelhardt <jengelh@medozas.de>, 2008
+ *
+ * Originally based on xt_quota.c:
+ * 	netfilter module to enforce network quotas
+ * 	Sam Johnston <samj@samj.net>
+ *
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License; either
+ *	version 2 of the License, as published by the Free Software Foundation.
+ */
+#include <linux/list.h>
+#include <linux/module.h>
+#include <linux/proc_fs.h>
+#include <linux/skbuff.h>
+#include <linux/spinlock.h>
+#include <asm/atomic.h>
+#include <net/netlink.h>
+
+#include <linux/netfilter/x_tables.h>
+#include <linux/netfilter/xt_quota2.h>
+
+#ifdef CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG
+/* For compatibility, these definitions are copied from the
+ * deprecated header file <linux/netfilter_ipv4/ipt_ULOG.h> */
+#define ULOG_MAC_LEN	80
+#define ULOG_PREFIX_LEN	32
+
+/* Format of the ULOG packets passed through netlink */
+typedef struct ulog_packet_msg {
+	unsigned long mark;
+	long timestamp_sec;
+	long timestamp_usec;
+	unsigned int hook;
+	char indev_name[IFNAMSIZ];
+	char outdev_name[IFNAMSIZ];
+	size_t data_len;
+	char prefix[ULOG_PREFIX_LEN];
+	unsigned char mac_len;
+	unsigned char mac[ULOG_MAC_LEN];
+	unsigned char payload[0];
+} ulog_packet_msg_t;
+#endif
+
+/**
+ * @lock:	lock to protect quota writers from each other
+ */
+struct xt_quota_counter {
+	u_int64_t quota;
+	spinlock_t lock;
+	struct list_head list;
+	atomic_t ref;
+	char name[sizeof(((struct xt_quota_mtinfo2 *)NULL)->name)];
+	struct proc_dir_entry *procfs_entry;
+};
+
+#ifdef CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG
+/* Harald's favorite number +1 :D From ipt_ULOG.C */
+static int qlog_nl_event = 112;
+module_param_named(event_num, qlog_nl_event, uint, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(event_num,
+		 "Event number for NETLINK_NFLOG message. 0 disables log."
+		 "111 is what ipt_ULOG uses.");
+static struct sock *nflognl;
+#endif
+
+static LIST_HEAD(counter_list);
+static DEFINE_SPINLOCK(counter_list_lock);
+
+static struct proc_dir_entry *proc_xt_quota;
+static unsigned int quota_list_perms = S_IRUGO | S_IWUSR;
+static kuid_t quota_list_uid = KUIDT_INIT(0);
+static kgid_t quota_list_gid = KGIDT_INIT(0);
+module_param_named(perms, quota_list_perms, uint, S_IRUGO | S_IWUSR);
+
+#ifdef CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG
+static void quota2_log(unsigned int hooknum,
+		       const struct sk_buff *skb,
+		       const struct net_device *in,
+		       const struct net_device *out,
+		       const char *prefix)
+{
+	ulog_packet_msg_t *pm;
+	struct sk_buff *log_skb;
+	size_t size;
+	struct nlmsghdr *nlh;
+
+	if (!qlog_nl_event)
+		return;
+
+	size = NLMSG_SPACE(sizeof(*pm));
+	size = max(size, (size_t)NLMSG_GOODSIZE);
+	log_skb = alloc_skb(size, GFP_ATOMIC);
+	if (!log_skb) {
+		pr_err("xt_quota2: cannot alloc skb for logging\n");
+		return;
+	}
+
+	nlh = nlmsg_put(log_skb, /*pid*/0, /*seq*/0, qlog_nl_event,
+			sizeof(*pm), 0);
+	if (!nlh) {
+		pr_err("xt_quota2: nlmsg_put failed\n");
+		kfree_skb(log_skb);
+		return;
+	}
+	pm = nlmsg_data(nlh);
+	if (skb->tstamp == 0)
+		__net_timestamp((struct sk_buff *)skb);
+	pm->data_len = 0;
+	pm->hook = hooknum;
+	if (prefix != NULL)
+		strlcpy(pm->prefix, prefix, sizeof(pm->prefix));
+	else
+		*(pm->prefix) = '\0';
+	if (in)
+		strlcpy(pm->indev_name, in->name, sizeof(pm->indev_name));
+	else
+		pm->indev_name[0] = '\0';
+
+	if (out)
+		strlcpy(pm->outdev_name, out->name, sizeof(pm->outdev_name));
+	else
+		pm->outdev_name[0] = '\0';
+
+	NETLINK_CB(log_skb).dst_group = 1;
+	pr_debug("throwing 1 packets to netlink group 1\n");
+	netlink_broadcast(nflognl, log_skb, 0, 1, GFP_ATOMIC);
+}
+#else
+static void quota2_log(unsigned int hooknum,
+		       const struct sk_buff *skb,
+		       const struct net_device *in,
+		       const struct net_device *out,
+		       const char *prefix)
+{
+}
+#endif  /* if+else CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG */
+
+static ssize_t quota_proc_read(struct file *file, char __user *buf,
+			   size_t size, loff_t *ppos)
+{
+	struct xt_quota_counter *e = PDE_DATA(file_inode(file));
+	char tmp[24];
+	size_t tmp_size;
+
+	spin_lock_bh(&e->lock);
+	tmp_size = scnprintf(tmp, sizeof(tmp), "%llu\n", e->quota);
+	spin_unlock_bh(&e->lock);
+	return simple_read_from_buffer(buf, size, ppos, tmp, tmp_size);
+}
+
+static ssize_t quota_proc_write(struct file *file, const char __user *input,
+                            size_t size, loff_t *ppos)
+{
+	struct xt_quota_counter *e = PDE_DATA(file_inode(file));
+	char buf[sizeof("18446744073709551616")];
+
+	if (size > sizeof(buf))
+		size = sizeof(buf);
+	if (copy_from_user(buf, input, size) != 0)
+		return -EFAULT;
+	buf[sizeof(buf)-1] = '\0';
+
+	spin_lock_bh(&e->lock);
+	e->quota = simple_strtoull(buf, NULL, 0);
+	spin_unlock_bh(&e->lock);
+	return size;
+}
+
+static const struct file_operations q2_counter_fops = {
+	.read		= quota_proc_read,
+	.write		= quota_proc_write,
+	.llseek		= default_llseek,
+};
+
+static struct xt_quota_counter *
+q2_new_counter(const struct xt_quota_mtinfo2 *q, bool anon)
+{
+	struct xt_quota_counter *e;
+	unsigned int size;
+
+	/* Do not need all the procfs things for anonymous counters. */
+	size = anon ? offsetof(typeof(*e), list) : sizeof(*e);
+	e = kmalloc(size, GFP_KERNEL);
+	if (e == NULL)
+		return NULL;
+
+	e->quota = q->quota;
+	spin_lock_init(&e->lock);
+	if (!anon) {
+		INIT_LIST_HEAD(&e->list);
+		atomic_set(&e->ref, 1);
+		strlcpy(e->name, q->name, sizeof(e->name));
+	}
+	return e;
+}
+
+/**
+ * q2_get_counter - get ref to counter or create new
+ * @name:	name of counter
+ */
+static struct xt_quota_counter *
+q2_get_counter(const struct xt_quota_mtinfo2 *q)
+{
+	struct proc_dir_entry *p;
+	struct xt_quota_counter *e = NULL;
+	struct xt_quota_counter *new_e;
+
+	if (*q->name == '\0')
+		return q2_new_counter(q, true);
+
+	/* No need to hold a lock while getting a new counter */
+	new_e = q2_new_counter(q, false);
+	if (new_e == NULL)
+		goto out;
+
+	spin_lock_bh(&counter_list_lock);
+	list_for_each_entry(e, &counter_list, list)
+		if (strcmp(e->name, q->name) == 0) {
+			atomic_inc(&e->ref);
+			spin_unlock_bh(&counter_list_lock);
+			kfree(new_e);
+			pr_debug("xt_quota2: old counter name=%s", e->name);
+			return e;
+		}
+	e = new_e;
+	pr_debug("xt_quota2: new_counter name=%s", e->name);
+	list_add_tail(&e->list, &counter_list);
+	/* The entry having a refcount of 1 is not directly destructible.
+	 * This func has not yet returned the new entry, thus iptables
+	 * has not references for destroying this entry.
+	 * For another rule to try to destroy it, it would 1st need for this
+	 * func* to be re-invoked, acquire a new ref for the same named quota.
+	 * Nobody will access the e->procfs_entry either.
+	 * So release the lock. */
+	spin_unlock_bh(&counter_list_lock);
+
+	/* create_proc_entry() is not spin_lock happy */
+	p = e->procfs_entry = proc_create_data(e->name, quota_list_perms,
+	                      proc_xt_quota, &q2_counter_fops, e);
+
+	if (IS_ERR_OR_NULL(p)) {
+		spin_lock_bh(&counter_list_lock);
+		list_del(&e->list);
+		spin_unlock_bh(&counter_list_lock);
+		goto out;
+	}
+	proc_set_user(p, quota_list_uid, quota_list_gid);
+	return e;
+
+ out:
+	kfree(e);
+	return NULL;
+}
+
+static int quota_mt2_check(const struct xt_mtchk_param *par)
+{
+	struct xt_quota_mtinfo2 *q = par->matchinfo;
+
+	pr_debug("xt_quota2: check() flags=0x%04x", q->flags);
+
+	if (q->flags & ~XT_QUOTA_MASK)
+		return -EINVAL;
+
+	q->name[sizeof(q->name)-1] = '\0';
+	if (*q->name == '.' || strchr(q->name, '/') != NULL) {
+		printk(KERN_ERR "xt_quota.3: illegal name\n");
+		return -EINVAL;
+	}
+
+	q->master = q2_get_counter(q);
+	if (q->master == NULL) {
+		printk(KERN_ERR "xt_quota.3: memory alloc failure\n");
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
+static void quota_mt2_destroy(const struct xt_mtdtor_param *par)
+{
+	struct xt_quota_mtinfo2 *q = par->matchinfo;
+	struct xt_quota_counter *e = q->master;
+
+	if (*q->name == '\0') {
+		kfree(e);
+		return;
+	}
+
+	spin_lock_bh(&counter_list_lock);
+	if (!atomic_dec_and_test(&e->ref)) {
+		spin_unlock_bh(&counter_list_lock);
+		return;
+	}
+
+	list_del(&e->list);
+	spin_unlock_bh(&counter_list_lock);
+	remove_proc_entry(e->name, proc_xt_quota);
+	kfree(e);
+}
+
+static bool
+quota_mt2(const struct sk_buff *skb, struct xt_action_param *par)
+{
+	struct xt_quota_mtinfo2 *q = (void *)par->matchinfo;
+	struct xt_quota_counter *e = q->master;
+	bool ret = q->flags & XT_QUOTA_INVERT;
+
+	spin_lock_bh(&e->lock);
+	if (q->flags & XT_QUOTA_GROW) {
+		/*
+		 * While no_change is pointless in "grow" mode, we will
+		 * implement it here simply to have a consistent behavior.
+		 */
+		if (!(q->flags & XT_QUOTA_NO_CHANGE)) {
+			e->quota += (q->flags & XT_QUOTA_PACKET) ? 1 : skb->len;
+		}
+		ret = true;
+	} else {
+		if (e->quota >= skb->len) {
+			if (!(q->flags & XT_QUOTA_NO_CHANGE))
+				e->quota -= (q->flags & XT_QUOTA_PACKET) ? 1 : skb->len;
+			ret = !ret;
+		} else {
+			/* We are transitioning, log that fact. */
+			if (e->quota) {
+				quota2_log(xt_hooknum(par),
+					   skb,
+					   xt_in(par),
+					   xt_out(par),
+					   q->name);
+			}
+			/* we do not allow even small packets from now on */
+			e->quota = 0;
+		}
+	}
+	spin_unlock_bh(&e->lock);
+	return ret;
+}
+
+static struct xt_match quota_mt2_reg[] __read_mostly = {
+	{
+		.name       = "quota2",
+		.revision   = 3,
+		.family     = NFPROTO_IPV4,
+		.checkentry = quota_mt2_check,
+		.match      = quota_mt2,
+		.destroy    = quota_mt2_destroy,
+		.matchsize  = sizeof(struct xt_quota_mtinfo2),
+		.me         = THIS_MODULE,
+	},
+	{
+		.name       = "quota2",
+		.revision   = 3,
+		.family     = NFPROTO_IPV6,
+		.checkentry = quota_mt2_check,
+		.match      = quota_mt2,
+		.destroy    = quota_mt2_destroy,
+		.matchsize  = sizeof(struct xt_quota_mtinfo2),
+		.me         = THIS_MODULE,
+	},
+};
+
+static int __init quota_mt2_init(void)
+{
+	int ret;
+	pr_debug("xt_quota2: init()");
+
+#ifdef CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG
+	nflognl = netlink_kernel_create(&init_net, NETLINK_NFLOG, NULL);
+	if (!nflognl)
+		return -ENOMEM;
+#endif
+
+	proc_xt_quota = proc_mkdir("xt_quota", init_net.proc_net);
+	if (proc_xt_quota == NULL)
+		return -EACCES;
+
+	ret = xt_register_matches(quota_mt2_reg, ARRAY_SIZE(quota_mt2_reg));
+	if (ret < 0)
+		remove_proc_entry("xt_quota", init_net.proc_net);
+	pr_debug("xt_quota2: init() %d", ret);
+	return ret;
+}
+
+static void __exit quota_mt2_exit(void)
+{
+	xt_unregister_matches(quota_mt2_reg, ARRAY_SIZE(quota_mt2_reg));
+	remove_proc_entry("xt_quota", init_net.proc_net);
+}
+
+module_init(quota_mt2_init);
+module_exit(quota_mt2_exit);
+MODULE_DESCRIPTION("Xtables: countdown quota match; up counter");
+MODULE_AUTHOR("Sam Johnston <samj@samj.net>");
+MODULE_AUTHOR("Jan Engelhardt <jengelh@medozas.de>");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("ipt_quota2");
+MODULE_ALIAS("ip6t_quota2");
diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c
index 44ac85f..d0ca0db 100644
--- a/net/xfrm/xfrm_algo.c
+++ b/net/xfrm/xfrm_algo.c
@@ -241,7 +241,7 @@
 
 	.uinfo = {
 		.auth = {
-			.icv_truncbits = 96,
+			.icv_truncbits = 128,
 			.icv_fullbits = 256,
 		}
 	},
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index 47a8ff9..c1900e4 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -2093,11 +2093,6 @@
 	struct xfrm_mgr *km;
 	struct xfrm_policy *pol = NULL;
 
-#ifdef CONFIG_COMPAT
-	if (in_compat_syscall())
-		return -EOPNOTSUPP;
-#endif
-
 	if (!optval && !optlen) {
 		xfrm_sk_policy_insert(sk, XFRM_POLICY_IN, NULL);
 		xfrm_sk_policy_insert(sk, XFRM_POLICY_OUT, NULL);
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index 1484bc9..1bb6992 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -2633,11 +2633,6 @@
 	const struct xfrm_link *link;
 	int type, err;
 
-#ifdef CONFIG_COMPAT
-	if (in_compat_syscall())
-		return -EOPNOTSUPP;
-#endif
-
 	type = nlh->nlmsg_type;
 	if (type > XFRM_MSG_MAX)
 		return -EINVAL;
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 64fac0a..585ea17 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -185,6 +185,23 @@
 
 cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
 
+ifdef CONFIG_LTO_CLANG
+# Generate .o.symversions files for each .o with exported symbols, and link these
+# to the kernel and/or modules at the end.
+cmd_modversions_c =								\
+	if $(OBJDUMP) -h $(@D)/.tmp_$(@F) >/dev/null 2>/dev/null; then		\
+		if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then	\
+			$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
+			    > $(@D)/$(@F).symversions;				\
+		fi;								\
+	else									\
+		if $(LLVM_NM) $(@D)/.tmp_$(@F) | grep -q __ksymtab; then	\
+			$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
+			    > $(@D)/$(@F).symversions;				\
+		fi;								\
+	fi;									\
+	mv -f $(@D)/.tmp_$(@F) $@;
+else
 cmd_modversions_c =								\
 	if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then		\
 		$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))	\
@@ -197,6 +214,7 @@
 		mv -f $(@D)/.tmp_$(@F) $@;					\
 	fi;
 endif
+endif
 
 ifdef CONFIG_FTRACE_MCOUNT_RECORD
 ifndef CC_USING_RECORD_MCOUNT
@@ -205,6 +223,12 @@
 ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
   RECORDMCOUNT_FLAGS = -w
 endif
+
+ifdef CONFIG_LTO_CLANG
+# With LTO, we postpone running recordmcount until after the LTO link step, so
+# let's export the parameters for the link script.
+export RECORDMCOUNT_FLAGS
+else
 # Due to recursion, we must skip empty.o.
 # The empty.o file is created in the make process in order to determine
 # the target endianness and word size. It is made before all other C
@@ -213,22 +237,28 @@
 	if [ $(@) != "scripts/mod/empty.o" ]; then	\
 		$(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)";	\
 	fi;
+endif
+
 recordmcount_source := $(srctree)/scripts/recordmcount.c \
 		    $(srctree)/scripts/recordmcount.h
-else
+else # !BUILD_C_RECORDMCOUNT
 sub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
 	"$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \
 	"$(if $(CONFIG_64BIT),64,32)" \
 	"$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS)" \
 	"$(LD) $(KBUILD_LDFLAGS)" "$(NM)" "$(RM)" "$(MV)" \
 	"$(if $(part-of-module),1,0)" "$(@)";
+
 recordmcount_source := $(srctree)/scripts/recordmcount.pl
 endif # BUILD_C_RECORDMCOUNT
+
+ifndef CONFIG_LTO_CLANG
 cmd_record_mcount =						\
 	if [ "$(findstring $(CC_FLAGS_FTRACE),$(_c_flags))" =	\
 	     "$(CC_FLAGS_FTRACE)" ]; then			\
 		$(sub_cmd_record_mcount)			\
 	fi;
+endif # CONFIG_LTO_CLANG
 endif # CC_USING_RECORD_MCOUNT
 endif # CONFIG_FTRACE_MCOUNT_RECORD
 
@@ -429,6 +459,26 @@
 # To build objects in subdirs, we need to descend into the directories
 $(sort $(subdir-obj-y)): $(subdir-ym) ;
 
+ifdef CONFIG_LTO_CLANG
+  ifdef CONFIG_MODVERSIONS
+    # combine symversions for later processing
+    update_lto_symversions =				\
+	rm -f $@.symversions; 				\
+	for i in $(filter-out FORCE,$^); do		\
+		if [ -f $$i.symversions ]; then		\
+			cat $$i.symversions 		\
+				>> $@.symversions;	\
+		fi;					\
+	done;
+  endif
+  # rebuild the symbol table with llvm-ar to include IR files
+  update_lto_symtable = ;				\
+	mv -f $@ $@.tmp;				\
+	$(LLVM_AR) rcsT$(KBUILD_ARFLAGS) $@ 		\
+		$$($(AR) t $@.tmp); 			\
+	rm -f $@.tmp
+endif
+
 #
 # Rule to compile a set of .o files into one .o file
 #
@@ -439,7 +489,8 @@
 # scripts/link-vmlinux.sh builds an aggregate built-in.a with a symbol
 # table and index.
 quiet_cmd_ar_builtin = AR      $@
-      cmd_ar_builtin = rm -f $@; \
+      cmd_ar_builtin = $(update_lto_symversions) \
+		     rm -f $@; \
                      $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(filter $(real-obj-y), $^)
 
 $(builtin-target): $(real-obj-y) FORCE
@@ -468,7 +519,11 @@
 quiet_cmd_link_l_target = AR      $@
 
 # lib target archives do get a symbol table and index
-cmd_link_l_target = rm -f $@; $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(lib-y)
+cmd_link_l_target = 					\
+	$(update_lto_symversions)			\
+	rm -f $@; 					\
+	$(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(lib-y)	\
+	$(update_lto_symtable)
 
 $(lib-target): $(lib-y) FORCE
 	$(call if_changed,link_l_target)
@@ -479,13 +534,34 @@
 ksyms-lds = $(dot-target).lds
 
 quiet_cmd_export_list = EXPORTS $@
-cmd_export_list = $(OBJDUMP) -h $< | \
-	sed -ne '/___ksymtab/s/.*+\([^ ]*\).*/EXTERN(\1)/p' >$(ksyms-lds);\
-	rm -f $(dummy-object);\
+filter_export_list = sed -ne '/___ksymtab/s/.*+\([^ ]*\).*/EXTERN(\1)/p'
+link_export_list = rm -f $(dummy-object); \
 	echo | $(CC) $(a_flags) -c -o $(dummy-object) -x assembler -;\
 	$(LD) $(ld_flags) -r -o $@ -T $(ksyms-lds) $(dummy-object);\
 	rm $(dummy-object) $(ksyms-lds)
 
+ifdef CONFIG_LTO_CLANG
+# objdump doesn't understand IR files and llvm-nm doesn't support archives,
+# so we'll walk through each file in the archive separately
+cmd_export_list = 					\
+	rm -f $(ksyms-lds);				\
+	for o in $$($(AR) t $<); do			\
+		if $(OBJDUMP) -h $$o >/dev/null 2>/dev/null; then \
+			$(OBJDUMP) -h $$o | 		\
+				$(filter_export_list) 	\
+				>>$(ksyms-lds);		\
+		else					\
+			$(LLVM_NM) $$o |		\
+				$(filter_export_list) 	\
+				>>$(ksyms-lds);		\
+		fi; 					\
+	done;						\
+	$(link_export_list)
+else
+cmd_export_list = $(OBJDUMP) -h $< | $(filter_export_list) >$(ksyms-lds); \
+	$(link_export_list)
+endif
+
 $(obj)/lib-ksyms.o: $(lib-target) FORCE
 	$(call if_changed,export_list)
 
@@ -509,13 +585,31 @@
 $($(subst $(obj)/,,$(@:.o=-y)))       \
 $($(subst $(obj)/,,$(@:.o=-m)))), $^)
 
+cmd_link_multi-link = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
+
+quiet_cmd_link_multi-y = AR      $@
+cmd_link_multi-y = $(update_lto_symversions) \
+	rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(link_multi_deps) \
+	$(update_lto_symtable)
+
 quiet_cmd_link_multi-m = LD [M]  $@
-cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
+
+ifdef CONFIG_LTO_CLANG
+  # don't compile IR until needed
+  cmd_link_multi-m = $(cmd_link_multi-y)
+else
+  cmd_link_multi-m = $(cmd_link_multi-link)
+endif
+
+$(multi-used-y): FORCE
+	$(call if_changed,link_multi-y)
 
 $(multi-used-m): FORCE
 	$(call if_changed,link_multi-m)
 	@{ echo $(@:.o=.ko); echo $(link_multi_deps); \
 	   $(cmd_undef_syms); } > $(MODVERDIR)/$(@F:.o=.mod)
+
+$(call multi_depend, $(multi-used-y), .o, -objs -y)
 $(call multi_depend, $(multi-used-m), .o, -objs -y -m)
 
 targets += $(multi-used-m)
diff --git a/scripts/Makefile.kasan b/scripts/Makefile.kasan
index 69552a3..6410bd2 100644
--- a/scripts/Makefile.kasan
+++ b/scripts/Makefile.kasan
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
-ifdef CONFIG_KASAN
+ifdef CONFIG_KASAN_GENERIC
+
 ifdef CONFIG_KASAN_INLINE
 	call_threshold := 10000
 else
@@ -12,36 +13,39 @@
 
 cc-param = $(call cc-option, -mllvm -$(1), $(call cc-option, --param $(1)))
 
-ifeq ($(call cc-option, $(CFLAGS_KASAN_MINIMAL) -Werror),)
-   ifneq ($(CONFIG_COMPILE_TEST),y)
-        $(warning Cannot use CONFIG_KASAN: \
-            -fsanitize=kernel-address is not supported by compiler)
-   endif
-else
-   # -fasan-shadow-offset fails without -fsanitize
-   CFLAGS_KASAN_SHADOW := $(call cc-option, -fsanitize=kernel-address \
+# -fasan-shadow-offset fails without -fsanitize
+CFLAGS_KASAN_SHADOW := $(call cc-option, -fsanitize=kernel-address \
 			-fasan-shadow-offset=$(KASAN_SHADOW_OFFSET), \
 			$(call cc-option, -fsanitize=kernel-address \
 			-mllvm -asan-mapping-offset=$(KASAN_SHADOW_OFFSET)))
 
-   ifeq ($(strip $(CFLAGS_KASAN_SHADOW)),)
-      CFLAGS_KASAN := $(CFLAGS_KASAN_MINIMAL)
-   else
-      # Now add all the compiler specific options that are valid standalone
-      CFLAGS_KASAN := $(CFLAGS_KASAN_SHADOW) \
-	$(call cc-param,asan-globals=1) \
-	$(call cc-param,asan-instrumentation-with-call-threshold=$(call_threshold)) \
-	$(call cc-param,asan-stack=1) \
-	$(call cc-param,asan-use-after-scope=1) \
-	$(call cc-param,asan-instrument-allocas=1)
-   endif
-
+ifeq ($(strip $(CFLAGS_KASAN_SHADOW)),)
+	CFLAGS_KASAN := $(CFLAGS_KASAN_MINIMAL)
+else
+	# Now add all the compiler specific options that are valid standalone
+	CFLAGS_KASAN := $(CFLAGS_KASAN_SHADOW) \
+	 $(call cc-param,asan-globals=1) \
+	 $(call cc-param,asan-instrumentation-with-call-threshold=$(call_threshold)) \
+	 $(call cc-param,asan-stack=$(CONFIG_KASAN_STACK)) \
+	 $(call cc-param,asan-instrument-allocas=1)
 endif
 
-ifdef CONFIG_KASAN_EXTRA
-CFLAGS_KASAN += $(call cc-option, -fsanitize-address-use-after-scope)
+endif # CONFIG_KASAN_GENERIC
+
+ifdef CONFIG_KASAN_SW_TAGS
+
+ifdef CONFIG_KASAN_INLINE
+    instrumentation_flags := -mllvm -hwasan-mapping-offset=$(KASAN_SHADOW_OFFSET)
+else
+    instrumentation_flags := -mllvm -hwasan-instrument-with-calls=1
 endif
 
+CFLAGS_KASAN := -fsanitize=kernel-hwaddress \
+		-mllvm -hwasan-instrument-stack=0 \
+		$(instrumentation_flags)
+
+endif # CONFIG_KASAN_SW_TAGS
+
+ifdef CONFIG_KASAN
 CFLAGS_KASAN_NOSANITIZE := -fno-builtin
-
 endif
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
index 51884c7..15dd58a 100644
--- a/scripts/Makefile.modpost
+++ b/scripts/Makefile.modpost
@@ -83,12 +83,28 @@
 
 MODPOST_OPT=$(subst -i,-n,$(filter -i,$(MAKEFLAGS)))
 
+# If CONFIG_LTO_CLANG is enabled, .o files are either LLVM IR, or empty, so we
+# need to link them into actual objects before passing them to modpost
+modpost-ext = $(if $(CONFIG_LTO_CLANG),.lto,)
+
+ifdef CONFIG_LTO_CLANG
+quiet_cmd_cc_lto_link_modules = LD [M]  $@
+cmd_cc_lto_link_modules =						\
+	$(LD) $(ld_flags) -r -o $(@)					\
+		$(shell [ -s $(@:$(modpost-ext).o=.o.symversions) ] &&	\
+			echo -T $(@:$(modpost-ext).o=.o.symversions))	\
+		--whole-archive $(filter-out FORCE,$^)
+
+$(modules:.ko=$(modpost-ext).o): %$(modpost-ext).o: %.o FORCE
+	$(call if_changed,cc_lto_link_modules)
+endif
+
 # We can go over command line length here, so be careful.
 quiet_cmd_modpost = MODPOST $(words $(filter-out vmlinux FORCE, $^)) modules
-      cmd_modpost = $(MODLISTCMD) | sed 's/\.ko$$/.o/' | $(modpost) $(MODPOST_OPT) -s -T -
+      cmd_modpost = $(MODLISTCMD) | sed 's/\.ko$$/$(modpost-ext)\.o/' | $(modpost) $(MODPOST_OPT) -s -T -
 
 PHONY += __modpost
-__modpost: $(modules:.ko=.o) FORCE
+__modpost: $(modules:.ko=$(modpost-ext).o) FORCE
 	$(call cmd,modpost) $(wildcard vmlinux)
 
 quiet_cmd_kernel-mod = MODPOST $@
@@ -100,7 +116,6 @@
 # Declare generated files as targets for modpost
 $(modules:.ko=.mod.c): __modpost ;
 
-
 # Step 5), compile all *.mod.c files
 
 # modname is set to make c_flags define KBUILD_MODNAME
@@ -119,13 +134,28 @@
 
 # Step 6), final link of the modules with optional arch pass after final link
 quiet_cmd_ld_ko_o = LD [M]  $@
+
+ifdef CONFIG_LTO_CLANG
+      cmd_ld_ko_o = 							\
+	$(LD) -r $(LDFLAGS)                                 		\
+		 $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) 		\
+		 $(shell [ -s $(@:.ko=.o.symversions) ] &&		\
+			echo -T $(@:.ko=.o.symversions))  		\
+		 -o $@ --whole-archive					\
+		 $(filter-out FORCE,$(^:$(modpost-ext).o=.o))
+
+  ifdef CONFIG_FTRACE_MCOUNT_RECORD
+      cmd_ld_ko_o += ; $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) $@
+  endif
+else
       cmd_ld_ko_o =                                                     \
 	$(LD) -r $(KBUILD_LDFLAGS)                                      \
                  $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE)             \
                  -o $@ $(filter-out FORCE,$^) ;                         \
 	$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
+endif
 
-$(modules): %.ko :%.o %.mod.o FORCE
+$(modules): %.ko: %$(modpost-ext).o %.mod.o FORCE
 	+$(call if_changed,ld_ko_o)
 
 targets += $(modules)
diff --git a/scripts/clang-android.sh b/scripts/clang-android.sh
new file mode 100755
index 0000000..9186c4f
--- /dev/null
+++ b/scripts/clang-android.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+$* -dM -E - </dev/null 2>&1 | grep -q __ANDROID__ && echo "y"
diff --git a/scripts/gcc-plugins/Kconfig b/scripts/gcc-plugins/Kconfig
index cb0c889..21f4b68 100644
--- a/scripts/gcc-plugins/Kconfig
+++ b/scripts/gcc-plugins/Kconfig
@@ -13,17 +13,19 @@
 	  An arch should select this symbol if it supports building with
 	  GCC plugins.
 
-menuconfig GCC_PLUGINS
-	bool "GCC plugins"
+config GCC_PLUGINS
+	bool
 	depends on HAVE_GCC_PLUGINS
 	depends on PLUGIN_HOSTCC != ""
+	default y
 	help
 	  GCC plugins are loadable modules that provide extra features to the
 	  compiler. They are useful for runtime instrumentation and static analysis.
 
 	  See Documentation/gcc-plugins.txt for details.
 
-if GCC_PLUGINS
+menu "GCC plugins"
+	depends on GCC_PLUGINS
 
 config GCC_PLUGIN_CYC_COMPLEXITY
 	bool "Compute the cyclomatic complexity of a function" if EXPERT
@@ -66,39 +68,6 @@
 	   * https://grsecurity.net/
 	   * https://pax.grsecurity.net/
 
-config GCC_PLUGIN_STRUCTLEAK
-	bool "Force initialization of variables containing userspace addresses"
-	# Currently STRUCTLEAK inserts initialization out of live scope of
-	# variables from KASAN point of view. This leads to KASAN false
-	# positive reports. Prohibit this combination for now.
-	depends on !KASAN_EXTRA
-	help
-	  This plugin zero-initializes any structures containing a
-	  __user attribute. This can prevent some classes of information
-	  exposures.
-
-	  This plugin was ported from grsecurity/PaX. More information at:
-	   * https://grsecurity.net/
-	   * https://pax.grsecurity.net/
-
-config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL
-	bool "Force initialize all struct type variables passed by reference"
-	depends on GCC_PLUGIN_STRUCTLEAK
-	depends on !COMPILE_TEST
-	help
-	  Zero initialize any struct type local variable that may be passed by
-	  reference without having been initialized.
-
-config GCC_PLUGIN_STRUCTLEAK_VERBOSE
-	bool "Report forcefully initialized variables"
-	depends on GCC_PLUGIN_STRUCTLEAK
-	depends on !COMPILE_TEST	# too noisy
-	help
-	  This option will cause a warning to be printed each time the
-	  structleak plugin finds a variable it thinks needs to be
-	  initialized. Since not all existing initializers are detected
-	  by the plugin, this can produce false positive warnings.
-
 config GCC_PLUGIN_RANDSTRUCT
 	bool "Randomize layout of sensitive kernel structures"
 	select MODVERSIONS if MODULES
@@ -139,4 +108,4 @@
 	  in structures.  This reduces the performance hit of RANDSTRUCT
 	  at the cost of weakened randomization.
 
-endif
+endmenu
diff --git a/scripts/generate_initcall_order.pl b/scripts/generate_initcall_order.pl
new file mode 100755
index 0000000..f772b4a
--- /dev/null
+++ b/scripts/generate_initcall_order.pl
@@ -0,0 +1,250 @@
+#!/usr/bin/env perl
+# SPDX-License-Identifier: GPL-2.0
+#
+# Generates a linker script that specifies the correct initcall order.
+#
+# Copyright (C) 2019 Google LLC
+
+use strict;
+use warnings;
+use IO::Handle;
+
+my $nm = $ENV{'LLVM_NM'} || "llvm-nm";
+my $ar = $ENV{'AR'}	 || "llvm-ar";
+my $objtree = $ENV{'objtree'} || ".";
+
+## list of all object files to process, in link order
+my @objects;
+## currently active child processes
+my $jobs = {};		# child process pid -> file handle
+## results from child processes
+my $results = {};	# object index -> { level, function }
+
+## reads _NPROCESSORS_ONLN to determine the number of processes to start
+sub get_online_processors {
+	open(my $fh, "getconf _NPROCESSORS_ONLN 2>/dev/null |")
+		or die "$0: failed to execute getconf: $!";
+	my $procs = <$fh>;
+	close($fh);
+
+	if (!($procs =~ /^\d+$/)) {
+		return 1;
+	}
+
+	return int($procs);
+}
+
+## finds initcalls defined in an object file, parses level and function name,
+## and prints it out to the parent process
+sub find_initcalls {
+	my ($object) = @_;
+
+	die "$0: object file $object doesn't exist?" if (! -f $object);
+
+	open(my $fh, "\"$nm\" -just-symbol-name -defined-only \"$object\" 2>/dev/null |")
+		or die "$0: failed to execute \"$nm\": $!";
+
+	my $initcalls = {};
+
+	while (<$fh>) {
+		chomp;
+
+		my ($counter, $line, $symbol) = $_ =~ /^__initcall_(\d+)_(\d+)_(.*)$/;
+
+		if (!defined($counter) || !defined($line) || !defined($symbol)) {
+			next;
+		}
+
+		my ($function, $level) = $symbol =~
+			/^(.*)((early|rootfs|con|security|[0-9])s?)$/;
+
+		die "$0: duplicate initcall counter value in object $object: $_"
+			if exists($initcalls->{$counter});
+
+		$initcalls->{$counter} = {
+			'level'    => $level,
+			'line'     => $line,
+			'function' => $function
+		};
+	}
+
+	close($fh);
+
+	# sort initcalls in each object file numerically by the counter value
+	# to ensure they are in the order they were defined
+	foreach my $counter (sort { $a <=> $b } keys(%{$initcalls})) {
+		print $initcalls->{$counter}->{"level"} . " " .
+		      $counter . " " .
+		      $initcalls->{$counter}->{"line"} . " " .
+		      $initcalls->{$counter}->{"function"} . "\n";
+	}
+}
+
+## waits for any child process to complete, reads the results, and adds them to
+## the $results array for later processing
+sub wait_for_results {
+	my $pid = wait();
+	if ($pid > 0) {
+		my $fh = $jobs->{$pid};
+
+		# the child process prints out results in the following format:
+		#  line 1:    <object file index>
+		#  line 2..n: <level> <counter> <line> <function>
+
+		my $index = <$fh>;
+		chomp($index);
+
+		if (!($index =~ /^\d+$/)) {
+			die "$0: child $pid returned an invalid index: $index";
+		}
+		$index = int($index);
+
+		while (<$fh>) {
+			chomp;
+			my ($level, $counter, $line, $function) = $_ =~
+				/^([^\ ]+)\ (\d+)\ (\d+)\ (.*)$/;
+
+			if (!defined($level) ||
+				!defined($counter) ||
+				!defined($line) ||
+				!defined($function)) {
+				die "$0: child $pid returned invalid data";
+			}
+
+			if (!exists($results->{$index})) {
+				$results->{$index} = [];
+			}
+
+			push (@{$results->{$index}}, {
+				'level'    => $level,
+				'counter'  => $counter,
+				'line'     => $line,
+				'function' => $function
+			});
+		}
+
+		close($fh);
+		delete($jobs->{$pid});
+	}
+}
+
+## launches child processes to find initcalls from the object files, waits for
+## each process to complete and collects the results
+sub process_objects {
+	my $index = 0;	# link order index of the object file
+	my $njobs = get_online_processors();
+
+	while (scalar(@objects) > 0) {
+		my $object = shift(@objects);
+
+		# fork a child process and read it's stdout
+		my $pid = open(my $fh, '-|');
+
+		if (!defined($pid)) {
+			die "$0: failed to fork: $!";
+		} elsif ($pid) {
+			# save the child process pid and the file handle
+			$jobs->{$pid} = $fh;
+		} else {
+			STDOUT->autoflush(1);
+			print "$index\n";
+			find_initcalls("$objtree/$object");
+			exit;
+		}
+
+		$index++;
+
+		# if we reached the maximum number of processes, wait for one
+		# to complete before launching new ones
+		if (scalar(keys(%{$jobs})) >= $njobs && scalar(@objects) > 0) {
+			wait_for_results();
+		}
+	}
+
+	# wait for the remaining children to complete
+	while (scalar(keys(%{$jobs})) > 0) {
+		wait_for_results();
+	}
+}
+
+## gets a list of actual object files from thin archives, and adds them to
+## @objects in link order
+sub find_objects {
+	while (my $file = shift(@ARGV)) {
+		my $pid = open (my $fh, "\"$ar\" t \"$file\" 2>/dev/null |")
+			or die "$0: failed to execute $ar: $!";
+
+		my @output;
+
+		while (<$fh>) {
+			chomp;
+			push(@output, $_);
+		}
+
+		close($fh);
+
+		# if $ar failed, assume we have an object file
+		if ($? != 0) {
+			push(@objects, $file);
+			next;
+		}
+
+		# if $ar succeeded, read the list of object files
+		foreach (@output) {
+			push(@objects, $_);
+		}
+	}
+}
+
+## START
+find_objects();
+process_objects();
+
+## process results and add them to $sections in the correct order
+my $sections = {};
+
+foreach my $index (sort { $a <=> $b } keys(%{$results})) {
+	foreach my $result (@{$results->{$index}}) {
+		my $level = $result->{'level'};
+
+		if (!exists($sections->{$level})) {
+			$sections->{$level} = [];
+		}
+
+		my $fsname = $result->{'counter'} . '_' .
+			     $result->{'line'}    . '_' .
+			     $result->{'function'};
+
+		push(@{$sections->{$level}}, $fsname);
+	}
+}
+
+if (!keys(%{$sections})) {
+	exit(0); # no initcalls...?
+}
+
+## print out a linker script that defines the order of initcalls for each
+## level
+print "SECTIONS {\n";
+
+foreach my $level (sort(keys(%{$sections}))) {
+	my $section;
+
+	if ($level eq 'con') {
+		$section = '.con_initcall.init';
+	} elsif ($level eq 'security') {
+		$section = '.security_initcall.init';
+	} else {
+		$section = ".initcall${level}.init";
+	}
+
+	print "\t${section} : {\n";
+
+	foreach my $fsname (@{$sections->{$level}}) {
+		print "\t\t*(${section}..${fsname}) ;\n"
+	}
+
+	print "\t}\n";
+}
+
+print "}\n";
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
index c8cf453..21e2f47 100755
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -60,6 +60,39 @@
 	${AR} rcsTP${KBUILD_ARFLAGS} built-in.a			\
 				${KBUILD_VMLINUX_INIT}		\
 				${KBUILD_VMLINUX_MAIN}
+
+	# rebuild with llvm-ar to update the symbol table
+	if [ -n "${CONFIG_LTO_CLANG}" ]; then
+		mv -f built-in.a built-in.a.tmp
+		${LLVM_AR} rcsT${KBUILD_ARFLAGS} built-in.a $(${AR} t built-in.a.tmp)
+		rm -f built-in.a.tmp
+	fi
+}
+
+# If CONFIG_LTO_CLANG is selected, generate a linker script to ensure correct
+# ordering of initcalls, and with CONFIG_MODVERSIONS also enabled, collect the
+# previously generated symbol versions into the same script.
+lto_lds()
+{
+	if [ -z "${CONFIG_LTO_CLANG}" ]; then
+		return
+	fi
+
+	${srctree}/scripts/generate_initcall_order.pl \
+		built-in.a ${KBUILD_VMLINUX_LIBS} \
+		> .tmp_lto.lds
+
+	if [ -n "${CONFIG_MODVERSIONS}" ]; then
+		for a in built-in.a ${KBUILD_VMLINUX_LIBS}; do
+			for o in $(${AR} t $a); do
+				if [ -f ${o}.symversions ]; then
+					cat ${o}.symversions >> .tmp_lto.lds
+				fi
+			done
+		done
+	fi
+
+	echo "-T .tmp_lto.lds"
 }
 
 # Link of vmlinux.o used for section mismatch analysis
@@ -75,7 +108,26 @@
 		${KBUILD_VMLINUX_LIBS}				\
 		--end-group"
 
-	${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${objects}
+	if [ -n "${CONFIG_LTO_CLANG}" ]; then
+		# This might take a while, so indicate that we're doing
+		# an LTO link
+		info LTO vmlinux.o
+	fi
+
+	${LD} ${KBUILD_LDFLAGS} -r -o ${1} $(lto_lds) ${objects}
+}
+
+# If CONFIG_LTO_CLANG is selected, we postpone running recordmcount until
+# we have compiled LLVM IR to an object file.
+recordmcount()
+{
+	if [ -z "${CONFIG_LTO_CLANG}" ]; then
+		return
+	fi
+
+	if [ -n "${CONFIG_FTRACE_MCOUNT_RECORD}" ]; then
+		scripts/recordmcount ${RECORDMCOUNT_FLAGS} $*
+	fi
 }
 
 # Link of vmlinux
@@ -87,13 +139,20 @@
 	local objects
 
 	if [ "${SRCARCH}" != "um" ]; then
-		objects="--whole-archive			\
-			built-in.a				\
-			--no-whole-archive			\
-			--start-group				\
-			${KBUILD_VMLINUX_LIBS}			\
-			--end-group				\
-			${1}"
+		if [ -z "${CONFIG_LTO_CLANG}" ]; then
+			objects="--whole-archive		\
+				built-in.a			\
+				--no-whole-archive		\
+				--start-group			\
+				${KBUILD_VMLINUX_LIBS}		\
+				--end-group			\
+				${1}"
+		else
+			objects="--start-group			\
+				vmlinux.o			\
+				--end-group			\
+				${1}"
+		fi
 
 		${LD} ${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux} -o ${2}	\
 			-T ${lds} ${objects}
@@ -114,7 +173,6 @@
 	fi
 }
 
-
 # Create ${2} .o file with all symbols from the ${1} object file
 kallsyms()
 {
@@ -159,6 +217,7 @@
 {
 	rm -f .tmp_System.map
 	rm -f .tmp_kallsyms*
+	rm -f .tmp_lto.lds
 	rm -f .tmp_vmlinux*
 	rm -f built-in.a
 	rm -f System.map
@@ -220,12 +279,16 @@
 archive_builtin
 
 #link vmlinux.o
-info LD vmlinux.o
 modpost_link vmlinux.o
 
 # modpost vmlinux.o to check for section mismatches
 ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
 
+if [ -n "${CONFIG_LTO_CLANG}" ]; then
+	# Call recordmcount if needed
+	recordmcount vmlinux.o
+fi
+
 kallsymso=""
 kallsyms_vmlinux=""
 if [ -n "${CONFIG_KALLSYMS}" ]; then
diff --git a/scripts/mod/Makefile b/scripts/mod/Makefile
index 42c5d50..e014b2f 100644
--- a/scripts/mod/Makefile
+++ b/scripts/mod/Makefile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 OBJECT_FILES_NON_STANDARD := y
+CFLAGS_empty.o += $(DISABLE_LTO)
 
 hostprogs-y	:= modpost mk_elfconfig
 always		:= $(hostprogs-y) empty.o
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 91a8003..f9ab348 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -145,6 +145,9 @@
 		p[strlen(p) - 2] = '\0';
 		mod->is_dot_o = 1;
 	}
+	/* strip trailing .lto */
+	if (strends(p, ".lto"))
+		p[strlen(p) - 4] = '\0';
 
 	/* add to list */
 	mod->name = p;
@@ -942,6 +945,7 @@
 static const char *const linker_symbols[] =
 	{ "__init_begin", "_sinittext", "_einittext", NULL };
 static const char *const optim_symbols[] = { "*.constprop.*", NULL };
+static const char *const cfi_symbols[] = { "*.cfi", NULL };
 
 enum mismatch {
 	TEXT_TO_ANY_INIT,
@@ -1171,6 +1175,17 @@
  *   whitelisting, which relies on pattern-matching against symbol
  *   names to work.  (One situation where gcc can autogenerate ELF
  *   local symbols is when "-fsection-anchors" is used.)
+ *
+ * Pattern 7:
+ *   With CONFIG_CFI_CLANG, clang appends .cfi to all indirectly called
+ *   functions and creates a function stub with the original name. This
+ *   stub is always placed in .text, even if the actual function with the
+ *   .cfi postfix is in .init.text or .exit.text.
+ *   This pattern is identified by
+ *   tosec   = init or exit section
+ *   fromsec = text section
+ *   tosym   = *.cfi
+ *
  **/
 static int secref_whitelist(const struct sectioncheck *mismatch,
 			    const char *fromsec, const char *fromsym,
@@ -1213,6 +1228,12 @@
 	if (strstarts(fromsym, ".L"))
 		return 0;
 
+	/* Check for pattern 7 */
+	if (match(fromsec, text_sections) &&
+	    match(tosec, init_exit_sections) &&
+	    match(tosym, cfi_symbols))
+		return 0;
+
 	return 1;
 }
 
@@ -1939,6 +1960,10 @@
 		size_t m = strspn(s + n + 1, "0123456789");
 		if (m && (s[n + m] == '.' || s[n + m] == 0))
 			s[n] = 0;
+
+		/* strip trailing .lto */
+		if (strends(s, ".lto"))
+			s[strlen(s) - 4] = '\0';
 	}
 	return s;
 }
diff --git a/scripts/module-lto.lds b/scripts/module-lto.lds
new file mode 100644
index 0000000..f5ee544
--- /dev/null
+++ b/scripts/module-lto.lds
@@ -0,0 +1,22 @@
+/*
+ * With CONFIG_LTO_CLANG, LLD always enables -fdata-sections and
+ * -ffunction-sections, which increases the size of the final module.
+ * Merge the split sections in the final binary.
+ */
+SECTIONS {
+	/*
+	 * LLVM may emit .eh_frame with CONFIG_CFI_CLANG despite
+	 * -fno-asynchronous-unwind-tables. Discard the section.
+	 */
+	/DISCARD/ : {
+		*(.eh_frame)
+	}
+
+	.bss : { *(.bss .bss[.0-9a-zA-Z_]*) }
+	.data : { *(.data .data[.0-9a-zA-Z_]*) }
+	.rela.data : { *(.rela.data .rela.data[.0-9a-zA-Z_]*) }
+	.rela.rodata : { *(.rela.rodata .rela.rodata[.0-9a-zA-Z_]*) }
+	.rela.text : { *(.rela.text .rela.text[.0-9a-zA-Z_]*) }
+	.rodata : { *(.rodata .rodata[.0-9a-zA-Z_]*) }
+	.text : { *(.text .text[.0-9a-zA-Z_]*) }
+}
diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c
index 895c40e..7a9ad23 100644
--- a/scripts/recordmcount.c
+++ b/scripts/recordmcount.c
@@ -406,7 +406,8 @@
 		strcmp(".softirqentry.text", txtname) == 0 ||
 		strcmp(".kprobes.text", txtname) == 0 ||
 		strcmp(".cpuidle.text", txtname) == 0 ||
-		strcmp(".text.unlikely", txtname) == 0;
+		(strncmp(".text.",       txtname, 6) == 0 &&
+		 strcmp(".text..ftrace", txtname) != 0);
 }
 
 /* 32 bit and 64 bit are very similar */
diff --git a/scripts/tools-support-relr.sh b/scripts/tools-support-relr.sh
new file mode 100755
index 0000000..97a2c84
--- /dev/null
+++ b/scripts/tools-support-relr.sh
@@ -0,0 +1,16 @@
+#!/bin/sh -eu
+# SPDX-License-Identifier: GPL-2.0
+
+tmp_file=$(mktemp)
+trap "rm -f $tmp_file.o $tmp_file $tmp_file.bin" EXIT
+
+cat << "END" | "$CC" -c -x c - -o $tmp_file.o >/dev/null 2>&1
+void *p = &p;
+END
+"$LD" $tmp_file.o -shared -Bsymbolic --pack-dyn-relocs=relr -o $tmp_file
+
+# Despite printing an error message, GNU nm still exits with exit code 0 if it
+# sees a relr section. So we need to check that nothing is printed to stderr.
+test -z "$("$NM" $tmp_file 2>&1 >/dev/null)"
+
+"$OBJCOPY" -O binary $tmp_file $tmp_file.bin
diff --git a/security/Kconfig b/security/Kconfig
index d9aa521..e483bbc 100644
--- a/security/Kconfig
+++ b/security/Kconfig
@@ -18,6 +18,15 @@
 
 	  If you are unsure how to answer this question, answer N.
 
+config SECURITY_PERF_EVENTS_RESTRICT
+	bool "Restrict unprivileged use of performance events"
+	depends on PERF_EVENTS
+	help
+	  If you say Y here, the kernel.perf_event_paranoid sysctl
+	  will be set to 3 by default, and no unprivileged use of the
+	  perf_event_open syscall will be permitted unless it is
+	  changed.
+
 config SECURITY
 	bool "Enable different security models"
 	depends on SYSFS
@@ -276,5 +285,7 @@
 	default "apparmor" if DEFAULT_SECURITY_APPARMOR
 	default "" if DEFAULT_SECURITY_DAC
 
+source "security/Kconfig.hardening"
+
 endmenu
 
diff --git a/security/Kconfig.hardening b/security/Kconfig.hardening
new file mode 100644
index 0000000..b0e9cc0
--- /dev/null
+++ b/security/Kconfig.hardening
@@ -0,0 +1,114 @@
+# SPDX-License-Identifier: GPL-2.0-only
+menu "Kernel hardening options"
+
+config GCC_PLUGIN_STRUCTLEAK
+	bool
+	help
+	  While the kernel is built with warnings enabled for any missed
+	  stack variable initializations, this warning is silenced for
+	  anything passed by reference to another function, under the
+	  occasionally misguided assumption that the function will do
+	  the initialization. As this regularly leads to exploitable
+	  flaws, this plugin is available to identify and zero-initialize
+	  such variables, depending on the chosen level of coverage.
+
+	  This plugin was originally ported from grsecurity/PaX. More
+	  information at:
+	   * https://grsecurity.net/
+	   * https://pax.grsecurity.net/
+
+menu "Memory initialization"
+
+config CC_HAS_AUTO_VAR_INIT
+	def_bool $(cc-option,-ftrivial-auto-var-init=pattern)
+
+choice
+	prompt "Initialize kernel stack variables at function entry"
+	default GCC_PLUGIN_STRUCTLEAK_BYREF_ALL if COMPILE_TEST && GCC_PLUGINS
+	default INIT_STACK_ALL if COMPILE_TEST && CC_HAS_AUTO_VAR_INIT
+	default INIT_STACK_NONE
+	help
+	  This option enables initialization of stack variables at
+	  function entry time. This has the possibility to have the
+	  greatest coverage (since all functions can have their
+	  variables initialized), but the performance impact depends
+	  on the function calling complexity of a given workload's
+	  syscalls.
+
+	  This chooses the level of coverage over classes of potentially
+	  uninitialized variables. The selected class will be
+	  initialized before use in a function.
+
+	config INIT_STACK_NONE
+		bool "no automatic initialization (weakest)"
+		help
+		  Disable automatic stack variable initialization.
+		  This leaves the kernel vulnerable to the standard
+		  classes of uninitialized stack variable exploits
+		  and information exposures.
+
+	config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL
+		bool "zero-init anything passed by reference (very strong)"
+		depends on GCC_PLUGINS
+		select GCC_PLUGIN_STRUCTLEAK
+		help
+		  Zero-initialize any stack variables that may be passed
+		  by reference and had not already been explicitly
+		  initialized. This is intended to eliminate all classes
+		  of uninitialized stack variable exploits and information
+		  exposures.
+
+	config INIT_STACK_ALL
+		bool "0xAA-init everything on the stack (strongest)"
+		depends on CC_HAS_AUTO_VAR_INIT
+		help
+		  Initializes everything on the stack with a 0xAA
+		  pattern. This is intended to eliminate all classes
+		  of uninitialized stack variable exploits and information
+		  exposures, even variables that were warned to have been
+		  left uninitialized.
+
+endchoice
+
+config GCC_PLUGIN_STRUCTLEAK_VERBOSE
+	bool "Report forcefully initialized variables"
+	depends on GCC_PLUGIN_STRUCTLEAK
+	depends on !COMPILE_TEST	# too noisy
+	help
+	  This option will cause a warning to be printed each time the
+	  structleak plugin finds a variable it thinks needs to be
+	  initialized. Since not all existing initializers are detected
+	  by the plugin, this can produce false positive warnings.
+
+config INIT_ON_ALLOC_DEFAULT_ON
+	bool "Enable heap memory zeroing on allocation by default"
+	help
+	  This has the effect of setting "init_on_alloc=1" on the kernel
+	  command line. This can be disabled with "init_on_alloc=0".
+	  When "init_on_alloc" is enabled, all page allocator and slab
+	  allocator memory will be zeroed when allocated, eliminating
+	  many kinds of "uninitialized heap memory" flaws, especially
+	  heap content exposures. The performance impact varies by
+	  workload, but most cases see <1% impact. Some synthetic
+	  workloads have measured as high as 7%.
+
+config INIT_ON_FREE_DEFAULT_ON
+	bool "Enable heap memory zeroing on free by default"
+	help
+	  This has the effect of setting "init_on_free=1" on the kernel
+	  command line. This can be disabled with "init_on_free=0".
+	  Similar to "init_on_alloc", when "init_on_free" is enabled,
+	  all page allocator and slab allocator memory will be zeroed
+	  when freed, eliminating many kinds of "uninitialized heap memory"
+	  flaws, especially heap content exposures. The primary difference
+	  with "init_on_free" is that data lifetime in memory is reduced,
+	  as anything freed is wiped immediately, making live forensics or
+	  cold boot memory attacks unable to recover freed memory contents.
+	  The performance impact varies by workload, but is more expensive
+	  than "init_on_alloc" due to the negative cache effects of
+	  touching "cold" memory areas. Most cases see 3-5% impact. Some
+	  synthetic workloads have measured as high as 8%.
+
+endmenu
+
+endmenu
diff --git a/security/inode.c b/security/inode.c
index 829f156..0107dc7 100644
--- a/security/inode.c
+++ b/security/inode.c
@@ -127,7 +127,7 @@
 	dir = d_inode(parent);
 
 	inode_lock(dir);
-	dentry = lookup_one_len(name, parent, strlen(name));
+	dentry = lookup_one_len2(name, mount, parent, strlen(name));
 	if (IS_ERR(dentry))
 		goto out;
 
diff --git a/security/security.c b/security/security.c
index 5ce2448..74dcf97 100644
--- a/security/security.c
+++ b/security/security.c
@@ -607,6 +607,7 @@
 		return 0;
 	return call_int_hook(path_chown, 0, path, uid, gid);
 }
+EXPORT_SYMBOL_GPL(security_path_chown);
 
 int security_path_chroot(const struct path *path)
 {
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index f03ceaf..c049f63 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -2150,7 +2150,7 @@
 
 static const unsigned int rates[] = {
 	5512, 8000, 11025, 16000, 22050, 32000, 44100,
-	48000, 64000, 88200, 96000, 176400, 192000
+	48000, 64000, 88200, 96000, 176400, 192000, 352800, 384000
 };
 
 const struct snd_pcm_hw_constraint_list snd_pcm_known_rates = {
diff --git a/tools/accounting/getdelays.c b/tools/accounting/getdelays.c
index 9f420d9..8cb504d 100644
--- a/tools/accounting/getdelays.c
+++ b/tools/accounting/getdelays.c
@@ -203,6 +203,8 @@
 	       "SWAP  %15s%15s%15s\n"
 	       "      %15llu%15llu%15llums\n"
 	       "RECLAIM  %12s%15s%15s\n"
+	       "      %15llu%15llu%15llums\n"
+	       "THRASHING%12s%15s%15s\n"
 	       "      %15llu%15llu%15llums\n",
 	       "count", "real total", "virtual total",
 	       "delay total", "delay average",
@@ -222,7 +224,11 @@
 	       "count", "delay total", "delay average",
 	       (unsigned long long)t->freepages_count,
 	       (unsigned long long)t->freepages_delay_total,
-	       average_ms(t->freepages_delay_total, t->freepages_count));
+	       average_ms(t->freepages_delay_total, t->freepages_count),
+	       "count", "delay total", "delay average",
+	       (unsigned long long)t->thrashing_count,
+	       (unsigned long long)t->thrashing_delay_total,
+	       average_ms(t->thrashing_delay_total, t->thrashing_count));
 }
 
 static void task_context_switch_counts(struct taskstats *t)
diff --git a/tools/include/linux/coresight-pmu.h b/tools/include/linux/coresight-pmu.h
index a1a959b..b0e35ee 100644
--- a/tools/include/linux/coresight-pmu.h
+++ b/tools/include/linux/coresight-pmu.h
@@ -12,11 +12,13 @@
 
 /* ETMv3.5/PTM's ETMCR config bit */
 #define ETM_OPT_CYCACC  12
+#define ETM_OPT_CTXTID	14
 #define ETM_OPT_TS      28
 #define ETM_OPT_RETSTK	29
 
 /* ETMv4 CONFIGR programming bits for the ETM OPTs */
 #define ETM4_CFG_BIT_CYCACC	4
+#define ETM4_CFG_BIT_CTXTID	6
 #define ETM4_CFG_BIT_TS		11
 #define ETM4_CFG_BIT_RETSTK	12
 
diff --git a/tools/testing/selftests/arm64/.gitignore b/tools/testing/selftests/arm64/.gitignore
new file mode 100644
index 0000000..e8fae8d
--- /dev/null
+++ b/tools/testing/selftests/arm64/.gitignore
@@ -0,0 +1 @@
+tags_test
diff --git a/tools/testing/selftests/arm64/Makefile b/tools/testing/selftests/arm64/Makefile
new file mode 100644
index 0000000..f9f79fb
--- /dev/null
+++ b/tools/testing/selftests/arm64/Makefile
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: GPL-2.0
+
+# ARCH can be overridden by the user for cross compiling
+ARCH ?= $(shell uname -m 2>/dev/null || echo not)
+
+ifneq (,$(filter $(ARCH),aarch64 arm64))
+CFLAGS += -I../../../../usr/include/
+TEST_GEN_PROGS := tags_test
+TEST_PROGS := run_tags_test.sh
+endif
+
+include ../lib.mk
diff --git a/tools/testing/selftests/arm64/run_tags_test.sh b/tools/testing/selftests/arm64/run_tags_test.sh
new file mode 100755
index 0000000..745f113
--- /dev/null
+++ b/tools/testing/selftests/arm64/run_tags_test.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+echo "--------------------"
+echo "running tags test"
+echo "--------------------"
+./tags_test
+if [ $? -ne 0 ]; then
+	echo "[FAIL]"
+else
+	echo "[PASS]"
+fi
diff --git a/tools/testing/selftests/arm64/tags_test.c b/tools/testing/selftests/arm64/tags_test.c
new file mode 100644
index 0000000..5701163
--- /dev/null
+++ b/tools/testing/selftests/arm64/tags_test.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <sys/prctl.h>
+#include <sys/utsname.h>
+
+#define SHIFT_TAG(tag)		((uint64_t)(tag) << 56)
+#define SET_TAG(ptr, tag)	(((uint64_t)(ptr) & ~SHIFT_TAG(0xff)) | \
+					SHIFT_TAG(tag))
+
+int main(void)
+{
+	static int tbi_enabled = 0;
+	unsigned long tag = 0;
+	struct utsname *ptr;
+	int err;
+
+	if (prctl(PR_SET_TAGGED_ADDR_CTRL, PR_TAGGED_ADDR_ENABLE, 0, 0, 0) == 0)
+		tbi_enabled = 1;
+	ptr = (struct utsname *)malloc(sizeof(*ptr));
+	if (tbi_enabled)
+		tag = 0x42;
+	ptr = (struct utsname *)SET_TAG(ptr, tag);
+	err = uname(ptr);
+	free(ptr);
+
+	return err;
+}
diff --git a/tools/testing/selftests/memfd/memfd_test.c b/tools/testing/selftests/memfd/memfd_test.c
index 10baa16..c67d32e 100644
--- a/tools/testing/selftests/memfd/memfd_test.c
+++ b/tools/testing/selftests/memfd/memfd_test.c
@@ -54,6 +54,22 @@
 	return fd;
 }
 
+static int mfd_assert_reopen_fd(int fd_in)
+{
+	int r, fd;
+	char path[100];
+
+	sprintf(path, "/proc/self/fd/%d", fd_in);
+
+	fd = open(path, O_RDWR);
+	if (fd < 0) {
+		printf("re-open of existing fd %d failed\n", fd_in);
+		abort();
+	}
+
+	return fd;
+}
+
 static void mfd_fail_new(const char *name, unsigned int flags)
 {
 	int r;
@@ -255,6 +271,25 @@
 	munmap(p, mfd_def_size);
 }
 
+/* Test that PROT_READ + MAP_SHARED mappings work. */
+static void mfd_assert_read_shared(int fd)
+{
+	void *p;
+
+	/* verify PROT_READ and MAP_SHARED *is* allowed */
+	p = mmap(NULL,
+		 mfd_def_size,
+		 PROT_READ,
+		 MAP_SHARED,
+		 fd,
+		 0);
+	if (p == MAP_FAILED) {
+		printf("mmap() failed: %m\n");
+		abort();
+	}
+	munmap(p, mfd_def_size);
+}
+
 static void mfd_assert_write(int fd)
 {
 	ssize_t l;
@@ -693,6 +728,44 @@
 }
 
 /*
+ * Test SEAL_FUTURE_WRITE
+ * Test whether SEAL_FUTURE_WRITE actually prevents modifications.
+ */
+static void test_seal_future_write(void)
+{
+	int fd, fd2;
+	void *p;
+
+	printf("%s SEAL-FUTURE-WRITE\n", memfd_str);
+
+	fd = mfd_assert_new("kern_memfd_seal_future_write",
+			    mfd_def_size,
+			    MFD_CLOEXEC | MFD_ALLOW_SEALING);
+
+	p = mfd_assert_mmap_shared(fd);
+
+	mfd_assert_has_seals(fd, 0);
+
+	mfd_assert_add_seals(fd, F_SEAL_FUTURE_WRITE);
+	mfd_assert_has_seals(fd, F_SEAL_FUTURE_WRITE);
+
+	/* read should pass, writes should fail */
+	mfd_assert_read(fd);
+	mfd_assert_read_shared(fd);
+	mfd_fail_write(fd);
+
+	fd2 = mfd_assert_reopen_fd(fd);
+	/* read should pass, writes should still fail */
+	mfd_assert_read(fd2);
+	mfd_assert_read_shared(fd2);
+	mfd_fail_write(fd2);
+
+	munmap(p, mfd_def_size);
+	close(fd2);
+	close(fd);
+}
+
+/*
  * Test SEAL_SHRINK
  * Test whether SEAL_SHRINK actually prevents shrinking
  */
@@ -945,6 +1018,7 @@
 	test_basic();
 
 	test_seal_write();
+	test_seal_future_write();
 	test_seal_shrink();
 	test_seal_grow();
 	test_seal_resize();